ardb 0.27.3 → 0.28.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -1,6 +1,7 @@
1
1
  require 'assert'
2
2
  require 'ardb/cli'
3
3
 
4
+ require 'ardb'
4
5
  require 'ardb/adapter_spy'
5
6
  require 'ardb/migration'
6
7
 
@@ -9,10 +10,6 @@ class Ardb::CLI
9
10
  class UnitTests < Assert::Context
10
11
  desc "Ardb::CLI"
11
12
  setup do
12
- @kernel_spy = KernelSpy.new
13
- @stdout = IOSpy.new
14
- @stderr = IOSpy.new
15
-
16
13
  @cli_class = Ardb::CLI
17
14
  end
18
15
  subject{ @cli_class }
@@ -32,12 +29,11 @@ class Ardb::CLI
32
29
  assert_equal 5, COMMANDS.size
33
30
 
34
31
  assert_instance_of InvalidCommand, COMMANDS[Factory.string]
35
-
36
- assert_equal ConnectCommand, COMMANDS['connect']
37
- assert_equal CreateCommand, COMMANDS['create']
38
- assert_equal DropCommand, COMMANDS['drop']
39
- assert_equal MigrateCommand, COMMANDS['migrate']
40
- assert_equal GenerateMigrationCommand, COMMANDS['generate-migration']
32
+ assert_instance_of ConnectCommand, COMMANDS['connect']
33
+ assert_instance_of CreateCommand, COMMANDS['create']
34
+ assert_instance_of DropCommand, COMMANDS['drop']
35
+ assert_instance_of MigrateCommand, COMMANDS['migrate']
36
+ assert_instance_of GenerateMigrationCommand, COMMANDS['generate-migration']
41
37
  end
42
38
 
43
39
  end
@@ -45,6 +41,10 @@ class Ardb::CLI
45
41
  class InitTests < UnitTests
46
42
  desc "when init"
47
43
  setup do
44
+ @kernel_spy = KernelSpy.new
45
+ @stdout = IOSpy.new
46
+ @stderr = IOSpy.new
47
+
48
48
  @cli = @cli_class.new(@kernel_spy, @stdout, @stderr)
49
49
  end
50
50
  subject{ @cli }
@@ -59,18 +59,14 @@ class Ardb::CLI
59
59
  @argv = [@command_name, Factory.string]
60
60
 
61
61
  @command_class = Class.new
62
- COMMANDS[@command_name] = @command_class
63
-
64
- @command_spy = CommandSpy.new
65
- Assert.stub(@command_class, :new).with(@argv){ @command_spy }
66
-
67
- @ardb_init_called_with = nil
68
- Assert.stub(Ardb, :init){ |*args| @ardb_init_called_with = args }
62
+ @command_spy = CommandSpy.new
63
+ Assert.stub(@command_class, :new){ @command_spy }
64
+ COMMANDS.add(@command_class, @command_name)
69
65
 
70
66
  @invalid_command = InvalidCommand.new(@command_name)
71
67
  end
72
68
  teardown do
73
- COMMANDS.delete(@command_name)
69
+ COMMANDS.remove(@command_name)
74
70
  end
75
71
 
76
72
  end
@@ -85,10 +81,6 @@ class Ardb::CLI
85
81
  assert_includes Dir.pwd, $LOAD_PATH
86
82
  end
87
83
 
88
- should "init Ardb without establishing a connection" do
89
- assert_equal [false], @ardb_init_called_with
90
- end
91
-
92
84
  should "have run the command" do
93
85
  assert_true @command_spy.run_called
94
86
  end
@@ -187,7 +179,7 @@ class Ardb::CLI
187
179
  class RunWithErrorTests < RunSetupTests
188
180
  setup do
189
181
  @exception = RuntimeError.new(Factory.string)
190
- Assert.stub(@command_class, :new).with(@argv){ raise @exception }
182
+ Assert.stub(@command_spy, :run){ raise @exception }
191
183
  @cli.run(@argv)
192
184
  end
193
185
 
@@ -213,263 +205,305 @@ class Ardb::CLI
213
205
  end
214
206
  subject{ @cmd }
215
207
 
216
- should have_readers :name, :argv, :clirb
208
+ should have_readers :name, :clirb
217
209
  should have_imeths :new, :run, :help
218
210
 
219
211
  should "know its attrs" do
220
212
  assert_equal @name, subject.name
