shoulda-matchers 4.0.0.rc1 → 4.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (209) hide show
  1. checksums.yaml +4 -4
  2. data/MIT-LICENSE +1 -1
  3. data/README.md +72 -40
  4. data/lib/shoulda/matchers/action_controller.rb +2 -0
  5. data/lib/shoulda/matchers/active_model.rb +2 -3
  6. data/lib/shoulda/matchers/active_model/validate_inclusion_of_matcher.rb +1 -0
  7. data/lib/shoulda/matchers/active_record.rb +2 -0
  8. data/lib/shoulda/matchers/active_record/association_matcher.rb +34 -0
  9. data/lib/shoulda/matchers/active_record/association_matchers/optional_matcher.rb +27 -4
  10. data/lib/shoulda/matchers/active_record/association_matchers/required_matcher.rb +27 -4
  11. data/lib/shoulda/matchers/active_record/validate_uniqueness_of_matcher.rb +1 -1
  12. data/lib/shoulda/matchers/independent.rb +2 -1
  13. data/lib/shoulda/matchers/rails_shim.rb +5 -9
  14. data/lib/shoulda/matchers/version.rb +1 -1
  15. data/lib/shoulda/matchers/warn.rb +1 -0
  16. data/shoulda-matchers.gemspec +11 -3
  17. metadata +13 -340
  18. data/.gitignore +0 -12
  19. data/.hound.yml +0 -3
  20. data/.hound/ruby.yml +0 -1062
  21. data/.python-version +0 -1
  22. data/.rubocop.yml +0 -15
  23. data/.travis.yml +0 -21
  24. data/.yardopts +0 -10
  25. data/Appraisals +0 -105
  26. data/CONTRIBUTING.md +0 -172
  27. data/Gemfile +0 -15
  28. data/Gemfile.lock +0 -59
  29. data/MAINTAINING.md +0 -250
  30. data/NEWS.md +0 -1235
  31. data/Rakefile +0 -46
  32. data/bin/setup +0 -190
  33. data/custom_plan.rb +0 -104
  34. data/doc_config/gh-pages/index.html.erb +0 -9
  35. data/doc_config/yard/setup.rb +0 -22
  36. data/doc_config/yard/templates/default/fulldoc/html/css/bootstrap.css +0 -5967
  37. data/doc_config/yard/templates/default/fulldoc/html/css/full_list.css +0 -12
  38. data/doc_config/yard/templates/default/fulldoc/html/css/global.css +0 -66
  39. data/doc_config/yard/templates/default/fulldoc/html/css/solarized.css +0 -69
  40. data/doc_config/yard/templates/default/fulldoc/html/css/style.css +0 -312
  41. data/doc_config/yard/templates/default/fulldoc/html/full_list.erb +0 -26
  42. data/doc_config/yard/templates/default/fulldoc/html/full_list_class.erb +0 -1
  43. data/doc_config/yard/templates/default/fulldoc/html/full_list_method.erb +0 -8
  44. data/doc_config/yard/templates/default/fulldoc/html/js/app.js +0 -281
  45. data/doc_config/yard/templates/default/fulldoc/html/js/full_list.js +0 -1
  46. data/doc_config/yard/templates/default/fulldoc/html/js/jquery.stickyheaders.js +0 -289
  47. data/doc_config/yard/templates/default/fulldoc/html/js/underscore.min.js +0 -6
  48. data/doc_config/yard/templates/default/fulldoc/html/setup.rb +0 -35
  49. data/doc_config/yard/templates/default/layout/html/breadcrumb.erb +0 -14
  50. data/doc_config/yard/templates/default/layout/html/fonts.erb +0 -1
  51. data/doc_config/yard/templates/default/layout/html/footer.erb +0 -6
  52. data/doc_config/yard/templates/default/layout/html/layout.erb +0 -23
  53. data/doc_config/yard/templates/default/layout/html/search.erb +0 -13
  54. data/doc_config/yard/templates/default/layout/html/setup.rb +0 -40
  55. data/doc_config/yard/templates/default/method_details/html/source.erb +0 -10
  56. data/doc_config/yard/templates/default/module/html/box_info.erb +0 -31
  57. data/gemfiles/4.2.gemfile +0 -39
  58. data/gemfiles/4.2.gemfile.lock +0 -246
  59. data/gemfiles/5.0.gemfile +0 -37
  60. data/gemfiles/5.0.gemfile.lock +0 -238
  61. data/gemfiles/5.1.gemfile +0 -38
  62. data/gemfiles/5.1.gemfile.lock +0 -254
  63. data/gemfiles/5.2.gemfile +0 -40
  64. data/gemfiles/5.2.gemfile.lock +0 -273
  65. data/script/install_gems_in_all_appraisals +0 -16
  66. data/script/run_all_tests +0 -16
  67. data/script/supported_ruby_versions +0 -7
  68. data/script/update_gem_in_all_appraisals +0 -17
  69. data/script/update_gems_in_all_appraisals +0 -16
  70. data/spec/acceptance/active_model_integration_spec.rb +0 -23
  71. data/spec/acceptance/independent_matchers_spec.rb +0 -125
  72. data/spec/acceptance/multiple_libraries_integration_spec.rb +0 -55
  73. data/spec/acceptance/rails_integration_spec.rb +0 -156
  74. data/spec/acceptance_spec_helper.rb +0 -23
  75. data/spec/doublespeak_spec_helper.rb +0 -2
  76. data/spec/report_warnings.rb +0 -7
  77. data/spec/spec_helper.rb +0 -20
  78. data/spec/support/acceptance/adds_shoulda_matchers_to_project.rb +0 -133
  79. data/spec/support/acceptance/helpers.rb +0 -33
  80. data/spec/support/acceptance/helpers/active_model_helpers.rb +0 -11
  81. data/spec/support/acceptance/helpers/array_helpers.rb +0 -13
  82. data/spec/support/acceptance/helpers/base_helpers.rb +0 -19
  83. data/spec/support/acceptance/helpers/command_helpers.rb +0 -68
  84. data/spec/support/acceptance/helpers/file_helpers.rb +0 -19
  85. data/spec/support/acceptance/helpers/gem_helpers.rb +0 -31
  86. data/spec/support/acceptance/helpers/minitest_helpers.rb +0 -11
  87. data/spec/support/acceptance/helpers/n_unit_helpers.rb +0 -25
  88. data/spec/support/acceptance/helpers/pluralization_helpers.rb +0 -13
  89. data/spec/support/acceptance/helpers/rails_migration_helpers.rb +0 -21
  90. data/spec/support/acceptance/helpers/rails_version_helpers.rb +0 -11
  91. data/spec/support/acceptance/helpers/rspec_helpers.rb +0 -24
  92. data/spec/support/acceptance/helpers/ruby_version_helpers.rb +0 -9
  93. data/spec/support/acceptance/helpers/step_helpers.rb +0 -127
  94. data/spec/support/acceptance/matchers/have_output.rb +0 -31
  95. data/spec/support/acceptance/matchers/indicate_number_of_tests_was_run_matcher.rb +0 -55
  96. data/spec/support/acceptance/matchers/indicate_that_tests_were_run_matcher.rb +0 -103
  97. data/spec/support/tests/bundle.rb +0 -94
  98. data/spec/support/tests/command_runner.rb +0 -230
  99. data/spec/support/tests/current_bundle.rb +0 -55
  100. data/spec/support/tests/database.rb +0 -28
  101. data/spec/support/tests/database_adapters/postgresql.rb +0 -25
  102. data/spec/support/tests/database_adapters/sqlite3.rb +0 -26
  103. data/spec/support/tests/database_configuration.rb +0 -33
  104. data/spec/support/tests/database_configuration_registry.rb +0 -28
  105. data/spec/support/tests/filesystem.rb +0 -100
  106. data/spec/support/tests/version.rb +0 -45
  107. data/spec/support/unit/active_record/create_table.rb +0 -54
  108. data/spec/support/unit/attribute.rb +0 -45
  109. data/spec/support/unit/capture.rb +0 -46
  110. data/spec/support/unit/change_value.rb +0 -111
  111. data/spec/support/unit/create_model_arguments/basic.rb +0 -135
  112. data/spec/support/unit/create_model_arguments/has_many.rb +0 -15
  113. data/spec/support/unit/create_model_arguments/uniqueness_matcher.rb +0 -74
  114. data/spec/support/unit/helpers/action_pack_versions.rb +0 -22
  115. data/spec/support/unit/helpers/active_model_helpers.rb +0 -27
  116. data/spec/support/unit/helpers/active_model_versions.rb +0 -32
  117. data/spec/support/unit/helpers/active_record_versions.rb +0 -44
  118. data/spec/support/unit/helpers/active_resource_builder.rb +0 -27
  119. data/spec/support/unit/helpers/allow_value_matcher_helpers.rb +0 -15
  120. data/spec/support/unit/helpers/class_builder.rb +0 -90
  121. data/spec/support/unit/helpers/column_type_helpers.rb +0 -26
  122. data/spec/support/unit/helpers/confirmation_matcher_helpers.rb +0 -17
  123. data/spec/support/unit/helpers/controller_builder.rb +0 -63
  124. data/spec/support/unit/helpers/database_helpers.rb +0 -20
  125. data/spec/support/unit/helpers/i18n_faker.rb +0 -15
  126. data/spec/support/unit/helpers/mailer_builder.rb +0 -12
  127. data/spec/support/unit/helpers/message_helpers.rb +0 -19
  128. data/spec/support/unit/helpers/model_builder.rb +0 -114
  129. data/spec/support/unit/helpers/rails_versions.rb +0 -42
  130. data/spec/support/unit/helpers/validation_matcher_scenario_helpers.rb +0 -44
  131. data/spec/support/unit/i18n.rb +0 -7
  132. data/spec/support/unit/load_environment.rb +0 -12
  133. data/spec/support/unit/matchers/deprecate.rb +0 -60
  134. data/spec/support/unit/matchers/fail_with_message_including_matcher.rb +0 -51
  135. data/spec/support/unit/matchers/fail_with_message_matcher.rb +0 -64
  136. data/spec/support/unit/matchers/print_warning_including.rb +0 -67
  137. data/spec/support/unit/model_creation_strategies/active_model.rb +0 -111
  138. data/spec/support/unit/model_creation_strategies/active_record.rb +0 -77
  139. data/spec/support/unit/model_creators.rb +0 -19
  140. data/spec/support/unit/model_creators/active_model.rb +0 -39
  141. data/spec/support/unit/model_creators/active_record.rb +0 -42
  142. data/spec/support/unit/model_creators/active_record/has_and_belongs_to_many.rb +0 -95
  143. data/spec/support/unit/model_creators/active_record/has_many.rb +0 -67
  144. data/spec/support/unit/model_creators/active_record/uniqueness_matcher.rb +0 -42
  145. data/spec/support/unit/model_creators/basic.rb +0 -102
  146. data/spec/support/unit/rails_application.rb +0 -151
  147. data/spec/support/unit/record_builder_with_i18n_validation_message.rb +0 -69
  148. data/spec/support/unit/record_validating_confirmation_builder.rb +0 -54
  149. data/spec/support/unit/record_with_different_error_attribute_builder.rb +0 -92
  150. data/spec/support/unit/shared_examples/ignoring_interference_by_writer.rb +0 -79
  151. data/spec/support/unit/shared_examples/numerical_submatcher.rb +0 -17
  152. data/spec/support/unit/shared_examples/set_session_or_flash.rb +0 -360
  153. data/spec/support/unit/validation_matcher_scenario.rb +0 -60
  154. data/spec/unit/shoulda/matchers/action_controller/callback_matcher_spec.rb +0 -82
  155. data/spec/unit/shoulda/matchers/action_controller/filter_param_matcher_spec.rb +0 -28
  156. data/spec/unit/shoulda/matchers/action_controller/permit_matcher_spec.rb +0 -629
  157. data/spec/unit/shoulda/matchers/action_controller/redirect_to_matcher_spec.rb +0 -42
  158. data/spec/unit/shoulda/matchers/action_controller/render_template_matcher_spec.rb +0 -76
  159. data/spec/unit/shoulda/matchers/action_controller/render_with_layout_matcher_spec.rb +0 -62
  160. data/spec/unit/shoulda/matchers/action_controller/rescue_from_matcher_spec.rb +0 -90
  161. data/spec/unit/shoulda/matchers/action_controller/respond_with_matcher_spec.rb +0 -31
  162. data/spec/unit/shoulda/matchers/action_controller/route_matcher_spec.rb +0 -330
  163. data/spec/unit/shoulda/matchers/action_controller/route_params_spec.rb +0 -30
  164. data/spec/unit/shoulda/matchers/action_controller/set_flash_matcher_spec.rb +0 -67
  165. data/spec/unit/shoulda/matchers/action_controller/set_session_matcher_spec.rb +0 -17
  166. data/spec/unit/shoulda/matchers/action_controller/set_session_or_flash_matcher_spec.rb +0 -562
  167. data/spec/unit/shoulda/matchers/active_model/allow_mass_assignment_of_matcher_spec.rb +0 -117
  168. data/spec/unit/shoulda/matchers/active_model/allow_value_matcher_spec.rb +0 -829
  169. data/spec/unit/shoulda/matchers/active_model/disallow_value_matcher_spec.rb +0 -86
  170. data/spec/unit/shoulda/matchers/active_model/have_secure_password_matcher_spec.rb +0 -20
  171. data/spec/unit/shoulda/matchers/active_model/helpers_spec.rb +0 -162
  172. data/spec/unit/shoulda/matchers/active_model/validate_absence_of_matcher_spec.rb +0 -290
  173. data/spec/unit/shoulda/matchers/active_model/validate_acceptance_of_matcher_spec.rb +0 -109
  174. data/spec/unit/shoulda/matchers/active_model/validate_confirmation_of_matcher_spec.rb +0 -172
  175. data/spec/unit/shoulda/matchers/active_model/validate_exclusion_of_matcher_spec.rb +0 -264
  176. data/spec/unit/shoulda/matchers/active_model/validate_inclusion_of_matcher_spec.rb +0 -1049
  177. data/spec/unit/shoulda/matchers/active_model/validate_length_of_matcher_spec.rb +0 -335
  178. data/spec/unit/shoulda/matchers/active_model/validate_numericality_of_matcher_spec.rb +0 -1865
  179. data/spec/unit/shoulda/matchers/active_model/validate_presence_of_matcher_spec.rb +0 -406
  180. data/spec/unit/shoulda/matchers/active_record/accept_nested_attributes_for_matcher_spec.rb +0 -107
  181. data/spec/unit/shoulda/matchers/active_record/association_matcher_spec.rb +0 -1672
  182. data/spec/unit/shoulda/matchers/active_record/association_matchers/model_reflection_spec.rb +0 -251
  183. data/spec/unit/shoulda/matchers/active_record/define_enum_for_matcher_spec.rb +0 -690
  184. data/spec/unit/shoulda/matchers/active_record/have_db_column_matcher_spec.rb +0 -111
  185. data/spec/unit/shoulda/matchers/active_record/have_db_index_matcher_spec.rb +0 -85
  186. data/spec/unit/shoulda/matchers/active_record/have_readonly_attributes_matcher_spec.rb +0 -41
  187. data/spec/unit/shoulda/matchers/active_record/have_secure_token_matcher_spec.rb +0 -169
  188. data/spec/unit/shoulda/matchers/active_record/serialize_matcher_spec.rb +0 -86
  189. data/spec/unit/shoulda/matchers/active_record/validate_uniqueness_of_matcher_spec.rb +0 -1682
  190. data/spec/unit/shoulda/matchers/doublespeak/double_collection_spec.rb +0 -190
  191. data/spec/unit/shoulda/matchers/doublespeak/double_implementation_registry_spec.rb +0 -21
  192. data/spec/unit/shoulda/matchers/doublespeak/double_spec.rb +0 -271
  193. data/spec/unit/shoulda/matchers/doublespeak/object_double_spec.rb +0 -77
  194. data/spec/unit/shoulda/matchers/doublespeak/proxy_implementation_spec.rb +0 -72
  195. data/spec/unit/shoulda/matchers/doublespeak/stub_implementation_spec.rb +0 -101
  196. data/spec/unit/shoulda/matchers/doublespeak/world_spec.rb +0 -78
  197. data/spec/unit/shoulda/matchers/doublespeak_spec.rb +0 -27
  198. data/spec/unit/shoulda/matchers/independent/delegate_method_matcher/stubbed_target_spec.rb +0 -43
  199. data/spec/unit/shoulda/matchers/independent/delegate_method_matcher_spec.rb +0 -650
  200. data/spec/unit/shoulda/matchers/routing/route_matcher_spec.rb +0 -406
  201. data/spec/unit/shoulda/matchers/util/word_wrap_spec.rb +0 -252
  202. data/spec/unit_spec_helper.rb +0 -54
  203. data/spec/warnings_spy.rb +0 -64
  204. data/spec/warnings_spy/filesystem.rb +0 -45
  205. data/spec/warnings_spy/partitioner.rb +0 -36
  206. data/spec/warnings_spy/reader.rb +0 -53
  207. data/spec/warnings_spy/reporter.rb +0 -88
  208. data/tasks/documentation.rb +0 -199
  209. data/zeus.json +0 -11
