rspec-rails 6.0.3 → 6.1.3
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 +64 -3
- data/README.md +5 -4
- 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 +9 -3
- 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/edit_spec.rb +3 -3
- data/lib/generators/rspec/scaffold/templates/new_spec.rb +1 -1
- data/lib/generators/rspec/scaffold/templates/show_spec.rb +1 -1
- data/lib/rspec/rails/configuration.rb +31 -2
- data/lib/rspec/rails/example/mailbox_example_group.rb +1 -1
- data/lib/rspec/rails/example/rails_example_group.rb +10 -1
- data/lib/rspec/rails/example/routing_example_group.rb +0 -2
- data/lib/rspec/rails/example/system_example_group.rb +46 -0
- data/lib/rspec/rails/example/view_example_group.rb +2 -1
- data/lib/rspec/rails/fixture_file_upload_support.rb +7 -1
- data/lib/rspec/rails/fixture_support.rb +38 -15
- data/lib/rspec/rails/matchers/action_cable/have_broadcasted_to.rb +1 -1
- data/lib/rspec/rails/matchers/have_http_status.rb +1 -5
- data/lib/rspec/rails/matchers/send_email.rb +122 -0
- data/lib/rspec/rails/matchers.rb +1 -0
- data/lib/rspec/rails/version.rb +1 -1
- data/lib/rspec-rails.rb +11 -3
- data.tar.gz.sig +0 -0
- metadata +15 -14
- 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: deeeefe5add9c88c1d8709df6f4859a0280fe1a74b7d422c446bae6edd84940e
|
4
|
+
data.tar.gz: 970418fa92cdd51b634a9ed55a701ca3432657e3ea5b4bfba8629910a041f885
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f6e156b4ad6e766af357bddbe10bac0fa3a2336fea1eb5f24c9cb4da637a4e630ede7bcd906d03e9175a6e2c8641754d180d67551fc0d97842b9497d72143b9c
|
7
|
+
data.tar.gz: 74e6a50c6d9b2329772280dc95c82ea94df55cdab0aa57aad3c9085faf5b15e2155d6f5e5f223e0b5165955472fd0d9447e25b8d9b8db2cb0dc914fa6c5ab3e4
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/Changelog.md
CHANGED
@@ -1,5 +1,66 @@
|
|
1
1
|
### Development
|
2
|
-
[Full Changelog](https://github.com/rspec/rspec-rails/compare/v6.
|
2
|
+
[Full Changelog](https://github.com/rspec/rspec-rails/compare/v6.1.3...6-1-maintenance)
|
3
|
+
|
4
|
+
### 6.1.3 / 2024-06-19
|
5
|
+
[Full Changelog](https://github.com/rspec/rspec-rails/compare/v6.1.2...v6.1.3)
|
6
|
+
|
7
|
+
Bug Fixes:
|
8
|
+
|
9
|
+
* Reset `ActiveSupport::CurrentAttributes` between examples. (Javier Julio, #2752)
|
10
|
+
* Fix a broken link in generated mailer previews. (Chiara Núñez, #2764)
|
11
|
+
* Fix `have_status_code` behaviour with deprecated status names by delegating
|
12
|
+
to `Rack::Utils.status_code/1` to set the expected status code. (Darren Boyd, #2765)
|
13
|
+
|
14
|
+
### 6.1.2 / 2024-03-19
|
15
|
+
[Full Changelog](https://github.com/rspec/rspec-rails/compare/v6.1.1...v6.1.2)
|
16
|
+
|
17
|
+
Bug Fixes:
|
18
|
+
|
19
|
+
* Fix generated mailer paths to match Rails convention. (Patrício dos Santos, #2735)
|
20
|
+
* Fix class in template for generator specs. (Nicolas Buduroi, #2744)
|
21
|
+
|
22
|
+
### 6.1.1 / 2024-01-25
|
23
|
+
[Full Changelog](https://github.com/rspec/rspec-rails/compare/v6.1.0...v6.1.1)
|
24
|
+
|
25
|
+
Bug Fixes:
|
26
|
+
|
27
|
+
* Improved deprecation message for `RSpec::Rails::Configuration.fixture_paths`
|
28
|
+
(Benoit Tigeot, #2720)
|
29
|
+
* Fix support for namespaced fixtures in Rails 7.1. (Benedikt Deicke, #2716)
|
30
|
+
|
31
|
+
### 6.1.0 / 2023-11-21
|
32
|
+
[Full Changelog](https://github.com/rspec/rspec-rails/compare/v6.0.4...v6.1.0)
|
33
|
+
|
34
|
+
Enhancements:
|
35
|
+
|
36
|
+
* Support for Rails 7.1
|
37
|
+
* Minor tweak to generated `rails_helper.rb` to use `Rails.root.join`.
|
38
|
+
(@masato-bkn, Ryo Nakamura, #2640, #2678)
|
39
|
+
* Add `RSpec::Rails::Configuration.fixture_paths` configuration to support
|
40
|
+
the matching change to `ActiveRecord::TestFixtures`, previous singular
|
41
|
+
form is deprecated and will be removed in Rails 7.2. (Juan Gueçaimburu, #2673)
|
42
|
+
* Add `send_email` matcher to match emails rather than specific jobs.
|
43
|
+
(Andrei Kaleshka, #2670)
|
44
|
+
* When using `render` in view specs, `:locals` will now be merged into the
|
45
|
+
default implicit template, allowing `render locals: {...}` style calls.
|
46
|
+
(Jon Rowe, #2686)
|
47
|
+
* Add support for `Rails.config.action_mailer.preview_paths` on Rails 7.1/
|
48
|
+
(Jon Rowe, #2706)
|
49
|
+
|
50
|
+
### 6.0.4 / 2023-11-21
|
51
|
+
[Full Changelog](https://github.com/rspec/rspec-rails/compare/v6.0.3...v6.0.4)
|
52
|
+
|
53
|
+
Bug Fixes:
|
54
|
+
|
55
|
+
* Fuzzy match `have_broadcasted_to` so that argument matchers can be used.
|
56
|
+
(Timothy Peraza, #2684)
|
57
|
+
* Fix fixture warning during `:context` hooks on Rails `main`. (Jon Rowe, #2685)
|
58
|
+
* Fix `stub_template` on Rails `main`. (Jon Rowe, #2685)
|
59
|
+
* Fix variable name in scaffolded view specs when namespaced. (Taketo Takashima, #2694)
|
60
|
+
* Prevent `take_failed_screenshot` producing an additional error through `metadata`
|
61
|
+
access. (Jon Rowe, #2704)
|
62
|
+
* Use `ActiveSupport::ExecutionContext::TestHelper` on Rails 7+. (Jon Rowe, #2711)
|
63
|
+
* Fix leak of templates stubbed with `stub_template` on Rails 7.1. (Jon Rowe, #2714)
|
3
64
|
|
4
65
|
### 6.0.3 / 2023-05-31
|
5
66
|
[Full Changelog](https://github.com/rspec/rspec-rails/compare/v6.0.2...v6.0.3)
|
@@ -138,7 +199,7 @@ Enhancements:
|
|
138
199
|
(Eloy Espinaco, Luka Lüdicke, #2355, #2356, #2378)
|
139
200
|
* Generated scaffold now includes engine route helpers when inside a mountable engine.
|
140
201
|
(Andrew W. Lee, #2372)
|
141
|
-
* Improve request spec "controller"
|
202
|
+
* Improve request spec "controller" scaffold when no action is specified.
|
142
203
|
(Thomas Hareau, #2399)
|
143
204
|
* Introduce testing snippets concept (Phil Pirozhkov, Benoit Tigeot, #2423)
|
144
205
|
* Prevent collisions with `let(:name)` for Rails 6.1 and `let(:method_name)` on older
|
@@ -541,7 +602,7 @@ Enhancements:
|
|
541
602
|
* Add support for PATCH to route specs created via scaffold. (Igor Zubkov, #1336)
|
542
603
|
* Improve controller and routing spec calls to `routes` by using `yield`
|
543
604
|
instead of `call`. (Anton Davydov, #1308)
|
544
|
-
* Add support for `ActiveJob` specs as standard `RSpec::Rails::
|
605
|
+
* Add support for `ActiveJob` specs as standard `RSpec::Rails::RailsExampleGroup`s
|
545
606
|
via both `type: :job` and inferring type from spec directory `spec/jobs`.
|
546
607
|
(Gabe Martin-Dempesy, #1361)
|
547
608
|
* Include `RSpec::Rails::FixtureSupport` into example groups using metadata
|
data/README.md
CHANGED
@@ -25,13 +25,14 @@ According to [RSpec Rails new versioning strategy][] use:
|
|
25
25
|
[`rspec-rails` 3.x]: https://github.com/rspec/rspec-rails/tree/3-9-maintenance
|
26
26
|
[`rspec-rails` 4.x]: https://github.com/rspec/rspec-rails/tree/4-1-maintenance
|
27
27
|
[`rspec-rails` 5.x]: https://github.com/rspec/rspec-rails/tree/5-1-maintenance
|
28
|
-
[`rspec-rails` 6.x]: https://github.com/rspec/rspec-rails/tree/6-
|
28
|
+
[`rspec-rails` 6.x]: https://github.com/rspec/rspec-rails/tree/6-1-maintenance
|
29
29
|
[RSpec Rails new versioning strategy]: https://github.com/rspec/rspec-rails/blob/main/rfcs/versioning-strategy.md
|
30
30
|
|
31
31
|
## Installation
|
32
32
|
|
33
|
-
**IMPORTANT** This README / branch refers to the
|
34
|
-
See the [`
|
33
|
+
**IMPORTANT** This README / branch refers to the 6.1.x stable release series, only bugfixes from this series will
|
34
|
+
be added here. See the [`main` branch on Github](https://github.com/rspec/rspec-rails/tree/main) if you want or
|
35
|
+
require the latest unstable features.
|
35
36
|
|
36
37
|
1. Add `rspec-rails` to **both** the `:development` and `:test` groups
|
37
38
|
of your app’s `Gemfile`:
|
@@ -39,7 +40,7 @@ See the [`6-0-maintenance` branch on Github](https://github.com/rspec/rspec-rail
|
|
39
40
|
```ruby
|
40
41
|
# Run against this stable release
|
41
42
|
group :development, :test do
|
42
|
-
gem 'rspec-rails', '~> 6.
|
43
|
+
gem 'rspec-rails', '~> 6.1.0'
|
43
44
|
end
|
44
45
|
|
45
46
|
# Or, run against the main branch
|
@@ -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
|
@@ -20,7 +20,7 @@ require 'rspec/rails'
|
|
20
20
|
# directory. Alternatively, in the individual `*_spec.rb` files, manually
|
21
21
|
# require only the support files necessary.
|
22
22
|
#
|
23
|
-
#
|
23
|
+
# Rails.root.glob('spec/support/**/*.rb').sort.each { |f| require f }
|
24
24
|
|
25
25
|
<% if RSpec::Rails::FeatureCheck.has_active_record_migration? -%>
|
26
26
|
# Checks for pending migrations and applies them before tests are run.
|
@@ -34,7 +34,13 @@ end
|
|
34
34
|
RSpec.configure do |config|
|
35
35
|
<% if RSpec::Rails::FeatureCheck.has_active_record? -%>
|
36
36
|
# Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
|
37
|
-
|
37
|
+
<% if ::Rails::VERSION::STRING < "7.1.0" -%>
|
38
|
+
config.fixture_path = Rails.root.join('spec/fixtures')
|
39
|
+
<% else -%>
|
40
|
+
config.fixture_paths = [
|
41
|
+
Rails.root.join('spec/fixtures')
|
42
|
+
]
|
43
|
+
<% end -%>
|
38
44
|
|
39
45
|
# If you're not using ActiveRecord, or you'd prefer not to run each of your
|
40
46
|
# examples within a transaction, remove the following line or assign false
|
@@ -52,7 +58,7 @@ RSpec.configure do |config|
|
|
52
58
|
# note if you'd prefer not to run each example within a transaction, you
|
53
59
|
# should set use_transactional_fixtures to false.
|
54
60
|
#
|
55
|
-
# config.fixture_path =
|
61
|
+
# config.fixture_path = Rails.root.join('spec/fixtures')
|
56
62
|
# config.use_transactional_fixtures = true
|
57
63
|
|
58
64
|
<% end -%>
|
@@ -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
|
@@ -2,7 +2,7 @@ require 'rails_helper'
|
|
2
2
|
|
3
3
|
<% output_attributes = attributes.reject{|attribute| [:datetime, :timestamp, :time, :date].index(attribute.type) } -%>
|
4
4
|
RSpec.describe "<%= ns_table_name %>/edit", <%= type_metatag(:view) %> do
|
5
|
-
let(:<%=
|
5
|
+
let(:<%= singular_table_name %>) {
|
6
6
|
<%= class_name %>.create!(<%= ')' if output_attributes.empty? %>
|
7
7
|
<% output_attributes.each_with_index do |attribute, attribute_index| -%>
|
8
8
|
<%= attribute.name %>: <%= attribute.default.inspect %><%= attribute_index == output_attributes.length - 1 ? '' : ','%>
|
@@ -11,13 +11,13 @@ RSpec.describe "<%= ns_table_name %>/edit", <%= type_metatag(:view) %> do
|
|
11
11
|
}
|
12
12
|
|
13
13
|
before(:each) do
|
14
|
-
assign(:<%=
|
14
|
+
assign(:<%= singular_table_name %>, <%= singular_table_name %>)
|
15
15
|
end
|
16
16
|
|
17
17
|
it "renders the edit <%= ns_file_name %> form" do
|
18
18
|
render
|
19
19
|
|
20
|
-
assert_select "form[action=?][method=?]", <%= ns_file_name %>_path(<%=
|
20
|
+
assert_select "form[action=?][method=?]", <%= ns_file_name %>_path(<%= singular_table_name %>), "post" do
|
21
21
|
<% for attribute in output_attributes -%>
|
22
22
|
<%- name = attribute.respond_to?(:column_name) ? attribute.column_name : attribute.name %>
|
23
23
|
assert_select "<%= attribute.input_type -%>[name=?]", "<%= ns_file_name %>[<%= name %>]"
|
@@ -3,7 +3,7 @@ require 'rails_helper'
|
|
3
3
|
<% output_attributes = attributes.reject{|attribute| [:datetime, :timestamp, :time, :date].index(attribute.type) } -%>
|
4
4
|
RSpec.describe "<%= ns_table_name %>/new", <%= type_metatag(:view) %> do
|
5
5
|
before(:each) do
|
6
|
-
assign(:<%=
|
6
|
+
assign(:<%= singular_table_name %>, <%= class_name %>.new(<%= '))' if output_attributes.empty? %>
|
7
7
|
<% output_attributes.each_with_index do |attribute, attribute_index| -%>
|
8
8
|
<%= attribute.name %>: <%= attribute.default.inspect %><%= attribute_index == output_attributes.length - 1 ? '' : ','%>
|
9
9
|
<% end -%>
|
@@ -3,7 +3,7 @@ require 'rails_helper'
|
|
3
3
|
<% output_attributes = attributes.reject{|attribute| [:datetime, :timestamp, :time, :date].index(attribute.type) } -%>
|
4
4
|
RSpec.describe "<%= ns_table_name %>/show", <%= type_metatag(:view) %> do
|
5
5
|
before(:each) do
|
6
|
-
assign(:<%=
|
6
|
+
assign(:<%= singular_table_name %>, <%= class_name %>.create!(<%= '))' if output_attributes.empty? %>
|
7
7
|
<% output_attributes.each_with_index do |attribute, attribute_index| -%>
|
8
8
|
<%= attribute.name %>: <%= value_for(attribute) %><%= attribute_index == output_attributes.length - 1 ? '' : ','%>
|
9
9
|
<% end -%>
|
@@ -57,7 +57,7 @@ module RSpec
|
|
57
57
|
end
|
58
58
|
|
59
59
|
# @private
|
60
|
-
def self.initialize_configuration(config) # rubocop:disable Metrics/MethodLength,Metrics/CyclomaticComplexity
|
60
|
+
def self.initialize_configuration(config) # rubocop:disable Metrics/MethodLength,Metrics/CyclomaticComplexity,Metrics/AbcSize,Metrics/PerceivedComplexity
|
61
61
|
config.backtrace_exclusion_patterns << /vendor\//
|
62
62
|
config.backtrace_exclusion_patterns << %r{lib/rspec/rails}
|
63
63
|
|
@@ -69,7 +69,13 @@ module RSpec
|
|
69
69
|
config.add_setting :use_transactional_fixtures, alias_with: :use_transactional_examples
|
70
70
|
config.add_setting :use_instantiated_fixtures
|
71
71
|
config.add_setting :global_fixtures
|
72
|
-
|
72
|
+
|
73
|
+
if ::Rails::VERSION::STRING < "7.1.0"
|
74
|
+
config.add_setting :fixture_path
|
75
|
+
else
|
76
|
+
config.add_setting :fixture_paths
|
77
|
+
end
|
78
|
+
|
73
79
|
config.include RSpec::Rails::FixtureSupport, :use_fixtures
|
74
80
|
|
75
81
|
# We'll need to create a deprecated module in order to properly report to
|
@@ -157,6 +163,29 @@ module RSpec
|
|
157
163
|
filter_gems_from_backtrace "activemodel", "activerecord",
|
158
164
|
"activesupport", "activejob"
|
159
165
|
end
|
166
|
+
|
167
|
+
# @deprecated TestFixtures#fixture_path is deprecated and will be removed in Rails 7.2
|
168
|
+
if ::Rails::VERSION::STRING >= "7.1.0"
|
169
|
+
def fixture_path
|
170
|
+
RSpec.deprecate(
|
171
|
+
"config.fixture_path",
|
172
|
+
replacement: "config.fixture_paths",
|
173
|
+
message: "Rails 7.1 has deprecated the singular fixture_path in favour of an array." \
|
174
|
+
"You should migrate to plural:"
|
175
|
+
)
|
176
|
+
fixture_paths&.first
|
177
|
+
end
|
178
|
+
|
179
|
+
def fixture_path=(path)
|
180
|
+
RSpec.deprecate(
|
181
|
+
"config.fixture_path = #{path.inspect}",
|
182
|
+
replacement: "config.fixture_paths = [#{path.inspect}]",
|
183
|
+
message: "Rails 7.1 has deprecated the singular fixture_path in favour of an array." \
|
184
|
+
"You should migrate to plural:"
|
185
|
+
)
|
186
|
+
self.fixture_paths = Array(path)
|
187
|
+
end
|
188
|
+
end
|
160
189
|
end
|
161
190
|
|
162
191
|
add_test_type_configurations(config)
|
@@ -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)
|
@@ -2,6 +2,11 @@
|
|
2
2
|
# suite and ammeter.
|
3
3
|
require 'rspec/rails/matchers'
|
4
4
|
|
5
|
+
if ::Rails::VERSION::MAJOR >= 7
|
6
|
+
require 'active_support/current_attributes/test_helper'
|
7
|
+
require 'active_support/execution_context/test_helper'
|
8
|
+
end
|
9
|
+
|
5
10
|
module RSpec
|
6
11
|
module Rails
|
7
12
|
# @api public
|
@@ -12,7 +17,11 @@ module RSpec
|
|
12
17
|
include RSpec::Rails::MinitestLifecycleAdapter
|
13
18
|
include RSpec::Rails::MinitestAssertionAdapter
|
14
19
|
include RSpec::Rails::FixtureSupport
|
15
|
-
|
20
|
+
if ::Rails::VERSION::MAJOR >= 7
|
21
|
+
include RSpec::Rails::TaggedLoggingAdapter
|
22
|
+
include ActiveSupport::CurrentAttributes::TestHelper
|
23
|
+
include ActiveSupport::ExecutionContext::TestHelper
|
24
|
+
end
|
16
25
|
end
|
17
26
|
end
|
18
27
|
end
|
@@ -44,6 +44,52 @@ module RSpec
|
|
44
44
|
].join("_").tr(CHARS_TO_TRANSLATE.join, "_").byteslice(0...200).scrub("") + "_#{rand(1000)}"
|
45
45
|
end
|
46
46
|
|
47
|
+
if ::Rails::VERSION::STRING.to_f >= 7.1
|
48
|
+
# @private
|
49
|
+
# Allows failure screenshot to work whilst not exposing metadata
|
50
|
+
class SuppressRailsScreenshotMetadata
|
51
|
+
def initialize
|
52
|
+
@example_data = {}
|
53
|
+
end
|
54
|
+
|
55
|
+
def [](key)
|
56
|
+
if @example_data.key?(key)
|
57
|
+
@example_data[key]
|
58
|
+
else
|
59
|
+
raise_wrong_scope_error
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def []=(key, value)
|
64
|
+
if key == :failure_screenshot_path
|
65
|
+
@example_data[key] = value
|
66
|
+
else
|
67
|
+
raise_wrong_scope_error
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def method_missing(_name, *_args, &_block)
|
72
|
+
raise_wrong_scope_error
|
73
|
+
end
|
74
|
+
|
75
|
+
private
|
76
|
+
|
77
|
+
def raise_wrong_scope_error
|
78
|
+
raise RSpec::Core::ExampleGroup::WrongScopeError,
|
79
|
+
"`metadata` is not available from within an example " \
|
80
|
+
"(e.g. an `it` block) or from constructs that run in the " \
|
81
|
+
"scope of an example (e.g. `before`, `let`, etc). It is " \
|
82
|
+
"only available on an example group (e.g. a `describe` or "\
|
83
|
+
"`context` block)"
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
# @private
|
88
|
+
def metadata
|
89
|
+
@metadata ||= SuppressRailsScreenshotMetadata.new
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
47
93
|
# Delegates to `Rails.application`.
|
48
94
|
def app
|
49
95
|
::Rails.application
|
@@ -65,6 +65,7 @@ module RSpec
|
|
65
65
|
# end
|
66
66
|
def render(options = {}, local_assigns = {}, &block)
|
67
67
|
options = _default_render_options if Hash === options && options.empty?
|
68
|
+
options = options.merge(_default_render_options) if Hash === options && options.keys == [:locals]
|
68
69
|
super(options, local_assigns, &block)
|
69
70
|
end
|
70
71
|
|
@@ -89,7 +90,7 @@ module RSpec
|
|
89
90
|
#
|
90
91
|
# stub_template("widgets/_widget.html.erb" => "This content.")
|
91
92
|
def stub_template(hash)
|
92
|
-
|
93
|
+
controller.prepend_view_path(StubResolverCache.resolver_for(hash))
|
93
94
|
end
|
94
95
|
|
95
96
|
# Provides access to the params hash that will be available within the
|
@@ -14,6 +14,8 @@ module RSpec
|
|
14
14
|
resolved_fixture_path =
|
15
15
|
if respond_to?(:file_fixture_path) && !file_fixture_path.nil?
|
16
16
|
file_fixture_path.to_s
|
17
|
+
elsif respond_to?(:fixture_paths)
|
18
|
+
(RSpec.configuration.fixture_paths&.first || '').to_s
|
17
19
|
else
|
18
20
|
(RSpec.configuration.fixture_path || '').to_s
|
19
21
|
end
|
@@ -26,7 +28,11 @@ module RSpec
|
|
26
28
|
include ActiveSupport::Testing::FileFixtures
|
27
29
|
|
28
30
|
class << self
|
29
|
-
|
31
|
+
if ::Rails::VERSION::STRING < "7.1.0"
|
32
|
+
attr_accessor :fixture_path
|
33
|
+
else
|
34
|
+
attr_accessor :fixture_paths
|
35
|
+
end
|
30
36
|
|
31
37
|
# Get instance of wrapper
|
32
38
|
def instance
|
@@ -23,10 +23,11 @@ module RSpec
|
|
23
23
|
|
24
24
|
# TestFixtures#fixture_path is deprecated and will be removed in Rails 7.2
|
25
25
|
if respond_to?(:fixture_paths=)
|
26
|
-
fixture_paths
|
26
|
+
self.fixture_paths = RSpec.configuration.fixture_paths
|
27
27
|
else
|
28
28
|
self.fixture_path = RSpec.configuration.fixture_path
|
29
29
|
end
|
30
|
+
|
30
31
|
self.use_transactional_tests = RSpec.configuration.use_transactional_fixtures
|
31
32
|
self.use_instantiated_fixtures = RSpec.configuration.use_instantiated_fixtures
|
32
33
|
|
@@ -37,28 +38,50 @@ module RSpec
|
|
37
38
|
module Fixtures
|
38
39
|
extend ActiveSupport::Concern
|
39
40
|
|
41
|
+
# rubocop:disable Metrics/BlockLength
|
40
42
|
class_methods do
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
43
|
+
if ::Rails.version.to_f >= 7.1
|
44
|
+
def fixtures(*args)
|
45
|
+
super.tap do
|
46
|
+
fixture_sets.each_pair do |method_name, fixture_name|
|
47
|
+
proxy_method_warning_if_called_in_before_context_scope(method_name, fixture_name)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def proxy_method_warning_if_called_in_before_context_scope(method_name, fixture_name)
|
53
|
+
define_method(method_name) do |*args, **kwargs, &blk|
|
54
|
+
if RSpec.current_scope == :before_context_hook
|
55
|
+
RSpec.warn_with("Calling fixture method in before :context ")
|
56
|
+
else
|
57
|
+
access_fixture(fixture_name, *args, **kwargs, &blk)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
else
|
62
|
+
def fixtures(*args)
|
63
|
+
orig_methods = private_instance_methods
|
64
|
+
super.tap do
|
65
|
+
new_methods = private_instance_methods - orig_methods
|
66
|
+
new_methods.each do |method_name|
|
67
|
+
proxy_method_warning_if_called_in_before_context_scope(method_name)
|
68
|
+
end
|
47
69
|
end
|
48
70
|
end
|
49
|
-
end
|
50
71
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
72
|
+
def proxy_method_warning_if_called_in_before_context_scope(method_name)
|
73
|
+
orig_implementation = instance_method(method_name)
|
74
|
+
define_method(method_name) do |*args, &blk|
|
75
|
+
if RSpec.current_scope == :before_context_hook
|
76
|
+
RSpec.warn_with("Calling fixture method in before :context ")
|
77
|
+
else
|
78
|
+
orig_implementation.bind(self).call(*args, &blk)
|
79
|
+
end
|
58
80
|
end
|
59
81
|
end
|
60
82
|
end
|
61
83
|
end
|
84
|
+
# rubocop:enable Metrics/BlockLength
|
62
85
|
end
|
63
86
|
end
|
64
87
|
end
|
@@ -112,7 +112,7 @@ module RSpec
|
|
112
112
|
decoded = ActiveSupport::JSON.decode(msg)
|
113
113
|
decoded = decoded.with_indifferent_access if decoded.is_a?(Hash)
|
114
114
|
|
115
|
-
if @data.nil? || @data
|
115
|
+
if @data.nil? || values_match?(@data, decoded)
|
116
116
|
@block.call(decoded)
|
117
117
|
true
|
118
118
|
else
|
@@ -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
|
|
@@ -0,0 +1,122 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RSpec
|
4
|
+
module Rails
|
5
|
+
module Matchers
|
6
|
+
# @api private
|
7
|
+
#
|
8
|
+
# Matcher class for `send_email`. Should not be instantiated directly.
|
9
|
+
#
|
10
|
+
# @see RSpec::Rails::Matchers#send_email
|
11
|
+
class SendEmail < RSpec::Rails::Matchers::BaseMatcher
|
12
|
+
# @api private
|
13
|
+
# Define the email attributes that should be included in the inspection output.
|
14
|
+
INSPECT_EMAIL_ATTRIBUTES = %i[subject from to cc bcc].freeze
|
15
|
+
|
16
|
+
def initialize(criteria)
|
17
|
+
@criteria = criteria
|
18
|
+
end
|
19
|
+
|
20
|
+
# @api private
|
21
|
+
def supports_value_expectations?
|
22
|
+
false
|
23
|
+
end
|
24
|
+
|
25
|
+
# @api private
|
26
|
+
def supports_block_expectations?
|
27
|
+
true
|
28
|
+
end
|
29
|
+
|
30
|
+
def matches?(block)
|
31
|
+
define_matched_emails(block)
|
32
|
+
|
33
|
+
@matched_emails.one?
|
34
|
+
end
|
35
|
+
|
36
|
+
# @api private
|
37
|
+
# @return [String]
|
38
|
+
def failure_message
|
39
|
+
result =
|
40
|
+
if multiple_match?
|
41
|
+
"More than 1 matching emails were sent."
|
42
|
+
else
|
43
|
+
"No matching emails were sent."
|
44
|
+
end
|
45
|
+
"#{result}#{sent_emails_message}"
|
46
|
+
end
|
47
|
+
|
48
|
+
# @api private
|
49
|
+
# @return [String]
|
50
|
+
def failure_message_when_negated
|
51
|
+
"Expected not to send an email but it was sent."
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
def diffable?
|
57
|
+
true
|
58
|
+
end
|
59
|
+
|
60
|
+
def deliveries
|
61
|
+
ActionMailer::Base.deliveries
|
62
|
+
end
|
63
|
+
|
64
|
+
def define_matched_emails(block)
|
65
|
+
before = deliveries.dup
|
66
|
+
|
67
|
+
block.call
|
68
|
+
|
69
|
+
after = deliveries
|
70
|
+
|
71
|
+
@diff = after - before
|
72
|
+
@matched_emails = @diff.select(&method(:matched_email?))
|
73
|
+
end
|
74
|
+
|
75
|
+
def matched_email?(email)
|
76
|
+
@criteria.all? do |attr, value|
|
77
|
+
expected =
|
78
|
+
case attr
|
79
|
+
when :to, :from, :cc, :bcc then Array(value)
|
80
|
+
else
|
81
|
+
value
|
82
|
+
end
|
83
|
+
|
84
|
+
values_match?(expected, email.public_send(attr))
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def multiple_match?
|
89
|
+
@matched_emails.many?
|
90
|
+
end
|
91
|
+
|
92
|
+
def sent_emails_message
|
93
|
+
if @diff.empty?
|
94
|
+
"\n\nThere were no any emails sent inside the expectation block."
|
95
|
+
else
|
96
|
+
sent_emails =
|
97
|
+
@diff.map do |email|
|
98
|
+
inspected = INSPECT_EMAIL_ATTRIBUTES.map { |attr| "#{attr}: #{email.public_send(attr)}" }.join(", ")
|
99
|
+
"- #{inspected}"
|
100
|
+
end.join("\n")
|
101
|
+
"\n\nThe following emails were sent:\n#{sent_emails}"
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
# @api public
|
107
|
+
# Check email sending with specific parameters.
|
108
|
+
#
|
109
|
+
# @example Positive expectation
|
110
|
+
# expect { action }.to send_email
|
111
|
+
#
|
112
|
+
# @example Negative expectations
|
113
|
+
# expect { action }.not_to send_email
|
114
|
+
#
|
115
|
+
# @example More precise expectation with attributes to match
|
116
|
+
# expect { action }.to send_email(to: 'test@example.com', subject: 'Confirm email')
|
117
|
+
def send_email(criteria = {})
|
118
|
+
SendEmail.new(criteria)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
data/lib/rspec/rails/matchers.rb
CHANGED
@@ -20,6 +20,7 @@ require 'rspec/rails/matchers/be_a_new'
|
|
20
20
|
require 'rspec/rails/matchers/relation_match_array'
|
21
21
|
require 'rspec/rails/matchers/be_valid'
|
22
22
|
require 'rspec/rails/matchers/have_http_status'
|
23
|
+
require 'rspec/rails/matchers/send_email'
|
23
24
|
|
24
25
|
if RSpec::Rails::FeatureCheck.has_active_job?
|
25
26
|
require 'rspec/rails/matchers/active_job'
|
data/lib/rspec/rails/version.rb
CHANGED
data/lib/rspec-rails.rb
CHANGED
@@ -47,10 +47,18 @@ module RSpec
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
-
|
51
|
-
|
50
|
+
if ::Rails::VERSION::STRING >= "7.1.0"
|
51
|
+
def config_default_preview_path(options)
|
52
|
+
return unless options.preview_paths.empty?
|
52
53
|
|
53
|
-
|
54
|
+
options.preview_paths << "#{::Rails.root}/spec/mailers/previews"
|
55
|
+
end
|
56
|
+
else
|
57
|
+
def config_default_preview_path(options)
|
58
|
+
return unless options.preview_path.blank?
|
59
|
+
|
60
|
+
options.preview_path = "#{::Rails.root}/spec/mailers/previews"
|
61
|
+
end
|
54
62
|
end
|
55
63
|
|
56
64
|
def supports_action_mailer_previews?(config)
|
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rspec-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.
|
4
|
+
version: 6.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Chelimsky
|
8
8
|
- Andy Lindeman
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain:
|
12
12
|
- |
|
@@ -44,7 +44,7 @@ cert_chain:
|
|
44
44
|
ZsVDj6a7lH3cNqtWXZxrb2wO38qV5AkYj8SQK7Hj3/Yui9myUX3crr+PdetazSqQ
|
45
45
|
F3MdtaDehhjC
|
46
46
|
-----END CERTIFICATE-----
|
47
|
-
date:
|
47
|
+
date: 2024-06-19 00:00:00.000000000 Z
|
48
48
|
dependencies:
|
49
49
|
- !ruby/object:Gem::Dependency
|
50
50
|
name: actionpack
|
@@ -94,56 +94,56 @@ dependencies:
|
|
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
|
@@ -284,6 +284,7 @@ files:
|
|
284
284
|
- lib/rspec/rails/matchers/redirect_to.rb
|
285
285
|
- lib/rspec/rails/matchers/relation_match_array.rb
|
286
286
|
- lib/rspec/rails/matchers/routing_matchers.rb
|
287
|
+
- lib/rspec/rails/matchers/send_email.rb
|
287
288
|
- lib/rspec/rails/tasks/rspec.rake
|
288
289
|
- lib/rspec/rails/vendor/capybara.rb
|
289
290
|
- lib/rspec/rails/version.rb
|
@@ -296,11 +297,11 @@ licenses:
|
|
296
297
|
- MIT
|
297
298
|
metadata:
|
298
299
|
bug_tracker_uri: https://github.com/rspec/rspec-rails/issues
|
299
|
-
changelog_uri: https://github.com/rspec/rspec-rails/blob/v6.
|
300
|
+
changelog_uri: https://github.com/rspec/rspec-rails/blob/v6.1.3/Changelog.md
|
300
301
|
documentation_uri: https://rspec.info/documentation/
|
301
302
|
mailing_list_uri: https://groups.google.com/forum/#!forum/rspec
|
302
303
|
source_code_uri: https://github.com/rspec/rspec-rails
|
303
|
-
post_install_message:
|
304
|
+
post_install_message:
|
304
305
|
rdoc_options:
|
305
306
|
- "--charset=UTF-8"
|
306
307
|
require_paths:
|
@@ -317,7 +318,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
317
318
|
version: '0'
|
318
319
|
requirements: []
|
319
320
|
rubygems_version: 3.1.6
|
320
|
-
signing_key:
|
321
|
+
signing_key:
|
321
322
|
specification_version: 4
|
322
323
|
summary: RSpec for Rails
|
323
324
|
test_files: []
|
metadata.gz.sig
CHANGED
Binary file
|