rspec-rails 2.14.2 → 4.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (112) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data/.document +1 -1
  4. data/.yardopts +4 -2
  5. data/Capybara.md +6 -57
  6. data/Changelog.md +715 -37
  7. data/{License.txt → LICENSE.md} +5 -2
  8. data/README.md +287 -362
  9. data/lib/generators/rspec/channel/channel_generator.rb +12 -0
  10. data/lib/generators/rspec/channel/templates/channel_spec.rb.erb +7 -0
  11. data/lib/generators/rspec/controller/controller_generator.rb +23 -5
  12. data/lib/generators/rspec/controller/templates/controller_spec.rb +5 -5
  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 +2 -2
  16. data/lib/generators/rspec/feature/feature_generator.rb +29 -0
  17. data/lib/generators/rspec/feature/templates/feature_singular_spec.rb +5 -0
  18. data/lib/generators/rspec/feature/templates/feature_spec.rb +5 -0
  19. data/lib/generators/rspec/generator/generator_generator.rb +24 -0
  20. data/lib/generators/rspec/generator/templates/generator_spec.rb +6 -0
  21. data/lib/generators/rspec/helper/helper_generator.rb +2 -1
  22. data/lib/generators/rspec/helper/templates/helper_spec.rb +2 -2
  23. data/lib/generators/rspec/install/install_generator.rb +44 -5
  24. data/lib/generators/rspec/install/templates/spec/rails_helper.rb +79 -0
  25. data/lib/generators/rspec/integration/integration_generator.rb +8 -13
  26. data/lib/generators/rspec/integration/templates/request_spec.rb +4 -9
  27. data/lib/generators/rspec/job/job_generator.rb +12 -0
  28. data/lib/generators/rspec/{observer/templates/observer_spec.rb → job/templates/job_spec.rb.erb} +2 -2
  29. data/lib/generators/rspec/mailbox/mailbox_generator.rb +14 -0
  30. data/lib/generators/rspec/mailbox/templates/mailbox_spec.rb.erb +7 -0
  31. data/lib/generators/rspec/mailer/mailer_generator.rb +9 -1
  32. data/lib/generators/rspec/mailer/templates/mailer_spec.rb +7 -7
  33. data/lib/generators/rspec/mailer/templates/preview.rb +13 -0
  34. data/lib/generators/rspec/model/model_generator.rb +21 -6
  35. data/lib/generators/rspec/model/templates/fixtures.yml +1 -1
  36. data/lib/generators/rspec/model/templates/model_spec.rb +2 -2
  37. data/lib/generators/rspec/request/request_generator.rb +10 -0
  38. data/lib/generators/rspec/scaffold/scaffold_generator.rb +88 -148
  39. data/lib/generators/rspec/scaffold/templates/api_controller_spec.rb +129 -0
  40. data/lib/generators/rspec/scaffold/templates/api_request_spec.rb +131 -0
  41. data/lib/generators/rspec/scaffold/templates/controller_spec.rb +105 -80
  42. data/lib/generators/rspec/scaffold/templates/edit_spec.rb +10 -14
  43. data/lib/generators/rspec/scaffold/templates/index_spec.rb +5 -12
  44. data/lib/generators/rspec/scaffold/templates/new_spec.rb +11 -15
  45. data/lib/generators/rspec/scaffold/templates/request_spec.rb +137 -0
  46. data/lib/generators/rspec/scaffold/templates/routing_spec.rb +19 -12
  47. data/lib/generators/rspec/scaffold/templates/show_spec.rb +5 -12
  48. data/lib/generators/rspec/system/system_generator.rb +26 -0
  49. data/lib/generators/rspec/system/templates/system_spec.rb +9 -0
  50. data/lib/generators/rspec/view/templates/view_spec.rb +2 -2
  51. data/lib/generators/rspec/view/view_generator.rb +3 -2
  52. data/lib/generators/rspec.rb +18 -10
  53. data/lib/rspec/rails/active_record.rb +25 -0
  54. data/lib/rspec/rails/adapters.rb +49 -47
  55. data/lib/rspec/rails/configuration.rb +194 -0
  56. data/lib/rspec/rails/example/channel_example_group.rb +93 -0
  57. data/lib/rspec/rails/example/controller_example_group.rb +188 -138
  58. data/lib/rspec/rails/example/feature_example_group.rb +43 -20
  59. data/lib/rspec/rails/example/helper_example_group.rb +28 -26
  60. data/lib/rspec/rails/example/job_example_group.rb +23 -0
  61. data/lib/rspec/rails/example/mailbox_example_group.rb +80 -0
  62. data/lib/rspec/rails/example/mailer_example_group.rb +30 -14
  63. data/lib/rspec/rails/example/model_example_group.rb +8 -7
  64. data/lib/rspec/rails/example/rails_example_group.rb +4 -2
  65. data/lib/rspec/rails/example/request_example_group.rb +23 -16
  66. data/lib/rspec/rails/example/routing_example_group.rb +49 -40
  67. data/lib/rspec/rails/example/system_example_group.rb +125 -0
  68. data/lib/rspec/rails/example/view_example_group.rb +178 -134
  69. data/lib/rspec/rails/example.rb +4 -33
  70. data/lib/rspec/rails/extensions/active_record/proxy.rb +5 -11
  71. data/lib/rspec/rails/extensions.rb +0 -1
  72. data/lib/rspec/rails/feature_check.rb +47 -0
  73. data/lib/rspec/rails/file_fixture_support.rb +17 -0
  74. data/lib/rspec/rails/fixture_file_upload_support.rb +35 -0
  75. data/lib/rspec/rails/fixture_support.rb +54 -23
  76. data/lib/rspec/rails/matchers/action_cable/have_broadcasted_to.rb +170 -0
  77. data/lib/rspec/rails/matchers/action_cable/have_streams.rb +58 -0
  78. data/lib/rspec/rails/matchers/action_cable.rb +65 -0
  79. data/lib/rspec/rails/matchers/action_mailbox.rb +64 -0
  80. data/lib/rspec/rails/matchers/active_job.rb +465 -0
  81. data/lib/rspec/rails/matchers/base_matcher.rb +179 -0
  82. data/lib/rspec/rails/matchers/be_a_new.rb +69 -62
  83. data/lib/rspec/rails/matchers/be_new_record.rb +24 -21
  84. data/lib/rspec/rails/matchers/be_valid.rb +42 -33
  85. data/lib/rspec/rails/matchers/have_enqueued_mail.rb +198 -0
  86. data/lib/rspec/rails/matchers/have_http_status.rb +385 -0
  87. data/lib/rspec/rails/matchers/have_rendered.rb +55 -31
  88. data/lib/rspec/rails/matchers/redirect_to.rb +30 -29
  89. data/lib/rspec/rails/matchers/relation_match_array.rb +2 -2
  90. data/lib/rspec/rails/matchers/routing_matchers.rb +107 -93
  91. data/lib/rspec/rails/matchers.rb +22 -14
  92. data/lib/rspec/rails/tasks/rspec.rake +8 -18
  93. data/lib/rspec/rails/vendor/capybara.rb +12 -11
  94. data/lib/rspec/rails/version.rb +3 -1
  95. data/lib/rspec/rails/view_assigns.rb +18 -18
  96. data/lib/rspec/rails/view_path_builder.rb +29 -0
  97. data/lib/rspec/rails/view_rendering.rb +100 -63
  98. data/lib/rspec/rails/view_spec_methods.rb +56 -0
  99. data/lib/rspec/rails.rb +10 -10
  100. data/lib/rspec-rails.rb +67 -3
  101. data.tar.gz.sig +0 -0
  102. metadata +121 -94
  103. metadata.gz.sig +0 -0
  104. data/lib/autotest/rails_rspec2.rb +0 -85
  105. data/lib/generators/rspec/install/templates/.rspec +0 -1
  106. data/lib/generators/rspec/install/templates/spec/spec_helper.rb.tt +0 -49
  107. data/lib/generators/rspec/observer/observer_generator.rb +0 -12
  108. data/lib/rspec/rails/extensions/active_record/base.rb +0 -58
  109. data/lib/rspec/rails/matchers/have_extension.rb +0 -36
  110. data/lib/rspec/rails/mocks.rb +0 -274
  111. data/lib/rspec/rails/module_inclusion.rb +0 -19
  112. data/lib/rspec/rails/vendor/webrat.rb +0 -33
@@ -1,164 +1,214 @@
1
- RSpec.configure do |config|
2
- config.add_setting :infer_base_class_for_anonymous_controllers, :default => false
3
- end
4
-
5
- module RSpec::Rails
6
- module ControllerExampleGroup
7
- extend ActiveSupport::Concern
8
- include RSpec::Rails::RailsExampleGroup
9
- include ActionController::TestCase::Behavior
10
- include RSpec::Rails::ViewRendering
11
- include RSpec::Rails::Matchers::RedirectTo
12
- include RSpec::Rails::Matchers::RenderTemplate
13
- include RSpec::Rails::Matchers::RoutingMatchers
14
- include RSpec::Rails::AssertionDelegator.new(ActionDispatch::Assertions::RoutingAssertions)
15
-
16
- module ClassMethods
17
- # @private
18
- def controller_class
19
- described_class
20
- end
1
+ module RSpec
2
+ module Rails
3
+ # @private
4
+ ControllerAssertionDelegator = RSpec::Rails::AssertionDelegator.new(
5
+ ActionDispatch::Assertions::RoutingAssertions
6
+ )
7
+
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
25
+ end
21
26
 
22
- # Supports a simple DSL for specifying behavior of ApplicationController.
23
- # Creates an anonymous subclass of ApplicationController and evals the
24
- # `body` in that context. Also sets up implicit routes for this
25
- # controller, that are separate from those defined in "config/routes.rb".
26
- #
27
- # @note Due to Ruby 1.8 scoping rules in anoymous subclasses, constants
28
- # defined in `ApplicationController` must be fully qualified (e.g.
29
- # `ApplicationController::AccessDenied`) in the block passed to the
30
- # `controller` method. Any instance methods, filters, etc, that are
31
- # defined in `ApplicationController`, however, are accessible from
32
- # within the block.
33
- #
34
- # @example
35
- #
36
- # describe ApplicationController do
37
- # controller do
38
- # def index
39
- # raise ApplicationController::AccessDenied
40
- # end
41
- # end
42
- #
43
- # describe "handling AccessDenied exceptions" do
44
- # it "redirects to the /401.html page" do
45
- # get :index
46
- # response.should redirect_to("/401.html")
47
- # end
48
- # end
49
- # end
50
- #
51
- # If you would like to spec a subclass of ApplicationController, call
52
- # controller like so:
53
- #
54
- # controller(ApplicationControllerSubclass) do
55
- # # ....
56
- # end
57
- def controller(base_class = nil, &body)
58
- root_controller = defined?(ApplicationController) ? ApplicationController : ActionController::Base
59
- base_class ||= RSpec.configuration.infer_base_class_for_anonymous_controllers? ?
60
- controller_class :
61
- root_controller
62
-
63
- metadata[:example_group][:described_class] = Class.new(base_class) do
64
- def self.name; "AnonymousController"; end
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
75
+ end
76
+ end
77
+ new_controller_class.class_exec(&body)
78
+ (class << self; self; end).__send__(:define_method, :controller_class) { new_controller_class }
79
+
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
101
+ end
102
+ end
103
+
104
+ after do
105
+ self.routes = @orig_routes
106
+ @orig_routes = nil
107
+ end
65
108
  end
