rspec-rails 3.0.2 → 7.1.1

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 (105) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data/.document +1 -1
  4. data/.yardopts +3 -1
  5. data/Capybara.md +6 -55
  6. data/Changelog.md +805 -47
  7. data/{License.txt → LICENSE.md} +5 -3
  8. data/README.md +278 -444
  9. data/lib/generators/rspec/channel/channel_generator.rb +12 -0
  10. data/lib/generators/rspec/{observer/templates/observer_spec.rb → channel/templates/channel_spec.rb.erb} +1 -1
  11. data/lib/generators/rspec/controller/controller_generator.rb +24 -7
  12. data/lib/generators/rspec/controller/templates/controller_spec.rb +3 -3
  13. data/lib/generators/rspec/controller/templates/request_spec.rb +19 -0
  14. data/lib/generators/rspec/controller/templates/routing_spec.rb +13 -0
  15. data/lib/generators/rspec/controller/templates/view_spec.rb +1 -1
  16. data/lib/generators/rspec/feature/feature_generator.rb +15 -2
  17. data/lib/generators/rspec/feature/templates/feature_singular_spec.rb +5 -0
  18. data/lib/generators/rspec/feature/templates/feature_spec.rb +1 -1
  19. data/lib/generators/rspec/generator/generator_generator.rb +24 -0
  20. data/lib/generators/rspec/generator/templates/generator_spec.rb +5 -0
  21. data/lib/generators/rspec/helper/helper_generator.rb +2 -2
  22. data/lib/generators/rspec/helper/templates/helper_spec.rb +1 -1
  23. data/lib/generators/rspec/install/install_generator.rb +41 -7
  24. data/lib/generators/rspec/install/templates/spec/rails_helper.rb +63 -22
  25. data/lib/generators/rspec/job/job_generator.rb +13 -0
  26. data/lib/generators/rspec/job/templates/job_spec.rb.erb +7 -0
  27. data/lib/generators/rspec/mailbox/mailbox_generator.rb +14 -0
  28. data/lib/generators/rspec/mailbox/templates/mailbox_spec.rb.erb +7 -0
  29. data/lib/generators/rspec/mailer/mailer_generator.rb +12 -3
  30. data/lib/generators/rspec/mailer/templates/mailer_spec.rb +2 -2
  31. data/lib/generators/rspec/mailer/templates/preview.rb +13 -0
  32. data/lib/generators/rspec/model/model_generator.rb +20 -6
  33. data/lib/generators/rspec/model/templates/fixtures.yml +1 -1
  34. data/lib/generators/rspec/model/templates/model_spec.rb +1 -1
  35. data/lib/generators/rspec/request/request_generator.rb +17 -0
  36. data/lib/generators/rspec/request/templates/request_spec.rb +10 -0
  37. data/lib/generators/rspec/scaffold/scaffold_generator.rb +90 -113
  38. data/lib/generators/rspec/scaffold/templates/api_controller_spec.rb +129 -0
  39. data/lib/generators/rspec/scaffold/templates/api_request_spec.rb +131 -0
  40. data/lib/generators/rspec/scaffold/templates/controller_spec.rb +46 -64
  41. data/lib/generators/rspec/scaffold/templates/edit_spec.rb +11 -7
  42. data/lib/generators/rspec/scaffold/templates/index_spec.rb +4 -3
  43. data/lib/generators/rspec/scaffold/templates/new_spec.rb +4 -4
  44. data/lib/generators/rspec/scaffold/templates/request_spec.rb +138 -0
  45. data/lib/generators/rspec/scaffold/templates/routing_spec.rb +18 -11
  46. data/lib/generators/rspec/scaffold/templates/show_spec.rb +3 -3
  47. data/lib/generators/rspec/system/system_generator.rb +24 -0
  48. data/lib/generators/rspec/system/templates/system_spec.rb +9 -0
  49. data/lib/generators/rspec/view/templates/view_spec.rb +1 -1
  50. data/lib/generators/rspec/view/view_generator.rb +4 -4
  51. data/lib/generators/rspec.rb +30 -11
  52. data/lib/rspec/rails/active_record.rb +25 -0
  53. data/lib/rspec/rails/adapters.rb +46 -29
  54. data/lib/rspec/rails/configuration.rb +165 -41
  55. data/lib/rspec/rails/example/channel_example_group.rb +93 -0
  56. data/lib/rspec/rails/example/controller_example_group.rb +185 -149
  57. data/lib/rspec/rails/example/feature_example_group.rb +43 -23
  58. data/lib/rspec/rails/example/helper_example_group.rb +28 -25
  59. data/lib/rspec/rails/example/job_example_group.rb +23 -0
  60. data/lib/rspec/rails/example/mailbox_example_group.rb +80 -0
  61. data/lib/rspec/rails/example/mailer_example_group.rb +27 -22
  62. data/lib/rspec/rails/example/model_example_group.rb +9 -6
  63. data/lib/rspec/rails/example/rails_example_group.rb +9 -2
  64. data/lib/rspec/rails/example/request_example_group.rb +21 -17
  65. data/lib/rspec/rails/example/routing_example_group.rb +47 -39
  66. data/lib/rspec/rails/example/system_example_group.rb +180 -0
  67. data/lib/rspec/rails/example/view_example_group.rb +179 -134
  68. data/lib/rspec/rails/example.rb +4 -0
  69. data/lib/rspec/rails/extensions/active_record/proxy.rb +5 -11
  70. data/lib/rspec/rails/feature_check.rb +51 -0
  71. data/lib/rspec/rails/file_fixture_support.rb +18 -0
  72. data/lib/rspec/rails/fixture_file_upload_support.rb +45 -0
  73. data/lib/rspec/rails/fixture_support.rb +70 -14
  74. data/lib/rspec/rails/matchers/action_cable/have_broadcasted_to.rb +180 -0
  75. data/lib/rspec/rails/matchers/action_cable/have_streams.rb +58 -0
  76. data/lib/rspec/rails/matchers/action_cable.rb +70 -0
  77. data/lib/rspec/rails/matchers/action_mailbox.rb +73 -0
  78. data/lib/rspec/rails/matchers/active_job.rb +526 -0
  79. data/lib/rspec/rails/matchers/base_matcher.rb +179 -0
  80. data/lib/rspec/rails/matchers/be_a_new.rb +70 -64
  81. data/lib/rspec/rails/matchers/be_new_record.rb +25 -20
  82. data/lib/rspec/rails/matchers/be_valid.rb +39 -34
  83. data/lib/rspec/rails/matchers/have_enqueued_mail.rb +259 -0
  84. data/lib/rspec/rails/matchers/have_http_status.rb +359 -333
  85. data/lib/rspec/rails/matchers/have_rendered.rb +55 -32
  86. data/lib/rspec/rails/matchers/redirect_to.rb +30 -27
  87. data/lib/rspec/rails/matchers/relation_match_array.rb +1 -1
  88. data/lib/rspec/rails/matchers/routing_matchers.rb +107 -101
  89. data/lib/rspec/rails/matchers/send_email.rb +122 -0
  90. data/lib/rspec/rails/matchers.rb +21 -12
  91. data/lib/rspec/rails/tasks/rspec.rake +9 -17
  92. data/lib/rspec/rails/vendor/capybara.rb +10 -11
  93. data/lib/rspec/rails/version.rb +1 -1
  94. data/lib/rspec/rails/view_assigns.rb +1 -20
  95. data/lib/rspec/rails/view_path_builder.rb +29 -0
  96. data/lib/rspec/rails/view_rendering.rb +89 -27
  97. data/lib/rspec/rails/view_spec_methods.rb +56 -0
  98. data/lib/rspec/rails.rb +9 -1
  99. data/lib/rspec-rails.rb +83 -3
  100. data.tar.gz.sig +0 -0
  101. metadata +108 -78
  102. metadata.gz.sig +3 -2
  103. data/lib/generators/rspec/integration/integration_generator.rb +0 -17
  104. data/lib/generators/rspec/integration/templates/request_spec.rb +0 -10
  105. data/lib/generators/rspec/observer/observer_generator.rb +0 -13
