database_rewinder 0.7.1 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1db1d33a8c34c0c729cda2c399f9572fa9517154
4
- data.tar.gz: 95bc85096e0150ef5260931297b9461b0a9e65f2
3
+ metadata.gz: 5f5c97bcefcc1123d7adf1d809c1ef4107ce0ef8
4
+ data.tar.gz: 889bc139276c81073d6d89870eedecfb4bafa664
5
5
  SHA512:
6
- metadata.gz: db16fa1ceed189ce34db7f1c54a335014635614069d04d66e44836a18275e68d325de537d4205c86bf24dc1620b3764f5b21b14f49f9f614894781d83ba8d9b5
7
- data.tar.gz: ba26cdae5c9433f37726c95e4d103e534f767ad3ce257f4752094716adb843171c7a803ae8f922ed1ddd2c0a0387a1de0ecb30699d68823b42f6473874fb6d5f
6
+ metadata.gz: 8b9b9cfa9c8bce163ef37ac406aaa3b90c5c5046cb5852eb697d1ae3e48316035ab26378a3294a12d948a189654e17978d932c86f585952f865d09ca296293d2
7
+ data.tar.gz: 38cf26cf1d6d947c3eb726bdf28b58175e599decb8757c8185ebfcab2e8d21bb90aadb23b727ab669ae53bf495c01d029e3a076624e67e1a7a14fc91fb3f2cb3
data/.travis.yml CHANGED
@@ -1,5 +1,7 @@
1
1
  language: ruby
2
2
 
3
+ cache: bundler
4
+
3
5
  env:
4
6
  - DB=sqlite3
5
7
  - DB=mysql
@@ -8,8 +10,8 @@ env:
8
10
  rvm:
9
11
  - 2.0.0
10
12
  - 2.1.10
11
- - 2.2.5
12
- - 2.3.1
13
+ - 2.2.6
14
+ - 2.3.3
13
15
 
14
16
  gemfile:
15
17
  - gemfiles/rails_40.gemfile
data/README.md CHANGED
@@ -15,6 +15,7 @@ database\_rewinder is a minimalist's tiny and ultra-fast database cleaner.
15
15
  database\_rewinder memorizes every table name into which `INSERT` SQL was performed during each test case.
16
16
  Then it executes `DELETE` SQL only against these tables when cleaning.
17
17
  So, the more number of tables you have in your database, the more benefit you will get.
18
+ Also, database\_rewinder joins all `DELETE` SQL statements and casts it in one DB server call.
18
19
 
19
20
  ### Credit
20
21
 
@@ -83,6 +84,41 @@ RSpec.configure do |config|
83
84
  end
