diff options
author | David Heinemeier Hansson <david@loudthinking.com> | 2005-02-20 21:21:41 +0000 |
---|---|---|
committer | David Heinemeier Hansson <david@loudthinking.com> | 2005-02-20 21:21:41 +0000 |
commit | 101968f3674dfedb0549a54bf6407c287d357f0a (patch) | |
tree | f619811941d11d5b59db39f4d4152759eeacb4a7 /activerecord | |
parent | 8322ea45c1087325fd428a201749791550bc7859 (diff) | |
download | rails-101968f3674dfedb0549a54bf6407c287d357f0a.tar.gz rails-101968f3674dfedb0549a54bf6407c287d357f0a.tar.bz2 rails-101968f3674dfedb0549a54bf6407c287d357f0a.zip |
Added automatic dropping/creating of test tables for running the unit tests on all databases #587 [adelle@bullet.net.au]
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@719 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
Diffstat (limited to 'activerecord')
28 files changed, 200 insertions, 5 deletions
diff --git a/activerecord/CHANGELOG b/activerecord/CHANGELOG index fddfb5ef0b..dafc6a05e1 100644 --- a/activerecord/CHANGELOG +++ b/activerecord/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Added automatic dropping/creating of test tables for running the unit tests on all databases #587 [adelle@bullet.net.au] + * Fixed that find_by_* would fail when column names had numbers #670 [demetrius] * Fixed the SQL Server adapter on a bunch of issues #667 [DeLynn] diff --git a/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb b/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb index 6a9ca8fcf1..5d2c764afe 100755 --- a/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb @@ -356,6 +356,11 @@ module ActiveRecord name end + # Returns the human-readable name of the adapter. Use mixed case - one can always use downcase if needed. + def adapter_name() + 'Abstract' + end + # Returns a string of the CREATE TABLE SQL statements for recreating the entire structure of the database. def structure_dump() end diff --git a/activerecord/lib/active_record/connection_adapters/db2_adapter.rb b/activerecord/lib/active_record/connection_adapters/db2_adapter.rb index 867b17eaa0..225ade0441 100644 --- a/activerecord/lib/active_record/connection_adapters/db2_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/db2_adapter.rb @@ -74,6 +74,10 @@ begin def quote_column_name(name) name; end + def adapter_name() + 'DB2' + end + def quote_string(s) s.gsub(/'/, "''") # ' (for ruby-mode) end diff --git a/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb b/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb index 645e5f6dd4..c637a50c5a 100755 --- a/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb @@ -102,7 +102,11 @@ module ActiveRecord def quote_column_name(name) return "`#{name}`" end - + + def adapter_name() + 'MySQL' + end + def structure_dump select_all("SHOW TABLES").inject("") do |structure, table| structure += select_one("SHOW CREATE TABLE #{table.to_a.first.last}")["Create Table"] + ";\n\n" diff --git a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb b/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb index ef939d747b..67b26739ca 100644 --- a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb @@ -89,6 +89,10 @@ module ActiveRecord return "\"#{name}\"" end + def adapter_name() + 'PostgreSQL' + end + private def last_insert_id(table, column = "id") sequence_name = "#{table}_#{column || 'id'}_seq" diff --git a/activerecord/lib/active_record/connection_adapters/sqlite_adapter.rb b/activerecord/lib/active_record/connection_adapters/sqlite_adapter.rb index b8a91929c7..d8f3e04498 100644 --- a/activerecord/lib/active_record/connection_adapters/sqlite_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/sqlite_adapter.rb @@ -141,6 +141,10 @@ module ActiveRecord return "'#{name}'" end + def adapter_name() + 'SQLite' + end + protected def table_structure(table_name) execute "PRAGMA table_info(#{table_name})" diff --git a/activerecord/lib/active_record/connection_adapters/sqlserver_adapter.rb b/activerecord/lib/active_record/connection_adapters/sqlserver_adapter.rb index 84293736e3..7bddba9b5b 100644 --- a/activerecord/lib/active_record/connection_adapters/sqlserver_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/sqlserver_adapter.rb @@ -43,6 +43,10 @@ module ActiveRecord raise ArgumentError, "No database specified. Missing argument: database." end + def adapter_name() + 'SqlServer' + end + conn = DBI.connect("DBI:ADO:Provider=SQLOLEDB;Data Source=#{host};Initial Catalog=#{database};User Id=#{username};Password=#{password};") conn["AutoCommit"] = true diff --git a/activerecord/test/aaa_create_tables_test.rb b/activerecord/test/aaa_create_tables_test.rb new file mode 100644 index 0000000000..ba14199d31 --- /dev/null +++ b/activerecord/test/aaa_create_tables_test.rb @@ -0,0 +1,58 @@ +require 'abstract_unit' + +# The filename for this test begins with "aaa" so that +# it will be the first test. + +class SqlFile < File + #Define an iterator that iterates over the statements in a .sql file. + #statements are separated by a semicolon. + def initialize(path) + super(path) + end + + def each_statement() + statement = '' + each_line { |line| + #The last character of each line is a line-feed, so we will check the next-to-last character + #to see if it is a semicolon. A better way of doing this would be to look for a semicolon anywhere + #within the line in case multiple statements have been put on a single line. + #The last statement in the file must be followed by a line-feed. + if line.slice(-2,1)==';' then + statement = statement + line.slice(0,line.length-2) + "\n" + yield statement + statement = '' + else + statement = statement + line + end + } + end +end + +class CreateTablesTest < Test::Unit::TestCase + def setup + # This method is required by rake. + end + + def run_sql_file(connection, path) + sql_file = SqlFile.new(path) + sql_file.each_statement { |statement| + begin + #Skip errors. If there is a problem creating the tables then it will show up in other tests. + connection.execute(statement) + rescue ActiveRecord::StatementInvalid + end } + end + + def test_table_creation + adapter_name = ActiveRecord::Base.connection.adapter_name.downcase + run_sql_file ActiveRecord::Base.connection, "test/fixtures/db_definitions/" + adapter_name + ".drop.sql" + run_sql_file ActiveRecord::Base.connection, "test/fixtures/db_definitions/" + adapter_name + ".sql" + + # Now do the same thing with the connection used by multiple_db_test.rb + adapter_name = Course.retrieve_connection.adapter_name.downcase + run_sql_file Course.retrieve_connection, "test/fixtures/db_definitions/" + adapter_name + "2.drop.sql" + run_sql_file Course.retrieve_connection, "test/fixtures/db_definitions/" + adapter_name + "2.sql" + + assert_equal 1,1 + end +end diff --git a/activerecord/test/fixtures/db_definitions/db2.drop.sql b/activerecord/test/fixtures/db_definitions/db2.drop.sql new file mode 100644 index 0000000000..1f611c8d5a --- /dev/null +++ b/activerecord/test/fixtures/db_definitions/db2.drop.sql @@ -0,0 +1,18 @@ +DROP TABLE accounts; +DROP TABLE companies; +DROP TABLE topics; +DROP TABLE developers; +DROP TABLE projects; +DROP TABLE developers_projects; +DROP TABLE customers; +DROP TABLE movies; +DROP TABLE subscribers; +DROP TABLE booleantests; +DROP TABLE auto_id_tests; +DROP TABLE entrants; +DROP TABLE colnametests; +DROP TABLE mixins; +DROP TABLE people; +DROP TABLE binaries; +DROP TABLE computers; + diff --git a/activerecord/test/fixtures/db_definitions/db2.sql b/activerecord/test/fixtures/db_definitions/db2.sql index 033efcb088..46e326d504 100644 --- a/activerecord/test/fixtures/db_definitions/db2.sql +++ b/activerecord/test/fixtures/db_definitions/db2.sql @@ -127,3 +127,4 @@ CREATE TABLE computers ( id int generated by default as identity (start with +10000), developer int NOT NULL ); + diff --git a/activerecord/test/fixtures/db_definitions/db22.drop.sql b/activerecord/test/fixtures/db_definitions/db22.drop.sql new file mode 100644 index 0000000000..df00ffd7c9 --- /dev/null +++ b/activerecord/test/fixtures/db_definitions/db22.drop.sql @@ -0,0 +1,2 @@ +DROP TABLE courses; + diff --git a/activerecord/test/fixtures/db_definitions/db22.sql b/activerecord/test/fixtures/db_definitions/db22.sql index dc4f9ed364..9198cf5f6e 100644 --- a/activerecord/test/fixtures/db_definitions/db22.sql +++ b/activerecord/test/fixtures/db_definitions/db22.sql @@ -2,3 +2,4 @@ CREATE TABLE courses ( id int NOT NULL PRIMARY KEY, name varchar(255) NOT NULL ); + diff --git a/activerecord/test/fixtures/db_definitions/mysql.drop.sql b/activerecord/test/fixtures/db_definitions/mysql.drop.sql new file mode 100644 index 0000000000..1f611c8d5a --- /dev/null +++ b/activerecord/test/fixtures/db_definitions/mysql.drop.sql @@ -0,0 +1,18 @@ +DROP TABLE accounts; +DROP TABLE companies; +DROP TABLE topics; +DROP TABLE developers; +DROP TABLE projects; +DROP TABLE developers_projects; +DROP TABLE customers; +DROP TABLE movies; +DROP TABLE subscribers; +DROP TABLE booleantests; +DROP TABLE auto_id_tests; +DROP TABLE entrants; +DROP TABLE colnametests; +DROP TABLE mixins; +DROP TABLE people; +DROP TABLE binaries; +DROP TABLE computers; + diff --git a/activerecord/test/fixtures/db_definitions/mysql.sql b/activerecord/test/fixtures/db_definitions/mysql.sql index 0137cd91d5..1064373f7f 100755 --- a/activerecord/test/fixtures/db_definitions/mysql.sql +++ b/activerecord/test/fixtures/db_definitions/mysql.sql @@ -126,4 +126,5 @@ CREATE TABLE `binaries` ( CREATE TABLE `computers` ( `id` INTEGER NOT NULL PRIMARY KEY, `developer` INTEGER NOT NULL -);
\ No newline at end of file +); + diff --git a/activerecord/test/fixtures/db_definitions/mysql2.drop.sql b/activerecord/test/fixtures/db_definitions/mysql2.drop.sql new file mode 100644 index 0000000000..df00ffd7c9 --- /dev/null +++ b/activerecord/test/fixtures/db_definitions/mysql2.drop.sql @@ -0,0 +1,2 @@ +DROP TABLE courses; + diff --git a/activerecord/test/fixtures/db_definitions/mysql2.sql b/activerecord/test/fixtures/db_definitions/mysql2.sql index 0a16a0a2f9..551e0ecc7d 100644 --- a/activerecord/test/fixtures/db_definitions/mysql2.sql +++ b/activerecord/test/fixtures/db_definitions/mysql2.sql @@ -2,3 +2,4 @@ CREATE TABLE `courses` ( `id` INTEGER NOT NULL PRIMARY KEY, `name` VARCHAR(255) NOT NULL ); + diff --git a/activerecord/test/fixtures/db_definitions/postgresql.drop.sql b/activerecord/test/fixtures/db_definitions/postgresql.drop.sql new file mode 100644 index 0000000000..1f611c8d5a --- /dev/null +++ b/activerecord/test/fixtures/db_definitions/postgresql.drop.sql @@ -0,0 +1,18 @@ +DROP TABLE accounts; +DROP TABLE companies; +DROP TABLE topics; +DROP TABLE developers; +DROP TABLE projects; +DROP TABLE developers_projects; +DROP TABLE customers; +DROP TABLE movies; +DROP TABLE subscribers; +DROP TABLE booleantests; +DROP TABLE auto_id_tests; +DROP TABLE entrants; +DROP TABLE colnametests; +DROP TABLE mixins; +DROP TABLE people; +DROP TABLE binaries; +DROP TABLE computers; + diff --git a/activerecord/test/fixtures/db_definitions/postgresql.sql b/activerecord/test/fixtures/db_definitions/postgresql.sql index 7664c5e6e0..f779027286 100644 --- a/activerecord/test/fixtures/db_definitions/postgresql.sql +++ b/activerecord/test/fixtures/db_definitions/postgresql.sql @@ -144,4 +144,5 @@ CREATE TABLE binaries ( CREATE TABLE computers ( id serial, developer integer NOT NULL -);
\ No newline at end of file +); + diff --git a/activerecord/test/fixtures/db_definitions/postgresql2.drop.sql b/activerecord/test/fixtures/db_definitions/postgresql2.drop.sql new file mode 100644 index 0000000000..df00ffd7c9 --- /dev/null +++ b/activerecord/test/fixtures/db_definitions/postgresql2.drop.sql @@ -0,0 +1,2 @@ +DROP TABLE courses; + diff --git a/activerecord/test/fixtures/db_definitions/postgresql2.sql b/activerecord/test/fixtures/db_definitions/postgresql2.sql index b58a45eff7..c0d7f79b04 100644 --- a/activerecord/test/fixtures/db_definitions/postgresql2.sql +++ b/activerecord/test/fixtures/db_definitions/postgresql2.sql @@ -1,4 +1,5 @@ CREATE TABLE courses ( id serial, name text -);
\ No newline at end of file +); + diff --git a/activerecord/test/fixtures/db_definitions/sqlite.drop.sql b/activerecord/test/fixtures/db_definitions/sqlite.drop.sql new file mode 100644 index 0000000000..1f611c8d5a --- /dev/null +++ b/activerecord/test/fixtures/db_definitions/sqlite.drop.sql @@ -0,0 +1,18 @@ +DROP TABLE accounts; +DROP TABLE companies; +DROP TABLE topics; +DROP TABLE developers; +DROP TABLE projects; +DROP TABLE developers_projects; +DROP TABLE customers; +DROP TABLE movies; +DROP TABLE subscribers; +DROP TABLE booleantests; +DROP TABLE auto_id_tests; +DROP TABLE entrants; +DROP TABLE colnametests; +DROP TABLE mixins; +DROP TABLE people; +DROP TABLE binaries; +DROP TABLE computers; + diff --git a/activerecord/test/fixtures/db_definitions/sqlite.sql b/activerecord/test/fixtures/db_definitions/sqlite.sql index 1b9a5ea932..988973b0ff 100644 --- a/activerecord/test/fixtures/db_definitions/sqlite.sql +++ b/activerecord/test/fixtures/db_definitions/sqlite.sql @@ -113,4 +113,5 @@ CREATE TABLE 'binaries' ( CREATE TABLE 'computers' ( 'id' INTEGER NOT NULL PRIMARY KEY, 'developer' INTEGER NOT NULL -);
\ No newline at end of file +); + diff --git a/activerecord/test/fixtures/db_definitions/sqlite2.drop.sql b/activerecord/test/fixtures/db_definitions/sqlite2.drop.sql new file mode 100644 index 0000000000..df00ffd7c9 --- /dev/null +++ b/activerecord/test/fixtures/db_definitions/sqlite2.drop.sql @@ -0,0 +1,2 @@ +DROP TABLE courses; + diff --git a/activerecord/test/fixtures/db_definitions/sqlite2.sql b/activerecord/test/fixtures/db_definitions/sqlite2.sql index 19b123968a..5c0d231bbc 100644 --- a/activerecord/test/fixtures/db_definitions/sqlite2.sql +++ b/activerecord/test/fixtures/db_definitions/sqlite2.sql @@ -2,3 +2,4 @@ CREATE TABLE 'courses' ( 'id' INTEGER NOT NULL PRIMARY KEY, 'name' VARCHAR(255) NOT NULL ); + diff --git a/activerecord/test/fixtures/db_definitions/sqlserver.drop.sql b/activerecord/test/fixtures/db_definitions/sqlserver.drop.sql new file mode 100644 index 0000000000..1f611c8d5a --- /dev/null +++ b/activerecord/test/fixtures/db_definitions/sqlserver.drop.sql @@ -0,0 +1,18 @@ +DROP TABLE accounts; +DROP TABLE companies; +DROP TABLE topics; +DROP TABLE developers; +DROP TABLE projects; +DROP TABLE developers_projects; +DROP TABLE customers; +DROP TABLE movies; +DROP TABLE subscribers; +DROP TABLE booleantests; +DROP TABLE auto_id_tests; +DROP TABLE entrants; +DROP TABLE colnametests; +DROP TABLE mixins; +DROP TABLE people; +DROP TABLE binaries; +DROP TABLE computers; + diff --git a/activerecord/test/fixtures/db_definitions/sqlserver.sql b/activerecord/test/fixtures/db_definitions/sqlserver.sql index 95106a7b18..743a5383fe 100644 --- a/activerecord/test/fixtures/db_definitions/sqlserver.sql +++ b/activerecord/test/fixtures/db_definitions/sqlserver.sql @@ -127,3 +127,4 @@ CREATE TABLE computers ( developer int NOT NULL, PRIMARY KEY (id) ); + diff --git a/activerecord/test/fixtures/db_definitions/sqlserver2.drop.sql b/activerecord/test/fixtures/db_definitions/sqlserver2.drop.sql new file mode 100644 index 0000000000..df00ffd7c9 --- /dev/null +++ b/activerecord/test/fixtures/db_definitions/sqlserver2.drop.sql @@ -0,0 +1,2 @@ +DROP TABLE courses; + diff --git a/activerecord/test/fixtures/db_definitions/sqlserver2.sql b/activerecord/test/fixtures/db_definitions/sqlserver2.sql index dc4f9ed364..9198cf5f6e 100644 --- a/activerecord/test/fixtures/db_definitions/sqlserver2.sql +++ b/activerecord/test/fixtures/db_definitions/sqlserver2.sql @@ -2,3 +2,4 @@ CREATE TABLE courses ( id int NOT NULL PRIMARY KEY, name varchar(255) NOT NULL ); + |