@@ -1,179 +1,215 @@
1
- module RSpec::Rails
2
- # Container module for controller spec functionality.
3
- module ControllerExampleGroup
4
- extend ActiveSupport::Concern
5
- include RSpec::Rails::RailsExampleGroup
6
- include ActionController::TestCase::Behavior
7
- include RSpec::Rails::ViewRendering
8
- include RSpec::Rails::Matchers::RedirectTo
9
- include RSpec::Rails::Matchers::RenderTemplate
10
- include RSpec::Rails::Matchers::RoutingMatchers
11
- include RSpec::Rails::AssertionDelegator.new(ActionDispatch::Assertions::RoutingAssertions)
12
-
13
- # Class-level DSL for controller specs.
14
- module ClassMethods
15
- # @private
16
- def controller_class
17
- described_class
18
- end
1
+ module RSpec
2
+ module Rails
3
+ # @private
4
+ ControllerAssertionDelegator = RSpec::Rails::AssertionDelegator.new(
5
+ ActionDispatch::Assertions::RoutingAssertions
6
+ )
19
7
 
20
- # Supports a simple DSL for specifying behavior of ApplicationController.
21
- # Creates an anonymous subclass of ApplicationController and evals the
22
- # `body` in that context. Also sets up implicit routes for this
23
- # controller, that are separate from those defined in "config/routes.rb".
24
- #
25
- # @note Due to Ruby 1.8 scoping rules in anonymous subclasses, constants
26
- # defined in `ApplicationController` must be fully qualified (e.g.
27
- # `ApplicationController::AccessDenied`) in the block passed to the
28
- # `controller` method. Any instance methods, filters, etc, that are
29
- # defined in `ApplicationController`, however, are accessible from
30
- # within the block.
31
- #
32
- # @example
33
- # describe ApplicationController do
34
- # controller do
35
- # def index
36
- # raise ApplicationController::AccessDenied
37
- # end
38
- # end
39
- #
40
- # describe "handling AccessDenied exceptions" do
41
- # it "redirects to the /401.html page" do
42
- # get :index
43
- # response.should redirect_to("/401.html")
44
- # end
45
- # end
46
- # end
47
- #
48
- # If you would like to spec a subclass of ApplicationController, call
49
- # controller like so:
50
- #
51
- # controller(ApplicationControllerSubclass) do
52
- # # ....
53
- # end
54
- def controller(base_class = nil, &body)
55
- if RSpec.configuration.infer_base_class_for_anonymous_controllers?
56
- base_class ||= controller_class
8
+ # @api public
9
+ # Container module for controller spec functionality.
10
+ module ControllerExampleGroup
11
+ extend ActiveSupport::Concern
12
+ include RSpec::Rails::RailsExampleGroup
13
+ include ActionController::TestCase::Behavior
14
+ include RSpec::Rails::ViewRendering
15
+ include RSpec::Rails::Matchers::RedirectTo
16
+ include RSpec::Rails::Matchers::RenderTemplate
17
+ include RSpec::Rails::Matchers::RoutingMatchers
18
+ include ControllerAssertionDelegator
19
+
20
+ # Class-level DSL for controller specs.
21
+ module ClassMethods
22
+ # @private
23
+ def controller_class
24
+ described_class
57
25
  end