@@ -1,30 +0,0 @@
1
- require 'unit_spec_helper'
2
-
3
- describe Shoulda::Matchers::ActionController::RouteParams, type: :controller do
4
- describe "#normalize" do
5
- context "when the route parameters is a hash" do
6
- it "stringifies the values in the hash" do
7
- expect(build_route_params(controller: :examples, action: 'example', id: '1').normalize).
8
- to eq({ controller: "examples", action: "example", id: "1" })
9
- end
10
- end
11
-
12
- context "when the route parameters is a string and a hash" do
13
- it "produces a hash of route parameters" do
14
- expect(build_route_params("examples#example", id: '1').normalize).
15
- to eq({ controller: "examples", action: "example", id: "1" })
16
- end
17
- end
18
-
19
- context "when the route params is a string" do
20
- it "produces a hash of route params" do
21
- expect(build_route_params("examples#index").normalize).
22
- to eq({ controller: "examples", action: "index"})
23
- end
24
- end
25
- end
26
-
27
- def build_route_params(*params)
28
- Shoulda::Matchers::ActionController::RouteParams.new(params)
29
- end
30
- end
@@ -1,67 +0,0 @@
1
- require 'unit_spec_helper'
2
-
3
- describe Shoulda::Matchers::ActionController::SetFlashMatcher, type: :controller do
4
- it_behaves_like 'set session or flash matcher' do
5
- def store_name
6
- 'flash'
7
- end
8
-
9
- def set_store
10
- set_flash
11
- end
12
-
13
- def store_within(controller)
14
- controller.flash
15
- end
16
- end
17
-
18
- it_behaves_like 'set session or flash matcher' do
19
- def store_name
20
- 'flash.now'
21
- end
22
-
23
- def set_store
24
- set_flash.now
25
- end
26
-
27
- def store_within(controller)
28
- controller.flash.now
29
- end
30
- end
31
-
32
- context 'when the controller sets both flash and flash.now' do
33
- it 'does not mix flash and flash.now' do
34
- controller = build_fake_response do
35
- flash['key for flash'] = 'value for flash'
36
- flash.now['key for flash.now'] = 'value for flash.now'
37
- end
38
-
39
- expect(controller).not_to set_flash['key for flash.now']
40
- expect(controller).not_to set_flash.now['key for flash']
41
- end
42
- end
43
-
44
- context 'when the now qualifier is called after the key is set' do
45
- it 'raises a QualifierOrderError' do
46
- controller = build_fake_response
47
-
48
- usage = lambda do
49
- expect(controller).to set_flash['any key'].now
50
- end
51
-
52
- expect(&usage).to raise_error(described_class::QualifierOrderError)
53
- end
54
- end
55
-
56
- context 'when the now qualifier is called after the to qualifier' do
57
- it 'raises a QualifierOrderError' do
58
- controller = build_fake_response
59
-
60
- usage = lambda do
61
- expect(controller).to set_flash.to('any value').now
62
- end
63
-
64
- expect(&usage).to raise_error(described_class::QualifierOrderError)
65
- end
66
- end
67
- end
@@ -1,17 +0,0 @@
1
- require 'unit_spec_helper'
2
-
3
- describe Shoulda::Matchers::ActionController::SetSessionMatcher, type: :controller do
4
- it_behaves_like 'set session or flash matcher' do
5
- def store_name
6
- 'session'
7
- end
8
-
9
- def set_store
10
- set_session
11
- end
12
-
13
- def store_within(controller)
14
- controller.session
15
- end
16
- end
17
- end
@@ -1,562 +0,0 @@
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