1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
|
# frozen_string_literal: true
require "cases/helper"
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
has_one :values
end
class Select < ActiveRecord::Base
Select.table_name = "select"
has_many :groups
end
class Values < ActiveRecord::Base
Values.table_name = "values"
end
class Distinct < ActiveRecord::Base
Distinct.table_name = "distinct"
has_and_belongs_to_many :selects
has_many :values, through: :groups
end
def setup
@connection = ActiveRecord::Base.connection
@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, primary_key: :as, force: true do |t|
t.belongs_to :group
end
end
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
def test_create_tables
assert_not @connection.table_exists?(:order)
@connection.create_table :order do |t|
t.string :group
end
assert @connection.table_exists?(:order)
end
def test_rename_tables
assert_nothing_raised { @connection.rename_table(:group, :order) }
end
def test_change_columns
assert_nothing_raised { @connection.change_column_default(:group, :order, "whatever") }
assert_nothing_raised { @connection.change_column("group", "order", :text, default: nil) }
assert_nothing_raised { @connection.rename_column(:group, :order, :values) }
end
def test_introspect
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
def test_activerecord_model
x = Group.new
x.order = "x"
x.save!
x.order = "y"
x.save!
assert_equal x, Group.find_by_order("y")
assert_equal x, Group.find(x.id)
end
def test_delete_all_with_subselect
create_test_fixtures :values
assert_equal 1, Values.order(:as).limit(1).offset(1).delete_all
assert_raise(ActiveRecord::RecordNotFound) { Values.find(2) }
assert Values.find(1)
end
def test_has_one_associations
create_test_fixtures :group, :values
v = Group.find(1).values
assert_equal 2, v.id
end
def test_belongs_to_associations
create_test_fixtures :select, :group
gs = Select.find(2).groups
assert_equal 2, gs.length
assert_equal [2, 3], gs.collect(&:id).sort
end
def test_has_and_belongs_to_many
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
def test_activerecord_introspection
assert_predicate Group, :table_exists?
assert_equal ["id", "order", "select_id"], Group.columns.map(&:name).sort
end
def test_calculations_work_with_reserved_words
create_test_fixtures :group
assert_equal 3, Group.count
end
def test_associations_work_with_reserved_words
create_test_fixtures :select, :group
selects = Select.all.merge!(includes: [:groups]).to_a
assert_no_queries do
selects.each { |select| select.groups }
end
end
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
end
|