Skip to content

Commit 9d304d1

Browse files
author
Laurent Cobos
committed
[FIX-1554] fixture_file_upload cannot find files
1 parent 89aa0a0 commit 9d304d1

File tree

4 files changed

+78
-0
lines changed

4 files changed

+78
-0
lines changed

lib/rspec/rails.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
require 'rspec/rails/view_rendering'
1010
require 'rspec/rails/matchers'
1111
require 'rspec/rails/fixture_support'
12+
require 'rspec/rails/fixture_file_upload_support'
1213
require 'rspec/rails/file_fixture_support'
1314
require 'rspec/rails/example'
1415
require 'rspec/rails/vendor/capybara'

lib/rspec/rails/configuration.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,9 @@ def self.initialize_configuration(config)
8484
config.add_setting :file_fixture_path, :default => 'spec/fixtures/files'
8585
config.include RSpec::Rails::FileFixtureSupport
8686
end
87+
88+
config.include RSpec::Rails::FixtureFileUploadSupport
89+
8790
# This allows us to expose `render_views` as a config option even though it
8891
# breaks the convention of other options by using `render_views` as a
8992
# command (i.e. `render_views = true`), where it would normally be used
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
module RSpec
2+
module Rails
3+
# @private
4+
module FixtureFileUploadSupport
5+
extend ActiveSupport::Concern
6+
7+
included do
8+
delegate :fixture_file_upload, :to => :rails_fixture_file_wrapper
9+
end
10+
11+
private
12+
13+
def rails_fixture_file_wrapper
14+
resolved_fixture_path = (fixture_path || RSpec.configuration.fixture_path || '')
15+
RailsFixtureFileWrapper.fixture_path = File.join(resolved_fixture_path, '')
16+
RailsFixtureFileWrapper.instance
17+
end
18+
19+
class RailsFixtureFileWrapper
20+
class << self
21+
attr_reader :fixture_path
22+
23+
# Get the instance of wrapper
24+
def instance
25+
@instance ||= new
26+
end
27+
28+
def fixture_path=(value)
29+
# Rails 3.0..3.1 are using ActionController::TestCase class to resolve fixture_path
30+
# see https://apidock.com/rails/v3.0.0/ActionDispatch/TestProcess/fixture_file_upload
31+
if ActionController::TestCase.respond_to?(:fixture_path)
32+
ActionController::TestCase.fixture_path = value
33+
end
34+
@fixture_path = value
35+
end
36+
37+
include ActionDispatch::TestProcess if defined?(ActionDispatch::TestProcess)
38+
end
39+
end
40+
end
41+
end
42+
end
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
require 'spec_helper'
2+
3+
module RSpec::Rails
4+
describe FixtureFileUploadSupport do
5+
context 'with fixture path set in config' do
6+
before { RSpec.configuration.fixture_path = File.dirname(__FILE__) }
7+
8+
it 'resolves fixture file' do
9+
expect(fixture_file_upload_resolved.run).to be true
10+
end
11+
end
12+
13+
context 'with fixture path set in spec' do
14+
it 'resolves fixture file' do
15+
expect(fixture_file_upload_resolved(File.dirname(__FILE__)).run).to be true
16+
end
17+
end
18+
19+
def fixture_file_upload_resolved(fixture_path = nil)
20+
RSpec::Core::ExampleGroup.describe do
21+
include RSpec::Rails::FixtureFileUploadSupport
22+
23+
self.fixture_path = fixture_path if fixture_path
24+
25+
it 'supports fixture file upload' do
26+
file = fixture_file_upload(File.basename(__FILE__))
27+
expect(file.read).to match(/describe FixtureFileUploadSupport/im)
28+
end
29+
end
30+
end
31+
end
32+
end

0 commit comments

Comments
 (0)