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| self.class.default_values.merge(data).each do |k, v|
instance_variable_set("@#{k}", nilify(v)) if setable?(k, v) instance_variable_set("@#{k}", nilify(v)) if setable?(k, v)
end end
freeze freeze
validate
end end
# Returns a Hash representing this Entity (attributes => values) # Returns a Hash representing this Entity (attributes => values)
@ -115,6 +117,22 @@ module DiasporaFederation
value value
end 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 # Serialize the Entity into XML elements
# @return [Nokogiri::XML::Element] root node # @return [Nokogiri::XML::Element] root node
def entity_xml def entity_xml
@ -146,5 +164,9 @@ module DiasporaFederation
node.content = data unless data.empty? node.content = data unless data.empty?
end end
end end
# Raised, if entity is not valid
class ValidationError < RuntimeError
end
end end
end end

View file

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

View file

@ -26,4 +26,14 @@ module DiasporaFederation
property :qwer, xml_name: :asdf property :qwer, xml_name: :asdf
end end
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 end

View file

@ -18,20 +18,22 @@ module DiasporaFederation
}.to raise_error ArgumentError, "missing required properties: test1, test2" }.to raise_error ArgumentError, "missing required properties: test1, test2"
end end
it "sets the defaults" do context "defaults" do
entity = Entities::TestDefaultEntity.new(test1: 1, test2: 2) it "sets the defaults" do
expect(entity.test3).to be_truthy entity = Entities::TestDefaultEntity.new(test1: "1", test2: "2")
end expect(entity.test3).to be_truthy
end
it "handles callable defaults" do 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 expect(entity.test4).to be_truthy
end end
it "uses provided values over defaults" do it "uses provided values over defaults" do
entity = Entities::TestDefaultEntity.new(data) entity = Entities::TestDefaultEntity.new(data)
expect(entity.test3).to be_falsey expect(entity.test3).to be_falsey
expect(entity.test4).to be_falsey expect(entity.test4).to be_falsey
end
end end
it "sets nil if string is empty" do it "sets nil if string is empty" do
@ -39,6 +41,28 @@ module DiasporaFederation
entity = Entities::TestDefaultEntity.new(data) entity = Entities::TestDefaultEntity.new(data)
expect(entity.test1).to be_nil expect(entity.test1).to be_nil
end 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 end
describe "#to_h" do describe "#to_h" do