database_cleaner 1.1.1 → 1.2.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 (39) hide show
  1. data/Gemfile.lock +12 -12
  2. data/History.rdoc +17 -0
  3. data/README.markdown +4 -0
  4. data/Rakefile +1 -0
  5. data/VERSION.yml +2 -2
  6. data/examples/Gemfile.lock +12 -12
  7. data/lib/database_cleaner/active_record/base.rb +3 -3
  8. data/lib/database_cleaner/active_record/deletion.rb +19 -36
  9. data/lib/database_cleaner/active_record/truncation.rb +40 -67
  10. data/lib/database_cleaner/base.rb +3 -3
  11. data/lib/database_cleaner/configuration.rb +1 -1
  12. data/lib/database_cleaner/data_mapper/base.rb +1 -1
  13. data/lib/database_cleaner/data_mapper/truncation.rb +22 -2
  14. data/lib/database_cleaner/generic/truncation.rb +4 -3
  15. data/lib/database_cleaner/mongo_mapper/base.rb +1 -1
  16. data/lib/database_cleaner/moped/base.rb +2 -2
  17. data/lib/database_cleaner/redis/base.rb +1 -1
  18. data/spec/database_cleaner/active_record/base_spec.rb +10 -10
  19. data/spec/database_cleaner/active_record/transaction_spec.rb +1 -1
  20. data/spec/database_cleaner/active_record/truncation/mysql2_spec.rb +2 -2
  21. data/spec/database_cleaner/active_record/truncation/mysql_spec.rb +2 -2
  22. data/spec/database_cleaner/active_record/truncation/postgresql_spec.rb +2 -2
  23. data/spec/database_cleaner/active_record/truncation/shared_fast_truncation.rb +2 -2
  24. data/spec/database_cleaner/active_record/truncation/sqlite3_spec.rb +42 -0
  25. data/spec/database_cleaner/active_record/truncation_spec.rb +50 -29
  26. data/spec/database_cleaner/base_spec.rb +44 -48
  27. data/spec/database_cleaner/configuration_spec.rb +74 -74
  28. data/spec/database_cleaner/couch_potato/truncation_spec.rb +2 -2
  29. data/spec/database_cleaner/data_mapper/base_spec.rb +2 -2
  30. data/spec/database_cleaner/generic/base_spec.rb +1 -1
  31. data/spec/database_cleaner/generic/truncation_spec.rb +26 -16
  32. data/spec/database_cleaner/mongo_mapper/base_spec.rb +2 -2
  33. data/spec/database_cleaner/moped/truncation_spec.rb +1 -1
  34. data/spec/database_cleaner/ohm/truncation_spec.rb +8 -8
  35. data/spec/database_cleaner/redis/base_spec.rb +2 -2
  36. data/spec/database_cleaner/redis/truncation_spec.rb +8 -8
  37. data/spec/database_cleaner/sequel/base_spec.rb +2 -2
  38. data/spec/support/active_record/sqlite3_setup.rb +40 -0
  39. metadata +4 -2
@@ -37,7 +37,7 @@ module DatabaseCleaner
37
37
  end
38
38
 
39
39
  def app_root
40
- @app_root || Dir.pwd
40
+ @app_root ||= Dir.pwd
41
41
  end
42
42
 
43
43
  def connections
@@ -13,7 +13,7 @@ module DatabaseCleaner
13
13
  end
14
14
 
15
15
  def db
16
- @db || :default
16
+ @db ||= :default
17
17
  end
18
18
 
19
19
  end
@@ -53,7 +53,7 @@ module DataMapper
53
53
 
54
54
  def truncate_table(table_name)
55
55
  execute("DELETE FROM #{quote_name(table_name)};")
56
- if uses_sequence
56
+ if uses_sequence?
57
57
  execute("DELETE FROM sqlite_sequence where name = '#{table_name}';")
58
58
  end
59
59
  end
@@ -65,6 +65,16 @@ module DataMapper
65
65
  yield
66
66
  end
67
67
 
68
+ private
69
+
70
+ def uses_sequence?
71
+ sql = <<-SQL
72
+ SELECT name FROM sqlite_master
73
+ WHERE type='table' AND name='sqlite_sequence'
74
+ SQL
75
+ select(sql).first
76
+ end
77
+
68
78
  end
69
79
 
70
80
  class SqliteAdapter < DataObjectsAdapter
@@ -82,7 +92,7 @@ module DataMapper
82
92
 
83
93
  def truncate_table(table_name)
84
94
  execute("DELETE FROM #{quote_name(table_name)};")
85
- if uses_sequence
95
+ if uses_sequence?
86
96
  execute("DELETE FROM sqlite_sequence where name = '#{table_name}';")
87
97
  end
88
98
  end
@@ -94,6 +104,16 @@ module DataMapper
94
104
  yield
95
105
  end
96
106
 
107
+ private
108
+
109
+ def uses_sequence?
110
+ sql = <<-SQL
111
+ SELECT name FROM sqlite_master
112
+ WHERE type='table' AND name='sqlite_sequence'
113
+ SQL
114
+ select(sql).first
115
+ end
116
+
97
117
  end
98
118
 
99
119
  # FIXME
@@ -2,18 +2,19 @@ module DatabaseCleaner
2
2
  module Generic
3
3
  module Truncation
4
4
  def initialize(opts={})
5
- if !opts.empty? && !(opts.keys - [:only, :except, :pre_count, :reset_ids]).empty?
6
- raise ArgumentError, "The only valid options are :only, :except, :pre_count or :reset_ids. You specified #{opts.keys.join(',')}."
5
+ if !opts.empty? && !(opts.keys - [:only, :except, :pre_count, :reset_ids, :cache_tables]).empty?
6
+ raise ArgumentError, "The only valid options are :only, :except, :pre_count, :reset_ids or :cache_tables. You specified #{opts.keys.join(',')}."
7
7
  end
8
8
  if opts.has_key?(:only) && opts.has_key?(:except)
9
9
  raise ArgumentError, "You may only specify either :only or :except. Doing both doesn't really make sense does it?"
10
10
  end
11
11
 
12
12
  @only = opts[:only]
13
- @tables_to_exclude = (opts[:except] || []).dup
13
+ @tables_to_exclude = Array( (opts[:except] || []).dup ).flatten
14
14
  @tables_to_exclude += migration_storage_names
15
15
  @pre_count = opts[:pre_count]
16
16
  @reset_ids = opts[:reset_ids]
17
+ @cache_tables = opts.has_key?(:cache_tables) ? !!opts[:cache_tables] : true
17
18
  end
18
19
 
19
20
  def start
@@ -13,7 +13,7 @@ module DatabaseCleaner
13
13
  end
14
14
 
15
15
  def db
16
- @db || :default
16
+ @db ||= :default
17
17
  end
18
18
  end
19
19
  end
@@ -14,7 +14,7 @@ module DatabaseCleaner
14
14
  end
15
15
 
16
16
  def db
17
- @db || :default
17
+ @db ||= :default
18
18
  end
19
19
 
20
20
  def host_port=(desired_host)
@@ -22,7 +22,7 @@ module DatabaseCleaner
22
22
  end
23
23
 
24
24
  def host
25
- @host || '127.0.0.1:27017'
25
+ @host ||= '127.0.0.1:27017'
26
26
  end
27
27
 
28
28
  private
@@ -14,7 +14,7 @@ module DatabaseCleaner
14
14
  end
15
15
 
16
16
  def db
17
- @db || :default
17
+ @db ||= :default
18
18
  end
19
19
 
20
20
  alias url db
@@ -19,7 +19,7 @@ module DatabaseCleaner
19
19
  it "should default to DatabaseCleaner.root / config / database.yml" do
20
20
  ActiveRecord.config_file_location=nil
21
21
  DatabaseCleaner.should_receive(:app_root).and_return("/path/to")
22
- subject.should == '/path/to/config/database.yml'
22
+ subject.should eq '/path/to/config/database.yml'
23
23
  end
24
24
  end
25
25
 
@@ -45,11 +45,11 @@ module DatabaseCleaner
45
45
  subject.stub(:load_config)
46
46
 
47
47
  subject.db = :my_db
48
- subject.db.should == :my_db
48
+ subject.db.should eq :my_db
49
49
  end
50
50
 
51
51
  it "should default to :default" do
52
- subject.db.should == :default
52
+ subject.db.should eq :default
53
53
  end
54
54
 
55
55
  it "should load_config when I set db" do
@@ -86,7 +86,7 @@ my_db:
86
86
 
87
87
  it "should store the relevant config in connection_hash" do
88
88
  subject.load_config
89
- subject.connection_hash.should == { "database" => "one" }
89
+ subject.connection_hash.should eq( "database" => "one" )
90
90
  end
91
91
 
92
92
  it "should skip config if config file is not available" do
@@ -115,14 +115,14 @@ my_db:
115
115
  describe "connection_hash" do
116
116
  it "should store connection_hash" do
117
117
  subject.connection_hash = { :key => "value" }
118
- subject.connection_hash.should == { :key => "value" }
118
+ subject.connection_hash.should eq( :key => "value" )
119
119
  end
120
120
  end
121
121
 
122
122
  describe "connection_class" do
123
123
  it { expect { subject.connection_class }.to_not raise_error }
124
124
  it "should default to ActiveRecord::Base" do
125
- subject.connection_class.should == ::ActiveRecord::Base
125
+ subject.connection_class.should eq ::ActiveRecord::Base
126
126
  end
127
127
 
128
128
  context "with database models" do
@@ -131,21 +131,21 @@ my_db:
131
131
  subject.db = FakeModel
132
132
  subject.connection_hash = { }
133
133
  subject.load_config
134
- subject.connection_class.should == FakeModel
134
+ subject.connection_class.should eq FakeModel
135
135
  end
136
136
  end
137
137
 
138
138
  context "connection_hash is not set" do
139
139
  it "allows for database models to be passed in" do
140
140
  subject.db = FakeModel
141
- subject.connection_class.should == FakeModel
141
+ subject.connection_class.should eq FakeModel
142
142
  end
143
143
  end
144
144
  end
145
145
 
146
146
  context "when connection_hash is set" do
147
- let(:hash) { mock("hash") }
148
- before { ::ActiveRecord::Base.stub!(:respond_to?).and_return(false) }
147
+ let(:hash) { double("hash") }
148
+ before { ::ActiveRecord::Base.stub(:respond_to?).and_return(false) }
149
149
  before { subject.stub(:connection_hash).and_return(hash) }
150
150
 
151
151
  it "establish a connection using ActiveRecord::Base" do
@@ -6,7 +6,7 @@ module DatabaseCleaner
6
6
  module ActiveRecord
7
7
 
8
8
  describe Transaction do
9
- let (:connection) { mock("connection") }
9
+ let (:connection) { double("connection") }
10
10
  before(:each) do
11
11
  ::ActiveRecord::Base.stub(:connection).and_return(connection)
12
12
  end
@@ -17,7 +17,7 @@ module ActiveRecord
17
17
  2.times { User.create }
18
18
 
19
19
  connection.truncate_table('users')
20
- User.count.should == 0
20
+ User.count.should eq 0
21
21
  end
22
22
 
23
23
  it "should reset AUTO_INCREMENT index of table" do
@@ -26,7 +26,7 @@ module ActiveRecord
26
26
 
27
27
  connection.truncate_table('users')
28
28
 
29
- User.create.id.should == 1
29
+ User.create.id.should eq 1
30
30
  end
31
31
  end
32
32
 
@@ -17,7 +17,7 @@ module ActiveRecord
17
17
  2.times { User.create }
18
18
 
19
19
  connection.truncate_table('users')
20
- User.count.should == 0
20
+ User.count.should eq 0
21
21
  end