58
- base_class ||= defined?(ApplicationController) ? ApplicationController : ActionController::Base
59
-
60
- new_controller_class = Class.new(base_class) do
61
- def self.name
62
- root_controller = defined?(ApplicationController) ? ApplicationController : ActionController::Base
63
- if superclass == root_controller || superclass.abstract?
64
- "AnonymousController"
65
- else
66
- superclass.to_s
26
+
27
+ # Supports a simple DSL for specifying behavior of ApplicationController.
28
+ # Creates an anonymous subclass of ApplicationController and evals the
29
+ # `body` in that context. Also sets up implicit routes for this
30
+ # controller, that are separate from those defined in "config/routes.rb".
31
+ #
32
+ # @note Due to Ruby 1.8 scoping rules in anonymous subclasses, constants
33
+ # defined in `ApplicationController` must be fully qualified (e.g.
34
+ # `ApplicationController::AccessDenied`) in the block passed to the
35
+ # `controller` method. Any instance methods, filters, etc, that are
36
+ # defined in `ApplicationController`, however, are accessible from
37
+ # within the block.
38
+ #
39
+ # @example
40
+ # describe ApplicationController do
41
+ # controller do
42
+ # def index
43
+ # raise ApplicationController::AccessDenied
44
+ # end
45
+ # end
46
+ #
47
+ # describe "handling AccessDenied exceptions" do
48
+ # it "redirects to the /401.html page" do
49
+ # get :index
50
+ # response.should redirect_to("/401.html")
51
+ # end
52
+ # end
53
+ # end
54
+ #
55
+ # If you would like to spec a subclass of ApplicationController, call
56
+ # controller like so:
57
+ #
58
+ # controller(ApplicationControllerSubclass) do
59
+ # # ....
60
+ # end
61
+ def controller(base_class = nil, &body)
62
+ if RSpec.configuration.infer_base_class_for_anonymous_controllers?
63
+ base_class ||= controller_class
64
+ end
65
+ base_class ||= defined?(ApplicationController) ? ApplicationController : ActionController::Base
66
+
67
+ new_controller_class = Class.new(base_class) do
68
+ def self.name
69
+ root_controller = defined?(ApplicationController) ? ApplicationController : ActionController::Base
70
+ if superclass == root_controller || superclass.abstract?
71
+ "AnonymousController"
72
+ else
73
+ superclass.name
74
+ end
67
75
  end
