2005-07-04 14:51:02 -04:00
require 'abstract_unit'
2006-07-08 16:35:56 -04:00
require 'bigdecimal/util'
2005-07-04 14:51:02 -04:00
require 'fixtures/person'
2006-05-14 14:37:22 -04:00
require 'fixtures/topic'
2005-07-04 14:51:02 -04:00
require File . dirname ( __FILE__ ) + '/fixtures/migrations/1_people_have_last_names'
require File . dirname ( __FILE__ ) + '/fixtures/migrations/2_we_need_reminders'
2006-07-08 16:35:56 -04:00
require File . dirname ( __FILE__ ) + '/fixtures/migrations_with_decimal/1_give_me_big_numbers'
2005-07-04 14:51:02 -04:00
2006-07-07 06:48:43 -04:00
if ActiveRecord :: Base . connection . supports_migrations?
2006-07-08 16:35:56 -04:00
class BigNumber < ActiveRecord :: Base ; end
2005-07-04 14:51:02 -04:00
class Reminder < ActiveRecord :: Base ; end
2006-03-04 13:46:51 -05:00
class ActiveRecord :: Migration
class << self
attr_accessor :message_count
def puts ( text = " " )
self . message_count || = 0
self . message_count += 1
end
end
end
2005-07-04 14:51:02 -04:00
class MigrationTest < Test :: Unit :: TestCase
2005-09-23 11:00:56 -04:00
self . use_transactional_fixtures = false
2005-07-04 14:51:02 -04:00
def setup
2006-03-04 13:46:51 -05:00
ActiveRecord :: Migration . verbose = true
PeopleHaveLastNames . message_count = 0
2005-07-04 14:51:02 -04:00
end
def teardown
ActiveRecord :: Base . connection . initialize_schema_information
2005-09-26 17:30:12 -04:00
ActiveRecord :: Base . connection . update " UPDATE #{ ActiveRecord :: Migrator . schema_info_table_name } SET version = 0 "
2005-07-04 14:51:02 -04:00
2006-07-08 16:35:56 -04:00
%w( reminders people_reminders prefix_reminders_suffix ) . each do | table |
Reminder . connection . drop_table ( table ) rescue nil
end
2005-07-04 14:51:02 -04:00
Reminder . reset_column_information
2006-07-10 14:24:35 -04:00
%w( last_name key bio age height wealth birthday favorite_day
male administrator ) . each do | column |
2006-07-08 16:35:56 -04:00
Person . connection . remove_column ( 'people' , column ) rescue nil
end
2006-07-08 13:13:21 -04:00
Person . connection . remove_column ( " people " , " first_name " ) rescue nil
2006-08-23 01:49:40 -04:00
Person . connection . remove_column ( " people " , " middle_name " ) rescue nil
2006-07-08 13:13:21 -04:00
Person . connection . add_column ( " people " , " first_name " , :string , :limit = > 40 )
2005-07-04 14:51:02 -04:00
Person . reset_column_information
end
2005-12-20 16:43:47 -05:00
2005-07-05 03:19:20 -04:00
def test_add_index
2006-07-08 13:13:21 -04:00
# Limit size of last_name and key columns to support Firebird index limitations
Person . connection . add_column " people " , " last_name " , :string , :limit = > 100
Person . connection . add_column " people " , " key " , :string , :limit = > 100
2005-09-23 09:29:33 -04:00
Person . connection . add_column " people " , " administrator " , :boolean
2006-07-07 06:48:43 -04:00
2005-07-05 03:19:20 -04:00
assert_nothing_raised { Person . connection . add_index ( " people " , " last_name " ) }
assert_nothing_raised { Person . connection . remove_index ( " people " , " last_name " ) }
2007-01-04 19:12:06 -05:00
# Orcl nds shrt indx nms. Sybs 2.
unless current_adapter? ( :OracleAdapter , :SybaseAdapter )
2006-08-15 19:51:27 -04:00
assert_nothing_raised { Person . connection . add_index ( " people " , [ " last_name " , " first_name " ] ) }
assert_nothing_raised { Person . connection . remove_index ( " people " , :column = > [ " last_name " , " first_name " ] ) }
assert_nothing_raised { Person . connection . add_index ( " people " , [ " last_name " , " first_name " ] ) }
assert_nothing_raised { Person . connection . remove_index ( " people " , :name = > " index_people_on_last_name_and_first_name " ) }
assert_nothing_raised { Person . connection . add_index ( " people " , [ " last_name " , " first_name " ] ) }
assert_nothing_raised { Person . connection . remove_index ( " people " , " last_name_and_first_name " ) }
assert_nothing_raised { Person . connection . add_index ( " people " , [ " last_name " , " first_name " ] ) }
assert_nothing_raised { Person . connection . remove_index ( " people " , [ " last_name " , " first_name " ] ) }
end
2006-07-07 06:48:43 -04:00
2006-04-19 22:41:05 -04:00
# quoting
2006-07-08 13:13:21 -04:00
# Note: changed index name from "key" to "key_idx" since "key" is a Firebird reserved word
assert_nothing_raised { Person . connection . add_index ( " people " , [ " key " ] , :name = > " key_idx " , :unique = > true ) }
assert_nothing_raised { Person . connection . remove_index ( " people " , :name = > " key_idx " , :unique = > true ) }
2005-09-23 09:29:33 -04:00
2006-03-17 22:02:32 -05:00
# Sybase adapter does not support indexes on :boolean columns
unless current_adapter? ( :SybaseAdapter )
assert_nothing_raised { Person . connection . add_index ( " people " , %w( last_name first_name administrator ) , :name = > " named_admin " ) }
assert_nothing_raised { Person . connection . remove_index ( " people " , :name = > " named_admin " ) }
end
2005-07-05 03:19:20 -04:00
end
2005-07-27 13:06:22 -04:00
def test_create_table_adds_id
Person . connection . create_table :testings do | t |
t . column :foo , :string
end
assert_equal %w( foo id ) ,
Person . connection . columns ( :testings ) . map { | c | c . name } . sort
ensure
Person . connection . drop_table :testings rescue nil
end
2005-07-30 06:16:21 -04:00
def test_create_table_with_not_null_column
Person . connection . create_table :testings do | t |
t . column :foo , :string , :null = > false
end
assert_raises ( ActiveRecord :: StatementInvalid ) do
Person . connection . execute " insert into testings (foo) values (NULL) "
end
ensure
Person . connection . drop_table :testings rescue nil
end
2005-09-25 11:49:35 -04:00
def test_create_table_with_defaults
Person . connection . create_table :testings do | t |
t . column :one , :string , :default = > " hello "
t . column :two , :boolean , :default = > true
t . column :three , :boolean , :default = > false
t . column :four , :integer , :default = > 1
end
columns = Person . connection . columns ( :testings )
one = columns . detect { | c | c . name == " one " }
two = columns . detect { | c | c . name == " two " }
three = columns . detect { | c | c . name == " three " }
four = columns . detect { | c | c . name == " four " }
assert_equal " hello " , one . default
2006-05-21 11:13:28 -04:00
assert_equal true , two . default
assert_equal false , three . default
2005-09-25 11:49:35 -04:00
assert_equal 1 , four . default
ensure
Person . connection . drop_table :testings rescue nil
end
2006-05-11 23:59:43 -04:00
def test_create_table_with_limits
2006-05-12 01:15:17 -04:00
assert_nothing_raised do
Person . connection . create_table :testings do | t |
t . column :foo , :string , :limit = > 255
2006-05-11 23:59:43 -04:00
2006-05-12 01:15:17 -04:00
t . column :default_int , :integer
2006-05-11 23:59:43 -04:00
2006-05-12 01:15:17 -04:00
t . column :one_int , :integer , :limit = > 1
t . column :four_int , :integer , :limit = > 4
t . column :eight_int , :integer , :limit = > 8
end
2006-05-11 23:59:43 -04:00
end
columns = Person . connection . columns ( :testings )
foo = columns . detect { | c | c . name == " foo " }
assert_equal 255 , foo . limit
default = columns . detect { | c | c . name == " default_int " }
one = columns . detect { | c | c . name == " one_int " }
four = columns . detect { | c | c . name == " four_int " }
eight = columns . detect { | c | c . name == " eight_int " }
if current_adapter? ( :PostgreSQLAdapter )
assert_equal 'integer' , default . sql_type
assert_equal 'smallint' , one . sql_type
assert_equal 'integer' , four . sql_type
assert_equal 'bigint' , eight . sql_type
2006-05-21 11:13:28 -04:00
elsif current_adapter? ( :OracleAdapter )
assert_equal 'NUMBER(38)' , default . sql_type
assert_equal 'NUMBER(1)' , one . sql_type
assert_equal 'NUMBER(4)' , four . sql_type
assert_equal 'NUMBER(8)' , eight . sql_type
2006-05-11 23:59:43 -04:00
end
ensure
Person . connection . drop_table :testings rescue nil
end
2006-07-07 06:48:43 -04:00
2006-11-04 21:01:31 -05:00
# SQL Server, Sybase, and SQLite3 will not allow you to add a NOT NULL
# column to a table without a default value.
unless current_adapter? ( :SQLServerAdapter , :SybaseAdapter , :SQLiteAdapter )
2005-10-28 03:40:28 -04:00
def test_add_column_not_null_without_default
Person . connection . create_table :testings do | t |
t . column :foo , :string
end
Person . connection . add_column :testings , :bar , :string , :null = > false
2006-07-07 06:48:43 -04:00
2005-10-28 03:40:28 -04:00
assert_raises ( ActiveRecord :: StatementInvalid ) do
Person . connection . execute " insert into testings (foo, bar) values ('hello', NULL) "
end
ensure
Person . connection . drop_table :testings rescue nil
end
end
2006-07-07 06:48:43 -04:00
2005-10-28 03:40:28 -04:00
def test_add_column_not_null_with_default
2006-07-08 13:13:21 -04:00
Person . connection . create_table :testings do | t |
2005-07-30 06:16:21 -04:00
t . column :foo , :string
end
2006-07-10 14:24:35 -04:00
con = Person . connection
2007-01-04 19:12:06 -05:00
Person . connection . enable_identity_insert ( " testings " , true ) if current_adapter? ( :SybaseAdapter )
2006-07-10 14:24:35 -04:00
Person . connection . execute " insert into testings ( #{ con . quote_column_name ( 'id' ) } , #{ con . quote_column_name ( 'foo' ) } ) values (1, 'hello') "
2007-01-04 19:12:06 -05:00
Person . connection . enable_identity_insert ( " testings " , false ) if current_adapter? ( :SybaseAdapter )
2006-06-03 17:41:40 -04:00
assert_nothing_raised { Person . connection . add_column :testings , :bar , :string , :null = > false , :default = > " default " }
2005-07-30 06:16:21 -04:00
assert_raises ( ActiveRecord :: StatementInvalid ) do
2006-07-10 14:24:35 -04:00
Person . connection . execute " insert into testings ( #{ con . quote_column_name ( 'id' ) } , #{ con . quote_column_name ( 'foo' ) } , #{ con . quote_column_name ( 'bar' ) } ) values (2, 'hello', NULL) "
2005-07-30 06:16:21 -04:00
end
ensure
Person . connection . drop_table :testings rescue nil
end
2006-07-07 06:48:43 -04:00
2006-07-08 16:35:56 -04:00
# We specifically do a manual INSERT here, and then test only the SELECT
# functionality. This allows us to more easily catch INSERT being broken,
# but SELECT actually working fine.
def test_native_decimal_insert_manual_vs_automatic
# SQLite3 always uses float in violation of SQL
# 16 decimal places
correct_value = ( current_adapter? ( :SQLiteAdapter ) ? '0.123456789012346E20' : '0012345678901234567890.0123456789' ) . to_d
Person . delete_all
Person . connection . add_column " people " , " wealth " , :decimal , :precision = > '30' , :scale = > '10'
Person . reset_column_information
# Do a manual insertion
2006-07-10 14:10:50 -04:00
if current_adapter? ( :OracleAdapter )
Person . connection . execute " insert into people (id, wealth) values (people_seq.nextval, 12345678901234567890.0123456789) "
else
Person . connection . execute " insert into people (wealth) values (12345678901234567890.0123456789) "
end
2006-07-08 16:35:56 -04:00
# SELECT
row = Person . find ( :first )
assert_kind_of BigDecimal , row . wealth
# If this assert fails, that means the SELECT is broken!
assert_equal correct_value , row . wealth
# Reset to old state
Person . delete_all
# Now use the Rails insertion
assert_nothing_raised { Person . create :wealth = > BigDecimal . new ( " 12345678901234567890.0123456789 " ) }
# SELECT
row = Person . find ( :first )
assert_kind_of BigDecimal , row . wealth
# If these asserts fail, that means the INSERT (create function, or cast to SQL) is broken!
assert_equal correct_value , row . wealth
# Reset to old state
Person . connection . del_column " people " , " wealth " rescue nil
Person . reset_column_information
end
2005-07-04 14:51:02 -04:00
def test_native_types
Person . delete_all
Person . connection . add_column " people " , " last_name " , :string
Person . connection . add_column " people " , " bio " , :text
Person . connection . add_column " people " , " age " , :integer
Person . connection . add_column " people " , " height " , :float
2006-07-08 16:35:56 -04:00
Person . connection . add_column " people " , " wealth " , :decimal , :precision = > '30' , :scale = > '10'
2005-07-04 14:51:02 -04:00
Person . connection . add_column " people " , " birthday " , :datetime
Person . connection . add_column " people " , " favorite_day " , :date
Person . connection . add_column " people " , " male " , :boolean
2006-07-08 16:35:56 -04:00
assert_nothing_raised { Person . create :first_name = > 'bob' , :last_name = > 'bobsen' , :bio = > " I was born .... " , :age = > 18 , :height = > 1 . 78 , :wealth = > BigDecimal . new ( " 12345678901234567890.0123456789 " ) , :birthday = > 18 . years . ago , :favorite_day = > 10 . days . ago , :male = > true }
2005-07-04 14:51:02 -04:00
bob = Person . find ( :first )
2006-07-07 06:48:43 -04:00
2006-07-08 16:35:56 -04:00
assert_equal 'bob' , bob . first_name
assert_equal 'bobsen' , bob . last_name
assert_equal " I was born .... " , bob . bio
assert_equal 18 , bob . age
# Test for 30 significent digits (beyond the 16 of float), 10 of them
# after the decimal place.
if current_adapter? ( :SQLiteAdapter )
# SQLite3 uses float in violation of SQL. Test for 16 decimal places.
assert_equal BigDecimal . new ( '0.123456789012346E20' ) , bob . wealth
else
assert_equal BigDecimal . new ( " 0012345678901234567890.0123456789 " ) , bob . wealth
end
assert_equal true , bob . male?
2006-07-07 06:48:43 -04:00
2005-07-04 14:51:02 -04:00
assert_equal String , bob . first_name . class
assert_equal String , bob . last_name . class
assert_equal String , bob . bio . class
assert_equal Fixnum , bob . age . class
assert_equal Time , bob . birthday . class
2005-10-28 03:40:28 -04:00
2006-07-07 06:48:43 -04:00
if current_adapter? ( :SQLServerAdapter , :OracleAdapter , :SybaseAdapter )
2006-07-10 14:24:35 -04:00
# Sybase, and Oracle don't differentiate between date/time
2005-10-28 03:40:28 -04:00
assert_equal Time , bob . favorite_day . class
else
assert_equal Date , bob . favorite_day . class
end
2005-07-04 14:51:02 -04:00
assert_equal TrueClass , bob . male? . class
2006-07-08 16:35:56 -04:00
assert_kind_of BigDecimal , bob . wealth
2005-07-04 14:51:02 -04:00
end
2005-09-28 13:50:28 -04:00
def test_add_remove_single_field_using_string_arguments
2005-07-04 14:51:02 -04:00
assert ! Person . column_methods_hash . include? ( :last_name )
2005-09-28 13:50:28 -04:00
ActiveRecord :: Migration . add_column 'people' , 'last_name' , :string
2005-07-04 14:51:02 -04:00
Person . reset_column_information
assert Person . column_methods_hash . include? ( :last_name )
2006-07-07 06:48:43 -04:00
2005-09-28 13:50:28 -04:00
ActiveRecord :: Migration . remove_column 'people' , 'last_name'
Person . reset_column_information
assert ! Person . column_methods_hash . include? ( :last_name )
end
def test_add_remove_single_field_using_symbol_arguments
assert ! Person . column_methods_hash . include? ( :last_name )
ActiveRecord :: Migration . add_column :people , :last_name , :string
Person . reset_column_information
assert Person . column_methods_hash . include? ( :last_name )
ActiveRecord :: Migration . remove_column :people , :last_name
2005-07-04 14:51:02 -04:00
Person . reset_column_information
assert ! Person . column_methods_hash . include? ( :last_name )
end
2006-07-07 06:48:43 -04:00
2005-07-05 03:19:20 -04:00
def test_add_rename
Person . delete_all
2006-07-07 06:48:43 -04:00
2005-07-05 03:19:20 -04:00
begin
2006-07-07 06:48:43 -04:00
Person . connection . add_column " people " , " girlfriend " , :string
Person . create :girlfriend = > 'bobette'
2005-07-05 03:19:20 -04:00
Person . connection . rename_column " people " , " girlfriend " , " exgirlfriend "
2006-07-07 06:48:43 -04:00
Person . reset_column_information
2005-07-05 03:19:20 -04:00
bob = Person . find ( :first )
2006-07-07 06:48:43 -04:00
2005-07-05 03:19:20 -04:00
assert_equal " bobette " , bob . exgirlfriend
ensure
Person . connection . remove_column ( " people " , " girlfriend " ) rescue nil
Person . connection . remove_column ( " people " , " exgirlfriend " ) rescue nil
end
2006-07-07 06:48:43 -04:00
2005-07-05 03:19:20 -04:00
end
2006-07-07 06:48:43 -04:00
2005-10-25 15:28:53 -04:00
def test_rename_column_using_symbol_arguments
begin
Person . connection . rename_column :people , :first_name , :nick_name
Person . reset_column_information
assert Person . column_names . include? ( " nick_name " )
ensure
Person . connection . remove_column ( " people " , " nick_name " )
Person . connection . add_column ( " people " , " first_name " , :string )
end
end
2006-07-07 06:48:43 -04:00
2005-10-25 15:28:53 -04:00
def test_rename_column
begin
Person . connection . rename_column " people " , " first_name " , " nick_name "
Person . reset_column_information
assert Person . column_names . include? ( " nick_name " )
ensure
Person . connection . remove_column ( " people " , " nick_name " )
Person . connection . add_column ( " people " , " first_name " , :string )
end
end
2006-07-07 06:48:43 -04:00
2005-10-06 10:10:45 -04:00
def test_rename_table
begin
ActiveRecord :: Base . connection . create_table :octopuses do | t |
t . column :url , :string
2005-10-29 14:40:49 -04:00
end
2005-10-06 10:10:45 -04:00
ActiveRecord :: Base . connection . rename_table :octopuses , :octopi
2005-10-29 14:40:49 -04:00
2006-07-08 13:13:21 -04:00
# Using explicit id in insert for compatibility across all databases
2006-07-10 14:24:35 -04:00
con = ActiveRecord :: Base . connection
2007-01-04 19:12:06 -05:00
con . enable_identity_insert ( " octopi " , true ) if current_adapter? ( :SybaseAdapter )
2006-07-10 14:24:35 -04:00
assert_nothing_raised { con . execute " INSERT INTO octopi ( #{ con . quote_column_name ( 'id' ) } , #{ con . quote_column_name ( 'url' ) } ) VALUES (1, 'http://www.foreverflying.com/octopus-black7.jpg') " }
2007-01-04 19:12:06 -05:00
con . enable_identity_insert ( " octopi " , false ) if current_adapter? ( :SybaseAdapter )
2005-10-06 10:10:45 -04:00
assert_equal 'http://www.foreverflying.com/octopus-black7.jpg' , ActiveRecord :: Base . connection . select_value ( " SELECT url FROM octopi WHERE id=1 " )
2005-10-29 14:40:49 -04:00
2005-10-06 10:10:45 -04:00
ensure
ActiveRecord :: Base . connection . drop_table :octopuses rescue nil
ActiveRecord :: Base . connection . drop_table :octopi rescue nil
end
end
2005-10-29 14:40:49 -04:00
2006-10-08 22:14:36 -04:00
def test_rename_table_with_an_index
begin
ActiveRecord :: Base . connection . create_table :octopuses do | t |
t . column :url , :string
end
ActiveRecord :: Base . connection . add_index :octopuses , :url
ActiveRecord :: Base . connection . rename_table :octopuses , :octopi
# Using explicit id in insert for compatibility across all databases
con = ActiveRecord :: Base . connection
2007-01-04 19:12:06 -05:00
con . enable_identity_insert ( " octopi " , true ) if current_adapter? ( :SybaseAdapter )
2006-10-08 22:14:36 -04:00
assert_nothing_raised { con . execute " INSERT INTO octopi ( #{ con . quote_column_name ( 'id' ) } , #{ con . quote_column_name ( 'url' ) } ) VALUES (1, 'http://www.foreverflying.com/octopus-black7.jpg') " }
2007-01-04 19:12:06 -05:00
con . enable_identity_insert ( " octopi " , false ) if current_adapter? ( :SybaseAdapter )
2006-10-08 22:14:36 -04:00
assert_equal 'http://www.foreverflying.com/octopus-black7.jpg' , ActiveRecord :: Base . connection . select_value ( " SELECT url FROM octopi WHERE id=1 " )
assert ActiveRecord :: Base . connection . indexes ( :octopi ) . first . columns . include? ( " url " )
ensure
ActiveRecord :: Base . connection . drop_table :octopuses rescue nil
ActiveRecord :: Base . connection . drop_table :octopi rescue nil
end
end
2005-07-05 03:19:20 -04:00
def test_change_column
2005-12-20 16:43:47 -05:00
Person . connection . add_column 'people' , 'age' , :integer
old_columns = Person . connection . columns ( Person . table_name , " #{ name } Columns " )
assert old_columns . find { | c | c . name == 'age' and c . type == :integer }
assert_nothing_raised { Person . connection . change_column " people " , " age " , :string }
2006-07-07 06:48:43 -04:00
2005-12-20 16:43:47 -05:00
new_columns = Person . connection . columns ( Person . table_name , " #{ name } Columns " )
assert_nil new_columns . find { | c | c . name == 'age' and c . type == :integer }
assert new_columns . find { | c | c . name == 'age' and c . type == :string }
2006-05-14 14:37:22 -04:00
old_columns = Topic . connection . columns ( Topic . table_name , " #{ name } Columns " )
assert old_columns . find { | c | c . name == 'approved' and c . type == :boolean and c . default == true }
assert_nothing_raised { Topic . connection . change_column :topics , :approved , :boolean , :default = > false }
2006-07-10 14:24:35 -04:00
new_columns = Topic . connection . columns ( Topic . table_name , " #{ name } Columns " )
2006-05-14 14:37:22 -04:00
assert_nil new_columns . find { | c | c . name == 'approved' and c . type == :boolean and c . default == true }
assert new_columns . find { | c | c . name == 'approved' and c . type == :boolean and c . default == false }
2006-05-21 11:13:28 -04:00
assert_nothing_raised { Topic . connection . change_column :topics , :approved , :boolean , :default = > true }
2006-07-07 06:48:43 -04:00
end
2005-07-05 03:19:20 -04:00
def test_change_column_with_new_default
Person . connection . add_column " people " , " administrator " , :boolean , :default = > 1
2006-07-07 06:48:43 -04:00
Person . reset_column_information
2005-07-05 03:19:20 -04:00
assert Person . new . administrator?
2006-07-07 06:48:43 -04:00
2005-07-05 03:19:20 -04:00
assert_nothing_raised { Person . connection . change_column " people " , " administrator " , :boolean , :default = > 0 }
2006-07-07 06:48:43 -04:00
Person . reset_column_information
2005-07-05 03:19:20 -04:00
assert ! Person . new . administrator?
2006-07-07 06:48:43 -04:00
end
2005-07-04 14:51:02 -04:00
def test_add_table
2005-10-28 03:40:28 -04:00
assert ! Reminder . table_exists?
2006-07-07 06:48:43 -04:00
2005-07-04 14:51:02 -04:00
WeNeedReminders . up
2006-07-07 06:48:43 -04:00
2005-07-04 14:51:02 -04:00
assert Reminder . create ( " content " = > " hello world " , " remind_at " = > Time . now )
assert_equal " hello world " , Reminder . find ( :first ) . content
2006-07-07 06:48:43 -04:00
2005-07-04 14:51:02 -04:00
WeNeedReminders . down
assert_raises ( ActiveRecord :: StatementInvalid ) { Reminder . find ( :first ) }
end
2006-07-08 16:35:56 -04:00
def test_add_table_with_decimals
Person . connection . drop_table :big_numbers rescue nil
assert ! BigNumber . table_exists?
GiveMeBigNumbers . up
assert BigNumber . create (
:bank_balance = > 1586 . 43 ,
:big_bank_balance = > BigDecimal ( " 1000234000567.95 " ) ,
:world_population = > 6000000000 ,
:my_house_population = > 3 ,
:value_of_e = > BigDecimal ( " 2.7182818284590452353602875 " )
)
b = BigNumber . find ( :first )
assert_not_nil b
assert_not_nil b . bank_balance
assert_not_nil b . big_bank_balance
assert_not_nil b . world_population
assert_not_nil b . my_house_population
assert_not_nil b . value_of_e
# TODO: set world_population >= 2**62 to cover 64-bit platforms and test
# is_a?(Bignum)
assert_kind_of Integer , b . world_population
assert_equal 6000000000 , b . world_population
assert_kind_of Fixnum , b . my_house_population
assert_equal 3 , b . my_house_population
assert_kind_of BigDecimal , b . bank_balance
assert_equal BigDecimal ( " 1586.43 " ) , b . bank_balance
assert_kind_of BigDecimal , b . big_bank_balance
assert_equal BigDecimal ( " 1000234000567.95 " ) , b . big_bank_balance
# This one is fun. The 'value_of_e' field is defined as 'DECIMAL' with
# precision/scale explictly left out. By the SQL standard, numbers
# assigned to this field should be truncated but that's seldom respected.
if current_adapter? ( :PostgreSQLAdapter , :SQLite2Adapter )
# - PostgreSQL changes the SQL spec on columns declared simply as
# "decimal" to something more useful: instead of being given a scale
# of 0, they take on the compile-time limit for precision and scale,
# so the following should succeed unless you have used really wacky
# compilation options
# - SQLite2 has the default behavior of preserving all data sent in,
# so this happens there too
assert_kind_of BigDecimal , b . value_of_e
assert_equal BigDecimal ( " 2.7182818284590452353602875 " ) , b . value_of_e
elsif current_adapter? ( :SQLiteAdapter )
# - SQLite3 stores a float, in violation of SQL
assert_kind_of BigDecimal , b . value_of_e
assert_equal BigDecimal ( " 2.71828182845905 " ) , b . value_of_e
elsif current_adapter? ( :SQLServer )
# - SQL Server rounds instead of truncating
assert_kind_of Fixnum , b . value_of_e
assert_equal 3 , b . value_of_e
else
# - SQL standard is an integer
assert_kind_of Fixnum , b . value_of_e
assert_equal 2 , b . value_of_e
end
GiveMeBigNumbers . down
assert_raises ( ActiveRecord :: StatementInvalid ) { BigNumber . find ( :first ) }
end
2005-07-04 14:51:02 -04:00
def test_migrator
assert ! Person . column_methods_hash . include? ( :last_name )
2005-10-28 03:40:28 -04:00
assert ! Reminder . table_exists?
2005-07-04 14:51:02 -04:00
ActiveRecord :: Migrator . up ( File . dirname ( __FILE__ ) + '/fixtures/migrations/' )
2005-07-05 03:19:20 -04:00
assert_equal 3 , ActiveRecord :: Migrator . current_version
2005-07-04 14:51:02 -04:00
Person . reset_column_information
assert Person . column_methods_hash . include? ( :last_name )
assert Reminder . create ( " content " = > " hello world " , " remind_at " = > Time . now )
assert_equal " hello world " , Reminder . find ( :first ) . content
ActiveRecord :: Migrator . down ( File . dirname ( __FILE__ ) + '/fixtures/migrations/' )
assert_equal 0 , ActiveRecord :: Migrator . current_version
Person . reset_column_information
assert ! Person . column_methods_hash . include? ( :last_name )
assert_raises ( ActiveRecord :: StatementInvalid ) { Reminder . find ( :first ) }
end
def test_migrator_one_up
assert ! Person . column_methods_hash . include? ( :last_name )
2005-10-28 03:40:28 -04:00
assert ! Reminder . table_exists?
2006-07-07 06:48:43 -04:00
2005-07-04 14:51:02 -04:00
ActiveRecord :: Migrator . up ( File . dirname ( __FILE__ ) + '/fixtures/migrations/' , 1 )
Person . reset_column_information
assert Person . column_methods_hash . include? ( :last_name )
2005-10-28 03:40:28 -04:00
assert ! Reminder . table_exists?
2005-07-04 14:51:02 -04:00
ActiveRecord :: Migrator . up ( File . dirname ( __FILE__ ) + '/fixtures/migrations/' , 2 )
assert Reminder . create ( " content " = > " hello world " , " remind_at " = > Time . now )
assert_equal " hello world " , Reminder . find ( :first ) . content
end
2006-07-07 06:48:43 -04:00
2005-07-04 14:51:02 -04:00
def test_migrator_one_down
ActiveRecord :: Migrator . up ( File . dirname ( __FILE__ ) + '/fixtures/migrations/' )
2006-07-07 06:48:43 -04:00
2005-07-04 14:51:02 -04:00
ActiveRecord :: Migrator . down ( File . dirname ( __FILE__ ) + '/fixtures/migrations/' , 1 )
Person . reset_column_information
assert Person . column_methods_hash . include? ( :last_name )
2005-10-28 03:40:28 -04:00
assert ! Reminder . table_exists?
2005-07-04 14:51:02 -04:00
end
2006-07-07 06:48:43 -04:00
2005-07-04 14:51:02 -04:00
def test_migrator_one_up_one_down
ActiveRecord :: Migrator . up ( File . dirname ( __FILE__ ) + '/fixtures/migrations/' , 1 )
ActiveRecord :: Migrator . down ( File . dirname ( __FILE__ ) + '/fixtures/migrations/' , 0 )
assert ! Person . column_methods_hash . include? ( :last_name )
2005-10-28 03:40:28 -04:00
assert ! Reminder . table_exists?
2005-07-04 14:51:02 -04:00
end
2006-07-07 06:48:43 -04:00
2006-03-04 13:46:51 -05:00
def test_migrator_verbosity
ActiveRecord :: Migrator . up ( File . dirname ( __FILE__ ) + '/fixtures/migrations/' , 1 )
assert PeopleHaveLastNames . message_count > 0
PeopleHaveLastNames . message_count = 0
ActiveRecord :: Migrator . down ( File . dirname ( __FILE__ ) + '/fixtures/migrations/' , 0 )
assert PeopleHaveLastNames . message_count > 0
PeopleHaveLastNames . message_count = 0
end
2006-07-07 06:48:43 -04:00
2006-03-04 13:46:51 -05:00
def test_migrator_verbosity_off
PeopleHaveLastNames . verbose = false
ActiveRecord :: Migrator . up ( File . dirname ( __FILE__ ) + '/fixtures/migrations/' , 1 )
assert PeopleHaveLastNames . message_count . zero?
ActiveRecord :: Migrator . down ( File . dirname ( __FILE__ ) + '/fixtures/migrations/' , 0 )
assert PeopleHaveLastNames . message_count . zero?
end
2006-07-07 06:48:43 -04:00
2005-07-09 11:46:29 -04:00
def test_migrator_going_down_due_to_version_target
ActiveRecord :: Migrator . up ( File . dirname ( __FILE__ ) + '/fixtures/migrations/' , 1 )
ActiveRecord :: Migrator . migrate ( File . dirname ( __FILE__ ) + '/fixtures/migrations/' , 0 )
assert ! Person . column_methods_hash . include? ( :last_name )
2005-10-28 03:40:28 -04:00
assert ! Reminder . table_exists?
2005-07-09 11:46:29 -04:00
ActiveRecord :: Migrator . migrate ( File . dirname ( __FILE__ ) + '/fixtures/migrations/' )
Person . reset_column_information
assert Person . column_methods_hash . include? ( :last_name )
assert Reminder . create ( " content " = > " hello world " , " remind_at " = > Time . now )
assert_equal " hello world " , Reminder . find ( :first ) . content
end
2005-09-26 17:30:12 -04:00
def test_schema_info_table_name
ActiveRecord :: Base . table_name_prefix = " prefix_ "
ActiveRecord :: Base . table_name_suffix = " _suffix "
2005-10-10 14:59:56 -04:00
Reminder . reset_table_name
2005-09-26 17:30:12 -04:00
assert_equal " prefix_schema_info_suffix " , ActiveRecord :: Migrator . schema_info_table_name
ActiveRecord :: Base . table_name_prefix = " "
ActiveRecord :: Base . table_name_suffix = " "
2005-10-10 14:59:56 -04:00
Reminder . reset_table_name
2005-09-26 17:30:12 -04:00
assert_equal " schema_info " , ActiveRecord :: Migrator . schema_info_table_name
2005-11-12 06:59:54 -05:00
ensure
ActiveRecord :: Base . table_name_prefix = " "
ActiveRecord :: Base . table_name_suffix = " "
2005-09-26 17:30:12 -04:00
end
2006-07-07 06:48:43 -04:00
2005-09-26 17:30:12 -04:00
def test_proper_table_name
assert_equal " table " , ActiveRecord :: Migrator . proper_table_name ( 'table' )
assert_equal " table " , ActiveRecord :: Migrator . proper_table_name ( :table )
assert_equal " reminders " , ActiveRecord :: Migrator . proper_table_name ( Reminder )
2005-10-10 14:59:56 -04:00
Reminder . reset_table_name
2005-09-26 17:30:12 -04:00
assert_equal Reminder . table_name , ActiveRecord :: Migrator . proper_table_name ( Reminder )
2006-07-07 06:48:43 -04:00
2005-09-26 17:30:12 -04:00
# Use the model's own prefix/suffix if a model is given
ActiveRecord :: Base . table_name_prefix = " ARprefix_ "
ActiveRecord :: Base . table_name_suffix = " _ARsuffix "
Reminder . table_name_prefix = 'prefix_'
Reminder . table_name_suffix = '_suffix'
2005-10-10 14:59:56 -04:00
Reminder . reset_table_name
2005-09-26 17:30:12 -04:00
assert_equal " prefix_reminders_suffix " , ActiveRecord :: Migrator . proper_table_name ( Reminder )
Reminder . table_name_prefix = ''
Reminder . table_name_suffix = ''
2005-10-10 14:59:56 -04:00
Reminder . reset_table_name
2006-07-07 06:48:43 -04:00
# Use AR::Base's prefix/suffix if string or symbol is given
2005-09-26 17:30:12 -04:00
ActiveRecord :: Base . table_name_prefix = " prefix_ "
ActiveRecord :: Base . table_name_suffix = " _suffix "
2005-10-10 14:59:56 -04:00
Reminder . reset_table_name
2005-09-26 17:30:12 -04:00
assert_equal " prefix_table_suffix " , ActiveRecord :: Migrator . proper_table_name ( 'table' )
assert_equal " prefix_table_suffix " , ActiveRecord :: Migrator . proper_table_name ( :table )
ActiveRecord :: Base . table_name_prefix = " "
ActiveRecord :: Base . table_name_suffix = " "
2005-10-10 14:59:56 -04:00
Reminder . reset_table_name
2006-07-07 06:48:43 -04:00
end
2005-09-26 17:30:12 -04:00
def test_add_drop_table_with_prefix_and_suffix
2005-10-28 03:40:28 -04:00
assert ! Reminder . table_exists?
2005-09-26 17:30:12 -04:00
ActiveRecord :: Base . table_name_prefix = 'prefix_'
ActiveRecord :: Base . table_name_suffix = '_suffix'
2005-10-10 14:59:56 -04:00
Reminder . reset_table_name
2005-11-12 06:59:54 -05:00
Reminder . reset_sequence_name
2005-09-26 17:30:12 -04:00
WeNeedReminders . up
assert Reminder . create ( " content " = > " hello world " , " remind_at " = > Time . now )
assert_equal " hello world " , Reminder . find ( :first ) . content
WeNeedReminders . down
assert_raises ( ActiveRecord :: StatementInvalid ) { Reminder . find ( :first ) }
2005-11-12 06:59:54 -05:00
ensure
2005-09-26 17:30:12 -04:00
ActiveRecord :: Base . table_name_prefix = ''
ActiveRecord :: Base . table_name_suffix = ''
2005-10-10 14:59:56 -04:00
Reminder . reset_table_name
2005-11-12 06:59:54 -05:00
Reminder . reset_sequence_name
2005-09-26 17:30:12 -04:00
end
2005-11-12 06:59:54 -05:00
2006-07-07 06:48:43 -04:00
# FrontBase does not support default values on BLOB/CLOB columns
2006-04-27 18:39:45 -04:00
unless current_adapter? ( :FrontBaseAdapter )
def test_create_table_with_binary_column
Person . connection . drop_table :binary_testings rescue nil
2006-07-07 06:48:43 -04:00
2006-04-27 18:39:45 -04:00
assert_nothing_raised {
Person . connection . create_table :binary_testings do | t |
t . column " data " , :binary , :default = > " " , :null = > false
end
}
2006-07-07 06:48:43 -04:00
2006-04-27 18:39:45 -04:00
columns = Person . connection . columns ( :binary_testings )
data_column = columns . detect { | c | c . name == " data " }
2006-04-04 12:33:31 -04:00
2006-04-27 18:39:45 -04:00
if current_adapter? ( :OracleAdapter )
assert_equal " empty_blob() " , data_column . default
else
assert_equal " " , data_column . default
end
2006-04-04 12:33:31 -04:00
2006-04-27 18:39:45 -04:00
Person . connection . drop_table :binary_testings rescue nil
end
2006-03-25 18:09:52 -05:00
end
2005-10-31 10:43:02 -05:00
def test_migrator_with_duplicates
assert_raises ( ActiveRecord :: DuplicateMigrationVersionError ) do
ActiveRecord :: Migrator . migrate ( File . dirname ( __FILE__ ) + '/fixtures/migrations_with_duplicate/' , nil )
end
end
2006-08-23 01:49:40 -04:00
def test_migrator_with_missing_version_numbers
ActiveRecord :: Migrator . migrate ( File . dirname ( __FILE__ ) + '/fixtures/migrations_with_missing_versions/' , 500 )
assert ! Person . column_methods_hash . include? ( :middle_name )
assert_equal 4 , ActiveRecord :: Migrator . current_version
ActiveRecord :: Migrator . migrate ( File . dirname ( __FILE__ ) + '/fixtures/migrations_with_missing_versions/' , 2 )
assert ! Reminder . table_exists?
assert Person . column_methods_hash . include? ( :last_name )
assert_equal 2 , ActiveRecord :: Migrator . current_version
end
2005-10-28 03:40:28 -04:00
end
2005-10-29 14:40:49 -04:00
end