birdbath 1.3.4
Sign up to get free protection for your applications and to get access to all the features.
- data/.bundle/config +2 -0
- data/.gitignore +6 -0
- data/Gemfile +4 -0
- data/LICENSE +20 -0
- data/README.rdoc +125 -0
- data/Rakefile +19 -0
- data/birdbath.gemspec +24 -0
- data/generators/full_migration_test/USAGE +30 -0
- data/generators/full_migration_test/full_migration_test_generator.rb +10 -0
- data/generators/full_migration_test/templates/full_migration_test.rb +89 -0
- data/generators/migration_test/migration_test_generator.rb +33 -0
- data/generators/migration_test/templates/migration_test.rb +25 -0
- data/init.rb +7 -0
- data/install.rb +1 -0
- data/lib/birdbath/version.rb +3 -0
- data/lib/birdbath.rb +159 -0
- data/tasks/birdbath_tasks.rake +17 -0
- data/test/birdbath_test.rb +263 -0
- data/test/config/database.yml +3 -0
- data/test/db/migrate_bad/001_create_top_dogs.rb +8 -0
- data/test/db/migrate_good/001_create_top_dogs.rb +11 -0
- data/test/db/migrate_good/002_create_bottom_dogs.rb +12 -0
- data/test/db/migrate_good/003_create_cats.rb +11 -0
- data/test/db/schema.rb +6 -0
- data/test/foundry_only_helper.rb +15 -0
- data/test/full_migration_test_generator_test.rb +52 -0
- data/test/helper.rb +75 -0
- data/test/migration_test_generator_test.rb +91 -0
- data/uninstall.rb +1 -0
- metadata +78 -0
data/.bundle/config
ADDED
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2007 Micah Alles, Patrick Bacon, David Crosby
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,125 @@
|
|
1
|
+
= Birdbath
|
2
|
+
|
3
|
+
Birdbath provides methods which let you assert the current state of the schema and run your migrations against the _test_ database.
|
4
|
+
|
5
|
+
== Install
|
6
|
+
|
7
|
+
gem install birdbath
|
8
|
+
|
9
|
+
If you're using it outside of a Rails environment (for whatever reason) include the Birdbath module in your tests:
|
10
|
+
|
11
|
+
require 'test/unit'
|
12
|
+
require 'birdbath'
|
13
|
+
|
14
|
+
class MyTest < Test::Unit::TestCase
|
15
|
+
include Birdbath
|
16
|
+
|
17
|
+
def test_something
|
18
|
+
...
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
== Use
|
23
|
+
|
24
|
+
*assert_schema*: verifies the schema of the database exactly matches the one specified.
|
25
|
+
|
26
|
+
def test_the_schema
|
27
|
+
assert_schema do |s|
|
28
|
+
s.table :books do |t|
|
29
|
+
t.column :id, :integer
|
30
|
+
t.column :title, :string, :limit => 5
|
31
|
+
t.column :author, :string
|
32
|
+
end
|
33
|
+
|
34
|
+
s.table :reviews do |t|
|
35
|
+
t.column :id, :integer
|
36
|
+
t.column :book_id, :integer
|
37
|
+
t.column :body, :text
|
38
|
+
t.column :rating, :integer, :default => 0
|
39
|
+
t.index :book_id, :name => 'index_book_id_on_reviews'
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
This would verify there are only two tables defined in the test database: _books_ and _reviews_ (schema_info is ignored). It will also verify that the _book_ table has the three columns, _id_, _title_ and _author_, each with their respective types. Indexes are verified too.
|
45
|
+
|
46
|
+
|
47
|
+
*assert_table*: verify a table is found exactly as specified:
|
48
|
+
|
49
|
+
assert_table :books do |t|
|
50
|
+
t.column :id, :integer
|
51
|
+
t.column :title, :string, :limit => 5
|
52
|
+
t.column :author, :string
|
53
|
+
t.index :author, :name => 'index_author_on_books'
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
*drop_all_tables*: does just what it says to your _test_ database.
|
58
|
+
|
59
|
+
|
60
|
+
*migrate*: executes the migrations against the test database using the same mechanism as rake db:migrate.
|
61
|
+
|
62
|
+
def test_the_migrations
|
63
|
+
migrate
|
64
|
+
migrate :version => 0
|
65
|
+
migrate :version => 10
|
66
|
+
migrate
|
67
|
+
end
|
68
|
+
|
69
|
+
|
70
|
+
This would do the same thing as running the following rake commands, but within a test case:
|
71
|
+
|
72
|
+
rake db:migrate
|
73
|
+
rake db:migrate VERSION=0
|
74
|
+
rake db:migrate VERSION=10
|
75
|
+
rake db:migrate
|
76
|
+
|
77
|
+
|
78
|
+
By combining the two helpers you can write a test that shows you can run all your migrations and get the final schema:
|
79
|
+
|
80
|
+
def test_should_be_able_to_migrate_from_an_empty_schema
|
81
|
+
drop_all_tables
|
82
|
+
|
83
|
+
# we shouldn't have any tables
|
84
|
+
assert_schema do |s|
|
85
|
+
end
|
86
|
+
|
87
|
+
migrate
|
88
|
+
|
89
|
+
assert_schema do |s|
|
90
|
+
s.table :books do |t|
|
91
|
+
t.column :id, :integer
|
92
|
+
t.column :title, :string
|
93
|
+
t.column :author, :string
|
94
|
+
end
|
95
|
+
|
96
|
+
s.table :reviews do |t|
|
97
|
+
t.column :id, :integer
|
98
|
+
t.column :book_id, :integer
|
99
|
+
t.column :body, :text
|
100
|
+
t.column :rating, :integer
|
101
|
+
t.index :book_id, :name => 'index_book_id_on_reviews'
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
|
107
|
+
The *migrate* helper can also be useful for testing data tranformation migrations:
|
108
|
+
|
109
|
+
def test_should_get_rid_of_bad_data
|
110
|
+
drop_all_tables
|
111
|
+
migrate :version => 7
|
112
|
+
Book.reset_column_information
|
113
|
+
book = Book.create! :title => "bad title\nwith\todd spacing"
|
114
|
+
migrate :version => 8 # should cleanse spacing in book titles
|
115
|
+
book.reload
|
116
|
+
assert_equal "bad title with odd spacing", book.title
|
117
|
+
end
|
118
|
+
|
119
|
+
== Authors
|
120
|
+
|
121
|
+
* Micah Alles (alles@atomicobject.com)
|
122
|
+
* David Crosby (crosby@atomicobject.com)
|
123
|
+
* Patrick Bacon (bacon@atomicobject.com)
|
124
|
+
* © 2007-2011 {Atomic Object}[http://www.atomicobject.com]
|
125
|
+
* More Atomic Object {open source}[http://www.atomicobject.com/pages/Software+Commons] projects
|
data/Rakefile
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'bundler'
|
2
|
+
Bundler::GemHelper.install_tasks
|
3
|
+
|
4
|
+
# GEM_VERSION = '1.3.3'
|
5
|
+
#
|
6
|
+
# Hoe.new('birdbath', GEM_VERSION) do |p|
|
7
|
+
# p.author = "Micah Alles"
|
8
|
+
# p.email = "micah@atomicobject.com"
|
9
|
+
# p.url = "http://migrationtest.rubyforge.org"
|
10
|
+
# p.summary = "A Rails plugin for testing migrations"
|
11
|
+
# p.description = <<-EOS
|
12
|
+
# birdbath makes testing your migrations easier by
|
13
|
+
# adding helper methods to Test::Unit::TestCase for asserting the
|
14
|
+
# current state of the schema and executing migrations against the
|
15
|
+
# test database.
|
16
|
+
# EOS
|
17
|
+
#
|
18
|
+
# end
|
19
|
+
#
|
data/birdbath.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "birdbath/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "birdbath"
|
7
|
+
s.version = Birdbath::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Micah Alles"]
|
10
|
+
s.email = ["micah@atomicobject.com"]
|
11
|
+
s.homepage = "http://github.com/atomicobject/birdbath"
|
12
|
+
s.summary = %q{A Rails gem for testing migrations}
|
13
|
+
s.description = <<-EOS
|
14
|
+
birdbath makes testing your migrations easier by
|
15
|
+
adding helper methods to Test::Unit::TestCase for asserting the
|
16
|
+
current state of the schema and executing migrations against the
|
17
|
+
test database.
|
18
|
+
EOS
|
19
|
+
|
20
|
+
s.rubyforge_project = "birdbath"
|
21
|
+
|
22
|
+
s.files = `git ls-files`.split("\n")
|
23
|
+
s.require_paths = ["lib"]
|
24
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
Description:
|
2
|
+
The controller generator creates stubs for a new controller and its views.
|
3
|
+
|
4
|
+
The generator takes a controller name and a list of views as arguments.
|
5
|
+
The controller name may be given in CamelCase or under_score and should
|
6
|
+
not be suffixed with 'Controller'. To create a controller within a
|
7
|
+
module, specify the controller name as 'module/controller'.
|
8
|
+
|
9
|
+
The generator creates a controller class in app/controllers with view
|
10
|
+
templates in app/views/controller_name, a helper class in app/helpers,
|
11
|
+
and a functional test suite in test/functional.
|
12
|
+
|
13
|
+
Example:
|
14
|
+
./script/generate controller CreditCard open debit credit close
|
15
|
+
|
16
|
+
Credit card controller with URLs like /credit_card/debit.
|
17
|
+
Controller: app/controllers/credit_card_controller.rb
|
18
|
+
Views: app/views/credit_card/debit.rhtml [...]
|
19
|
+
Helper: app/helpers/credit_card_helper.rb
|
20
|
+
Test: test/functional/credit_card_controller_test.rb
|
21
|
+
|
22
|
+
Modules Example:
|
23
|
+
./script/generate controller 'admin/credit_card' suspend late_fee
|
24
|
+
|
25
|
+
Credit card admin controller with URLs /admin/credit_card/suspend.
|
26
|
+
Controller: app/controllers/admin/credit_card_controller.rb
|
27
|
+
Views: app/views/admin/credit_card/debit.rhtml [...]
|
28
|
+
Helper: app/helpers/admin/credit_card_helper.rb
|
29
|
+
Test: test/functional/admin/credit_card_controller_test.rb
|
30
|
+
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
|
2
|
+
|
3
|
+
#
|
4
|
+
# This excercises the full set of migrations for your Rails app.
|
5
|
+
# It proves:
|
6
|
+
# - After full migration, the database is in the expected state, including:
|
7
|
+
# - All table structure
|
8
|
+
# - Default data (if any)
|
9
|
+
# - Full downward (version 0) migration functions correctly.
|
10
|
+
#
|
11
|
+
# YOU NEED TO:
|
12
|
+
# - Update "see_full_schema"
|
13
|
+
# - Update "see_data"
|
14
|
+
#
|
15
|
+
class FullMigrationTest < ActionController::IntegrationTest
|
16
|
+
|
17
|
+
#
|
18
|
+
# Transactional fixtures can, on occasion, cause migration tests to hang.
|
19
|
+
# Applying this setting here will turn transactional fixtures off for THIS
|
20
|
+
# SUITE ONLY
|
21
|
+
#
|
22
|
+
# self.use_transactional_fixtures = false
|
23
|
+
|
24
|
+
def conn
|
25
|
+
ActiveRecord::Base.connection
|
26
|
+
end
|
27
|
+
|
28
|
+
def see_empty_schema
|
29
|
+
assert_schema do |s|
|
30
|
+
# is nothing
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
#
|
35
|
+
# Structure and Content assertions
|
36
|
+
#
|
37
|
+
|
38
|
+
# Fully assert db structure after full migration
|
39
|
+
def see_full_schema
|
40
|
+
# TODO: add assertions here to verify your schema was built
|
41
|
+
flunk "implement me"
|
42
|
+
|
43
|
+
#
|
44
|
+
# Something like this can be used to see the entire schema
|
45
|
+
# is as expeted.
|
46
|
+
#
|
47
|
+
# assert_schema do |s|
|
48
|
+
# s.table :cat_tails do |t|
|
49
|
+
# t.column :id, :integer
|
50
|
+
# t.column :name, :string
|
51
|
+
# end
|
52
|
+
#
|
53
|
+
# s.table :dogs do |t|
|
54
|
+
# t.column :id, :integer
|
55
|
+
# t.column :name, :string
|
56
|
+
# end
|
57
|
+
# end
|
58
|
+
|
59
|
+
#
|
60
|
+
# Alternatively individual tables can be checked.
|
61
|
+
#
|
62
|
+
# assert_table :cats_tails do |s|
|
63
|
+
# t.column :id, :integer
|
64
|
+
# t.column :name, :string
|
65
|
+
# end
|
66
|
+
end
|
67
|
+
|
68
|
+
# Make sure data you expect your migrations to load are in there:
|
69
|
+
def see_default_data
|
70
|
+
# TODO: add assertions here to verify any default data was loaded
|
71
|
+
end
|
72
|
+
|
73
|
+
#
|
74
|
+
# TESTS
|
75
|
+
#
|
76
|
+
|
77
|
+
def test_full_migration
|
78
|
+
drop_all_tables
|
79
|
+
|
80
|
+
see_empty_schema
|
81
|
+
|
82
|
+
migrate
|
83
|
+
|
84
|
+
see_full_schema
|
85
|
+
|
86
|
+
see_default_data
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
class MigrationTestGenerator < Rails::Generator::NamedBase
|
2
|
+
def manifest
|
3
|
+
schema_version = class_name.to_i
|
4
|
+
raise "Invalid schema version '#{class_name}'" unless schema_version > 0
|
5
|
+
|
6
|
+
schema_version_string = schema_version.to_s.rjust(3,'0')
|
7
|
+
|
8
|
+
migration = Dir["db/migrate/#{schema_version_string}*.rb"].first
|
9
|
+
raise "No migration found for schema version #{schema_version_string}" unless migration
|
10
|
+
|
11
|
+
migration_name = File.basename(migration,'.rb').sub(/^\d+_/,'')
|
12
|
+
test_class_name = migration_name.camelize + "Test"
|
13
|
+
test_file = "test/migration/#{schema_version_string}_#{migration_name}_test.rb"
|
14
|
+
|
15
|
+
record do |m|
|
16
|
+
m.directory 'test/migration'
|
17
|
+
m.template 'migration_test.rb', test_file, :assigns => {
|
18
|
+
:test_class_name => test_class_name,
|
19
|
+
:migration_name => migration_name,
|
20
|
+
:schema_version => schema_version,
|
21
|
+
:previous_schema_version => previous_schema_version(schema_version_string)
|
22
|
+
}
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def previous_schema_version(current_version_string)
|
27
|
+
versions = Dir["db/migrate/*.rb"].map do |migration_file|
|
28
|
+
migration_file.match(/db\/migrate\/(\d+)_.*\.rb/)[1]
|
29
|
+
end.sort
|
30
|
+
prev_index = versions.index(current_version_string) - 1
|
31
|
+
prev_index < 0 ? -1 : versions[prev_index].to_i
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
|
2
|
+
|
3
|
+
class <%= test_class_name %> < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def teardown
|
6
|
+
migrate
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_migration_should_<%= migration_name %>
|
10
|
+
drop_all_tables
|
11
|
+
|
12
|
+
migrate :version => <%= previous_schema_version %>
|
13
|
+
|
14
|
+
flunk "TODO: setup test data"
|
15
|
+
|
16
|
+
migrate :version => <%= schema_version %>
|
17
|
+
|
18
|
+
flunk "TODO: examine results"
|
19
|
+
|
20
|
+
migrate :version => <%= previous_schema_version %>
|
21
|
+
|
22
|
+
flunk "TODO: examine results"
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
data/init.rb
ADDED
data/install.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
# Install hook code here
|
data/lib/birdbath.rb
ADDED
@@ -0,0 +1,159 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2007 Micah Alles, Patrick Bacon, David Crosby
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
# a copy of this software and associated documentation files (the
|
6
|
+
# "Software"), to deal in the Software without restriction, including
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
# the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be
|
13
|
+
# included in all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
#++
|
23
|
+
|
24
|
+
require 'test/unit/assertions'
|
25
|
+
|
26
|
+
module Birdbath
|
27
|
+
def self.migration_dir
|
28
|
+
@migration_dir || File.expand_path(RAILS_ROOT + '/db/migrate')
|
29
|
+
end
|
30
|
+
|
31
|
+
#
|
32
|
+
# sets the directory in which the migrations reside to be run with migrate
|
33
|
+
#
|
34
|
+
def self.migration_dir=(new_dir)
|
35
|
+
@migration_dir = new_dir
|
36
|
+
end
|
37
|
+
|
38
|
+
#
|
39
|
+
# verifies the schema exactly matches the one specified (schema_info does not have to be specified)
|
40
|
+
#
|
41
|
+
# assert_schema do |s|
|
42
|
+
# s.table :dogs do |t|
|
43
|
+
# t.column :id, :integer, :default => 2
|
44
|
+
# t.column :name, :string
|
45
|
+
# end
|
46
|
+
# end
|
47
|
+
#
|
48
|
+
def assert_schema
|
49
|
+
schema = Schema.new
|
50
|
+
yield schema
|
51
|
+
schema.verify
|
52
|
+
end
|
53
|
+
|
54
|
+
#
|
55
|
+
# verifies a single table exactly matches the one specified
|
56
|
+
#
|
57
|
+
# assert_table :dogs do |t|
|
58
|
+
# t.column :id, :integer, :default => 2
|
59
|
+
# t.column :name, :string
|
60
|
+
# end
|
61
|
+
#
|
62
|
+
def assert_table(name)
|
63
|
+
table = Table.new(name)
|
64
|
+
yield table
|
65
|
+
table.verify
|
66
|
+
end
|
67
|
+
|
68
|
+
#
|
69
|
+
# drops all tables in the database
|
70
|
+
#
|
71
|
+
def drop_all_tables
|
72
|
+
ActiveRecord::Base.connection.tables.each do |table|
|
73
|
+
ActiveRecord::Base.connection.drop_table(table)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
#
|
78
|
+
# executes your migrations
|
79
|
+
#
|
80
|
+
# migrate # same as rake db:migrate
|
81
|
+
#
|
82
|
+
# Options are:
|
83
|
+
# * :version - version to migrate to (same as VERSION=.. option to rake db:migrate)
|
84
|
+
# * :verbose - print migration status messages to STDOUT, defaults to false
|
85
|
+
#
|
86
|
+
def migrate(opts={})
|
87
|
+
old_verbose = ActiveRecord::Migration.verbose
|
88
|
+
ActiveRecord::Migration.verbose = opts[:verbose].nil? ? false : opts[:verbose]
|
89
|
+
version = opts[:version] ? opts[:version].to_i : nil
|
90
|
+
ActiveRecord::Migrator.migrate(Birdbath.migration_dir, version)
|
91
|
+
ensure
|
92
|
+
ActiveRecord::Migration.verbose = old_verbose
|
93
|
+
end
|
94
|
+
|
95
|
+
module Connection #:nodoc:
|
96
|
+
def conn
|
97
|
+
ActiveRecord::Base.connection
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
class Schema
|
102
|
+
include Connection
|
103
|
+
include Test::Unit::Assertions
|
104
|
+
|
105
|
+
def initialize #:nodoc:
|
106
|
+
@tables = []
|
107
|
+
end
|
108
|
+
|
109
|
+
def table(name)
|
110
|
+
table = Table.new(name)
|
111
|
+
yield table
|
112
|
+
table.verify
|
113
|
+
@tables << table
|
114
|
+
end
|
115
|
+
|
116
|
+
def verify #:nodoc:
|
117
|
+
actual_tables = conn.tables.reject {|t| t == 'schema_info' || t == 'schema_migrations' }
|
118
|
+
expected_tables = @tables.map {|t| t.name }
|
119
|
+
assert_equal expected_tables.sort, actual_tables.sort, 'wrong tables in schema'
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
class Table
|
124
|
+
include Connection
|
125
|
+
include Test::Unit::Assertions
|
126
|
+
attr_reader :name
|
127
|
+
|
128
|
+
def initialize(name) #:nodoc:
|
129
|
+
@name = name.to_s
|
130
|
+
@columns = []
|
131
|
+
@indexes = []
|
132
|
+
assert conn.tables.include?(@name), "table <#{@name}> not found in schema"
|
133
|
+
end
|
134
|
+
|
135
|
+
def column(colname,type,options={})
|
136
|
+
colname = colname.to_s
|
137
|
+
@columns << colname
|
138
|
+
col = conn.columns(name).find {|c| c.name == colname }
|
139
|
+
assert_not_nil col, "column <#{colname}> not found in table <#{self.name}>"
|
140
|
+
assert_equal type, col.type, "wrong type for column <#{colname}> in table <#{name}>"
|
141
|
+
options.each do |k,v|
|
142
|
+
k = k.to_sym; actual = col.send(k); actual = actual.is_a?(String) ? actual.sub(/'$/,'').sub(/^'/,'') : actual
|
143
|
+
assert_equal v, actual, "column <#{colname}> in table <#{name}> has wrong :#{k}"
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
def index(column_name, options = {})
|
148
|
+
@indexes << "name <#{options[:name]}> columns <#{Array(column_name).join(",")}> unique <#{options[:unique] == true}>"
|
149
|
+
end
|
150
|
+
|
151
|
+
def verify #:nodoc:
|
152
|
+
actual_columns = conn.columns(name).map {|c| c.name }
|
153
|
+
assert_equal @columns.sort, actual_columns.sort, "wrong columns for table: <#{name}>"
|
154
|
+
|
155
|
+
actual_indexes = conn.indexes(@name).collect { |i| "name <#{i.name}> columns <#{i.columns.join(",")}> unique <#{i.unique}>" }
|
156
|
+
assert_equal @indexes.sort, actual_indexes.sort, "wrong indexes for table: <#{name}>"
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
|
2
|
+
namespace :test do
|
3
|
+
|
4
|
+
Rake::TestTask.new(:migrations => "db:test:prepare") do |t|
|
5
|
+
t.libs << "test"
|
6
|
+
t.pattern = 'test/migration/**/*_test.rb'
|
7
|
+
t.verbose = true
|
8
|
+
end
|
9
|
+
Rake::Task['test:migrations'].comment = "Run the migration tests in test/migration"
|
10
|
+
|
11
|
+
task :migration => 'test:migrations'
|
12
|
+
end
|
13
|
+
|
14
|
+
task :test do
|
15
|
+
Rake::Task['test:migrations'].invoke rescue got_error = true
|
16
|
+
raise "Test failures" if got_error
|
17
|
+
end
|
@@ -0,0 +1,263 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/helper')
|
2
|
+
|
3
|
+
class BirdbathTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
load_default_schema
|
7
|
+
Birdbath.migration_dir = plugin_path('test/db/migrate_good')
|
8
|
+
end
|
9
|
+
|
10
|
+
#
|
11
|
+
# HELPERS
|
12
|
+
#
|
13
|
+
def see_failure(pattern='')
|
14
|
+
err = assert_raise(Test::Unit::AssertionFailedError) do
|
15
|
+
yield
|
16
|
+
end
|
17
|
+
assert_match(/#{pattern}/mi, err.message)
|
18
|
+
end
|
19
|
+
|
20
|
+
def see_no_failure
|
21
|
+
assert_nothing_raised do
|
22
|
+
yield
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def declare_columns_on_table(t)
|
27
|
+
t.column :id, :integer
|
28
|
+
t.column :tail, :string, :default => 'top dog', :limit => 187
|
29
|
+
end
|
30
|
+
|
31
|
+
#
|
32
|
+
# TESTS
|
33
|
+
#
|
34
|
+
def test_assert_schema_should_not_fail_if_schema_is_matched
|
35
|
+
see_no_failure do
|
36
|
+
assert_schema do |s|
|
37
|
+
s.table :dogs do |t|
|
38
|
+
declare_columns_on_table(t)
|
39
|
+
t.index :tail, :name => 'index_tail_on_dogs'
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_assert_schema_should_fail_if_a_table_is_not_specified
|
47
|
+
see_failure 'wrong tables in schema.*dogs' do
|
48
|
+
assert_schema do |s|
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_assert_schema_should_fail_if_a_table_is_not_found
|
54
|
+
see_failure 'table <things> not found in schema' do
|
55
|
+
assert_schema do |s|
|
56
|
+
s.table :things do |t|
|
57
|
+
t.column :id, :integer
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_assert_schema_should_fail_if_a_column_is_not_specified
|
64
|
+
see_failure 'wrong columns for table.*dogs.*tail' do
|
65
|
+
assert_schema do |s|
|
66
|
+
s.table :dogs do |t|
|
67
|
+
t.column :id, :integer
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_assert_schema_should_fail_if_a_column_is_not_found
|
74
|
+
see_failure 'column <legs> not found in table <dogs>' do
|
75
|
+
assert_schema do |s|
|
76
|
+
s.table :dogs do |t|
|
77
|
+
t.column :id, :integer
|
78
|
+
t.column :tail, :string
|
79
|
+
t.column :legs, :integer
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_assert_schema_should_fail_if_wrong_options_not_specified
|
86
|
+
see_failure 'column <tail> in table <dogs> has wrong :default' do
|
87
|
+
assert_table :dogs do |t|
|
88
|
+
t.column :id, :integer
|
89
|
+
t.column :tail, :string, :default => "blah"
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_assert_table_should_not_fail_if_table_is_matched
|
95
|
+
see_no_failure do
|
96
|
+
assert_table :dogs do |t|
|
97
|
+
declare_columns_on_table(t)
|
98
|
+
t.index :tail, :name => 'index_tail_on_dogs'
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def test_assert_table_should_fail_if_a_table_is_not_found
|
104
|
+
see_failure 'table <things> not found in schema' do
|
105
|
+
assert_table :things do |t|
|
106
|
+
t.column :id, :integer
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def test_assert_table_should_fail_if_a_column_is_not_specified
|
112
|
+
see_failure 'wrong columns for table.*dogs.*tail' do
|
113
|
+
assert_table :dogs do |t|
|
114
|
+
t.column :id, :integer
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def test_assert_table_should_fail_if_a_column_is_not_found
|
120
|
+
see_failure 'column <legs> not found in table <dogs>' do
|
121
|
+
assert_table :dogs do |t|
|
122
|
+
t.column :id, :integer
|
123
|
+
t.column :tail, :string
|
124
|
+
t.column :legs, :integer
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
def test_assert_table_should_fail_if_wrong_options_not_specified
|
130
|
+
see_failure 'column <tail> in table <dogs> has wrong :default' do
|
131
|
+
assert_table :dogs do |t|
|
132
|
+
t.column :id, :integer
|
133
|
+
t.column :tail, :string, :default => "blah"
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
def test_assert_table_should_fail_if_an_index_is_not_specified
|
139
|
+
see_failure 'wrong indexes for table: <dogs>' do
|
140
|
+
assert_table :dogs do |t|
|
141
|
+
declare_columns_on_table(t)
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
def test_assert_schema_should_fail_if_a_column_in_an_index_is_not_found
|
147
|
+
see_failure 'wrong indexes for table: <dogs>' do
|
148
|
+
assert_table :dogs do |t|
|
149
|
+
declare_columns_on_table(t)
|
150
|
+
t.index :legs, :name => 'index_legs_on_dogs'
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
def test_assert_schema_should_fail_if_wrong_options_on_an_index
|
156
|
+
see_failure 'wrong indexes for table: <dogs>' do
|
157
|
+
assert_table :dogs do |t|
|
158
|
+
declare_columns_on_table(t)
|
159
|
+
t.index :tail, :name => 'index_tail_on_dogs', :unique => true
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
def test_should_drop_all_tables
|
165
|
+
if Rails::VERSION::MAJOR >= 2 && Rails::VERSION::MINOR >= 1
|
166
|
+
schema_table = 'schema_migrations'
|
167
|
+
else
|
168
|
+
schema_table = 'schema_info'
|
169
|
+
end
|
170
|
+
assert_equal ['dogs', schema_table].sort, ActiveRecord::Base.connection.tables.sort
|
171
|
+
drop_all_tables
|
172
|
+
assert_equal [], ActiveRecord::Base.connection.tables
|
173
|
+
drop_all_tables
|
174
|
+
assert_equal [], ActiveRecord::Base.connection.tables
|
175
|
+
end
|
176
|
+
|
177
|
+
def test_should_migrate_to_highest_version
|
178
|
+
drop_all_tables
|
179
|
+
assert_schema do |s|
|
180
|
+
end
|
181
|
+
|
182
|
+
migrate :version => 1
|
183
|
+
|
184
|
+
assert_schema do |s|
|
185
|
+
s.table :top_dogs do |t|
|
186
|
+
t.column :id, :integer
|
187
|
+
t.column :name, :string
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
migrate :version => 2
|
192
|
+
|
193
|
+
assert_schema do |s|
|
194
|
+
s.table :top_dogs do |t|
|
195
|
+
t.column :id, :integer
|
196
|
+
t.column :name, :string
|
197
|
+
end
|
198
|
+
s.table :bottom_dogs do |t|
|
199
|
+
t.column :id, :integer
|
200
|
+
t.column :name, :string
|
201
|
+
t.column :sick, :boolean
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
migrate :version => 3
|
206
|
+
|
207
|
+
assert_schema do |s|
|
208
|
+
s.table :top_dogs do |t|
|
209
|
+
t.column :id, :integer
|
210
|
+
t.column :name, :string
|
211
|
+
end
|
212
|
+
s.table :bottom_dogs do |t|
|
213
|
+
t.column :id, :integer
|
214
|
+
t.column :name, :string
|
215
|
+
t.column :sick, :boolean
|
216
|
+
end
|
217
|
+
s.table :cats do |t|
|
218
|
+
t.column :id, :integer
|
219
|
+
t.column :lives, :integer
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
migrate :version => 0
|
224
|
+
|
225
|
+
assert_schema do |s|
|
226
|
+
end
|
227
|
+
|
228
|
+
migrate
|
229
|
+
|
230
|
+
assert_schema do |s|
|
231
|
+
s.table :top_dogs do |t|
|
232
|
+
t.column :id, :integer
|
233
|
+
t.column :name, :string
|
234
|
+
end
|
235
|
+
s.table :bottom_dogs do |t|
|
236
|
+
t.column :id, :integer
|
237
|
+
t.column :name, :string
|
238
|
+
t.column :sick, :boolean
|
239
|
+
end
|
240
|
+
s.table :cats do |t|
|
241
|
+
t.column :id, :integer
|
242
|
+
t.column :lives, :integer
|
243
|
+
end
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
247
|
+
def test_should_have_default_migration_dir_set
|
248
|
+
Birdbath.migration_dir = nil
|
249
|
+
assert_equal File.expand_path(RAILS_ROOT + '/db/migrate'), Birdbath.migration_dir,
|
250
|
+
"wrong default migration dir"
|
251
|
+
|
252
|
+
end
|
253
|
+
|
254
|
+
def test_should_raise_error_if_migration_fails
|
255
|
+
Birdbath.migration_dir = plugin_path('test/db/migrate_bad')
|
256
|
+
drop_all_tables
|
257
|
+
err = assert_raise RuntimeError do
|
258
|
+
migrate
|
259
|
+
end
|
260
|
+
assert_match(//i, err.message)
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
data/test/db/schema.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
class Test::Unit::TestCase
|
2
|
+
|
3
|
+
def self.running_in_foundry
|
4
|
+
File.expand_path(File.dirname(__FILE__)) =~ /\/rails_plugin_foundry\//
|
5
|
+
end
|
6
|
+
|
7
|
+
def running_in_foundry
|
8
|
+
self.class.running_in_foundry
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.in_foundry_should(behave,&block)
|
12
|
+
should(behave,&block) if running_in_foundry
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/helper')
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/foundry_only_helper')
|
3
|
+
|
4
|
+
class FullMigrationTestGeneratorTest < Test::Unit::TestCase
|
5
|
+
|
6
|
+
def setup
|
7
|
+
return unless running_in_foundry
|
8
|
+
rm_migration_test_path
|
9
|
+
end
|
10
|
+
|
11
|
+
def teardown
|
12
|
+
return unless running_in_foundry
|
13
|
+
rm_migration_test_path
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
#
|
18
|
+
# HELPERS
|
19
|
+
#
|
20
|
+
|
21
|
+
def migration_test_file
|
22
|
+
migration_test_path + "/full_migration_test.rb"
|
23
|
+
end
|
24
|
+
|
25
|
+
def run_generator
|
26
|
+
run_in_rails_root 'script/generate full_migration_test'
|
27
|
+
end
|
28
|
+
|
29
|
+
#
|
30
|
+
# TESTS
|
31
|
+
#
|
32
|
+
|
33
|
+
in_foundry_should "generate full migration test" do
|
34
|
+
run_generator
|
35
|
+
assert File.exists?(migration_test_file), "No test file made: #{migration_test_file}"
|
36
|
+
generated_code = File.read(migration_test_file)
|
37
|
+
source_code = File.read(plugin_path('generators/full_migration_test/templates/full_migration_test.rb'))
|
38
|
+
assert_equal source_code, generated_code, "Wrong code generated in #{migration_test_file}"
|
39
|
+
end
|
40
|
+
|
41
|
+
in_foundry_should "create a test that fails in expected fashion" do
|
42
|
+
run_generator
|
43
|
+
cd RAILS_ROOT do
|
44
|
+
@output = `ruby test/migration/full_migration_test.rb`
|
45
|
+
end
|
46
|
+
|
47
|
+
check_output '1 tests, 1 assertions, 1 failures, 0 errors'
|
48
|
+
check_output 'implement me'
|
49
|
+
check_output 'test_full_migration(FullMigrationTest)'
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
data/test/helper.rb
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
ENV["RAILS_ENV"] = "test"
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../../../config/environment')
|
3
|
+
require 'logger'
|
4
|
+
require 'fileutils'
|
5
|
+
require 'test_help'
|
6
|
+
|
7
|
+
plugin_path = RAILS_ROOT + "/vendor/plugins/birdbath"
|
8
|
+
|
9
|
+
config_location = File.expand_path(plugin_path + "/test/config/database.yml")
|
10
|
+
|
11
|
+
config = YAML::load(ERB.new(IO.read(config_location)).result)
|
12
|
+
ActiveRecord::Base.logger = Logger.new(plugin_path + "/test/log/test.log")
|
13
|
+
ActiveRecord::Base.establish_connection(config['test'])
|
14
|
+
|
15
|
+
Test::Unit::TestCase.fixture_path = plugin_path + "/test/fixtures/"
|
16
|
+
|
17
|
+
$LOAD_PATH.unshift(Test::Unit::TestCase.fixture_path)
|
18
|
+
|
19
|
+
class Test::Unit::TestCase
|
20
|
+
include FileUtils
|
21
|
+
def plugin_path(path)
|
22
|
+
File.expand_path(File.dirname(__FILE__) + '/../' + path)
|
23
|
+
end
|
24
|
+
|
25
|
+
def load_default_schema
|
26
|
+
ActiveRecord::Migration.suppress_messages do
|
27
|
+
schema_file = plugin_path("/test/db/schema.rb")
|
28
|
+
load(schema_file) if File.exist?(schema_file)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def migration_test_path
|
33
|
+
File.expand_path(RAILS_ROOT + "/test/migration")
|
34
|
+
end
|
35
|
+
|
36
|
+
def run_in_rails_root(command)
|
37
|
+
cd RAILS_ROOT do
|
38
|
+
@output = `#{command}`
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def check_output(string_or_regexp)
|
43
|
+
assert_not_nil @output, "No output collected"
|
44
|
+
case string_or_regexp
|
45
|
+
when String
|
46
|
+
assert_match(/#{Regexp.escape(string_or_regexp)}/, @output)
|
47
|
+
when Regexp
|
48
|
+
assert_match(string_or_regexp, @output)
|
49
|
+
else
|
50
|
+
raise "Can't check output using oddball object #{string_or_regexp.inspect}"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def rm_migration_test_path
|
55
|
+
rm_rf migration_test_path
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.should(behave,&block)
|
59
|
+
return unless running_in_foundry
|
60
|
+
@context ||= nil
|
61
|
+
@context_setup ||= nil
|
62
|
+
context_string = @context.nil? ? '' : @context + ' '
|
63
|
+
mname = "test #{context_string}should #{behave}"
|
64
|
+
context_setup = @context_setup
|
65
|
+
if block_given?
|
66
|
+
define_method(mname) do
|
67
|
+
instance_eval(&context_setup) unless context_setup.nil?
|
68
|
+
instance_eval(&block)
|
69
|
+
end
|
70
|
+
else
|
71
|
+
puts ">>> UNIMPLEMENTED CASE: #{name.sub(/Test$/,'')} should #{behave}"
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/helper')
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/foundry_only_helper')
|
3
|
+
|
4
|
+
class MigrationTestGeneratorTest < Test::Unit::TestCase
|
5
|
+
|
6
|
+
def setup
|
7
|
+
return unless running_in_foundry
|
8
|
+
rm_migration_test_path
|
9
|
+
rm_migrations
|
10
|
+
end
|
11
|
+
|
12
|
+
def teardown
|
13
|
+
return unless running_in_foundry
|
14
|
+
rm_migration_test_path
|
15
|
+
rm_migrations
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
#
|
20
|
+
# HELPERS
|
21
|
+
#
|
22
|
+
|
23
|
+
def generate_migration(name)
|
24
|
+
run_in_rails_root "script/generate migration #{name}"
|
25
|
+
@output =~ /create db\/migrate\/(\d+)_.*\.rb/
|
26
|
+
migration = $1
|
27
|
+
migration_file = "db/migrate/#{migration}_#{name}.rb"
|
28
|
+
assert File.exists?(migration_file), "Migration not there: #{migration_file}"
|
29
|
+
migration
|
30
|
+
end
|
31
|
+
|
32
|
+
def generate_migration_test(version)
|
33
|
+
run_in_rails_root "script/generate migration_test #{version}"
|
34
|
+
end
|
35
|
+
|
36
|
+
def rm_migrations
|
37
|
+
rm Dir["db/migrate/*.rb"]
|
38
|
+
end
|
39
|
+
|
40
|
+
#
|
41
|
+
# TESTS
|
42
|
+
#
|
43
|
+
|
44
|
+
in_foundry_should "generate a migration test for schema 1" do
|
45
|
+
migration = generate_migration 'create_the_dogs_table'
|
46
|
+
|
47
|
+
generate_migration_test migration
|
48
|
+
|
49
|
+
migration_test_file = "test/migration/#{migration}_create_the_dogs_table_test.rb"
|
50
|
+
assert File.exists?(migration_test_file), "Migration test not there: #{migration_test_file}"
|
51
|
+
|
52
|
+
run_in_rails_root "ruby #{migration_test_file}"
|
53
|
+
check_output 'test_migration_should_create_the_dogs_table(CreateTheDogsTableTest)'
|
54
|
+
check_output '1) Failure:'
|
55
|
+
check_output 'TODO: setup test data.'
|
56
|
+
check_output '1 tests, 1 assertions, 1 failures, 0 errors'
|
57
|
+
end
|
58
|
+
|
59
|
+
in_foundry_should "generate a migration test for schema 2" do
|
60
|
+
generate_migration 'create_the_dogs_table'
|
61
|
+
migration = generate_migration 'transfer_cats_data'
|
62
|
+
generate_migration_test migration
|
63
|
+
migration_test_file = "test/migration/#{migration}_transfer_cats_data_test.rb"
|
64
|
+
assert File.exists?(migration_test_file), "Migration test not there: #{migration_test_file}"
|
65
|
+
|
66
|
+
run_in_rails_root "ruby #{migration_test_file}"
|
67
|
+
check_output 'test_migration_should_transfer_cats_data(TransferCatsDataTest)'
|
68
|
+
check_output '1) Failure:'
|
69
|
+
check_output 'TODO: setup test data.'
|
70
|
+
check_output '1 tests, 1 assertions, 1 failures, 0 errors'
|
71
|
+
end
|
72
|
+
|
73
|
+
in_foundry_should "fail if no schema version is provided" do
|
74
|
+
generate_migration 'create_the_dogs_table'
|
75
|
+
generate_migration_test ''
|
76
|
+
check_output 'Usage: script/generate migration_test MigrationTestName [options]'
|
77
|
+
end
|
78
|
+
|
79
|
+
in_foundry_should "fail if bad schema version is provided" do
|
80
|
+
generate_migration 'create_the_dogs_table'
|
81
|
+
generate_migration_test 'oops'
|
82
|
+
check_output(/Invalid schema version 'oops'/i)
|
83
|
+
end
|
84
|
+
|
85
|
+
in_foundry_should "fail if schema version does not correspond to existing migration" do
|
86
|
+
migration = generate_migration 'create_the_dogs_table'
|
87
|
+
generate_migration_test '2'
|
88
|
+
check_output "No migration found for schema version 002"
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
data/uninstall.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
# Uninstall hook code here
|
metadata
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: birdbath
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.3.4
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Micah Alles
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-08-09 00:00:00.000000000 -04:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
description: ! "birdbath makes testing your migrations easier by \nadding helper methods
|
16
|
+
to Test::Unit::TestCase for asserting the \ncurrent state of the schema and executing
|
17
|
+
migrations against the \ntest database.\n"
|
18
|
+
email:
|
19
|
+
- micah@atomicobject.com
|
20
|
+
executables: []
|
21
|
+
extensions: []
|
22
|
+
extra_rdoc_files: []
|
23
|
+
files:
|
24
|
+
- .bundle/config
|
25
|
+
- .gitignore
|
26
|
+
- Gemfile
|
27
|
+
- LICENSE
|
28
|
+
- README.rdoc
|
29
|
+
- Rakefile
|
30
|
+
- birdbath.gemspec
|
31
|
+
- generators/full_migration_test/USAGE
|
32
|
+
- generators/full_migration_test/full_migration_test_generator.rb
|
33
|
+
- generators/full_migration_test/templates/full_migration_test.rb
|
34
|
+
- generators/migration_test/migration_test_generator.rb
|
35
|
+
- generators/migration_test/templates/migration_test.rb
|
36
|
+
- init.rb
|
37
|
+
- install.rb
|
38
|
+
- lib/birdbath.rb
|
39
|
+
- lib/birdbath/version.rb
|
40
|
+
- tasks/birdbath_tasks.rake
|
41
|
+
- test/birdbath_test.rb
|
42
|
+
- test/config/database.yml
|
43
|
+
- test/db/migrate_bad/001_create_top_dogs.rb
|
44
|
+
- test/db/migrate_good/001_create_top_dogs.rb
|
45
|
+
- test/db/migrate_good/002_create_bottom_dogs.rb
|
46
|
+
- test/db/migrate_good/003_create_cats.rb
|
47
|
+
- test/db/schema.rb
|
48
|
+
- test/foundry_only_helper.rb
|
49
|
+
- test/full_migration_test_generator_test.rb
|
50
|
+
- test/helper.rb
|
51
|
+
- test/migration_test_generator_test.rb
|
52
|
+
- uninstall.rb
|
53
|
+
has_rdoc: true
|
54
|
+
homepage: http://github.com/atomicobject/birdbath
|
55
|
+
licenses: []
|
56
|
+
post_install_message:
|
57
|
+
rdoc_options: []
|
58
|
+
require_paths:
|
59
|
+
- lib
|
60
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
67
|
+
none: false
|
68
|
+
requirements:
|
69
|
+
- - ! '>='
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: '0'
|
72
|
+
requirements: []
|
73
|
+
rubyforge_project: birdbath
|
74
|
+
rubygems_version: 1.6.2
|
75
|
+
signing_key:
|
76
|
+
specification_version: 3
|
77
|
+
summary: A Rails gem for testing migrations
|
78
|
+
test_files: []
|