fourthbase 2.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.travis.yml +24 -0
  4. data/.yardopts +1 -0
  5. data/Appraisals +19 -0
  6. data/CHANGELOG.md +37 -0
  7. data/Gemfile +2 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +191 -0
  10. data/Rakefile +24 -0
  11. data/VERSION +1 -0
  12. data/fourthbase.gemspec +25 -0
  13. data/gemfiles/rails40.gemfile +8 -0
  14. data/gemfiles/rails41.gemfile +8 -0
  15. data/gemfiles/rails42.gemfile +8 -0
  16. data/gemfiles/rails50.gemfile +8 -0
  17. data/lib/fourth_base.rb +20 -0
  18. data/lib/fourth_base/base.rb +8 -0
  19. data/lib/fourth_base/databases.rake +121 -0
  20. data/lib/fourth_base/databases_rails_five.rake +22 -0
  21. data/lib/fourth_base/databases_rails_four.rake +22 -0
  22. data/lib/fourth_base/forced.rb +21 -0
  23. data/lib/fourth_base/on_base.rb +36 -0
  24. data/lib/fourth_base/railtie.rb +52 -0
  25. data/lib/fourth_base/test_help.rb +11 -0
  26. data/lib/fourth_base/version.rb +3 -0
  27. data/lib/fourthbase.rb +1 -0
  28. data/lib/rails/fourth_base/generators/migration_generator.rb +25 -0
  29. data/test/cases/dbtask_test.rb +248 -0
  30. data/test/cases/forced_test.rb +49 -0
  31. data/test/cases/generator_test.rb +64 -0
  32. data/test/cases/on_base_test.rb +35 -0
  33. data/test/cases/railtie_test.rb +31 -0
  34. data/test/cases/rake_test.rb +0 -0
  35. data/test/dummy_apps/rails_five/Rakefile +2 -0
  36. data/test/dummy_apps/rails_five/app/controllers/application_controller.rb +7 -0
  37. data/test/dummy_apps/rails_five/app/helpers/application_helper.rb +3 -0
  38. data/test/dummy_apps/rails_five/app/models/application_record.rb +3 -0
  39. data/test/dummy_apps/rails_five/app/models/comment.rb +6 -0
  40. data/test/dummy_apps/rails_five/app/models/comment_forced.rb +6 -0
  41. data/test/dummy_apps/rails_five/app/models/post.rb +7 -0
  42. data/test/dummy_apps/rails_five/app/models/user.rb +6 -0
  43. data/test/dummy_apps/rails_five/bin/rails +5 -0
  44. data/test/dummy_apps/rails_five/config/database.yml +13 -0
  45. data/test/dummy_apps/rails_five/config/routes.rb +3 -0
  46. data/test/dummy_apps/rails_five/db/migrate/20141209165002_create_users.rb +11 -0
  47. data/test/dummy_apps/rails_five/db/migrate/20141214142700_create_posts.rb +12 -0
  48. data/test/dummy_apps/rails_five/db/secondbase/migrate/20151202075826_create_comments.rb +11 -0
  49. data/test/dummy_apps/rails_five/init.rb +42 -0
  50. data/test/dummy_apps/rails_five/log/.keep +0 -0
  51. data/test/dummy_apps/rails_five/tmp/.keep +0 -0
  52. data/test/dummy_apps/rails_four/Rakefile +2 -0
  53. data/test/dummy_apps/rails_four/app/controllers/application_controller.rb +7 -0
  54. data/test/dummy_apps/rails_four/app/helpers/application_helper.rb +3 -0
  55. data/test/dummy_apps/rails_four/app/models/comment.rb +6 -0
  56. data/test/dummy_apps/rails_four/app/models/comment_forced.rb +6 -0
  57. data/test/dummy_apps/rails_four/app/models/post.rb +7 -0
  58. data/test/dummy_apps/rails_four/app/models/user.rb +6 -0
  59. data/test/dummy_apps/rails_four/bin/rails +5 -0
  60. data/test/dummy_apps/rails_four/config/database.yml +14 -0
  61. data/test/dummy_apps/rails_four/config/routes.rb +3 -0
  62. data/test/dummy_apps/rails_four/db/migrate/20141209165002_create_users.rb +11 -0
  63. data/test/dummy_apps/rails_four/db/migrate/20141214142700_create_posts.rb +12 -0
  64. data/test/dummy_apps/rails_four/db/secondbase/migrate/20151202075826_create_comments.rb +11 -0
  65. data/test/dummy_apps/rails_four/init.rb +42 -0
  66. data/test/dummy_apps/rails_four/log/.keep +0 -0
  67. data/test/dummy_apps/rails_four/tmp/.keep +0 -0
  68. data/test/test_helper.rb +46 -0
  69. data/test/test_helpers/dummy_app_helpers.rb +94 -0
  70. data/test/test_helpers/rails_version_helpers.rb +29 -0
  71. data/test/test_helpers/stream_helpers.rb +40 -0
  72. data/thirdbase-2.1.1.gem +0 -0
  73. data/thirdbase-2.1.2.gem +0 -0
  74. metadata +206 -0
