validate entities after creation if a validator is defined
This commit is contained in:
parent
71b1d6dc1e
commit
ed52108cc7
4 changed files with 69 additions and 13 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue