Skip to content

Commit 4cd7c94

Browse files
Matt Remsik and Ethan Gundersondchelimsky
Matt Remsik and Ethan Gunderson
authored andcommitted
make transaction management configurable
1 parent 728ef6e commit 4cd7c94

File tree

6 files changed

+98
-2
lines changed

6 files changed

+98
-2
lines changed

Rakefile

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ $:.unshift File.expand_path(File.join(File.dirname(__FILE__),'lib'))
55

66
require 'rake/rdoctask'
77
require 'rspec/rails/version'
8+
require 'rspec'
9+
require 'rspec/core/rake_task'
10+
11+
Rspec::Core::RakeTask.new(:spec)
812

913
begin
1014
require 'jeweler'
@@ -87,5 +91,5 @@ task :clobber_app do
8791
rm_rf "tmp/example_app"
8892
end
8993

90-
task :default => ["generate:app", "generate:stuff", :run_specs]
94+
task :default => [:spec, "generate:app", "generate:stuff", :run_specs]
9195

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,8 @@
1717
# config.mock_with :flexmock
1818
# config.mock_with :rr
1919
config.mock_with :rspec
20+
21+
# If you'd prefer not to run each of your examples within a transaction,
22+
# uncomment the following line.
23+
# config.use_transactional_examples false
2024
end

lib/rspec/rails/transactional_database_support.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,21 @@ def active_record_configured?
88
defined?(::ActiveRecord) && !::ActiveRecord::Base.configurations.blank?
99
end
1010

11+
def use_transactional_examples?
12+
Rspec.configuration.use_transactional_examples?
13+
end
14+
1115
def transactional_protection_start
1216
return unless active_record_configured?
17+
return unless use_transactional_examples?
1318

1419
::ActiveRecord::Base.connection.increment_open_transactions
1520
::ActiveRecord::Base.connection.begin_db_transaction
1621
end
1722

1823
def transactional_protection_cleanup
1924
return unless active_record_configured?
25+
return unless use_transactional_examples?
2026

2127
if ::ActiveRecord::Base.connection.open_transactions != 0
2228
::ActiveRecord::Base.connection.rollback_db_transaction

rspec-rails.gemspec

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ Gem::Specification.new do |s|
99

1010
s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
1111
s.authors = ["David Chelimsky", "Chad Humphries"]
12-
s.date = %q{2010-03-15}
12+
s.date = %q{2010-03-23}
1313
s.description = %q{Rspec-2 for Rails-3}
1414
1515
s.extra_rdoc_files = [
@@ -63,6 +63,8 @@ Gem::Specification.new do |s|
6363
"lib/rspec/rails/transactional_database_support.rb",
6464
"lib/rspec/rails/version.rb",
6565
"rspec-rails.gemspec",
66+
"spec/lib/rspec/rails/transactional_database_support_spec.rb",
67+
"spec/spec_helper.rb",
6668
"templates/generate_stuff.rb",
6769
"templates/run_specs.rb"
6870
]
@@ -85,6 +87,10 @@ Gem::Specification.new do |s|
8587
s.rubyforge_project = %q{rspec}
8688
s.rubygems_version = %q{1.3.6}
8789
s.summary = %q{rspec-rails-2.0.0.beta.4}
90+
s.test_files = [
91+
"spec/lib/rspec/rails/transactional_database_support_spec.rb",
92+
"spec/spec_helper.rb"
93+
]
8894

8995
if s.respond_to? :specification_version then
9096
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
require 'spec_helper'
2+
3+
describe Rspec::Rails::TransactionalDatabaseSupport do
4+
class TestBed
5+
include Rspec::Rails::TransactionalDatabaseSupport
6+
end
7+
8+
let(:test_bed) { TestBed.new }
9+
let(:connection) { stub() }
10+
11+
describe "#transactional_protection_start" do
12+
before do
13+
test_bed.stub(:active_record_configured?).and_return(true)
14+
::ActiveRecord::Base.stub(:connection).and_return(connection)
15+
end
16+
17+
context 'when running with examples with transactions' do
18+
it "opens a new transaction" do
19+
test_bed.stub(:use_transactional_examples?).and_return true
20+
connection.should_receive(:increment_open_transactions)
21+
connection.should_receive(:begin_db_transaction)
22+
test_bed.transactional_protection_start
23+
end
24+
end
25+
26+
context 'with transactionless examples' do
27+
28+
it "doesn't open a transaction" do
29+
test_bed.stub(:use_transactional_examples?).and_return false
30+
connection.should_not_receive(:increment_open_transactions)
31+
connection.should_not_receive(:begin_db_transaction)
32+
test_bed.transactional_protection_start
33+
end
34+
end
35+
end
36+
37+
describe "#transactional_protection_cleanup" do
38+
before do
39+
test_bed.stub(:active_record_configured?).and_return(true)
40+
connection.stub(:open_transactions).and_return(1)
41+
::ActiveRecord::Base.stub(:connection).and_return(connection)
42+
end
43+
44+
context 'when running with examples with transactions' do
45+
it "opens a new transaction" do
46+
test_bed.stub(:use_transactional_examples?).and_return(true)
47+
connection.should_receive(:rollback_db_transaction)
48+
connection.should_receive(:decrement_open_transactions)
49+
test_bed.transactional_protection_cleanup
50+
end
51+
end
52+
53+
context 'with transactionless examples' do
54+
it "doesn't close an open transaction" do
55+
test_bed.stub(:use_transactional_examples?).and_return(false)
56+
connection.should_not_receive(:decrement_open_transactions)
57+
connection.should_not_receive(:rollback_db_transaction)
58+
test_bed.transactional_protection_cleanup
59+
end
60+
end
61+
end
62+
end

spec/spec_helper.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
%w(actionmailer actionpack activemodel activerecord activeresource activesupport railties).each do |directory|
2+
$LOAD_PATH.unshift File.expand_path( File.join(File.dirname(__FILE__), "..", "tmp", "rails", directory, "lib") )
3+
end
4+
5+
require 'i18n'
6+
require 'rack'
7+
require 'rack/mock'
8+
require 'rack/mime'
9+
require 'active_support'
10+
require 'active_support/core_ext'
11+
require 'action_dispatch'
12+
require 'action_controller'
13+
require 'active_record'
14+
require 'rspec/rails'

0 commit comments

Comments
 (0)