@@ -0,0 +1,8 @@
1
+ module FourthBase
2
+ class Base < ActiveRecord::Base
3
+
4
+ self.abstract_class = true
5
+ establish_connection FourthBase.config
6
+
7
+ end
8
+ end
@@ -0,0 +1,121 @@
1
+ namespace :db do
2
+ namespace :fourth_base do
3
+
4
+ namespace :create do
5
+ task :all do
6
+ FourthBase.on_base { Rake::Task['db:create:all'].execute }
7
+ end
8
+ end
9
+
10
+ task :create do
11
+ FourthBase.on_base { Rake::Task['db:create'].execute }
12
+ end
13
+
14
+ namespace :drop do
15
+ task :all do
16
+ FourthBase.on_base { Rake::Task['db:drop:all'].execute }
17
+ end
18
+ end
19
+
20
+ namespace :purge do
21
+ task :all do
22
+ FourthBase.on_base { Rake::Task['db:purge:all'].execute }
23
+ end
24
+ end
25
+
26
+ task :purge do
27
+ FourthBase.on_base { Rake::Task['db:purge'].execute }
28
+ end
29
+
30
+ task :migrate do
31
+ FourthBase.on_base { Rake::Task['db:migrate'].execute }
32
+ end
33
+
34
+ namespace :migrate do
35
+
36
+ task :redo => ['db:load_config'] do
37
+ FourthBase.on_base { Rake::Task['db:migrate:redo'].execute }
38
+ end
39
+
40
+ task :up => ['db:load_config'] do
41
+ FourthBase.on_base { Rake::Task['db:migrate:up'].execute }
42
+ end
43
+
44
+ task :down => ['db:load_config'] do
45
+ FourthBase.on_base { Rake::Task['db:migrate:down'].execute }
46
+ end
47
+
48
+ task :status => ['db:load_config'] do
49
+ FourthBase.on_base { Rake::Task['db:migrate:status'].execute }
50
+ end
51
+
52
+ end
53
+
54
+ task :rollback => ['db:load_config'] do
55
+ FourthBase.on_base { Rake::Task['db:rollback'].execute }
56
+ end
57
+
58
+ task :forward => ['db:load_config'] do
59
+ FourthBase.on_base { Rake::Task['db:forward'].execute }
60
+ end
61
+
62
+ task :abort_if_pending_migrations do
63
+ FourthBase.on_base { Rake::Task['db:abort_if_pending_migrations'].execute }
64
+ end
65
+
66
+ task :version => ['db:load_config'] do
67
+ FourthBase.on_base { Rake::Task['db:version'].execute }
68
+ end
69
+
70
+ namespace :schema do
71
+
72
+ task :load do
73
+ FourthBase.on_base { Rake::Task['db:schema:load'].execute }
74
+ end
75
+
76
+ end
77
+
78
+ namespace :structure do
79
+
80
+ task :load do
81
+ FourthBase.on_base { Rake::Task['db:structure:load'].execute }
82
+ end
83
+
84
+ end
85
+
86
+ namespace :test do
87
+
88
+ task :purge do
89
+ FourthBase.on_base { Rake::Task['db:test:purge'].execute }
90
+ end
91
+
92
+ task :load_schema do
93
+ FourthBase.on_base { Rake::Task['db:test:load_schema'].execute }
94
+ end
95
+
96
+ task :load_structure do
97
+ FourthBase.on_base { Rake::Task['db:test:load_structure'].execute }
98
+ end
99
+
100
+ task :prepare do
101
+ FourthBase.on_base { Rake::Task['db:test:prepare'].execute }
102
+ end
103
+
104
+ end
105
+
106
+ end
107
+ end
108
+
109
+ %w{
110
+ create:all create drop:all purge:all purge
111
+ migrate migrate:status abort_if_pending_migrations
112
+ schema:load structure:load
113
+ test:purge test:load_schema test:load_structure test:prepare
114
+ }.each do |name|
115
+ task = Rake::Task["db:#{name}"] rescue nil
116
+ next unless task && FourthBase::Railtie.run_with_db_tasks?
117
+ task.enhance do
118
+ Rake::Task["db:load_config"].invoke
119
+ Rake::Task["db:fourth_base:#{name}"].invoke
120
+ end
121
+ end
@@ -0,0 +1,22 @@
1
+ namespace :db do
2
+ namespace :fourth_base do
3
+ task "drop:_unsafe" do
4
+ FourthBase.on_base { Rake::Task['db:drop:_unsafe'].execute }
5
+ end
6
+
7
+ namespace :migrate do
8
+ task :reset => ['db:fourth_base:drop:_unsafe', 'db:fourth_base:create', 'db:fourth_base:migrate']
9
+ end
10
+ end
11
+ end
12
+
13
+ %w{
14
+ drop:_unsafe
15
+ }.each do |name|
16
+ task = Rake::Task["db:#{name}"] rescue nil
17
+ next unless task && FourthBase::Railtie.run_with_db_tasks?
18
+ task.enhance do
19
+ Rake::Task["db:load_config"].invoke
20
+ Rake::Task["db:fourth_base:#{name}"].invoke
21
+ end
22
+ end
@@ -0,0 +1,22 @@
1
+ namespace :db do
2
+ namespace :fourth_base do
3
+ task :drop do
4
+ FourthBase.on_base { Rake::Task['db:drop'].execute }
5
+ end
6
+
7
+ namespace :migrate do
8
+ task :reset => ['db:fourth_base:drop', 'db:fourth_base:create', 'db:fourth_base:migrate']
9
+ end
10
+ end
11
+ end
12
+
13
+ %w{
14
+ drop
15
+ }.each do |name|
16
+ task = Rake::Task["db:#{name}"] rescue nil
17
+ next unless task && FourthBase::Railtie.run_with_db_tasks?
18
+ task.enhance do
19
+ Rake::Task["db:load_config"].invoke
20
+ Rake::Task["db:fourth_base:#{name}"].invoke
21
+ end
22
+ end
@@ -0,0 +1,21 @@
1
+ module FourthBase
2
+ module Forced
3
+
4
+ def connection_pool
5
+ FourthBase::Base.connection_pool
6
+ end
7
+
8
+ def retrieve_connection
9
+ FourthBase::Base.retrieve_connection
10
+ end
11
+
12
+ def connected?
13
+ FourthBase::Base.connected?
14
+ end
15
+
16
+ def remove_connection(klass = self)
17
+ FourthBase::Base.remove_connection
18
+ end
19
+
20
+ end
21
+ end
@@ -0,0 +1,36 @@
1
+ module FourthBase
2
+
3
+ mattr_accessor :is_on_base, instance_accessor: false
4
+ self.is_on_base = false
5
+
6
+ def self.on_base
7
+ already_on_base = is_on_base
8
+ if already_on_base
9
+ yield
10
+ return
11
+ end
12
+ original_config = ActiveRecord::Tasks::DatabaseTasks.current_config
13
+ original_configurations = ActiveRecord::Base.configurations
14
+ original_migrations_path = ActiveRecord::Tasks::DatabaseTasks.migrations_paths
15
+ original_db_dir = ActiveRecord::Tasks::DatabaseTasks.db_dir
16
+ ActiveRecord::Tasks::DatabaseTasks.current_config = config
17
+ ActiveRecord::Base.configurations = original_configurations[Railtie.config_key]
18
+ ActiveRecord::Base.establish_connection(config)
19
+ ActiveRecord::Tasks::DatabaseTasks.migrations_paths = [FourthBase::Railtie.fullpath('migrate')]
20
+ ActiveRecord::Tasks::DatabaseTasks.db_dir = FourthBase::Railtie.fullpath
21
+ ActiveRecord::Migrator.migrations_paths = ActiveRecord::Tasks::DatabaseTasks.migrations_paths
22
+ self.is_on_base = true
23
+ yield
24
+ ensure
25
+ unless already_on_base
26
+ ActiveRecord::Base.configurations = original_configurations
27
+ ActiveRecord::Tasks::DatabaseTasks.migrations_paths = original_migrations_path
28
+ ActiveRecord::Tasks::DatabaseTasks.db_dir = original_db_dir
29
+ ActiveRecord::Migrator.migrations_paths = ActiveRecord::Tasks::DatabaseTasks.migrations_paths
30
+ ActiveRecord::Tasks::DatabaseTasks.current_config = original_config
31
+ ActiveRecord::Base.establish_connection(original_config)
32
+ self.is_on_base = false
33
+ end
34
+ end
35
+
36
+ end
@@ -0,0 +1,52 @@
1
+ module FourthBase
2
+ class Railtie < Rails::Railtie
3
+
4
+ config.fourth_base = ActiveSupport::OrderedOptions.new
5
+ config.fourth_base.path = 'db/fourthbase'
6
+ config.fourth_base.config_key = 'fourthbase'
7
+ config.fourth_base.run_with_db_tasks = true
8
+
9
+ config.after_initialize do |app|
10
+ fourthbase_dir = app.root.join(config.fourth_base.path)
11
+ FileUtils.mkdir(fourthbase_dir) unless File.directory?(fourthbase_dir)
12
+ end
13
+
14
+ rake_tasks do
15
+ load 'fourth_base/databases.rake'
16
+
17
+ if Rails.version.to_i == 4
18
+ load 'fourth_base/databases_rails_four.rake'
19
+ else
20
+ load 'fourth_base/databases_rails_five.rake'
21
+ end
22
+
23
+ end
24
+
25
+ generators do
26
+ require 'rails/fourth_base/generators/migration_generator'
27
+ end
28
+
29
+ initializer 'fourth_base.add_watchable_files' do |app|
30
+ fourthbase_dir = app.root.join(config.fourth_base.path)
31
+ config.watchable_files.concat ["#{fourthbase_dir}/schema.rb", "#{fourthbase_dir}/structure.sql"]
32
+ end
33
+
34
+ def config_path
35
+ config.fourth_base.path
36
+ end
37
+
38
+ def config_key
39
+ config.fourth_base.config_key
40
+ end
41
+
42
+ def run_with_db_tasks?
43
+ config.fourth_base.run_with_db_tasks
44
+ end
45
+
46
+ def fullpath(extra=nil)
47
+ path = Rails.root.join(config.fourth_base.path)
48
+ (extra ? path.join(path, extra) : path).to_s
49
+ end
50
+
51
+ end
52
+ end
@@ -0,0 +1,11 @@
1
+ if defined?(ActiveRecord::Base)
2
+
3
+ # Support test schema sync for Rails 4.2.x and up.
4
+ if ActiveRecord::Migration.respond_to? :maintain_test_schema!
5
+ FourthBase.on_base do
6
+ ActiveRecord::Migration.maintain_test_schema!
7
+ end
8
+ end
9
+
10
+
11
+ end
@@ -0,0 +1,3 @@
1
+ module FourthBase
2
+ VERSION = File.read(File.expand_path("../../../VERSION", __FILE__)).chomp
3
+ end
data/lib/fourthbase.rb ADDED
@@ -0,0 +1 @@
1
+ require 'fourth_base'
@@ -0,0 +1,25 @@
1
+ require 'rails/generators'
2
+ require 'rails/generators/active_record'
3
+ require 'rails/generators/active_record/migration/migration_generator'
4
+
5
+ module FourthBase
6
+ class MigrationGenerator < ActiveRecord::Generators::MigrationGenerator
7
+
8
+ source_root ActiveRecord::Generators::MigrationGenerator.source_root
9
+
10
+ def self.desc
11
+ require 'rails/generators/rails/migration/migration_generator'
12
+ Rails::Generators::MigrationGenerator.desc
13
+ end
14
+
15
+ include(Module.new{
16
+
17
+ def migration_template(*args)
18
+ args[1].sub! 'db/migrate', "#{Railtie.config_path}/migrate" if args[1]
19
+ super(*args)
20
+ end
21
+
22
+ })
23
+
24
+ end
25
+ end
@@ -0,0 +1,248 @@
1
+ require 'test_helper'
2
+
3
+ class DbTaskTest < FourthBase::TestCase
4
+
5
+ def test_db_create
6
+ refute_dummy_databases
7
+ run_db :create
8
+ assert_dummy_databases
9
+ end
10
+
11
+ def test_db_create_all
12
+ refute_dummy_databases
13
+ run_db 'create:all'
14
+ assert_dummy_databases
15
+ end
16
+
17
+ def test_db_setup
18
+ run_db :create
19
+ run_db :migrate
20
+ assert_dummy_databases
21
+ run_db :drop
22
+ refute_dummy_databases
23
+ run_db :setup
24
+ assert_dummy_databases
25
+ end
26
+
27
+ def test_db_drop
28
+ run_db :create
29
+ run_db :drop
30
+ refute_dummy_databases
31
+ end
32
+
33
+ def test_db_drop_all
34
+ run_db :create
35
+ run_db 'drop:all'
36
+ refute_dummy_databases
37
+ end
38
+
39
+ def test_db_purge_all
40
+ skip 'Rails 4.2 & Up' unless rails_42_up?
41
+ run_db :create
42
+ run_db :migrate
43
+ assert_dummy_databases
44
+ run_db 'purge:all'
45
+ establish_connection
46
+ assert_no_tables
47
+ end
48
+
49
+ def test_db_purge
50
+ skip 'Rails 4.2 & Up' unless rails_42_up?
51
+ run_db :create
52
+ run_db :migrate
53
+ assert_dummy_databases
54
+ run_db :purge
55
+ establish_connection
56
+ assert_no_tables
57
+ end
58
+
59
+ def test_db_migrate
60
+ run_db :create
61
+ run_db :migrate
62
+ # First database and schema.
63
+ schema = File.read(dummy_schema)
64
+ assert_match %r{version: 20141214142700}, schema
65
+ assert_match %r{create_table "users"}, schema
66
+ assert_match %r{create_table "posts"}, schema
67
+ refute_match %r{create_table "comments"}, schema
68
+ assert_connection_tables ActiveRecord::Base, ['users', 'posts']
69
+ # Fourth database and schema.
70
+ fourthbase_schema = File.read(dummy_fourthbase_schema)
71
+ assert_match %r{version: 20151202075826}, fourthbase_schema
72
+ refute_match %r{create_table "users"}, fourthbase_schema
73
+ refute_match %r{create_table "posts"}, fourthbase_schema
74
+ assert_match %r{create_table "comments"}, fourthbase_schema
75
+ assert_connection_tables FourthBase::Base, ['comments']
76
+ end
77
+
78
+ def test_fourthbase_migrate_updown
79
+ run_db :create
80
+ run_db :migrate
81
+ assert_match(/no migration.*20151202075826/i, run_db('migrate:down VERSION=20151202075826', :stderr))
82
+ run_fourthbase 'migrate:down VERSION=20151202075826'
83
+ fourthbase_schema = File.read(dummy_fourthbase_schema)
84
+ refute_match %r{version: 20151202075826}, fourthbase_schema
85
+ refute_match %r{create_table "comments"}, fourthbase_schema
86
+ assert_match(/no migration.*20151202075826/i, run_db('migrate:up VERSION=20151202075826', :stderr))
87
+ run_fourthbase 'migrate:up VERSION=20151202075826'
88
+ fourthbase_schema = File.read(dummy_fourthbase_schema)
89
+ assert_match %r{version: 20151202075826}, fourthbase_schema
90
+ assert_match %r{create_table "comments"}, fourthbase_schema
91
+ end
92
+
93
+ def test_fourthbase_migrate_reset
94
+ run_db :create
95
+ run_db :migrate
96
+ fourthbase_schema = File.read(dummy_fourthbase_schema)
97
+ assert_match %r{version: 20151202075826}, fourthbase_schema
98
+ assert_match %r{create_table "comments"}, fourthbase_schema
99
+ FileUtils.rm_rf dummy_fourthbase_schema
100
+ run_fourthbase 'migrate:reset'
101
+ fourthbase_schema = File.read(dummy_fourthbase_schema)
102
+ assert_match %r{version: 20151202075826}, fourthbase_schema
103
+ assert_match %r{create_table "comments"}, fourthbase_schema
104
+ end
105
+
106
+ def test_fourthbase_migrate_redo
107
+ run_db :create
108
+ run_db :migrate
109
+ fourthbase_schema = File.read(dummy_fourthbase_schema)
110
+ assert_match %r{version: 20151202075826}, fourthbase_schema
111
+ assert_match %r{create_table "comments"}, fourthbase_schema
112
+ FileUtils.rm_rf dummy_fourthbase_schema
113
+ run_fourthbase 'migrate:redo'
114
+ fourthbase_schema = File.read(dummy_fourthbase_schema)
115
+ assert_match %r{version: 20151202075826}, fourthbase_schema
116
+ assert_match %r{create_table "comments"}, fourthbase_schema
117
+ # Can redo latest FourthBase migration using previous VERSION env.
118
+ version = dummy_migration[:version]
119
+ run_db :migrate
120
+ assert_match %r{version: #{version}}, File.read(dummy_fourthbase_schema)
121
+ establish_connection
122
+ Comment.create! body: 'test', user_id: 420
123
+ run_fourthbase 'migrate:redo VERSION=20151202075826'
124
+ fourthbase_schema = File.read(dummy_fourthbase_schema)
125
+ assert_match %r{version: #{version}}, fourthbase_schema
126
+ assert_match %r{create_table "comments"}, fourthbase_schema
127
+ establish_connection
128
+ assert_nil Comment.first
129
+ end
130
+
131
+ def test_fourthbase_migrate_status
132
+ run_db :create
133
+ stream = rails_42_up? ? :stderr : :stdout
134
+ assert_match %r{migrations table does not exist}, run_fourthbase('migrate:status', stream)
135
+ run_db :migrate
136
+ assert_match %r{up.*20151202075826}, run_fourthbase('migrate:status')
137
+ version = dummy_migration[:version]
138
+ status = run_fourthbase('migrate:status')
139
+ assert_match %r{up.*20151202075826}, status
140
+ assert_match %r{down.*#{version}}, status
141
+ end
142
+
143
+ def test_fourthbase_forward_and_rollback
144
+ run_db :create
145
+ run_db :migrate
146
+ fourthbase_schema = File.read(dummy_fourthbase_schema)
147
+ assert_match %r{version: 20151202075826}, fourthbase_schema
148
+ refute_match %r{create_table "foos"}, fourthbase_schema
149
+ version = dummy_migration[:version] # ActiveRecord does not support start index 0.
150
+ run_fourthbase :forward
151
+ fourthbase_schema = File.read(dummy_fourthbase_schema)
152
+ assert_match %r{version: #{version}}, fourthbase_schema
153
+ assert_match %r{create_table "foos"}, fourthbase_schema
154
+ run_fourthbase :rollback
155
+ fourthbase_schema = File.read(dummy_fourthbase_schema)
156
+ assert_match %r{version: 20151202075826}, fourthbase_schema
157
+ refute_match %r{create_table "foos"}, fourthbase_schema
158
+ end
159
+
160
+ def test_db_test_purge
161
+ run_db :create
162
+ assert_dummy_databases
163
+ run_db 'test:purge'
164
+ establish_connection
165
+ assert_no_tables
166
+ end
167
+
168
+ def test_db_test_load_schema
169
+ run_db :create
170
+ assert_dummy_databases
171
+ run_db 'test:purge'
172
+ run_db :migrate
173
+ Dir.chdir(dummy_root) { `rake db:test:load_schema` }
174
+ establish_connection
175
+ assert_connection_tables ActiveRecord::Base, ['users', 'posts']
176
+ assert_connection_tables FourthBase::Base, ['comments']
177
+ end
178
+
179
+ def test_abort_if_pending
180
+ run_db :create
181
+ run_db :migrate
182
+ assert_equal "", run_db(:abort_if_pending_migrations, :stderr)
183
+ version = dummy_migration[:version]
184
+ capture(:stderr) do
185
+ stdout = run_db :abort_if_pending_migrations
186
+ assert_match(/1 pending migration/, stdout)
187
+ assert_match(/#{version}/, stdout)
188
+ end
189
+ end
190
+
191
+ def test_db_test_load_structure
192
+ run_db :create
193
+ assert_dummy_databases
194
+ run_db 'test:purge'
195
+ Dir.chdir(dummy_root) { `env SCHEMA_FORMAT=sql rake db:migrate` }
196
+ Dir.chdir(dummy_root) { `rake db:test:load_structure` }
197
+ establish_connection
198
+ assert_connection_tables ActiveRecord::Base, ['users', 'posts']
199
+ assert_connection_tables FourthBase::Base, ['comments']
200
+ end
201
+
202
+ def test_fourthbase_version
203
+ run_db :create
204
+ assert_match(/version: 0/, run_fourthbase(:version))
205
+ run_db :migrate
206
+ assert_match(/version: 20141214142700/, run_db(:version))
207
+ assert_match(/version: 20151202075826/, run_fourthbase(:version))
208
+ end
209
+
210
+ def test_fourthbase_db_tasks_disabled
211
+ refute_dummy_databases
212
+ run_db :create, :stdout, false
213
+ assert_dummy_created_but_not_fourthbase
214
+ end
215
+
216
+ private
217
+
218
+ def assert_dummy_created_but_not_fourthbase
219
+ assert_equal 'base.sqlite3', dummy_database_sqlite
220
+ refute_match(/fourthbase_test/, `mysql -uroot -e "SHOW DATABASES"`)
221
+ end
222
+
223
+ def assert_no_tables
224
+ if ActiveRecord::Base.connection.respond_to? :data_sources
225
+ assert_equal [], ActiveRecord::Base.connection.data_sources
226
+ assert_equal [], FourthBase::Base.connection.data_sources
227
+ else
228
+ assert_equal [], ActiveRecord::Base.connection.tables
229
+ assert_equal [], FourthBase::Base.connection.tables
230
+ end
231
+ end
232
+
233
+ def assert_connection_tables(model, expected_tables)
234
+ establish_connection
235
+
236
+ if ActiveRecord::Base.connection.respond_to? :data_sources
237
+ tables = model.connection.data_sources
238
+ else
239
+ tables = model.connection.tables
240
+ end
241
+
242
+ expected_tables.each do |table|
243
+ message = "Expected #{model.name} tables #{tables.inspect} to include #{table.inspect}"
244
+ assert tables.include?(table), message
245
+ end
246
+ end
247
+
248
+ end