validate entities after creation if a validator is defined

This commit is contained in:
Benjamin Neff 2015-07-25 01:27:17 +02:00
parent 71b1d6dc1e
commit ed52108cc7
4 changed files with 69 additions and 13 deletions

View file

@ -53,7 +53,9 @@ module DiasporaFederation
self.class.default_values.merge(data).each do |k, v|
instance_variable_set("@#{k}", nilify(v)) if setable?(k, v)
end
freeze
validate
end
# Returns a Hash representing this Entity (attributes => values)
@ -115,6 +117,22 @@ module DiasporaFederation
value
end
def validate
validator_name = "DiasporaFederation::Validators::#{self.class.name.split('::').last}Validator"
return unless Validators.const_defined? validator_name
validator_class = Validators.const_get validator_name
validator = validator_class.new self
raise ValidationError, error_message(validator) unless validator.valid?
end
def error_message(validator)
errors = validator.errors.map do |prop, rule|
"property: #{prop}, value: #{public_send(prop).inspect}, rule: #{rule[:rule]}, with params: #{rule[:params]}"
end
"Failed validation for properties: #{errors.join(' | ')}"
end
# Serialize the Entity into XML elements
# @return [Nokogiri::XML::Element] root node
def entity_xml
@ -146,5 +164,9 @@ module DiasporaFederation
node.content = data unless data.empty?
end
end
# Raised, if entity is not valid
class ValidationError < RuntimeError
end
end
end

View file

@ -2,7 +2,7 @@ module Validation
module Rule
class Boolean
def error_key
:numeric
:boolean
end
def valid_value?(value)

View file

@ -26,4 +26,14 @@ module DiasporaFederation
property :qwer, xml_name: :asdf
end
end
module Validators
class TestDefaultEntityValidator < Validation::Validator
include Validation
rule :test1, regular_expression: {regex: /\A[^;]{,32}\z/}
rule :test2, :not_nil
rule :test3, :boolean
end
end
end

View file

@ -18,13 +18,14 @@ module DiasporaFederation
}.to raise_error ArgumentError, "missing required properties: test1, test2"
end
context "defaults" do
it "sets the defaults" do
entity = Entities::TestDefaultEntity.new(test1: 1, test2: 2)
entity = Entities::TestDefaultEntity.new(test1: "1", test2: "2")
expect(entity.test3).to be_truthy
end
it "handles callable defaults" do
entity = Entities::TestDefaultEntity.new(test1: 1, test2: 2)
entity = Entities::TestDefaultEntity.new(test1: "1", test2: "2")
expect(entity.test4).to be_truthy
end
@ -33,12 +34,35 @@ module DiasporaFederation
expect(entity.test3).to be_falsey
expect(entity.test4).to be_falsey
end
end
it "sets nil if string is empty" do
data[:test1] = ""
entity = Entities::TestDefaultEntity.new(data)
expect(entity.test1).to be_nil
end
context "validation" do
let(:invalid_data) { {test1: "as;df", test2: nil, test3: "no boolean"} }
it "validates the entity and raise an error with failed properties if not valid" do
expect {
Entities::TestDefaultEntity.new(invalid_data)
}.to raise_error Entity::ValidationError, /Failed validation for properties:.*test1.*\|.*test2.*\|.*test3/
end
it "contains the failed rule" do
expect {
Entities::TestDefaultEntity.new(invalid_data)
}.to raise_error Entity::ValidationError, /property: test2, value: nil, rule: not_nil, with params: \{\}/
end
it "contains the params of the failed rule" do
expect {
Entities::TestDefaultEntity.new(invalid_data)
}.to raise_error Entity::ValidationError, /rule: regular_expression, with params: \{:regex=>.*\}/
end
end
end
describe "#to_h" do