66
- metadata[:example_group][:described_class].class_eval(&body)
67
109
 
68
- before do
69
- @orig_routes = self.routes
70
- self.routes = ActionDispatch::Routing::RouteSet.new.tap { |r|
71
- r.draw { resources :anonymous }
72
- }
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
73
123
  end
124
+ end
125
+
126
+ # @!attribute [r]
127
+ # Returns the controller object instance under test.
128
+ attr_reader :controller
74
129
 
75
- after do
76
- self.routes = @orig_routes
77
- @orig_routes = nil
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
78
146
  end
79
147
  end
80
148
 
81
- # Specifies the routeset that will be used for the example group. This
82
- # is most useful when testing Rails engines.
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.
83
153
  #
84
154
  # @example
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
85
159
  #
86
- # describe MyEngine::PostsController do
87
- # routes { MyEngine::Engine.routes }
88
- #
89
- # # ...
160
+ # expect do
161
+ # bypass_rescue
162
+ # get :show, id: profile.id + 1
163
+ # end.to raise_error(/403 Forbidden/)
164
+ # end
90
165
  # end
91
- def routes(&blk)
92
- before do
93
- 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
94
177
  end
95
178
  end
96
- end
97
179
 
98
- attr_reader :controller, :routes
180
+ included do
181
+ subject { controller }
99
182
 