68
76
  end
69
- end
70
- new_controller_class.class_exec(&body)
71
- (class << self; self; end).__send__(:define_method, :controller_class) { new_controller_class }
77
+ new_controller_class.class_exec(&body)
78
+ (class << self; self; end).__send__(:define_method, :controller_class) { new_controller_class }
72
79
 
73
- before do
74
- @orig_routes = self.routes
75
- resource_name = @controller.respond_to?(:controller_name) ?
76
- @controller.controller_name.to_sym : :anonymous
77
- resource_path = @controller.respond_to?(:controller_path) ?
78
- @controller.controller_path : resource_name.to_s
79
- resource_module = resource_path.rpartition('/').first.presence
80
- resource_as = 'anonymous_' + resource_path.tr('/', '_')
81
- self.routes = ActionDispatch::Routing::RouteSet.new.tap do |r|
82
- r.draw do
83
- resources resource_name,
84
- :as => resource_as,
85
- :module => resource_module,
86
- :path => resource_path
80
+ before do
81
+ @orig_routes = routes
82
+ resource_name = if @controller.respond_to?(:controller_name)
83
+ @controller.controller_name.to_sym
84
+ else
85
+ :anonymous
86
+ end
87
+ resource_path = if @controller.respond_to?(:controller_path)
88
+ @controller.controller_path
89
+ else
90
+ resource_name.to_s
91
+ end
92
+ resource_module = resource_path.rpartition('/').first.presence
93
+ resource_as = 'anonymous_' + resource_path.tr('/', '_')
94
+ self.routes = ActionDispatch::Routing::RouteSet.new.tap do |r|
95
+ r.draw do
96
+ resources resource_name,
97
+ as: resource_as,
98
+ module: resource_module,
99
+ path: resource_path
100
+ end
87
101
  end
88
102
  end
103
+
104
+ after do
105
+ self.routes = @orig_routes
106
+ @orig_routes = nil
107
+ end
89
108
  end
90
109
 
91
- after do
92
- self.routes = @orig_routes
93
- @orig_routes = nil
110
+ # Specifies the routeset that will be used for the example group. This
111
+ # is most useful when testing Rails engines.
112
+ #
113
+ # @example
114
+ # describe MyEngine::PostsController do
115
+ # routes { MyEngine::Engine.routes }
116
+ #
117
+ # # ...
118
+ # end
119
+ def routes
120
+ before do
121
+ self.routes = yield
122
+ end
94
123
  end
