|
|
# decribe_properties(model, attribute, valid_vales, invalid_values) # {{{
# Ensures that a model with the specified attribute is:
# * Valid for each of the values in the +valid_values+ array.
# * Invalid for each of the values in the +invalid_values+ array.
#
# The +model+ arg should be the Model class
# The +attribute+ arg must be a symbol.
# The +valid_values+ and +invalid_values+ args must be Arrays in this format:
# [ 'Description', 'value', 'Description', 'value' ... ]
# Eg:
# [ 'multiple spaces', '123 A Street With A Long Name',
# "a '", "123 O'Connor Ave" ]
#
def describe_attribute(model, attribute, valid_values, invalid_values)
raise "the 1st argument (model) should be a Model class object" unless attribute.is_a? Class
raise "the 2nd argument (attribute) should be a Symbol" unless attribute.is_a? Symbol
raise "the 3rd argument (valid_values) should be an Array of valid values" unless attribute.is_a? Array
raise "the 4th argument (invalid_values) should be an Array of invalid values" unless attribute.is_a? Array
describe "#{model}##{attribute}" do
valid_values.in_groups_of(2) do |description, value|
it "should be valid with #{description}" do
p = build_property({:"#{attribute}" => value})
p.save
p.should be_valid
p.should have(0).errors_on(:"#{attribute}")
end
end
invalid_values.in_groups_of(2) do |description, value|
it "should not be valid with #{description}" do
p = build_property({:"#{attribute}" => value})
p.save
p.should_not be_valid
p.should have_at_least(1).error_on(:"#{attribute}")
end
end
end
end # }}}
# Test data {{{
valid_addresses = [ # {{{
'multiple spaces', '267 A Street With A Long Name',
'1 letter after the street number', '267B Albany Ave',
"a '", "123 S'omewhere Street",
'a -', '123 Some-Where',
'a ,', '123 Some, Weird Street',
'only 4 characters', '1 Fo',
'only 5 characters', '1 Foo',
'127 characters', '123 Almost at maximum lengthxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
'128 characters', '123 Maximum lengthxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
] # }}}
invalid_addresses = [ # {{{
"an empty string", '',
"only 3 characters", 'xxx',
"no street number", 'Bloor Street',
"2 letters after the street number", '123AB Some Street',
"a \"", '123 Double " Quote',
"an !", '123 Exclamation!',
"an &", '123 Amp&ersand',
"a 1-letter street name", '123 F',
"129 characters", '123 Too longxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
] # }}}
# End test data. }}}
describe_attribute Property, :address, valid_addresses, invalid_addresses
|