100
- # @api private
101
- def routes=(routes)
102
- @routes = routes
103
- assertion_instance.instance_variable_set(:@routes, routes)
104
- end
183
+ before do
184
+ self.routes = ::Rails.application.routes
185
+ end
105
186
 
106
- module BypassRescue
107
- def rescue_with_handler(exception)
108
- raise exception
187
+ around do |ex|
188
+ previous_allow_forgery_protection_value = ActionController::Base.allow_forgery_protection
189
+ begin
190
+ ActionController::Base.allow_forgery_protection = false
191
+ ex.call
192
+ ensure
193
+ ActionController::Base.allow_forgery_protection = previous_allow_forgery_protection_value
194
+ end
195
+ end
109
196
  end
110
- end
111
197
 
112
- # Extends the controller with a module that overrides
113
- # `rescue_with_handler` to raise the exception passed to it. Use this to
114
- # specify that an action _should_ raise an exception given appropriate
115
- # conditions.
116
- #
117
- # @example
118
- #
119
- # describe ProfilesController do
120
- # it "raises a 403 when a non-admin user tries to view another user's profile" do
121
- # profile = create_profile
122
- # login_as profile.user
123
- #
124
- # expect do
125
- # bypass_rescue
126
- # get :show, :id => profile.id + 1
127
- # end.to raise_error(/403 Forbidden/)
128
- # end
129
- # end
130
- def bypass_rescue
131
- controller.extend(BypassRescue)
132
- end
198
+ private
133
199
 
134
- # If method is a named_route, delegates to the RouteSet associated with
135
- # this controller.
136
- def method_missing(method, *args, &block)
137
- if @routes && @routes.named_routes.helpers.include?(method)
138
- controller.send(method, *args, &block)
139
- elsif defined?(@orig_routes) && @orig_routes && @orig_routes.named_routes.helpers.include?(method)
140
- controller.send(method, *args, &block)
141
- else
142
- super
200
+ def route_available?(method)
201
+ (defined?(@routes) && route_defined?(routes, method)) ||
202
+ (defined?(@orig_routes) && route_defined?(@orig_routes, method))
143
203
  end
144
- end
145
-
146
- included do
147
- subject { controller }
148
204
 
149
- metadata[:type] = :controller
150
-
151
- before do
152
- self.routes = ::Rails.application.routes
153
- end
205
+ def route_defined?(routes, method)
206
+ return false if routes.nil?
154
207
 