95
124
  end
96
125
 
97
- # Specifies the routeset that will be used for the example group. This
98
- # is most useful when testing Rails engines.
126
+ # @!attribute [r]
127
+ # Returns the controller object instance under test.
128
+ attr_reader :controller
129
+
130
+ # @!attribute [r]
131
+ # Returns the Rails routes used for the spec.
132
+ attr_reader :routes
133
+
134
+ # @private
135
+ #
136
+ # RSpec Rails uses this to make Rails routes easily available to specs.
137
+ def routes=(routes)
138
+ @routes = routes
139
+ assertion_instance.instance_variable_set(:@routes, routes)
140
+ end
141
+
142
+ # @private
143
+ module BypassRescue
144
+ def rescue_with_handler(exception)
145
+ raise exception
146
+ end
147
+ end
148
+
149
+ # Extends the controller with a module that overrides
150
+ # `rescue_with_handler` to raise the exception passed to it. Use this to
151
+ # specify that an action _should_ raise an exception given appropriate
152
+ # conditions.
99
153
  #
100
154
  # @example
101
- # describe MyEngine::PostsController do
102
- # routes { MyEngine::Engine.routes }
155
+ # describe ProfilesController do
156
+ # it "raises a 403 when a non-admin user tries to view another user's profile" do
157
+ # profile = create_profile
158
+ # login_as profile.user
103
159
  #
104
- # # ...
160
+ # expect do
161
+ # bypass_rescue
162
+ # get :show, id: profile.id + 1
163
+ # end.to raise_error(/403 Forbidden/)
164
+ # end
105
165
  # end
106
- def routes(&blk)
107
- before do
108
- self.routes = blk.call
166
+ def bypass_rescue
167
+ controller.extend(BypassRescue)
168
+ end
169
+
170
+ # If method is a named_route, delegates to the RouteSet associated with
171
+ # this controller.
172
+ def method_missing(method, *args, &block)
173
+ if route_available?(method)
174
+ controller.send(method, *args, &block)
175
+ else
176
+ super
109
177
  end
110
178
  end
111
- end
179
+ ruby2_keywords :method_missing if respond_to?(:ruby2_keywords, true)
112
180
 
113
- attr_reader :controller, :routes
181
+ included do
182
+ subject { controller }
114
183
 
115
- # @private
116
- #
117
- # RSpec Rails uses this to make Rails routes easily available to specs.
118
- def routes=(routes)
119
- @routes = routes
120
- assertion_instance.instance_variable_set(:@routes, routes)
121
- end
184
+ before do
185
+ self.routes = ::Rails.application.routes
186
+ end
122
187
 
123
- # @private
124
- module BypassRescue
125
- def rescue_with_handler(exception)
126
- raise exception
188
+ around do |ex|
189
+ previous_allow_forgery_protection_value = ActionController::Base.allow_forgery_protection
190
+ begin
191
+ ActionController::Base.allow_forgery_protection = false
192
+ ex.call
193
+ ensure
194
+ ActionController::Base.allow_forgery_protection = previous_allow_forgery_protection_value
195
+ end
196
+ end
127
197
  end
128
- end
129
198
 
130
- # Extends the controller with a module that overrides
131
- # `rescue_with_handler` to raise the exception passed to it. Use this to
132
- # specify that an action _should_ raise an exception given appropriate
133
- # conditions.
134
- #
135
- # @example
136
- # describe ProfilesController do
137
- # it "raises a 403 when a non-admin user tries to view another user's profile" do
138
- # profile = create_profile
139
- # login_as profile.user
140
- #
141
- # expect do
142
- # bypass_rescue
143
- # get :show, :id => profile.id + 1
144
- # end.to raise_error(/403 Forbidden/)
145
- # end
146
- # end
147
- def bypass_rescue
148
- controller.extend(BypassRescue)
149
- end
199
+ private
150
200
 
