diff --git a/README.md b/README.md index a941fe1..dc8da15 100644 --- a/README.md +++ b/README.md @@ -73,6 +73,15 @@ DatabaseCleaner[:sequel].db = :default DatabaseCleaner[:sequel, db: :default] DatabaseCleaner[:sequel, db: Sequel.connect(uri)] ``` + +## Transaction strategy with fiber concurrency extension + +```ruby +around do |example| + DatabaseCleaner[:sequel].cleaning(&example) +end +``` + ## COPYRIGHT See [LICENSE](LICENSE) for details. diff --git a/lib/database_cleaner/sequel/transaction.rb b/lib/database_cleaner/sequel/transaction.rb index c918a7d..2cd2aed 100644 --- a/lib/database_cleaner/sequel/transaction.rb +++ b/lib/database_cleaner/sequel/transaction.rb @@ -19,6 +19,13 @@ def clean f = @fibers.pop f.resume end + + def cleaning(&block) + db = self.db + db.transaction(:rollback => :always, :savepoint => true, :auto_savepoint => true) do + yield + end + end end end end diff --git a/spec/database_cleaner/sequel/transaction_spec.rb b/spec/database_cleaner/sequel/transaction_spec.rb index fae377f..7b6546d 100644 --- a/spec/database_cleaner/sequel/transaction_spec.rb +++ b/spec/database_cleaner/sequel/transaction_spec.rb @@ -4,6 +4,37 @@ module DatabaseCleaner module Sequel + RSpec.shared_examples "cleaning" do + it "should clean database" do + subject.cleaning do + connection[:users].insert + expect(connection[:users].count).to eq(1) + end + + expect(connection[:users]).to be_empty + end + + it "should work with nested transaction" do + subject.cleaning do + begin + connection.transaction do + connection[:users].insert + connection[:users].insert + + expect(connection[:users].count).to eq(2) + raise ::Sequel::Rollback + end + rescue + end + + connection[:users].insert + expect(connection[:users].count).to eq(1) + end + + expect(connection[:users]).to be_empty + end + end + RSpec.describe Transaction do it_should_behave_like "a database_cleaner strategy" @@ -19,37 +50,6 @@ module Sequel before { subject.db = connection } - context "cleaning" do - it "should clean database" do - subject.cleaning do - connection[:users].insert - expect(connection[:users].count).to eq(1) - end - - expect(connection[:users]).to be_empty - end - - it "should work with nested transaction" do - subject.cleaning do - begin - connection.transaction do - connection[:users].insert - connection[:users].insert - - expect(connection[:users].count).to eq(2) - raise ::Sequel::Rollback - end - rescue - end - - connection[:users].insert - expect(connection[:users].count).to eq(1) - end - - expect(connection[:users]).to be_empty - end - end - context "start/clean" do it "should clean database" do subject.start @@ -83,6 +83,23 @@ module Sequel expect(connection[:users]).to be_empty end end + + context "fiber concurrency" do + # Making stub on the current implementation of the Sequel extension :fiber_concurrency. + before do + allow(::Sequel).to receive(:current).and_return(Fiber.current) + end + + it "should use fibers" do + expect(::Sequel.current).to be_a(Fiber) + end + + it_should_behave_like "cleaning" + end + + context "tread concurrency" do + it_should_behave_like "cleaning" + end end end