rspec-rails 6.1.5 → 7.1.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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +4 -2
- data/Changelog.md +43 -1
- data/README.md +27 -25
- data/lib/generators/rspec/install/templates/spec/rails_helper.rb +16 -9
- data/lib/generators/rspec/scaffold/templates/controller_spec.rb +0 -15
- data/lib/generators/rspec/scaffold/templates/index_spec.rb +1 -1
- data/lib/generators/rspec/scaffold/templates/request_spec.rb +0 -15
- data/lib/rspec/rails/example/rails_example_group.rb +5 -9
- 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/action_cable/have_broadcasted_to.rb +10 -3
- data/lib/rspec/rails/matchers/action_cable.rb +6 -1
- data/lib/rspec/rails/matchers/active_job.rb +61 -2
- data/lib/rspec/rails/matchers/have_enqueued_mail.rb +34 -2
- data/lib/rspec/rails/matchers/have_http_status.rb +1 -1
- data/lib/rspec/rails/version.rb +1 -1
- data/lib/rspec-rails.rb +16 -0
- data.tar.gz.sig +0 -0
- metadata +11 -12
- metadata.gz.sig +0 -0
- data/lib/generators/rspec/integration/integration_generator.rb +0 -29
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 725cbfd52d9f763648a595bba0a46d7c0905548e04b988f7c451a0b23ec5e283
|
|
4
|
+
data.tar.gz: ae2f038303eca35e63674c059e4ebe3b3788c47e52bd397ed67c5b857b8f2e19
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 3949cffce869076c1b3d84806c76ce5c609b8ae7cc5cd906b44ed09d8df3be4c7d7603c4a2d0430d2337fe7d828b8879025bf32fcacecbb2da010f2108949479
|
|
7
|
+
data.tar.gz: 0a9c1d5d4968a49d52d6d68078761241431a28c8e2f023d3228536839c7a550d637996b050fbc771f475cc2b3951f0846be429a31fba9d124138f3d8b67d66e3
|
checksums.yaml.gz.sig
CHANGED
|
@@ -1,2 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
�<�R���ۧ�
|
|
2
|
+
��2n�T���lw#�Y��Uj��o/�%H������^���&g�ᳬ�K�x�X�v�bZHD��3X:Ɏ���ߍ�!��@�N����I41��ߺt��h�rՐ�ޠG��$�/yk|PG�}��< �z+��G�Z%gi������u�Ǵ�KŪÇ�+
|
|
3
|
+
�~�M�t�V���(���(�2l���zQ�>F�5ק�xR�
|
|
4
|
+
G�D�,S7���ݒi��RP�m������sPǕy�7ܑ��\��8�?a��|i�R��:�>��o���K~ �ؐc��:�Nn� �R�'4�U��T#p�*��o4+�q{Q ~�V���e��S���DЂ��v�-�@o|:�@�q����By����9�Zmӑo$����k?��q���,Ї݁��.���P�ގs wF�)g1�DУ�� �=�$eY<r{�8��z����%-MJڪ���,e�ʦ����t�)>7G��%���%��ъͺ<��۔�݁B
|
data/Changelog.md
CHANGED
|
@@ -1,5 +1,47 @@
|
|
|
1
1
|
### Development
|
|
2
|
-
[Full Changelog](https://github.com/rspec/rspec-rails/compare/
|
|
2
|
+
[Full Changelog](https://github.com/rspec/rspec-rails/compare/v7.1.0...7-1-maintenance)
|
|
3
|
+
|
|
4
|
+
### 7.1.0 / 2024-11-09
|
|
5
|
+
[Full Changelog](https://github.com/rspec/rspec-rails/compare/v7.0.2...v7.1.0)
|
|
6
|
+
|
|
7
|
+
Enhancements:
|
|
8
|
+
|
|
9
|
+
* Improve implicit description for ActionCable matchers `have_broadcasted_to` /
|
|
10
|
+
`have_broadcast`. (Simon Fish, #2795)
|
|
11
|
+
* Comment out `infer_spec_type_from_file_location!` in newly generated
|
|
12
|
+
`rails_helper.rb` files. (Jon Rowe, #2804)
|
|
13
|
+
* Allow turning off active job / mailer argument validation.
|
|
14
|
+
(Oli Peate, #2808)
|
|
15
|
+
|
|
16
|
+
### 7.0.2 / 2024-11-09
|
|
17
|
+
[Full Changelog](https://github.com/rspec/rspec-rails/compare/v7.0.1...v7.0.2)
|
|
18
|
+
|
|
19
|
+
Bug Fixes:
|
|
20
|
+
|
|
21
|
+
* Fix issue with `have_enqueued_mail` when jobs were incorrectly matched due
|
|
22
|
+
to refactoring in #2780. (David Runger, #2793)
|
|
23
|
+
|
|
24
|
+
### 7.0.1 / 2024-09-03
|
|
25
|
+
[Full Changelog](https://github.com/rspec/rspec-rails/compare/v7.0.0...v7.0.1)
|
|
26
|
+
|
|
27
|
+
Bug Fixes:
|
|
28
|
+
|
|
29
|
+
* Remove mutation of Rails constant in favour of public api. (Petrik de Heus, #2789)
|
|
30
|
+
* Cleanup Rails scaffold for unsupported versions. (Matt Jankowski, #2790)
|
|
31
|
+
* Remove deprecated scaffold that was unintentionally included in 7.0.0
|
|
32
|
+
(Jon Rowe, #2791)
|
|
33
|
+
|
|
34
|
+
### 7.0.0 / 2024-09-02
|
|
35
|
+
[Full Changelog](https://github.com/rspec/rspec-rails/compare/v6.1.5...v7.0.0)
|
|
36
|
+
|
|
37
|
+
Enhancements:
|
|
38
|
+
|
|
39
|
+
* Change default driver for system specs on Rails 7.2 to match its default.
|
|
40
|
+
(Steve Polito, #2746)
|
|
41
|
+
* Verify ActiveJob arguments by comparing to the method signature. (Oli Peate, #2745)
|
|
42
|
+
* Add suggestion to rails_helper.rb to skip when not in test mode. (Glauco Custódio, #2751)
|
|
43
|
+
* Add `at_priority` qualifier to `have_enqueued_job` set of matchers. (mbajur, #2759)
|
|
44
|
+
* Add spec directories to `rails stats` on Rails main / 8.0.0. (Petrik de Heus, #2781)
|
|
3
45
|
|
|
4
46
|
### 6.1.5 / 2024-09-02
|
|
5
47
|
[Full Changelog](https://github.com/rspec/rspec-rails/compare/v6.1.4...v6.1.5)
|
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, 7.0 or 7.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.1.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,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
|
|
|
@@ -62,20 +67,22 @@ RSpec.configure do |config|
|
|
|
62
67
|
# config.use_transactional_fixtures = true
|
|
63
68
|
|
|
64
69
|
<% end -%>
|
|
65
|
-
# RSpec Rails
|
|
66
|
-
#
|
|
67
|
-
# `post` in specs under `spec/controllers`.
|
|
68
|
-
#
|
|
69
|
-
# You can disable this behaviour by removing the line below, and instead
|
|
70
|
-
# explicitly tag your specs with their type, e.g.:
|
|
70
|
+
# RSpec Rails uses metadata to mix in different behaviours to your tests,
|
|
71
|
+
# for example enabling you to call `get` and `post` in request specs. e.g.:
|
|
71
72
|
#
|
|
72
|
-
# RSpec.describe UsersController, type: :
|
|
73
|
+
# RSpec.describe UsersController, type: :request do
|
|
73
74
|
# # ...
|
|
74
75
|
# end
|
|
75
76
|
#
|
|
76
77
|
# The different available types are documented in the features, such as in
|
|
77
|
-
# https://rspec.info/features/
|
|
78
|
-
|
|
78
|
+
# https://rspec.info/features/7-0/rspec-rails
|
|
79
|
+
#
|
|
80
|
+
# You can also this infer these behaviours automatically by location, e.g.
|
|
81
|
+
# /spec/models would pull in the same behaviour as `type: :model` but this
|
|
82
|
+
# behaviour is considered legacy and will be removed in a future version.
|
|
83
|
+
#
|
|
84
|
+
# To enable this behaviour uncomment the line below.
|
|
85
|
+
# config.infer_spec_type_from_file_location!
|
|
79
86
|
|
|
80
87
|
# Filter lines from Rails gems in backtraces.
|
|
81
88
|
config.filter_rails_from_backtrace!
|
|
@@ -90,17 +90,10 @@ RSpec.describe <%= controller_class_name %>Controller, <%= type_metatag(:control
|
|
|
90
90
|
end
|
|
91
91
|
|
|
92
92
|
context "with invalid params" do
|
|
93
|
-
<% if Rails.version.to_f < 7.0 %>
|
|
94
|
-
it "returns a success response (i.e. to display the 'new' template)" do
|
|
95
|
-
post :create, params: {<%= singular_table_name %>: invalid_attributes}, session: valid_session
|
|
96
|
-
expect(response).to be_successful
|
|
97
|
-
end
|
|
98
|
-
<% else %>
|
|
99
93
|
it "renders a response with 422 status (i.e. to display the 'new' template)" do
|
|
100
94
|
post :create, params: {<%= singular_table_name %>: invalid_attributes}, session: valid_session
|
|
101
95
|
expect(response).to have_http_status(:unprocessable_entity)
|
|
102
96
|
end
|
|
103
|
-
<% end %>
|
|
104
97
|
end
|
|
105
98
|
end
|
|
106
99
|
|
|
@@ -125,19 +118,11 @@ RSpec.describe <%= controller_class_name %>Controller, <%= type_metatag(:control
|
|
|
125
118
|
end
|
|
126
119
|
|
|
127
120
|
context "with invalid params" do
|
|
128
|
-
<% if Rails.version.to_f < 7.0 %>
|
|
129
|
-
it "returns a success response (i.e. to display the 'edit' template)" do
|
|
130
|
-
<%= file_name %> = <%= class_name %>.create! valid_attributes
|
|
131
|
-
put :update, params: {id: <%= file_name %>.to_param, <%= singular_table_name %>: invalid_attributes}, session: valid_session
|
|
132
|
-
expect(response).to be_successful
|
|
133
|
-
end
|
|
134
|
-
<% else %>
|
|
135
121
|
it "renders a response with 422 status (i.e. to display the 'edit' template)" do
|
|
136
122
|
<%= file_name %> = <%= class_name %>.create! valid_attributes
|
|
137
123
|
put :update, params: {id: <%= file_name %>.to_param, <%= singular_table_name %>: invalid_attributes}, session: valid_session
|
|
138
124
|
expect(response).to have_http_status(:unprocessable_entity)
|
|
139
125
|
end
|
|
140
|
-
<% end %>
|
|
141
126
|
end
|
|
142
127
|
end
|
|
143
128
|
|
|
@@ -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 =
|
|
21
|
+
cell_selector = 'div>p'
|
|
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 -%>
|
|
@@ -83,17 +83,10 @@ RSpec.describe "/<%= name.underscore.pluralize %>", <%= type_metatag(:request) %
|
|
|
83
83
|
}.to change(<%= class_name %>, :count).by(0)
|
|
84
84
|
end
|
|
85
85
|
|
|
86
|
-
<% if Rails.version.to_f < 7.0 %>
|
|
87
|
-
it "renders a successful response (i.e. to display the 'new' template)" do
|
|
88
|
-
post <%= index_helper %>_url, params: { <%= singular_table_name %>: invalid_attributes }
|
|
89
|
-
expect(response).to be_successful
|
|
90
|
-
end
|
|
91
|
-
<% else %>
|
|
92
86
|
it "renders a response with 422 status (i.e. to display the 'new' template)" do
|
|
93
87
|
post <%= index_helper %>_url, params: { <%= singular_table_name %>: invalid_attributes }
|
|
94
88
|
expect(response).to have_http_status(:unprocessable_entity)
|
|
95
89
|
end
|
|
96
|
-
<% end %>
|
|
97
90
|
end
|
|
98
91
|
end
|
|
99
92
|
|
|
@@ -119,19 +112,11 @@ RSpec.describe "/<%= name.underscore.pluralize %>", <%= type_metatag(:request) %
|
|
|
119
112
|
end
|
|
120
113
|
|
|
121
114
|
context "with invalid parameters" do
|
|
122
|
-
<% if Rails.version.to_f < 7.0 %>
|
|
123
|
-
it "renders a successful response (i.e. to display the 'edit' template)" do
|
|
124
|
-
<%= file_name %> = <%= class_name %>.create! valid_attributes
|
|
125
|
-
patch <%= show_helper %>, params: { <%= singular_table_name %>: invalid_attributes }
|
|
126
|
-
expect(response).to be_successful
|
|
127
|
-
end
|
|
128
|
-
<% else %>
|
|
129
115
|
it "renders a response with 422 status (i.e. to display the 'edit' template)" do
|
|
130
116
|
<%= file_name %> = <%= class_name %>.create! valid_attributes
|
|
131
117
|
patch <%= show_helper %>, params: { <%= singular_table_name %>: invalid_attributes }
|
|
132
118
|
expect(response).to have_http_status(:unprocessable_entity)
|
|
133
119
|
end
|
|
134
|
-
<% end %>
|
|
135
120
|
end
|
|
136
121
|
end
|
|
137
122
|
|
|
@@ -2,10 +2,8 @@
|
|
|
2
2
|
# suite and ammeter.
|
|
3
3
|
require 'rspec/rails/matchers'
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
require 'active_support/execution_context/test_helper'
|
|
8
|
-
end
|
|
5
|
+
require 'active_support/current_attributes/test_helper'
|
|
6
|
+
require 'active_support/execution_context/test_helper'
|
|
9
7
|
|
|
10
8
|
module RSpec
|
|
11
9
|
module Rails
|
|
@@ -17,11 +15,9 @@ module RSpec
|
|
|
17
15
|
include RSpec::Rails::MinitestLifecycleAdapter
|
|
18
16
|
include RSpec::Rails::MinitestAssertionAdapter
|
|
19
17
|
include RSpec::Rails::FixtureSupport
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
include ActiveSupport::ExecutionContext::TestHelper
|
|
24
|
-
end
|
|
18
|
+
include RSpec::Rails::TaggedLoggingAdapter
|
|
19
|
+
include ActiveSupport::CurrentAttributes::TestHelper
|
|
20
|
+
include ActiveSupport::ExecutionContext::TestHelper
|
|
25
21
|
end
|
|
26
22
|
end
|
|
27
23
|
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)
|
|
@@ -51,6 +51,10 @@ module RSpec
|
|
|
51
51
|
exactly(:thrice)
|
|
52
52
|
end
|
|
53
53
|
|
|
54
|
+
def description
|
|
55
|
+
"have broadcasted #{base_description}"
|
|
56
|
+
end
|
|
57
|
+
|
|
54
58
|
def failure_message
|
|
55
59
|
"expected to broadcast #{base_message}".tap do |msg|
|
|
56
60
|
if @unmatching_msgs.any?
|
|
@@ -140,18 +144,21 @@ module RSpec
|
|
|
140
144
|
end
|
|
141
145
|
end
|
|
142
146
|
|
|
143
|
-
def
|
|
147
|
+
def base_description
|
|
144
148
|
"#{message_expectation_modifier} #{@expected_number} messages to #{stream}".tap do |msg|
|
|
145
149
|
msg << " with #{data_description(@data)}" unless @data.nil?
|
|
146
|
-
msg << ", but broadcast #{@matching_msgs_count}"
|
|
147
150
|
end
|
|
148
151
|
end
|
|
149
152
|
|
|
153
|
+
def base_message
|
|
154
|
+
"#{base_description}, but broadcast #{@matching_msgs_count}"
|
|
155
|
+
end
|
|
156
|
+
|
|
150
157
|
def data_description(data)
|
|
151
158
|
if data.is_a?(RSpec::Matchers::Composable)
|
|
152
159
|
data.description
|
|
153
160
|
else
|
|
154
|
-
data
|
|
161
|
+
data.inspect
|
|
155
162
|
end
|
|
156
163
|
end
|
|
157
164
|
|
|
@@ -3,6 +3,8 @@ require "rspec/rails/matchers/action_cable/have_broadcasted_to"
|
|
|
3
3
|
module RSpec
|
|
4
4
|
module Rails
|
|
5
5
|
module Matchers
|
|
6
|
+
extend RSpec::Matchers::DSL
|
|
7
|
+
|
|
6
8
|
# Namespace for various implementations of ActionCable features
|
|
7
9
|
#
|
|
8
10
|
# @api private
|
|
@@ -50,7 +52,10 @@ module RSpec
|
|
|
50
52
|
|
|
51
53
|
ActionCable::HaveBroadcastedTo.new(target, channel: described_class)
|
|
52
54
|
end
|
|
53
|
-
|
|
55
|
+
|
|
56
|
+
alias_matcher :broadcast_to, :have_broadcasted_to do |desc|
|
|
57
|
+
desc.gsub("have broadcasted", "broadcast")
|
|
58
|
+
end
|
|
54
59
|
|
|
55
60
|
private
|
|
56
61
|
|
|
@@ -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,46 @@ module RSpec
|
|
|
152
177
|
end
|
|
153
178
|
end
|
|
154
179
|
|
|
180
|
+
def detect_args_signature_mismatch(jobs)
|
|
181
|
+
return if skip_signature_verification?
|
|
182
|
+
|
|
183
|
+
jobs.each do |job|
|
|
184
|
+
args = deserialize_arguments(job)
|
|
185
|
+
|
|
186
|
+
if (signature_mismatch = check_args_signature_mismatch(job.fetch(:job), :perform, args))
|
|
187
|
+
return signature_mismatch
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
nil
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
def skip_signature_verification?
|
|
195
|
+
!RSpec::Mocks.configuration.verify_partial_doubles? ||
|
|
196
|
+
RSpec::Mocks.configuration.temporarily_suppress_partial_double_verification
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
def check_args_signature_mismatch(job_class, job_method, args)
|
|
200
|
+
signature = Support::MethodSignature.new(job_class.public_instance_method(job_method))
|
|
201
|
+
verifier = Support::StrictSignatureVerifier.new(signature, args)
|
|
202
|
+
|
|
203
|
+
unless verifier.valid?
|
|
204
|
+
"Incorrect arguments passed to #{job_class.name}: #{verifier.error_message}"
|
|
205
|
+
end
|
|
206
|
+
end
|
|
207
|
+
|
|
155
208
|
def queue_match?(job)
|
|
156
209
|
return true unless @queue
|
|
157
210
|
|
|
158
211
|
@queue == job[:queue]
|
|
159
212
|
end
|
|
160
213
|
|
|
214
|
+
def priority_match?(job)
|
|
215
|
+
return true unless @priority
|
|
216
|
+
|
|
217
|
+
@priority == job[:priority]
|
|
218
|
+
end
|
|
219
|
+
|
|
161
220
|
def at_match?(job)
|
|
162
221
|
return true unless @at
|
|
163
222
|
return job[:at].nil? if @at == :no_wait
|
|
@@ -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
|
|
@@ -70,7 +72,7 @@ module RSpec
|
|
|
70
72
|
@mailer_class ? @mailer_class.name : 'ActionMailer::Base'
|
|
71
73
|
end
|
|
72
74
|
|
|
73
|
-
def
|
|
75
|
+
def job_matches?(job)
|
|
74
76
|
legacy_mail?(job) || parameterized_mail?(job) || unified_mail?(job)
|
|
75
77
|
end
|
|
76
78
|
|
|
@@ -89,6 +91,23 @@ 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
|
+
return if skip_signature_verification?
|
|
97
|
+
|
|
98
|
+
mailer_class = mailer_class_name.constantize
|
|
99
|
+
|
|
100
|
+
jobs.each do |job|
|
|
101
|
+
mailer_args = extract_args_without_parameterized_params(job)
|
|
102
|
+
|
|
103
|
+
if (signature_mismatch = check_args_signature_mismatch(mailer_class, @method_name, mailer_args))
|
|
104
|
+
return signature_mismatch
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
nil
|
|
109
|
+
end
|
|
110
|
+
|
|
92
111
|
def base_mailer_args
|
|
93
112
|
[mailer_class_name, @method_name.to_s, MAILER_JOB_METHOD]
|
|
94
113
|
end
|
|
@@ -105,7 +124,7 @@ module RSpec
|
|
|
105
124
|
|
|
106
125
|
def unmatching_mail_jobs
|
|
107
126
|
@unmatching_jobs.select do |job|
|
|
108
|
-
|
|
127
|
+
job_matches?(job)
|
|
109
128
|
end
|
|
110
129
|
end
|
|
111
130
|
|
|
@@ -157,6 +176,19 @@ module RSpec
|
|
|
157
176
|
end
|
|
158
177
|
end
|
|
159
178
|
|
|
179
|
+
def extract_args_without_parameterized_params(job)
|
|
180
|
+
args = deserialize_arguments(job)
|
|
181
|
+
mailer_args = args - base_mailer_args
|
|
182
|
+
|
|
183
|
+
if parameterized_mail?(job)
|
|
184
|
+
mailer_args = mailer_args[1..-1] # ignore parameterized params
|
|
185
|
+
elsif mailer_args.last.is_a?(Hash) && mailer_args.last.key?(:args)
|
|
186
|
+
mailer_args = args.last[:args]
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
mailer_args
|
|
190
|
+
end
|
|
191
|
+
|
|
160
192
|
def legacy_mail?(job)
|
|
161
193
|
RSpec::Rails::FeatureCheck.has_action_mailer_legacy_delivery_job? && job[:job] <= ActionMailer::DeliveryJob
|
|
162
194
|
end
|
|
@@ -233,7 +233,7 @@ module RSpec
|
|
|
233
233
|
# expect(response).to have_http_status(:redirect)
|
|
234
234
|
#
|
|
235
235
|
# @see RSpec::Rails::Matchers#have_http_status
|
|
236
|
-
# @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`
|
|
237
237
|
class GenericStatus < RSpec::Rails::Matchers::BaseMatcher
|
|
238
238
|
include HaveHttpStatus
|
|
239
239
|
|
data/lib/rspec/rails/version.rb
CHANGED
data/lib/rspec-rails.rb
CHANGED
|
@@ -10,6 +10,22 @@ module RSpec
|
|
|
10
10
|
require 'rails/source_annotation_extractor'
|
|
11
11
|
::Rails::SourceAnnotationExtractor::Annotation.register_directories("spec")
|
|
12
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, test_directory: true
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
13
29
|
generators = config.app_generators
|
|
14
30
|
generators.integration_tool :rspec
|
|
15
31
|
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.1.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-09
|
|
47
|
+
date: 2024-11-09 00:00:00.000000000 Z
|
|
48
48
|
dependencies:
|
|
49
49
|
- !ruby/object:Gem::Dependency
|
|
50
50
|
name: actionpack
|
|
@@ -52,42 +52,42 @@ 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
|
|
@@ -215,7 +215,6 @@ files:
|
|
|
215
215
|
- lib/generators/rspec/helper/templates/helper_spec.rb
|
|
216
216
|
- lib/generators/rspec/install/install_generator.rb
|
|
217
217
|
- lib/generators/rspec/install/templates/spec/rails_helper.rb
|
|
218
|
-
- lib/generators/rspec/integration/integration_generator.rb
|
|
219
218
|
- lib/generators/rspec/job/job_generator.rb
|
|
220
219
|
- lib/generators/rspec/job/templates/job_spec.rb.erb
|
|
221
220
|
- lib/generators/rspec/mailbox/mailbox_generator.rb
|
|
@@ -297,7 +296,7 @@ licenses:
|
|
|
297
296
|
- MIT
|
|
298
297
|
metadata:
|
|
299
298
|
bug_tracker_uri: https://github.com/rspec/rspec-rails/issues
|
|
300
|
-
changelog_uri: https://github.com/rspec/rspec-rails/blob/
|
|
299
|
+
changelog_uri: https://github.com/rspec/rspec-rails/blob/v7.1.0/Changelog.md
|
|
301
300
|
documentation_uri: https://rspec.info/documentation/
|
|
302
301
|
mailing_list_uri: https://groups.google.com/forum/#!forum/rspec
|
|
303
302
|
source_code_uri: https://github.com/rspec/rspec-rails
|
|
@@ -310,14 +309,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
310
309
|
requirements:
|
|
311
310
|
- - ">="
|
|
312
311
|
- !ruby/object:Gem::Version
|
|
313
|
-
version: 2.
|
|
312
|
+
version: 2.7.0
|
|
314
313
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
315
314
|
requirements:
|
|
316
315
|
- - ">="
|
|
317
316
|
- !ruby/object:Gem::Version
|
|
318
317
|
version: '0'
|
|
319
318
|
requirements: []
|
|
320
|
-
rubygems_version: 3.5.
|
|
319
|
+
rubygems_version: 3.5.22
|
|
321
320
|
signing_key:
|
|
322
321
|
specification_version: 4
|
|
323
322
|
summary: RSpec for Rails
|
metadata.gz.sig
CHANGED
|
Binary file
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
require 'generators/rspec'
|
|
2
|
-
require 'rspec/core/warnings'
|
|
3
|
-
|
|
4
|
-
module Rspec
|
|
5
|
-
module Generators
|
|
6
|
-
# @private
|
|
7
|
-
class IntegrationGenerator < Base
|
|
8
|
-
class_option :request_specs,
|
|
9
|
-
type: :boolean,
|
|
10
|
-
default: true,
|
|
11
|
-
desc: "Generate request specs"
|
|
12
|
-
|
|
13
|
-
source_paths << File.expand_path('../request/templates', __dir__)
|
|
14
|
-
|
|
15
|
-
def generate_request_spec
|
|
16
|
-
return unless options[:request_specs]
|
|
17
|
-
|
|
18
|
-
RSpec.warn_deprecation <<-WARNING.gsub(/\s*\|/, ' ')
|
|
19
|
-
|The integration generator is deprecated
|
|
20
|
-
|and will be deleted in RSpec-Rails 7.
|
|
21
|
-
|Please use the request generator instead.
|
|
22
|
-
WARNING
|
|
23
|
-
|
|
24
|
-
template 'request_spec.rb',
|
|
25
|
-
target_path('requests', "#{name.underscore.pluralize}_spec.rb")
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
end
|