84
85
  ```
85
86
 
87
+ ### MySQL + use\_transactional\_tests Specific Problems
88
+
89
+ database\_rewinder tries to create a new DB connection for deletion when you're running tests on MySQL.
90
+ You would occasionally hit some weird errors (e.g. query execution timeout) because of this, especially when your tests are run with the `use_transactional_tests` option enabled (which is Rails' default).
91
+
92
+ #### 1. Properly understand what `use_transactional_tests` means, and consider turning it off
93
+
94
+ `use_transactional_tests` is the option that surrounds each of your test case with a DB transaction to roll back all your test data after each test run.
95
+ So far as this works properly, you won't really need to use database\_rewinder.
96
+ However, this simple mechanism doesn't work well when you're running integration tests with capybara + js mode.
97
+ In cases of this situation, bundle database\_rewinder and add the following configuration.
98
+
99
+ ```ruby
100
+ RSpec.configure do |config|
101
+ config.use_transactional_examples = false
102
+
103
+ ...
104
+ end
105
+ ```
106
+
107
+ #### 2. Cleaning with `multiple: false` option
108
+ If you're really sure you need to keep using transational tests + database\_rewinder for some reason, then explicitly pass in `multiple: false` option to `DatabaseRewinder.clean_all` and `DatabaseRewinder.clean` invocations as follows. Note that you won't be able to get full performance merit that database\_rewinder provides though.
109
+
110
+ ```ruby
111
+ RSpec.configure do |config|
112
+ config.before :suite do
113
+ DatabaseRewinder.clean_all multiple: false
114
+ end
115
+
116
+ config.after :each do
117
+ DatabaseRewinder.clean multiple: false
118
+ end
119
+ end
120
+ ```
121
+
86
122
  ### Pro Tip
87
123
 
88
124
  database\_rewinder is designed to be almost compatible with database\_cleaner.
@@ -5,7 +5,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
5
 
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = "database_rewinder"
8
- spec.version = '0.7.1'
8
+ spec.version = '0.8.0'
9
9
  spec.authors = ["Akira Matsuda"]
10
10
  spec.email = ["ronnie@dio.jp"]
11
11
  spec.description = "A minimalist's tiny and ultra-fast database cleaner"
@@ -25,4 +25,5 @@ Gem::Specification.new do |spec|
25
25
  spec.add_development_dependency 'sqlite3'
26
26
  spec.add_development_dependency 'mysql2'
27
27
  spec.add_development_dependency 'pg'
28
+ spec.required_ruby_version = '>= 2.0.0'
28
29
  end
@@ -58,16 +58,16 @@ module DatabaseRewinder
58
58
  end
59
59
  end
60
60
 
61
- def clean
61
+ def clean(multiple: true)
62
62
  if @clean_all
63
- clean_all
63
+ clean_all multiple: multiple
64
64
  else
65
- cleaners.each(&:clean)
65
+ cleaners.each {|c| c.clean multiple: multiple}
66
66
  end
67
67
  end
68
68
 
69
- def clean_all
70
- cleaners.each(&:clean_all)
69
+ def clean_all(multiple: true)
70
+ cleaners.each {|c| c.clean_all multiple: multiple}
71
71
  end
72
72
 
73
73
  # cache AR connection.tables
@@ -13,6 +13,7 @@ module DatabaseRewinder
13
13
  end
14
14
  end
15
15
 
16
+ #FIXME can we not load 'em?
16
17
  begin
17
18
  require 'active_record/connection_adapters/sqlite3_adapter'
18
19
  ::ActiveRecord::ConnectionAdapters::SQLite3Adapter.send :prepend, DatabaseRewinder::InsertRecorder
@@ -16,7 +16,7 @@ module DatabaseRewinder
16
16
  config['database']
17
17
  end
18
18
 
19
- def clean
19
+ def clean(multiple: true)
20
20
  return if !pool || inserted_tables.empty?
21
21
 
22
22
  # When the application uses multiple database connections, a connection
@@ -24,19 +24,19 @@ module DatabaseRewinder
24
24
  # In this case, we have to reconnect to the database to clean inserted
25
25
  # tables.
26
26
  with_automatic_reconnect(pool) do
27
- delete_all (ar_conn = pool.connection), DatabaseRewinder.all_table_names(ar_conn) & inserted_tables
27
+ delete_all (ar_conn = pool.connection), DatabaseRewinder.all_table_names(ar_conn) & inserted_tables, multiple: multiple
28
28
  end
29
29
  reset
30
30
  end
31
31
 
32
- def clean_all
32
+ def clean_all(multiple: true)
33
33
  if pool
34
34
  ar_conn = pool.connection
35
- delete_all ar_conn, DatabaseRewinder.all_table_names(ar_conn)
35
+ delete_all ar_conn, DatabaseRewinder.all_table_names(ar_conn), multiple: multiple
36
36
  else
37
37
  require 'database_rewinder/dummy_model'
38
38
  DummyModel.with_temporary_connection(config) do |temporary_connection|
39
- delete_all temporary_connection, DatabaseRewinder.all_table_names(temporary_connection)
39
+ delete_all temporary_connection, DatabaseRewinder.all_table_names(temporary_connection), multiple: multiple
40
40
  end
41
41
  end
42
42
 
@@ -44,18 +44,25 @@ module DatabaseRewinder
44
44
  end
45
45
 
46
46
  private
47
- def delete_all(ar_conn, tables)
47
+ def delete_all(ar_conn, tables, multiple: true)
48
48
  tables = tables & @only if @only.any?
49
49
  tables -= @except if @except.any?
50
50
  return if tables.empty?
51
51
 
52
- if tables.many? && ar_conn.supports_multiple_statements?
53
- ar_conn.execute_multiple tables.map {|t| "DELETE FROM #{ar_conn.quote_table_name(t)}"}.join(';')
54
- else
55
- ar_conn.disable_referential_integrity do
56
- tables.each do |table_name|
57
- ar_conn.execute "DELETE FROM #{ar_conn.quote_table_name(table_name)};"
58
- end
52
+ if multiple && tables.many? && ar_conn.supports_multiple_statements?
53
+ #TODO Use ADAPTER_NAME when we've dropped AR 4.1 support
54
+ if (ar_conn.class.name == 'ActiveRecord::ConnectionAdapters::Mysql2Adapter') && ar_conn.transaction_open?
55
+ # Print the warning message, then fall back to non-multiple deletion
56
+ Kernel.warn "WARNING: You may be executing DatabaseRewinder inside a transactional test. You're presumably misconfiguring your tests. Please read DatabaseRewinder's document, and properly configure your tests."
57
+ else
58
+ ar_conn.execute_multiple tables.map {|t| "DELETE FROM #{ar_conn.quote_table_name(t)}"}.join(';')
59
+ return
60
+ end
61
+ end
62
+
63
+ ar_conn.disable_referential_integrity do
64
+ tables.each do |table_name|
65
+ ar_conn.execute "DELETE FROM #{ar_conn.quote_table_name(table_name)};"
59
66
  end
60
67
  end
61
68
  end
@@ -52,10 +52,10 @@ module DatabaseRewinder
52
52
 
53
53
  class Cleaner
54
54
  module Compatibility
55
- def clean_with(_strategy, only: nil, except: nil, **)
55
+ def clean_with(_strategy, only: nil, except: nil, multiple: true, **)
56
56
  originals = @only, @except
57
57
  self.only, self.except = Array(only), Array(except)
58
- clean_all
58
+ clean_all multiple: multiple
59
59
  ensure
60
60
  self.only, self.except = originals
61
61
  end
@@ -13,8 +13,7 @@ module DatabaseRewinder
13
13
  when 'ActiveRecord::ConnectionAdapters::PostgreSQLAdapter'
14
14
  disable_referential_integrity { log(sql) { @connection.exec sql } }
15
15
  when 'ActiveRecord::ConnectionAdapters::Mysql2Adapter'
16
- query_options = @connection.query_options.dup
17
- if query_options[:connect_flags] & Mysql2::Client::MULTI_STATEMENTS != 0
16
+ if @connection.query_options[:connect_flags] & Mysql2::Client::MULTI_STATEMENTS != 0
18
17
  disable_referential_integrity do
19
18
  _result = log(sql) { @connection.query sql }
20
19
  while @connection.next_result
@@ -23,6 +22,7 @@ module DatabaseRewinder
23
22
  end
24
23
  end
25
24
  else
25
+ query_options = @connection.query_options.dup
26
26
  query_options[:connect_flags] |= Mysql2::Client::MULTI_STATEMENTS
27
27
  # opens another connection to the DB
28
28
  client = Mysql2::Client.new query_options
@@ -10,7 +10,7 @@ class DatabaseRewinder::InsertRecorderTest < ActiveSupport::TestCase
10
10
  end
11
11
 
12
12
  test '#execute' do
13
- cleaner = DatabaseRewinder.instance_variable_get(:'@cleaners').detect {|c| c.db == (ENV['DB'] == 'sqlite3' ? 'database_rewinder_test.sqlite3' : 'database_rewinder_test')}
13
+ cleaner = DatabaseRewinder.instance_variable_get(:'@cleaners').detect {|c| c.db == (ENV['DB'] == 'sqlite3' ? 'db/database_rewinder_test.sqlite3' : 'database_rewinder_test')}
14
14
 
15
15
  assert_equal %w(foos bars), cleaner.inserted_tables
16
16
  assert_not_nil cleaner.pool
@@ -1,12 +1,12 @@
1
1
  sqlite3: &sqlite3
2
2
  adapter: sqlite3
3
- database: database_rewinder_test.sqlite3
3
+ database: db/database_rewinder_test.sqlite3
4
4
  pool: 5
5
5
  timeout: 5000
6
6
 
7
7
  sqlite3_2: &sqlite3_2
8
8
  adapter: sqlite3
9
- database: database_rewinder_test2.sqlite3
9
+ database: db/database_rewinder_test2.sqlite3
10
10
  pool: 5
11
11
  timeout: 5000
12
12
 
@@ -66,7 +66,7 @@ class DatabaseRewinder::DatabaseRewinderTest < ActiveSupport::TestCase
66
66
  end
67
67
 
68
68
  def perform_insert(sql)
69
- @cleaner = DatabaseRewinder.instance_variable_get(:'@cleaners').detect {|c| c.db == (ENV['DB'] == 'sqlite3' ? 'database_rewinder_test.sqlite3' : 'database_rewinder_test')}
69
+ @cleaner = DatabaseRewinder.instance_variable_get(:'@cleaners').detect {|c| c.db == (ENV['DB'] == 'sqlite3' ? 'db/database_rewinder_test.sqlite3' : 'database_rewinder_test')}
70
70
 
71
71
  connection = ::ActiveRecord::Base.connection
72
72
  DatabaseRewinder.record_inserted_table(connection, sql)
data/test/db/.keep ADDED
File without changes
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: database_rewinder
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.1
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Akira Matsuda
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-11-14 00:00:00.000000000 Z
11
+ date: 2016-12-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -138,6 +138,7 @@ files:
138
138
  - test/cleaner_test.rb
139
139
  - test/config/database.yml
140
140
  - test/database_rewinder_test.rb
141
+ - test/db/.keep
141
142
  - test/fake_app.rb
142
143
  - test/test_helper.rb
143
144
  homepage: https://github.com/amatsuda/database_rewinder
@@ -152,7 +153,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
152
153
  requirements:
153
154
  - - ">="
154
155
  - !ruby/object:Gem::Version
155
- version: '0'
156
+ version: 2.0.0
156
157
  required_rubygems_version: !ruby/object:Gem::Requirement
157
158
  requirements:
158
159
  - - ">="
@@ -169,5 +170,6 @@ test_files:
169
170
  - test/cleaner_test.rb
170
171
  - test/config/database.yml
171
172
  - test/database_rewinder_test.rb
173
+ - test/db/.keep
172
174
  - test/fake_app.rb
173
175
  - test/test_helper.rb