mcmire-shoulda-matchers 2.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 (164) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/.travis.yml +32 -0
  4. data/.yardopts +7 -0
  5. data/Appraisals +45 -0
  6. data/CONTRIBUTING.md +41 -0
  7. data/Gemfile +31 -0
  8. data/Gemfile.lock +166 -0
  9. data/MIT-LICENSE +22 -0
  10. data/NEWS.md +299 -0
  11. data/README.md +163 -0
  12. data/Rakefile +116 -0
  13. data/doc_config/gh-pages/index.html.erb +9 -0
  14. data/doc_config/yard/setup.rb +22 -0
  15. data/doc_config/yard/templates/default/fulldoc/html/css/bootstrap.css +5967 -0
  16. data/doc_config/yard/templates/default/fulldoc/html/css/full_list.css +12 -0
  17. data/doc_config/yard/templates/default/fulldoc/html/css/global.css +45 -0
  18. data/doc_config/yard/templates/default/fulldoc/html/css/solarized.css +69 -0
  19. data/doc_config/yard/templates/default/fulldoc/html/css/style.css +283 -0
  20. data/doc_config/yard/templates/default/fulldoc/html/full_list.erb +32 -0
  21. data/doc_config/yard/templates/default/fulldoc/html/full_list_class.erb +1 -0
  22. data/doc_config/yard/templates/default/fulldoc/html/full_list_method.erb +8 -0
  23. data/doc_config/yard/templates/default/fulldoc/html/js/app.js +300 -0
  24. data/doc_config/yard/templates/default/fulldoc/html/js/full_list.js +1 -0
  25. data/doc_config/yard/templates/default/fulldoc/html/js/jquery.stickyheaders.js +289 -0
  26. data/doc_config/yard/templates/default/fulldoc/html/js/underscore.min.js +6 -0
  27. data/doc_config/yard/templates/default/fulldoc/html/setup.rb +8 -0
  28. data/doc_config/yard/templates/default/layout/html/breadcrumb.erb +14 -0
  29. data/doc_config/yard/templates/default/layout/html/fonts.erb +1 -0
  30. data/doc_config/yard/templates/default/layout/html/layout.erb +23 -0
  31. data/doc_config/yard/templates/default/layout/html/search.erb +13 -0
  32. data/doc_config/yard/templates/default/layout/html/setup.rb +8 -0
  33. data/doc_config/yard/templates/default/method_details/html/source.erb +10 -0
  34. data/doc_config/yard/templates/default/module/html/box_info.erb +31 -0
  35. data/features/rails_integration.feature +113 -0
  36. data/features/step_definitions/rails_steps.rb +162 -0
  37. data/features/support/env.rb +5 -0
  38. data/gemfiles/3.0.gemfile +24 -0
  39. data/gemfiles/3.0.gemfile.lock +150 -0
  40. data/gemfiles/3.1.gemfile +27 -0
  41. data/gemfiles/3.1.gemfile.lock +173 -0
  42. data/gemfiles/3.2.gemfile +27 -0
  43. data/gemfiles/3.2.gemfile.lock +171 -0
  44. data/gemfiles/4.0.0.gemfile +28 -0
  45. data/gemfiles/4.0.0.gemfile.lock +172 -0
  46. data/gemfiles/4.0.1.gemfile +28 -0
  47. data/gemfiles/4.0.1.gemfile.lock +172 -0
  48. data/lib/shoulda-matchers.rb +1 -0
  49. data/lib/shoulda/matchers.rb +11 -0
  50. data/lib/shoulda/matchers/action_controller.rb +17 -0
  51. data/lib/shoulda/matchers/action_controller/filter_param_matcher.rb +64 -0
  52. data/lib/shoulda/matchers/action_controller/redirect_to_matcher.rb +97 -0
  53. data/lib/shoulda/matchers/action_controller/render_template_matcher.rb +81 -0
  54. data/lib/shoulda/matchers/action_controller/render_with_layout_matcher.rb +117 -0
  55. data/lib/shoulda/matchers/action_controller/rescue_from_matcher.rb +114 -0
  56. data/lib/shoulda/matchers/action_controller/respond_with_matcher.rb +154 -0
  57. data/lib/shoulda/matchers/action_controller/route_matcher.rb +116 -0
  58. data/lib/shoulda/matchers/action_controller/route_params.rb +48 -0
  59. data/lib/shoulda/matchers/action_controller/set_session_matcher.rb +164 -0
  60. data/lib/shoulda/matchers/action_controller/set_the_flash_matcher.rb +296 -0
  61. data/lib/shoulda/matchers/active_model.rb +30 -0
  62. data/lib/shoulda/matchers/active_model/allow_mass_assignment_of_matcher.rb +167 -0
  63. data/lib/shoulda/matchers/active_model/allow_value_matcher.rb +314 -0
  64. data/lib/shoulda/matchers/active_model/disallow_value_matcher.rb +46 -0
  65. data/lib/shoulda/matchers/active_model/ensure_exclusion_of_matcher.rb +160 -0
  66. data/lib/shoulda/matchers/active_model/ensure_inclusion_of_matcher.rb +417 -0
  67. data/lib/shoulda/matchers/active_model/ensure_length_of_matcher.rb +337 -0
  68. data/lib/shoulda/matchers/active_model/errors.rb +10 -0
  69. data/lib/shoulda/matchers/active_model/exception_message_finder.rb +58 -0
  70. data/lib/shoulda/matchers/active_model/have_secure_password_matcher.rb +92 -0
  71. data/lib/shoulda/matchers/active_model/helpers.rb +46 -0
  72. data/lib/shoulda/matchers/active_model/numericality_matchers.rb +9 -0
  73. data/lib/shoulda/matchers/active_model/numericality_matchers/comparison_matcher.rb +75 -0
  74. data/lib/shoulda/matchers/active_model/numericality_matchers/even_number_matcher.rb +27 -0
  75. data/lib/shoulda/matchers/active_model/numericality_matchers/numeric_type_matcher.rb +41 -0
  76. data/lib/shoulda/matchers/active_model/numericality_matchers/odd_number_matcher.rb +27 -0
  77. data/lib/shoulda/matchers/active_model/numericality_matchers/only_integer_matcher.rb +26 -0
  78. data/lib/shoulda/matchers/active_model/validate_absence_of_matcher.rb +112 -0
  79. data/lib/shoulda/matchers/active_model/validate_acceptance_of_matcher.rb +77 -0
  80. data/lib/shoulda/matchers/active_model/validate_confirmation_of_matcher.rb +121 -0
  81. data/lib/shoulda/matchers/active_model/validate_numericality_of_matcher.rb +380 -0
  82. data/lib/shoulda/matchers/active_model/validate_presence_of_matcher.rb +89 -0
  83. data/lib/shoulda/matchers/active_model/validate_uniqueness_of_matcher.rb +372 -0
  84. data/lib/shoulda/matchers/active_model/validation_matcher.rb +97 -0
  85. data/lib/shoulda/matchers/active_model/validation_message_finder.rb +69 -0
  86. data/lib/shoulda/matchers/active_record.rb +22 -0
  87. data/lib/shoulda/matchers/active_record/accept_nested_attributes_for_matcher.rb +204 -0
  88. data/lib/shoulda/matchers/active_record/association_matcher.rb +901 -0
  89. data/lib/shoulda/matchers/active_record/association_matchers.rb +9 -0
  90. data/lib/shoulda/matchers/active_record/association_matchers/counter_cache_matcher.rb +41 -0
  91. data/lib/shoulda/matchers/active_record/association_matchers/dependent_matcher.rb +41 -0
  92. data/lib/shoulda/matchers/active_record/association_matchers/model_reflection.rb +81 -0
  93. data/lib/shoulda/matchers/active_record/association_matchers/model_reflector.rb +65 -0
  94. data/lib/shoulda/matchers/active_record/association_matchers/option_verifier.rb +94 -0
  95. data/lib/shoulda/matchers/active_record/association_matchers/order_matcher.rb +41 -0
  96. data/lib/shoulda/matchers/active_record/association_matchers/source_matcher.rb +41 -0
  97. data/lib/shoulda/matchers/active_record/association_matchers/through_matcher.rb +63 -0
  98. data/lib/shoulda/matchers/active_record/have_db_column_matcher.rb +261 -0
  99. data/lib/shoulda/matchers/active_record/have_db_index_matcher.rb +149 -0
  100. data/lib/shoulda/matchers/active_record/have_readonly_attribute_matcher.rb +72 -0
  101. data/lib/shoulda/matchers/active_record/serialize_matcher.rb +181 -0
  102. data/lib/shoulda/matchers/assertion_error.rb +19 -0
  103. data/lib/shoulda/matchers/error.rb +6 -0
  104. data/lib/shoulda/matchers/integrations/rspec.rb +20 -0
  105. data/lib/shoulda/matchers/integrations/test_unit.rb +30 -0
  106. data/lib/shoulda/matchers/rails_shim.rb +50 -0
  107. data/lib/shoulda/matchers/version.rb +6 -0
  108. data/lib/shoulda/matchers/warn.rb +8 -0
  109. data/shoulda-matchers.gemspec +23 -0
  110. data/spec/shoulda/matchers/action_controller/filter_param_matcher_spec.rb +22 -0
  111. data/spec/shoulda/matchers/action_controller/redirect_to_matcher_spec.rb +42 -0
  112. data/spec/shoulda/matchers/action_controller/render_template_matcher_spec.rb +78 -0
  113. data/spec/shoulda/matchers/action_controller/render_with_layout_matcher_spec.rb +63 -0
  114. data/spec/shoulda/matchers/action_controller/rescue_from_matcher_spec.rb +63 -0
  115. data/spec/shoulda/matchers/action_controller/respond_with_matcher_spec.rb +31 -0
  116. data/spec/shoulda/matchers/action_controller/route_matcher_spec.rb +70 -0
  117. data/spec/shoulda/matchers/action_controller/route_params_spec.rb +30 -0
  118. data/spec/shoulda/matchers/action_controller/set_session_matcher_spec.rb +51 -0
  119. data/spec/shoulda/matchers/action_controller/set_the_flash_matcher_spec.rb +153 -0
  120. data/spec/shoulda/matchers/active_model/allow_mass_assignment_of_matcher_spec.rb +111 -0
  121. data/spec/shoulda/matchers/active_model/allow_value_matcher_spec.rb +170 -0
  122. data/spec/shoulda/matchers/active_model/disallow_value_matcher_spec.rb +81 -0
  123. data/spec/shoulda/matchers/active_model/ensure_exclusion_of_matcher_spec.rb +95 -0
  124. data/spec/shoulda/matchers/active_model/ensure_inclusion_of_matcher_spec.rb +320 -0
  125. data/spec/shoulda/matchers/active_model/ensure_length_of_matcher_spec.rb +166 -0
  126. data/spec/shoulda/matchers/active_model/exception_message_finder_spec.rb +111 -0
  127. data/spec/shoulda/matchers/active_model/have_secure_password_matcher_spec.rb +20 -0
  128. data/spec/shoulda/matchers/active_model/helpers_spec.rb +158 -0
  129. data/spec/shoulda/matchers/active_model/numericality_matchers/comparison_matcher_spec.rb +169 -0
  130. data/spec/shoulda/matchers/active_model/numericality_matchers/even_number_matcher_spec.rb +59 -0
  131. data/spec/shoulda/matchers/active_model/numericality_matchers/odd_number_matcher_spec.rb +59 -0
  132. data/spec/shoulda/matchers/active_model/numericality_matchers/only_integer_matcher_spec.rb +57 -0
  133. data/spec/shoulda/matchers/active_model/validate_absence_of_matcher_spec.rb +139 -0
  134. data/spec/shoulda/matchers/active_model/validate_acceptance_of_matcher_spec.rb +41 -0
  135. data/spec/shoulda/matchers/active_model/validate_confirmation_of_matcher_spec.rb +47 -0
  136. data/spec/shoulda/matchers/active_model/validate_numericality_of_matcher_spec.rb +331 -0
  137. data/spec/shoulda/matchers/active_model/validate_presence_of_matcher_spec.rb +180 -0
  138. data/spec/shoulda/matchers/active_model/validate_uniqueness_of_matcher_spec.rb +398 -0
  139. data/spec/shoulda/matchers/active_model/validation_message_finder_spec.rb +127 -0
  140. data/spec/shoulda/matchers/active_record/accept_nested_attributes_for_matcher_spec.rb +107 -0
  141. data/spec/shoulda/matchers/active_record/association_matcher_spec.rb +860 -0
  142. data/spec/shoulda/matchers/active_record/association_matchers/model_reflection_spec.rb +247 -0
  143. data/spec/shoulda/matchers/active_record/have_db_column_matcher_spec.rb +111 -0
  144. data/spec/shoulda/matchers/active_record/have_db_index_matcher_spec.rb +78 -0
  145. data/spec/shoulda/matchers/active_record/have_readonly_attributes_matcher_spec.rb +41 -0
  146. data/spec/shoulda/matchers/active_record/serialize_matcher_spec.rb +86 -0
  147. data/spec/spec_helper.rb +26 -0
  148. data/spec/support/active_model_versions.rb +13 -0
  149. data/spec/support/active_resource_builder.rb +29 -0
  150. data/spec/support/activemodel_helpers.rb +19 -0
  151. data/spec/support/capture_helpers.rb +19 -0
  152. data/spec/support/class_builder.rb +42 -0
  153. data/spec/support/controller_builder.rb +74 -0
  154. data/spec/support/fail_with_message_including_matcher.rb +33 -0
  155. data/spec/support/fail_with_message_matcher.rb +32 -0
  156. data/spec/support/i18n_faker.rb +10 -0
  157. data/spec/support/mailer_builder.rb +10 -0
  158. data/spec/support/model_builder.rb +81 -0
  159. data/spec/support/rails_versions.rb +18 -0
  160. data/spec/support/shared_examples/numerical_submatcher.rb +19 -0
  161. data/spec/support/shared_examples/numerical_type_submatcher.rb +17 -0
  162. data/spec/support/test_application.rb +120 -0
  163. data/yard.watchr +5 -0
  164. metadata +281 -0
@@ -0,0 +1,63 @@
1
+ require 'spec_helper'
2
+
3
+ describe Shoulda::Matchers::ActionController::RenderWithLayoutMatcher do
4
+ include ActionController::TemplateAssertions
5
+
6
+ context 'a controller that renders with a layout' do
7
+ it 'accepts rendering with any layout' do
8
+ expect(controller_with_wide_layout).to render_with_layout
9
+ end
10
+
11
+ it 'accepts rendering with that layout' do
12
+ expect(controller_with_wide_layout).to render_with_layout(:wide)
13
+ end
14
+
15
+ it 'rejects rendering with another layout' do
16
+ expect(controller_with_wide_layout).not_to render_with_layout(:other)
17
+ end
18
+
19
+ def controller_with_wide_layout
20
+ create_view('layouts/wide.html.erb', 'some content, <%= yield %>')
21
+ build_response { render layout: 'wide' }
22
+ end
23
+ end
24
+
25
+ context 'a controller that renders without a layout' do
26
+
27
+ it 'rejects rendering with a layout' do
28
+ controller_without_layout = build_response { render layout: false }
29
+
30
+ expect(controller_without_layout).not_to render_with_layout
31
+ end
32
+ end
33
+
34
+ context 'a controller that renders a partial' do
35
+ it 'rejects rendering with a layout' do
36
+ controller_with_partial = build_response { render partial: 'partial' }
37
+
38
+ expect(controller_with_partial).not_to render_with_layout
39
+ end
40
+ end
41
+
42
+ context 'given a context with layouts' do
43
+ it 'accepts that layout in that context' do
44
+ set_in_context_layout('happy')
45
+
46
+ expect(controller_without_layout).to render_with_layout('happy').in_context(self)
47
+ end
48
+
49
+ def set_in_context_layout(layout)
50
+ layouts = Hash.new(0)
51
+ layouts[layout] = 1
52
+ self.instance_variable_set(layouts_ivar, layouts)
53
+ end
54
+
55
+ def layouts_ivar
56
+ Shoulda::Matchers::RailsShim.layouts_ivar
57
+ end
58
+
59
+ def controller_without_layout
60
+ build_response { render layout: false }
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,63 @@
1
+ require 'spec_helper'
2
+
3
+ describe Shoulda::Matchers::ActionController::RescueFromMatcher do
4
+ context 'a controller that rescues from RuntimeError' do
5
+ it "asserts controller is setup with rescue_from" do
6
+ expect(controller_with_rescue_from).to rescue_from RuntimeError
7
+ end
8
+
9
+ context 'with a handler method' do
10
+ it "asserts rescue_from was set up with handler method" do
11
+ expect(controller_with_rescue_from_and_method).to rescue_from(RuntimeError).with(:error_method)
12
+ end
13
+
14
+ it "asserts rescue_from was not set up with incorrect handler method" do
15
+ expect(controller_with_rescue_from_and_method).not_to rescue_from(RuntimeError).with(:other_method)
16
+ end
17
+
18
+ it "asserts the controller responds to the handler method" do
19
+ matcher = rescue_from(RuntimeError).with(:error_method)
20
+ expect(matcher.matches?(controller_with_rescue_from_and_invalid_method)).to eq false
21
+ expect(matcher.failure_message).to match(/does not respond to/)
22
+ end
23
+ end
24
+
25
+ context 'without a handler method' do
26
+ it "the handler method is not included in the description" do
27
+ matcher = rescue_from(RuntimeError)
28
+ expect(matcher.matches?(controller_with_rescue_from)).to eq true
29
+ expect(matcher.description).not_to match(/with #/)
30
+ end
31
+ end
32
+ end
33
+
34
+ context 'a controller that does not rescue from RuntimeError' do
35
+ it "asserts controller is not setup with rescue_from" do
36
+ matcher = rescue_from RuntimeError
37
+ expect(define_controller("RandomController")).not_to matcher
38
+ expect(matcher.failure_message_when_negated).to match(/Did not expect \w+ to rescue from/)
39
+ end
40
+ end
41
+
42
+ def controller_with_rescue_from
43
+ define_controller "RescueRuntimeError" do
44
+ rescue_from(RuntimeError) {}
45
+ end
46
+ end
47
+
48
+ def controller_with_rescue_from_and_invalid_method
49
+ define_controller "RescueRuntimeErrorWithMethod" do
50
+ rescue_from RuntimeError, with: :error_method
51
+ end
52
+ end
53
+
54
+ def controller_with_rescue_from_and_method
55
+ controller = controller_with_rescue_from_and_invalid_method
56
+ class << controller
57
+ def error_method
58
+ true
59
+ end
60
+ end
61
+ controller
62
+ end
63
+ end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ describe Shoulda::Matchers::ActionController::RespondWithMatcher do
4
+ statuses = { success: 200, redirect: 301, missing: 404, error: 500,
5
+ not_implemented: 501 }
6
+
7
+ statuses.each do |human_name, numeric_code|
8
+ context "a controller responding with #{human_name}" do
9
+ it 'accepts responding with a numeric response code' do
10
+ expect(controller_with_status(numeric_code)).to respond_with(numeric_code)
11
+ end
12
+
13
+ it 'accepts responding with a symbol response code' do
14
+ expect(controller_with_status(numeric_code)).to respond_with(human_name)
15
+ end
16
+
17
+ it 'rejects responding with another status' do
18
+ another_status = statuses.except(human_name).keys.first
19
+
20
+ expect(controller_with_status(numeric_code)).
21
+ not_to respond_with(another_status)
22
+ end
23
+ end
24
+ end
25
+
26
+ def controller_with_status(status)
27
+ build_response do
28
+ render text: 'text', status: status
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,70 @@
1
+ require 'spec_helper'
2
+
3
+ describe Shoulda::Matchers::ActionController::RouteMatcher, type: :controller do
4
+ context 'given a controller with a defined glob url' do
5
+ it 'accepts glob route' do
6
+ controller = define_controller('Examples').new
7
+
8
+ define_routes do
9
+ get 'examples/*id', to: 'examples#example'
10
+ end
11
+
12
+ expect(controller).to route(:get, '/examples/foo/bar').
13
+ to(action: 'example', id: 'foo/bar')
14
+ end
15
+ end
16
+
17
+ context 'given a controller with a defined route' do
18
+
19
+ it 'accepts routing the correct path to the correct parameters' do
20
+ expect(route_examples_to_examples).to route(:get, '/examples/1').
21
+ to(action: 'example', id: '1')
22
+ end
23
+
24
+ it 'accepts a symbol controller' do
25
+ route_examples_to_examples
26
+ expect(Object.new).to route(:get, '/examples/1').
27
+ to(controller: :examples, action: 'example', id: '1')
28
+ end
29
+
30
+ it 'accepts a symbol action' do
31
+ expect(route_examples_to_examples).to route(:get, '/examples/1').
32
+ to(action: :example, id: '1')
33
+ end
34
+
35
+ it 'accepts a non-string parameter' do
36
+ expect(route_examples_to_examples).to route(:get, '/examples/1').
37
+ to(action: 'example', id: 1)
38
+ end
39
+
40
+ it 'rejects an undefined route' do
41
+ expect(route_examples_to_examples).
42
+ not_to route(:get, '/bad_route').to(var: 'value')
43
+ end
44
+
45
+ it 'rejects a route for another controller' do
46
+ route_examples_to_examples
47
+ other = define_controller('Other').new
48
+ expect(other).not_to route(:get, '/examples/1').
49
+ to(action: 'example', id: '1')
50
+ end
51
+
52
+ it 'rejects a route for different parameters' do
53
+ expect(route_examples_to_examples).not_to route(:get, '/examples/1').
54
+ to(action: 'other', id: '1')
55
+ end
56
+
57
+ it "accepts a string as first parameter" do
58
+ expect(route_examples_to_examples).to route(:get, '/examples/1').
59
+ to("examples#example", id: '1')
60
+ end
61
+
62
+ def route_examples_to_examples
63
+ define_routes do
64
+ get 'examples/:id', to: 'examples#example'
65
+ end
66
+
67
+ define_controller('Examples').new
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+
3
+ describe Shoulda::Matchers::ActionController::RouteParams 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
@@ -0,0 +1,51 @@
1
+ require 'spec_helper'
2
+
3
+ describe Shoulda::Matchers::ActionController::SetSessionMatcher do
4
+ context 'a controller that sets a session variable' do
5
+ it 'accepts assigning to that variable' do
6
+ expect(controller_with_session(var: 'hi')).to set_session(:var)
7
+ end
8
+
9
+ it 'accepts assigning the correct value to that variable' do
10
+ expect(controller_with_session(var: 'hi')).to set_session(:var).to('hi')
11
+ end
12
+
13
+ it 'rejects assigning another value to that variable' do
14
+ expect(controller_with_session(var: 'hi')).not_to set_session(:var).to('other')
15
+ end
16
+
17
+ it 'rejects assigning to another variable' do
18
+ expect(controller_with_session(var: 'hi')).not_to set_session(:other)
19
+ end
20
+
21
+ it 'accepts assigning nil to another variable' do
22
+ expect(controller_with_session(var: 'hi')).to set_session(:other).to(nil)
23
+ end
24
+
25
+ it 'accepts assigning false to that variable' do
26
+ expect(controller_with_session(var: false)).to set_session(:var).to(false)
27
+ end
28
+
29
+ it 'accepts assigning to the same value in the test context' do
30
+ expected = 'value'
31
+
32
+ expect(controller_with_session(var: expected)).
33
+ to set_session(:var).in_context(self).to { expected }
34
+ end
35
+
36
+ it 'rejects assigning to the another value in the test context' do
37
+ expected = 'other'
38
+
39
+ expect(controller_with_session(var: 'unexpected')).
40
+ not_to set_session(:var).in_context(self).to { expected }
41
+ end
42
+
43
+ def controller_with_session(session_hash)
44
+ build_response do
45
+ session_hash.each do |key, value|
46
+ session[key] = value
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,153 @@
1
+ require 'spec_helper'
2
+
3
+ describe Shoulda::Matchers::ActionController::SetTheFlashMatcher do
4
+ it 'fails with unmatchable #to' do
5
+ expect { set_the_flash.to(1) }.to raise_error('cannot match against 1')
6
+ end
7
+
8
+ context 'a controller that sets a flash message' do
9
+ it 'accepts setting any flash message' do
10
+ expect(controller_with_flash(notice: 'hi')).to set_the_flash
11
+ end
12
+
13
+ it 'accepts setting the exact flash message' do
14
+ expect(controller_with_flash(notice: 'hi')).to set_the_flash.to('hi')
15
+ end
16
+
17
+ it 'accepts setting a matched flash message' do
18
+ expect(controller_with_flash(notice: 'hello')).to set_the_flash.to(/he/)
19
+ end
20
+
21
+ it 'rejects setting a different flash message' do
22
+ expect(controller_with_flash(notice: 'hi')).
23
+ not_to set_the_flash.to('other')
24
+ end
25
+
26
+ it 'rejects setting a different pattern' do
27
+ expect(controller_with_flash(notice: 'hi')).
28
+ not_to set_the_flash.to(/other/)
29
+ end
30
+ end
31
+
32
+ context 'a controller that sets a flash.now message' do
33
+ it 'rejects setting any flash message' do
34
+ expect(controller_with_flash_now).not_to set_the_flash
35
+ end
36
+
37
+ it 'accepts setting any flash.now message' do
38
+ expect(controller_with_flash_now).to set_the_flash.now
39
+ end
40
+
41
+ it 'accepts setting the exact flash.now message' do
42
+ expect(controller_with_flash_now(notice: 'hi')).
43
+ to set_the_flash.now.to('hi')
44
+ end
45
+
46
+ it 'accepts setting a matched flash.now message' do
47
+ expect(controller_with_flash_now(notice: 'flasher')).
48
+ to set_the_flash.now.to(/lash/)
49
+ end
50
+
51
+ it 'rejects setting a different flash.now message' do
52
+ expect(controller_with_flash_now(notice: 'hi')).
53
+ not_to set_the_flash.now.to('other')
54
+ end
55
+
56
+ it 'rejects setting a different flash.now pattern' do
57
+ expect(controller_with_flash_now(notice: 'hi')).
58
+ not_to set_the_flash.now.to(/other/)
59
+ end
60
+ end
61
+
62
+ context 'a controller that sets flash messages for multiple keys' do
63
+ it 'accepts flash message for either key' do
64
+ controller = controller_with_flash(notice: 'one', alert: 'two')
65
+
66
+ expect(controller).to set_the_flash[:notice]
67
+ expect(controller).to set_the_flash[:alert]
68
+ end
69
+
70
+ it 'rejects a flash message that is not one of the set keys' do
71
+ expect(controller_with_flash(notice: 'one', alert: 'two')).
72
+ not_to set_the_flash[:warning]
73
+ end
74
+
75
+ it 'accepts exact flash message of notice' do
76
+ expect(controller_with_flash(notice: 'one', alert: 'two')).
77
+ to set_the_flash[:notice].to('one')
78
+ end
79
+
80
+ it 'accepts setting a matched flash message of notice' do
81
+ expect(controller_with_flash(notice: 'one', alert: 'two')).
82
+ to set_the_flash[:notice].to(/on/)
83
+ end
84
+
85
+ it 'rejects setting a different flash message of notice' do
86
+ expect(controller_with_flash(notice: 'one', alert: 'two')).
87
+ not_to set_the_flash[:notice].to('other')
88
+ end
89
+
90
+ it 'rejects setting a different pattern' do
91
+ expect(controller_with_flash(notice: 'one', alert: 'two')).
92
+ not_to set_the_flash[:notice].to(/other/)
93
+ end
94
+ end
95
+
96
+ context 'a controller that sets flash and flash.now' do
97
+ it 'accepts setting any flash.now message' do
98
+ controller = build_response do
99
+ flash.now[:notice] = 'value'
100
+ flash[:success] = 'great job'
101
+ end
102
+
103
+ expect(controller).to set_the_flash.now
104
+ expect(controller).to set_the_flash
105
+ end
106
+
107
+ it 'accepts setting a matched flash.now message' do
108
+ controller = build_response do
109
+ flash.now[:notice] = 'value'
110
+ flash[:success] = 'great job'
111
+ end
112
+
113
+ expect(controller).to set_the_flash.now.to(/value/)
114
+ expect(controller).to set_the_flash.to(/great/)
115
+ end
116
+
117
+ it 'rejects setting a different flash.now message' do
118
+ controller = build_response do
119
+ flash.now[:notice] = 'value'
120
+ flash[:success] = 'great job'
121
+ end
122
+
123
+ expect(controller).not_to set_the_flash.now.to('other')
124
+ expect(controller).not_to set_the_flash.to('other')
125
+ end
126
+ end
127
+
128
+ context 'a controller that does not set a flash message' do
129
+ it 'rejects setting any flash message' do
130
+ expect(controller_with_no_flashes).not_to set_the_flash
131
+ end
132
+ end
133
+
134
+ def controller_with_no_flashes
135
+ build_response
136
+ end
137
+
138
+ def controller_with_flash(flash_hash)
139
+ build_response do
140
+ flash_hash.each do |key, value|
141
+ flash[key] = value
142
+ end
143
+ end
144
+ end
145
+
146
+ def controller_with_flash_now(flash_hash = { notice: 'hi' })
147
+ build_response do
148
+ flash_hash.each do |key, value|
149
+ flash.now[key] = value
150
+ end
151
+ end
152
+ end
153
+ end