-
Notifications
You must be signed in to change notification settings - Fork 563
/
Copy pathrake_test_sqlserver.rb
169 lines (129 loc) · 4.73 KB
/
rake_test_sqlserver.rb
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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
require 'cases/helper_sqlserver'
class SQLServerRakeTest < ActiveRecord::TestCase
self.use_transactional_tests = false
cattr_accessor :azure_skip
self.azure_skip = connection_sqlserver_azure?
let(:db_tasks) { ActiveRecord::Tasks::DatabaseTasks }
let(:new_database) { 'activerecord_unittest_tasks' }
let(:default_configuration) { ARTest.connection_config['arunit'] }
let(:configuration) { default_configuration.merge('database' => new_database) }
before { skip 'on azure' if azure_skip }
before { disconnect! unless azure_skip }
after { reconnect unless azure_skip }
private
def disconnect!
connection.disconnect!
end
def reconnect
config = default_configuration
if connection_sqlserver_azure?
ActiveRecord::Base.establish_connection(config.merge('database' => 'master'))
connection.drop_database(new_database) rescue nil
disconnect!
ActiveRecord::Base.establish_connection(config)
else
ActiveRecord::Base.establish_connection(config)
connection.drop_database(new_database) rescue nil
end
end
end
class SQLServerRakeCreateTest < SQLServerRakeTest
self.azure_skip = false
it 'establishes connection to database after create ' do
quietly { db_tasks.create configuration }
connection.current_database.must_equal(new_database)
end
it 'creates database with default collation' do
quietly { db_tasks.create configuration }
connection.collation.must_equal 'SQL_Latin1_General_CP1_CI_AS'
end
it 'creates database with given collation' do
quietly { db_tasks.create configuration.merge('collation' => 'Latin1_General_CI_AS') }
connection.collation.must_equal 'Latin1_General_CI_AS'
end
it 'prints error message when database exists' do
quietly { db_tasks.create configuration }
message = capture(:stderr) { db_tasks.create configuration }
message.must_match %r{activerecord_unittest_tasks.*already exists}
end
end
class SQLServerRakeDropTest < SQLServerRakeTest
self.azure_skip = false
it 'drops database and uses master' do
quietly do
db_tasks.create configuration
db_tasks.drop configuration
end
connection.current_database.must_equal 'master'
end
it 'prints error message when database does not exist' do
message = capture(:stderr) { db_tasks.drop configuration.merge('database' => 'doesnotexist') }
message.must_match %r{'doesnotexist' does not exist}
end
end
class SQLServerRakePurgeTest < SQLServerRakeTest
before do
quietly { db_tasks.create(configuration) }
connection.create_table :users, force: true do |t|
t.string :name, :email
t.timestamps null: false
end
end
it 'clears active connections, drops database, and recreates with established connection' do
connection.current_database.must_equal(new_database)
connection.tables.must_include 'users'
quietly { db_tasks.purge(configuration) }
connection.current_database.must_equal(new_database)
connection.tables.wont_include 'users'
end
end
class SQLServerRakeCharsetTest < SQLServerRakeTest
before do
quietly { db_tasks.create(configuration) }
end
it 'retrieves charset' do
db_tasks.charset(configuration).must_equal 'iso_1'
end
end
class SQLServerRakeCollationTest < SQLServerRakeTest
before do
quietly { db_tasks.create(configuration) }
end
it 'retrieves collation' do
db_tasks.collation(configuration).must_equal 'SQL_Latin1_General_CP1_CI_AS'
end
end
class SQLServerRakeStructureDumpLoadTest < SQLServerRakeTest
let(:filename) { File.join ARTest::SQLServer.migrations_root, 'structure.sql' }
let(:filedata) { File.read(filename) }
before do
quietly { db_tasks.create(configuration) }
connection.create_table :users, force: true do |t|
t.string :name, :email
t.text :background1
t.text_basic :background2
t.timestamps null: false
end
end
after do
FileUtils.rm_rf(filename)
end
it 'dumps structure and accounts for defncopy oddities' do
skip 'debug defncopy on windows later' if host_windows?
quietly { db_tasks.structure_dump configuration, filename }
filedata.wont_match %r{\AUSE.*\z}
filedata.wont_match %r{\AGO.*\z}
filedata.must_match %r{email\s+nvarchar\(4000\)}
filedata.must_match %r{background1\s+nvarchar\(max\)}
filedata.must_match %r{background2\s+text\s+}
end
it 'can load dumped structure' do
skip 'debug defncopy on windows later' if host_windows?
quietly { db_tasks.structure_dump configuration, filename }
filedata.must_match %r{CREATE TABLE dbo\.users}
db_tasks.purge(configuration)
connection.tables.wont_include 'users'
db_tasks.load_schema configuration, :sql, filename
connection.tables.must_include 'users'
end
end