155
- around do |ex|
156
- previous_allow_forgery_protection_value = ActionController::Base.allow_forgery_protection
157
- begin
158
- ActionController::Base.allow_forgery_protection = false
159
- ex.call
160
- ensure
161
- ActionController::Base.allow_forgery_protection = previous_allow_forgery_protection_value
208
+ if routes.named_routes.respond_to?(:route_defined?)
209
+ routes.named_routes.route_defined?(method)
210
+ else
211
+ routes.named_routes.helpers.include?(method)
162
212
  end
163
213
  end
164
214
  end
@@ -1,30 +1,53 @@
1
- module RSpec::Rails
2
- module FeatureExampleGroup
3
- extend ActiveSupport::Concern
4
- 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
5
8
 
6
- 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"
7
11
 
8
- included do
9
- metadata[:type] = :feature
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)
10
17
 
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)
15
-
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
- def visit(*)
23
- if defined?(super)
24
- super
25
- else
26
- 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
27
33
  end
28
34
  end
29
35
  end
30
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,39 +1,41 @@
1
1
  require 'rspec/rails/view_assigns'
2
2
 
3
- module RSpec::Rails
4
- module HelperExampleGroup
5
- extend ActiveSupport::Concern
6
- include RSpec::Rails::RailsExampleGroup
7
- include ActionView::TestCase::Behavior
8
- 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
9
12
 
10
- module ClassMethods
11
- # @api private
12
- def determine_default_helper_class(ignore)
13
- described_class
13
+ # @private
14
+ module ClassMethods
15
+ def determine_constant_from_test_name(_ignore)
16
+ described_class if yield(described_class)
17
+ end
14
18
  end
15
- end
16
19
 
17
- # Returns an instance of ActionView::Base with the helper being specified
18
- # mixed in, along with any of the built-in rails helpers.
19
- def helper
20
- _view.tap do |v|
21
- v.extend(ApplicationHelper) if defined?(ApplicationHelper)
22
- 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
23
27
  end
24
- end
25
28
 
26
29
  private
27
30
 
28
- def _controller_path
29
- example.example_group.described_class.to_s.sub(/Helper/,'').underscore
30
- end
31
-
32
- included do
33
- metadata[:type] = :helper
31
+ def _controller_path(example)
32
+ example.example_group.described_class.to_s.sub(/Helper/, '').underscore
33
+ end
34
34
 
35
- before do
36
- controller.controller_path = _controller_path
35
+ included do
36
+ before do |example|
37
+ controller.controller_path = _controller_path(example)
38
+ end
37
39
  end
38
40
  end
39
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 [ActionMaibox::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,20 +1,36 @@
1
- if defined?(ActionMailer)
2
- module RSpec::Rails
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.
3
6
  module MailerExampleGroup
4
- extend ActiveSupport::Concern
5
- include RSpec::Rails::RailsExampleGroup
6
- include ActionMailer::TestCase::Behavior
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
7
12
 
8
- included do
9
- metadata[:type] = :mailer
10
- include ::Rails.application.routes.url_helpers
11
- options = ::Rails.configuration.action_mailer.default_url_options
12
- options.each { |key, value| default_url_options[key] = value } if options
13
- end
13
+ if defined?(ActionMailer)
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
21
+
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
14
27
 
15
- module ClassMethods
16
- def mailer_class
17
- 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
18
34
  end
19
35
  end
20
36
  end
@@ -1,10 +1,11 @@
1
- module RSpec::Rails
2
- module ModelExampleGroup
3
- extend ActiveSupport::Concern
4
- include RSpec::Rails::RailsExampleGroup
5
-
6
- included do
7
- metadata[:type] = :model
1
+ module RSpec
2
+ module Rails
3
+ # @api public
4
+ # Container class for model spec functionality. Does not provide anything
5
+ # special over the common RailsExampleGroup currently.
6
+ module ModelExampleGroup
7
+ extend ActiveSupport::Concern
8
+ include RSpec::Rails::RailsExampleGroup
8
9
  end
9
10
  end
10
11
  end