221
- assert_equal [], subject.argv
222
-
223
- assert_instance_of Ardb::CLIRB, subject.clirb
213
+ assert_instance_of CLIRB, subject.clirb
224
214
  end
225
215
 
226
216
  should "set its argv and return itself using `new`" do
227
- args = [Factory.string, Factory.string]
228
- result = subject.new(args)
229
- assert_same subject, result
230
- assert_equal [@name, args].flatten, subject.argv
217
+ assert_same subject, subject.new
231
218
  end
232
219
 
233
- should "parse its argv on run`" do
234
- assert_raises(Ardb::CLIRB::HelpExit){ subject.new(['--help']).run }
235
- assert_raises(Ardb::CLIRB::VersionExit){ subject.new(['--version']).run }
220
+ should "parse its argv on run" do
221
+ assert_raises(CLIRB::HelpExit){ subject.new.run([ '--help' ]) }
222
+ assert_raises(CLIRB::VersionExit){ subject.new.run([ '--version' ]) }
236
223
  end
237
224
 
238
- should "raise a help exit if its argv is empty" do
239
- cmd = @command_class.new([nil, ''].choice)
240
- assert_raises(Ardb::CLIRB::HelpExit){ cmd.new([]).run }
225
+ should "raise a help exit if its name is empty" do
226
+ cmd = @command_class.new([nil, ''].sample)
227
+ argv = [Factory.string, Factory.string]
228
+ assert_raises(CLIRB::HelpExit){ cmd.new.run(argv) }
241
229
  end
242
230
 
243
231
  should "raise an invalid command error when run" do
244
- assert_raises(InvalidCommandError){ subject.new([Factory.string]).run }
232
+ assert_raises(InvalidCommandError){ subject.new.run([Factory.string]) }
245
233
  end
246
234
 
247
235
  should "know its help" do
248
236
  exp = "Usage: ardb [COMMAND] [options]\n\n" \
249
- "Commands: #{COMMANDS.keys.sort.join(', ')}\n" \
250
- "Options: #{subject.clirb}"
237
+ "Options: #{subject.clirb}\n" \
238
+ "Commands:\n" \
239
+ "#{COMMANDS.to_s.split("\n").map{ |l| " #{l}" }.join("\n")}\n"
251
240
  assert_equal exp, subject.help
252
241
  end
253
242
 
254
243
  end
255
244
 
256
- class ConnectCommandTests < UnitTests
257
- desc "ConnectCommand"
245
+ class CommandSetupTests < UnitTests
258
246
  setup do
259
- @adapter_spy = Class.new{ include Ardb::AdapterSpy }.new
260
- Assert.stub(Ardb::Adapter, Ardb.config.db.adapter.to_sym){ @adapter_spy }
247
+ @stdout, @stderr = IOSpy.new, IOSpy.new
261
248
 
262
- @ardb_init_called = false
263
- Assert.stub(Ardb, :init){ @ardb_init_called = true }
249
+ @ardb_init_called_with = nil
250
+ Assert.stub(Ardb, :init){ |*args| @ardb_init_called_with = args }
264
251
 
265
- @command_class = ConnectCommand
266
- @cmd = @command_class.new([], @stdout, @stderr)
252
+ @adapter_spy = Ardb::AdapterSpy.new
253
+ Assert.stub(Ardb, :adapter){ @adapter_spy }
267
254
  end
268
255
  subject{ @cmd }
269
256
 
270
- should have_readers :clirb
257
+ end
258
+
259
+ class ValidCommandTests < CommandSetupTests
260
+ desc "ValidCommand"
261
+ setup do
262
+ @command_class = Class.new{ include ValidCommand }
263
+ @cmd = @command_class.new
264
+ end
265
+
266
+ should have_imeths :clirb, :run, :summary
271
267
 
272
268
  should "know its CLI.RB" do
273
- assert_instance_of Ardb::CLIRB, subject.clirb
269
+ assert_instance_of CLIRB, subject.clirb
270
+ end
271
+
272
+ should "parse its args when run" do
273
+ argv = Factory.integer(3).times.map{ Factory.string }
274
+ subject.run(argv, @stdout, @stderr)
275
+ assert_equal argv, subject.clirb.args
276
+ end
277
+
278
+ should "take custom CLIRB build procs" do
279
+ cmd = @command_class.new do
280
+ option 'test', 'testing', :abbrev => 't'
281
+ end
282
+ cmd.run(['-t'], @stdout, @stderr)
283
+ assert_true cmd.clirb.opts['test']
284
+ end
285
+
286
+ should "default its summary" do
287
+ assert_equal '', subject.summary
288
+ end
289
+
290
+ end
291
+
292
+ class ConnectCommandTests < CommandSetupTests
293
+ desc "ConnectCommand"
294
+ setup do
295
+ @command_class = ConnectCommand
296
+ @cmd = @command_class.new
297
+ end
298
+
299
+ should "be a valid command" do
300
+ assert_kind_of ValidCommand, subject
301
+ end
302
+
303
+ should "know its summary" do
304
+ exp = "Connect to the configured DB"
305
+ assert_equal exp, subject.summary
274
306
  end