22
22
 
23
23
  it "should reset AUTO_INCREMENT index of table" do
@@ -26,7 +26,7 @@ module ActiveRecord
26
26
 
27
27
  connection.truncate_table('users')
28
28
 
29
- User.create.id.should == 1
29
+ User.create.id.should eq 1
30
30
  end
31
31
  end
32
32
 
@@ -24,7 +24,7 @@ module ActiveRecord
24
24
  2.times { User.create }
25
25
 
26
26
  connection.truncate_table('users')
27
- User.count.should == 0
27
+ User.count.should eq 0
28
28
  end
29
29
 
30
30
  it "resets AUTO_INCREMENT index of table" do
@@ -33,7 +33,7 @@ module ActiveRecord
33
33
 
34
34
  connection.truncate_table('users')
35
35
 
36
- User.create.id.should == 1
36
+ User.create.id.should eq 1
37
37
  end
38
38
  end
39
39
 
@@ -14,7 +14,7 @@ shared_examples_for "an adapter with pre-count truncation" do
14
14
  User.delete_all
15
15
 
16
16
  connection.pre_count_truncate_tables(%w[users]) # true is also the default
17
- User.create.id.should == 1
17
+ User.create.id.should eq 1
18
18
  end
19
19
  end
20
20
 
@@ -33,7 +33,7 @@ shared_examples_for "an adapter with pre-count truncation" do
33
33
 
34
34
  connection.pre_count_truncate_tables(%w[users], :reset_ids => false)
35
35
 
36
- User.create.id.should == 3
36
+ User.create.id.should eq 3
37
37
  end
38
38
  end
39
39
  end
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+ require 'active_record'
3
+ require 'support/active_record/sqlite3_setup'
4
+ require 'database_cleaner/active_record/truncation'
5
+
6
+ module ActiveRecord
7
+ module ConnectionAdapters
8
+ describe do
9
+ before(:all) { active_record_sqlite3_setup }
10
+
11
+ let(:adapter) { SQLite3Adapter }
12
+
13
+ let(:connection) do
14
+ active_record_sqlite3_connection
15
+ end
16
+
17
+ before(:each) do
18
+ connection.truncate_tables connection.tables
19
+ end
20
+
21
+ describe "#truncate_table" do
22
+ it "truncates the table" do
23
+ 2.times { User.create }
24
+
25
+ connection.truncate_table('users')
26
+ User.count.should eq 0
27
+ end
28
+
29
+ it "resets AUTO_INCREMENT index of table" do
30
+ 2.times { User.create }
31
+ User.delete_all
32
+
33
+ connection.truncate_table('users')
34
+
35
+ User.create.id.should eq 1
36
+ end
37
+ end
38
+
39
+ end
40
+ end
41
+ end
42
+
@@ -9,7 +9,8 @@ require 'database_cleaner/active_record/truncation'
9
9
 
10
10
  module ActiveRecord
11
11
  module ConnectionAdapters
12
- [MysqlAdapter, Mysql2Adapter, SQLite3Adapter, JdbcAdapter, PostgreSQLAdapter, IBM_DBAdapter].each do |adapter|
12
+ #JdbcAdapter IBM_DBAdapter
13
+ [ MysqlAdapter, Mysql2Adapter, SQLite3Adapter, PostgreSQLAdapter ].each do |adapter|
13
14
  describe adapter, "#truncate_table" do
14
15
  it "responds" do
15
16
  adapter.instance_methods.should include(:truncate_table)
@@ -23,26 +24,26 @@ module DatabaseCleaner
23
24
  module ActiveRecord
24
25
 
25
26
  describe Truncation do
26
- let(:connection) { mock('connection') }
27
+ let(:connection) { double('connection') }
27
28
 
28
29
  before(:each) do
29
- connection.stub!(:disable_referential_integrity).and_yield
30
- connection.stub!(:database_cleaner_view_cache).and_return([])
31
- ::ActiveRecord::Base.stub!(:connection).and_return(connection)
30
+ connection.stub(:disable_referential_integrity).and_yield
31
+ connection.stub(:database_cleaner_view_cache).and_return([])
32
+ ::ActiveRecord::Base.stub(:connection).and_return(connection)
32
33
  end
