shoulda-matchers 1.4.2 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. data/.travis.yml +11 -3
  2. data/Appraisals +3 -3
  3. data/Gemfile +1 -1
  4. data/Gemfile.lock +69 -70
  5. data/MIT-LICENSE +1 -1
  6. data/NEWS.md +22 -4
  7. data/README.md +3 -1
  8. data/Rakefile +9 -5
  9. data/features/step_definitions/rails_steps.rb +7 -7
  10. data/features/support/env.rb +1 -1
  11. data/gemfiles/3.0.gemfile +1 -1
  12. data/gemfiles/3.0.gemfile.lock +25 -22
  13. data/gemfiles/3.1.gemfile +1 -1
  14. data/gemfiles/3.1.gemfile.lock +27 -24
  15. data/gemfiles/3.2.gemfile +1 -1
  16. data/gemfiles/3.2.gemfile.lock +56 -52
  17. data/lib/shoulda/matchers/action_controller.rb +3 -2
  18. data/lib/shoulda/matchers/action_controller/assign_to_matcher.rb +10 -8
  19. data/lib/shoulda/matchers/action_controller/filter_param_matcher.rb +2 -4
  20. data/lib/shoulda/matchers/action_controller/redirect_to_matcher.rb +3 -4
  21. data/lib/shoulda/matchers/action_controller/render_template_matcher.rb +3 -4
  22. data/lib/shoulda/matchers/action_controller/render_with_layout_matcher.rb +6 -6
  23. data/lib/shoulda/matchers/action_controller/respond_with_content_type_matcher.rb +5 -2
  24. data/lib/shoulda/matchers/action_controller/respond_with_matcher.rb +2 -2
  25. data/lib/shoulda/matchers/action_controller/route_matcher.rb +12 -12
  26. data/lib/shoulda/matchers/action_controller/set_session_matcher.rb +3 -4
  27. data/lib/shoulda/matchers/action_controller/set_the_flash_matcher.rb +10 -11
  28. data/lib/shoulda/matchers/action_controller/strong_parameters_matcher.rb +121 -0
  29. data/lib/shoulda/matchers/action_mailer/have_sent_email_matcher.rb +7 -4
  30. data/lib/shoulda/matchers/active_model.rb +1 -1
  31. data/lib/shoulda/matchers/active_model/allow_mass_assignment_of_matcher.rb +8 -8
  32. data/lib/shoulda/matchers/active_model/allow_value_matcher.rb +5 -4
  33. data/lib/shoulda/matchers/active_model/disallow_value_matcher.rb +3 -3
  34. data/lib/shoulda/matchers/active_model/ensure_inclusion_of_matcher.rb +2 -2
  35. data/lib/shoulda/matchers/active_model/exception_message_finder.rb +0 -1
  36. data/lib/shoulda/matchers/active_model/helpers.rb +16 -7
  37. data/lib/shoulda/matchers/active_model/only_integer_matcher.rb +3 -3
  38. data/lib/shoulda/matchers/active_model/validate_confirmation_of_matcher.rb +8 -6
  39. data/lib/shoulda/matchers/active_model/validate_format_of_matcher.rb +19 -10
  40. data/lib/shoulda/matchers/active_model/validate_numericality_of_matcher.rb +4 -4
  41. data/lib/shoulda/matchers/active_model/validate_uniqueness_of_matcher.rb +19 -21
  42. data/lib/shoulda/matchers/active_model/validation_matcher.rb +7 -7
  43. data/lib/shoulda/matchers/active_model/validation_message_finder.rb +1 -1
  44. data/lib/shoulda/matchers/active_record/accept_nested_attributes_for_matcher.rb +5 -5
  45. data/lib/shoulda/matchers/active_record/association_matcher.rb +3 -3
  46. data/lib/shoulda/matchers/active_record/have_db_column_matcher.rb +11 -7
  47. data/lib/shoulda/matchers/active_record/have_db_index_matcher.rb +2 -2
  48. data/lib/shoulda/matchers/active_record/have_readonly_attribute_matcher.rb +5 -5
  49. data/lib/shoulda/matchers/active_record/query_the_database_matcher.rb +5 -2
  50. data/lib/shoulda/matchers/active_record/serialize_matcher.rb +3 -3
  51. data/lib/shoulda/matchers/assertion_error.rb +4 -1
  52. data/lib/shoulda/matchers/independent/delegate_matcher.rb +17 -7
  53. data/lib/shoulda/matchers/integrations/rspec.rb +19 -33
  54. data/lib/shoulda/matchers/version.rb +1 -1
  55. data/shoulda-matchers.gemspec +6 -4
  56. data/spec/shoulda/matchers/action_controller/assign_to_matcher_spec.rb +66 -0
  57. data/spec/shoulda/matchers/action_controller/filter_param_matcher_spec.rb +22 -0
  58. data/spec/shoulda/matchers/action_controller/redirect_to_matcher_spec.rb +42 -0
  59. data/spec/shoulda/matchers/action_controller/render_template_matcher_spec.rb +78 -0
  60. data/spec/shoulda/matchers/action_controller/render_with_layout_matcher_spec.rb +58 -0
  61. data/spec/shoulda/matchers/action_controller/respond_with_content_type_matcher_spec.rb +31 -0
  62. data/spec/shoulda/matchers/action_controller/respond_with_matcher_spec.rb +31 -0
  63. data/spec/shoulda/matchers/action_controller/route_matcher_spec.rb +65 -0
  64. data/spec/shoulda/matchers/action_controller/set_session_matcher_spec.rb +51 -0
  65. data/spec/shoulda/matchers/action_controller/set_the_flash_matcher_spec.rb +153 -0
  66. data/spec/shoulda/matchers/action_controller/strong_parameters_matcher_spec.rb +142 -0
  67. data/spec/shoulda/matchers/action_mailer/have_sent_email_spec.rb +324 -0
  68. data/spec/shoulda/matchers/active_model/allow_mass_assignment_of_matcher_spec.rb +111 -0
  69. data/spec/shoulda/matchers/active_model/allow_value_matcher_spec.rb +124 -0
  70. data/spec/shoulda/matchers/active_model/disallow_value_matcher_spec.rb +43 -0
  71. data/spec/shoulda/matchers/active_model/ensure_exclusion_of_matcher_spec.rb +74 -0
  72. data/spec/shoulda/matchers/active_model/ensure_inclusion_of_matcher_spec.rb +171 -0
  73. data/spec/shoulda/matchers/active_model/ensure_length_of_matcher_spec.rb +113 -0
  74. data/spec/shoulda/{active_model → matchers/active_model}/exception_message_finder_spec.rb +2 -2
  75. data/spec/shoulda/matchers/active_model/helpers_spec.rb +158 -0
  76. data/spec/shoulda/matchers/active_model/only_integer_matcher_spec.rb +52 -0
  77. data/spec/shoulda/matchers/active_model/validate_acceptance_of_matcher_spec.rb +41 -0
  78. data/spec/shoulda/matchers/active_model/validate_confirmation_of_matcher_spec.rb +41 -0
  79. data/spec/shoulda/matchers/active_model/validate_format_of_matcher_spec.rb +75 -0
  80. data/spec/shoulda/matchers/active_model/validate_numericality_of_matcher_spec.rb +73 -0
  81. data/spec/shoulda/matchers/active_model/validate_presence_of_matcher_spec.rb +127 -0
  82. data/spec/shoulda/matchers/active_model/validate_uniqueness_of_matcher_spec.rb +175 -0
  83. data/spec/shoulda/{active_model → matchers/active_model}/validation_message_finder_spec.rb +0 -1
  84. data/spec/shoulda/matchers/active_record/accept_nested_attributes_for_matcher_spec.rb +106 -0
  85. data/spec/shoulda/matchers/active_record/association_matcher_spec.rb +534 -0
  86. data/spec/shoulda/matchers/active_record/have_db_column_matcher_spec.rb +111 -0
  87. data/spec/shoulda/matchers/active_record/have_db_index_matcher_spec.rb +78 -0
  88. data/spec/shoulda/matchers/active_record/have_readonly_attributes_matcher_spec.rb +41 -0
  89. data/spec/shoulda/{active_record → matchers/active_record}/query_the_database_matcher_spec.rb +10 -10
  90. data/spec/shoulda/matchers/active_record/serialize_matcher_spec.rb +86 -0
  91. data/spec/shoulda/{independent → matchers/independent}/delegate_matcher_spec.rb +55 -34
  92. data/spec/spec_helper.rb +1 -2
  93. data/spec/support/active_model_versions.rb +4 -0
  94. data/spec/support/activemodel_helpers.rb +19 -0
  95. data/spec/support/controller_builder.rb +38 -12
  96. data/spec/support/model_builder.rb +8 -2
  97. metadata +106 -98
  98. data/spec/fixtures/addresses.yml +0 -3
  99. data/spec/fixtures/friendships.yml +0 -0
  100. data/spec/fixtures/posts.yml +0 -5
  101. data/spec/fixtures/products.yml +0 -0
  102. data/spec/fixtures/taggings.yml +0 -0
  103. data/spec/fixtures/tags.yml +0 -9
  104. data/spec/fixtures/users.yml +0 -6
  105. data/spec/shoulda/action_controller/assign_to_matcher_spec.rb +0 -63
  106. data/spec/shoulda/action_controller/filter_param_matcher_spec.rb +0 -20
  107. data/spec/shoulda/action_controller/redirect_to_matcher_spec.rb +0 -40
  108. data/spec/shoulda/action_controller/render_template_matcher_spec.rb +0 -69
  109. data/spec/shoulda/action_controller/render_with_layout_matcher_spec.rb +0 -55
  110. data/spec/shoulda/action_controller/respond_with_content_type_matcher_spec.rb +0 -28
  111. data/spec/shoulda/action_controller/respond_with_matcher_spec.rb +0 -83
  112. data/spec/shoulda/action_controller/route_matcher_spec.rb +0 -65
  113. data/spec/shoulda/action_controller/set_session_matcher_spec.rb +0 -46
  114. data/spec/shoulda/action_controller/set_the_flash_matcher_spec.rb +0 -130
  115. data/spec/shoulda/action_mailer/have_sent_email_spec.rb +0 -333
  116. data/spec/shoulda/active_model/allow_mass_assignment_of_matcher_spec.rb +0 -115
  117. data/spec/shoulda/active_model/allow_value_matcher_spec.rb +0 -131
  118. data/spec/shoulda/active_model/disallow_value_matcher_spec.rb +0 -65
  119. data/spec/shoulda/active_model/ensure_exclusion_of_matcher_spec.rb +0 -79
  120. data/spec/shoulda/active_model/ensure_inclusion_of_matcher_spec.rb +0 -181
  121. data/spec/shoulda/active_model/ensure_length_of_matcher_spec.rb +0 -138
  122. data/spec/shoulda/active_model/helpers_spec.rb +0 -129
  123. data/spec/shoulda/active_model/only_integer_matcher_spec.rb +0 -69
  124. data/spec/shoulda/active_model/validate_acceptance_of_matcher_spec.rb +0 -43
  125. data/spec/shoulda/active_model/validate_confirmation_of_matcher_spec.rb +0 -48
  126. data/spec/shoulda/active_model/validate_format_of_matcher_spec.rb +0 -79
  127. data/spec/shoulda/active_model/validate_numericality_of_matcher_spec.rb +0 -112
  128. data/spec/shoulda/active_model/validate_presence_of_matcher_spec.rb +0 -135
  129. data/spec/shoulda/active_model/validate_uniqueness_of_matcher_spec.rb +0 -154
  130. data/spec/shoulda/active_record/accept_nested_attributes_for_matcher_spec.rb +0 -84
  131. data/spec/shoulda/active_record/association_matcher_spec.rb +0 -642
  132. data/spec/shoulda/active_record/have_db_column_matcher_spec.rb +0 -185
  133. data/spec/shoulda/active_record/have_db_index_matcher_spec.rb +0 -105
  134. data/spec/shoulda/active_record/have_readonly_attributes_matcher_spec.rb +0 -46
  135. data/spec/shoulda/active_record/serialize_matcher_spec.rb +0 -81
@@ -0,0 +1,111 @@
1
+ require 'spec_helper'
2
+
3
+ describe Shoulda::Matchers::ActiveRecord::HaveDbColumnMatcher do
4
+ it 'accepts an existing database column' do
5
+ model(:nickname => :string).should have_db_column(:nickname)
6
+ end
7
+
8
+ it 'rejects a nonexistent database column' do
9
+ define_model(:employee).new.should_not have_db_column(:nickname)
10
+ end
11
+
12
+ context '#of_type' do
13
+ it 'accepts a column of correct type' do
14
+ model(:nickname => :string).
15
+ should have_db_column(:nickname).of_type(:string)
16
+ end
17
+
18
+ it 'rejects a nonexistent database column' do
19
+ define_model(:superhero).new.
20
+ should_not have_db_column(:nickname).of_type(:string)
21
+ end
22
+
23
+ it 'rejects a column of wrong type' do
24
+ model(:nickname => :integer).
25
+ should_not have_db_column(:nickname).of_type(:string)
26
+ end
27
+ end
28
+
29
+ context 'with precision option' do
30
+ it 'accepts a column of correct precision' do
31
+ with_table(:salary, :decimal, :precision => 5).
32
+ should have_db_column(:salary).with_options(:precision => 5)
33
+ end
34
+
35
+ it 'rejects a column of wrong precision' do
36
+ with_table(:salary, :decimal, :precision => 6).
37
+ should_not have_db_column(:salary).with_options(:precision => 5)
38
+ end
39
+ end
40
+
41
+ context 'with limit option' do
42
+ it 'accepts a column of correct limit' do
43
+ with_table(:email, :string, :limit => 255).
44
+ should have_db_column(:email).with_options(:limit => 255)
45
+ end
46
+
47
+ it 'rejects a column of wrong limit' do
48
+ with_table(:email, :string, :limit => 100).
49
+ should_not have_db_column(:email).with_options(:limit => 255)
50
+ end
51
+ end
52
+
53
+ context 'with default option' do
54
+ it 'accepts a column with correct default' do
55
+ with_table(:admin, :boolean, :default => false).
56
+ should have_db_column(:admin).with_options(:default => false)
57
+ end
58
+
59
+ it 'rejects a column with wrong default' do
60
+ with_table(:admin, :boolean, :default => true).
61
+ should_not have_db_column(:admin).with_options(:default => false)
62
+ end
63
+ end
64
+
65
+ context 'with null option' do
66
+ it 'accepts a column of correct null' do
67
+ with_table(:admin, :boolean, :null => false).
68
+ should have_db_column(:admin).with_options(:null => false)
69
+ end
70
+
71
+ it 'rejects a column of wrong null' do
72
+ with_table(:admin, :boolean, :null => true).
73
+ should_not have_db_column(:admin).with_options(:null => false)
74
+ end
75
+ end
76
+
77
+ context 'with scale option' do
78
+ it 'accepts a column of correct scale' do
79
+ with_table(:salary, :decimal, :precision => 10, :scale => 2).
80
+ should have_db_column(:salary).with_options(:scale => 2)
81
+ end
82
+
83
+ it 'rejects a column of wrong scale' do
84
+ with_table(:salary, :decimal, :precision => 10, :scale => 4).
85
+ should_not have_db_column(:salary).with_options(:scale => 2)
86
+ end
87
+ end
88
+
89
+ context 'with primary option' do
90
+ it 'accepts a column that is primary' do
91
+ with_table(:id, :integer, :primary => true).
92
+ should have_db_column(:id).with_options(:primary => true)
93
+ end
94
+
95
+ it 'rejects a column that is not primary' do
96
+ with_table(:whatever, :integer, :primary => false).
97
+ should_not have_db_column(:whatever).with_options(:primary => true)
98
+ end
99
+ end
100
+
101
+ def model(options = {})
102
+ define_model(:employee, options).new
103
+ end
104
+
105
+ def with_table(column_name, column_type, options)
106
+ create_table 'employees' do |table|
107
+ table.send(column_type, column_name, options)
108
+ end
109
+ define_model_class('Employee').new
110
+ end
111
+ end
@@ -0,0 +1,78 @@
1
+ require 'spec_helper'
2
+
3
+ describe Shoulda::Matchers::ActiveRecord::HaveDbIndexMatcher do
4
+ context 'have_db_index' do
5
+ it 'accepts an existing index' do
6
+ with_index_on(:age).should have_db_index(:age)
7
+ end
8
+
9
+ it 'rejects a nonexistent index' do
10
+ define_model(:employee).new.should_not have_db_index(:age)
11
+ end
12
+ end
13
+
14
+ context 'have_db_index with unique option' do
15
+ it 'accepts an index of correct unique' do
16
+ with_index_on(:ssn, :unique => true).
17
+ should have_db_index(:ssn).unique(true)
18
+ end
19
+
20
+ it 'rejects an index of wrong unique' do
21
+ with_index_on(:ssn, :unique => false).
22
+ should_not have_db_index(:ssn).unique(true)
23
+ end
24
+ end
25
+
26
+ context 'have_db_index on multiple columns' do
27
+ it 'accepts an existing index' do
28
+ db_connection = create_table 'geocodings' do |table|
29
+ table.integer :geocodable_id
30
+ table.string :geocodable_type
31
+ end
32
+ db_connection.add_index :geocodings, [:geocodable_type, :geocodable_id]
33
+ define_model_class('Geocoding').new.
34
+ should have_db_index([:geocodable_type, :geocodable_id])
35
+ end
36
+
37
+ it 'rejects a nonexistent index' do
38
+ create_table 'geocodings' do |table|
39
+ table.integer :geocodable_id
40
+ table.string :geocodable_type
41
+ end
42
+ define_model_class('Geocoding').new.
43
+ should_not have_db_index([:geocodable_type, :geocodable_id])
44
+ end
45
+ end
46
+
47
+ it 'join columns with and when describing multiple columns' do
48
+ have_db_index([:user_id, :post_id]).description.should =~ /on columns user_id and post_id/
49
+ end
50
+
51
+ it 'describes a unique index as unique' do
52
+ have_db_index(:user_id).unique(true).description.should =~ /a unique index/
53
+ end
54
+
55
+ it 'describes a non-unique index as non-unique' do
56
+ have_db_index(:user_id).unique(false).description.should =~ /a non-unique index/
57
+ end
58
+
59
+ it "does not display an index's uniqueness when it's not important" do
60
+ have_db_index(:user_id).description.should_not =~ /unique/
61
+ end
62
+
63
+ it 'allows an IndexDefinition to have a truthy value for unique' do
64
+ index_definition = stub('ActiveRecord::ConnectionAdapters::IndexDefinition',
65
+ :unique => 7, :name => :age)
66
+ matcher = have_db_index(:age).unique(true)
67
+ matcher.stubs(:matched_index => index_definition)
68
+
69
+ with_index_on(:age).should matcher
70
+ end
71
+
72
+ def with_index_on(column_name, index_options = {})
73
+ create_table 'employees' do |table|
74
+ table.integer column_name
75
+ end.add_index(:employees, column_name, index_options)
76
+ define_model_class('Employee').new
77
+ end
78
+ end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ describe Shoulda::Matchers::ActiveRecord::HaveReadonlyAttributeMatcher do
4
+ context 'a read-only attribute' do
5
+ it 'accepts' do
6
+ with_readonly_attr.should have_readonly_attribute(:attr)
7
+ end
8
+ end
9
+
10
+ context 'an attribute that is not part of the read-only set' do
11
+ it 'rejects being read-only' do
12
+ model = define_model :example, :attr => :string, :other => :string do
13
+ attr_readonly :attr
14
+ end.new
15
+
16
+ model.should_not have_readonly_attribute(:other)
17
+ end
18
+ end
19
+
20
+ context 'an attribute on a class with no readonly attributes' do
21
+ it 'rejects being read-only' do
22
+ define_model(:example, :attr => :string).new.
23
+ should_not have_readonly_attribute(:attr)
24
+ end
25
+
26
+ it 'assigns a failure message' do
27
+ model = define_model(:example, :attr => :string).new
28
+ matcher = have_readonly_attribute(:attr)
29
+
30
+ matcher.matches?(model)
31
+
32
+ matcher.failure_message_for_should.should_not be_nil
33
+ end
34
+ end
35
+
36
+ def with_readonly_attr
37
+ define_model :example, :attr => :string do
38
+ attr_readonly :attr
39
+ end.new
40
+ end
41
+ end
@@ -10,36 +10,36 @@ describe Shoulda::Matchers::ActiveRecord::QueryTheDatabaseMatcher do
10
10
  end
