Skip to content

Commit 562940e

Browse files
committed
Optional ActiveRecord config.
Signed-off-by: Hermann Mayer <[email protected]>
1 parent bd54ec4 commit 562940e

File tree

7 files changed

+92
-12
lines changed

7 files changed

+92
-12
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,4 @@ bundle
2222
specs.out
2323
spec/examples.txt
2424
specs.out
25+
test.db

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@
3333
end
3434
<% end -%>
3535
RSpec.configure do |config|
36+
# You can explicitly turn off ActiveRecord support on rspec-rails by
37+
# uncommenting the following line.
38+
# config.use_active_record = false
39+
3640
<% if RSpec::Rails::FeatureCheck.has_active_record? -%>
3741
# Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
3842
config.fixture_path = "#{::Rails.root}/spec/fixtures"

lib/rspec/rails/configuration.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ def self.initialize_configuration(config)
6464
config.add_setting :infer_base_class_for_anonymous_controllers, default: true
6565

6666
# fixture support
67+
config.add_setting :use_active_record, default: true
6768
config.add_setting :use_transactional_fixtures, alias_with: :use_transactional_examples
6869
config.add_setting :use_instantiated_fixtures
6970
config.add_setting :global_fixtures

lib/rspec/rails/fixture_support.rb

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@ module RSpec
22
module Rails
33
# @private
44
module FixtureSupport
5-
if defined?(ActiveRecord::TestFixtures)
6-
extend ActiveSupport::Concern
7-
include RSpec::Rails::SetupAndTeardownAdapter
8-
include RSpec::Rails::MinitestLifecycleAdapter
9-
include RSpec::Rails::MinitestAssertionAdapter
10-
include ActiveRecord::TestFixtures
5+
extend ActiveSupport::Concern
6+
7+
included do
8+
if RSpec.configuration.use_active_record? && defined?(ActiveRecord::TestFixtures)
9+
include RSpec::Rails::SetupAndTeardownAdapter
10+
include RSpec::Rails::MinitestLifecycleAdapter
11+
include RSpec::Rails::MinitestAssertionAdapter
12+
include ActiveRecord::TestFixtures
1113

12-
included do
1314
self.fixture_path = RSpec.configuration.fixture_path
1415
if ::Rails::VERSION::STRING > '5'
1516
self.use_transactional_tests = RSpec.configuration.use_transactional_fixtures

spec/rspec/rails/configuration_spec.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,9 @@
6464
:use_transactional_fixtures,
6565
alias_with: :use_transactional_examples
6666

67+
include_examples "adds setting", :use_active_record,
68+
:default => true
69+
6770
include_examples "adds setting", :use_instantiated_fixtures
6871

6972
include_examples "adds setting", :global_fixtures

spec/rspec/rails/fixture_support_spec.rb

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ module RSpec::Rails
22
RSpec.describe FixtureSupport do
33
context "with use_transactional_fixtures set to false" do
44
it "still supports fixture_path" do
5-
allow(RSpec.configuration).to receive(:use_transactional_fixtures) { false }
5+
allow(RSpec.configuration).to \
6+
receive(:use_transactional_fixtures) { false }
67
group = RSpec::Core::ExampleGroup.describe do
78
include FixtureSupport
89
end
@@ -21,5 +22,57 @@ module RSpec::Rails
2122

2223
expect { group.new.setup_fixtures }.to_not raise_error
2324
end
25+
26+
context "without database available" do
27+
let(:example_group) do
28+
RSpec::Core::ExampleGroup.describe("FixtureSupport") do
29+
include FixtureSupport
30+
include RSpec::Rails::MinitestLifecycleAdapter
31+
end
32+
end
33+
let(:example) do
34+
example_group.example("foo") do
35+
expect(true).to be(true)
36+
end
37+
end
38+
39+
RSpec.shared_examples_for "unrelated example raise" do
40+
it "raise due to no connection established" do
41+
expect(example_group.run).to be(false)
42+
expect(example.execution_result.exception).to \
43+
be_a(ActiveRecord::ConnectionNotEstablished)
44+
end
45+
end
46+
47+
RSpec.shared_examples_for "unrelated example does not raise" do
48+
it "does not raise" do
49+
expect(example_group.run).to be(true)
50+
expect(example.execution_result.exception).not_to \
51+
be_a(ActiveRecord::ConnectionNotEstablished)
52+
end
53+
end
54+
55+
before { clear_active_record_connection }
56+
57+
after { establish_active_record_connection }
58+
59+
context "with use_active_record set to false" do
60+
before { RSpec.configuration.use_active_record = false }
61+
62+
after { RSpec.configuration.use_active_record = true }
63+
64+
include_examples "unrelated example does not raise"
65+
end
66+
67+
context "with use_active_record set to true" do
68+
before { RSpec.configuration.use_active_record = true }
69+
70+
if Rails.version.to_f >= 4.0
71+
include_examples "unrelated example does not raise"
72+
else
73+
include_examples "unrelated example raise"
74+
end
75+
end
76+
end
2477
end
2578
end

spec/support/ar_classes.rb

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,24 @@
1-
ActiveRecord::Base.establish_connection(
2-
:adapter => 'sqlite3',
3-
:database => ':memory:'
4-
)
1+
FileUtils.rm_f('./test.db')
2+
3+
def establish_active_record_connection
4+
ActiveRecord::Base.establish_connection(
5+
:adapter => 'sqlite3',
6+
:database => './test.db'
7+
)
8+
end
9+
10+
def clear_active_record_connection
11+
ActiveRecord::Base.connection_handler.clear_all_connections!
12+
ActiveRecord::Base.connection_handler.connection_pool_list.each do |pool|
13+
if Rails.version.to_f >= 5.0
14+
ActiveRecord::Base.connection_handler.remove_connection(pool.spec.name)
15+
else
16+
ActiveRecord::Base.connection_handler.remove_connection(ActiveRecord::Base)
17+
end
18+
end
19+
end
20+
21+
establish_active_record_connection
522

623
module Connections
724
def self.extended(host)

0 commit comments

Comments
 (0)