ardb 0.27.3 → 0.28.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 (43) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +5 -1
  3. data/ardb.gemspec +3 -4
  4. data/lib/ardb.rb +135 -68
  5. data/lib/ardb/adapter/base.rb +39 -24
  6. data/lib/ardb/adapter/mysql.rb +1 -2
  7. data/lib/ardb/adapter/postgresql.rb +14 -12
  8. data/lib/ardb/adapter/sqlite.rb +3 -8
  9. data/lib/ardb/adapter_spy.rb +67 -87
  10. data/lib/ardb/cli.rb +11 -219
  11. data/lib/ardb/{clirb.rb → cli/clirb.rb} +2 -1
  12. data/lib/ardb/cli/commands.rb +275 -0
  13. data/lib/ardb/migration.rb +8 -6
  14. data/lib/ardb/migration_helpers.rb +1 -1
  15. data/lib/ardb/pg_json.rb +90 -0
  16. data/lib/ardb/version.rb +1 -1
  17. data/test/helper.rb +15 -3
  18. data/test/support/factory.rb +15 -0
  19. data/test/support/fake_schema.rb +5 -0
  20. data/test/support/postgresql/migrations/.gitkeep +0 -0
  21. data/test/support/postgresql/pg_json_migrations/20160519133432_create_pg_json_migrate_test.rb +13 -0
  22. data/test/support/postgresql/schema.rb +3 -0
  23. data/test/support/postgresql/setup_test_db.rb +51 -0
  24. data/test/support/relative_require_test_db_file.rb +2 -0
  25. data/test/support/require_test_db_file.rb +1 -0
  26. data/test/system/pg_json_tests.rb +85 -0
  27. data/test/unit/adapter/base_tests.rb +104 -39
  28. data/test/unit/adapter/mysql_tests.rb +2 -1
  29. data/test/unit/adapter/postgresql_tests.rb +10 -9
  30. data/test/unit/adapter/sqlite_tests.rb +8 -3
  31. data/test/unit/adapter_spy_tests.rb +57 -66
  32. data/test/unit/ardb_tests.rb +323 -36
  33. data/test/unit/cli_tests.rb +193 -146
  34. data/test/unit/has_slug_tests.rb +9 -9
  35. data/test/unit/migration_helpers_tests.rb +18 -12
  36. data/test/unit/migration_tests.rb +18 -11
  37. data/test/unit/pg_json_tests.rb +39 -0
  38. data/test/unit/record_spy_tests.rb +1 -1
  39. data/test/unit/test_helpers_tests.rb +2 -6
  40. data/test/unit/use_db_default_tests.rb +2 -2
  41. metadata +29 -34
  42. data/lib/ardb/root_path.rb +0 -15
  43. data/test/unit/config_tests.rb +0 -58
@@ -0,0 +1,5 @@
1
+ if !defined?(FAKE_SCHEMA)
2
+ fake_schema_class = Struct.new(:load_count)
3
+ FAKE_SCHEMA = fake_schema_class.new(0)
4
+ end
5
+ FAKE_SCHEMA.load_count += 1
@@ -0,0 +1,13 @@
1
+ require 'ardb/migration_helpers'
2
+
3
+ class CreatePgJsonMigrateTest < ActiveRecord::Migration
4
+ include Ardb::MigrationHelpers
5
+
6
+ def change
7
+ create_table :pg_json_test_records do |t|
8
+ t.json :json_attribute
9
+ end
10
+ add_column :pg_json_test_records, :jsonb_attribute, :jsonb
11
+ end
12
+
13
+ end
@@ -0,0 +1,3 @@
1
+ ActiveRecord::Schema.define(:version => 0) do
2
+
3
+ end
@@ -0,0 +1,51 @@
1
+ require 'assert'
2
+ require 'ardb'
3
+
4
+ class PostgresqlDbTests < Assert::Context
5
+ setup do
6
+ @orig_env_ardb_db_file = ENV['ARDB_DB_FILE']
7
+ ActiveRecord::Base.logger = @orig_ar_loggerF
8
+
9
+ # no-op, we're manually configuring ardb so we don't need this to do anything
10
+ ENV['ARDB_DB_FILE'] = File.join(TEST_SUPPORT_PATH, 'require_test_db_file')
11
+
12
+ @ardb_config = Ardb::Config.new.tap do |c|
13
+ c.adapter = 'postgresql'
14
+ c.database = 'redding_ardb_test'
15
+ c.encoding = 'unicode'
16
+ c.min_messages = 'WARNING'
17
+
18
+ c.logger = TEST_LOGGER
19
+ c.root_path = File.join(TEST_SUPPORT_PATH, 'postgresql')
20
+ c.migrations_path = 'migrations'
21
+ c.schema_path = 'schema'
22
+ c.schema_format = :ruby
23
+ end
24
+ Assert.stub(Ardb, :config){ @ardb_config }
25
+
26
+ Ardb.init(false)
27
+
28
+ Ardb.adapter.drop_db
29
+ Ardb.adapter.create_db
30
+ Ardb.adapter.load_schema
31
+ Ardb.adapter.connect_db
32
+ end
33
+ teardown do
34
+ ActiveRecord::Base.logger = @orig_ar_logger
35
+ ENV['ARDB_DB_FILE'] = @orig_env_ardb_db_file
36
+ end
37
+
38
+ private
39
+
40
+ # useful when testing creating/dropping/migrating DBs
41
+ def silence_stdout
42
+ current_stdout = $stdout.dup
43
+ $stdout = File.new('/dev/null', 'w')
44
+ begin
45
+ yield
46
+ ensure
47
+ $stdout = current_stdout
48
+ end
49
+ end
50
+
51
+ end
@@ -0,0 +1,2 @@
1
+ # this file is used to test that Ardb will relatively require a db file when
2
+ # init
@@ -0,0 +1 @@
1
+ # this file is used to test that Ardb will require a db file when init
@@ -0,0 +1,85 @@
1
+ require 'assert'
2
+ require 'ardb/pg_json'
3
+
4
+ require 'json'
5
+ require 'test/support/postgresql/setup_test_db'
6
+
7
+ module Ardb; end
8
+ module Ardb::PgJson
9
+
10
+ class SystemTests < PostgresqlDbTests
11
+ desc "Ardb postgresql json shim"
12
+ setup do
13
+ @ardb_config.migrations_path = 'pg_json_migrations'
14
+ end
15
+
16
+ should "add support for postgresql json columns to migrations" do
17
+ # this should migrate the db, adding a record that has json/jsonb columns
18
+ assert_nothing_raised do
19
+ silence_stdout{ Ardb.adapter.migrate_db }
20
+ end
21
+
22
+ results = ActiveRecord::Base.connection.execute(
23
+ "SELECT column_name, data_type " \
24
+ "FROM INFORMATION_SCHEMA.COLUMNS " \
25
+ "WHERE table_name = 'pg_json_test_records'"
26
+ ).to_a
27
+ exp = {
28
+ 'column_name' => 'json_attribute',
29
+ 'data_type' => 'json',
30
+ }
31
+ assert_includes exp, results
32
+ exp = {
33
+ 'column_name' => 'jsonb_attribute',
34
+ 'data_type' => 'jsonb'
35
+ }
36
+ assert_includes exp, results
37
+ end
38
+
39
+ end
40
+
41
+ class WithMigratedTableTests < SystemTests
42
+ setup do
43
+ silence_stdout{ Ardb.adapter.migrate_db }
44
+ @record_class = Class.new(ActiveRecord::Base) do
45
+ self.table_name = 'pg_json_test_records'
46
+ end
47
+ end
48
+
49
+ should "add support for postgresql 'json' attributes on records" do
50
+ values = [Factory.string, Factory.integer, nil]
51
+
52
+ record = @record_class.new
53
+ assert_nil record.json_attribute
54
+ assert_nil record.jsonb_attribute
55
+
56
+ hash = Factory.integer(3).times.inject({}) do |h, n|
57
+ h.merge!(Factory.string => values.sample)
58
+ end
59
+ record.json_attribute = JSON.dump(hash)
60
+ record.jsonb_attribute = JSON.dump(hash)
61
+ assert_nothing_raised{ record.save! }
62
+ record.reload
63
+ assert_equal hash, JSON.load(record.json_attribute)
64
+ assert_equal hash, JSON.load(record.jsonb_attribute)
65
+
66
+ array = Factory.integer(3).times.map{ values.sample }
67
+ record.json_attribute = JSON.dump(array)
68
+ record.jsonb_attribute = JSON.dump(array)
69
+ assert_nothing_raised{ record.save! }
70
+ record.reload
71
+ assert_equal array, JSON.load(record.json_attribute)
72
+ assert_equal array, JSON.load(record.jsonb_attribute)
73
+
74
+ value = values.sample
75
+ record.json_attribute = JSON.dump(value)
76
+ record.jsonb_attribute = JSON.dump(value)
77
+ assert_nothing_raised{ record.save! }
78
+ record.reload
79
+ assert_equal value, JSON.load(record.json_attribute)
80
+ assert_equal value, JSON.load(record.jsonb_attribute)
81
+ end
82
+
83
+ end
84
+
85
+ end
@@ -1,34 +1,46 @@
1
1
  require 'assert'
2
2
  require 'ardb/adapter/base'
3
3
 
4
+ require 'ardb'
5
+ # This is needed by the schema dumper but it doesn't handle requiring it so we
6
+ # have to manually, otherwise this errors when you try to run the adapter base
7
+ # tests by themselves
8
+ require 'active_support/core_ext/class/attribute_accessors'
9
+
4
10
  class Ardb::Adapter::Base
5
11
 
6
12
  class UnitTests < Assert::Context
7
13
  desc "Ardb::Adapter::Base"
8
14
  setup do
9
- @adapter = Ardb::Adapter::Base.new
15
+ @config = Factory.ardb_config
16
+ @adapter = Ardb::Adapter::Base.new(@config)
10
17
  end
11
18
  subject{ @adapter }
12
19
 
13
- should have_readers :config_settings, :database
14
- should have_readers :ruby_schema_path, :sql_schema_path
20
+ should have_readers :config
21
+ should have_imeths :connect_hash, :database, :migrations_path
22
+ should have_imeths :schema_format, :ruby_schema_path, :sql_schema_path
15
23
  should have_imeths :escape_like_pattern
16
24
  should have_imeths :foreign_key_add_sql, :foreign_key_drop_sql
17
- should have_imeths :create_db, :drop_db, :connect_db, :migrate_db
25
+ should have_imeths :create_db, :drop_db, :drop_tables
26
+ should have_imeths :connect_db, :migrate_db
18
27
  should have_imeths :load_schema, :load_ruby_schema, :load_sql_schema
19
28
  should have_imeths :dump_schema, :dump_ruby_schema, :dump_sql_schema
20
29
 
21
- should "know its config settings " do
22
- assert_equal Ardb.config.db_settings, subject.config_settings
30
+ should "know its config" do
31
+ assert_equal @config, subject.config
23
32
  end
24
33
 
25
- should "know its database" do
26
- assert_equal Ardb.config.db.database, subject.database
34
+ should "demeter its config" do
35
+ assert_equal @config.activerecord_connect_hash, subject.connect_hash
36
+ assert_equal @config.database, subject.database
37
+ assert_equal @config.migrations_path, subject.migrations_path
38
+ assert_equal @config.schema_format, subject.schema_format
27
39
  end
28
40
 
29
- should "know its schema paths" do
30
- assert_equal "#{Ardb.config.schema_path}.rb", subject.ruby_schema_path
31
- assert_equal "#{Ardb.config.schema_path}.sql", subject.sql_schema_path
41
+ should "know its ruby and sql schema paths" do
42
+ assert_equal "#{@config.schema_path}.rb", subject.ruby_schema_path
43
+ assert_equal "#{@config.schema_path}.sql", subject.sql_schema_path
32
44
  end
33
45
 
34
46
  should "know how to escape like patterns" do
@@ -73,21 +85,38 @@ class Ardb::Adapter::Base
73
85
  assert_raises(NotImplementedError){ subject.dump_sql_schema }
74
86
  end
75
87
 
88
+ should "know if its equal to another adapter" do
89
+ matching_adapter = Ardb::Adapter::Base.new(@config)
90
+ assert_equal matching_adapter, subject
91
+
92
+ non_matching_adapter = Ardb::Adapter::Base.new(Factory.ardb_config)
93
+ assert_not_equal non_matching_adapter, subject
94
+ end
95
+
76
96
  end
77
97
 
78
98
  class ConnectDbTests < UnitTests
79
99
  desc "`connect_db`"
80
100
  setup do
81
- @ar_base_conn_called = false
82
- Assert.stub(ActiveRecord::Base, :connection) do |*args|
83
- @ar_base_conn_called = true
101
+ @ar_establish_connection_called_with = nil
102
+ Assert.stub(ActiveRecord::Base, :establish_connection) do |options|
103
+ @ar_establish_connection_called_with = options
104
+ end
105
+
106
+ @ar_connection_pool = FakeConnectionPool.new
107
+ Assert.stub(ActiveRecord::Base, :connection_pool){ @ar_connection_pool }
108
+
109
+ @ar_with_connection_called = false
110
+ Assert.stub(@ar_connection_pool, :with_connection) do
111
+ @ar_with_connection_called = true
84
112
  end
85
113
 
86
114
  @adapter.connect_db
87
115
  end
88
116
 
89
- should "call activerecord base's connection method" do
90
- assert_true @ar_base_conn_called
117
+ should "use activerecord to establish and then checkout a connection" do
118
+ assert_equal subject.connect_hash, @ar_establish_connection_called_with
119
+ assert_true @ar_with_connection_called
91
120
  end
92
121
 
93
122
  end
@@ -95,6 +124,9 @@ class Ardb::Adapter::Base
95
124
  class MigrateDbTests < UnitTests
96
125
  desc "`migrate_db`"
97
126
  setup do
127
+ @orig_migrate_version_env_var = ENV['MIGRATE_VERSION']
128
+ @orig_migrate_query_env_var = ENV['MIGRATE_QUIET']
129
+
98
130
  ENV["MIGRATE_VERSION"] = Factory.integer.to_s if Factory.boolean
99
131
  ENV["MIGRATE_QUIET"] = Factory.boolean.to_s if Factory.boolean
100
132
 
@@ -105,6 +137,10 @@ class Ardb::Adapter::Base
105
137
 
106
138
  @adapter.migrate_db
107
139
  end
140
+ teardown do
141
+ ENV['MIGRATE_VERSION'] = @orig_migrate_version_env_var
142
+ ENV['MIGRATE_QUIET'] = @orig_migrate_query_env_var
143
+ end
108
144
 
109
145
  should "add the ardb migration helper recorder to activerecord's command recorder" do
110
146
  exp = Ardb::MigrationHelpers::RecorderMixin
@@ -112,7 +148,7 @@ class Ardb::Adapter::Base
112
148
  end
113
149
 
114
150
  should "set the activerecord migrator's migrations path" do
115
- exp = Ardb.config.migrations_path
151
+ exp = subject.migrations_path
116
152
  assert_equal exp, ActiveRecord::Migrator.migrations_path
117
153
  end
118
154
 
@@ -123,7 +159,7 @@ class Ardb::Adapter::Base
123
159
 
124
160
  should "call the activerecord migrator's migrate method" do
125
161
  version = ENV.key?("MIGRATE_VERSION") ? ENV["MIGRATE_VERSION"].to_i : nil
126
- exp = [Ardb.config.migrations_path, version]
162
+ exp = [subject.migrations_path, version]
127
163
  assert_equal exp, @migrator_called_with
128
164
  end
129
165
 
@@ -135,18 +171,15 @@ class Ardb::Adapter::Base
135
171
  @captured_stdout = ""
136
172
  $stdout = StringIO.new(@captured_stdout)
137
173
 
138
- @orig_schema_format = Ardb.config.schema_format
139
-
140
- @adapter = SchemaSpyAdapter.new
174
+ @adapter = SchemaSpyAdapter.new(@config)
141
175
  end
142
176
  teardown do
143
- Ardb.config.schema_format = @orig_schema_format
144
177
  $stdout = @orig_stdout
145
178
  end
146
179
 
147
180
  should "load a ruby schema using `load_schema` when the format is ruby" do
148
- Ardb.config.schema_format = :ruby
149
- adapter = SchemaSpyAdapter.new
181
+ @config.schema_format = Ardb::Config::RUBY_SCHEMA_FORMAT
182
+ adapter = SchemaSpyAdapter.new(@config)
150
183
 
151
184
  assert_false adapter.load_ruby_schema_called
152
185
  assert_false adapter.load_sql_schema_called
@@ -156,8 +189,8 @@ class Ardb::Adapter::Base
156
189
  end
157
190
 
158
191
  should "load a SQL schema using `load_schema` when the format is sql" do
159
- Ardb.config.schema_format = :sql
160
- adapter = SchemaSpyAdapter.new
192
+ @config.schema_format = Ardb::Config::SQL_SCHEMA_FORMAT
193
+ adapter = SchemaSpyAdapter.new(@config)
161
194
 
162
195
  assert_false adapter.load_ruby_schema_called
163
196
  assert_false adapter.load_sql_schema_called
@@ -172,8 +205,8 @@ class Ardb::Adapter::Base
172
205
  end
173
206
 
174
207
  should "always dump a ruby schema using `dump_schema`" do
175
- Ardb.config.schema_format = :ruby
176
- adapter = SchemaSpyAdapter.new
208
+ @config.schema_format = Ardb::Config::RUBY_SCHEMA_FORMAT
209
+ adapter = SchemaSpyAdapter.new(@config)
177
210
 
178
211
  assert_false adapter.dump_ruby_schema_called
179
212
  assert_false adapter.dump_sql_schema_called
@@ -181,8 +214,8 @@ class Ardb::Adapter::Base
181
214
  assert_true adapter.dump_ruby_schema_called
182
215
  assert_false adapter.dump_sql_schema_called
183
216
 
184
- Ardb.config.schema_format = :sql
185
- adapter = SchemaSpyAdapter.new
217
+ @config.schema_format = Ardb::Config::SQL_SCHEMA_FORMAT
218
+ adapter = SchemaSpyAdapter.new(@config)
186
219
 
187
220
  assert_false adapter.dump_ruby_schema_called
188
221
  adapter.dump_schema
@@ -190,8 +223,8 @@ class Ardb::Adapter::Base
190
223
  end
191
224
 
192
225
  should "dump a SQL schema using `dump_schema` when the format is sql" do
193
- Ardb.config.schema_format = :sql
194
- adapter = SchemaSpyAdapter.new
226
+ @config.schema_format = Ardb::Config::SQL_SCHEMA_FORMAT
227
+ adapter = SchemaSpyAdapter.new(@config)
195
228
 
196
229
  assert_false adapter.dump_ruby_schema_called
197
230
  adapter.dump_schema
@@ -207,13 +240,8 @@ class Ardb::Adapter::Base
207
240
 
208
241
  class LoadRubySchemaTests < UnitTests
209
242
  setup do
210
- @orig_schema_path = Ardb.config.schema_path
211
- Ardb.config.schema_path = 'fake_schema'
212
-
213
- @adapter = Ardb::Adapter::Base.new
214
- end
215
- teardown do
216
- Ardb.config.schema_path = @orig_schema_path
243
+ @config.schema_path = File.join(TEST_SUPPORT_PATH, 'fake_schema')
244
+ @adapter = Ardb::Adapter::Base.new(@config)
217
245
  end
218
246
 
219
247
  should "load a ruby schema file using `load_ruby_schema`" do
@@ -227,6 +255,39 @@ class Ardb::Adapter::Base
227
255
 
228
256
  end
229
257
 
258
+ class DumpRubySchemaTests < UnitTests
259
+ setup do
260
+ @config.schema_path = File.join(TMP_PATH, 'testdb', 'test_dump_ruby_schema')
261
+ FileUtils.rm_rf(File.dirname(@config.schema_path))
262
+
263
+ @schema_dumper_connection, @schema_dumper_file = [nil, nil]
264
+ Assert.stub(ActiveRecord::SchemaDumper, :dump) do |connection, file|
265
+ @schema_dumper_connection = connection
266
+ @schema_dumper_file = file
267
+ end
268
+
269
+ @fake_connection = FakeConnection.new
270
+ Assert.stub(ActiveRecord::Base, :connection){ @fake_connection }
271
+
272
+ @adapter = Ardb::Adapter::Base.new(@config)
273
+ end
274
+ teardown do
275
+ FileUtils.rm_rf(File.dirname(@config.schema_path))
276
+ end
277
+
278
+ should "dump a ruby schema file using `dump_ruby_schema`" do
279
+ assert_false File.exists?(subject.ruby_schema_path)
280
+ subject.dump_ruby_schema
281
+ assert_true File.exists?(subject.ruby_schema_path)
282
+ assert_equal @fake_connection, @schema_dumper_connection
283
+ assert_instance_of File, @schema_dumper_file
284
+ assert_equal subject.ruby_schema_path, @schema_dumper_file.path
285
+ end
286
+
287
+ end
288
+
289
+ class FakeConnection; end
290
+
230
291
  class SchemaSpyAdapter < Ardb::Adapter::Base
231
292
  attr_reader :load_ruby_schema_called, :dump_ruby_schema_called
232
293
  attr_reader :load_sql_schema_called, :dump_sql_schema_called
@@ -260,4 +321,8 @@ class Ardb::Adapter::Base
260
321
  end
261
322
  end
262
323
 
324
+ class FakeConnectionPool
325
+ def with_connection(&block); end
326
+ end
327
+
263
328
  end
@@ -6,7 +6,8 @@ class Ardb::Adapter::Mysql
6
6
  class UnitTests < Assert::Context
7
7
  desc "Ardb::Adapter::Mysql"
8
8
  setup do
9
- @adapter = Ardb::Adapter::Mysql.new
9
+ @config = Factory.ardb_config
10
+ @adapter = Ardb::Adapter::Mysql.new(@config)
10
11
  end
11
12
  subject{ @adapter }
12
13