database_cleaner 1.6.2 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. checksums.yaml +5 -5
  2. data/Gemfile.lock +3 -3
  3. data/History.rdoc +23 -0
  4. data/README.markdown +24 -1
  5. data/VERSION.yml +2 -2
  6. data/lib/database_cleaner.rb +6 -2
  7. data/lib/database_cleaner/active_record/base.rb +1 -1
  8. data/lib/database_cleaner/active_record/deletion.rb +9 -7
  9. data/lib/database_cleaner/base.rb +2 -0
  10. data/lib/database_cleaner/safeguard.rb +72 -0
  11. metadata +6 -86
  12. data/examples/Gemfile +0 -1
  13. data/examples/Gemfile.lock +0 -1
  14. data/examples/config/database.yml.example +0 -8
  15. data/examples/config/redis.yml +0 -8
  16. data/examples/db/sqlite_databases_go_here +0 -0
  17. data/examples/features/example.feature +0 -11
  18. data/examples/features/example_multiple_db.feature +0 -23
  19. data/examples/features/example_multiple_orm.feature +0 -22
  20. data/examples/features/step_definitions/activerecord_steps.rb +0 -31
  21. data/examples/features/step_definitions/couchpotato_steps.rb +0 -31
  22. data/examples/features/step_definitions/datamapper_steps.rb +0 -37
  23. data/examples/features/step_definitions/mongoid_steps.rb +0 -23
  24. data/examples/features/step_definitions/mongomapper_steps.rb +0 -31
  25. data/examples/features/step_definitions/neo4j_steps.rb +0 -23
  26. data/examples/features/step_definitions/ohm_steps.rb +0 -31
  27. data/examples/features/step_definitions/redis_steps.rb +0 -31
  28. data/examples/features/step_definitions/translation_steps.rb +0 -55
  29. data/examples/features/support/env.rb +0 -61
  30. data/examples/lib/activerecord_models.rb +0 -41
  31. data/examples/lib/couchpotato_models.rb +0 -61
  32. data/examples/lib/datamapper_models.rb +0 -50
  33. data/examples/lib/mongoid_models.rb +0 -44
  34. data/examples/lib/mongomapper_models.rb +0 -51
  35. data/examples/lib/neo4j_models.rb +0 -17
  36. data/examples/lib/ohm_models.rb +0 -43
  37. data/examples/lib/redis_models.rb +0 -65
  38. data/examples/lib/sequel_models.rb +0 -9
  39. data/features/cleaning.feature +0 -30
  40. data/features/cleaning_default_strategy.feature +0 -23
  41. data/features/cleaning_multiple_dbs.feature +0 -22
  42. data/features/cleaning_multiple_orms.feature +0 -67
  43. data/features/step_definitions/database_cleaner_steps.rb +0 -33
  44. data/features/support/env.rb +0 -4
  45. data/features/support/feature_runner.rb +0 -39
  46. data/spec/database_cleaner/active_record/base_spec.rb +0 -188
  47. data/spec/database_cleaner/active_record/transaction_spec.rb +0 -176
  48. data/spec/database_cleaner/active_record/truncation/mysql2_spec.rb +0 -38
  49. data/spec/database_cleaner/active_record/truncation/mysql_spec.rb +0 -38
  50. data/spec/database_cleaner/active_record/truncation/postgresql_spec.rb +0 -75
  51. data/spec/database_cleaner/active_record/truncation/shared_fast_truncation.rb +0 -40
  52. data/spec/database_cleaner/active_record/truncation/sqlite3_spec.rb +0 -40
  53. data/spec/database_cleaner/active_record/truncation_spec.rb +0 -180
  54. data/spec/database_cleaner/base_spec.rb +0 -617
  55. data/spec/database_cleaner/configuration_spec.rb +0 -345
  56. data/spec/database_cleaner/couch_potato/truncation_spec.rb +0 -41
  57. data/spec/database_cleaner/data_mapper/base_spec.rb +0 -30
  58. data/spec/database_cleaner/data_mapper/transaction_spec.rb +0 -23
  59. data/spec/database_cleaner/data_mapper/truncation/sqlite3_spec.rb +0 -41
  60. data/spec/database_cleaner/data_mapper/truncation_spec.rb +0 -11
  61. data/spec/database_cleaner/generic/base_spec.rb +0 -61
  62. data/spec/database_cleaner/generic/truncation_spec.rb +0 -118
  63. data/spec/database_cleaner/mongo/mongo_examples.rb +0 -26
  64. data/spec/database_cleaner/mongo/truncation_spec.rb +0 -72
  65. data/spec/database_cleaner/mongo_mapper/base_spec.rb +0 -33
  66. data/spec/database_cleaner/mongo_mapper/mongo_examples.rb +0 -8
  67. data/spec/database_cleaner/mongo_mapper/truncation_spec.rb +0 -74
  68. data/spec/database_cleaner/moped/moped_examples.rb +0 -32
  69. data/spec/database_cleaner/moped/truncation_spec.rb +0 -80
  70. data/spec/database_cleaner/neo4j/base_spec.rb +0 -43
  71. data/spec/database_cleaner/neo4j/transaction_spec.rb +0 -25
  72. data/spec/database_cleaner/null_strategy_spec.rb +0 -28
  73. data/spec/database_cleaner/ohm/truncation_spec.rb +0 -70
  74. data/spec/database_cleaner/redis/base_spec.rb +0 -43
  75. data/spec/database_cleaner/redis/truncation_spec.rb +0 -63
  76. data/spec/database_cleaner/sequel/base_spec.rb +0 -32
  77. data/spec/database_cleaner/sequel/deletion_spec.rb +0 -58
  78. data/spec/database_cleaner/sequel/transaction_spec.rb +0 -21
  79. data/spec/database_cleaner/sequel/truncation/sqlite3_spec.rb +0 -0
  80. data/spec/database_cleaner/sequel/truncation_spec.rb +0 -182
  81. data/spec/database_cleaner/shared_strategy.rb +0 -15
  82. data/spec/rcov.opts +0 -1
  83. data/spec/spec_helper.rb +0 -21
  84. data/spec/support/active_record/database_setup.rb +0 -6
  85. data/spec/support/active_record/migrations/20150101010000_create_users.rb +0 -14
  86. data/spec/support/active_record/migrations/20150101020000_create_agents.rb +0 -14
  87. data/spec/support/active_record/mysql2_setup.rb +0 -39
  88. data/spec/support/active_record/mysql_setup.rb +0 -38
  89. data/spec/support/active_record/postgresql_setup.rb +0 -48
  90. data/spec/support/active_record/schema_setup.rb +0 -17
  91. data/spec/support/active_record/sqlite3_setup.rb +0 -40
  92. data/spec/support/data_mapper/schema_setup.rb +0 -15
  93. data/spec/support/data_mapper/sqlite3_setup.rb +0 -39