33
34
 
34
35
  describe '#clean' do
35
36
  it "should truncate all tables except for schema_migrations" do
36
- connection.stub!(:database_cleaner_table_cache).and_return(%w[schema_migrations widgets dogs])
37
+ connection.stub(:database_cleaner_table_cache).and_return(%w[schema_migrations widgets dogs])
37
38
 
38
39
  connection.should_receive(:truncate_tables).with(['widgets', 'dogs'])
39
40
  Truncation.new.clean
40
41
  end
41
42
 
42
43
  it "should use ActiveRecord's schema_migrations_table_name" do
43
- connection.stub!(:database_cleaner_table_cache).and_return(%w[pre_schema_migrations_suf widgets dogs])
44
- ::ActiveRecord::Base.stub!(:table_name_prefix).and_return('pre_')
45
- ::ActiveRecord::Base.stub!(:table_name_suffix).and_return('_suf')
44
+ connection.stub(:database_cleaner_table_cache).and_return(%w[pre_schema_migrations_suf widgets dogs])
45
+ ::ActiveRecord::Base.stub(:table_name_prefix).and_return('pre_')
46
+ ::ActiveRecord::Base.stub(:table_name_suffix).and_return('_suf')
46
47
 
47
48
  connection.should_receive(:truncate_tables).with(['widgets', 'dogs'])
48
49
 
@@ -50,7 +51,7 @@ module DatabaseCleaner
50
51
  end
51
52
 
52
53
  it "should only truncate the tables specified in the :only option when provided" do
53
- connection.stub!(:database_cleaner_table_cache).and_return(%w[schema_migrations widgets dogs])
54
+ connection.stub(:database_cleaner_table_cache).and_return(%w[schema_migrations widgets dogs])
54
55
 
55
56
  connection.should_receive(:truncate_tables).with(['widgets'])
56
57
 
@@ -58,7 +59,7 @@ module DatabaseCleaner
58
59
  end
59
60
 
60
61
  it "should not truncate the tables specified in the :except option" do
61
- connection.stub!(:database_cleaner_table_cache).and_return(%w[schema_migrations widgets dogs])
62
+ connection.stub(:database_cleaner_table_cache).and_return(%w[schema_migrations widgets dogs])
62
63
 
63
64
  connection.should_receive(:truncate_tables).with(['dogs'])
64
65
 
@@ -76,8 +77,8 @@ module DatabaseCleaner
76
77
  end
77
78
 
78
79
  it "should not truncate views" do
79
- connection.stub!(:database_cleaner_table_cache).and_return(%w[widgets dogs])
80
- connection.stub!(:database_cleaner_view_cache).and_return(["widgets"])
80
+ connection.stub(:database_cleaner_table_cache).and_return(%w[widgets dogs])
81
+ connection.stub(:database_cleaner_view_cache).and_return(["widgets"])
81
82
 
82
83
  connection.should_receive(:truncate_tables).with(['dogs'])
83
84
 
@@ -88,8 +89,8 @@ module DatabaseCleaner
88
89
  subject { Truncation.new }
89
90
 
90
91
  it "should rely on #pre_count_truncate_tables if #pre_count? returns true" do
91
- connection.stub!(:database_cleaner_table_cache).and_return(%w[widgets dogs])
92
- connection.stub!(:database_cleaner_view_cache).and_return(["widgets"])
92
+ connection.stub(:database_cleaner_table_cache).and_return(%w[widgets dogs])
93
+ connection.stub(:database_cleaner_view_cache).and_return(["widgets"])
93
94
 
94
95
  subject.instance_variable_set(:"@pre_count", true)
95
96
 
@@ -100,8 +101,8 @@ module DatabaseCleaner
100
101
  end
101
102
 
102
103
  it "should not rely on #pre_count_truncate_tables if #pre_count? return false" do