275
307
 
276
308
  should "know its help" do
277
309
  exp = "Usage: ardb connect [options]\n\n" \
278
- "Options: #{subject.clirb}"
310
+ "Options: #{subject.clirb}\n" \
311
+ "Description:\n" \
312
+ " #{subject.summary}"
279
313
  assert_equal exp, subject.help
280
314
  end
281
315
 
282
- should "parse its args, init ardb and connect to the db on run" do
283
- subject.run
284
-
285
- assert_equal [], subject.clirb.args
316
+ should "init ardb and connect to the db when run" do
317
+ subject.run([], @stdout, @stderr)
286
318
 
287
- assert_true @ardb_init_called
319
+ assert_equal [false], @ardb_init_called_with
288
320
  assert_true @adapter_spy.connect_db_called?
289
321
 
290
- exp = "connected to #{Ardb.config.db.adapter} db `#{Ardb.config.db.database}`\n"
322
+ exp = "connected to #{Ardb.config.adapter} db `#{Ardb.config.database}`\n"
291
323
  assert_equal exp, @stdout.read
292
324
  end
293
325
 
294
- should "output any errors and raise an exit error on run" do
326
+ should "output any errors and raise an exit error when run" do
295
327
  err = StandardError.new(Factory.string)
296
328
  err.set_backtrace(Factory.integer(3).times.map{ Factory.path })
297
- Assert.stub(Ardb, :init){ raise err }
329
+ Assert.stub(@adapter_spy, :connect_db){ raise err }
298
330
 
299
- assert_raises(CommandExitError){ subject.run }
331
+ assert_raises(CommandExitError){ subject.run([], @stdout, @stderr) }
300
332
  err_output = @stderr.read
301
333
 
302
334
  assert_includes err.to_s, err_output
303
335
  assert_includes err.backtrace.join("\n"), err_output
304
336
 
305
- exp = "error connecting to #{Ardb.config.db.database.inspect} database " \
306
- "with #{Ardb.config.db_settings.inspect}"
337
+ exp = "error connecting to #{Ardb.config.database.inspect} database " \
338
+ "with #{Ardb.config.activerecord_connect_hash.inspect}"
307
339
  assert_includes exp, err_output
308
340
  end
309
341
 
310
342
  end
311
343
 
312
- class CreateCommandTests < UnitTests
344
+ class CreateCommandTests < CommandSetupTests
313
345
  desc "CreateCommand"
314
346
  setup do
315
- @adapter_spy = Class.new{ include Ardb::AdapterSpy }.new
316
- Assert.stub(Ardb::Adapter, Ardb.config.db.adapter.to_sym){ @adapter_spy }
317
-
318
347
  @command_class = CreateCommand
319
- @cmd = @command_class.new([], @stdout, @stderr)
348
+ @cmd = @command_class.new
320
349
  end
321
- subject{ @cmd }
322
350
 
323
- should have_readers :clirb
351
+ should "be a valid command" do
352
+ assert_kind_of ValidCommand, subject
353
+ end
324
354
 
325
- should "know its CLI.RB" do
326
- assert_instance_of Ardb::CLIRB, subject.clirb
355
+ should "know its summary" do
356
+ exp = "Create the configured DB"
357
+ assert_equal exp, subject.summary
327
358
  end
328
359
 
329
360
  should "know its help" do
330
361
  exp = "Usage: ardb create [options]\n\n" \
331
- "Options: #{subject.clirb}"
362
+ "Options: #{subject.clirb}\n" \
363
+ "Description:\n" \
364
+ " #{subject.summary}"
332
365
  assert_equal exp, subject.help
333
366
  end
334
367
 
335
- should "parse its args and create the db on run" do
336
- subject.run
368
+ should "init ardb and create the db when run" do
369
+ subject.run([], @stdout, @stderr)
337
370
 
