mirror of
https://github.com/DatabaseCleaner/database_cleaner
synced 2023-03-27 23:22:03 -04:00
adds mongoid support
This commit is contained in:
parent
e09588b15c
commit
b18f9b7f57
7 changed files with 149 additions and 3 deletions
23
examples/lib/mongoid_models.rb
Normal file
23
examples/lib/mongoid_models.rb
Normal file
|
@ -0,0 +1,23 @@
|
|||
require 'mongoid'
|
||||
|
||||
Mongoid.configure do |config|
|
||||
name = 'database_cleaner_test'
|
||||
config.master = Mongo::Connection.new.db(name)
|
||||
end
|
||||
|
||||
|
||||
#::MongoMapper.connection = Mongo::Connection.new('127.0.0.1')
|
||||
#::MongoMapper.database = 'database_cleaner_test'
|
||||
|
||||
class Widget
|
||||
include Mongoid::Document
|
||||
field :id, :type => Integer
|
||||
field :name
|
||||
|
||||
class << self
|
||||
#mongomapper doesn't seem to provide this...
|
||||
def create!(*args)
|
||||
new(*args).save!
|
||||
end
|
||||
end
|
||||
end
|
|
@ -17,4 +17,5 @@ Feature: database cleaning
|
|||
| DataMapper | transaction |
|
||||
| DataMapper | truncation |
|
||||
| MongoMapper | truncation |
|
||||
| Mongoid | truncation |
|
||||
| CouchPotato | truncation |
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
Given /^I am using (ActiveRecord|DataMapper|MongoMapper|CouchPotato)$/ do |orm|
|
||||
Given /^I am using (ActiveRecord|DataMapper|MongoMapper|Mongoid|CouchPotato)$/ do |orm|
|
||||
@orm = orm
|
||||
end
|
||||
|
||||
|
|
|
@ -16,12 +16,19 @@ module DatabaseCleaner
|
|||
end
|
||||
end
|
||||
|
||||
|
||||
module MongoMapper
|
||||
def self.available_strategies
|
||||
%w[truncation]
|
||||
end
|
||||
end
|
||||
|
||||
module Mongoid
|
||||
def self.available_strategies
|
||||
%w[truncation]
|
||||
end
|
||||
end
|
||||
|
||||
module CouchPotato
|
||||
def self.available_strategies
|
||||
%w[truncation]
|
||||
|
@ -76,7 +83,8 @@ module DatabaseCleaner
|
|||
end
|
||||
|
||||
def orm_strategy(strategy)
|
||||
require "database_cleaner/#{orm}/#{strategy}"
|
||||
puts "Strategy is : #{strategy} and ORM is #{orm}"
|
||||
require "database_cleaner/#{orm}/#{strategy}"
|
||||
orm_module.const_get(strategy.to_s.capitalize)
|
||||
rescue LoadError => e
|
||||
raise UnknownStrategySpecified, "The '#{strategy}' strategy does not exist for the #{orm} ORM! Available strategies: #{orm_module.available_strategies.join(', ')}"
|
||||
|
@ -91,10 +99,12 @@ module DatabaseCleaner
|
|||
'data_mapper'
|
||||
elsif defined? ::MongoMapper
|
||||
'mongo_mapper'
|
||||
elsif defined? ::Mongoid
|
||||
'mongoid'
|
||||
elsif defined? ::CouchPotato
|
||||
'couch_potato'
|
||||
else
|
||||
raise NoORMDetected, "No known ORM was detected! Is ActiveRecord, DataMapper, MongoMapper or CouchPotato loaded?"
|
||||
raise NoORMDetected, "No known ORM was detected! Is ActiveRecord, DataMapper, MongoMapper, Mongoid, or CouchPotato loaded?"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -108,6 +118,8 @@ module DatabaseCleaner
|
|||
DatabaseCleaner::DataMapper
|
||||
when 'mongo_mapper'
|
||||
DatabaseCleaner::MongoMapper
|
||||
when 'mongoid'
|
||||
DatabaseCleaner::Mongoid
|
||||
when 'couch_potato'
|
||||
DatabaseCleaner::CouchPotato
|
||||
end
|
||||
|
|
23
lib/database_cleaner/mongoid/truncation.rb
Normal file
23
lib/database_cleaner/mongoid/truncation.rb
Normal file
|
@ -0,0 +1,23 @@
|
|||
require 'database_cleaner/truncation_base'
|
||||
|
||||
module DatabaseCleaner
|
||||
module Mongoid
|
||||
class Truncation < DatabaseCleaner::TruncationBase
|
||||
def clean
|
||||
if @only
|
||||
collections.each { |c| c.remove if @only.include?(c.name) }
|
||||
else
|
||||
collections.each { |c| c.remove unless @tables_to_exclude.include?(c.name) }
|
||||
end
|
||||
true
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def collections
|
||||
::Mongoid.database.collections
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
end
|
|
@ -9,13 +9,16 @@ describe DatabaseCleaner do
|
|||
before(:all) do
|
||||
TempAR = ActiveRecord unless defined?(TempAR)
|
||||
TempMM = MongoMapper unless defined?(TempMM)
|
||||
TempMI = Mongoid unless defined?(TempMI)
|
||||
Object.send(:remove_const, 'MongoMapper') if defined?(::MongoMapper)
|
||||
Object.send(:remove_const, 'Mongoid') if defined?(::Mongoid)
|
||||
# need to add one for each ORM that we load in the spec helper...
|
||||
end
|
||||
after(:all) do
|
||||
Object.send(:remove_const, 'ActiveRecord') if defined?(::ActiveRecord) #want to make sure we have the real one...
|
||||
ActiveRecord = TempAR
|
||||
MongoMapper = TempMM
|
||||
Mongoid = TempMI
|
||||
end
|
||||
|
||||
before(:each) do
|
||||
|
|
84
spec/database_cleaner/mongoid/truncation_spec.rb
Normal file
84
spec/database_cleaner/mongoid/truncation_spec.rb
Normal file
|
@ -0,0 +1,84 @@
|
|||
require File.dirname(__FILE__) + '/../../spec_helper'
|
||||
require 'mongoid'
|
||||
require 'database_cleaner/mongoid/truncation'
|
||||
|
||||
TEST_DATABASE = 'database_cleaner_specs'
|
||||
Mongoid.configure do |config|
|
||||
name = TEST_DATABASE
|
||||
config.master = Mongo::Connection.new.db(name)
|
||||
end
|
||||
|
||||
class TestClassA
|
||||
include Mongoid::Document
|
||||
field :name
|
||||
end
|
||||
|
||||
class TestClassB
|
||||
include Mongoid::Document
|
||||
field :name
|
||||
end
|
||||
|
||||
|
||||
module DatabaseCleaner
|
||||
module Mongoid
|
||||
|
||||
describe Truncation do
|
||||
before(:each) do
|
||||
::Mongoid.database.connection.drop_database(TEST_DATABASE)
|
||||
#::MongoMapper.connection.db(TEST_DATABASE).collections.each {|c| c.remove }
|
||||
#::MongoMapper.database = TEST_DATABASE
|
||||
end
|
||||
|
||||
def ensure_counts(expected_counts)
|
||||
# I had to add this sanity_check garbage because I was getting non-determinisc results from mongomapper at times..
|
||||
# very odd and disconcerting...
|
||||
sanity_check = expected_counts.delete(:sanity_check)
|
||||
begin
|
||||
expected_counts.each do |model_class, expected_count|
|
||||
model_class.count.should equal(expected_count), "#{model_class} expected to have a count of #{expected_count} but was #{model_class.count}"
|
||||
end
|
||||
rescue Spec::Expectations::ExpectationNotMetError => e
|
||||
raise !sanity_check ? e : Spec::ExpectationNotMetError::ExpectationNotMetError.new("SANITY CHECK FAILURE! This should never happen here: #{e.message}")
|
||||
end
|
||||
end
|
||||
|
||||
def create_testclassa(attrs={})
|
||||
TestClassA.new({:name => 'some testclassa'}.merge(attrs)).save!
|
||||
end
|
||||
|
||||
def create_testclassb(attrs={})
|
||||
TestClassB.new({:name => 'some testclassb'}.merge(attrs)).save!
|
||||
end
|
||||
|
||||
it "truncates all collections by default" do
|
||||
create_testclassa
|
||||
create_testclassb
|
||||
ensure_counts(TestClassA => 1, TestClassB => 1, :sanity_check => true)
|
||||
Truncation.new.clean
|
||||
ensure_counts(TestClassA => 0, TestClassB => 0)
|
||||
end
|
||||
|
||||
context "when collections are provided to the :only option" do
|
||||
it "only truncates the specified collections" do
|
||||
create_testclassa
|
||||
create_testclassb
|
||||
ensure_counts(TestClassA => 1, TestClassB => 1, :sanity_check => true)
|
||||
Truncation.new(:only => ['test_class_as']).clean
|
||||
ensure_counts(TestClassA => 0, TestClassB => 1)
|
||||
end
|
||||
end
|
||||
|
||||
context "when collections are provided to the :except option" do
|
||||
it "truncates all but the specified collections" do
|
||||
create_testclassa
|
||||
create_testclassb
|
||||
ensure_counts(TestClassA => 1, TestClassB => 1, :sanity_check => true)
|
||||
Truncation.new(:except => ['test_class_as']).clean
|
||||
ensure_counts(TestClassA => 1, TestClassB => 0)
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue