Skip to content

Commit f1afa0c

Browse files
committed
Add fixture_paths configuration setting
1 parent 1873102 commit f1afa0c

File tree

6 files changed

+87
-17
lines changed

6 files changed

+87
-17
lines changed

lib/generators/rspec/install/templates/spec/rails_helper.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,13 @@
3434
RSpec.configure do |config|
3535
<% if RSpec::Rails::FeatureCheck.has_active_record? -%>
3636
# Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
37+
<% if ::Rails::VERSION::STRING < "7.1.0" -%>
3738
config.fixture_path = Rails.root.join('spec/fixtures')
39+
<% else -%>
40+
config.fixture_paths = [
41+
Rails.root.join('spec/fixtures')
42+
]
43+
<% end -%>
3844
3945
# If you're not using ActiveRecord, or you'd prefer not to run each of your
4046
# examples within a transaction, remove the following line or assign false

lib/rspec/rails/configuration.rb

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ def self.add_test_type_configurations(config)
5757
end
5858

5959
# @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
6161
config.backtrace_exclusion_patterns << /vendor\//
6262
config.backtrace_exclusion_patterns << %r{lib/rspec/rails}
6363

@@ -69,7 +69,13 @@ def self.initialize_configuration(config) # rubocop:disable Metrics/MethodLength
6969
config.add_setting :use_transactional_fixtures, alias_with: :use_transactional_examples
7070
config.add_setting :use_instantiated_fixtures
7171
config.add_setting :global_fixtures
72-
config.add_setting :fixture_path
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+
7379
config.include RSpec::Rails::FixtureSupport, :use_fixtures
7480

7581
# We'll need to create a deprecated module in order to properly report to
@@ -157,6 +163,18 @@ def filter_rails_from_backtrace!
157163
filter_gems_from_backtrace "activemodel", "activerecord",
158164
"activesupport", "activejob"
159165
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 config.fixture_path=(path)
170+
RSpec.deprecate(
171+
"config.fixture_path = #{path.inspect}",
172+
replacement: "config.fixture_paths = [#{path.inspect}]",
173+
message: "Rails 7.1 has deprecated the singular fixture_path in favour of an array"
174+
)
175+
self.fixture_paths = Array(path)
176+
end
177+
end
160178
end
161179

162180
add_test_type_configurations(config)

lib/rspec/rails/fixture_support.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,11 @@ def run_in_transaction?
2323

2424
# TestFixtures#fixture_path is deprecated and will be removed in Rails 7.2
2525
if respond_to?(:fixture_paths=)
26-
fixture_paths << RSpec.configuration.fixture_path
26+
self.fixture_paths = RSpec.configuration.fixture_paths
2727
else
2828
self.fixture_path = RSpec.configuration.fixture_path
2929
end
30+
3031
self.use_transactional_tests = RSpec.configuration.use_transactional_fixtures
3132
self.use_instantiated_fixtures = RSpec.configuration.use_instantiated_fixtures
3233

spec/generators/rspec/install/install_generator_spec.rb

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ def have_a_fixture_path
1515
match(/^ config\.fixture_path = /m)
1616
end
1717

18+
def have_fixture_paths
19+
match(/^ config\.fixture_paths = /m)
20+
end
21+
1822
def maintain_test_schema
1923
match(/ActiveRecord::Migration\.maintain_test_schema!/m)
2024
end
@@ -84,7 +88,11 @@ def filter_rails_from_backtrace
8488

8589
specify "with default fixture path" do
8690
run_generator
87-
expect(rails_helper).to have_a_fixture_path
91+
if ::Rails::VERSION::STRING < "7.1.0"
92+
expect(rails_helper).to have_a_fixture_path
93+
else
94+
expect(rails_helper).to have_fixture_paths
95+
end
8896
end
8997

9098
specify "with transactional fixtures" do
@@ -127,6 +135,7 @@ def filter_rails_from_backtrace
127135
specify "without fixture path" do
128136
run_generator
129137
expect(rails_helper).not_to have_a_fixture_path
138+
expect(rails_helper).not_to have_fixture_paths
130139
end
131140