338
- assert_equal [], subject.clirb.args
371
+ assert_equal [false], @ardb_init_called_with
339
372
  assert_true @adapter_spy.create_db_called?
340
373
 
341
- exp = "created #{Ardb.config.db.adapter} db `#{Ardb.config.db.database}`\n"
374
+ exp = "created #{Ardb.config.adapter} db `#{Ardb.config.database}`\n"
342
375
  assert_equal exp, @stdout.read
343
376
  end
344
377
 
345
- should "output any errors and raise an exit error on run" do
378
+ should "output any errors and raise an exit error when run" do
346
379
  err = StandardError.new(Factory.string)
347
380
  Assert.stub(@adapter_spy, :create_db){ raise err }
348
381
 
349
- assert_raises(CommandExitError){ subject.run }
382
+ assert_raises(CommandExitError){ subject.run([], @stdout, @stderr) }
350
383
  err_output = @stderr.read
351
384
 
352
385
  assert_includes err.to_s, err_output
353
- exp = "error creating #{Ardb.config.db.database.inspect} database"
386
+ exp = "error creating #{Ardb.config.database.inspect} database"
354
387
  assert_includes exp, err_output
355
388
  end
356
389
 
357
390
  end
358
391
 
359
- class DropCommandTests < UnitTests
392
+ class DropCommandTests < CommandSetupTests
360
393
  desc "DropCommand"
361
394
  setup do
362
- @adapter_spy = Class.new{ include Ardb::AdapterSpy }.new
363
- Assert.stub(Ardb::Adapter, Ardb.config.db.adapter.to_sym){ @adapter_spy }
364
-
365
395
  @command_class = DropCommand
366
- @cmd = @command_class.new([], @stdout, @stderr)
396
+ @cmd = @command_class.new
367
397
  end
368
- subject{ @cmd }
369
398
 
370
- should have_readers :clirb
399
+ should "be a valid command" do
400
+ assert_kind_of ValidCommand, subject
401
+ end
371
402
 
372
- should "know its CLI.RB" do
373
- assert_instance_of Ardb::CLIRB, subject.clirb
403
+ should "know its summary" do
404
+ exp = "Drop the configured DB"
405
+ assert_equal exp, subject.summary
374
406
  end
375
407
 
376
408
  should "know its help" do
377
409
  exp = "Usage: ardb drop [options]\n\n" \
378
- "Options: #{subject.clirb}"
410
+ "Options: #{subject.clirb}\n" \
411
+ "Description:\n" \
412
+ " #{subject.summary}"
379
413
  assert_equal exp, subject.help
380
414
  end
381
415
 
382
- should "parse its args and drop the db on run" do
383
- subject.run
416
+ should "init ardb and drop the db when run" do
417
+ subject.run([], @stdout, @stderr)
384
418
 
385
- assert_equal [], subject.clirb.args
419
+ assert_equal [true], @ardb_init_called_with
386
420
  assert_true @adapter_spy.drop_db_called?
387
421
 
388
- exp = "dropped #{Ardb.config.db.adapter} db `#{Ardb.config.db.database}`\n"
422
+ exp = "dropped #{Ardb.config.adapter} db `#{Ardb.config.database}`\n"
389
423
  assert_equal exp, @stdout.read
390
424
  end
391
425
 
392
- should "output any errors and raise an exit error on run" do
426
+ should "output any errors and raise an exit error when run" do
393
427
  err = StandardError.new(Factory.string)
394
428
  Assert.stub(@adapter_spy, :drop_db){ raise err }
395
429
 
396
- assert_raises(CommandExitError){ subject.run }
430
+ assert_raises(CommandExitError){ subject.run([], @stdout, @stderr) }
397
431
  err_output = @stderr.read
398
432
 
399
433
  assert_includes err.to_s, err_output
400
- exp = "error dropping #{Ardb.config.db.database.inspect} database"
434
+ exp = "error dropping #{Ardb.config.database.inspect} database"
401
435
  assert_includes exp, err_output
402
436
  end
403
437
 
404
438
  end
405
439
 
406
- class MigrateCommandTests < UnitTests
440
+ class MigrateCommandTests < CommandSetupTests
407
441
  desc "MigrateCommand"
408
442
  setup do
409
- @adapter_spy = Class.new{ include Ardb::AdapterSpy }.new
410
- Assert.stub(Ardb::Adapter, Ardb.config.db.adapter.to_sym){ @adapter_spy }
411
-
412
- @ardb_init_called = false
413
- Assert.stub(Ardb, :init){ @ardb_init_called = true }
414
-
443
+ @orig_env_var_migrate_no_schema = ENV['ARDB_MIGRATE_NO_SCHEMA']
415
444
  @command_class = MigrateCommand
416
- @cmd = @command_class.new([], @stdout, @stderr)
445
+ @cmd = @command_class.new
446
+ end
447
+ teardown do
448
+ ENV['ARDB_MIGRATE_NO_SCHEMA'] = @orig_env_var_migrate_no_schema
417
449
  end
418
- subject{ @cmd }
419
450
 
420
- should have_readers :clirb
451
+ should "be a valid command" do
452
+ assert_kind_of ValidCommand, subject
453
+ end
421
454
 
422
- should "know its CLI.RB" do
423
- assert_instance_of Ardb::CLIRB, subject.clirb
455
+ should "know its summary" do
456
+ exp = "Migrate the configured DB"
457
+ assert_equal exp, subject.summary
424
458
  end
425
459
 
426
460
  should "know its help" do
427
461
  exp = "Usage: ardb migrate [options]\n\n" \
428
- "Options: #{subject.clirb}"
462
+ "Options: #{subject.clirb}\n" \
463
+ "Description:\n" \
464
+ " #{subject.summary}"
429
465
  assert_equal exp, subject.help
430
466
  end
431
467
 
432
- should "parse its args, init ardb and migrate the db, dump schema on run" do
433
- subject.run
434
-
435
- assert_equal [], subject.clirb.args
468
+ should "init ardb, migrate the db and dump the schema when run" do
469
+ subject.run([], @stdout, @stderr)
436
470
 
437
- assert_true @ardb_init_called
471
+ assert_equal [true], @ardb_init_called_with
438
472
  assert_true @adapter_spy.migrate_db_called?
439
473
  assert_true @adapter_spy.dump_schema_called?
440
474
  end
441
475
 
442
- should "init ardb and only migrate on run with no schema dump env var set" do
443
- current_no_schema = ENV['ARDB_MIGRATE_NO_SCHEMA']
476
+ should "only init ardb and migrate when run with no schema dump env var set" do
444
477
  ENV['ARDB_MIGRATE_NO_SCHEMA'] = 'yes'
445
- subject.run
446
- ENV['ARDB_MIGRATE_NO_SCHEMA'] = current_no_schema
478
+ subject.run([], @stdout, @stderr)
447
479
 
448
- assert_true @ardb_init_called
480
+ assert_equal [true], @ardb_init_called_with
449
481
  assert_true @adapter_spy.migrate_db_called?
450
482
  assert_false @adapter_spy.dump_schema_called?
451
483
  end
452
484
 
453
- should "output any errors and raise an exit error on run" do
485
+ should "output any errors and raise an exit error when run" do
454
486
  err = StandardError.new(Factory.string)
455
487
  err.set_backtrace(Factory.integer(3).times.map{ Factory.path })
456
- Assert.stub(Ardb, :init){ raise err }
488
+ Assert.stub(@adapter_spy, :migrate_db){ raise err }
457
489
 
458
- assert_raises(CommandExitError){ subject.run }
490
+ assert_raises(CommandExitError){ subject.run([], @stdout, @stderr) }
459
491
  err_output = @stderr.read
460
492
 
461
493
  assert_includes err.to_s, err_output
462
494
  assert_includes err.backtrace.join("\n"), err_output
463
495
 
464
- exp = "error migrating #{Ardb.config.db.database.inspect} database"
496
+ exp = "error migrating #{Ardb.config.database.inspect} database"
465
497
  assert_includes exp, err_output
466
498
  end
467
499
 
468
500
  end
469
501
 
470
- class GenerateMigrationCommandTests < UnitTests
502
+ class GenerateMigrationCommandTests < CommandSetupTests
471
503
  desc "GenerateMigrationCommand"
472
504
  setup do
505
+ @identifier = Factory.migration_id
506
+
473
507
  @migration_spy = nil
474
508
  @migration_class = Ardb::Migration
475
509
  Assert.stub(@migration_class, :new) do |*args|
@@ -477,28 +511,32 @@ class Ardb::CLI
477
511
  end
478
512
 
479
513
  @command_class = GenerateMigrationCommand
