Add support for default strategy for each ORM

DatabaseCleaner will select the best default strategy based on the ORM you're using without having you to select it by yourself.

* ActiveRecord, DataMapper => :transaction
* MongoMapper, Mongoid, CouchPotato => :truncation
This commit is contained in:
Prem Sichanugrist 2011-01-16 23:34:45 +07:00
parent 9bd76e743d
commit 56ca7001d4
5 changed files with 72 additions and 10 deletions

View File

@ -10,19 +10,20 @@ ActiveRecord, DataMapper, MongoMapper, Mongoid, and CouchPotato are supported.
Here is an overview of the strategies supported for each library:
|_. ORM |_. Truncation |_. Transaction |_. Deletion |
| ActiveRecord | Yes | Yes | Yes |
| DataMapper | Yes | Yes | No |
| CouchPotato | Yes | No | No |
| MongoMapper | Yes | No | No |
| Mongoid | Yes | No | No |
| ActiveRecord | Yes | **Yes** | Yes |
| DataMapper | Yes | **Yes** | No |
| CouchPotato | **Yes** | No | No |
| MongoMapper | **Yes** | No | No |
| Mongoid | **Yes** | No | No |
(Default strategy for each library is denoted in bold)
The ActiveRecord @:deletion@ strategy is only useful for when the @:truncation@ strategy causes
locks (as reported by some Oracle DB users). The @:truncation@ strategy is the preferred option
since it is much faster.
Database Cleaner also includes a @null@ strategy (that does no cleaning at all) which can be used
with any ORM library. _This is the default strategy and will be used unless you
specify one._ You can also explicitly use it by setting your strategy to @nil@.
with any ORM library. You can also explicitly use it by setting your strategy to @nil@.
h2. How to use

View File

@ -54,9 +54,9 @@ if orm && strategy
DatabaseCleaner[ orm.gsub(/(.)([A-Z]+)/,'\1_\2').downcase.to_sym ].strategy = strategy.to_sym
DatabaseCleaner[ another_orm.gsub(/(.)([A-Z]+)/,'\1_\2').downcase.to_sym ].strategy = strategy.to_sym
else
DatabaseCleaner.strategy = strategy.to_sym
DatabaseCleaner.strategy = strategy.to_sym unless strategy == "default"
end
else
raise "Run 'ORM=ActiveRecord|DataMapper|MongoMapper|CouchPotato [ANOTHER_ORM=...] [MULTIPLE_DBS=true] STRATEGY=transaction|truncation cucumber examples/features'"
raise "Run 'ORM=ActiveRecord|DataMapper|MongoMapper|CouchPotato [ANOTHER_ORM=...] [MULTIPLE_DBS=true] STRATEGY=transaction|truncation|default cucumber examples/features'"
end

View File

@ -0,0 +1,19 @@
Feature: database cleaning
In order to ease example and feature writing
As a developer
I want to have my database in a clean state with default strategy
Scenario Outline: ruby app
Given I am using <ORM>
And the default cleaning strategy
When I run my scenarios that rely on a clean database
Then I should see all green
Examples:
| ORM |
| ActiveRecord |
| DataMapper |
| MongoMapper |
| Mongoid |
| CouchPotato |

View File

@ -9,6 +9,7 @@ module DatabaseCleaner
self.orm = desired_orm
end
self.db = opts[:connection] if opts.has_key? :connection
set_default_orm_strategy
end
def db=(desired_db)
@ -122,5 +123,14 @@ module DatabaseCleaner
end
end
end
def set_default_orm_strategy
case orm
when :active_record, :data_mapper
self.strategy = :transaction
when :mongo_mapper, :mongoid, :couch_potato
self.strategy = :truncation
end
end
end
end

View File

@ -1,6 +1,9 @@
require File.dirname(__FILE__) + '/../spec_helper'
require 'database_cleaner/active_record/transaction'
require 'database_cleaner/data_mapper/transaction'
require 'database_cleaner/mongo_mapper/truncation'
require 'database_cleaner/mongoid/truncation'
require 'database_cleaner/couch_potato/truncation'
module DatabaseCleaner
describe Base do
@ -310,7 +313,9 @@ module DatabaseCleaner
end
describe "strategy" do
it "returns a null strategy when strategy no set" do
subject { ::DatabaseCleaner::Base.new :a_orm }
it "returns a null strategy when strategy no set and undetectable" do
subject.instance_values["@strategy"] = nil
subject.strategy.should == DatabaseCleaner::NullStrategy
end
@ -442,5 +447,32 @@ module DatabaseCleaner
end
describe 'set_default_orm_strategy' do
it 'sets strategy to :transaction for ActiveRecord' do
cleaner = DatabaseCleaner::Base.new(:active_record)
cleaner.strategy.should be_instance_of DatabaseCleaner::ActiveRecord::Transaction
end
it 'sets strategy to :transaction for DataMapper' do
cleaner = DatabaseCleaner::Base.new(:data_mapper)
cleaner.strategy.should be_instance_of DatabaseCleaner::DataMapper::Transaction
end
it 'sets strategy to :truncation for MongoMapper' do
cleaner = DatabaseCleaner::Base.new(:mongo_mapper)
cleaner.strategy.should be_instance_of DatabaseCleaner::MongoMapper::Truncation
end
it 'sets strategy to :truncation for Mongoid' do
cleaner = DatabaseCleaner::Base.new(:mongoid)
cleaner.strategy.should be_instance_of DatabaseCleaner::Mongoid::Truncation
end
it 'sets strategy to :truncation for CouchPotato' do
cleaner = DatabaseCleaner::Base.new(:couch_potato)
cleaner.strategy.should be_instance_of DatabaseCleaner::CouchPotato::Truncation
end
end
end
end