Skip to content

Commit bc7d3b1

Browse files
committed
migrate to Rails 7.1's file_fixture_upload naming approach
rails/rails#48857 renamed `fixture_file_upload` to `file_fixture_upload` to reduce "confusion and surprise". With this change, `file_fixture_upload` now works in RSpec, with `fixture_file_upload` still functional to maintain backwards compatibility.
1 parent 4e87304 commit bc7d3b1

9 files changed

+124
-94
lines changed

.rubocop_todo.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ Lint/SuppressedException:
116116
# AllowedPatterns: (?-mix:(exactly|at_least|at_most)\(\d+\)\.times)
117117
Lint/UnreachableLoop:
118118
Exclude:
119-
- 'spec/rspec/rails/fixture_file_upload_support_spec.rb'
119+
- 'spec/rspec/rails/file_fixture_upload_support_spec.rb'
120120
- 'spec/rspec/rails/fixture_support_spec.rb'
121121

122122
# Offense count: 12

example_app_generator/generate_stuff.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ def setup_tasks
4848
def final_tasks
4949
copy_file 'spec/verify_no_active_record_spec.rb'
5050
copy_file 'spec/verify_no_fixture_setup_spec.rb'
51-
copy_file 'spec/verify_fixture_file_upload_spec.rb'
51+
copy_file 'spec/verify_file_fixture_upload_spec.rb'
5252
end
5353

5454
def skip_active_record?
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
require 'rails_helper'
2+
3+
RSpec.describe 'Example App', :use_fixtures, type: :model do
4+
if ::Rails::VERSION::STRING < "7.1.0"
5+
it 'supports fixture_file_upload' do
6+
file = fixture_file_upload(__FILE__)
7+
expect(file.read).to match(/RSpec\.describe 'Example App'/im)
8+
end
9+
else
10+
it 'supports file_fixture_upload' do
11+
file = file_fixture_upload(__FILE__)
12+
expect(file.read).to match(/RSpec\.describe 'Example App'/im)
13+
end
14+
15+
it 'supports fixture_file_upload' do
16+
file = fixture_file_upload(__FILE__)
17+
expect(file.read).to match(/RSpec\.describe 'Example App'/im)
18+
end
19+
end
20+
end

example_app_generator/no_active_record/spec/verify_fixture_file_upload_spec.rb

-8
This file was deleted.

lib/rspec/rails.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
require 'rspec/rails/matchers'
1111
require 'rspec/rails/fixture_support'
1212
require 'rspec/rails/file_fixture_support'
13-
require 'rspec/rails/fixture_file_upload_support'
13+
require 'rspec/rails/file_fixture_upload_support'
1414
require 'rspec/rails/example'
1515
require 'rspec/rails/vendor/capybara'
1616
require 'rspec/rails/configuration'

lib/rspec/rails/configuration.rb

+2-2
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,8 @@ def self.initialize_configuration(config) # rubocop:disable Metrics/MethodLength
9090
config.add_setting :file_fixture_path, default: 'spec/fixtures/files'
9191
config.include RSpec::Rails::FileFixtureSupport
9292

93-
# Add support for fixture_path on fixture_file_upload
94-
config.include RSpec::Rails::FixtureFileUploadSupport
93+
# Add support for fixture_path on file_fixture_upload
94+
config.include RSpec::Rails::FileFixtureUploadSupport
9595

9696
# This allows us to expose `render_views` as a config option even though it
9797
# breaks the convention of other options by using `render_views` as a

lib/rspec/rails/fixture_file_upload_support.rb lib/rspec/rails/file_fixture_upload_support.rb

+7-7
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
module RSpec
22
module Rails
33
# @private
4-
module FixtureFileUploadSupport
5-
delegate :fixture_file_upload, to: :rails_fixture_file_wrapper
4+
module FileFixtureUploadSupport
5+
delegate :file_fixture_upload, :fixture_file_upload, to: :rails_file_fixture_wrapper
66

77
private
88

99
# In Rails 7.0 fixture file path needs to be relative to `file_fixture_path` instead, this change
1010
# was brought in with a deprecation warning on 6.1. In Rails 7.0 expect to rework this to remove
1111
# the old accessor.
12-
def rails_fixture_file_wrapper
13-
RailsFixtureFileWrapper.file_fixture_path = nil
12+
def rails_file_fixture_wrapper
13+
RailsFileFixtureWrapper.file_fixture_path = nil
1414
resolved_fixture_path =
1515
if respond_to?(:file_fixture_path) && !file_fixture_path.nil?
1616
file_fixture_path.to_s
@@ -19,11 +19,11 @@ def rails_fixture_file_wrapper
1919
else
2020
(RSpec.configuration.fixture_path || '').to_s
2121
end
22-
RailsFixtureFileWrapper.file_fixture_path = File.join(resolved_fixture_path, '') unless resolved_fixture_path.strip.empty?
23-
RailsFixtureFileWrapper.instance
22+
RailsFileFixtureWrapper.file_fixture_path = File.join(resolved_fixture_path, '') unless resolved_fixture_path.strip.empty?
23+
RailsFileFixtureWrapper.instance
2424
end
2525