480
- @identifier = Factory.migration_id
481
- @cmd = @command_class.new([@identifier], @stdout, @stderr)
514
+ @cmd = @command_class.new
482
515
  end
483
- subject{ @cmd }
484
516
 
485
- should have_readers :clirb
517
+ should "be a valid command" do
518
+ assert_kind_of ValidCommand, subject
519
+ end
486
520
 
487
- should "know its CLI.RB" do
488
- assert_instance_of Ardb::CLIRB, subject.clirb
521
+ should "know its summary" do
522
+ exp = "Generate a migration file given a MIGRATION-NAME"
523
+ assert_equal exp, subject.summary
489
524
  end
490
525
 
491
526
  should "know its help" do
492
527
  exp = "Usage: ardb generate-migration [options] MIGRATION-NAME\n\n" \
493
- "Options: #{subject.clirb}"
528
+ "Options: #{subject.clirb}\n" \
529
+ "Description:\n" \
530
+ " #{subject.summary}"
494
531
  assert_equal exp, subject.help
495
532
  end
496
533
 
497
- should "parse its args and save a migration for the identifier on run" do
498
- subject.run
534
+ should "init ardb and save a migration for the identifier when run" do
535
+ subject.run([@identifier], @stdout, @stderr)
499
536
 
500
- assert_equal [@identifier], subject.clirb.args
501
- assert_equal @identifier, @migration_spy.identifier
537
+ assert_equal [false], @ardb_init_called_with
538
+ assert_equal Ardb.config, @migration_spy.ardb_config
539
+ assert_equal @identifier, @migration_spy.identifier
502
540
  assert_true @migration_spy.save_called
503
541
 
504
542
  exp = "generated #{@migration_spy.file_path}\n"
@@ -506,11 +544,11 @@ class Ardb::CLI
506
544
  end
507
545
 
508
546
  should "re-raise a specific argument error on migration 'no identifer' errors" do
509
- Assert.stub(@migration_class, :new) { raise Ardb::Migration::NoIdentifierError }
547
+ Assert.stub(@migration_class, :new){ raise Ardb::Migration::NoIdentifierError }
510
548
  err = nil
511
549
  begin
512
- cmd = @command_class.new([])
513
- cmd.run
550
+ cmd = @command_class.new
551
+ cmd.run([])
514
552
  rescue ArgumentError => err
515
553
  end
516
554
 
@@ -520,12 +558,12 @@ class Ardb::CLI
520
558
  assert_not_empty err.backtrace
521
559
  end
522
560
 
523
- should "output any errors and raise an exit error on run" do
561
+ should "output any errors and raise an exit error when run" do
524
562
  err = StandardError.new(Factory.string)
525
563
  err.set_backtrace(Factory.integer(3).times.map{ Factory.path })
526
564
  Assert.stub(@migration_class, :new){ raise err }
527
565
 
528
- assert_raises(CommandExitError){ subject.run }
566
+ assert_raises(CommandExitError){ subject.run([@identifier], @stdout, @stderr) }
529
567
  err_output = @stderr.read
530
568
 
531
569
  assert_includes err.to_s, err_output
@@ -550,18 +588,26 @@ class Ardb::CLI
550
588
  end
551
589
 
552
590
  class CommandSpy
553
- attr_reader :run_called
591
+ attr_reader :argv, :stdout, :stderr, :run_called
554
592
 
555
593
  def initialize
594
+ @argv = nil
595
+ @stdout, @stderr = nil, nil
556
596
  @run_called = false
557
597
  end
558
598
 
559
- def run
599
+ def run(argv, stdout = nil, stderr = nil)
600
+ @argv = argv
601
+ @stdout, @stderr = stdout, stderr
560
602
  @run_called = true
561
603
  end
562
604
 
605
+ def summary
606
+ @summary ||= Factory.string
607
+ end
608
+
563
609
  def help
564
- Factory.text
610
+ @help ||= Factory.text
565
611
  end
566
612
  end
567
613
 
@@ -593,10 +639,11 @@ class Ardb::CLI
593
639
  end
594
640
 
595
641
  class MigrationSpy
596
- attr_reader :identifier, :file_path, :save_called
642
+ attr_reader :ardb_config, :identifier, :file_path, :save_called
597
643
 
598
- def initialize(*args)
599
- @identifier = args.first
644
+ def initialize(ardb_config, identifier)
645
+ @ardb_config = ardb_config
646
+ @identifier = identifier
600
647
  @file_path = Factory.path
601
648
  @save_called = false
602
649
  end