11
11
  end
12
12
 
13
- it "accepts the correct number of queries when there is a single query" do
13
+ it 'accepts the correct number of queries when there is a single query' do
14
14
  @parent.should query_the_database(1.times).when_calling(:count)
15
15
  end
16
16
 
17
- it "accepts any number of queries when no number is specified" do
17
+ it 'accepts any number of queries when no number is specified' do
18
18
  @parent.should query_the_database.when_calling(:count)
19
19
  end
20
20
 
21
- it "rejects any number of queries when no number is specified" do
21
+ it 'rejects any number of queries when no number is specified' do
22
22
  @parent.should_not query_the_database.when_calling(:to_s)
23
23
  end
24
24
 
25
- it "accepts the correct number of queries when there are two queries" do
25
+ it 'accepts the correct number of queries when there are two queries' do
26
26
  nonsense = lambda do
27
27
  @parent.create.kittens.create
28
28
  end
29
29
  nonsense.should query_the_database(2.times).when_calling(:call)
30
30
  end
31
31
 
32
- it "rejects the wrong number of queries" do
32
+ it 'rejects the wrong number of queries' do
33
33
  @parent.should_not query_the_database(10.times).when_calling(:count)
34
34
  end
35
35
 
36
- it "accepts fewer than the specified maximum" do
36
+ it 'accepts fewer than the specified maximum' do
37
37
  @parent.should query_the_database(5.times).or_less.when_calling(:count)
