francois-shoulda 2.0.5.4 → 2.10.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +60 -10
- data/Rakefile +7 -7
- data/lib/shoulda.rb +7 -15
- data/lib/shoulda/action_controller.rb +28 -0
- data/lib/shoulda/action_controller/helpers.rb +47 -0
- data/lib/shoulda/action_controller/macros.rb +277 -0
- data/lib/shoulda/action_controller/matchers.rb +37 -0
- data/lib/shoulda/action_controller/matchers/assign_to_matcher.rb +109 -0
- data/lib/shoulda/action_controller/matchers/filter_param_matcher.rb +57 -0
- data/lib/shoulda/action_controller/matchers/render_with_layout_matcher.rb +81 -0
- data/lib/shoulda/action_controller/matchers/respond_with_content_type_matcher.rb +70 -0
- data/lib/shoulda/action_controller/matchers/respond_with_matcher.rb +81 -0
- data/lib/shoulda/action_controller/matchers/route_matcher.rb +93 -0
- data/lib/shoulda/action_controller/matchers/set_session_matcher.rb +87 -0
- data/lib/shoulda/action_controller/matchers/set_the_flash_matcher.rb +85 -0
- data/lib/shoulda/action_mailer.rb +1 -1
- data/lib/shoulda/action_mailer/assertions.rb +32 -33
- data/lib/shoulda/action_view.rb +10 -0
- data/lib/shoulda/action_view/macros.rb +56 -0
- data/lib/shoulda/active_record.rb +6 -2
- data/lib/shoulda/active_record/assertions.rb +62 -89
- data/lib/shoulda/active_record/helpers.rb +40 -0
- data/lib/shoulda/active_record/macros.rb +520 -684
- data/lib/shoulda/active_record/matchers.rb +42 -0
- data/lib/shoulda/active_record/matchers/allow_mass_assignment_of_matcher.rb +83 -0
- data/lib/shoulda/active_record/matchers/allow_value_matcher.rb +102 -0
- data/lib/shoulda/active_record/matchers/association_matcher.rb +226 -0
- data/lib/shoulda/active_record/matchers/ensure_inclusion_of_matcher.rb +87 -0
- data/lib/shoulda/active_record/matchers/ensure_length_of_matcher.rb +141 -0
- data/lib/shoulda/active_record/matchers/have_db_column_matcher.rb +169 -0
- data/lib/shoulda/active_record/matchers/have_index_matcher.rb +105 -0
- data/lib/shoulda/active_record/matchers/have_named_scope_matcher.rb +125 -0
- data/lib/shoulda/active_record/matchers/have_readonly_attribute_matcher.rb +59 -0
- data/lib/shoulda/active_record/matchers/validate_acceptance_of_matcher.rb +41 -0
- data/lib/shoulda/active_record/matchers/validate_numericality_of_matcher.rb +39 -0
- data/lib/shoulda/active_record/matchers/validate_presence_of_matcher.rb +60 -0
- data/lib/shoulda/active_record/matchers/validate_uniqueness_of_matcher.rb +148 -0
- data/lib/shoulda/active_record/matchers/validation_matcher.rb +56 -0
- data/lib/shoulda/assertions.rb +50 -40
- data/lib/shoulda/autoload_macros.rb +46 -0
- data/lib/shoulda/context.rb +124 -126
- data/lib/shoulda/helpers.rb +5 -7
- data/lib/shoulda/macros.rb +63 -64
- data/lib/shoulda/private_helpers.rb +16 -18
- data/lib/shoulda/rails.rb +5 -11
- data/lib/shoulda/rspec.rb +11 -0
- data/lib/shoulda/tasks/list_tests.rake +6 -1
- data/lib/shoulda/test_unit.rb +19 -0
- data/rails/init.rb +7 -1
- data/test/README +2 -2
- data/test/fail_macros.rb +15 -15
- data/test/fixtures/tags.yml +1 -1
- data/test/functional/posts_controller_test.rb +46 -26
- data/test/functional/users_controller_test.rb +0 -19
- data/test/matchers/active_record/allow_mass_assignment_of_matcher_test.rb +68 -0
- data/test/matchers/active_record/allow_value_matcher_test.rb +41 -0
- data/test/matchers/active_record/association_matcher_test.rb +258 -0
- data/test/matchers/active_record/ensure_inclusion_of_matcher_test.rb +80 -0
- data/test/matchers/active_record/ensure_length_of_matcher_test.rb +158 -0
- data/test/matchers/active_record/have_db_column_matcher_test.rb +169 -0
- data/test/matchers/active_record/have_index_matcher_test.rb +74 -0
- data/test/matchers/active_record/have_named_scope_matcher_test.rb +65 -0
- data/test/matchers/active_record/have_readonly_attributes_matcher_test.rb +29 -0
- data/test/matchers/active_record/validate_acceptance_of_matcher_test.rb +44 -0
- data/test/matchers/active_record/validate_numericality_of_matcher_test.rb +52 -0
- data/test/matchers/active_record/validate_presence_of_matcher_test.rb +86 -0
- data/test/matchers/active_record/validate_uniqueness_of_matcher_test.rb +147 -0
- data/test/matchers/controller/assign_to_matcher_test.rb +35 -0
- data/test/matchers/controller/filter_param_matcher_test.rb +32 -0
- data/test/matchers/controller/render_with_layout_matcher_test.rb +33 -0
- data/test/matchers/controller/respond_with_content_type_matcher_test.rb +27 -0
- data/test/matchers/controller/respond_with_matcher_test.rb +106 -0
- data/test/matchers/controller/route_matcher_test.rb +58 -0
- data/test/matchers/controller/set_session_matcher_test.rb +31 -0
- data/test/matchers/controller/set_the_flash_matcher.rb +41 -0
- data/test/model_builder.rb +106 -0
- data/test/other/autoload_macro_test.rb +18 -0
- data/test/other/helpers_test.rb +58 -0
- data/test/other/private_helpers_test.rb +1 -1
- data/test/other/should_test.rb +16 -16
- data/test/rails_root/app/controllers/posts_controller.rb +6 -5
- data/test/rails_root/app/models/pets/dog.rb +10 -0
- data/test/rails_root/app/models/treat.rb +3 -0
- data/test/rails_root/app/models/user.rb +4 -3
- data/test/rails_root/app/views/layouts/posts.rhtml +2 -0
- data/test/rails_root/config/database.yml +1 -1
- data/test/rails_root/config/environment.rb +1 -1
- data/test/rails_root/config/environments/{sqlite3.rb → test.rb} +0 -0
- data/test/rails_root/db/migrate/001_create_users.rb +3 -2
- data/test/rails_root/db/migrate/011_create_treats.rb +12 -0
- data/test/rails_root/test/shoulda_macros/custom_macro.rb +6 -0
- data/test/rails_root/vendor/gems/gem_with_macro-0.0.1/shoulda_macros/gem_macro.rb +6 -0
- data/test/rails_root/vendor/plugins/plugin_with_macro/shoulda_macros/plugin_macro.rb +6 -0
- data/test/rspec_test.rb +207 -0
- data/test/test_helper.rb +3 -1
- data/test/unit/address_test.rb +1 -23
- data/test/unit/dog_test.rb +5 -2
- data/test/unit/post_test.rb +7 -3
- data/test/unit/product_test.rb +2 -2
- data/test/unit/tag_test.rb +2 -1
- data/test/unit/user_test.rb +25 -9
- metadata +84 -23
- data/lib/shoulda/controller.rb +0 -30
- data/lib/shoulda/controller/formats/html.rb +0 -201
- data/lib/shoulda/controller/formats/xml.rb +0 -170
- data/lib/shoulda/controller/helpers.rb +0 -64
- data/lib/shoulda/controller/macros.rb +0 -316
- data/lib/shoulda/controller/resource_options.rb +0 -236
- data/test/rails_root/app/models/dog.rb +0 -5
@@ -0,0 +1,87 @@
|
|
1
|
+
module Shoulda # :nodoc:
|
2
|
+
module ActionController # :nodoc:
|
3
|
+
module Matchers
|
4
|
+
|
5
|
+
# Ensures that a session key was set to the expected value.
|
6
|
+
#
|
7
|
+
# Example:
|
8
|
+
#
|
9
|
+
# it { should set_session(:message) }
|
10
|
+
# it { should set_session(:user_id).to(@user.id) }
|
11
|
+
# it { should_not set_session(:user_id) }
|
12
|
+
def set_session(key)
|
13
|
+
SetSessionMatcher.new(key)
|
14
|
+
end
|
15
|
+
|
16
|
+
class SetSessionMatcher # :nodoc:
|
17
|
+
|
18
|
+
def initialize(key)
|
19
|
+
@key = key.to_s
|
20
|
+
end
|
21
|
+
|
22
|
+
def to(value)
|
23
|
+
@value = value
|
24
|
+
self
|
25
|
+
end
|
26
|
+
|
27
|
+
def matches?(controller)
|
28
|
+
@controller = controller
|
29
|
+
(assigned_value? && assigned_correct_value?) || cleared_value?
|
30
|
+
end
|
31
|
+
|
32
|
+
def failure_message
|
33
|
+
"Expected #{expectation}, but #{result}"
|
34
|
+
end
|
35
|
+
|
36
|
+
def negative_failure_message
|
37
|
+
"Didn't expect #{expectation}, but #{result}"
|
38
|
+
end
|
39
|
+
|
40
|
+
def description
|
41
|
+
description = "set session variable #{@key.inspect}"
|
42
|
+
description << " to #{@value.inspect}" if defined?(@value)
|
43
|
+
description
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def assigned_value?
|
49
|
+
!assigned_value.blank?
|
50
|
+
end
|
51
|
+
|
52
|
+
def cleared_value?
|
53
|
+
defined?(@value) && @value.nil? && assigned_value.nil?
|
54
|
+
end
|
55
|
+
|
56
|
+
def assigned_correct_value?
|
57
|
+
return true if @value.nil?
|
58
|
+
assigned_value == @value
|
59
|
+
end
|
60
|
+
|
61
|
+
def assigned_value
|
62
|
+
session[@key]
|
63
|
+
end
|
64
|
+
|
65
|
+
def session
|
66
|
+
@controller.response.session.data
|
67
|
+
end
|
68
|
+
|
69
|
+
def expectation
|
70
|
+
expectation = "session variable #{@key} to be set"
|
71
|
+
expectation << " to #{@value.inspect}" if @value
|
72
|
+
expectation
|
73
|
+
end
|
74
|
+
|
75
|
+
def result
|
76
|
+
if session.empty?
|
77
|
+
"no session variables were set"
|
78
|
+
else
|
79
|
+
"the session was #{session.inspect}"
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
module Shoulda # :nodoc:
|
2
|
+
module ActionController # :nodoc:
|
3
|
+
module Matchers
|
4
|
+
|
5
|
+
# Ensures that the flash contains the given value. Can be a String, a
|
6
|
+
# Regexp, or nil (indicating that the flash should not be set).
|
7
|
+
#
|
8
|
+
# Example:
|
9
|
+
#
|
10
|
+
# it { should set_the_flash }
|
11
|
+
# it { should set_the_flash.to("Thank you for placing this order.") }
|
12
|
+
# it { should set_the_flash.to(/created/i) }
|
13
|
+
# it { should_not set_the_flash }
|
14
|
+
def set_the_flash
|
15
|
+
SetTheFlashMatcher.new
|
16
|
+
end
|
17
|
+
|
18
|
+
class SetTheFlashMatcher # :nodoc:
|
19
|
+
|
20
|
+
def to(value)
|
21
|
+
@value = value
|
22
|
+
self
|
23
|
+
end
|
24
|
+
|
25
|
+
def matches?(controller)
|
26
|
+
@controller = controller
|
27
|
+
sets_the_flash? && string_value_matches? && regexp_value_matches?
|
28
|
+
end
|
29
|
+
|
30
|
+
attr_reader :failure_message, :negative_failure_message
|
31
|
+
|
32
|
+
def description
|
33
|
+
description = "set the flash"
|
34
|
+
description << " to #{@value.inspect}" unless @value.nil?
|
35
|
+
description
|
36
|
+
end
|
37
|
+
|
38
|
+
def failure_message
|
39
|
+
"Expected #{expectation}"
|
40
|
+
end
|
41
|
+
|
42
|
+
def negative_failure_message
|
43
|
+
"Did not expect #{expectation}"
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def sets_the_flash?
|
49
|
+
!flash.blank?
|
50
|
+
end
|
51
|
+
|
52
|
+
def string_value_matches?
|
53
|
+
return true unless String === @value
|
54
|
+
flash.values.any? {|value| value == @value }
|
55
|
+
end
|
56
|
+
|
57
|
+
def regexp_value_matches?
|
58
|
+
return true unless Regexp === @value
|
59
|
+
flash.values.any? {|value| value =~ @value }
|
60
|
+
end
|
61
|
+
|
62
|
+
def flash
|
63
|
+
@controller.response.session['flash']
|
64
|
+
end
|
65
|
+
|
66
|
+
def expectation
|
67
|
+
expectation = "the flash to be set"
|
68
|
+
expectation << " to #{@value.inspect}" unless @value.nil?
|
69
|
+
expectation << ", but #{flash_description}"
|
70
|
+
expectation
|
71
|
+
end
|
72
|
+
|
73
|
+
def flash_description
|
74
|
+
if flash.blank?
|
75
|
+
"no flash was set"
|
76
|
+
else
|
77
|
+
"was #{flash.inspect}"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -1,39 +1,38 @@
|
|
1
|
-
module
|
2
|
-
module
|
3
|
-
module
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
assert !matching_emails.empty?, "None of the emails matched."
|
25
|
-
end
|
1
|
+
module Shoulda # :nodoc:
|
2
|
+
module ActionMailer # :nodoc:
|
3
|
+
module Assertions
|
4
|
+
# Asserts that an email was delivered. Can take a block that can further
|
5
|
+
# narrow down the types of emails you're expecting.
|
6
|
+
#
|
7
|
+
# assert_sent_email
|
8
|
+
#
|
9
|
+
# Passes if ActionMailer::Base.deliveries has an email
|
10
|
+
#
|
11
|
+
# assert_sent_email do |email|
|
12
|
+
# email.subject =~ /hi there/ && email.to.include?('none@none.com')
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
# Passes if there is an email with subject containing 'hi there' and
|
16
|
+
# 'none@none.com' as one of the recipients.
|
17
|
+
#
|
18
|
+
def assert_sent_email
|
19
|
+
emails = ::ActionMailer::Base.deliveries
|
20
|
+
assert !emails.empty?, "No emails were sent"
|
21
|
+
if block_given?
|
22
|
+
matching_emails = emails.select {|email| yield email }
|
23
|
+
assert !matching_emails.empty?, "None of the emails matched."
|
26
24
|
end
|
25
|
+
end
|
27
26
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
end
|
27
|
+
# Asserts that no ActionMailer mails were delivered
|
28
|
+
#
|
29
|
+
# assert_did_not_send_email
|
30
|
+
def assert_did_not_send_email
|
31
|
+
msg = "Sent #{::ActionMailer::Base.deliveries.size} emails.\n"
|
32
|
+
::ActionMailer::Base.deliveries.each { |m| msg << " '#{m.subject}' sent to #{m.to.to_sentence}\n" }
|
33
|
+
assert ::ActionMailer::Base.deliveries.empty?, msg
|
36
34
|
end
|
37
35
|
end
|
38
36
|
end
|
39
37
|
end
|
38
|
+
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module Shoulda # :nodoc:
|
2
|
+
module ActionView # :nodoc:
|
3
|
+
# = Macro test helpers for your view
|
4
|
+
#
|
5
|
+
# By using the macro helpers you can quickly and easily create concise and
|
6
|
+
# easy to read test suites.
|
7
|
+
#
|
8
|
+
# This code segment:
|
9
|
+
# context "on GET to :new" do
|
10
|
+
# setup do
|
11
|
+
# get :new
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
# should_render_a_form
|
15
|
+
# should_render_page_with_metadata :title => /index/
|
16
|
+
#
|
17
|
+
# should "do something else really cool" do
|
18
|
+
# assert_select '#really_cool'
|
19
|
+
# end
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
# Would produce 3 tests for the +show+ action
|
23
|
+
module Macros
|
24
|
+
|
25
|
+
# Macro that creates a test asserting that the rendered view contains a <form> element.
|
26
|
+
def should_render_a_form
|
27
|
+
should "display a form" do
|
28
|
+
assert_select "form", true, "The template doesn't contain a <form> element"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# Macro that creates a test asserting that the rendered view contains the selected metatags.
|
33
|
+
# Values can be string or Regexps.
|
34
|
+
# Example:
|
35
|
+
#
|
36
|
+
# should_render_page_with_metadata :description => "Description of this page", :keywords => /post/
|
37
|
+
#
|
38
|
+
# You can also use this method to test the rendered views title.
|
39
|
+
#
|
40
|
+
# Example:
|
41
|
+
# should_render_page_with_metadata :title => /index/
|
42
|
+
def should_render_page_with_metadata(options)
|
43
|
+
options.each do |key, value|
|
44
|
+
should "have metatag #{key}" do
|
45
|
+
if key.to_sym == :title
|
46
|
+
assert_select "title", value
|
47
|
+
else
|
48
|
+
assert_select "meta[name=?][content#{"*" if value.is_a?(Regexp)}=?]", key, value
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
@@ -1,12 +1,16 @@
|
|
1
1
|
require 'shoulda'
|
2
|
+
require 'shoulda/active_record/helpers'
|
3
|
+
require 'shoulda/active_record/matchers'
|
2
4
|
require 'shoulda/active_record/assertions'
|
3
5
|
require 'shoulda/active_record/macros'
|
4
6
|
|
5
7
|
module Test # :nodoc: all
|
6
8
|
module Unit
|
7
9
|
class TestCase
|
8
|
-
include
|
9
|
-
|
10
|
+
include Shoulda::ActiveRecord::Helpers
|
11
|
+
include Shoulda::ActiveRecord::Matchers
|
12
|
+
include Shoulda::ActiveRecord::Assertions
|
13
|
+
extend Shoulda::ActiveRecord::Macros
|
10
14
|
end
|
11
15
|
end
|
12
16
|
end
|
@@ -1,95 +1,68 @@
|
|
1
|
-
module
|
2
|
-
module
|
3
|
-
module
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
end
|
12
|
-
|
13
|
-
# Asserts that the given object is valid
|
14
|
-
#
|
15
|
-
# assert_valid User.new(params)
|
16
|
-
def assert_valid(obj)
|
17
|
-
assert obj.valid?, "Errors: #{pretty_error_messages obj}"
|
18
|
-
end
|
19
|
-
|
20
|
-
# Asserts that the given object is invalid, in the ActiveRecord sense.
|
21
|
-
# Calls #valid? on the object, and fails the assertion if the value is true.
|
22
|
-
#
|
23
|
-
# assert_invalid User.new(params)
|
24
|
-
def assert_invalid(obj)
|
25
|
-
assert !obj.valid?, "<#{obj.inspect}> should have been invalid"
|
26
|
-
end
|
27
|
-
|
28
|
-
# Asserts that an Active Record model validates with the passed
|
29
|
-
# <tt>value</tt> by making sure the <tt>error_message_to_avoid</tt> is not
|
30
|
-
# contained within the list of errors for that attribute.
|
31
|
-
#
|
32
|
-
# assert_good_value(User.new, :email, "user@example.com")
|
33
|
-
# assert_good_value(User.new, :ssn, "123456789", /length/)
|
34
|
-
#
|
35
|
-
# If a class is passed as the first argument, a new object will be
|
36
|
-
# instantiated before the assertion. If an instance variable exists with
|
37
|
-
# the same name as the class (underscored), that object will be used
|
38
|
-
# instead.
|
39
|
-
#
|
40
|
-
# assert_good_value(User, :email, "user@example.com")
|
41
|
-
#
|
42
|
-
# @product = Product.new(:tangible => false)
|
43
|
-
# assert_good_value(Product, :price, "0")
|
44
|
-
def assert_good_value(object_or_klass, attribute, value, error_message_to_avoid = //)
|
45
|
-
object = get_instance_of(object_or_klass)
|
46
|
-
object.send("#{attribute}=", value)
|
47
|
-
object.valid?
|
48
|
-
assert_does_not_contain(object.errors.on(attribute), error_message_to_avoid, "when set to #{value.inspect}")
|
49
|
-
end
|
50
|
-
|
51
|
-
# Asserts that an Active Record model invalidates the passed
|
52
|
-
# <tt>value</tt> by making sure the <tt>error_message_to_expect</tt> is
|
53
|
-
# contained within the list of errors for that attribute.
|
54
|
-
#
|
55
|
-
# assert_bad_value(User.new, :email, "invalid")
|
56
|
-
# assert_bad_value(User.new, :ssn, "123", /length/)
|
57
|
-
#
|
58
|
-
# If a class is passed as the first argument, a new object will be
|
59
|
-
# instantiated before the assertion. If an instance variable exists with
|
60
|
-
# the same name as the class (underscored), that object will be used
|
61
|
-
# instead.
|
62
|
-
#
|
63
|
-
# assert_bad_value(User, :email, "invalid")
|
64
|
-
#
|
65
|
-
# @product = Product.new(:tangible => true)
|
66
|
-
# assert_bad_value(Product, :price, "0")
|
67
|
-
def assert_bad_value(object_or_klass, attribute, value,
|
68
|
-
error_message_to_expect = self.class.default_error_message(:invalid))
|
69
|
-
object = get_instance_of(object_or_klass)
|
70
|
-
object.send("#{attribute}=", value)
|
71
|
-
assert !object.valid?, "#{object.class} allowed #{value.inspect} as a value for #{attribute}"
|
72
|
-
assert object.errors.on(attribute), "There are no errors on #{attribute} after being set to #{value.inspect}"
|
73
|
-
assert_contains(object.errors.on(attribute), error_message_to_expect, "when set to #{value.inspect}")
|
74
|
-
end
|
1
|
+
module Shoulda # :nodoc:
|
2
|
+
module ActiveRecord # :nodoc:
|
3
|
+
module Assertions
|
4
|
+
# Asserts that the given object can be saved
|
5
|
+
#
|
6
|
+
# assert_save User.new(params)
|
7
|
+
def assert_save(obj)
|
8
|
+
assert obj.save, "Errors: #{pretty_error_messages obj}"
|
9
|
+
obj.reload
|
10
|
+
end
|
75
11
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
12
|
+
# Asserts that the given object is valid
|
13
|
+
#
|
14
|
+
# assert_valid User.new(params)
|
15
|
+
def assert_valid(obj)
|
16
|
+
assert obj.valid?, "Errors: #{pretty_error_messages obj}"
|
17
|
+
end
|
82
18
|
|
83
|
-
|
19
|
+
# Asserts that an Active Record model validates with the passed
|
20
|
+
# <tt>value</tt> by making sure the <tt>error_message_to_avoid</tt> is not
|
21
|
+
# contained within the list of errors for that attribute.
|
22
|
+
#
|
23
|
+
# assert_good_value(User.new, :email, "user@example.com")
|
24
|
+
# assert_good_value(User.new, :ssn, "123456789", /length/)
|
25
|
+
#
|
26
|
+
# If a class is passed as the first argument, a new object will be
|
27
|
+
# instantiated before the assertion. If an instance variable exists with
|
28
|
+
# the same name as the class (underscored), that object will be used
|
29
|
+
# instead.
|
30
|
+
#
|
31
|
+
# assert_good_value(User, :email, "user@example.com")
|
32
|
+
#
|
33
|
+
# @product = Product.new(:tangible => false)
|
34
|
+
# assert_good_value(Product, :price, "0")
|
35
|
+
def assert_good_value(object_or_klass, attribute, value, error_message_to_avoid = nil)
|
36
|
+
object = get_instance_of(object_or_klass)
|
37
|
+
matcher = allow_value(value).
|
38
|
+
for(attribute).
|
39
|
+
with_message(error_message_to_avoid)
|
40
|
+
assert_accepts(matcher, object)
|
41
|
+
end
|
84
42
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
43
|
+
# Asserts that an Active Record model invalidates the passed
|
44
|
+
# <tt>value</tt> by making sure the <tt>error_message_to_expect</tt> is
|
45
|
+
# contained within the list of errors for that attribute.
|
46
|
+
#
|
47
|
+
# assert_bad_value(User.new, :email, "invalid")
|
48
|
+
# assert_bad_value(User.new, :ssn, "123", /length/)
|
49
|
+
#
|
50
|
+
# If a class is passed as the first argument, a new object will be
|
51
|
+
# instantiated before the assertion. If an instance variable exists with
|
52
|
+
# the same name as the class (underscored), that object will be used
|
53
|
+
# instead.
|
54
|
+
#
|
55
|
+
# assert_bad_value(User, :email, "invalid")
|
56
|
+
#
|
57
|
+
# @product = Product.new(:tangible => true)
|
58
|
+
# assert_bad_value(Product, :price, "0")
|
59
|
+
def assert_bad_value(object_or_klass, attribute, value,
|
60
|
+
error_message_to_expect = nil)
|
61
|
+
object = get_instance_of(object_or_klass)
|
62
|
+
matcher = allow_value(value).
|
63
|
+
for(attribute).
|
64
|
+
with_message(error_message_to_expect)
|
65
|
+
assert_rejects(matcher, object)
|
93
66
|
end
|
94
67
|
end
|
95
68
|
end
|