rspec-rails 6.1.1 → 7.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/Changelog.md +50 -3
- data/README.md +27 -25
- data/lib/generators/rspec/generator/generator_generator.rb +2 -2
- data/lib/generators/rspec/generator/templates/generator_spec.rb +1 -2
- data/lib/generators/rspec/install/templates/spec/rails_helper.rb +7 -2
- data/lib/generators/rspec/mailer/mailer_generator.rb +4 -2
- data/lib/generators/rspec/mailer/templates/preview.rb +3 -3
- data/lib/generators/rspec/scaffold/templates/index_spec.rb +1 -1
- data/lib/rspec/rails/example/mailbox_example_group.rb +1 -1
- data/lib/rspec/rails/example/rails_example_group.rb +2 -0
- data/lib/rspec/rails/example/routing_example_group.rb +0 -2
- data/lib/rspec/rails/example/system_example_group.rb +9 -1
- data/lib/rspec/rails/fixture_support.rb +1 -2
- data/lib/rspec/rails/matchers/active_job.rb +60 -8
- data/lib/rspec/rails/matchers/have_enqueued_mail.rb +31 -0
- data/lib/rspec/rails/matchers/have_http_status.rb +3 -7
- data/lib/rspec/rails/tasks/rspec.rake +3 -1
- data/lib/rspec/rails/version.rb +1 -1
- data/lib/rspec-rails.rb +18 -0
- data.tar.gz.sig +0 -0
- metadata +20 -20
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e12619053ed39f2f0fed4bc0aed2b2e552e400315663632d97cf9a82e2eaa5d3
|
4
|
+
data.tar.gz: 7bde5b94d9f990a0d9d08143529ce3e25b9df1df2cf62c216515c0cc6e96cd4c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fa5533f32e4ffaf30b13d83677aff9170bf57c42a2c6ec9a591de3f422f73f719a6b575fb14efe8e54f7b8fbc389aa7c7e0f39710017dc8b02834f8dbb6b0aa3
|
7
|
+
data.tar.gz: '094c02d867dba7258ea54da266403929508f2601c0ba1e8a8c579e01c6a2b200aaa688b5a8fed58145c2bf6cd53ed4799fecba36dc9acdb23e06d75eea5b2323'
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/Changelog.md
CHANGED
@@ -1,5 +1,52 @@
|
|
1
1
|
### Development
|
2
|
-
[Full Changelog](https://github.com/rspec/rspec-rails/compare/
|
2
|
+
[Full Changelog](https://github.com/rspec/rspec-rails/compare/v7.0.0...7-0-maintenance)
|
3
|
+
|
4
|
+
### 7.0.0 / 2024-09-02
|
5
|
+
[Full Changelog](https://github.com/rspec/rspec-rails/compare/v6.1.5...v7.0.0)
|
6
|
+
|
7
|
+
Enhancements:
|
8
|
+
|
9
|
+
* Change default driver for system specs on Rails 7.2 to match its default.
|
10
|
+
(Steve Polito, #2746)
|
11
|
+
* Verify ActiveJob arguments by comparing to the method signature. (Oli Peate, #2745)
|
12
|
+
* Add suggestion to rails_helper.rb to skip when not in test most. (Glauco Custódio, #2751)
|
13
|
+
* Add `at_priority` qualifier to `have_enqueued_job` set of matchers. (mbajur, #2759)
|
14
|
+
* Add spec directories to `rails stats` on Rails main / 8.0.0. (Petrik de Heus, #2781)
|
15
|
+
|
16
|
+
### 6.1.5 / 2024-09-02
|
17
|
+
[Full Changelog](https://github.com/rspec/rspec-rails/compare/v6.1.4...v6.1.5)
|
18
|
+
|
19
|
+
Bug Fixes:
|
20
|
+
|
21
|
+
* Restore old order of requiring support files. (Franz Liedke, #2785)
|
22
|
+
* Prevent running `rake spec:statsetup` on Rails main / 8.0.0. (Petrik de Heus, #2781)
|
23
|
+
|
24
|
+
### 6.1.4 / 2024-08-15
|
25
|
+
[Full Changelog](https://github.com/rspec/rspec-rails/compare/v6.1.3...v6.1.4)
|
26
|
+
|
27
|
+
Bug Fixes:
|
28
|
+
|
29
|
+
* Prevent `have_http_status` matcher raising an error when encountering a raw `Rack::MockResponse`.
|
30
|
+
(Christophe Bliard, #2771)
|
31
|
+
* Move Rails version conditional from index scaffold generated file to template. (Matt Jankowski, #2777)
|
32
|
+
|
33
|
+
### 6.1.3 / 2024-06-19
|
34
|
+
[Full Changelog](https://github.com/rspec/rspec-rails/compare/v6.1.2...v6.1.3)
|
35
|
+
|
36
|
+
Bug Fixes:
|
37
|
+
|
38
|
+
* Reset `ActiveSupport::CurrentAttributes` between examples. (Javier Julio, #2752)
|
39
|
+
* Fix a broken link in generated mailer previews. (Chiara Núñez, #2764)
|
40
|
+
* Fix `have_status_code` behaviour with deprecated status names by delegating
|
41
|
+
to `Rack::Utils.status_code/1` to set the expected status code. (Darren Boyd, #2765)
|
42
|
+
|
43
|
+
### 6.1.2 / 2024-03-19
|
44
|
+
[Full Changelog](https://github.com/rspec/rspec-rails/compare/v6.1.1...v6.1.2)
|
45
|
+
|
46
|
+
Bug Fixes:
|
47
|
+
|
48
|
+
* Fix generated mailer paths to match Rails convention. (Patrício dos Santos, #2735)
|
49
|
+
* Fix class in template for generator specs. (Nicolas Buduroi, #2744)
|
3
50
|
|
4
51
|
### 6.1.1 / 2024-01-25
|
5
52
|
[Full Changelog](https://github.com/rspec/rspec-rails/compare/v6.1.0...v6.1.1)
|
@@ -181,7 +228,7 @@ Enhancements:
|
|
181
228
|
(Eloy Espinaco, Luka Lüdicke, #2355, #2356, #2378)
|
182
229
|
* Generated scaffold now includes engine route helpers when inside a mountable engine.
|
183
230
|
(Andrew W. Lee, #2372)
|
184
|
-
* Improve request spec "controller"
|
231
|
+
* Improve request spec "controller" scaffold when no action is specified.
|
185
232
|
(Thomas Hareau, #2399)
|
186
233
|
* Introduce testing snippets concept (Phil Pirozhkov, Benoit Tigeot, #2423)
|
187
234
|
* Prevent collisions with `let(:name)` for Rails 6.1 and `let(:method_name)` on older
|
@@ -584,7 +631,7 @@ Enhancements:
|
|
584
631
|
* Add support for PATCH to route specs created via scaffold. (Igor Zubkov, #1336)
|
585
632
|
* Improve controller and routing spec calls to `routes` by using `yield`
|
586
633
|
instead of `call`. (Anton Davydov, #1308)
|
587
|
-
* Add support for `ActiveJob` specs as standard `RSpec::Rails::
|
634
|
+
* Add support for `ActiveJob` specs as standard `RSpec::Rails::RailsExampleGroup`s
|
588
635
|
via both `type: :job` and inferring type from spec directory `spec/jobs`.
|
589
636
|
(Gabe Martin-Dempesy, #1361)
|
590
637
|
* Include `RSpec::Rails::FixtureSupport` into example groups using metadata
|
data/README.md
CHANGED
@@ -9,7 +9,8 @@ detailed explanations of how the application is supposed to behave,
|
|
9
9
|
expressed in plain English.
|
10
10
|
|
11
11
|
According to [RSpec Rails new versioning strategy][] use:
|
12
|
-
* **[`rspec-rails`
|
12
|
+
* **[`rspec-rails` 7.x][]** for Rails 7.x.
|
13
|
+
* **[`rspec-rails` 6.x][]** for Rails 6.1.
|
13
14
|
* **[`rspec-rails` 5.x][]** for Rails 5.2 or 6.x.
|
14
15
|
* **[`rspec-rails` 4.x][]** for Rails from 5.x or 6.x.
|
15
16
|
* **[`rspec-rails` 3.x][]** for Rails earlier than 5.0.
|
@@ -26,11 +27,12 @@ According to [RSpec Rails new versioning strategy][] use:
|
|
26
27
|
[`rspec-rails` 4.x]: https://github.com/rspec/rspec-rails/tree/4-1-maintenance
|
27
28
|
[`rspec-rails` 5.x]: https://github.com/rspec/rspec-rails/tree/5-1-maintenance
|
28
29
|
[`rspec-rails` 6.x]: https://github.com/rspec/rspec-rails/tree/6-1-maintenance
|
30
|
+
[`rspec-rails` 7.x]: https://github.com/rspec/rspec-rails/tree/7-0-maintenance
|
29
31
|
[RSpec Rails new versioning strategy]: https://github.com/rspec/rspec-rails/blob/main/rfcs/versioning-strategy.md
|
30
32
|
|
31
33
|
## Installation
|
32
34
|
|
33
|
-
**IMPORTANT** This README / branch refers to the
|
35
|
+
**IMPORTANT** This README / branch refers to the 7.0.x stable release series, only bugfixes from this series will
|
34
36
|
be added here. See the [`main` branch on Github](https://github.com/rspec/rspec-rails/tree/main) if you want or
|
35
37
|
require the latest unstable features.
|
36
38
|
|
@@ -40,7 +42,7 @@ require the latest unstable features.
|
|
40
42
|
```ruby
|
41
43
|
# Run against this stable release
|
42
44
|
group :development, :test do
|
43
|
-
gem 'rspec-rails', '~>
|
45
|
+
gem 'rspec-rails', '~> 7.0.0'
|
44
46
|
end
|
45
47
|
|
46
48
|
# Or, run against the main branch
|
@@ -87,7 +89,7 @@ read the [`rspec-rails` upgrade notes][] to find out what to watch out for.
|
|
87
89
|
|
88
90
|
Be sure to check the general [RSpec upgrade notes][] as well.
|
89
91
|
|
90
|
-
[`rspec-rails` upgrade notes]: https://rspec.info/features/
|
92
|
+
[`rspec-rails` upgrade notes]: https://rspec.info/features/7-0/rspec-rails/upgrade
|
91
93
|
[RSpec upgrade notes]: https://rspec.info/upgrading-from-rspec-2/
|
92
94
|
|
93
95
|
## Usage
|
@@ -209,22 +211,22 @@ to test the various parts of a Rails system:
|
|
209
211
|
Follow the links above for examples of how each matcher is used.
|
210
212
|
|
211
213
|
[the matchers that come standard in RSpec]: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers
|
212
|
-
[`be_a_new`]: https://rspec.info/features/
|
213
|
-
[`render_template`]: https://rspec.info/features/
|
214
|
-
[`redirect_to`]: https://rspec.info/features/
|
215
|
-
[`route_to`]: https://rspec.info/features/
|
216
|
-
[`be_routable`]: https://rspec.info/features/
|
217
|
-
[`have_http_status`]: https://rspec.info/features/
|
218
|
-
[`match_array`]: https://rspec.info/features/
|
219
|
-
[`have_been_enqueued`]: https://rspec.info/features/
|
220
|
-
[`have_enqueued_job`]: https://rspec.info/features/
|
214
|
+
[`be_a_new`]: https://rspec.info/features/7-0/rspec-rails/matchers/new-record-matcher
|
215
|
+
[`render_template`]: https://rspec.info/features/7-0/rspec-rails/matchers/render-template-matcher
|
216
|
+
[`redirect_to`]: https://rspec.info/features/7-0/rspec-rails/matchers/redirect-to-matcher
|
217
|
+
[`route_to`]: https://rspec.info/features/7-0/rspec-rails/routing-specs/route-to-matcher
|
218
|
+
[`be_routable`]: https://rspec.info/features/7-0/rspec-rails/routing-specs/be-routable-matcher
|
219
|
+
[`have_http_status`]: https://rspec.info/features/7-0/rspec-rails/matchers/have-http-status-matcher
|
220
|
+
[`match_array`]: https://rspec.info/features/7-0/rspec-rails/matchers/relation-match-array
|
221
|
+
[`have_been_enqueued`]: https://rspec.info/features/7-0/rspec-rails/matchers/have-been-enqueued-matcher
|
222
|
+
[`have_enqueued_job`]: https://rspec.info/features/7-0/rspec-rails/matchers/have-enqueued-job-matcher
|
221
223
|
|
222
224
|
### What else does RSpec Rails add?
|
223
225
|
|
224
226
|
For a comprehensive look at RSpec Rails’ features,
|
225
227
|
read the [official Cucumber documentation][].
|
226
228
|
|
227
|
-
[official Cucumber documentation]: https://rspec.info/features/
|
229
|
+
[official Cucumber documentation]: https://rspec.info/features/7-0/rspec-rails
|
228
230
|
|
229
231
|
## What tests should I write?
|
230
232
|
|
@@ -269,20 +271,20 @@ RSpec.describe User, type: :model do
|
|
269
271
|
...
|
270
272
|
```
|
271
273
|
|
272
|
-
[request]: https://rspec.info/features/
|
273
|
-
[feature]: https://rspec.info/features/
|
274
|
-
[system]: https://rspec.info/features/
|
275
|
-
[model]: https://rspec.info/features/
|
276
|
-
[controller]: https://rspec.info/features/
|
277
|
-
[mailer]: https://rspec.info/features/
|
278
|
-
[job]: https://rspec.info/features/
|
279
|
-
[view]: https://rspec.info/features/
|
280
|
-
[routing]: https://rspec.info/features/
|
281
|
-
[helper]: https://rspec.info/features/
|
274
|
+
[request]: https://rspec.info/features/7-0/rspec-rails/request-specs/request-spec
|
275
|
+
[feature]: https://rspec.info/features/7-0/rspec-rails/feature-specs/feature-spec
|
276
|
+
[system]: https://rspec.info/features/7-0/rspec-rails/system-specs/system-specs
|
277
|
+
[model]: https://rspec.info/features/7-0/rspec-rails/model-specs
|
278
|
+
[controller]: https://rspec.info/features/7-0/rspec-rails/controller-specs
|
279
|
+
[mailer]: https://rspec.info/features/7-0/rspec-rails/mailer-specs
|
280
|
+
[job]: https://rspec.info/features/7-0/rspec-rails/job-specs/job-spec
|
281
|
+
[view]: https://rspec.info/features/7-0/rspec-rails/view-specs/view-spec
|
282
|
+
[routing]: https://rspec.info/features/7-0/rspec-rails/routing-specs
|
283
|
+
[helper]: https://rspec.info/features/7-0/rspec-rails/helper-specs/helper-spec
|
282
284
|
[`ActionDispatch::IntegrationTest`]: https://api.rubyonrails.org/classes/ActionDispatch/IntegrationTest.html
|
283
285
|
[`ActionDispatch::SystemTestCase`]: https://api.rubyonrails.org/classes/ActionDispatch/SystemTestCase.html
|
284
286
|
[`ActionController::TestCase`]: https://api.rubyonrails.org/classes/ActionController/TestCase.html
|
285
|
-
[in the appropriate folder]: https://rspec.info/features/
|
287
|
+
[in the appropriate folder]: https://rspec.info/features/7-0/rspec-rails/directory-structure
|
286
288
|
|
287
289
|
### System specs, feature specs, request specs–what’s the difference?
|
288
290
|
|
@@ -4,7 +4,7 @@ module Rspec
|
|
4
4
|
module Generators
|
5
5
|
# @private
|
6
6
|
class GeneratorGenerator < Base
|
7
|
-
class_option :generator_specs, type: :boolean, default: true,
|
7
|
+
class_option :generator_specs, type: :boolean, default: true, desc: 'Generate generator specs'
|
8
8
|
|
9
9
|
def generate_generator_spec
|
10
10
|
return unless options[:generator_specs]
|
@@ -17,7 +17,7 @@ module Rspec
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def filename
|
20
|
-
"#{
|
20
|
+
"#{file_name}_generator_spec.rb"
|
21
21
|
end
|
22
22
|
end
|
23
23
|
end
|
@@ -4,6 +4,11 @@ ENV['RAILS_ENV'] ||= 'test'
|
|
4
4
|
require_relative '../config/environment'
|
5
5
|
# Prevent database truncation if the environment is production
|
6
6
|
abort("The Rails environment is running in production mode!") if Rails.env.production?
|
7
|
+
<% if RSpec::Rails::FeatureCheck.has_active_record_migration? -%>
|
8
|
+
# Uncomment the line below in case you have `--require rails_helper` in the `.rspec` file
|
9
|
+
# that will avoid rails generators crashing because migrations haven't been run yet
|
10
|
+
# return unless Rails.env.test?
|
11
|
+
<% end -%>
|
7
12
|
require 'rspec/rails'
|
8
13
|
# Add additional requires below this line. Rails is not loaded until this point!
|
9
14
|
|
@@ -20,7 +25,7 @@ require 'rspec/rails'
|
|
20
25
|
# directory. Alternatively, in the individual `*_spec.rb` files, manually
|
21
26
|
# require only the support files necessary.
|
22
27
|
#
|
23
|
-
# Rails.root.glob('spec/support/**/*.rb').
|
28
|
+
# Rails.root.glob('spec/support/**/*.rb').sort_by(&:to_s).each { |f| require f }
|
24
29
|
|
25
30
|
<% if RSpec::Rails::FeatureCheck.has_active_record_migration? -%>
|
26
31
|
# Checks for pending migrations and applies them before tests are run.
|
@@ -74,7 +79,7 @@ RSpec.configure do |config|
|
|
74
79
|
# end
|
75
80
|
#
|
76
81
|
# The different available types are documented in the features, such as in
|
77
|
-
# https://rspec.info/features/
|
82
|
+
# https://rspec.info/features/7-0/rspec-rails
|
78
83
|
config.infer_spec_type_from_file_location!
|
79
84
|
|
80
85
|
# Filter lines from Rails gems in backtraces.
|
@@ -8,7 +8,8 @@ module Rspec
|
|
8
8
|
argument :actions, type: :array, default: [], banner: "method method"
|
9
9
|
|
10
10
|
def generate_mailer_spec
|
11
|
-
|
11
|
+
file_suffix = file_name.end_with?('mailer') ? 'spec.rb' : 'mailer_spec.rb'
|
12
|
+
template "mailer_spec.rb", target_path('mailers', class_path, [file_name, file_suffix].join('_'))
|
12
13
|
end
|
13
14
|
|
14
15
|
def generate_fixtures_files
|
@@ -21,7 +22,8 @@ module Rspec
|
|
21
22
|
def generate_preview_files
|
22
23
|
return unless RSpec::Rails::FeatureCheck.has_action_mailer_preview?
|
23
24
|
|
24
|
-
|
25
|
+
file_suffix = file_name.end_with?('mailer') ? 'preview.rb' : 'mailer_preview.rb'
|
26
|
+
template "preview.rb", target_path("mailers/previews", class_path, [file_name, file_suffix].join('_'))
|
25
27
|
end
|
26
28
|
end
|
27
29
|
end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
<% module_namespacing do -%>
|
2
|
-
# Preview all emails at http://localhost:3000/rails/mailers/<%= file_path %>
|
3
|
-
class <%= class_name %>Preview < ActionMailer::Preview
|
2
|
+
# Preview all emails at http://localhost:3000/rails/mailers/<%= file_path %>_mailer
|
3
|
+
class <%= class_name %><%= 'Mailer' unless class_name.end_with?('Mailer') %>Preview < ActionMailer::Preview
|
4
4
|
<% actions.each do |action| -%>
|
5
5
|
|
6
|
-
# Preview this email at http://localhost:3000/rails/mailers/<%= file_path
|
6
|
+
# Preview this email at http://localhost:3000/rails/mailers/<%= file_path %>_mailer/<%= action %>
|
7
7
|
def <%= action %>
|
8
8
|
<%= class_name.sub(/(Mailer)?$/, 'Mailer') %>.<%= action %>
|
9
9
|
end
|
@@ -18,7 +18,7 @@ RSpec.describe "<%= ns_table_name %>/index", <%= type_metatag(:view) %> do
|
|
18
18
|
|
19
19
|
it "renders a list of <%= ns_table_name %>" do
|
20
20
|
render
|
21
|
-
cell_selector = Rails::VERSION::STRING >= '7' ? 'div>p' : 'tr>td'
|
21
|
+
cell_selector = <%= Rails::VERSION::STRING >= '7' ? "'div>p'" : "'tr>td'" %>
|
22
22
|
<% for attribute in output_attributes -%>
|
23
23
|
assert_select cell_selector, text: Regexp.new(<%= value_for(attribute) %>.to_s), count: 2
|
24
24
|
<% end -%>
|
@@ -69,7 +69,7 @@ module RSpec
|
|
69
69
|
#
|
70
70
|
# @param message [Hash, Mail::Message] a mail message or hash of
|
71
71
|
# attributes used to build one
|
72
|
-
# @return [
|
72
|
+
# @return [ActionMailbox::InboundMessage]
|
73
73
|
def process(message)
|
74
74
|
MailboxExampleGroup.create_inbound_email(message).tap do |mail|
|
75
75
|
self.class.mailbox_class.receive(mail)
|
@@ -3,6 +3,7 @@
|
|
3
3
|
require 'rspec/rails/matchers'
|
4
4
|
|
5
5
|
if ::Rails::VERSION::MAJOR >= 7
|
6
|
+
require 'active_support/current_attributes/test_helper'
|
6
7
|
require 'active_support/execution_context/test_helper'
|
7
8
|
end
|
8
9
|
|
@@ -18,6 +19,7 @@ module RSpec
|
|
18
19
|
include RSpec::Rails::FixtureSupport
|
19
20
|
if ::Rails::VERSION::MAJOR >= 7
|
20
21
|
include RSpec::Rails::TaggedLoggingAdapter
|
22
|
+
include ActiveSupport::CurrentAttributes::TestHelper
|
21
23
|
include ActiveSupport::ExecutionContext::TestHelper
|
22
24
|
end
|
23
25
|
end
|
@@ -95,6 +95,14 @@ module RSpec
|
|
95
95
|
::Rails.application
|
96
96
|
end
|
97
97
|
|
98
|
+
# Default driver to assign if none specified.
|
99
|
+
DEFAULT_DRIVER =
|
100
|
+
if ::Rails::VERSION::STRING.to_f >= 7.2
|
101
|
+
:selenium_chrome_headless
|
102
|
+
else
|
103
|
+
:selenium
|
104
|
+
end
|
105
|
+
|
98
106
|
included do |other|
|
99
107
|
ActiveSupport.on_load(:action_dispatch_system_test_case) do
|
100
108
|
ActionDispatch::SystemTesting::Server.silence_puma = true
|
@@ -137,7 +145,7 @@ module RSpec
|
|
137
145
|
self.class.before do
|
138
146
|
# A user may have already set the driver, so only default if driver
|
139
147
|
# is not set
|
140
|
-
driven_by(
|
148
|
+
driven_by(DEFAULT_DRIVER) unless @driver
|
141
149
|
end
|
142
150
|
end
|
143
151
|
|
@@ -10,8 +10,7 @@ module RSpec
|
|
10
10
|
include ActiveRecord::TestFixtures
|
11
11
|
|
12
12
|
# @private prevent ActiveSupport::TestFixtures to start a DB transaction.
|
13
|
-
# Monkey patched to avoid collisions with 'let(:name)'
|
14
|
-
# and let(:method_name) before Rails 6.1.
|
13
|
+
# Monkey patched to avoid collisions with 'let(:name)' since Rails 6.1
|
15
14
|
def run_in_transaction?
|
16
15
|
current_example_name = (RSpec.current_example && RSpec.current_example.metadata[:description])
|
17
16
|
use_transactional_tests && !self.class.uses_transaction?(current_example_name)
|
@@ -14,6 +14,7 @@ module RSpec
|
|
14
14
|
def initialize
|
15
15
|
@args = []
|
16
16
|
@queue = nil
|
17
|
+
@priority = nil
|
17
18
|
@at = nil
|
18
19
|
@block = proc { }
|
19
20
|
set_expected_number(:exactly, 1)
|
@@ -30,6 +31,11 @@ module RSpec
|
|
30
31
|
self
|
31
32
|
end
|
32
33
|
|
34
|
+
def at_priority(priority)
|
35
|
+
@priority = priority.to_i
|
36
|
+
self
|
37
|
+
end
|
38
|
+
|
33
39
|
def at(time_or_date)
|
34
40
|
case time_or_date
|
35
41
|
when Time then @at = Time.at(time_or_date.to_f)
|
@@ -71,6 +77,8 @@ module RSpec
|
|
71
77
|
end
|
72
78
|
|
73
79
|
def failure_message
|
80
|
+
return @failure_message if defined?(@failure_message)
|
81
|
+
|
74
82
|
"expected to #{self.class::FAILURE_MESSAGE_EXPECTATION_ACTION} #{base_message}".tap do |msg|
|
75
83
|
if @unmatching_jobs.any?
|
76
84
|
msg << "\nQueued jobs:"
|
@@ -101,7 +109,7 @@ module RSpec
|
|
101
109
|
|
102
110
|
def check(jobs)
|
103
111
|
@matching_jobs, @unmatching_jobs = jobs.partition do |job|
|
104
|
-
if
|
112
|
+
if matches_constraints?(job)
|
105
113
|
args = deserialize_arguments(job)
|
106
114
|
@block.call(*args)
|
107
115
|
true
|
@@ -109,6 +117,12 @@ module RSpec
|
|
109
117
|
false
|
110
118
|
end
|
111
119
|
end
|
120
|
+
|
121
|
+
if (signature_mismatch = detect_args_signature_mismatch(@matching_jobs))
|
122
|
+
@failure_message = signature_mismatch
|
123
|
+
return false
|
124
|
+
end
|
125
|
+
|
112
126
|
@matching_jobs_count = @matching_jobs.size
|
113
127
|
|
114
128
|
case @expectation_type
|
@@ -123,6 +137,7 @@ module RSpec
|
|
123
137
|
msg << " with #{@args}," if @args.any?
|
124
138
|
msg << " on queue #{@queue}," if @queue
|
125
139
|
msg << " at #{@at.inspect}," if @at
|
140
|
+
msg << " with priority #{@priority}," if @priority
|
126
141
|
msg << " but #{self.class::MESSAGE_EXPECTATION_ACTION} #{@matching_jobs_count}"
|
127
142
|
end
|
128
143
|
end
|
@@ -132,13 +147,23 @@ module RSpec
|
|
132
147
|
msg_parts << "with #{deserialize_arguments(job)}" if job[:args].any?
|
133
148
|
msg_parts << "on queue #{job[:queue]}" if job[:queue]
|
134
149
|
msg_parts << "at #{Time.at(job[:at])}" if job[:at]
|
150
|
+
msg_parts <<
|
151
|
+
if job[:priority]
|
152
|
+
"with priority #{job[:priority]}"
|
153
|
+
else
|
154
|
+
"with no priority specified"
|
155
|
+
end
|
135
156
|
|
136
157
|
"#{job[:job].name} job".tap do |msg|
|
137
158
|
msg << " #{msg_parts.join(', ')}" if msg_parts.any?
|
138
159
|
end
|
139
160
|
end
|
140
161
|
|
141
|
-
def
|
162
|
+
def matches_constraints?(job)
|
163
|
+
job_matches?(job) && arguments_match?(job) && queue_match?(job) && at_match?(job) && priority_match?(job)
|
164
|
+
end
|
165
|
+
|
166
|
+
def job_matches?(job)
|
142
167
|
@job ? @job == job[:job] : true
|
143
168
|
end
|
144
169
|
|
@@ -152,12 +177,39 @@ module RSpec
|
|
152
177
|
end
|
153
178
|
end
|
154
179
|
|
180
|
+
def detect_args_signature_mismatch(jobs)
|
181
|
+
jobs.each do |job|
|
182
|
+
args = deserialize_arguments(job)
|
183
|
+
|
184
|
+
if (signature_mismatch = check_args_signature_mismatch(job.fetch(:job), :perform, args))
|
185
|
+
return signature_mismatch
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
nil
|
190
|
+
end
|
191
|
+
|
192
|
+
def check_args_signature_mismatch(job_class, job_method, args)
|
193
|
+
signature = Support::MethodSignature.new(job_class.public_instance_method(job_method))
|
194
|
+
verifier = Support::StrictSignatureVerifier.new(signature, args)
|
195
|
+
|
196
|
+
unless verifier.valid?
|
197
|
+
"Incorrect arguments passed to #{job_class.name}: #{verifier.error_message}"
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
155
201
|
def queue_match?(job)
|
156
202
|
return true unless @queue
|
157
203
|
|
158
204
|
@queue == job[:queue]
|
159
205
|
end
|
160
206
|
|
207
|
+
def priority_match?(job)
|
208
|
+
return true unless @priority
|
209
|
+
|
210
|
+
@priority == job[:priority]
|
211
|
+
end
|
212
|
+
|
161
213
|
def at_match?(job)
|
162
214
|
return true unless @at
|
163
215
|
return job[:at].nil? if @at == :no_wait
|
@@ -384,33 +436,33 @@ module RSpec
|
|
384
436
|
#
|
385
437
|
# @example
|
386
438
|
# expect {
|
387
|
-
#
|
439
|
+
# perform_enqueued_jobs { HeavyLiftingJob.perform_later }
|
388
440
|
# }.to have_performed_job
|
389
441
|
#
|
390
442
|
# expect {
|
391
|
-
#
|
443
|
+
# perform_enqueued_jobs {
|
392
444
|
# HelloJob.perform_later
|
393
445
|
# HeavyLiftingJob.perform_later
|
394
446
|
# }
|
395
447
|
# }.to have_performed_job(HelloJob).exactly(:once)
|
396
448
|
#
|
397
449
|
# expect {
|
398
|
-
#
|
450
|
+
# perform_enqueued_jobs { 3.times { HelloJob.perform_later } }
|
399
451
|
# }.to have_performed_job(HelloJob).at_least(2).times
|
400
452
|
#
|
401
453
|
# expect {
|
402
|
-
#
|
454
|
+
# perform_enqueued_jobs { HelloJob.perform_later }
|
403
455
|
# }.to have_performed_job(HelloJob).at_most(:twice)
|
404
456
|
#
|
405
457
|
# expect {
|
406
|
-
#
|
458
|
+
# perform_enqueued_jobs {
|
407
459
|
# HelloJob.perform_later
|
408
460
|
# HeavyLiftingJob.perform_later
|
409
461
|
# }
|
410
462
|
# }.to have_performed_job(HelloJob).and have_performed_job(HeavyLiftingJob)
|
411
463
|
#
|
412
464
|
# expect {
|
413
|
-
#
|
465
|
+
# perform_enqueued_jobs {
|
414
466
|
# HelloJob.set(wait_until: Date.tomorrow.noon, queue: "low").perform_later(42)
|
415
467
|
# }
|
416
468
|
# }.to have_performed_job.with(42).on_queue("low").at(Date.tomorrow.noon)
|
@@ -41,6 +41,8 @@ module RSpec
|
|
41
41
|
end
|
42
42
|
|
43
43
|
def failure_message
|
44
|
+
return @failure_message if defined?(@failure_message)
|
45
|
+
|
44
46
|
"expected to enqueue #{base_message}".tap do |msg|
|
45
47
|
msg << "\n#{unmatching_mail_jobs_message}" if unmatching_mail_jobs.any?
|
46
48
|
end
|
@@ -89,6 +91,22 @@ module RSpec
|
|
89
91
|
super(job)
|
90
92
|
end
|
91
93
|
|
94
|
+
def detect_args_signature_mismatch(jobs)
|
95
|
+
return if @method_name.nil?
|
96
|
+
|
97
|
+
mailer_class = mailer_class_name.constantize
|
98
|
+
|
99
|
+
jobs.each do |job|
|
100
|
+
mailer_args = extract_args_without_parameterized_params(job)
|
101
|
+
|
102
|
+
if (signature_mismatch = check_args_signature_mismatch(mailer_class, @method_name, mailer_args))
|
103
|
+
return signature_mismatch
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
nil
|
108
|
+
end
|
109
|
+
|
92
110
|
def base_mailer_args
|
93
111
|
[mailer_class_name, @method_name.to_s, MAILER_JOB_METHOD]
|
94
112
|
end
|
@@ -157,6 +175,19 @@ module RSpec
|
|
157
175
|
end
|
158
176
|
end
|
159
177
|
|
178
|
+
def extract_args_without_parameterized_params(job)
|
179
|
+
args = deserialize_arguments(job)
|
180
|
+
mailer_args = args - base_mailer_args
|
181
|
+
|
182
|
+
if parameterized_mail?(job)
|
183
|
+
mailer_args = mailer_args[1..-1] # ignore parameterized params
|
184
|
+
elsif mailer_args.last.is_a?(Hash) && mailer_args.last.key?(:args)
|
185
|
+
mailer_args = args.last[:args]
|
186
|
+
end
|
187
|
+
|
188
|
+
mailer_args
|
189
|
+
end
|
190
|
+
|
160
191
|
def legacy_mail?(job)
|
161
192
|
RSpec::Rails::FeatureCheck.has_action_mailer_legacy_delivery_job? && job[:job] <= ActionMailer::DeliveryJob
|
162
193
|
end
|
@@ -33,7 +33,7 @@ module RSpec
|
|
33
33
|
# @param obj [Object] object to convert to a response
|
34
34
|
# @return [ActionDispatch::TestResponse]
|
35
35
|
def as_test_response(obj)
|
36
|
-
if ::ActionDispatch::Response === obj
|
36
|
+
if ::ActionDispatch::Response === obj || ::Rack::MockResponse === obj
|
37
37
|
::ActionDispatch::TestResponse.from_response(obj)
|
38
38
|
elsif ::ActionDispatch::TestResponse === obj
|
39
39
|
obj
|
@@ -216,11 +216,7 @@ module RSpec
|
|
216
216
|
# @see Rack::Utils::SYMBOL_TO_STATUS_CODE
|
217
217
|
# @raise [ArgumentError] if an associated code could not be found
|
218
218
|
def set_expected_code!
|
219
|
-
@expected ||=
|
220
|
-
Rack::Utils::SYMBOL_TO_STATUS_CODE.fetch(expected_status) do
|
221
|
-
raise ArgumentError,
|
222
|
-
"Invalid HTTP status: #{expected_status.inspect}"
|
223
|
-
end
|
219
|
+
@expected ||= Rack::Utils.status_code(expected_status)
|
224
220
|
end
|
225
221
|
end
|
226
222
|
|
@@ -237,7 +233,7 @@ module RSpec
|
|
237
233
|
# expect(response).to have_http_status(:redirect)
|
238
234
|
#
|
239
235
|
# @see RSpec::Rails::Matchers#have_http_status
|
240
|
-
# @see https://github.com/rails/rails/blob/
|
236
|
+
# @see https://github.com/rails/rails/blob/7-2-stable/actionpack/lib/action_dispatch/testing/test_response.rb `ActionDispatch::TestResponse`
|
241
237
|
class GenericStatus < RSpec::Rails::Matchers::BaseMatcher
|
242
238
|
include HaveHttpStatus
|
243
239
|
|
data/lib/rspec/rails/version.rb
CHANGED
data/lib/rspec-rails.rb
CHANGED
@@ -9,6 +9,24 @@ module RSpec
|
|
9
9
|
# As of Rails 5.1.0 you can register directories to work with `rake notes`
|
10
10
|
require 'rails/source_annotation_extractor'
|
11
11
|
::Rails::SourceAnnotationExtractor::Annotation.register_directories("spec")
|
12
|
+
|
13
|
+
# As of Rails 8.0.0 you can register directories to work with `rails stats`
|
14
|
+
if ::Rails::VERSION::STRING >= "8.0.0"
|
15
|
+
require 'rails/code_statistics'
|
16
|
+
|
17
|
+
dirs = Dir['./spec/**/*_spec.rb']
|
18
|
+
.map { |f| f.sub(/^\.\/(spec\/\w+)\/.*/, '\\1') }
|
19
|
+
.uniq
|
20
|
+
.select { |f| File.directory?(f) }
|
21
|
+
|
22
|
+
Hash[dirs.map { |d| [d.split('/').last, d] }].each do |type, dir|
|
23
|
+
name = type.singularize.capitalize
|
24
|
+
|
25
|
+
::Rails::CodeStatistics.register_directory "#{name} specs", dir
|
26
|
+
::Rails::CodeStatistics::TEST_TYPES << "#{name} specs"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
12
30
|
generators = config.app_generators
|
13
31
|
generators.integration_tool :rspec
|
14
32
|
generators.test_framework :rspec
|
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rspec-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 7.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Chelimsky
|
@@ -44,7 +44,7 @@ cert_chain:
|
|
44
44
|
ZsVDj6a7lH3cNqtWXZxrb2wO38qV5AkYj8SQK7Hj3/Yui9myUX3crr+PdetazSqQ
|
45
45
|
F3MdtaDehhjC
|
46
46
|
-----END CERTIFICATE-----
|
47
|
-
date: 2024-
|
47
|
+
date: 2024-09-02 00:00:00.000000000 Z
|
48
48
|
dependencies:
|
49
49
|
- !ruby/object:Gem::Dependency
|
50
50
|
name: actionpack
|
@@ -52,98 +52,98 @@ dependencies:
|
|
52
52
|
requirements:
|
53
53
|
- - ">="
|
54
54
|
- !ruby/object:Gem::Version
|
55
|
-
version: '
|
55
|
+
version: '7.0'
|
56
56
|
type: :runtime
|
57
57
|
prerelease: false
|
58
58
|
version_requirements: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
60
|
- - ">="
|
61
61
|
- !ruby/object:Gem::Version
|
62
|
-
version: '
|
62
|
+
version: '7.0'
|
63
63
|
- !ruby/object:Gem::Dependency
|
64
64
|
name: activesupport
|
65
65
|
requirement: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
67
|
- - ">="
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version: '
|
69
|
+
version: '7.0'
|
70
70
|
type: :runtime
|
71
71
|
prerelease: false
|
72
72
|
version_requirements: !ruby/object:Gem::Requirement
|
73
73
|
requirements:
|
74
74
|
- - ">="
|
75
75
|
- !ruby/object:Gem::Version
|
76
|
-
version: '
|
76
|
+
version: '7.0'
|
77
77
|
- !ruby/object:Gem::Dependency
|
78
78
|
name: railties
|
79
79
|
requirement: !ruby/object:Gem::Requirement
|
80
80
|
requirements:
|
81
81
|
- - ">="
|
82
82
|
- !ruby/object:Gem::Version
|
83
|
-
version: '
|
83
|
+
version: '7.0'
|
84
84
|
type: :runtime
|
85
85
|
prerelease: false
|
86
86
|
version_requirements: !ruby/object:Gem::Requirement
|
87
87
|
requirements:
|
88
88
|
- - ">="
|
89
89
|
- !ruby/object:Gem::Version
|
90
|
-
version: '
|
90
|
+
version: '7.0'
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: rspec-core
|
93
93
|
requirement: !ruby/object:Gem::Requirement
|
94
94
|
requirements:
|
95
95
|
- - "~>"
|
96
96
|
- !ruby/object:Gem::Version
|
97
|
-
version: '3.
|
97
|
+
version: '3.13'
|
98
98
|
type: :runtime
|
99
99
|
prerelease: false
|
100
100
|
version_requirements: !ruby/object:Gem::Requirement
|
101
101
|
requirements:
|
102
102
|
- - "~>"
|
103
103
|
- !ruby/object:Gem::Version
|
104
|
-
version: '3.
|
104
|
+
version: '3.13'
|
105
105
|
- !ruby/object:Gem::Dependency
|
106
106
|
name: rspec-expectations
|
107
107
|
requirement: !ruby/object:Gem::Requirement
|
108
108
|
requirements:
|
109
109
|
- - "~>"
|
110
110
|
- !ruby/object:Gem::Version
|
111
|
-
version: '3.
|
111
|
+
version: '3.13'
|
112
112
|
type: :runtime
|
113
113
|
prerelease: false
|
114
114
|
version_requirements: !ruby/object:Gem::Requirement
|
115
115
|
requirements:
|
116
116
|
- - "~>"
|
117
117
|
- !ruby/object:Gem::Version
|
118
|
-
version: '3.
|
118
|
+
version: '3.13'
|
119
119
|
- !ruby/object:Gem::Dependency
|
120
120
|
name: rspec-mocks
|
121
121
|
requirement: !ruby/object:Gem::Requirement
|
122
122
|
requirements:
|
123
123
|
- - "~>"
|
124
124
|
- !ruby/object:Gem::Version
|
125
|
-
version: '3.
|
125
|
+
version: '3.13'
|
126
126
|
type: :runtime
|
127
127
|
prerelease: false
|
128
128
|
version_requirements: !ruby/object:Gem::Requirement
|
129
129
|
requirements:
|
130
130
|
- - "~>"
|
131
131
|
- !ruby/object:Gem::Version
|
132
|
-
version: '3.
|
132
|
+
version: '3.13'
|
133
133
|
- !ruby/object:Gem::Dependency
|
134
134
|
name: rspec-support
|
135
135
|
requirement: !ruby/object:Gem::Requirement
|
136
136
|
requirements:
|
137
137
|
- - "~>"
|
138
138
|
- !ruby/object:Gem::Version
|
139
|
-
version: '3.
|
139
|
+
version: '3.13'
|
140
140
|
type: :runtime
|
141
141
|
prerelease: false
|
142
142
|
version_requirements: !ruby/object:Gem::Requirement
|
143
143
|
requirements:
|
144
144
|
- - "~>"
|
145
145
|
- !ruby/object:Gem::Version
|
146
|
-
version: '3.
|
146
|
+
version: '3.13'
|
147
147
|
- !ruby/object:Gem::Dependency
|
148
148
|
name: ammeter
|
149
149
|
requirement: !ruby/object:Gem::Requirement
|
@@ -186,7 +186,7 @@ dependencies:
|
|
186
186
|
- - "~>"
|
187
187
|
- !ruby/object:Gem::Version
|
188
188
|
version: '7.0'
|
189
|
-
description: rspec-rails
|
189
|
+
description: rspec-rails integrates the Rails testing helpers into RSpec.
|
190
190
|
email: rspec@googlegroups.com
|
191
191
|
executables: []
|
192
192
|
extensions: []
|
@@ -297,7 +297,7 @@ licenses:
|
|
297
297
|
- MIT
|
298
298
|
metadata:
|
299
299
|
bug_tracker_uri: https://github.com/rspec/rspec-rails/issues
|
300
|
-
changelog_uri: https://github.com/rspec/rspec-rails/blob/
|
300
|
+
changelog_uri: https://github.com/rspec/rspec-rails/blob/v7.0.0/Changelog.md
|
301
301
|
documentation_uri: https://rspec.info/documentation/
|
302
302
|
mailing_list_uri: https://groups.google.com/forum/#!forum/rspec
|
303
303
|
source_code_uri: https://github.com/rspec/rspec-rails
|
@@ -310,14 +310,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
310
310
|
requirements:
|
311
311
|
- - ">="
|
312
312
|
- !ruby/object:Gem::Version
|
313
|
-
version: 2.
|
313
|
+
version: 2.7.0
|
314
314
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
315
315
|
requirements:
|
316
316
|
- - ">="
|
317
317
|
- !ruby/object:Gem::Version
|
318
318
|
version: '0'
|
319
319
|
requirements: []
|
320
|
-
rubygems_version: 3.5.
|
320
|
+
rubygems_version: 3.5.11
|
321
321
|
signing_key:
|
322
322
|
specification_version: 4
|
323
323
|
summary: RSpec for Rails
|
metadata.gz.sig
CHANGED
Binary file
|