@@ -1,11 +0,0 @@
1
- require 'database_cleaner/data_mapper/truncation'
2
- require 'database_cleaner/shared_strategy'
3
-
4
- module DatabaseCleaner
5
- module DataMapper
6
- describe Truncation do
7
- it_should_behave_like "a generic strategy"
8
- it_should_behave_like "a generic truncation strategy"
9
- end
10
- end
11
- end
@@ -1,61 +0,0 @@
1
- require 'spec_helper'
2
- require 'database_cleaner/shared_strategy'
3
- require 'database_cleaner/generic/base'
4
- require 'active_record'
5
-
6
- module ::DatabaseCleaner
7
- module Generic
8
- class ExampleStrategy
9
- include ::DatabaseCleaner::Generic::Base
10
-
11
- def start; end
12
- end
13
-
14
- describe ExampleStrategy do
15
- context "class methods" do
16
- subject { ExampleStrategy }
17
-
18
- describe "#available_strategies" do
19
- it "should have available strategies" do
20
- expect(subject.available_strategies).to be_empty
21
- end
22
- end
23
- end
24
-
25
- it_should_behave_like "a generic strategy"
26
-
27
- describe "#db" do
28
- it "should be :default" do
29
- expect(subject.db).to eql(:default)
30
- end
31
- end
32
-
33
- describe "#cleaning" do
34
- let (:connection) { double("connection") }
35
- let (:strategy) { ExampleStrategy.new }
36
- before do
37
- # DatabaseCleaner.strategy = :truncation
38
- connection.stub(:disable_referential_integrity).and_yield
39
- connection.stub(:database_cleaner_view_cache).and_return([])
40
- connection.stub(:database_cleaner_table_cache).and_return([])
41
- ::ActiveRecord::Base.stub(:connection).and_return(connection)
42
- end
43
-
44
- it "calls #clean even if there is an exception" do
45
- strategy.should_receive :clean
46
- expect do
47
- strategy.cleaning do
48
- raise NoMethodError
49
- end
50
- end.to raise_exception(NoMethodError)
51
- end
52
-
53
- it "calls #clean after processing the block" do
54
- strategy.should_receive :clean
55
- strategy.cleaning do
56
- end
57
- end
58
- end
59
- end
60
- end
61
- end
@@ -1,118 +0,0 @@
1
- require 'spec_helper'
2
- require 'database_cleaner/generic/truncation'
3
-
4
- module ::DatabaseCleaner
5
- module Generic
6
- class TruncationExample
7
- include ::DatabaseCleaner::Generic::Truncation
8
-
9
- def only
10
- @only
11
- end
12
-
13
- def except
14
- @tables_to_exclude
15
- end
16
-
17
- def reset_ids?
18
- !!@reset_ids
19
- end
20
-
21
- def pre_count?
22
- !!@pre_count
23
- end
24
- end
25
-
26
- class MigrationExample < TruncationExample
27
- def migration_storage_names
28
- %w[migration_storage_name]
29
- end
30
- end
31
-
32
- describe TruncationExample do
33
- subject(:truncation_example) { TruncationExample.new }
34
-
35
- it "will start" do
36
- expect { truncation_example.start }.to_not raise_error
37
- end
38
-
39
- it "expects clean to be implemented later" do
40
- expect { truncation_example.clean }.to raise_error(NotImplementedError)
41
- end
42
-
43
- context "private methods" do
44
- it { should_not respond_to(:tables_to_truncate) }
45
-
46
- it 'expects #tables_to_truncate to be implemented later' do
47
- expect{ truncation_example.send :tables_to_truncate }.to raise_error(NotImplementedError)
48
- end
49
-
50
- it { should_not respond_to(:migration_storage_names) }
51
- its(:migration_storage_names) { should be_empty }
52
- end
53
-
54
- describe "initialize" do
55
- it { expect{ subject }.to_not raise_error }
56
-
57
- it "should accept a hash of options" do
58
- expect{ TruncationExample.new {} }.to_not raise_error
59
- end
60
-
61
- it { expect{ TruncationExample.new( { :a_random_param => "should raise ArgumentError" } ) }.to raise_error(ArgumentError) }
62
- it { expect{ TruncationExample.new( { :except => "something",:only => "something else" } ) }.to raise_error(ArgumentError) }
63
- it { expect{ TruncationExample.new( { :only => "something" } ) }.to_not raise_error }
64
- it { expect{ TruncationExample.new( { :except => "something" } ) }.to_not raise_error }
65
- it { expect{ TruncationExample.new( { :pre_count => "something" } ) }.to_not raise_error }
66
- it { expect{ TruncationExample.new( { :reset_ids => "something" } ) }.to_not raise_error }
67
-
68
- context "" do
69
- subject { TruncationExample.new( { :only => ["something"] } ) }
70
- its(:only) { should eq ["something"] }
71
- its(:except) { should eq [] }
72
- end
73
-
74
- context "" do
75
- subject { TruncationExample.new( { :except => ["something"] } ) }
76
- its(:only) { should eq nil }
77
- its(:except) { should include("something") }
78
- end
79
-
80
- context "" do
81
- subject { TruncationExample.new( { :reset_ids => ["something"] } ) }
82
- its(:reset_ids?) { should eq true }
83
- end
84
-
85
- context "" do
86
- subject { TruncationExample.new( { :reset_ids => nil } ) }
87
- its(:reset_ids?) { should eq false }
88
- end
89
-
90
- context "" do
91
- subject { TruncationExample.new( { :pre_count => ["something"] } ) }
92
- its(:pre_count?) { should eq true }
93
- end
94
-
95
- context "" do
96
- subject { TruncationExample.new( { :pre_count => nil } ) }
97
- its(:pre_count?) { should eq false }
98
- end
99
-
100
- context "" do
101
- subject { MigrationExample.new }
102
- its(:only) { should eq nil }
103
- its(:except) { should eq %w[migration_storage_name] }
104
- end
105
-
106
- context "" do
107
- EXCEPT_TABLES = ["something"]
108
- subject { MigrationExample.new( { :except => EXCEPT_TABLES } ) }
109
-
110
- it "should not modify the array of excepted tables" do
111
- subject.except.should include("migration_storage_name")
112
- EXCEPT_TABLES.should_not include("migration_storage_name")
113
- end
114
- end
115
- end
116
- end
117
- end
118
- end
@@ -1,26 +0,0 @@
1
- module MongoTest
2
- class ThingBase
3
- def self.collection
4
- @connection ||= ::Mongo::Connection.new('127.0.0.1')
5
- @db ||= @connection.db('database_cleaner_specs')
6
- @mongo ||= @db.collection(name) || @db.create_collection(name)
7
- end
8
-
9
- def self.count
10
- @mongo.count
11
- end
12
-
13
- def initialize(attrs={})
14
- @attrs = attrs
15
- end
16
-
17
- def save!
18
- self.class.collection.insert(@attrs)
19
- end
20
- end
21
-
22
- class Widget < ThingBase
23
- end
24
- class Gadget < ThingBase
25
- end
26
- end
@@ -1,72 +0,0 @@
1
- require File.dirname(__FILE__) + '/../../spec_helper'
2
- require 'mongo'
3
- require 'database_cleaner/mongo/truncation'
4
- require File.dirname(__FILE__) + '/mongo_examples'
5
-
6
- module DatabaseCleaner
7
- module Mongo
8
-
9
- describe Truncation do
10
- let(:args) {{}}
11
- let(:truncation) { described_class.new(args).tap { |t| t.db=@db } }
12
- #doing this in the file root breaks autospec, doing it before(:all) just fails the specs
13
- before(:all) do
14
- @connection = ::Mongo::Connection.new('127.0.0.1')
15
- @test_db = 'database_cleaner_specs'
16
- @db = @connection.db(@test_db)
17
- end
18
-
19
- after(:each) do
20
- @connection.drop_database(@test_db)
21
- end
22
-
23
- def ensure_counts(expected_counts)
24
- # I had to add this sanity_check garbage because I was getting non-determinisc results from mongo at times..
25
- # very odd and disconcerting...
26
- expected_counts.each do |model_class, expected_count|
27
- model_class.count.should equal(expected_count), "#{model_class} expected to have a count of #{expected_count} but was #{model_class.count}"
28
- end
29
- end
30
-
31
- def create_widget(attrs={})
32
- MongoTest::Widget.new({:name => 'some widget'}.merge(attrs)).save!
33
- end
34
-
35
- def create_gadget(attrs={})
36
- MongoTest::Gadget.new({:name => 'some gadget'}.merge(attrs)).save!
37
- end
38
-
39
- it "truncates all collections by default" do
40
- create_widget
41
- create_gadget
42
- ensure_counts(MongoTest::Widget => 1, MongoTest::Gadget => 1)
43
- truncation.clean
44
- ensure_counts(MongoTest::Widget => 0, MongoTest::Gadget => 0)
45
- end
46
-
47
- context "when collections are provided to the :only option" do
48
- let(:args) {{:only => ['MongoTest::Widget']}}
49
- it "only truncates the specified collections" do
50
- create_widget
51
- create_gadget
52
- ensure_counts(MongoTest::Widget => 1, MongoTest::Gadget => 1)
53
- truncation.clean
54
- ensure_counts(MongoTest::Widget => 0, MongoTest::Gadget => 1)
55
- end
56
- end
57
-
58
- context "when collections are provided to the :except option" do
59
- let(:args) {{:except => ['MongoTest::Widget']}}
60
- it "truncates all but the specified collections" do
61
- create_widget
62
- create_gadget
63
- ensure_counts(MongoTest::Widget => 1, MongoTest::Gadget => 1)
64
- truncation.clean
65
- ensure_counts(MongoTest::Widget => 1, MongoTest::Gadget => 0)
66
- end
67
- end
68
-
69
- end
70
-
71
- end
72
- end
@@ -1,33 +0,0 @@
1
- require 'spec_helper'
2
- require 'database_cleaner/mongo_mapper/base'
3
- require 'database_cleaner/shared_strategy'
4
-
5
- module DatabaseCleaner
6
- describe MongoMapper do
7
- it { should respond_to(:available_strategies) }
8
- end
9
-
10
- module MongoMapper
11
- class ExampleStrategy
12
- include ::DatabaseCleaner::MongoMapper::Base
13
- end
14
-
15
- describe ExampleStrategy do
16
-
17
- it_should_behave_like "a generic strategy"
18
-
19
- describe "db" do
20
- it { should respond_to(:db=) }
21
-
22
- it "should store my desired db" do
23
- subject.db = :my_db
24
- subject.db.should eq :my_db
25
- end
26
-
27
- it "should default to :default" do
28
- subject.db.should eq :default
29
- end
30
- end
31
- end
32
- end
33
- end
@@ -1,8 +0,0 @@
1
- class Widget
2
- include ::MongoMapper::Document
3
- key :name, String
4
- end
5
- class Gadget
6
- include ::MongoMapper::Document
7
- key :name, String
8
- end
@@ -1,74 +0,0 @@
1
- require File.dirname(__FILE__) + '/../../spec_helper'
2
- require 'mongo_mapper'
3
- require 'database_cleaner/mongo_mapper/truncation'
4
- require File.dirname(__FILE__) + '/mongo_examples'
5
-
6
- module DatabaseCleaner
7
- module MongoMapper
8
-
9
- describe Truncation do
10
-
11
- #doing this in the file root breaks autospec, doing it before(:all) just fails the specs
12
- before(:all) do
13
- ::MongoMapper.connection = ::Mongo::Connection.new('127.0.0.1')
14
- @test_db = 'database_cleaner_specs'
15
- ::MongoMapper.database = @test_db
16
- end
17
-
18
- before(:each) do
19
- ::MongoMapper.connection.drop_database(@test_db)
20
- end
21
-
22
- def ensure_counts(expected_counts)
23
- # I had to add this sanity_check garbage because I was getting non-determinisc results from mongomapper at times..
24
- # very odd and disconcerting...
25
- sanity_check = expected_counts.delete(:sanity_check)
26
- begin
27
- expected_counts.each do |model_class, expected_count|
28
- model_class.count.should equal(expected_count), "#{model_class} expected to have a count of #{expected_count} but was #{model_class.count}"
29
- end
30
- rescue RSpec::Expectations::ExpectationNotMetError => e
31
- raise !sanity_check ? e : RSpec::ExpectationNotMetError::ExpectationNotMetError.new("SANITY CHECK FAILURE! This should never happen here: #{e.message}")
32
- end
33
- end
34
-
35
- def create_widget(attrs={})
36
- Widget.new({:name => 'some widget'}.merge(attrs)).save!
37
- end
38
-
39
- def create_gadget(attrs={})
40
- Gadget.new({:name => 'some gadget'}.merge(attrs)).save!
41
- end
42
-
43
- it "truncates all collections by default" do
44
- create_widget
45
- create_gadget
46
- ensure_counts(Widget => 1, Gadget => 1, :sanity_check => true)
47
- Truncation.new.clean
48
- ensure_counts(Widget => 0, Gadget => 0)
49
- end
50
-
51
- context "when collections are provided to the :only option" do
52
- it "only truncates the specified collections" do
53
- create_widget
54
- create_gadget
55
- ensure_counts(Widget => 1, Gadget => 1, :sanity_check => true)
56
- Truncation.new(:only => ['widgets']).clean
57
- ensure_counts(Widget => 0, Gadget => 1)
58
- end
59
- end
60
-
61
- context "when collections are provided to the :except option" do
62
- it "truncates all but the specified collections" do
63
- create_widget
64
- create_gadget
65
- ensure_counts(Widget => 1, Gadget => 1, :sanity_check => true)
66
- Truncation.new(:except => ['widgets']).clean
67
- ensure_counts(Widget => 1, Gadget => 0)
68
- end
69
- end
70
-
71
- end
72
-
73
- end
74
- end
@@ -1,32 +0,0 @@
1
- module MopedTest
2
- class ThingBase
3
- def self.collection
4
- @db ||= 'database_cleaner_specs'
5
- @session ||= ::Moped::Session.new(['127.0.0.1:27017'], database: @db)
6
- @collection ||= @session[name]
7
- end
8
-
9
- def self.count
10
- @collection.find.count
11
- end
12
-
13
- def initialize(attrs={})
14
- @attrs = attrs
15
- end
16
-
17
- def save!
18
- self.class.collection.insert(@attrs)
19
- end
20
- end
21
-
22
- class Widget < ThingBase
23
- end
24
- class Gadget < ThingBase
25
- end
26
- class System < ThingBase
27
- def self.collection
28
- super
29
- @collection = @session['system_logs']
30
- end
31
- end
32
- end
@@ -1,80 +0,0 @@
1
- require File.dirname(__FILE__) + '/../../spec_helper'
2
- require 'moped'
3
- require 'database_cleaner/moped/truncation'
4
- require File.dirname(__FILE__) + '/moped_examples'
5
-
6
- module DatabaseCleaner
7
- module Moped
8
-
9
- describe Truncation do
10
- let(:args) {{}}
11
- let(:truncation) { described_class.new(args) }
12
- #doing this in the file root breaks autospec, doing it before(:all) just fails the specs
13
- before(:all) do
14
- @test_db = 'database_cleaner_specs'
15
- @session = ::Moped::Session.new(['127.0.0.1:27017'], database: @test_db)
16
- end
17
-
18
- before(:each) do
19
- truncation.db = @test_db
20
- end
21
-
22
- after(:each) do
23
- @session.drop
24
- end
25
-
26
- def ensure_counts(expected_counts)
27
- # I had to add this sanity_check garbage because I was getting non-determinisc results from mongo at times..
28
- # very odd and disconcerting...
29
- expected_counts.each do |model_class, expected_count|
30
- model_class.count.should equal(expected_count), "#{model_class} expected to have a count of #{expected_count} but was #{model_class.count}"
31
- end
32
- end
33
-
34
- def create_widget(attrs={})
35
- MopedTest::Widget.new({:name => 'some widget'}.merge(attrs)).save!
36
- end
37
-
38
- def create_gadget(attrs={})
39
- MopedTest::Gadget.new({:name => 'some gadget'}.merge(attrs)).save!
40
- end
41
-
42
- def create_system(attrs={})
43
- MopedTest::System.new({:name => 'some system'}.merge(attrs)).save!
44
- end
45
-
46
- it "truncates all collections by default" do
47
- create_widget
48
- create_gadget
49
- create_system
50
- ensure_counts(MopedTest::Widget => 1, MopedTest::Gadget => 1, MopedTest::System => 1)
51
- truncation.clean
52
- ensure_counts(MopedTest::Widget => 0, MopedTest::Gadget => 0, MopedTest::System => 0)
53
- end
54
-
55
- context "when collections are provided to the :only option" do
56
- let(:args) {{:only => ['MopedTest::Widget']}}
57
- it "only truncates the specified collections" do
58
- create_widget
59
- create_gadget
60
- ensure_counts(MopedTest::Widget => 1, MopedTest::Gadget => 1)
61
- truncation.clean
62
- ensure_counts(MopedTest::Widget => 0, MopedTest::Gadget => 1)
63
- end
64
- end
65
-
66
- context "when collections are provided to the :except option" do
67
- let(:args) {{:except => ['MopedTest::Widget']}}
68
- it "truncates all but the specified collections" do
69
- create_widget
70
- create_gadget
71
- ensure_counts(MopedTest::Widget => 1, MopedTest::Gadget => 1)
72
- truncation.clean
73
- ensure_counts(MopedTest::Widget => 1, MopedTest::Gadget => 0)
74
- end
75
- end
76
-
77
- end
78
-
79
- end
80
- end