提交 a7803190 编写于 作者: R Ryuta Kamizono

Testing `ReservedWordTest` for all adapters

`ReservedWordTest` expects that any identifiers are quoted properly.
It should be tested for all adapters.
上级 7a443756
require "cases/helper"
# a suite of tests to ensure the ConnectionAdapters#MysqlAdapter can handle tables with
# reserved word names (ie: group, order, values, etc...)
class Mysql2ReservedWordTest < ActiveRecord::Mysql2TestCase
class ReservedWordTest < ActiveRecord::TestCase
self.use_instantiated_fixtures = true
self.use_transactional_tests = false
class Group < ActiveRecord::Base
Group.table_name = "group"
belongs_to :select
......@@ -26,126 +27,106 @@ class Distinct < ActiveRecord::Base
def setup
@connection = ActiveRecord::Base.connection
# we call execute directly here (and do similar below) because ActiveRecord::Base#create_table()
# will fail with these table names if these test cases fail
create_tables_directly "group" => "id int auto_increment primary key, `order` varchar(255), select_id int",
"select" => "id int auto_increment primary key",
"values" => "id int auto_increment primary key, group_id int",
"distinct" => "id int auto_increment primary key",
"distinct_select" => "distinct_id int, select_id int"
@connection.create_table :select, force: true
@connection.create_table :distinct, force: true
@connection.create_table :distinct_select, id: false, force: true do |t|
t.belongs_to :distinct
t.belongs_to :select
end
@connection.create_table :group, force: true do |t|
t.string :order
t.belongs_to :select
end
@connection.create_table :values, force: true do |t|
t.belongs_to :group
end
end
teardown do
drop_tables_directly ["group", "select", "values", "distinct", "distinct_select", "order"]
def teardown
@connection.drop_table :select, if_exists: true
@connection.drop_table :distinct, if_exists: true
@connection.drop_table :distinct_select, if_exists: true
@connection.drop_table :group, if_exists: true
@connection.drop_table :values, if_exists: true
@connection.drop_table :order, if_exists: true
end
# create tables with reserved-word names and columns
def test_create_tables
assert_nothing_raised {
@connection.create_table :order do |t|
t.column :group, :string
end
}
assert_not @connection.table_exists?(:order)
@connection.create_table :order do |t|
t.string :group
end
assert @connection.table_exists?(:order)
end
# rename tables with reserved-word names
def test_rename_tables
assert_nothing_raised { @connection.rename_table(:group, :order) }
end
# alter column with a reserved-word name in a table with a reserved-word name
def test_change_columns
assert_nothing_raised { @connection.change_column_default(:group, :order, "whatever") }
#the quoting here will reveal any double quoting issues in change_column's interaction with the column method in the adapter
assert_nothing_raised { @connection.change_column("group", "order", :Int, default: 0) }
assert_nothing_raised { @connection.change_column("group", "order", :text, default: nil) }
assert_nothing_raised { @connection.rename_column(:group, :order, :values) }
end
# introspect table with reserved word name
def test_introspect
assert_nothing_raised { @connection.columns(:group) }
assert_nothing_raised { @connection.indexes(:group) }
assert_equal ["id", "order", "select_id"], @connection.columns(:group).map(&:name).sort
assert_equal ["index_group_on_select_id"], @connection.indexes(:group).map(&:name).sort
end
#fixtures
self.use_instantiated_fixtures = true
self.use_transactional_tests = false
#activerecord model class with reserved-word table name
def test_activerecord_model
create_test_fixtures :select, :distinct, :group, :values, :distinct_select
x = nil
assert_nothing_raised { x = Group.new }
x = Group.new
x.order = "x"
assert_nothing_raised { x.save }
x.save!
x.order = "y"
assert_nothing_raised { x.save }
assert_nothing_raised { Group.find_by_order("y") }
assert_nothing_raised { Group.find(1) }
x.save!
assert_equal x, Group.find_by_order("y")
assert_equal x, Group.find(x.id)
end
# has_one association with reserved-word table name
def test_has_one_associations
create_test_fixtures :select, :distinct, :group, :values, :distinct_select
v = nil
assert_nothing_raised { v = Group.find(1).values }
create_test_fixtures :group, :values
v = Group.find(1).values
assert_equal 2, v.id
end
# belongs_to association with reserved-word table name
def test_belongs_to_associations
create_test_fixtures :select, :distinct, :group, :values, :distinct_select
gs = nil
assert_nothing_raised { gs = Select.find(2).groups }
assert_equal gs.length, 2
assert(gs.collect(&:id).sort == [2, 3])
create_test_fixtures :select, :group
gs = Select.find(2).groups
assert_equal 2, gs.length
assert_equal [2, 3], gs.collect(&:id).sort
end
# has_and_belongs_to_many with reserved-word table name
def test_has_and_belongs_to_many
create_test_fixtures :select, :distinct, :group, :values, :distinct_select
s = nil
assert_nothing_raised { s = Distinct.find(1).selects }
assert_equal s.length, 2
assert(s.collect(&:id).sort == [1, 2])
create_test_fixtures :select, :distinct, :distinct_select
s = Distinct.find(1).selects
assert_equal 2, s.length
assert_equal [1, 2], s.collect(&:id).sort
end
# activerecord model introspection with reserved-word table and column names
def test_activerecord_introspection
assert_nothing_raised { Group.table_exists? }
assert_nothing_raised { Group.columns }
assert Group.table_exists?
assert_equal ["id", "order", "select_id"], Group.columns.map(&:name).sort
end
# Calculations
def test_calculations_work_with_reserved_words
assert_nothing_raised { Group.count }
create_test_fixtures :group
assert_equal 3, Group.count
end
def test_associations_work_with_reserved_words
assert_nothing_raised { Select.all.merge!(includes: [:groups]).to_a }
create_test_fixtures :select, :group
selects = Select.all.merge!(includes: [:groups]).to_a
assert_no_queries do
selects.each { |select| select.groups }
end
end
#the following functions were added to DRY test cases
private
# custom fixture loader, uses FixtureSet#create_fixtures and appends base_path to the current file's path
def create_test_fixtures(*fixture_names)
ActiveRecord::FixtureSet.create_fixtures(FIXTURES_ROOT + "/reserved_words", fixture_names)
end
# custom drop table, uses execute on connection to drop a table if it exists. note: escapes table_name
def drop_tables_directly(table_names, connection = @connection)
table_names.each do |name|
connection.drop_table name, if_exists: true
end
end
# custom create table, uses execute on connection to create a table, note: escapes table_name, does NOT escape columns
def create_tables_directly(tables, connection = @connection)
tables.each do |table_name, column_properties|
connection.execute("CREATE TABLE `#{table_name}` ( #{column_properties} )")
end
end
end
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册