132141
specify "without transactional fixtures" do

spec/rspec/rails/configuration_spec.rb

Lines changed: 41 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,11 @@
7878

7979
include_examples "adds setting", :global_fixtures
8080

81-
include_examples "adds setting", :fixture_path
81+
if ::Rails::VERSION::STRING < "7.1.0"
82+
include_examples "adds setting", :fixture_path
83+
else
84+
include_examples "adds setting", :fixture_paths
85+
end
8286

8387
include_examples "adds setting", :rendering_views
8488

@@ -157,22 +161,49 @@ def in_inferring_type_from_location_environment
157161
include_examples "infers type from location", :feature, "spec/features"
158162
end
159163

160-
it "fixture support is included with metadata `:use_fixtures`" do
161-
in_sub_process do
162-
RSpec.configuration.global_fixtures = [:foo]
163-
RSpec.configuration.fixture_path = "custom/path"
164+
if ::Rails::VERSION::STRING < "7.1.0"
165+
it "fixture support is included with metadata `:use_fixtures`" do
166+
in_sub_process do
167+
RSpec.configuration.global_fixtures = [:foo]
168+
RSpec.configuration.fixture_path = "custom/path"
164169

165-
group = RSpec.describe("Arbitrary Description", :use_fixtures)
170+
group = RSpec.describe("Arbitrary Description", :use_fixtures)
166171

167-
if ::Rails::VERSION::STRING < '7.1.0'
168172
expect(group).to respond_to(:fixture_path)
169173
expect(group.fixture_path).to eq("custom/path")
170-
else
174+
175+
expect(group.new.respond_to?(:foo, true)).to be(true)
176+
end
177+
end
178+
else
179+
it "fixture support is included with metadata `:use_fixtures` and fixture_paths configured" do
180+
in_sub_process do
181+
RSpec.configuration.global_fixtures = [:foo]
182+
RSpec.configuration.fixture_paths = ["custom/path", "other/custom/path"]
183+
184+
group = RSpec.describe("Arbitrary Description", :use_fixtures)
185+
171186
expect(group).to respond_to(:fixture_paths)
172-
expect(group.fixture_paths).to include("custom/path")
187+
expect(group.fixture_paths).to eq(["custom/path", "other/custom/path"])
188+
189+
expect(group.new.respond_to?(:foo, true)).to be(true)
173190
end
191+
end
192+
193+
it "fixture support is included with metadata `:use_fixtures` and deprecated fixture_path configured" do
194+
in_sub_process do
195+
expect(RSpec).to receive(:deprecate)
196+
197+
RSpec.configuration.global_fixtures = [:foo]
198+
RSpec.configuration.fixture_path = "custom/path"
174199

175-
expect(group.new.respond_to?(:foo, true)).to be(true)
200+
group = RSpec.describe("Arbitrary Description", :use_fixtures)
201+
202+
expect(group).to respond_to(:fixture_paths)
203+
expect(group.fixture_paths).to eq(["custom/path"])
204+
205+
expect(group.new.respond_to?(:foo, true)).to be(true)
206+
end
176207
end
177208
end
178209

spec/rspec/rails/fixture_support_spec.rb

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
11
module RSpec::Rails
22
RSpec.describe FixtureSupport do
33
context "with use_transactional_fixtures set to false" do
4-
it "still supports fixture_path" do
4+
it "still supports fixture_path and fixture_paths" do
55
allow(RSpec.configuration).to receive(:use_transactional_fixtures) { false }
66
group = RSpec::Core::ExampleGroup.describe do
77
include FixtureSupport
88
end
99

10-
expect(group).to respond_to(:fixture_path)
11-
expect(group).to respond_to(:fixture_path=)
10+
if ::Rails::VERSION::STRING < "7.1.0"
11+
expect(group).to respond_to(:fixture_path)
12+
expect(group).to respond_to(:fixture_path=)
13+
else
14+
expect(group).to respond_to(:fixture_paths)
15+
expect(group).to respond_to(:fixture_paths=)
16+
end
1217
end
1318
end
1419

0 commit comments

Comments
 (0)