https://github.com/atomicobject/birdbath
A rails gem for verifying migrations with rspec or Test::Unit
https://github.com/atomicobject/birdbath
Last synced: 8 months ago
JSON representation
A rails gem for verifying migrations with rspec or Test::Unit
- Host: GitHub
- URL: https://github.com/atomicobject/birdbath
- Owner: atomicobject
- License: mit
- Created: 2010-10-17T20:17:36.000Z (over 15 years ago)
- Default Branch: master
- Last Pushed: 2011-08-09T20:29:17.000Z (over 14 years ago)
- Last Synced: 2025-08-16T08:34:56.593Z (8 months ago)
- Language: Ruby
- Homepage:
- Size: 179 KB
- Stars: 5
- Watchers: 25
- Forks: 2
- Open Issues: 0
-
Metadata Files:
- Readme: README.rdoc
- License: LICENSE
Awesome Lists containing this project
README
= Birdbath
Birdbath provides methods which let you assert the current state of the schema and run your migrations against the _test_ database.
== Install
gem install birdbath
If you're using it outside of a Rails environment (for whatever reason) include the Birdbath module in your tests:
require 'test/unit'
require 'birdbath'
class MyTest < Test::Unit::TestCase
include Birdbath
def test_something
...
end
end
== Use
*assert_schema*: verifies the schema of the database exactly matches the one specified.
def test_the_schema
assert_schema do |s|
s.table :books do |t|
t.column :id, :integer
t.column :title, :string, :limit => 5
t.column :author, :string
end
s.table :reviews do |t|
t.column :id, :integer
t.column :book_id, :integer
t.column :body, :text
t.column :rating, :integer, :default => 0
t.index :book_id, :name => 'index_book_id_on_reviews'
end
end
end
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.
*assert_table*: verify a table is found exactly as specified:
assert_table :books do |t|
t.column :id, :integer
t.column :title, :string, :limit => 5
t.column :author, :string
t.index :author, :name => 'index_author_on_books'
end
*drop_all_tables*: does just what it says to your _test_ database.
*migrate*: executes the migrations against the test database using the same mechanism as rake db:migrate.
def test_the_migrations
migrate
migrate :version => 0
migrate :version => 10
migrate
end
This would do the same thing as running the following rake commands, but within a test case:
rake db:migrate
rake db:migrate VERSION=0
rake db:migrate VERSION=10
rake db:migrate
By combining the two helpers you can write a test that shows you can run all your migrations and get the final schema:
def test_should_be_able_to_migrate_from_an_empty_schema
drop_all_tables
# we shouldn't have any tables
assert_schema do |s|
end
migrate
assert_schema do |s|
s.table :books do |t|
t.column :id, :integer
t.column :title, :string
t.column :author, :string
end
s.table :reviews do |t|
t.column :id, :integer
t.column :book_id, :integer
t.column :body, :text
t.column :rating, :integer
t.index :book_id, :name => 'index_book_id_on_reviews'
end
end
end
The *migrate* helper can also be useful for testing data tranformation migrations:
def test_should_get_rid_of_bad_data
drop_all_tables
migrate :version => 7
Book.reset_column_information
book = Book.create! :title => "bad title\nwith\todd spacing"
migrate :version => 8 # should cleanse spacing in book titles
book.reload
assert_equal "bad title with odd spacing", book.title
end
== Authors
* Micah Alles (alles@atomicobject.com)
* David Crosby (crosby@atomicobject.com)
* Patrick Bacon (bacon@atomicobject.com)
* © 2007-2011 {Atomic Object}[http://www.atomicobject.com]
* More Atomic Object {open source}[http://www.atomicobject.com/pages/Software+Commons] projects