diff --git a/Gemfile b/Gemfile
index 25912f1..4393d26 100755
--- a/Gemfile
+++ b/Gemfile
@@ -26,6 +26,8 @@ group :development do
gem 'mysql', '~> 2.8.1'
gem 'mysql2'
gem 'pg'
+ gem 'sqlite3'
+ gem 'ohm', '~> 0.1.3'
gem 'guard-rspec'
end
diff --git a/Gemfile.lock b/Gemfile.lock
index 8c27645..cb65e90 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -135,6 +135,10 @@ GEM
multi_json (1.5.0)
mysql (2.8.1)
mysql2 (0.3.11)
+ nest (1.1.2)
+ redis
+ ohm (0.1.5)
+ nest (~> 1.0)
origin (1.0.11)
pg (0.14.1)
plucky (0.5.2)
@@ -160,6 +164,7 @@ GEM
rake (10.0.3)
rdoc (3.12)
json (~> 1.4)
+ redis (3.0.4)
rest-client (1.6.7)
mime-types (>= 1.16)
rspec (2.12.0)
@@ -213,6 +218,7 @@ DEPENDENCIES
mongoid
mysql (~> 2.8.1)
mysql2
+ ohm (~> 0.1.3)
pg
rake
rspec-rails
diff --git a/README.markdown b/README.markdown
index 04bd5ff..ba20e4b 100644
--- a/README.markdown
+++ b/README.markdown
@@ -5,7 +5,7 @@ Database Cleaner is a set of strategies for cleaning your database in Ruby.
The original use case was to ensure a clean state during tests.
Each strategy is a small amount of code but is code that is usually needed in any ruby app that is testing with a database.
-ActiveRecord, DataMapper, Sequel, MongoMapper, Mongoid, and CouchPotato are supported.
+ActiveRecord, DataMapper, Sequel, MongoMapper, Mongoid, CouchPotato, Ohm and Redis are supported.
[![Build Status](https://secure.travis-ci.org/bmabey/database_cleaner.png)](http://travis-ci.org/bmabey/database_cleaner)
@@ -55,6 +55,18 @@ Here is an overview of the strategies supported for each library:
Yes |
No |
+
+ Redis |
+ Yes |
+ No |
+ No |
+
+
+ Ohm |
+ Yes |
+ No |
+ No |
+
@@ -129,6 +141,9 @@ DatabaseCleaner.strategy = :truncation, {:only => %w[widgets dogs some_other_tab
DatabaseCleaner.strategy = :truncation, {:except => %w[widgets]}
```
+With Ohm and Redis, `:only` and `:except` take a list of strings to be
+passed to [`keys`](http://redis.io/commands/keys)).
+
(I should point out the truncation strategy will never truncate your schema_migrations table.)
Some strategies require that you call `DatabaseCleaner.start` before calling `clean` (for example the `:transaction` one needs to know to open up a transaction). So you would have:
@@ -297,6 +312,16 @@ Usage beyond that remains the same with `DatabaseCleaner.start` calling any setu
DatabaseCleaner[:sequel] |
Multiple databases supported; specify Databasecleaner[:sequel, {:connection => Sequel.connect(uri)}] |
+
+ Redis |
+ DatabaseCleaner[:redis] |
+ Connection specified as Redis URI |
+
+
+ Ohm |
+ DatabaseCleaner[:ohm] |
+ Connection specified as Redis URI |
+
diff --git a/examples/config/redis.yml b/examples/config/redis.yml
new file mode 100644
index 0000000..a3b6cba
--- /dev/null
+++ b/examples/config/redis.yml
@@ -0,0 +1,8 @@
+test:
+ url: 'redis://localhost:6379/0'
+
+one:
+ url: 'redis://localhost:6379/1'
+
+two:
+ url: 'redis://localhost:6379/2'
diff --git a/examples/features/support/env.rb b/examples/features/support/env.rb
index 543b855..fad0cf1 100644
--- a/examples/features/support/env.rb
+++ b/examples/features/support/env.rb
@@ -15,6 +15,10 @@ another_orm = ENV['ANOTHER_ORM']
strategy = ENV['STRATEGY']
multiple_db = ENV['MULTIPLE_DBS']
+config = YAML::load(File.open("#{File.dirname(__FILE__)}/../../config/redis.yml"))
+ENV['REDIS_URL'] = config['test']['url']
+ENV['REDIS_URL_ONE'] = config['one']['url']
+ENV['REDIS_URL_TWO'] = config['two']['url']
if orm && strategy
$:.unshift(File.dirname(__FILE__) + '/../../../lib')
@@ -37,6 +41,9 @@ if orm && strategy
when :mongo_mapper
DatabaseCleaner[ orm_sym, {:connection => 'database_cleaner_test_one'} ].strategy = strategy.to_sym
DatabaseCleaner[ orm_sym, {:connection => 'database_cleaner_test_two'} ].strategy = strategy.to_sym
+ when :redis, :ohm
+ DatabaseCleaner[ orm_sym, {:connection => ENV['REDIS_URL_ONE']} ].strategy = strategy.to_sym
+ DatabaseCleaner[ orm_sym, {:connection => ENV['REDIS_URL_TWO']} ].strategy = strategy.to_sym
when :active_record
DatabaseCleaner[:active_record, {:model => ActiveRecordWidgetUsingDatabaseOne} ].strategy = strategy.to_sym
DatabaseCleaner[:active_record, {:model => ActiveRecordWidgetUsingDatabaseTwo} ].strategy = strategy.to_sym
@@ -53,5 +60,5 @@ if orm && strategy
end
else
- raise "Run 'ORM=ActiveRecord|DataMapper|MongoMapper|CouchPotato [ANOTHER_ORM=...] [MULTIPLE_DBS=true] STRATEGY=transaction|truncation|default cucumber examples/features'"
+ raise "Run 'ORM=ActiveRecord|DataMapper|MongoMapper|CouchPotato|Ohm|Redis [ANOTHER_ORM=...] [MULTIPLE_DBS=true] STRATEGY=transaction|truncation|default cucumber examples/features'"
end
diff --git a/examples/lib/ohm_models.rb b/examples/lib/ohm_models.rb
new file mode 100644
index 0000000..12dd93d
--- /dev/null
+++ b/examples/lib/ohm_models.rb
@@ -0,0 +1,43 @@
+require 'ohm'
+
+Ohm.connect :url => ENV['REDIS_URL']
+
+class OhmWidget < Ohm::Model
+ attribute :name
+
+ def self.create!(attrs = {})
+ new({:name => 'some widget'}.merge(attrs)).save
+ end
+
+ def self.count
+ all.count
+ end
+
+end
+
+class OhmWidgetUsingDatabaseOne < Ohm::Model
+ connect :url => ENV['REDIS_URL_ONE']
+ attribute :name
+
+ def self.create!(attrs = {})
+ new({:name => 'a widget using database one'}.merge(attrs)).save
+ end
+
+ def self.count
+ all.count
+ end
+
+end
+
+class OhmWidgetUsingDatabaseTwo < Ohm::Model
+ connect :url => ENV['REDIS_URL_TWO']
+ attribute :name
+
+ def self.create!(attrs = {})
+ new({:name => 'a widget using database two'}.merge(attrs)).save
+ end
+
+ def self.count
+ all.count
+ end
+end
diff --git a/examples/lib/redis_models.rb b/examples/lib/redis_models.rb
new file mode 100644
index 0000000..d8ee053
--- /dev/null
+++ b/examples/lib/redis_models.rb
@@ -0,0 +1,65 @@
+require 'redis'
+
+class RedisWidget
+
+ def self.redis
+ threaded ||= Redis.connect
+ end
+
+ def self.redis=(connection)
+ threaded = connection
+ end
+
+ def self.threaded
+ Thread.current[self.class.to_s] ||= {}
+ end
+
+ def initialize(options = {})
+ options = options.dup
+ @name = options[:name]
+ end
+
+ def connection
+ self.class.redis
+ end
+
+ def save
+ unless connection.get(self.class.to_s + ':id')
+ @id = 0
+ connection.set(self.class.to_s + ':id', @id)
+ end
+ @id = connection.incr(self.class.to_s + ':id')
+ connection.set(self.class.to_s + ':%d:name' % @id, @name)
+ end
+
+ def self.count
+ self.redis.keys(self.to_s + '*name').size
+ end
+
+ def self.create!
+ new(:name => 'some widget').save
+
+ end
+end
+
+class RedisWidgetUsingDatabaseOne < RedisWidget
+
+ def self.redis
+ threaded[self.class.to_s] ||= Redis.connect :url => ENV['REDIS_URL_ONE']
+ end
+
+ def self.create!
+ new(:name => 'a widget using database one').save
+ end
+end
+
+class RedisWidgetUsingDatabaseTwo < RedisWidget
+
+ def self.redis
+ threaded[self.class.to_s] ||= Redis.connect :url => ENV['REDIS_URL_TWO']
+ end
+
+ def self.create!
+ new(:name => 'a widget using database two').save
+ end
+end
diff --git a/features/cleaning.feature b/features/cleaning.feature
index 7602e88..da1a347 100644
--- a/features/cleaning.feature
+++ b/features/cleaning.feature
@@ -11,12 +11,14 @@ Feature: database cleaning
Then I should see all green
Examples:
- | ORM | Strategy |
- | ActiveRecord | transaction |
- | ActiveRecord | truncation |
- | ActiveRecord | deletion |
- | DataMapper | transaction |
- | DataMapper | truncation |
- | MongoMapper | truncation |
- | Mongoid | truncation |
- | CouchPotato | truncation |
+ | ORM | Strategy |
+ | ActiveRecord | transaction |
+ | ActiveRecord | truncation |
+ | ActiveRecord | deletion |
+ | DataMapper | transaction |
+ | DataMapper | truncation |
+ | MongoMapper | truncation |
+ | Mongoid | truncation |
+ | CouchPotato | truncation |
+ | Redis | truncation |
+ | Ohm | truncation |
diff --git a/features/cleaning_default_strategy.feature b/features/cleaning_default_strategy.feature
index 7f96ec3..cb565ab 100644
--- a/features/cleaning_default_strategy.feature
+++ b/features/cleaning_default_strategy.feature
@@ -17,3 +17,5 @@ Feature: database cleaning
| MongoMapper |
| Mongoid |
| CouchPotato |
+ | Redis |
+ | Ohm |
diff --git a/features/cleaning_multiple_orms.feature b/features/cleaning_multiple_orms.feature
index ded7064..5368e50 100644
--- a/features/cleaning_multiple_orms.feature
+++ b/features/cleaning_multiple_orms.feature
@@ -15,15 +15,34 @@ Feature: database cleaning using multiple ORMs
| ActiveRecord | MongoMapper |
| ActiveRecord | Mongoid |
| ActiveRecord | CouchPotato |
+ | ActiveRecord | Ohm |
+ | ActiveRecord | Redis |
| DataMapper | ActiveRecord |
| DataMapper | MongoMapper |
| DataMapper | Mongoid |
| DataMapper | CouchPotato |
+ | DataMapper | Ohm |
+ | DataMapper | Redis |
| MongoMapper | ActiveRecord |
| MongoMapper | DataMapper |
| MongoMapper | Mongoid |
| MongoMapper | CouchPotato |
+ | MongoMapper | Ohm |
+ | MongoMapper | Redis |
| CouchPotato | ActiveRecord |
| CouchPotato | DataMapper |
| CouchPotato | MongoMapper |
| CouchPotato | Mongoid |
+ | CouchPotato | Ohm |
+ | CouchPotato | Redis |
+ | Ohm | ActiveRecord |
+ | Ohm | DataMapper |
+ | Ohm | MongoMapper |
+ | Ohm | Mongoid |
+ | Ohm | CouchPotato |
+ | Redis | ActiveRecord |
+ | Redis | DataMapper |
+ | Redis | MongoMapper |
+ | Redis | Mongoid |
+ | Redis | CouchPotato |
+ | Redis | Ohm |
diff --git a/features/step_definitions/database_cleaner_steps.rb b/features/step_definitions/database_cleaner_steps.rb
index 1663d0a..4a663d6 100644
--- a/features/step_definitions/database_cleaner_steps.rb
+++ b/features/step_definitions/database_cleaner_steps.rb
@@ -1,10 +1,11 @@
+orms_pattern = /(ActiveRecord|DataMapper|MongoMapper|Mongoid|CouchPotato|Redis|Ohm)/
-Given /^I am using (ActiveRecord|DataMapper|MongoMapper|Mongoid|CouchPotato)$/ do |orm|
+Given /^I am using #{orms_pattern}$/ do |orm|
@feature_runner = FeatureRunner.new
@feature_runner.orm = orm
end
-Given /^I am using (ActiveRecord|DataMapper|MongoMapper|CouchPotato|Mongoid) and (ActiveRecord|DataMapper|MongoMapper|CouchPotato|Mongoid)$/ do |orm1,orm2|
+Given /^I am using #{orms_pattern} and #{orms_pattern}$/ do |orm1,orm2|
@feature_runner = FeatureRunner.new
@feature_runner.orm = orm1
@feature_runner.another_orm = orm2
diff --git a/features/step_definitions/ohm_steps.rb b/features/step_definitions/ohm_steps.rb
new file mode 100644
index 0000000..89670f8
--- /dev/null
+++ b/features/step_definitions/ohm_steps.rb
@@ -0,0 +1,31 @@
+Given /^I have setup database cleaner to clean multiple databases using ohm$/ do
+ #DatabaseCleaner
+ # require "#{File.dirname(__FILE__)}/../../../lib/ohm_models"
+ #
+ # DatabaseCleaner[:ohm, {:connection => ENV['REDIS_URL_ONE']} ].strategy = :truncation
+ # DatabaseCleaner[:ohm, {:connection => ENV['REDIS_URL_TWO']} ].strategy = :truncation
+end
+
+When /^I create a widget using ohm$/ do
+ OhmWidget.create!
+end
+
+Then /^I should see ([\d]+) widget using ohm$/ do |widget_count|
+ OhmWidget.count.should == widget_count.to_i
+end
+
+When /^I create a widget in one db using ohm$/ do
+ OhmWidgetUsingDatabaseOne.create!
+end
+
+When /^I create a widget in another db using ohm$/ do
+ OhmWidgetUsingDatabaseTwo.create!
+end
+
+Then /^I should see ([\d]+) widget in one db using ohm$/ do |widget_count|
+ OhmWidgetUsingDatabaseOne.count.should == widget_count.to_i
+end
+
+Then /^I should see ([\d]+) widget in another db using ohm$/ do |widget_count|
+ OhmWidgetUsingDatabaseTwo.count.should == widget_count.to_i
+end
diff --git a/features/step_definitions/redis_steps.rb b/features/step_definitions/redis_steps.rb
new file mode 100644
index 0000000..80611a0
--- /dev/null
+++ b/features/step_definitions/redis_steps.rb
@@ -0,0 +1,31 @@
+Given /^I have setup database cleaner to clean multiple databases using redis$/ do
+ #DatabaseCleaner
+ # require "#{File.dirname(__FILE__)}/../../../lib/redis_models"
+ #
+ # DatabaseCleaner[:redis, {:connection => ENV['REDIS_URL_ONE']} ].strategy = :truncation
+ # DatabaseCleaner[:redis, {:connection => ENV['REDIS_URL_TWO']} ].strategy = :truncation
+end
+
+When /^I create a widget using redis$/ do
+ RedisWidget.create!
+end
+
+Then /^I should see ([\d]+) widget using redis$/ do |widget_count|
+ RedisWidget.count.should == widget_count.to_i
+end
+
+When /^I create a widget in one db using redis$/ do
+ RedisWidgetUsingDatabaseOne.create!
+end
+
+When /^I create a widget in another db using redis$/ do
+ RedisWidgetUsingDatabaseTwo.create!
+end
+
+Then /^I should see ([\d]+) widget in one db using redis$/ do |widget_count|
+ RedisWidgetUsingDatabaseOne.count.should == widget_count.to_i
+end
+
+Then /^I should see ([\d]+) widget in another db using redis$/ do |widget_count|
+ RedisWidgetUsingDatabaseTwo.count.should == widget_count.to_i
+end
diff --git a/lib/database_cleaner/base.rb b/lib/database_cleaner/base.rb
index 4f82167..478c2d8 100644
--- a/lib/database_cleaner/base.rb
+++ b/lib/database_cleaner/base.rb
@@ -132,8 +132,12 @@ module DatabaseCleaner
:sequel
elsif defined? ::Moped
:moped
+ elsif defined? ::Ohm
+ :ohm
+ elsif defined? ::Redis
+ :redis
else
- raise NoORMDetected, "No known ORM was detected! Is ActiveRecord, DataMapper, Sequel, MongoMapper, Mongoid, Moped, or CouchPotato loaded?"
+ raise NoORMDetected, "No known ORM was detected! Is ActiveRecord, DataMapper, Sequel, MongoMapper, Mongoid, Moped, or CouchPotato, Redis or Ohm loaded?"
end
end
end
@@ -142,7 +146,7 @@ module DatabaseCleaner
case orm
when :active_record, :data_mapper, :sequel
self.strategy = :transaction
- when :mongo_mapper, :mongoid, :couch_potato, :moped
+ when :mongo_mapper, :mongoid, :couch_potato, :moped, :ohm, :redis
self.strategy = :truncation
end
end
diff --git a/lib/database_cleaner/configuration.rb b/lib/database_cleaner/configuration.rb
index 01665c1..5bebcda 100644
--- a/lib/database_cleaner/configuration.rb
+++ b/lib/database_cleaner/configuration.rb
@@ -11,7 +11,7 @@ module DatabaseCleaner
# ghetto ordered hash.. maintains 1.8 compat and old API
@connections ||= []
end
-
+
def [](orm,opts = {})
raise NoORMDetected unless orm
init_cleaners
@@ -113,6 +113,10 @@ module DatabaseCleaner
DatabaseCleaner::CouchPotato
when :sequel
DatabaseCleaner::Sequel
+ when :ohm
+ DatabaseCleaner::Ohm
+ when :redis
+ DatabaseCleaner::Redis
end
end
end
diff --git a/lib/database_cleaner/ohm/truncation.rb b/lib/database_cleaner/ohm/truncation.rb
new file mode 100644
index 0000000..1747a32
--- /dev/null
+++ b/lib/database_cleaner/ohm/truncation.rb
@@ -0,0 +1,15 @@
+require 'database_cleaner/redis/truncation'
+
+module DatabaseCleaner
+ module Ohm
+ class Truncation < ::DatabaseCleaner::Redis::Truncation
+
+ private
+
+ def default_redis
+ ::Ohm.redis
+ end
+
+ end
+ end
+end
diff --git a/lib/database_cleaner/redis/base.rb b/lib/database_cleaner/redis/base.rb
new file mode 100644
index 0000000..2e0e054
--- /dev/null
+++ b/lib/database_cleaner/redis/base.rb
@@ -0,0 +1,31 @@
+require 'database_cleaner/generic/base'
+
+module DatabaseCleaner
+ module Redis
+ def self.available_strategies
+ %w{truncation}
+ end
+
+ module Base
+ include ::DatabaseCleaner::Generic::Base
+
+ def db=(desired_db)
+ @db = desired_db
+ end
+
+ def db
+ @db || :default
+ end
+
+ alias url db
+
+ private
+
+ def connection
+ @connection ||= url == :default ? ::Redis.connect : ::Redis.connect(:url => url)
+ end
+
+ end
+ end
+end
+
diff --git a/lib/database_cleaner/redis/truncation.rb b/lib/database_cleaner/redis/truncation.rb
new file mode 100644
index 0000000..32badcc
--- /dev/null
+++ b/lib/database_cleaner/redis/truncation.rb
@@ -0,0 +1,26 @@
+require 'database_cleaner/redis/base'
+require 'database_cleaner/generic/truncation'
+
+module DatabaseCleaner
+ module Redis
+ class Truncation
+ include ::DatabaseCleaner::Redis::Base
+ include ::DatabaseCleaner::Generic::Truncation
+
+ def clean
+ if @only
+ @only.each do |term|
+ connection.keys(term).each { |k| connection.del k }
+ end
+ elsif @tables_to_exclude
+ keys_except = []
+ @tables_to_exclude.each { |term| keys_except += connection.keys(term) }
+ connection.keys.each { |k| connection.del(k) unless keys_except.include?(k) }
+ else
+ connection.flushdb
+ end
+ connection.quit unless url == :default
+ end
+ end
+ end
+end
diff --git a/spec/database_cleaner/base_spec.rb b/spec/database_cleaner/base_spec.rb
index b590a30..5fca85e 100644
--- a/spec/database_cleaner/base_spec.rb
+++ b/spec/database_cleaner/base_spec.rb
@@ -19,6 +19,8 @@ module DatabaseCleaner
Temp_CP = ::CouchPotato if defined?(::CouchPotato) and not defined?(Temp_CP)
Temp_SQ = ::Sequel if defined?(::Sequel) and not defined?(Temp_SQ)
Temp_MP = ::Moped if defined?(::Moped) and not defined?(Temp_MP)
+ Temp_RS = ::Redis if defined?(::Redis) and not defined?(Temp_RS)
+ Temp_OH = ::Ohm if defined?(::Ohm) and not defined?(Temp_OH)
end
#Remove all ORM mocks and restore from cache
@@ -30,6 +32,8 @@ module DatabaseCleaner
Object.send(:remove_const, 'CouchPotato') if defined?(::CouchPotato)
Object.send(:remove_const, 'Sequel') if defined?(::Sequel)
Object.send(:remove_const, 'Moped') if defined?(::Moped)
+ Object.send(:remove_const, 'Ohm') if defined?(::Ohm)
+ Object.send(:remove_const, 'Redis') if defined?(::Redis)
# Restore ORMs
@@ -39,6 +43,8 @@ module DatabaseCleaner
::Mongoid = Temp_MO if defined? Temp_MO
::CouchPotato = Temp_CP if defined? Temp_CP
::Moped = Temp_MP if defined? Temp_MP
+ ::Ohm = Temp_OH if defined? Temp_OH
+ ::Redis = Temp_RS if defined? Temp_RS
end
#reset the orm mocks
@@ -50,8 +56,10 @@ module DatabaseCleaner
Object.send(:remove_const, 'CouchPotato') if defined?(::CouchPotato)
Object.send(:remove_const, 'Sequel') if defined?(::Sequel)
Object.send(:remove_const, 'Moped') if defined?(::Moped)
+ Object.send(:remove_const, 'Ohm') if defined?(::Ohm)
+ Object.send(:remove_const, 'Redis') if defined?(::Redis)
end
-
+
let(:cleaner) { DatabaseCleaner::Base.new :autodetect }
it "should raise an error when no ORM is detected" do
@@ -66,6 +74,8 @@ module DatabaseCleaner
Object.const_set('CouchPotato', 'Couching mock potatos')
Object.const_set('Sequel', 'Sequel mock')
Object.const_set('Moped', 'Moped mock')
+ Object.const_set('Ohm', 'Ohm mock')
+ Object.const_set('Redis', 'Redis mock')
cleaner.orm.should == :active_record
cleaner.should be_auto_detected
@@ -78,6 +88,8 @@ module DatabaseCleaner
Object.const_set('CouchPotato', 'Couching mock potatos')
Object.const_set('Sequel', 'Sequel mock')
Object.const_set('Moped', 'Moped mock')
+ Object.const_set('Ohm', 'Ohm mock')
+ Object.const_set('Redis', 'Redis mock')
cleaner.orm.should == :data_mapper
cleaner.should be_auto_detected
@@ -89,6 +101,8 @@ module DatabaseCleaner
Object.const_set('CouchPotato', 'Couching mock potatos')
Object.const_set('Sequel', 'Sequel mock')
Object.const_set('Moped', 'Moped mock')
+ Object.const_set('Ohm', 'Ohm mock')
+ Object.const_set('Redis', 'Redis mock')
cleaner.orm.should == :mongo_mapper
cleaner.should be_auto_detected
@@ -99,6 +113,8 @@ module DatabaseCleaner
Object.const_set('CouchPotato', 'Couching mock potatos')
Object.const_set('Sequel', 'Sequel mock')
Object.const_set('Moped', 'Moped mock')
+ Object.const_set('Ohm', 'Ohm mock')
+ Object.const_set('Redis', 'Redis mock')
cleaner.orm.should == :mongoid
cleaner.should be_auto_detected
@@ -108,6 +124,8 @@ module DatabaseCleaner
Object.const_set('CouchPotato', 'Couching mock potatos')
Object.const_set('Sequel', 'Sequel mock')
Object.const_set('Moped', 'Moped mock')
+ Object.const_set('Ohm', 'Ohm mock')
+ Object.const_set('Redis', 'Redis mock')
cleaner.orm.should == :couch_potato
cleaner.should be_auto_detected
@@ -116,12 +134,29 @@ module DatabaseCleaner
it "should detect Sequel sixth" do
Object.const_set('Sequel', 'Sequel mock')
Object.const_set('Moped', 'Moped mock')
+ Object.const_set('Ohm', 'Ohm mock')
+ Object.const_set('Redis', 'Redis mock')
cleaner.orm.should == :sequel
cleaner.should be_auto_detected
end
- it "should detect Moped seventh" do
+ it 'detects Ohm seventh' do
+ Object.const_set('Ohm', 'Ohm mock')
+ Object.const_set('Redis', 'Redis mock')
+
+ cleaner.orm.should == :ohm
+ cleaner.should be_auto_detected
+ end
+
+ it 'detects Redis last' do
+ Object.const_set('Redis', 'Redis mock')
+
+ cleaner.orm.should == :redis
+ cleaner.should be_auto_detected
+ end
+
+ it 'detects Moped seventh' do
Object.const_set('Moped', 'Moped mock')
cleaner.orm.should == :moped
@@ -177,7 +212,7 @@ module DatabaseCleaner
cleaner = ::DatabaseCleaner::Base.new "mongoid"
cleaner.orm.should == :mongoid
end
-
+
it "is autodetected if orm is not provided" do
cleaner = ::DatabaseCleaner::Base.new
cleaner.should be_auto_detected
@@ -508,6 +543,16 @@ module DatabaseCleaner
cleaner = DatabaseCleaner::Base.new(:moped)
cleaner.strategy.should be_instance_of DatabaseCleaner::Moped::Truncation
end
+
+ it 'sets strategy to :truncation for Ohm' do
+ cleaner = DatabaseCleaner::Base.new(:ohm)
+ cleaner.strategy.should be_instance_of DatabaseCleaner::Ohm::Truncation
+ end
+
+ it 'sets strategy to :truncation for Redis' do
+ cleaner = DatabaseCleaner::Base.new(:redis)
+ cleaner.strategy.should be_instance_of DatabaseCleaner::Redis::Truncation
+ end
end
end
diff --git a/spec/database_cleaner/configuration_spec.rb b/spec/database_cleaner/configuration_spec.rb
index 9bec7a6..81babd4 100644
--- a/spec/database_cleaner/configuration_spec.rb
+++ b/spec/database_cleaner/configuration_spec.rb
@@ -62,6 +62,13 @@ describe ::DatabaseCleaner do
cleaner.orm.should == :moped
::DatabaseCleaner.connections.size.should == 1
end
+
+ it 'accepts :ohm' do
+ cleaner = ::DatabaseCleaner[:ohm]
+ cleaner.should be_a(::DatabaseCleaner::Base)
+ cleaner.orm.should == :ohm
+ ::DatabaseCleaner.connections.size.should == 1
+ end
end
it "should accept multiple orm's" do
@@ -126,7 +133,7 @@ describe ::DatabaseCleaner do
it "should give me a default (autodetection) databasecleaner by default" do
cleaner = mock("cleaner").as_null_object
::DatabaseCleaner::Base.stub!(:new).and_return(cleaner)
-
+
::DatabaseCleaner.connections.should == [cleaner]
end
end
diff --git a/spec/database_cleaner/ohm/truncation_spec.rb b/spec/database_cleaner/ohm/truncation_spec.rb
new file mode 100644
index 0000000..d638b0a
--- /dev/null
+++ b/spec/database_cleaner/ohm/truncation_spec.rb
@@ -0,0 +1,70 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+require 'ohm'
+require 'database_cleaner/ohm/truncation'
+
+module DatabaseCleaner
+ module Ohm
+
+ class Widget < ::Ohm::Model
+ attribute :name
+ end
+
+ class Gadget < ::Ohm::Model
+ attribute :name
+ end
+
+ describe Truncation do
+ before(:all) do
+ config = YAML::load(File.open("#{File.dirname(__FILE__)}/../../../examples/config/redis.yml"))
+ ::Ohm.connect :url => config['test']['url']
+ @redis = ::Ohm.redis
+ end
+
+ before(:each) do
+ @redis.flushdb
+ end
+
+ it "should flush the database" do
+ Truncation.new.clean
+ end
+
+ def create_widget(attrs={})
+ Widget.new({:name => 'some widget'}.merge(attrs)).save
+ end
+
+ def create_gadget(attrs={})
+ Gadget.new({:name => 'some gadget'}.merge(attrs)).save
+ end
+
+ it "truncates all keys by default" do
+ create_widget
+ create_gadget
+ @redis.keys.size.should == 6
+ Truncation.new.clean
+ @redis.keys.size.should == 0
+ end
+
+ context "when keys are provided to the :only option" do
+ it "only truncates the specified keys" do
+ create_widget
+ create_gadget
+ @redis.keys.size.should == 6
+ Truncation.new(:only => ['*Widget*']).clean
+ @redis.keys.size.should == 3
+ @redis.get('DatabaseCleaner::Ohm::Gadget:id').should == '1'
+ end
+ end
+
+ context "when keys are provided to the :except option" do
+ it "truncates all but the specified keys" do
+ create_widget
+ create_gadget
+ @redis.keys.size.should == 6
+ Truncation.new(:except => ['*Widget*']).clean
+ @redis.keys.size.should == 3
+ @redis.get('DatabaseCleaner::Ohm::Widget:id').should == '1'
+ end
+ end
+ end
+ end
+end
diff --git a/spec/database_cleaner/redis/base_spec.rb b/spec/database_cleaner/redis/base_spec.rb
new file mode 100644
index 0000000..89704e5
--- /dev/null
+++ b/spec/database_cleaner/redis/base_spec.rb
@@ -0,0 +1,32 @@
+require 'spec_helper'
+require 'database_cleaner/redis/base'
+require 'database_cleaner/shared_strategy'
+
+module DatabaseCleaner
+ describe Redis do
+ it { should respond_to(:available_strategies) }
+ end
+
+ module Redis
+ class ExampleStrategy
+ include ::DatabaseCleaner::Redis::Base
+ end
+
+ describe ExampleStrategy do
+
+ it_should_behave_like "a generic strategy"
+ it { should respond_to(:db) }
+ it { should respond_to(:db=) }
+
+ it "should store my describe db" do
+ url = 'redis://localhost:6379/2'
+ subject.db = 'redis://localhost:6379/2'
+ subject.db.should == url
+ end
+
+ it "should default to :default" do
+ subject.db.should == :default
+ end
+ end
+ end
+end
diff --git a/spec/database_cleaner/redis/truncation_spec.rb b/spec/database_cleaner/redis/truncation_spec.rb
new file mode 100644
index 0000000..5406306
--- /dev/null
+++ b/spec/database_cleaner/redis/truncation_spec.rb
@@ -0,0 +1,63 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+require 'redis'
+require 'database_cleaner/redis/truncation'
+
+
+module DatabaseCleaner
+ module Redis
+
+ describe Truncation do
+ before(:all) do
+ config = YAML::load(File.open("#{File.dirname(__FILE__)}/../../../examples/config/redis.yml"))
+ @redis = ::Redis.connect :url => config['test']['url']
+ end
+
+ before(:each) do
+ @redis.flushdb
+ end
+
+ it "should flush the database" do
+ Truncation.new.clean
+ end
+
+ def create_widget(attrs={})
+ @redis.set 'Widget', 1
+ end
+
+ def create_gadget(attrs={})
+ @redis.set 'Gadget', 1
+ end
+
+ it "truncates all keys by default" do
+ create_widget
+ create_gadget
+ @redis.keys.size.should == 2
+ Truncation.new.clean
+ @redis.keys.size.should == 0
+ end
+
+ context "when keys are provided to the :only option" do
+ it "only truncates the specified keys" do
+ create_widget
+ create_gadget
+ @redis.keys.size.should == 2
+ Truncation.new(:only => ['Widge*']).clean
+ @redis.keys.size.should == 1
+ @redis.get('Gadget').should == '1'
+ end
+ end
+
+ context "when keys are provided to the :except option" do
+ it "truncates all but the specified keys" do
+ create_widget
+ create_gadget
+ @redis.keys.size.should == 2
+ Truncation.new(:except => ['Widg*']).clean
+ @redis.keys.size.should == 1
+ @redis.get('Widget').should == '1'
+ end
+ end
+ end
+ end
+end
+