151
- # If method is a named_route, delegates to the RouteSet associated with
152
- # this controller.
153
- def method_missing(method, *args, &block)
154
- if defined?(@routes) && @routes.named_routes.helpers.include?(method)
155
- controller.send(method, *args, &block)
156
- elsif defined?(@orig_routes) && @orig_routes && @orig_routes.named_routes.helpers.include?(method)
157
- controller.send(method, *args, &block)
158
- else
159
- super
201
+ def route_available?(method)
202
+ (defined?(@routes) && route_defined?(routes, method)) ||
203
+ (defined?(@orig_routes) && route_defined?(@orig_routes, method))
160
204
  end
161
- end
162
-
163
- included do
164
- subject { controller }
165
205
 
166
- before do
167
- self.routes = ::Rails.application.routes
168
- end
206
+ def route_defined?(routes, method)
207
+ return false if routes.nil?
169
208
 
170
- around do |ex|
171
- previous_allow_forgery_protection_value = ActionController::Base.allow_forgery_protection
172
- begin
173
- ActionController::Base.allow_forgery_protection = false
174
- ex.call
175
- ensure
176
- ActionController::Base.allow_forgery_protection = previous_allow_forgery_protection_value
209
+ if routes.named_routes.respond_to?(:route_defined?)
210
+ routes.named_routes.route_defined?(method)
211
+ else
212
+ routes.named_routes.helpers.include?(method)
177
213
  end
178
214
  end
179
215
  end
@@ -1,33 +1,53 @@
1
- module RSpec::Rails
2
- # Container module for routing spec functionality.
3
- module FeatureExampleGroup
4
- extend ActiveSupport::Concern
5
- include RSpec::Rails::RailsExampleGroup
1
+ module RSpec
2
+ module Rails
3
+ # @api public
4
+ # Container module for routing spec functionality.
5
+ module FeatureExampleGroup
6
+ extend ActiveSupport::Concern
7
+ include RSpec::Rails::RailsExampleGroup
6
8
 
7
- # Default host to be used in Rails route helpers if none is specified.
8
- DEFAULT_HOST = "www.example.com"
9
+ # Default host to be used in Rails route helpers if none is specified.
10
+ DEFAULT_HOST = "www.example.com"
9
11
 
10
- included do
11
- app = ::Rails.application
12
- if app.respond_to?(:routes)
13
- include app.routes.url_helpers if app.routes.respond_to?(:url_helpers)
14
- include app.routes.mounted_helpers if app.routes.respond_to?(:mounted_helpers)
12
+ included do
13
+ app = ::Rails.application
14
+ if app.respond_to?(:routes)
15
+ include app.routes.url_helpers if app.routes.respond_to?(:url_helpers)
16
+ include app.routes.mounted_helpers if app.routes.respond_to?(:mounted_helpers)
15
17
 
16
- if respond_to?(:default_url_options)
17
- default_url_options[:host] ||= ::RSpec::Rails::FeatureExampleGroup::DEFAULT_HOST
18
+ if respond_to?(:default_url_options)
19
+ default_url_options[:host] ||= ::RSpec::Rails::FeatureExampleGroup::DEFAULT_HOST
20
+ end
18
21
  end
19
22
  end
20
- end
21
23
 
22
- # Shim to check for presence of Capybara. Will delegate if present, raise
23
- # if not. We assume here that in most cases `visit` will be the first
24
- # Capybara method called in a spec.
25
- def visit(*)
26
- if defined?(super)
27
- super
28
- else
29
- raise "Capybara not loaded, please add it to your Gemfile:\n\ngem \"capybara\""
24
+ # Shim to check for presence of Capybara. Will delegate if present, raise
25
+ # if not. We assume here that in most cases `visit` will be the first
26
+ # Capybara method called in a spec.
27
+ def visit(*)
28
+ if defined?(super)
29
+ super
30
+ else
31
+ raise "Capybara not loaded, please add it to your Gemfile:\n\ngem \"capybara\""
32
+ end
30
33
  end
31
34
  end
32
35
  end
33
36
  end