38
38
  end
39
39
 
40
- it "passes arguments to the method to examine" do
41
- model = stub("Model", :count => nil)
42
- model.should_not query_the_database.when_calling(:count).with("arguments")
43
- model.should have_received(:count).with("arguments")
40
+ it 'passes arguments to the method to examine' do
41
+ model = stub('Model', :count => nil)
42
+ model.should_not query_the_database.when_calling(:count).with('arguments')
43
+ model.should have_received(:count).with('arguments')
44
44
  end
45
45
  end
@@ -0,0 +1,86 @@
1
+ require 'spec_helper'
2
+
3
+ describe Shoulda::Matchers::ActiveRecord::SerializeMatcher do
4
+ it 'accepts when the attribute is serialized' do
5
+ with_serialized_attr.should serialize(:attr)
6
+ end
7
+
8
+ context 'when attribute is not serialized' do
9
+ it 'rejects' do
10
+ unserialized_model.should_not serialize(:attr)
11
+ end
12
+
13
+ it 'assigns a helpful failure message' do
14
+ matcher = serialize(:attr)
15
+
16
+ matcher.matches?(unserialized_model)
17
+
18
+ matcher.failure_message_for_should.should =~ /to serialize the attribute called :attr/
19
+ end
20
+
21
+ it 'assigns a helpful failure message when using #as' do
22
+ matcher = serialize(:attr).as(Hash)
23
+
24
+ matcher.matches?(unserialized_model)
25
+
26
+ matcher.failure_message_for_should.should =~ /with a type of Hash/
27
+ end
28
+
29
+ it 'assigns a helpful failure message when using #as_instance_of' do
30
+ matcher = serialize(:attr).as_instance_of(Hash)
31
+
32
+ matcher.matches?(unserialized_model)
33
+
34
+ matcher.failure_message_for_should.should =~ /with an instance of Hash/
35
+ end
36
+
37
+ def unserialized_model
38
+ @model ||= define_model(:example, :attr => :string).new
39
+ end
40
+ end
41
+
42
+ context 'an attribute that is serialized as a specific type' do
43
+ it 'accepts when the types match' do
44
+ with_serialized_attr(Hash).should serialize(:attr).as(Hash)
45
+ end
46
+
47
+ it 'rejects when the types do not match' do
48
+ with_serialized_attr(Hash).should_not serialize(:attr).as(String)
49
+ end
50
+
51
+ it 'rejects when using as_instance_of' do
52
+ with_serialized_attr(Hash).should_not serialize(:attr).as_instance_of(Hash)
53
+ end
54
+ end
55
+
56
+ context 'a serializer that is an instance of a class' do
57
+ it 'accepts when using #as_instance_of' do
58
+ define_serializer(:ExampleSerializer)
59
+ with_serialized_attr(ExampleSerializer.new).
60
+ should serialize(:attr).as_instance_of(ExampleSerializer)
61
+ end
62
+
63
+ it 'rejects when using #as' do
64
+ define_serializer(:ExampleSerializer)
65
+ with_serialized_attr(ExampleSerializer.new).
66
+ should_not serialize(:attr).as(ExampleSerializer)
67
+ end
68
+ end
69
+
70
+ def with_serialized_attr(type = nil)
71
+ define_model(:example, :attr => :string) do
72
+ if type
73
+ serialize :attr, type
74
+ else
75
+ serialize :attr
76
+ end
77
+ end.new
78
+ end
79
+
80
+ def define_serializer(name)
81
+ define_class(name) do
82
+ def load(*); end
83
+ def dump(*); end
84
+ end
85
+ end
86
+ end
@@ -1,33 +1,59 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Shoulda::Matchers::Independent::DelegateMatcher do
4
+ context '#description' do
5
+ context 'by default' do
6
+ it 'states that it should delegate method to the right object' do
7
+ matcher = delegate_method(:method_name).to(:target)
8
+
9
+ matcher.description.should == 'delegate method #method_name to :target'
10
+ end
11
+ end
12
+
13
+ context 'with #as chain' do
14
+ it 'states that it should delegate method to the right object and method' do
15
+ matcher = delegate_method(:method_name).to(:target).as(:alternate)
16
+
17
+ matcher.description.should == 'delegate method #method_name to :target as #alternate'
18
+ end
19
+ end
20
+
21
+ context 'with #with_argument chain' do
22
+ it 'states that it should delegate method to the right object with right argument' do
23
+ matcher = delegate_method(:method_name).to(:target).with_arguments(:foo, :bar => [1, 2])
24
+
25
+ matcher.description.should ==
26
+ 'delegate method #method_name to :target with arguments: [:foo, {:bar=>[1, 2]}]'
27
+ end
28
+ end
29
+ end
30
+
4
31
  it 'supports chaining on #to' do
5
32
  matcher = delegate_method(:method)
33
+
6
34
  matcher.to(:another_method).should == matcher
7
35
  end
8
36
 
9
37
  it 'supports chaining on #with_arguments' do
10
38
  matcher = delegate_method(:method)
39
+
11
40
  matcher.with_arguments(1, 2, 3).should == matcher
12
41
  end
13
42
 
14
43
  it 'supports chaining on #as' do
15
44
  matcher = delegate_method(:method)
45
+
16
46
  matcher.as(:some_other_method).should == matcher
17
47
  end
18
48
 
19
- it 'should raise an error if no delegation target is defined' do
20
- object = Object.new
21
- expect {
22
- object.should delegate_method(:name)
23
- }.to raise_exception Shoulda::Matchers::Independent::DelegateMatcher::TargetNotDefinedError
49
+ it 'raises an error if no delegation target is defined' do
50
+ expect { Object.new.should delegate_method(:name) }.
51
+ to raise_exception described_class::TargetNotDefinedError
24
52
  end
25
53
 
26
- it 'should raise an error if called with #should_not' do
27
- object = Object.new
28
- expect {
29
- object.should_not delegate_method(:name).to(:anyone)
30
- }.to raise_exception Shoulda::Matchers::Independent::DelegateMatcher::InvalidDelegateMatcher
54
+ it 'raises an error if called with #should_not' do
55
+ expect { Object.new.should_not delegate_method(:name).to(:anyone) }.
56
+ to raise_exception described_class::InvalidDelegateMatcher
31
57
  end
