test/functional/validatable_test.rb in validatable-1.5.2 vs test/functional/validatable_test.rb in validatable-1.6.0

- old
+ new

@@ -1,299 +1,321 @@ require File.expand_path(File.dirname(__FILE__) + '/../test_helper') -module Functional - class ValidatableTest < Test::Unit::TestCase - - expect ArgumentError do - Class.new do - include Validatable - attr_accessor :name - validates_presence_of :name, :times => 1 - validates_presence_of :name, :times => 1 - end +functional_tests do + + expect false do + klass = Class.new do + include Validatable + attr_accessor :name + validates_presence_of :name end - - expect ArgumentError do - Class.new do - include Validatable - attr_accessor :name - validates_presence_of :name, :times => 1, :key => 'anything' - validates_presence_of :name, :times => 1, :key => 'anything' - end + subclass = Class.new klass do end - - expect "is invalid" do - child_class = Class.new do - include Validatable - attr_accessor :name, :address - validates_presence_of :name - validates_format_of :address, :with => /.+/ - end - klass = Class.new do - include Validatable - include_validations_for :child - define_method :child do - child_class.new - end - end - instance = klass.new - instance.valid? - instance.errors.on(:address) + subclass.new.valid? + end + + expect true do + klass = Class.new do + include Validatable + attr_accessor :name + validates_presence_of :name end - - expect "can't be empty" do - child_class = Class.new do - include Validatable - attr_accessor :name, :address - validates_presence_of :name - validates_format_of :address, :with => /.+/ - end - klass = Class.new do - include Validatable - include_validations_for :child - define_method :child do - child_class.new - end - end - instance = klass.new - instance.valid? - instance.errors.on(:name) + subclass = Class.new klass do end - - - test "when child validations have errors, level 2 and higher parent validations are not performed" do - child_class = Class.new do - include Validatable - attr_accessor :name - validates_presence_of :name - end - - klass = Class.new do - include Validatable - extend Forwardable - def_delegator :child, :name - validates_true_for :name, :logic => lambda { false }, :level => 2, :message => "invalid message" - include_validations_for :child - define_method :child do - @child ||= child_class.new - end - end - instance = klass.new - instance.valid? - assert_equal "can't be empty", instance.errors.on(:name) + instance = subclass.new + instance.name = 'a name' + instance.valid? + end + + expect ArgumentError do + Class.new do + include Validatable + attr_accessor :name + validates_presence_of :name, :times => 1 + validates_presence_of :name, :times => 1 end - - test "when child validations have errors, level 1 parent validations are still performed" do - child_class = Class.new do - include Validatable - attr_accessor :name - validates_presence_of :name - end + end - klass = Class.new do - include Validatable - validates_true_for :address, :logic => lambda { false }, :level => 1, :message => "invalid message" - include_validations_for :child - define_method :child do - @child ||= child_class.new - end + expect ArgumentError do + Class.new do + include Validatable + attr_accessor :name + validates_presence_of :name, :times => 1, :key => 'anything' + validates_presence_of :name, :times => 1, :key => 'anything' + end + end - end - instance = klass.new - instance.valid? - assert_equal "can't be empty", instance.errors.on(:name) - assert_equal "invalid message", instance.errors.on(:address) + expect "is invalid" do + child_class = Class.new do + include Validatable + attr_accessor :name, :address + validates_presence_of :name + validates_format_of :address, :with => /.+/ end - - expect "can't be empty" do - child_class = Class.new do - include Validatable - attr_accessor :name, :address - validates_presence_of :name + klass = Class.new do + include Validatable + include_validations_for :child + define_method :child do + child_class.new end - klass = Class.new do - include Validatable - include_validations_for :child, :map => {:name => :namen} - define_method :child do - child_class.new - end - end - instance = klass.new - instance.valid? - instance.errors.on(:namen) end - - expect "can't be empty" do - child_class = Class.new do - include Validatable - attr_accessor :name, :address - validates_presence_of :name - end - klass = Class.new do - include Validatable - include_validations_for :child, :if => lambda { true } - define_method :child do - child_class.new - end - end - instance = klass.new - instance.valid? - instance.errors.on(:name) + instance = klass.new + instance.valid? + instance.errors.on(:address) + end + + expect "can't be empty" do + child_class = Class.new do + include Validatable + attr_accessor :name, :address + validates_presence_of :name + validates_format_of :address, :with => /.+/ end - - expect true do - child_class = Class.new do - include Validatable - attr_accessor :name, :address - validates_presence_of :name + klass = Class.new do + include Validatable + include_validations_for :child + define_method :child do + child_class.new end - klass = Class.new do - include Validatable - include_validations_for :child, :if => lambda { false } - define_method :child do - child_class.new - end - end - instance = klass.new - instance.valid? end - - test "classes only have valid_for_* methods for groups that appear in their validations" do - class_with_group_one = Class.new do - include Validatable - validates_presence_of :name, :groups => :group_one - attr_accessor :name - end - class_with_group_two = Class.new do - include Validatable - validates_presence_of :name, :groups => :group_two - attr_accessor :name - end - assert_equal false, class_with_group_one.public_instance_methods.include?(:valid_for_group_two?) - assert_equal false, class_with_group_two.public_instance_methods.include?(:valid_for_group_one?) + instance = klass.new + instance.valid? + instance.errors.on(:name) + end + + + test "when child validations have errors, level 2 and higher parent validations are not performed" do + child_class = Class.new do + include Validatable + attr_accessor :name + validates_presence_of :name end - - test "nonmatching groups are not used as validations" do - klass = Class.new do - include Validatable - validates_presence_of :name, :groups => :group_one - validates_presence_of :address, :groups => :group_two - attr_accessor :name, :address + + klass = Class.new do + include Validatable + extend Forwardable + def_delegator :child, :name + validates_true_for :name, :logic => lambda { false }, :level => 2, :message => "invalid message" + include_validations_for :child + define_method :child do + @child ||= child_class.new end - instance = klass.new - assert_equal nil, instance.errors.on(:name) end - - expect "can't be empty twice changed message" do - klass = Class.new do - include Validatable - validates_presence_of :name - attr_accessor :name - end - - Validatable::ValidationBase.class_eval do - after_validate do |result, instance, attribute| - instance.errors.add(attribute, " changed message") - end - end - Validatable::ValidatesPresenceOf.class_eval do - after_validate do |result, instance, attribute| - instance.errors.add(attribute, " twice") - end - end - instance = klass.new - instance.valid? - Validatable::ValidatesPresenceOf.after_validations.clear - Validatable::ValidationBase.after_validations.clear - instance.errors.on(:name).join + instance = klass.new + instance.valid? + assert_equal "can't be empty", instance.errors.on(:name) + end + + test "when child validations have errors, level 1 parent validations are still performed" do + child_class = Class.new do + include Validatable + attr_accessor :name + validates_presence_of :name end - expect false do - klass = Class.new do - include Validatable - validates_presence_of :name, :groups => :group_one - attr_accessor :name + klass = Class.new do + include Validatable + validates_true_for :address, :logic => lambda { false }, :level => 1, :message => "invalid message" + include_validations_for :child + define_method :child do + @child ||= child_class.new end - instance = klass.new - instance.valid_for_group_one? + end - - expect false do - klass = Class.new do - include Validatable - validates_presence_of :name, :groups => [:group_one, :group_two] - attr_accessor :name - end - instance = klass.new - instance.valid_for_group_one? + instance = klass.new + instance.valid? + assert_equal "can't be empty", instance.errors.on(:name) + assert_equal "invalid message", instance.errors.on(:address) + end + + expect "can't be empty" do + child_class = Class.new do + include Validatable + attr_accessor :name, :address + validates_presence_of :name end - - expect true do - klass = Class.new do - include Validatable - validates_presence_of :name, :groups => :group_one - validates_presence_of :address - attr_accessor :name, :address + klass = Class.new do + include Validatable + include_validations_for :child, :map => {:name => :namen} + define_method :child do + child_class.new end - instance = klass.new - instance.address = 'anything' - instance.valid? end - - expect true do - klass = Class.new do - include Validatable - validates_presence_of :name, :groups => :group_one - attr_accessor :name - end - instance = klass.new - instance.valid? + instance = klass.new + instance.valid? + instance.errors.on(:namen) + end + + expect "can't be empty" do + child_class = Class.new do + include Validatable + attr_accessor :name, :address + validates_presence_of :name end - - expect true do - klass = Class.new do - include Validatable - validates_presence_of :name, :times => 1 - attr_accessor :name + klass = Class.new do + include Validatable + include_validations_for :child, :if => lambda { true } + define_method :child do + child_class.new end - instance = klass.new - instance.valid? - instance.valid? end - - expect false do - klass = Class.new do - include Validatable - validates_presence_of :name, :times => 1 - attr_accessor :name + instance = klass.new + instance.valid? + instance.errors.on(:name) + end + + expect true do + child_class = Class.new do + include Validatable + attr_accessor :name, :address + validates_presence_of :name + end + klass = Class.new do + include Validatable + include_validations_for :child, :if => lambda { false } + define_method :child do + child_class.new end - instance1 = klass.new - instance1.valid? - instance2 = klass.new - instance2.valid? end - - expect "name message" do - klass = Class.new do - include Validatable - validates_presence_of :name, :level => 1, :message => "name message" - validates_presence_of :address, :level => 2 - attr_accessor :name, :address + instance = klass.new + instance.valid? + end + + test "classes only have valid_for_* methods for groups that appear in their validations" do + class_with_group_one = Class.new do + include Validatable + validates_presence_of :name, :groups => :group_one + attr_accessor :name + end + class_with_group_two = Class.new do + include Validatable + validates_presence_of :name, :groups => :group_two + attr_accessor :name + end + assert_equal false, class_with_group_one.public_instance_methods.include?(:valid_for_group_two?) + assert_equal false, class_with_group_two.public_instance_methods.include?(:valid_for_group_one?) + end + + test "nonmatching groups are not used as validations" do + klass = Class.new do + include Validatable + validates_presence_of :name, :groups => :group_one + validates_presence_of :address, :groups => :group_two + attr_accessor :name, :address + end + instance = klass.new + assert_equal nil, instance.errors.on(:name) + end + + expect "can't be empty twice changed message" do + klass = Class.new do + include Validatable + validates_presence_of :name + attr_accessor :name + end + + Validatable::ValidationBase.class_eval do + after_validate do |result, instance, attribute| + instance.errors.add(attribute, " changed message") end - instance = klass.new - instance.valid? - instance.errors.on(:name) end - - expect nil do - klass = Class.new do - include Validatable - validates_presence_of :name, :level => 1, :message => "name message" - validates_presence_of :address, :level => 2 - attr_accessor :name, :address + Validatable::ValidatesPresenceOf.class_eval do + after_validate do |result, instance, attribute| + instance.errors.add(attribute, " twice") end - instance = klass.new - instance.valid? - instance.errors.on(:address) end + instance = klass.new + instance.valid? + Validatable::ValidatesPresenceOf.after_validations.clear + Validatable::ValidationBase.after_validations.clear + instance.errors.on(:name).join end -end \ No newline at end of file + + expect false do + klass = Class.new do + include Validatable + validates_presence_of :name, :groups => :group_one + attr_accessor :name + end + instance = klass.new + instance.valid_for_group_one? + end + + expect false do + klass = Class.new do + include Validatable + validates_presence_of :name, :groups => [:group_one, :group_two] + attr_accessor :name + end + instance = klass.new + instance.valid_for_group_one? + end + + expect true do + klass = Class.new do + include Validatable + validates_presence_of :name, :groups => :group_one + validates_presence_of :address + attr_accessor :name, :address + end + instance = klass.new + instance.address = 'anything' + instance.valid? + end + + expect true do + klass = Class.new do + include Validatable + validates_presence_of :name, :groups => :group_one + attr_accessor :name + end + instance = klass.new + instance.valid? + end + + expect true do + klass = Class.new do + include Validatable + validates_presence_of :name, :times => 1 + attr_accessor :name + end + instance = klass.new + instance.valid? + instance.valid? + end + + expect false do + klass = Class.new do + include Validatable + validates_presence_of :name, :times => 1 + attr_accessor :name + end + instance1 = klass.new + instance1.valid? + instance2 = klass.new + instance2.valid? + end + + expect "name message" do + klass = Class.new do + include Validatable + validates_presence_of :name, :level => 1, :message => "name message" + validates_presence_of :address, :level => 2 + attr_accessor :name, :address + end + instance = klass.new + instance.valid? + instance.errors.on(:name) + end + + expect nil do + klass = Class.new do + include Validatable + validates_presence_of :name, :level => 1, :message => "name message" + validates_presence_of :address, :level => 2 + attr_accessor :name, :address + end + instance = klass.new + instance.valid? + instance.errors.on(:address) + end +end