37
+
38
+ unless RSpec.respond_to?(:feature)
39
+ opts = {
40
+ capybara_feature: true,
41
+ type: :feature,
42
+ skip: <<-EOT.squish
43
+ Feature specs require the Capybara (https://github.com/teamcapybara/capybara)
44
+ gem, version 2.13.0 or later.
45
+ EOT
46
+ }
47
+
48
+ RSpec.configure do |c|
49
+ c.alias_example_group_to :feature, opts
50
+ c.alias_example_to :scenario
51
+ c.alias_example_to :xscenario, skip: 'Temporarily skipped with xscenario'
52
+ end
53
+ end
@@ -1,38 +1,41 @@
1
1
  require 'rspec/rails/view_assigns'
2
2
 
3
- module RSpec::Rails
4
- # Container module for helper specs.
5
- module HelperExampleGroup
6
- extend ActiveSupport::Concern
7
- include RSpec::Rails::RailsExampleGroup
8
- include ActionView::TestCase::Behavior
9
- include RSpec::Rails::ViewAssigns
3
+ module RSpec
4
+ module Rails
5
+ # @api public
6
+ # Container module for helper specs.
7
+ module HelperExampleGroup
8
+ extend ActiveSupport::Concern
9
+ include RSpec::Rails::RailsExampleGroup
10
+ include ActionView::TestCase::Behavior
11
+ include RSpec::Rails::ViewAssigns
10
12
 
11
- # @private
12
- module ClassMethods
13
- def determine_default_helper_class(ignore)
14
- described_class
13
+ # @private
14
+ module ClassMethods
15
+ def determine_constant_from_test_name(_ignore)
16
+ described_class if yield(described_class)
17
+ end
15
18
  end
16
- end
17
19
 
18
- # Returns an instance of ActionView::Base with the helper being specified
19
- # mixed in, along with any of the built-in rails helpers.
20
- def helper
21
- _view.tap do |v|
22
- v.extend(ApplicationHelper) if defined?(ApplicationHelper)
23
- v.assign(view_assigns)
20
+ # Returns an instance of ActionView::Base with the helper being specified
21
+ # mixed in, along with any of the built-in rails helpers.
22
+ def helper
23
+ _view.tap do |v|
24
+ v.extend(ApplicationHelper) if defined?(ApplicationHelper)
25
+ v.assign(view_assigns)
26
+ end
24
27
  end
25
- end
26
28
 
27
29
  private
28
30
 
29
- def _controller_path(example)
30
- example.example_group.described_class.to_s.sub(/Helper/,'').underscore
31
- end
31
+ def _controller_path(example)
32
+ example.example_group.described_class.to_s.sub(/Helper/, '').underscore
33
+ end
32
34
 
33
- included do
34
- before do |example|
35
- controller.controller_path = _controller_path(example)
35
+ included do
36
+ before do |example|
37
+ controller.controller_path = _controller_path(example)
38
+ end
36
39
  end
37
40
  end
38
41
  end
@@ -0,0 +1,23 @@
1
+ module RSpec
2
+ module Rails
3
+ # @api public
4
+ # Container module for job spec functionality. It is only available if
5
+ # ActiveJob has been loaded before it.
6
+ module JobExampleGroup
7
+ # This blank module is only necessary for YARD processing. It doesn't
8
+ # handle the conditional `defined?` check below very well.
9
+ end
10
+ end
11
+ end
12
+
13
+ if defined?(ActiveJob)
14
+ module RSpec
15
+ module Rails
16
+ # Container module for job spec functionality.
17
+ module JobExampleGroup
18
+ extend ActiveSupport::Concern
19
+ include RSpec::Rails::RailsExampleGroup
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,80 @@
1
+ module RSpec
2
+ module Rails
3
+ # @api public
4
+ # Container module for mailbox spec functionality.
5
+ module MailboxExampleGroup
6
+ extend ActiveSupport::Concern
7
+
8
+ if RSpec::Rails::FeatureCheck.has_action_mailbox?
9
+ require 'action_mailbox/test_helper'
10
+ extend ::ActionMailbox::TestHelper
11
+
12
+ # @private
13
+ def self.create_inbound_email(arg)
14
+ case arg
15
+ when Hash
16
+ create_inbound_email_from_mail(**arg)
17
+ else
18
+ create_inbound_email_from_source(arg.to_s)
19
+ end
20
+ end
21
+ else
22
+ def self.create_inbound_email(_arg)
23
+ raise "Could not load ActionMailer::TestHelper"
24
+ end
25
+ end
26
+
27
+ class_methods do
28
+ # @private
29
+ def mailbox_class
30
+ described_class
31
+ end
32
+ end
33
+
34
+ included do
35
+ subject { described_class }
36
+ end
37
+
38
+ # @api public
39
+ # Passes if the inbound email was delivered
40
+ #
41
+ # @example
42
+ # inbound_email = process(args)
43
+ # expect(inbound_email).to have_been_delivered
44
+ def have_been_delivered
45
+ satisfy('have been delivered', &:delivered?)
46
+ end
47
+
48
+ # @api public
49
+ # Passes if the inbound email bounced during processing
50
+ #
51
+ # @example
52
+ # inbound_email = process(args)
53
+ # expect(inbound_email).to have_bounced
54
+ def have_bounced
55
+ satisfy('have bounced', &:bounced?)
56
+ end
57
+
58
+ # @api public
59
+ # Passes if the inbound email failed to process
60
+ #
61
+ # @example
62
+ # inbound_email = process(args)
63
+ # expect(inbound_email).to have_failed
64
+ def have_failed
65
+ satisfy('have failed', &:failed?)
66
+ end
67
+
68
+ # Process an inbound email message directly, bypassing routing.
69
+ #
70
+ # @param message [Hash, Mail::Message] a mail message or hash of
71
+ # attributes used to build one
72
+ # @return [ActionMailbox::InboundMessage]
73
+ def process(message)
74
+ MailboxExampleGroup.create_inbound_email(message).tap do |mail|
75
+ self.class.mailbox_class.receive(mail)
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
@@ -1,31 +1,36 @@
1
- module RSpec::Rails
2
- # Container module for mailer spec functionality. It is only available if
3
- # ActionMailer has been loaded before it.
4
- module MailerExampleGroup
5
- # This blank module is only necessary for YARD processing. It doesn't
6
- # handle the conditional `defined?` check below very well.
1
+ module RSpec
2
+ module Rails
3
+ # @api public
4
+ # Container module for mailer spec functionality. It is only available if
5
+ # ActionMailer has been loaded before it.
6
+ module MailerExampleGroup
7
+ # This blank module is only necessary for YARD processing. It doesn't
8
+ # handle the conditional `defined?` check below very well.
9
+ end
7
10
  end
8
11
  end
9
12
 
10
13
  if defined?(ActionMailer)
11
- module RSpec::Rails
12
- # Container module for mailer spec functionality.
13
- module MailerExampleGroup
14
- extend ActiveSupport::Concern
15
- include RSpec::Rails::RailsExampleGroup
16
- include ActionMailer::TestCase::Behavior
14
+ module RSpec
15
+ module Rails
16
+ # Container module for mailer spec functionality.
17
+ module MailerExampleGroup
18
+ extend ActiveSupport::Concern
19
+ include RSpec::Rails::RailsExampleGroup
20
+ include ActionMailer::TestCase::Behavior
17
21
 
18
- included do
19
- include ::Rails.application.routes.url_helpers
20
- options = ::Rails.configuration.action_mailer.default_url_options
21
- options.each { |key, value| default_url_options[key] = value } if options
22
- end
22
+ included do
23
+ include ::Rails.application.routes.url_helpers
24
+ options = ::Rails.configuration.action_mailer.default_url_options || {}
25
+ options.each { |key, value| default_url_options[key] = value }
26
+ end
23
27
 
24
- # Class-level DSL for mailer specs.
25
- module ClassMethods
26
- # Alias for `described_class`.
27
- def mailer_class
28
- described_class
28
+ # Class-level DSL for mailer specs.
29
+ module ClassMethods
30
+ # Alias for `described_class`.
31
+ def mailer_class
32
+ described_class
33
+ end
29
34
  end
30
35
  end
31
36
  end