32
58
 
33
59
  context 'given a method that does not delegate' do
@@ -39,9 +65,10 @@ describe Shoulda::Matchers::Independent::DelegateMatcher do
39
65
  end
40
66
  end
41
67
 
42
- it 'does not match' do
68
+ it 'rejects' do
43
69
  post_office = PostOffice.new
44
70
  matcher = delegate_method(:deliver_mail).to(:mailman)
71
+
45
72
  matcher.matches?(post_office).should be_false
46
73
  end
47
74
 
@@ -52,7 +79,7 @@ describe Shoulda::Matchers::Independent::DelegateMatcher do
52
79
  matcher.matches?(post_office)
53
80
 
54
81
  message = 'Expected PostOffice#deliver_mail to delegate to PostOffice#mailman'
55
- matcher.failure_message.should == message
82
+ matcher.failure_message_for_should.should == message
56
83
  end
57
84
 
58
85
  it 'uses the proper syntax for class methods in errors' do
@@ -61,12 +88,12 @@ describe Shoulda::Matchers::Independent::DelegateMatcher do
61
88
  matcher.matches?(PostOffice)
62
89
 
63
90
  message = 'Expected PostOffice.deliver_mail to delegate to PostOffice.mailman'
64
- matcher.failure_message.should == message
91
+ matcher.failure_message_for_should.should == message
65
92
  end
66
93
  end
67
94
 
68
95
  context 'given a method that delegates properly' do
69
- before do
96
+ it 'accepts' do
70
97
  define_class(:mailman)
71
98
  define_class(:post_office) do
72
99
  def deliver_mail
@@ -76,12 +103,7 @@ describe Shoulda::Matchers::Independent::DelegateMatcher do
76
103
  def mailman
77
104
  Mailman.new
78
105
  end
79
- end
80
- end
81
-
82
- it 'matches' do
83
- post_office = PostOffice.new
84
- post_office.should delegate_method(:deliver_mail).to(:mailman)
106
+ end.new.should delegate_method(:deliver_mail).to(:mailman)
85
107
  end
86
108
  end
87
109
 
@@ -100,17 +122,17 @@ describe Shoulda::Matchers::Independent::DelegateMatcher do
100
122
  end
101
123
 
102
124
  context 'when given the correct arguments' do
103
- it 'matches' do
104
- post_office = PostOffice.new
105
- matcher = delegate_method(:deliver_mail).to(:mailman).with_arguments('221B Baker St.', :hastily => true)
106
- post_office.should matcher
125
+ it 'accepts' do
126
+ PostOffice.new.should delegate_method(:deliver_mail).
127
+ to(:mailman).with_arguments('221B Baker St.', :hastily => true)
107
128
  end