103
- connection.stub!(:database_cleaner_table_cache).and_return(%w[widgets dogs])
104
- connection.stub!(:database_cleaner_view_cache).and_return(["widgets"])
104
+ connection.stub(:database_cleaner_table_cache).and_return(%w[widgets dogs])
105
+ connection.stub(:database_cleaner_view_cache).and_return(["widgets"])
105
106
 
106
107
  subject.instance_variable_set(:"@pre_count", false)
107
108
 
@@ -111,47 +112,67 @@ module DatabaseCleaner
111
112
  subject.clean
112
113
  end
113
114
  end
115
+
116
+ context 'when :cache_tables is set to true' do
117
+ it 'caches the list of tables to be truncated' do
118
+ connection.should_receive(:database_cleaner_table_cache).and_return([])
119
+ connection.should_not_receive(:tables)
120
+
121
+ connection.stub!(:truncate_tables)
122
+ Truncation.new({ :cache_tables => true }).clean
123
+ end
124
+ end
125
+
126
+ context 'when :cache_tables is set to false' do
127
+ it 'does not cache the list of tables to be truncated' do
128
+ connection.should_not_receive(:database_cleaner_table_cache)
129
+ connection.should_receive(:tables).and_return([])
130
+
131
+ connection.stub!(:truncate_tables)
132
+ Truncation.new({ :cache_tables => false }).clean
133
+ end
134
+ end
114
135
  end
115
136
 
116
137
  describe '#pre_count?' do
117
138
  before(:each) do
118
- connection.stub!(:disable_referential_integrity).and_yield
119
- connection.stub!(:database_cleaner_view_cache).and_return([])
120
- ::ActiveRecord::Base.stub!(:connection).and_return(connection)
139
+ connection.stub(:disable_referential_integrity).and_yield
140
+ connection.stub(:database_cleaner_view_cache).and_return([])
141
+ ::ActiveRecord::Base.stub(:connection).and_return(connection)
121
142
  end
122
143
 
123
144
  subject { Truncation.new }
124
- its(:pre_count?) { should == false }
145
+ its(:pre_count?) { should eq false }
125
146
 
126
147
  it 'should return true if @reset_id is set and non false or nil' do
127
148
  subject.instance_variable_set(:"@pre_count", true)
128
- subject.send(:pre_count?).should == true
149
+ subject.send(:pre_count?).should eq true
129
150
  end
130
151
 
131
152
  it 'should return false if @reset_id is set to false' do
132
153
  subject.instance_variable_set(:"@pre_count", false)
133
- subject.send(:pre_count?).should == false
154
+ subject.send(:pre_count?).should eq false
134
155
  end
135
156
  end
136
157
 
137
158
  describe '#reset_ids?' do
138
159
  before(:each) do
139
- connection.stub!(:disable_referential_integrity).and_yield
140
- connection.stub!(:database_cleaner_view_cache).and_return([])
141
- ::ActiveRecord::Base.stub!(:connection).and_return(connection)
160
+ connection.stub(:disable_referential_integrity).and_yield
161
+ connection.stub(:database_cleaner_view_cache).and_return([])
162
+ ::ActiveRecord::Base.stub(:connection).and_return(connection)
142
163
  end
143
164
 
144
165
  subject { Truncation.new }
145
- its(:reset_ids?) { should == true }
166
+ its(:reset_ids?) { should eq true }
146
167
 
147
168
  it 'should return true if @reset_id is set and non false or nil' do
148
169
  subject.instance_variable_set(:"@reset_ids", 'Something')
149
- subject.send(:reset_ids?).should == true
170
+ subject.send(:reset_ids?).should eq true
150
171
  end
151
172
 
152
173
  it 'should return false if @reset_id is set to false' do
153
174
  subject.instance_variable_set(:"@reset_ids", false)
154
- subject.send(:reset_ids?).should == false
175
+ subject.send(:reset_ids?).should eq false
155
176
  end
156
177
  end
157
178
  end