shoulda-matchers 2.8.0 → 3.0.0.rc1
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.
- checksums.yaml +4 -4
- data/.hound_config/ruby.yml +7 -0
- data/.travis.yml +11 -54
- data/Appraisals +45 -100
- data/CONTRIBUTING.md +51 -7
- data/Gemfile +7 -19
- data/Gemfile.lock +60 -134
- data/Guardfile +5 -0
- data/NEWS.md +203 -0
- data/README.md +95 -50
- data/Rakefile +1 -0
- data/doc_config/yard/templates/default/layout/html/setup.rb +1 -1
- data/gemfiles/4.0.0.gemfile +10 -7
- data/gemfiles/4.0.0.gemfile.lock +103 -79
- data/gemfiles/4.0.1.gemfile +10 -7
- data/gemfiles/4.0.1.gemfile.lock +109 -83
- data/gemfiles/4.1.gemfile +10 -7
- data/gemfiles/4.1.gemfile.lock +109 -85
- data/gemfiles/4.2.gemfile +10 -9
- data/gemfiles/4.2.gemfile.lock +86 -78
- data/lib/shoulda/matchers.rb +13 -18
- data/lib/shoulda/matchers/action_controller.rb +4 -1
- data/lib/shoulda/matchers/action_controller/flash_store.rb +95 -0
- data/lib/shoulda/matchers/action_controller/{strong_parameters_matcher.rb → permit_matcher.rb} +147 -30
- data/lib/shoulda/matchers/action_controller/redirect_to_matcher.rb +1 -1
- data/lib/shoulda/matchers/action_controller/render_template_matcher.rb +1 -1
- data/lib/shoulda/matchers/action_controller/render_with_layout_matcher.rb +1 -1
- data/lib/shoulda/matchers/action_controller/rescue_from_matcher.rb +1 -1
- data/lib/shoulda/matchers/action_controller/route_matcher.rb +5 -1
- data/lib/shoulda/matchers/action_controller/route_params.rb +15 -6
- data/lib/shoulda/matchers/action_controller/session_store.rb +34 -0
- data/lib/shoulda/matchers/action_controller/set_flash_matcher.rb +30 -136
- data/lib/shoulda/matchers/action_controller/set_session_matcher.rb +28 -109
- data/lib/shoulda/matchers/action_controller/set_session_or_flash_matcher.rb +103 -0
- data/lib/shoulda/matchers/active_model/allow_mass_assignment_of_matcher.rb +1 -12
- data/lib/shoulda/matchers/active_model/allow_value_matcher.rb +79 -10
- data/lib/shoulda/matchers/active_model/numericality_matchers/numeric_type_matcher.rb +10 -0
- data/lib/shoulda/matchers/active_model/validate_absence_of_matcher.rb +21 -0
- data/lib/shoulda/matchers/active_model/validate_acceptance_of_matcher.rb +24 -0
- data/lib/shoulda/matchers/active_model/validate_confirmation_of_matcher.rb +22 -5
- data/lib/shoulda/matchers/active_model/validate_exclusion_of_matcher.rb +29 -10
- data/lib/shoulda/matchers/active_model/validate_inclusion_of_matcher.rb +27 -10
- data/lib/shoulda/matchers/active_model/validate_length_of_matcher.rb +27 -12
- data/lib/shoulda/matchers/active_model/validate_numericality_of_matcher.rb +56 -20
- data/lib/shoulda/matchers/active_model/validate_presence_of_matcher.rb +3 -11
- data/lib/shoulda/matchers/active_model/validation_message_finder.rb +65 -0
- data/lib/shoulda/matchers/active_record/association_matcher.rb +40 -6
- data/lib/shoulda/matchers/active_record/association_matchers/join_table_matcher.rb +21 -7
- data/lib/shoulda/matchers/active_record/association_matchers/model_reflection.rb +11 -40
- data/lib/shoulda/matchers/active_record/association_matchers/model_reflector.rb +1 -1
- data/lib/shoulda/matchers/active_record/define_enum_for_matcher.rb +2 -6
- data/lib/shoulda/matchers/active_record/validate_uniqueness_of_matcher.rb +137 -22
- data/lib/shoulda/matchers/configuration.rb +20 -0
- data/lib/shoulda/matchers/doublespeak.rb +11 -1
- data/lib/shoulda/matchers/doublespeak/double.rb +29 -11
- data/lib/shoulda/matchers/doublespeak/double_collection.rb +4 -3
- data/lib/shoulda/matchers/doublespeak/method_call.rb +35 -0
- data/lib/shoulda/matchers/doublespeak/object_double.rb +7 -2
- data/lib/shoulda/matchers/doublespeak/proxy_implementation.rb +4 -3
- data/lib/shoulda/matchers/doublespeak/stub_implementation.rb +3 -3
- data/lib/shoulda/matchers/doublespeak/world.rb +21 -1
- data/lib/shoulda/matchers/integrations.rb +43 -0
- data/lib/shoulda/matchers/integrations/configuration.rb +68 -0
- data/lib/shoulda/matchers/integrations/configuration_error.rb +9 -0
- data/lib/shoulda/matchers/integrations/inclusion.rb +20 -0
- data/lib/shoulda/matchers/integrations/libraries.rb +15 -0
- data/lib/shoulda/matchers/integrations/libraries/action_controller.rb +31 -0
- data/lib/shoulda/matchers/integrations/libraries/active_model.rb +26 -0
- data/lib/shoulda/matchers/integrations/libraries/active_record.rb +26 -0
- data/lib/shoulda/matchers/integrations/libraries/missing_library.rb +19 -0
- data/lib/shoulda/matchers/integrations/libraries/rails.rb +30 -0
- data/lib/shoulda/matchers/integrations/rails.rb +12 -0
- data/lib/shoulda/matchers/integrations/registry.rb +28 -0
- data/lib/shoulda/matchers/integrations/test_frameworks.rb +16 -0
- data/lib/shoulda/matchers/integrations/test_frameworks/active_support_test_case.rb +37 -0
- data/lib/shoulda/matchers/integrations/test_frameworks/minitest_4.rb +36 -0
- data/lib/shoulda/matchers/integrations/test_frameworks/minitest_5.rb +37 -0
- data/lib/shoulda/matchers/integrations/test_frameworks/missing_test_framework.rb +40 -0
- data/lib/shoulda/matchers/integrations/test_frameworks/rspec.rb +29 -0
- data/lib/shoulda/matchers/integrations/test_frameworks/test_unit.rb +36 -0
- data/lib/shoulda/matchers/rails_shim.rb +0 -40
- data/lib/shoulda/matchers/version.rb +1 -1
- data/script/SUPPORTED_VERSIONS +1 -1
- data/script/update_gems_in_all_appraisals +14 -0
- data/shoulda-matchers.gemspec +2 -2
- data/spec/acceptance/active_model_integration_spec.rb +4 -1
- data/spec/acceptance/independent_matchers_spec.rb +6 -6
- data/spec/acceptance/multiple_libraries_integration_spec.rb +52 -0
- data/spec/acceptance/rails_integration_spec.rb +15 -5
- data/spec/acceptance_spec_helper.rb +8 -0
- data/spec/doublespeak_spec_helper.rb +14 -0
- data/spec/support/acceptance/adds_shoulda_matchers_to_project.rb +110 -0
- data/spec/support/acceptance/helpers.rb +2 -0
- data/spec/support/acceptance/helpers/base_helpers.rb +6 -1
- data/spec/support/acceptance/helpers/command_helpers.rb +6 -2
- data/spec/support/acceptance/helpers/minitest_helpers.rb +0 -8
- data/spec/support/acceptance/helpers/n_unit_helpers.rb +25 -0
- data/spec/support/acceptance/helpers/rspec_helpers.rb +2 -0
- data/spec/support/acceptance/helpers/step_helpers.rb +13 -19
- data/spec/support/acceptance/matchers/have_output.rb +1 -1
- data/spec/support/tests/bundle.rb +1 -1
- data/spec/support/tests/command_runner.rb +25 -13
- data/spec/support/tests/current_bundle.rb +47 -0
- data/spec/support/tests/database.rb +28 -0
- data/spec/support/tests/database_adapters/postgresql.rb +25 -0
- data/spec/support/tests/database_adapters/sqlite3.rb +26 -0
- data/spec/support/tests/database_configuration.rb +33 -0
- data/spec/support/tests/database_configuration_registry.rb +28 -0
- data/spec/support/tests/filesystem.rb +25 -2
- data/spec/support/unit/helpers/active_record_versions.rb +12 -0
- data/spec/support/unit/helpers/class_builder.rb +6 -2
- data/spec/support/unit/helpers/column_type_helpers.rb +26 -0
- data/spec/support/unit/helpers/controller_builder.rb +0 -28
- data/spec/support/unit/helpers/database_helpers.rb +18 -0
- data/spec/support/unit/helpers/model_builder.rb +38 -6
- data/spec/support/unit/helpers/rails_versions.rb +2 -2
- data/spec/support/unit/matchers/fail_with_message_including_matcher.rb +9 -8
- data/spec/support/unit/matchers/fail_with_message_matcher.rb +1 -1
- data/spec/support/unit/rails_application.rb +29 -13
- data/spec/support/unit/record_validating_confirmation_builder.rb +1 -2
- data/spec/support/unit/shared_examples/set_session_or_flash.rb +355 -0
- data/spec/unit/shoulda/matchers/action_controller/permit_matcher_spec.rb +433 -0
- data/spec/unit/shoulda/matchers/action_controller/render_with_layout_matcher_spec.rb +1 -5
- data/spec/unit/shoulda/matchers/action_controller/route_matcher_spec.rb +37 -0
- data/spec/unit/shoulda/matchers/action_controller/set_flash_matcher_spec.rb +23 -147
- data/spec/unit/shoulda/matchers/action_controller/set_session_matcher_spec.rb +8 -285
- data/spec/unit/shoulda/matchers/action_controller/set_session_or_flash_matcher_spec.rb +562 -0
- data/spec/unit/shoulda/matchers/active_model/allow_value_matcher_spec.rb +81 -14
- data/spec/unit/shoulda/matchers/active_model/disallow_value_matcher_spec.rb +16 -8
- data/spec/unit/shoulda/matchers/active_model/numericality_matchers/comparison_matcher_spec.rb +101 -9
- data/spec/unit/shoulda/matchers/active_model/numericality_matchers/even_number_matcher_spec.rb +39 -1
- data/spec/unit/shoulda/matchers/active_model/numericality_matchers/odd_number_matcher_spec.rb +39 -1
- data/spec/unit/shoulda/matchers/active_model/numericality_matchers/only_integer_matcher_spec.rb +39 -0
- data/spec/unit/shoulda/matchers/active_model/validate_exclusion_of_matcher_spec.rb +0 -17
- data/spec/unit/shoulda/matchers/active_model/validate_inclusion_of_matcher_spec.rb +0 -17
- data/spec/unit/shoulda/matchers/active_model/validate_length_of_matcher_spec.rb +0 -17
- data/spec/unit/shoulda/matchers/active_model/validate_numericality_of_matcher_spec.rb +838 -271
- data/spec/unit/shoulda/matchers/active_model/validate_presence_of_matcher_spec.rb +0 -19
- data/spec/unit/shoulda/matchers/active_record/association_matcher_spec.rb +93 -0
- data/spec/unit/shoulda/matchers/active_record/association_matchers/model_reflection_spec.rb +3 -3
- data/spec/unit/shoulda/matchers/active_record/define_enum_for_matcher_spec.rb +25 -0
- data/spec/unit/shoulda/matchers/active_record/validate_uniqueness_of_matcher_spec.rb +905 -0
- data/spec/unit/shoulda/matchers/doublespeak/double_collection_spec.rb +17 -11
- data/spec/unit/shoulda/matchers/doublespeak/double_implementation_registry_spec.rb +1 -1
- data/spec/unit/shoulda/matchers/doublespeak/double_spec.rb +144 -43
- data/spec/unit/shoulda/matchers/doublespeak/object_double_spec.rb +1 -1
- data/spec/unit/shoulda/matchers/doublespeak/proxy_implementation_spec.rb +36 -11
- data/spec/unit/shoulda/matchers/doublespeak/stub_implementation_spec.rb +29 -16
- data/spec/unit/shoulda/matchers/doublespeak/world_spec.rb +8 -5
- data/spec/unit/shoulda/matchers/doublespeak_spec.rb +1 -1
- data/spec/unit_spec_helper.rb +15 -14
- data/spec/warnings_spy.rb +1 -1
- metadata +68 -29
- data/docs.watchr +0 -5
- data/gemfiles/3.0.gemfile +0 -26
- data/gemfiles/3.0.gemfile.lock +0 -173
- data/gemfiles/3.1.gemfile +0 -32
- data/gemfiles/3.1.gemfile.lock +0 -212
- data/gemfiles/3.1_1.9.2.gemfile +0 -32
- data/gemfiles/3.1_1.9.2.gemfile.lock +0 -212
- data/gemfiles/3.2.gemfile +0 -33
- data/gemfiles/3.2.gemfile.lock +0 -212
- data/gemfiles/3.2_1.9.2.gemfile +0 -31
- data/gemfiles/3.2_1.9.2.gemfile.lock +0 -207
- data/lib/shoulda/matchers/assertion_error.rb +0 -27
- data/lib/shoulda/matchers/doublespeak/structs.rb +0 -10
- data/lib/shoulda/matchers/integrations/nunit_test_case_detection.rb +0 -39
- data/lib/shoulda/matchers/integrations/rspec.rb +0 -19
- data/lib/shoulda/matchers/integrations/test_unit.rb +0 -34
- data/spec/unit/shoulda/matchers/action_controller/strong_parameters_matcher_spec.rb +0 -331
- data/spec/unit/shoulda/matchers/active_model/validate_uniqueness_of_matcher_spec.rb +0 -564
@@ -0,0 +1,562 @@
|
|
1
|
+
require 'unit_spec_helper'
|
2
|
+
|
3
|
+
describe Shoulda::Matchers::ActionController::SetSessionOrFlashMatcher do
|
4
|
+
context 'without any qualifiers' do
|
5
|
+
it 'produces the right description' do
|
6
|
+
store = build_store(name: 'flash')
|
7
|
+
matcher = described_class.new(store)
|
8
|
+
expected_description = 'should set any key in flash'
|
9
|
+
|
10
|
+
expect(matcher.description).to eq expected_description
|
11
|
+
end
|
12
|
+
|
13
|
+
context 'in the positive' do
|
14
|
+
context 'if the store is not empty' do
|
15
|
+
it 'accepts' do
|
16
|
+
controller = define_class('MyController').new
|
17
|
+
store = build_store(empty?: false)
|
18
|
+
matcher = described_class.new(store)
|
19
|
+
|
20
|
+
expect(controller).to matcher
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'if the store is empty' do
|
25
|
+
it 'rejects' do
|
26
|
+
controller = define_class('MyController').new
|
27
|
+
store = build_store(empty?: true)
|
28
|
+
matcher = described_class.new(store)
|
29
|
+
|
30
|
+
expect(controller).not_to matcher
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'produces the correct failure message' do
|
34
|
+
controller = define_class('MyController').new
|
35
|
+
store = build_store(name: 'flash', empty?: true)
|
36
|
+
matcher = described_class.new(store)
|
37
|
+
expected_message = 'Expected MyController to set any key in flash, but it did not'
|
38
|
+
|
39
|
+
expect { expect(controller).to matcher }.
|
40
|
+
to fail_with_message(expected_message)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context 'in the negative' do
|
46
|
+
context 'if the given key is present in the store' do
|
47
|
+
it 'produces the correct failure message' do
|
48
|
+
controller = define_class('MyController').new
|
49
|
+
store = build_store(name: 'flash', empty?: false)
|
50
|
+
matcher = described_class.new(store)
|
51
|
+
expected_message = 'Expected MyController not to set any key in flash, but it did'
|
52
|
+
|
53
|
+
expect { expect(controller).not_to matcher }.
|
54
|
+
to fail_with_message(expected_message)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
context 'with #[]' do
|
61
|
+
it 'produces the right description' do
|
62
|
+
store = build_store(name: 'flash')
|
63
|
+
matcher = described_class.new(store)['the key']
|
64
|
+
expected_description = 'should set flash["the key"]'
|
65
|
+
|
66
|
+
expect(matcher.description).to eq expected_description
|
67
|
+
end
|
68
|
+
|
69
|
+
context 'in the positive' do
|
70
|
+
context 'if the given key is present in the store' do
|
71
|
+
it 'accepts' do
|
72
|
+
controller = define_class('MyController').new
|
73
|
+
store = build_store
|
74
|
+
allow(store).to receive(:has_key?).
|
75
|
+
with('the key').
|
76
|
+
and_return(true)
|
77
|
+
matcher = described_class.new(store)['the key']
|
78
|
+
|
79
|
+
expect(controller).to matcher
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
context 'if the given key is not present in the store' do
|
84
|
+
it 'rejects' do
|
85
|
+
controller = define_class('MyController').new
|
86
|
+
store = build_store
|
87
|
+
allow(store).to receive(:has_key?).
|
88
|
+
with('the key').
|
89
|
+
and_return(false)
|
90
|
+
matcher = described_class.new(store)['the key']
|
91
|
+
|
92
|
+
expect(controller).not_to matcher
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'produces the correct failure message' do
|
96
|
+
controller = define_class('MyController').new
|
97
|
+
store = build_store(name: 'flash')
|
98
|
+
allow(store).to receive(:has_key?).
|
99
|
+
with('the key').
|
100
|
+
and_return(false)
|
101
|
+
matcher = described_class.new(store)['the key']
|
102
|
+
expected_message = 'Expected MyController to set flash["the key"], but it did not'
|
103
|
+
|
104
|
+
expect { expect(controller).to matcher }.
|
105
|
+
to fail_with_message(expected_message)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
context 'in the negative' do
|
111
|
+
context 'if the given key is present in the store' do
|
112
|
+
it 'produces the correct failure message' do
|
113
|
+
controller = define_class('MyController').new
|
114
|
+
store = build_store(name: 'flash')
|
115
|
+
allow(store).to receive(:has_key?).
|
116
|
+
with('the key').
|
117
|
+
and_return(true)
|
118
|
+
matcher = described_class.new(store)['the key']
|
119
|
+
expected_message = 'Expected MyController not to set flash["the key"], but it did'
|
120
|
+
|
121
|
+
expect { expect(controller).not_to matcher }.
|
122
|
+
to fail_with_message(expected_message)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
context 'with #to' do
|
129
|
+
context 'given a static value' do
|
130
|
+
it 'produces the right description' do
|
131
|
+
store = build_store(name: 'flash')
|
132
|
+
matcher = described_class.new(store).to('the value')
|
133
|
+
expected_description = 'should set any key in flash to "the value"'
|
134
|
+
|
135
|
+
expect(matcher.description).to eq expected_description
|
136
|
+
end
|
137
|
+
|
138
|
+
context 'in the positive' do
|
139
|
+
context 'if the given value is present in the store' do
|
140
|
+
it 'accepts' do
|
141
|
+
controller = define_class('MyController').new
|
142
|
+
store = build_store
|
143
|
+
allow(store).to receive(:has_value?).
|
144
|
+
with('the value').
|
145
|
+
and_return(true)
|
146
|
+
matcher = described_class.new(store).to('the value')
|
147
|
+
|
148
|
+
expect(controller).to matcher
|
149
|
+
end
|
150
|
+
|
151
|
+
it 'accepts given a value of nil' do
|
152
|
+
controller = define_class('MyController').new
|
153
|
+
store = build_store
|
154
|
+
allow(store).to receive(:has_value?).
|
155
|
+
with(nil).
|
156
|
+
and_return(true)
|
157
|
+
matcher = described_class.new(store).to(nil)
|
158
|
+
|
159
|
+
expect(controller).to matcher
|
160
|
+
end
|
161
|
+
|
162
|
+
it 'accepts given a value of false' do
|
163
|
+
controller = define_class('MyController').new
|
164
|
+
store = build_store
|
165
|
+
allow(store).to receive(:has_value?).
|
166
|
+
with(false).
|
167
|
+
and_return(true)
|
168
|
+
matcher = described_class.new(store).to(false)
|
169
|
+
|
170
|
+
expect(controller).to matcher
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
context 'if the given value is not present in the store' do
|
175
|
+
it 'rejects' do
|
176
|
+
controller = define_class('MyController').new
|
177
|
+
store = build_store
|
178
|
+
allow(store).to receive(:has_value?).
|
179
|
+
with('the value').
|
180
|
+
and_return(false)
|
181
|
+
matcher = described_class.new(store).to('the value')
|
182
|
+
|
183
|
+
expect(controller).not_to matcher
|
184
|
+
end
|
185
|
+
|
186
|
+
it 'produces the correct failure message' do
|
187
|
+
controller = define_class('MyController').new
|
188
|
+
store = build_store(name: 'flash')
|
189
|
+
allow(store).to receive(:has_value?).
|
190
|
+
with('the value').
|
191
|
+
and_return(false)
|
192
|
+
matcher = described_class.new(store).to('the value')
|
193
|
+
expected_message = 'Expected MyController to set any key in flash to "the value", but it did not'
|
194
|
+
|
195
|
+
expect { expect(controller).to matcher }.
|
196
|
+
to fail_with_message(expected_message)
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
context 'in the negative' do
|
202
|
+
context 'if the given value is present in the store' do
|
203
|
+
it 'produces the correct failure message' do
|
204
|
+
controller = define_class('MyController').new
|
205
|
+
store = build_store(name: 'flash')
|
206
|
+
allow(store).to receive(:has_value?).
|
207
|
+
with('the value').
|
208
|
+
and_return(true)
|
209
|
+
matcher = described_class.new(store).to('the value')
|
210
|
+
expected_message = 'Expected MyController not to set any key in flash to "the value", but it did'
|
211
|
+
|
212
|
+
expect { expect(controller).not_to matcher }.
|
213
|
+
to fail_with_message(expected_message)
|
214
|
+
end
|
215
|
+
end
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
context 'given a regexp' do
|
220
|
+
it 'produces the right description' do
|
221
|
+
store = build_store(name: 'flash')
|
222
|
+
matcher = described_class.new(store).to(/the value/)
|
223
|
+
expected_description = 'should set any key in flash to a value matching /the value/'
|
224
|
+
|
225
|
+
expect(matcher.description).to eq expected_description
|
226
|
+
end
|
227
|
+
|
228
|
+
context 'in the positive' do
|
229
|
+
context 'if the given value is present in the store' do
|
230
|
+
it 'accepts' do
|
231
|
+
controller = define_class('MyController').new
|
232
|
+
store = build_store
|
233
|
+
allow(store).to receive(:has_value?).
|
234
|
+
with(/the value/).
|
235
|
+
and_return(true)
|
236
|
+
matcher = described_class.new(store).to(/the value/)
|
237
|
+
|
238
|
+
expect(controller).to matcher
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
242
|
+
context 'if the given value is not present in the store' do
|
243
|
+
it 'rejects' do
|
244
|
+
controller = define_class('MyController').new
|
245
|
+
store = build_store
|
246
|
+
allow(store).to receive(:has_value?).
|
247
|
+
with(/the value/).
|
248
|
+
and_return(false)
|
249
|
+
matcher = described_class.new(store).to(/the value/)
|
250
|
+
|
251
|
+
expect(controller).not_to matcher
|
252
|
+
end
|
253
|
+
|
254
|
+
it 'produces the correct failure message' do
|
255
|
+
controller = define_class('MyController').new
|
256
|
+
store = build_store(name: 'flash')
|
257
|
+
allow(store).to receive(:has_value?).
|
258
|
+
with(/the value/).
|
259
|
+
and_return(false)
|
260
|
+
matcher = described_class.new(store).to(/the value/)
|
261
|
+
expected_message = 'Expected MyController to set any key in flash to a value matching /the value/, but it did not'
|
262
|
+
|
263
|
+
expect { expect(controller).to matcher }.
|
264
|
+
to fail_with_message(expected_message)
|
265
|
+
end
|
266
|
+
end
|
267
|
+
end
|
268
|
+
|
269
|
+
context 'in the negative' do
|
270
|
+
context 'if the given value is present in the store' do
|
271
|
+
it 'produces the correct failure message' do
|
272
|
+
controller = define_class('MyController').new
|
273
|
+
store = build_store(name: 'flash')
|
274
|
+
allow(store).to receive(:has_value?).
|
275
|
+
with(/the value/).
|
276
|
+
and_return(true)
|
277
|
+
matcher = described_class.new(store).to(/the value/)
|
278
|
+
expected_message = 'Expected MyController not to set any key in flash to a value matching /the value/, but it did'
|
279
|
+
|
280
|
+
expect { expect(controller).not_to matcher }.
|
281
|
+
to fail_with_message(expected_message)
|
282
|
+
end
|
283
|
+
end
|
284
|
+
end
|
285
|
+
end
|
286
|
+
|
287
|
+
context 'given a dynamic value' do
|
288
|
+
it 'produces the right description' do
|
289
|
+
store = build_store(name: 'flash')
|
290
|
+
context = double('context', method_in_context: 'the value')
|
291
|
+
matcher = described_class.new(store).
|
292
|
+
in_context(context).
|
293
|
+
to { method_in_context }
|
294
|
+
expected_description = 'should set any key in flash to "the value"'
|
295
|
+
|
296
|
+
expect(matcher.description).to eq expected_description
|
297
|
+
end
|
298
|
+
|
299
|
+
it 'requires in_context to be specified beforehand' do
|
300
|
+
store = build_store(name: 'flash')
|
301
|
+
matcher = described_class.new(store)
|
302
|
+
expected_message = 'When specifying a value as a block, a context must be specified beforehand, e.g., flash.in_context(context).to { ... }'
|
303
|
+
|
304
|
+
expect { matcher.to { whatever } }.
|
305
|
+
to raise_error(ArgumentError, expected_message)
|
306
|
+
end
|
307
|
+
|
308
|
+
context 'in the positive' do
|
309
|
+
context 'if the value evaluated in the context is present in the store' do
|
310
|
+
it 'accepts' do
|
311
|
+
controller = define_class('MyController').new
|
312
|
+
store = build_store
|
313
|
+
allow(store).to receive(:has_value?).
|
314
|
+
with('the value').
|
315
|
+
and_return(true)
|
316
|
+
context = double('context', method_in_context: 'the value')
|
317
|
+
matcher = described_class.new(store).
|
318
|
+
in_context(context).
|
319
|
+
to { method_in_context }
|
320
|
+
|
321
|
+
expect(controller).to matcher
|
322
|
+
end
|
323
|
+
end
|
324
|
+
|
325
|
+
context 'if the value evaluated in the context is not present in the store' do
|
326
|
+
it 'rejects' do
|
327
|
+
controller = define_class('MyController').new
|
328
|
+
store = build_store
|
329
|
+
allow(store).to receive(:has_value?).
|
330
|
+
with('the value').
|
331
|
+
and_return(false)
|
332
|
+
context = double('context', method_in_context: 'the value')
|
333
|
+
matcher = described_class.new(store).
|
334
|
+
in_context(context).
|
335
|
+
to { method_in_context }
|
336
|
+
|
337
|
+
expect(controller).not_to matcher
|
338
|
+
end
|
339
|
+
|
340
|
+
it 'produces the correct failure message' do
|
341
|
+
controller = define_class('MyController').new
|
342
|
+
store = build_store(name: 'flash')
|
343
|
+
allow(store).to receive(:has_value?).
|
344
|
+
with('the value').
|
345
|
+
and_return(false)
|
346
|
+
context = double('context', method_in_context: 'the value')
|
347
|
+
matcher = described_class.new(store).
|
348
|
+
in_context(context).
|
349
|
+
to { method_in_context }
|
350
|
+
expected_message = 'Expected MyController to set any key in flash to "the value", but it did not'
|
351
|
+
|
352
|
+
expect { expect(controller).to matcher }.
|
353
|
+
to fail_with_message(expected_message)
|
354
|
+
end
|
355
|
+
end
|
356
|
+
end
|
357
|
+
|
358
|
+
context 'in the negative' do
|
359
|
+
context 'if the value evaluated in the context is present in the store' do
|
360
|
+
it 'produces the correct failure message' do
|
361
|
+
controller = define_class('MyController').new
|
362
|
+
store = build_store(name: 'flash')
|
363
|
+
allow(store).to receive(:has_value?).
|
364
|
+
with('the value').
|
365
|
+
and_return(true)
|
366
|
+
context = double('context', method_in_context: 'the value')
|
367
|
+
matcher = described_class.new(store).
|
368
|
+
in_context(context).
|
369
|
+
to { method_in_context }
|
370
|
+
expected_message = 'Expected MyController not to set any key in flash to "the value", but it did'
|
371
|
+
|
372
|
+
expect { expect(controller).not_to matcher }.
|
373
|
+
to fail_with_message(expected_message)
|
374
|
+
end
|
375
|
+
end
|
376
|
+
end
|
377
|
+
end
|
378
|
+
end
|
379
|
+
|
380
|
+
context 'with #[] + #to' do
|
381
|
+
context 'given a static value' do
|
382
|
+
it 'produces the right description' do
|
383
|
+
store = build_store(name: 'flash')
|
384
|
+
matcher = described_class.new(store)['the key'].to('the value')
|
385
|
+
expected_description = 'should set flash["the key"] to "the value"'
|
386
|
+
|
387
|
+
expect(matcher.description).to eq expected_description
|
388
|
+
end
|
389
|
+
|
390
|
+
context 'in the positive' do
|
391
|
+
context 'if the given value is present in the store' do
|
392
|
+
it 'accepts' do
|
393
|
+
controller = define_class('MyController').new
|
394
|
+
store = build_store
|
395
|
+
allow(store).to receive(:has_key?).
|
396
|
+
with('the key').
|
397
|
+
and_return(true)
|
398
|
+
allow(store).to receive(:has_value?).
|
399
|
+
with('the value').
|
400
|
+
and_return(true)
|
401
|
+
matcher = described_class.new(store)['the key'].to('the value')
|
402
|
+
|
403
|
+
expect(controller).to matcher
|
404
|
+
end
|
405
|
+
end
|
406
|
+
|
407
|
+
context 'if the given value is not present in the store' do
|
408
|
+
it 'rejects' do
|
409
|
+
controller = define_class('MyController').new
|
410
|
+
store = build_store
|
411
|
+
allow(store).to receive(:has_key?).
|
412
|
+
with('the key').
|
413
|
+
and_return(true)
|
414
|
+
allow(store).to receive(:has_value?).
|
415
|
+
with('the value').
|
416
|
+
and_return(false)
|
417
|
+
matcher = described_class.new(store)['the key'].to('the value')
|
418
|
+
|
419
|
+
expect(controller).not_to matcher
|
420
|
+
end
|
421
|
+
|
422
|
+
it 'produces the correct failure message' do
|
423
|
+
controller = define_class('MyController').new
|
424
|
+
store = build_store(name: 'flash')
|
425
|
+
allow(store).to receive(:has_key?).
|
426
|
+
with('the key').
|
427
|
+
and_return(true)
|
428
|
+
allow(store).to receive(:has_value?).
|
429
|
+
with('the value').
|
430
|
+
and_return(false)
|
431
|
+
matcher = described_class.new(store)['the key'].to('the value')
|
432
|
+
expected_message = 'Expected MyController to set flash["the key"] to "the value", but it did not'
|
433
|
+
|
434
|
+
expect { expect(controller).to matcher }.
|
435
|
+
to fail_with_message(expected_message)
|
436
|
+
end
|
437
|
+
end
|
438
|
+
end
|
439
|
+
|
440
|
+
context 'in the negative' do
|
441
|
+
context 'if the given value is present in the store' do
|
442
|
+
it 'produces the correct failure message' do
|
443
|
+
controller = define_class('MyController').new
|
444
|
+
store = build_store(name: 'flash')
|
445
|
+
allow(store).to receive(:has_key?).
|
446
|
+
with('the key').
|
447
|
+
and_return(true)
|
448
|
+
allow(store).to receive(:has_value?).
|
449
|
+
with('the value').
|
450
|
+
and_return(true)
|
451
|
+
matcher = described_class.new(store)['the key'].to('the value')
|
452
|
+
expected_message = 'Expected MyController not to set flash["the key"] to "the value", but it did'
|
453
|
+
|
454
|
+
expect { expect(controller).not_to matcher }.
|
455
|
+
to fail_with_message(expected_message)
|
456
|
+
end
|
457
|
+
end
|
458
|
+
end
|
459
|
+
end
|
460
|
+
|
461
|
+
context 'given a dynamic value' do
|
462
|
+
it 'produces the right description' do
|
463
|
+
store = build_store(name: 'flash')
|
464
|
+
context = double('context', method_in_context: 'the value')
|
465
|
+
matcher = described_class.new(store)['the key'].
|
466
|
+
in_context(context).
|
467
|
+
to { method_in_context }
|
468
|
+
expected_description = 'should set flash["the key"] to "the value"'
|
469
|
+
|
470
|
+
expect(matcher.description).to eq expected_description
|
471
|
+
end
|
472
|
+
|
473
|
+
context 'in the positive' do
|
474
|
+
context 'if the value evaluated in the context is present in the store' do
|
475
|
+
it 'accepts' do
|
476
|
+
controller = define_class('MyController').new
|
477
|
+
store = build_store
|
478
|
+
allow(store).to receive(:has_key?).
|
479
|
+
with('the key').
|
480
|
+
and_return(true)
|
481
|
+
allow(store).to receive(:has_value?).
|
482
|
+
with('the value').
|
483
|
+
and_return(true)
|
484
|
+
context = double('context', method_in_context: 'the value')
|
485
|
+
matcher = described_class.new(store)['the key'].
|
486
|
+
in_context(context).
|
487
|
+
to { method_in_context }
|
488
|
+
|
489
|
+
expect(controller).to matcher
|
490
|
+
end
|
491
|
+
end
|
492
|
+
|
493
|
+
context 'if the value evaluated in the context is not present in the store' do
|
494
|
+
it 'rejects' do
|
495
|
+
controller = define_class('MyController').new
|
496
|
+
store = build_store
|
497
|
+
allow(store).to receive(:has_key?).
|
498
|
+
with('the key').
|
499
|
+
and_return(false)
|
500
|
+
context = double('context', method_in_context: 'the value')
|
501
|
+
matcher = described_class.new(store)['the key'].
|
502
|
+
in_context(context).
|
503
|
+
to { method_in_context }
|
504
|
+
|
505
|
+
expect(controller).not_to matcher
|
506
|
+
end
|
507
|
+
|
508
|
+
it 'produces the correct failure message' do
|
509
|
+
controller = define_class('MyController').new
|
510
|
+
store = build_store(name: 'flash')
|
511
|
+
allow(store).to receive(:has_key?).
|
512
|
+
with('the key').
|
513
|
+
and_return(false)
|
514
|
+
context = double('context', method_in_context: 'the value')
|
515
|
+
matcher = described_class.new(store)['the key'].
|
516
|
+
in_context(context).
|
517
|
+
to { method_in_context }
|
518
|
+
expected_message = 'Expected MyController to set flash["the key"] to "the value", but it did not'
|
519
|
+
|
520
|
+
expect { expect(controller).to matcher }.
|
521
|
+
to fail_with_message(expected_message)
|
522
|
+
end
|
523
|
+
end
|
524
|
+
end
|
525
|
+
|
526
|
+
context 'in the negative' do
|
527
|
+
context 'if the value evaluated in the context is present in the store' do
|
528
|
+
it 'produces the correct failure message' do
|
529
|
+
controller = define_class('MyController').new
|
530
|
+
store = build_store(name: 'flash')
|
531
|
+
allow(store).to receive(:has_key?).
|
532
|
+
with('the key').
|
533
|
+
and_return(true)
|
534
|
+
allow(store).to receive(:has_value?).
|
535
|
+
with('the value').
|
536
|
+
and_return(true)
|
537
|
+
context = double('context', method_in_context: 'the value')
|
538
|
+
matcher = described_class.new(store)['the key'].
|
539
|
+
in_context(context).
|
540
|
+
to { method_in_context }
|
541
|
+
expected_message = 'Expected MyController not to set flash["the key"] to "the value", but it did'
|
542
|
+
|
543
|
+
expect { expect(controller).not_to matcher }.
|
544
|
+
to fail_with_message(expected_message)
|
545
|
+
end
|
546
|
+
end
|
547
|
+
end
|
548
|
+
end
|
549
|
+
end
|
550
|
+
|
551
|
+
def build_store(overrides = {})
|
552
|
+
defaults = {
|
553
|
+
:name => 'store',
|
554
|
+
:controller= => nil,
|
555
|
+
:has_key? => nil,
|
556
|
+
:has_value? => nil,
|
557
|
+
:empty? => nil,
|
558
|
+
}
|
559
|
+
methods = defaults.merge(overrides)
|
560
|
+
double('store', methods)
|
561
|
+
end
|
562
|
+
end
|