26-
class RailsFixtureFileWrapper
26+
class RailsFileFixtureWrapper
2727
include ActionDispatch::TestProcess if defined?(ActionDispatch::TestProcess)
2828
include ActiveSupport::Testing::FileFixtures
2929

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
module RSpec::Rails
2+
RSpec.describe FileFixtureUploadSupport do
3+
if ::Rails::VERSION::STRING < "7.1.0"
4+
context 'with fixture path set in config' do
5+
it 'resolves fixture file' do
6+
RSpec.configuration.fixture_path = File.dirname(__FILE__)
7+
expect_to_pass file_fixture_upload_resolved('file_fixture_upload_support_spec.rb')
8+
end
9+
10+
it 'resolves supports `Pathname` objects' do
11+
RSpec.configuration.fixture_path = Pathname(File.dirname(__FILE__))
12+
expect_to_pass file_fixture_upload_resolved('file_fixture_upload_support_spec.rb')
13+
end
14+
end
15+
16+
context 'with fixture path set in spec' do
17+
it 'resolves fixture file' do
18+
expect_to_pass file_fixture_upload_resolved('file_fixture_upload_support_spec.rb', File.dirname(__FILE__))
19+
end
20+
end
21+
22+
context 'with fixture path not set' do
23+
it 'resolves fixture using relative path' do
24+
RSpec.configuration.fixture_path = nil
25+
expect_to_pass file_fixture_upload_resolved('spec/rspec/rails/file_fixture_upload_support_spec.rb')
26+
end
27+
end
28+
29+
def file_fixture_upload_resolved(fixture_name, file_fixture_path = nil)
30+
RSpec::Core::ExampleGroup.describe do
31+
include RSpec::Rails::FileFixtureUploadSupport
32+
33+
self.file_fixture_path = file_fixture_path
34+
35+
it 'supports fixture_file_upload' do
36+
file = fixture_file_upload(fixture_name)
37+
expect(file.read).to match(/describe FileFixtureUploadSupport/im)
38+
end
39+
end
40+
end
41+
else
42+
context 'with fixture paths set in config' do
43+
it 'resolves fixture file' do
44+
RSpec.configuration.fixture_paths = [File.dirname(__FILE__)]
45+
expect_to_pass file_fixture_upload_resolved('file_fixture_upload_support_spec.rb')
46+
end
47+
48+
it 'resolves supports `Pathname` objects' do
49+
RSpec.configuration.fixture_paths = [Pathname(File.dirname(__FILE__))]
50+
expect_to_pass file_fixture_upload_resolved('file_fixture_upload_support_spec.rb')
51+
end
52+
end
53+
54+
context 'with fixture path set in spec' do
55+
it 'resolves fixture file' do
56+
expect_to_pass file_fixture_upload_resolved('file_fixture_upload_support_spec.rb', File.dirname(__FILE__))
57+
end
58+
end
59+
60+
context 'with fixture path not set' do
61+
it 'resolves fixture using relative path' do
62+
RSpec.configuration.fixture_path = nil
63+
expect_to_pass file_fixture_upload_resolved('spec/rspec/rails/file_fixture_upload_support_spec.rb')
64+
end
65+
end
66+
67+
def file_fixture_upload_resolved(fixture_name, file_fixture_path = nil)
68+
RSpec::Core::ExampleGroup.describe do
69+
include RSpec::Rails::FileFixtureUploadSupport
70+
71+
self.file_fixture_path = file_fixture_path
72+
73+
it 'supports file_fixture_upload' do
74+
file = file_fixture_upload(fixture_name)
75+
expect(file.read).to match(/describe FileFixtureUploadSupport/im)
76+
end
77+
78+
it 'supports fixture_file_upload' do
79+
file = fixture_file_upload(fixture_name)
80+
expect(file.read).to match(/describe FileFixtureUploadSupport/im)
81+
end
82+
end
83+
end
84+
end
85+
86+
def expect_to_pass(group)
87+
result = group.run(failure_reporter)
88+
failure_reporter.exceptions.map { |e| raise e }
89+
expect(result).to be true
90+
end
91+
end
92+
end

spec/rspec/rails/fixture_file_upload_support_spec.rb

-74
This file was deleted.

0 commit comments

Comments
 (0)