108
129
  end
109
130
 
110
131
  context 'when not given the correct arguments' do
111
- it 'does not match' do
132
+ it 'rejects' do
112
133
  post_office = PostOffice.new
113
- matcher = delegate_method(:deliver_mail).to(:mailman).with_arguments('123 Nowhere Ln.')
134
+ matcher = delegate_method(:deliver_mail).to(:mailman).
135
+ with_arguments('123 Nowhere Ln.')
114
136
  matcher.matches?(post_office).should be_false
115
137
  end
116
138
 
@@ -121,7 +143,7 @@ describe Shoulda::Matchers::Independent::DelegateMatcher do
121
143
  matcher.matches?(post_office)
122
144
 
123
145
  message = 'Expected PostOffice#deliver_mail to delegate to PostOffice#mailman with arguments: ["123 Nowhere Ln."]'
124
- matcher.failure_message.should == message
146
+ matcher.failure_message_for_should.should == message
125
147
  end
126
148
  end
127
149
  end
@@ -141,15 +163,14 @@ describe Shoulda::Matchers::Independent::DelegateMatcher do
141
163
  end
142
164
 
143
165
  context 'when given the correct method name' do
144
- it 'matches' do
145
- post_office = PostOffice.new
146
- matcher = delegate_method(:deliver_mail).to(:mailman).as(:deliver_mail_and_avoid_dogs)
147
- post_office.should matcher
166
+ it 'accepts' do
167
+ PostOffice.new.
168
+ should delegate_method(:deliver_mail).to(:mailman).as(:deliver_mail_and_avoid_dogs)
148
169
  end
149
170
  end
150
171
 
151
172
  context 'when given an incorrect method name' do
152
- it 'does not match' do
173
+ it 'rejects' do
153
174
  post_office = PostOffice.new
154
175
  matcher = delegate_method(:deliver_mail).to(:mailman).as(:watch_tv)
155
176
  matcher.matches?(post_office).should be_false
@@ -161,8 +182,8 @@ describe Shoulda::Matchers::Independent::DelegateMatcher do
161
182
 
162
183
  matcher.matches?(post_office)
163
184
 
164
- message = 'Expected PostOffice#deliver_mail to delegate to PostOffice#mailman as :watch_tv'
165
- matcher.failure_message.should == message
185
+ message = 'Expected PostOffice#deliver_mail to delegate to PostOffice#mailman as #watch_tv'
186
+ matcher.failure_message_for_should.should == message
166
187
  end
167
188
  end
168
189
  end