activerecord-sqlserver-adapter 5.2.0.rc2 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (152) hide show
  1. checksums.yaml +4 -4
  2. data/.editorconfig +9 -0
  3. data/.github/issue_template.md +23 -0
  4. data/.gitignore +1 -0
  5. data/.rubocop.yml +29 -0
  6. data/.travis.yml +6 -8
  7. data/CHANGELOG.md +42 -9
  8. data/{Dockerfile → Dockerfile.ci} +2 -2
  9. data/Gemfile +48 -41
  10. data/Guardfile +9 -8
  11. data/README.md +9 -37
  12. data/RUNNING_UNIT_TESTS.md +3 -0
  13. data/Rakefile +14 -16
  14. data/VERSION +1 -1
  15. data/activerecord-sqlserver-adapter.gemspec +25 -14
  16. data/appveyor.yml +24 -17
  17. data/docker-compose.ci.yml +7 -5
  18. data/guides/RELEASING.md +11 -0
  19. data/lib/active_record/connection_adapters/sqlserver/core_ext/active_record.rb +2 -4
  20. data/lib/active_record/connection_adapters/sqlserver/core_ext/attribute_methods.rb +3 -4
  21. data/lib/active_record/connection_adapters/sqlserver/core_ext/calculations.rb +22 -2
  22. data/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb +3 -3
  23. data/lib/active_record/connection_adapters/sqlserver/core_ext/explain_subscriber.rb +2 -0
  24. data/lib/active_record/connection_adapters/sqlserver/core_ext/finder_methods.rb +44 -0
  25. data/lib/active_record/connection_adapters/sqlserver/core_ext/preloader.rb +36 -0
  26. data/lib/active_record/connection_adapters/sqlserver/core_ext/query_methods.rb +28 -0
  27. data/lib/active_record/connection_adapters/sqlserver/database_limits.rb +9 -0
  28. data/lib/active_record/connection_adapters/sqlserver/database_statements.rb +89 -44
  29. data/lib/active_record/connection_adapters/sqlserver/database_tasks.rb +10 -12
  30. data/lib/active_record/connection_adapters/sqlserver/errors.rb +2 -3
  31. data/lib/active_record/connection_adapters/sqlserver/quoting.rb +46 -8
  32. data/lib/active_record/connection_adapters/sqlserver/schema_creation.rb +16 -5
  33. data/lib/active_record/connection_adapters/sqlserver/schema_dumper.rb +9 -7
  34. data/lib/active_record/connection_adapters/sqlserver/schema_statements.rb +196 -165
  35. data/lib/active_record/connection_adapters/sqlserver/showplan.rb +8 -8
  36. data/lib/active_record/connection_adapters/sqlserver/showplan/printer_table.rb +4 -2
  37. data/lib/active_record/connection_adapters/sqlserver/showplan/printer_xml.rb +3 -1
  38. data/lib/active_record/connection_adapters/sqlserver/sql_type_metadata.rb +2 -2
  39. data/lib/active_record/connection_adapters/sqlserver/table_definition.rb +43 -44
  40. data/lib/active_record/connection_adapters/sqlserver/transaction.rb +7 -9
  41. data/lib/active_record/connection_adapters/sqlserver/type.rb +37 -35
  42. data/lib/active_record/connection_adapters/sqlserver/type/big_integer.rb +3 -3
  43. data/lib/active_record/connection_adapters/sqlserver/type/binary.rb +5 -4
  44. data/lib/active_record/connection_adapters/sqlserver/type/boolean.rb +3 -3
  45. data/lib/active_record/connection_adapters/sqlserver/type/char.rb +7 -4
  46. data/lib/active_record/connection_adapters/sqlserver/type/data.rb +2 -2
  47. data/lib/active_record/connection_adapters/sqlserver/type/date.rb +4 -3
  48. data/lib/active_record/connection_adapters/sqlserver/type/datetime.rb +8 -8
  49. data/lib/active_record/connection_adapters/sqlserver/type/datetime2.rb +2 -2
  50. data/lib/active_record/connection_adapters/sqlserver/type/datetimeoffset.rb +2 -2
  51. data/lib/active_record/connection_adapters/sqlserver/type/decimal.rb +5 -4
  52. data/lib/active_record/connection_adapters/sqlserver/type/float.rb +3 -3
  53. data/lib/active_record/connection_adapters/sqlserver/type/integer.rb +3 -3
  54. data/lib/active_record/connection_adapters/sqlserver/type/json.rb +2 -1
  55. data/lib/active_record/connection_adapters/sqlserver/type/money.rb +4 -4
  56. data/lib/active_record/connection_adapters/sqlserver/type/real.rb +3 -3
  57. data/lib/active_record/connection_adapters/sqlserver/type/small_integer.rb +3 -3
  58. data/lib/active_record/connection_adapters/sqlserver/type/small_money.rb +4 -4
  59. data/lib/active_record/connection_adapters/sqlserver/type/smalldatetime.rb +3 -3
  60. data/lib/active_record/connection_adapters/sqlserver/type/string.rb +2 -2
  61. data/lib/active_record/connection_adapters/sqlserver/type/text.rb +3 -3
  62. data/lib/active_record/connection_adapters/sqlserver/type/time.rb +6 -6
  63. data/lib/active_record/connection_adapters/sqlserver/type/time_value_fractional.rb +8 -9
  64. data/lib/active_record/connection_adapters/sqlserver/type/timestamp.rb +3 -3
  65. data/lib/active_record/connection_adapters/sqlserver/type/tiny_integer.rb +3 -3
  66. data/lib/active_record/connection_adapters/sqlserver/type/unicode_char.rb +5 -4
  67. data/lib/active_record/connection_adapters/sqlserver/type/unicode_string.rb +2 -2
  68. data/lib/active_record/connection_adapters/sqlserver/type/unicode_text.rb +3 -3
  69. data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar.rb +6 -5
  70. data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar_max.rb +4 -4
  71. data/lib/active_record/connection_adapters/sqlserver/type/uuid.rb +4 -3
  72. data/lib/active_record/connection_adapters/sqlserver/type/varbinary.rb +6 -5
  73. data/lib/active_record/connection_adapters/sqlserver/type/varbinary_max.rb +4 -4
  74. data/lib/active_record/connection_adapters/sqlserver/type/varchar.rb +6 -5
  75. data/lib/active_record/connection_adapters/sqlserver/type/varchar_max.rb +4 -4
  76. data/lib/active_record/connection_adapters/sqlserver/utils.rb +10 -11
  77. data/lib/active_record/connection_adapters/sqlserver/version.rb +2 -2
  78. data/lib/active_record/connection_adapters/sqlserver_adapter.rb +132 -92
  79. data/lib/active_record/connection_adapters/sqlserver_column.rb +9 -5
  80. data/lib/active_record/sqlserver_base.rb +9 -1
  81. data/lib/active_record/tasks/sqlserver_database_tasks.rb +28 -32
  82. data/lib/activerecord-sqlserver-adapter.rb +3 -1
  83. data/lib/arel/visitors/sqlserver.rb +58 -24
  84. data/lib/arel_sqlserver.rb +4 -2
  85. data/test/appveyor/dbsetup.ps1 +4 -4
  86. data/test/cases/adapter_test_sqlserver.rb +223 -180
  87. data/test/cases/change_column_null_test_sqlserver.rb +17 -15
  88. data/test/cases/coerced_tests.rb +654 -360
  89. data/test/cases/column_test_sqlserver.rb +635 -604
  90. data/test/cases/connection_test_sqlserver.rb +18 -21
  91. data/test/cases/execute_procedure_test_sqlserver.rb +20 -20
  92. data/test/cases/fetch_test_sqlserver.rb +17 -23
  93. data/test/cases/fully_qualified_identifier_test_sqlserver.rb +15 -19
  94. data/test/cases/helper_sqlserver.rb +20 -15
  95. data/test/cases/in_clause_test_sqlserver.rb +36 -0
  96. data/test/cases/index_test_sqlserver.rb +15 -15
  97. data/test/cases/json_test_sqlserver.rb +25 -25
  98. data/test/cases/migration_test_sqlserver.rb +30 -26
  99. data/test/cases/order_test_sqlserver.rb +53 -54
  100. data/test/cases/pessimistic_locking_test_sqlserver.rb +31 -37
  101. data/test/cases/rake_test_sqlserver.rb +44 -56
  102. data/test/cases/schema_dumper_test_sqlserver.rb +112 -113
  103. data/test/cases/schema_test_sqlserver.rb +20 -26
  104. data/test/cases/scratchpad_test_sqlserver.rb +4 -4
  105. data/test/cases/showplan_test_sqlserver.rb +32 -39
  106. data/test/cases/specific_schema_test_sqlserver.rb +75 -72
  107. data/test/cases/transaction_test_sqlserver.rb +27 -29
  108. data/test/cases/trigger_test_sqlserver.rb +18 -17
  109. data/test/cases/utils_test_sqlserver.rb +78 -78
  110. data/test/cases/uuid_test_sqlserver.rb +19 -20
  111. data/test/debug.rb +8 -6
  112. data/test/migrations/create_clients_and_change_column_null.rb +3 -1
  113. data/test/migrations/transaction_table/1_table_will_never_be_created.rb +4 -4
  114. data/test/models/sqlserver/booking.rb +3 -1
  115. data/test/models/sqlserver/customers_view.rb +3 -1
  116. data/test/models/sqlserver/datatype.rb +2 -0
  117. data/test/models/sqlserver/datatype_migration.rb +2 -0
  118. data/test/models/sqlserver/dollar_table_name.rb +3 -1
  119. data/test/models/sqlserver/edge_schema.rb +3 -3
  120. data/test/models/sqlserver/fk_has_fk.rb +3 -1
  121. data/test/models/sqlserver/fk_has_pk.rb +3 -1
  122. data/test/models/sqlserver/natural_pk_data.rb +4 -2
  123. data/test/models/sqlserver/natural_pk_int_data.rb +3 -1
  124. data/test/models/sqlserver/no_pk_data.rb +3 -1
  125. data/test/models/sqlserver/object_default.rb +3 -1
  126. data/test/models/sqlserver/quoted_table.rb +4 -2
  127. data/test/models/sqlserver/quoted_view_1.rb +3 -1
  128. data/test/models/sqlserver/quoted_view_2.rb +3 -1
  129. data/test/models/sqlserver/sst_memory.rb +3 -1
  130. data/test/models/sqlserver/string_default.rb +3 -1
  131. data/test/models/sqlserver/string_defaults_big_view.rb +3 -1
  132. data/test/models/sqlserver/string_defaults_view.rb +3 -1
  133. data/test/models/sqlserver/tinyint_pk.rb +3 -1
  134. data/test/models/sqlserver/trigger.rb +4 -2
  135. data/test/models/sqlserver/trigger_history.rb +3 -1
  136. data/test/models/sqlserver/upper.rb +3 -1
  137. data/test/models/sqlserver/uppered.rb +3 -1
  138. data/test/models/sqlserver/uuid.rb +3 -1
  139. data/test/schema/datatypes/2012.sql +1 -0
  140. data/test/schema/sqlserver_specific_schema.rb +22 -22
  141. data/test/support/coerceable_test_sqlserver.rb +15 -9
  142. data/test/support/connection_reflection.rb +3 -2
  143. data/test/support/core_ext/query_cache.rb +4 -1
  144. data/test/support/load_schema_sqlserver.rb +5 -5
  145. data/test/support/minitest_sqlserver.rb +3 -1
  146. data/test/support/paths_sqlserver.rb +11 -11
  147. data/test/support/rake_helpers.rb +13 -10
  148. data/test/support/sql_counter_sqlserver.rb +3 -4
  149. data/test/support/test_in_memory_oltp.rb +9 -7
  150. metadata +22 -12
  151. data/BACKERS.md +0 -32
  152. data/circle.yml +0 -38
@@ -1,18 +1,19 @@
1
- require 'cases/helper_sqlserver'
1
+ # frozen_string_literal: true
2
2
 
3
- class SQLServerRakeTest < ActiveRecord::TestCase
3
+ require "cases/helper_sqlserver"
4
4
 
5
+ class SQLServerRakeTest < ActiveRecord::TestCase
5
6
  self.use_transactional_tests = false
6
7
 
7
8
  cattr_accessor :azure_skip
8
9
  self.azure_skip = connection_sqlserver_azure?
9
10
 
10
11
  let(:db_tasks) { ActiveRecord::Tasks::DatabaseTasks }
11
- let(:new_database) { 'activerecord_unittest_tasks' }
12
- let(:default_configuration) { ARTest.connection_config['arunit'] }
13
- let(:configuration) { default_configuration.merge('database' => new_database) }
12
+ let(:new_database) { "activerecord_unittest_tasks" }
13
+ let(:default_configuration) { ARTest.connection_config["arunit"] }
14
+ let(:configuration) { default_configuration.merge("database" => new_database) }
14
15
 
15
- before { skip 'on azure' if azure_skip }
16
+ before { skip "on azure" if azure_skip }
16
17
  before { disconnect! unless azure_skip }
17
18
  after { reconnect unless azure_skip }
18
19
 
@@ -25,7 +26,7 @@ class SQLServerRakeTest < ActiveRecord::TestCase
25
26
  def reconnect
26
27
  config = default_configuration
27
28
  if connection_sqlserver_azure?
28
- ActiveRecord::Base.establish_connection(config.merge('database' => 'master'))
29
+ ActiveRecord::Base.establish_connection(config.merge("database" => "master"))
29
30
  connection.drop_database(new_database) rescue nil
30
31
  disconnect!
31
32
  ActiveRecord::Base.establish_connection(config)
@@ -34,57 +35,51 @@ class SQLServerRakeTest < ActiveRecord::TestCase
34
35
  connection.drop_database(new_database) rescue nil
35
36
  end
36
37
  end
37
-
38
38
  end
39
39
 
40
40
  class SQLServerRakeCreateTest < SQLServerRakeTest
41
-
42
41
  self.azure_skip = false
43
42
 
44
- it 'establishes connection to database after create ' do
43
+ it "establishes connection to database after create " do
45
44
  quietly { db_tasks.create configuration }
46
- connection.current_database.must_equal(new_database)
45
+ _(connection.current_database).must_equal(new_database)
47
46
  end
48
47
 
49
- it 'creates database with default collation' do
48
+ it "creates database with default collation" do
50
49
  quietly { db_tasks.create configuration }
51
- connection.collation.must_equal 'SQL_Latin1_General_CP1_CI_AS'
50
+ _(connection.collation).must_equal "SQL_Latin1_General_CP1_CI_AS"
52
51
  end
53
52
 
54
- it 'creates database with given collation' do
55
- quietly { db_tasks.create configuration.merge('collation' => 'Latin1_General_CI_AS') }
56
- connection.collation.must_equal 'Latin1_General_CI_AS'
53
+ it "creates database with given collation" do
54
+ quietly { db_tasks.create configuration.merge("collation" => "Latin1_General_CI_AS") }
55
+ _(connection.collation).must_equal "Latin1_General_CI_AS"
57
56
  end
58
57
 
59
- it 'prints error message when database exists' do
58
+ it "prints error message when database exists" do
60
59
  quietly { db_tasks.create configuration }
61
60
  message = capture(:stderr) { db_tasks.create configuration }
62
- message.must_match %r{activerecord_unittest_tasks.*already exists}
61
+ _(message).must_match %r{activerecord_unittest_tasks.*already exists}
63
62
  end
64
-
65
63
  end
66
64
 
67
65
  class SQLServerRakeDropTest < SQLServerRakeTest
68
-
69
66
  self.azure_skip = false
70
67
 
71
- it 'drops database and uses master' do
68
+ it "drops database and uses master" do
72
69
  quietly do
73
70
  db_tasks.create configuration
74
71
  db_tasks.drop configuration
75
72
  end
76
- connection.current_database.must_equal 'master'
73
+ _(connection.current_database).must_equal "master"
77
74
  end
78
75
 
79
- it 'prints error message when database does not exist' do
80
- message = capture(:stderr) { db_tasks.drop configuration.merge('database' => 'doesnotexist') }
81
- message.must_match %r{'doesnotexist' does not exist}
76
+ it "prints error message when database does not exist" do
77
+ message = capture(:stderr) { db_tasks.drop configuration.merge("database" => "doesnotexist") }
78
+ _(message).must_match %r{'doesnotexist' does not exist}
82
79
  end
83
-
84
80
  end
85
81
 
86
82
  class SQLServerRakePurgeTest < SQLServerRakeTest
87
-
88
83
  before do
89
84
  quietly { db_tasks.create(configuration) }
90
85
  connection.create_table :users, force: true do |t|
@@ -93,43 +88,37 @@ class SQLServerRakePurgeTest < SQLServerRakeTest
93
88
  end
94
89
  end
95
90
 
96
- it 'clears active connections, drops database, and recreates with established connection' do
97
- connection.current_database.must_equal(new_database)
98
- connection.tables.must_include 'users'
91
+ it "clears active connections, drops database, and recreates with established connection" do
92
+ _(connection.current_database).must_equal(new_database)
93
+ _(connection.tables).must_include "users"
99
94
  quietly { db_tasks.purge(configuration) }
100
- connection.current_database.must_equal(new_database)
101
- connection.tables.wont_include 'users'
95
+ _(connection.current_database).must_equal(new_database)
96
+ _(connection.tables).wont_include "users"
102
97
  end
103
-
104
98
  end
105
99
 
106
100
  class SQLServerRakeCharsetTest < SQLServerRakeTest
107
-
108
101
  before do
109
102
  quietly { db_tasks.create(configuration) }
110
103
  end
111
104
 
112
- it 'retrieves charset' do
113
- db_tasks.charset(configuration).must_equal 'iso_1'
105
+ it "retrieves charset" do
106
+ _(db_tasks.charset(configuration)).must_equal "iso_1"
114
107
  end
115
-
116
108
  end
117
109
 
118
110
  class SQLServerRakeCollationTest < SQLServerRakeTest
119
-
120
111
  before do
121
112
  quietly { db_tasks.create(configuration) }
122
113
  end
123
114
 
124
- it 'retrieves collation' do
125
- db_tasks.collation(configuration).must_equal 'SQL_Latin1_General_CP1_CI_AS'
115
+ it "retrieves collation" do
116
+ _(db_tasks.collation(configuration)).must_equal "SQL_Latin1_General_CP1_CI_AS"
126
117
  end
127
-
128
118
  end
129
119
 
130
120
  class SQLServerRakeStructureDumpLoadTest < SQLServerRakeTest
131
-
132
- let(:filename) { File.join ARTest::SQLServer.migrations_root, 'structure.sql' }
121
+ let(:filename) { File.join ARTest::SQLServer.migrations_root, "structure.sql" }
133
122
  let(:filedata) { File.read(filename) }
134
123
 
135
124
  before do
@@ -146,24 +135,23 @@ class SQLServerRakeStructureDumpLoadTest < SQLServerRakeTest
146
135
  FileUtils.rm_rf(filename)
147
136
  end
148
137
 
149
- it 'dumps structure and accounts for defncopy oddities' do
150
- skip 'debug defncopy on windows later' if host_windows?
138
+ it "dumps structure and accounts for defncopy oddities" do
139
+ skip "debug defncopy on windows later" if host_windows?
151
140
  quietly { db_tasks.structure_dump configuration, filename }
152
- filedata.wont_match %r{\AUSE.*\z}
153
- filedata.wont_match %r{\AGO.*\z}
154
- filedata.must_match %r{email\s+nvarchar\(4000\)}
155
- filedata.must_match %r{background1\s+nvarchar\(max\)}
156
- filedata.must_match %r{background2\s+text\s+}
141
+ _(filedata).wont_match %r{\AUSE.*\z}
142
+ _(filedata).wont_match %r{\AGO.*\z}
143
+ _(filedata).must_match %r{email\s+nvarchar\(4000\)}
144
+ _(filedata).must_match %r{background1\s+nvarchar\(max\)}
145
+ _(filedata).must_match %r{background2\s+text\s+}
157
146
  end
158
147
 
159
- it 'can load dumped structure' do
160
- skip 'debug defncopy on windows later' if host_windows?
148
+ it "can load dumped structure" do
149
+ skip "debug defncopy on windows later" if host_windows?
161
150
  quietly { db_tasks.structure_dump configuration, filename }
162
- filedata.must_match %r{CREATE TABLE dbo\.users}
151
+ _(filedata).must_match %r{CREATE TABLE dbo\.users}
163
152
  db_tasks.purge(configuration)
164
- connection.tables.wont_include 'users'
153
+ _(connection.tables).wont_include "users"
165
154
  db_tasks.load_schema configuration, :sql, filename
166
- connection.tables.must_include 'users'
155
+ _(connection.tables).must_include "users"
167
156
  end
168
-
169
157
  end
@@ -1,143 +1,144 @@
1
- require 'cases/helper_sqlserver'
1
+ # frozen_string_literal: true
2
2
 
3
- class SchemaDumperTestSQLServer < ActiveRecord::TestCase
3
+ require "cases/helper_sqlserver"
4
4
 
5
+ class SchemaDumperTestSQLServer < ActiveRecord::TestCase
5
6
  before { all_tables }
6
7
 
7
8
  let(:all_tables) { ActiveRecord::Base.connection.tables }
8
9
  let(:schema) { @generated_schema }
9
10
 
10
- it 'sst_datatypes' do
11
- generate_schema_for_table 'sst_datatypes'
12
- assert_line :bigint, type: 'bigint', limit: nil, precision: nil, scale: nil, default: 42
13
- assert_line :int, type: 'integer', limit: nil, precision: nil, scale: nil, default: 42
14
- assert_line :smallint, type: 'integer', limit: 2, precision: nil, scale: nil, default: 42
15
- assert_line :tinyint, type: 'integer', limit: 1, precision: nil, scale: nil, default: 42
16
- assert_line :bit, type: 'boolean', limit: nil, precision: nil, scale: nil, default: true
17
- assert_line :decimal_9_2, type: 'decimal', limit: nil, precision: 9, scale: 2, default: 12345.01
18
- assert_line :numeric_18_0, type: 'decimal', limit: nil, precision: 18, scale: 0, default: 191.0
19
- assert_line :numeric_36_2, type: 'decimal', limit: nil, precision: 36, scale: 2, default: 12345678901234567890.01
20
- assert_line :money, type: 'money', limit: nil, precision: 19, scale: 4, default: 4.2
21
- assert_line :smallmoney, type: 'smallmoney', limit: nil, precision: 10, scale: 4, default: 4.2
11
+ it "sst_datatypes" do
12
+ generate_schema_for_table "sst_datatypes"
13
+ assert_line :bigint, type: "bigint", limit: nil, precision: nil, scale: nil, default: 42
14
+ assert_line :int, type: "integer", limit: nil, precision: nil, scale: nil, default: 42
15
+ assert_line :smallint, type: "integer", limit: 2, precision: nil, scale: nil, default: 42
16
+ assert_line :tinyint, type: "integer", limit: 1, precision: nil, scale: nil, default: 42
17
+ assert_line :bit, type: "boolean", limit: nil, precision: nil, scale: nil, default: true
18
+ assert_line :decimal_9_2, type: "decimal", limit: nil, precision: 9, scale: 2, default: 12345.01
19
+ assert_line :numeric_18_0, type: "decimal", limit: nil, precision: 18, scale: 0, default: 191.0
20
+ assert_line :numeric_36_2, type: "decimal", limit: nil, precision: 36, scale: 2, default: 12345678901234567890.01
21
+ assert_line :money, type: "money", limit: nil, precision: 19, scale: 4, default: 4.2
22
+ assert_line :smallmoney, type: "smallmoney", limit: nil, precision: 10, scale: 4, default: 4.2
22
23
  # Approximate Numerics
23
- assert_line :float, type: 'float', limit: nil, precision: nil, scale: nil, default: 123.00000001
24
- assert_line :real, type: 'real', limit: nil, precision: nil, scale: nil, default: 123.45
24
+ assert_line :float, type: "float", limit: nil, precision: nil, scale: nil, default: 123.00000001
25
+ assert_line :real, type: "real", limit: nil, precision: nil, scale: nil, default: 123.45
25
26
  # Date and Time
26
- assert_line :date, type: 'date', limit: nil, precision: nil, scale: nil, default: "01-01-0001"
27
- assert_line :datetime, type: 'datetime', limit: nil, precision: nil, scale: nil, default: "01-01-1753 00:00:00.123"
27
+ assert_line :date, type: "date", limit: nil, precision: nil, scale: nil, default: "01-01-0001"
28
+ assert_line :datetime, type: "datetime", limit: nil, precision: nil, scale: nil, default: "01-01-1753 00:00:00.123"
28
29
  if connection_dblib_73?
29
- assert_line :datetime2_7, type: 'datetime', limit: nil, precision: 7, scale: nil, default: "12-31-9999 23:59:59.9999999"
30
- assert_line :datetime2_3, type: 'datetime', limit: nil, precision: 3, scale: nil, default: nil
31
- assert_line :datetime2_1, type: 'datetime', limit: nil, precision: 1, scale: nil, default: nil
30
+ assert_line :datetime2_7, type: "datetime", limit: nil, precision: 7, scale: nil, default: "12-31-9999 23:59:59.9999999"
31
+ assert_line :datetime2_3, type: "datetime", limit: nil, precision: 3, scale: nil, default: nil
32
+ assert_line :datetime2_1, type: "datetime", limit: nil, precision: 1, scale: nil, default: nil
32
33
  end
33
- assert_line :smalldatetime, type: 'smalldatetime',limit: nil, precision: nil, scale: nil, default: "01-01-1901 15:45:00.0"
34
+ assert_line :smalldatetime, type: "smalldatetime", limit: nil, precision: nil, scale: nil, default: "01-01-1901 15:45:00.0"
34
35
  if connection_dblib_73?
35
- assert_line :time_7, type: 'time', limit: nil, precision: 7, scale: nil, default: "04:20:00.2883215"
36
- assert_line :time_2, type: 'time', limit: nil, precision: 2, scale: nil, default: nil
36
+ assert_line :time_7, type: "time", limit: nil, precision: 7, scale: nil, default: "04:20:00.2883215"
37
+ assert_line :time_2, type: "time", limit: nil, precision: 2, scale: nil, default: nil
38
+ assert_line :time_default, type: "time", limit: nil, precision: 7, scale: nil, default: "15:03:42.0621978"
37
39
  end
38
40
  # Character Strings
39
- assert_line :char_10, type: 'char', limit: 10, precision: nil, scale: nil, default: "1234567890", collation: nil
40
- assert_line :varchar_50, type: 'varchar', limit: 50, precision: nil, scale: nil, default: "test varchar_50", collation: nil
41
- assert_line :varchar_max, type: 'varchar_max', limit: nil, precision: nil, scale: nil, default: "test varchar_max", collation: nil
42
- assert_line :text, type: 'text_basic', limit: nil, precision: nil, scale: nil, default: "test text", collation: nil
41
+ assert_line :char_10, type: "char", limit: 10, precision: nil, scale: nil, default: "1234567890", collation: nil
42
+ assert_line :varchar_50, type: "varchar", limit: 50, precision: nil, scale: nil, default: "test varchar_50", collation: nil
43
+ assert_line :varchar_max, type: "varchar_max", limit: nil, precision: nil, scale: nil, default: "test varchar_max", collation: nil
44
+ assert_line :text, type: "text_basic", limit: nil, precision: nil, scale: nil, default: "test text", collation: nil
43
45
  # Unicode Character Strings
44
- assert_line :nchar_10, type: 'nchar', limit: 10, precision: nil, scale: nil, default: "12345678åå", collation: nil
45
- assert_line :nvarchar_50, type: 'string', limit: 50, precision: nil, scale: nil, default: "test nvarchar_50 åå", collation: nil
46
- assert_line :nvarchar_max, type: 'text', limit: nil, precision: nil, scale: nil, default: "test nvarchar_max åå", collation: nil
47
- assert_line :ntext, type: 'ntext', limit: nil, precision: nil, scale: nil, default: "test ntext åå", collation: nil
46
+ assert_line :nchar_10, type: "nchar", limit: 10, precision: nil, scale: nil, default: "12345678åå", collation: nil
47
+ assert_line :nvarchar_50, type: "string", limit: 50, precision: nil, scale: nil, default: "test nvarchar_50 åå", collation: nil
48
+ assert_line :nvarchar_max, type: "text", limit: nil, precision: nil, scale: nil, default: "test nvarchar_max åå", collation: nil
49
+ assert_line :ntext, type: "ntext", limit: nil, precision: nil, scale: nil, default: "test ntext åå", collation: nil
48
50
  # Binary Strings
49
- assert_line :binary_49, type: 'binary_basic', limit: 49, precision: nil, scale: nil, default: nil
50
- assert_line :varbinary_49, type: 'varbinary', limit: 49, precision: nil, scale: nil, default: nil
51
- assert_line :varbinary_max, type: 'binary', limit: nil, precision: nil, scale: nil, default: nil
51
+ assert_line :binary_49, type: "binary_basic", limit: 49, precision: nil, scale: nil, default: nil
52
+ assert_line :varbinary_49, type: "varbinary", limit: 49, precision: nil, scale: nil, default: nil
53
+ assert_line :varbinary_max, type: "binary", limit: nil, precision: nil, scale: nil, default: nil
52
54
  # Other Data Types
53
- assert_line :uniqueidentifier, type: 'uuid', limit: nil, precision: nil, scale: nil, default: -> { "newid()" }
54
- assert_line :timestamp, type: 'ss_timestamp', limit: nil, precision: nil, scale: nil, default: nil
55
+ assert_line :uniqueidentifier, type: "uuid", limit: nil, precision: nil, scale: nil, default: -> { "newid()" }
56
+ assert_line :timestamp, type: "ss_timestamp", limit: nil, precision: nil, scale: nil, default: nil
55
57
  end
56
58
 
57
- it 'sst_datatypes_migration' do
59
+ it "sst_datatypes_migration" do
58
60
  columns = SSTestDatatypeMigration.columns_hash
59
- generate_schema_for_table 'sst_datatypes_migration'
61
+ generate_schema_for_table "sst_datatypes_migration"
60
62
  # Simple Rails conventions
61
- columns['integer_col'].sql_type.must_equal 'int(4)'
62
- columns['bigint_col'].sql_type.must_equal 'bigint(8)'
63
- columns['boolean_col'].sql_type.must_equal 'bit'
64
- columns['decimal_col'].sql_type.must_equal 'decimal(18,0)'
65
- columns['float_col'].sql_type.must_equal 'float'
66
- columns['string_col'].sql_type.must_equal 'nvarchar(4000)'
67
- columns['text_col'].sql_type.must_equal 'nvarchar(max)'
68
- columns['datetime_col'].sql_type.must_equal 'datetime'
69
- columns['timestamp_col'].sql_type.must_equal 'datetime'
70
- columns['time_col'].sql_type.must_equal 'time(7)'
71
- columns['date_col'].sql_type.must_equal 'date'
72
- columns['binary_col'].sql_type.must_equal 'varbinary(max)'
73
- assert_line :integer_col, type: 'integer', limit: nil, precision: nil, scale: nil, default: nil
74
- assert_line :bigint_col, type: 'bigint', limit: nil, precision: nil, scale: nil, default: nil
75
- assert_line :boolean_col, type: 'boolean', limit: nil, precision: nil, scale: nil, default: nil
76
- assert_line :decimal_col, type: 'decimal', limit: nil, precision: 18, scale: 0, default: nil
77
- assert_line :float_col, type: 'float', limit: nil, precision: nil, scale: nil, default: nil
78
- assert_line :string_col, type: 'string', limit: nil, precision: nil, scale: nil, default: nil
79
- assert_line :text_col, type: 'text', limit: nil, precision: nil, scale: nil, default: nil
80
- assert_line :datetime_col, type: 'datetime', limit: nil, precision: nil, scale: nil, default: nil
81
- assert_line :timestamp_col, type: 'datetime', limit: nil, precision: nil, scale: nil, default: nil
82
- assert_line :time_col, type: 'time', limit: nil, precision: 7, scale: nil, default: nil
83
- assert_line :date_col, type: 'date', limit: nil, precision: nil, scale: nil, default: nil
84
- assert_line :binary_col, type: 'binary', limit: nil, precision: nil, scale: nil, default: nil
63
+ _(columns["integer_col"].sql_type).must_equal "int(4)"
64
+ _(columns["bigint_col"].sql_type).must_equal "bigint(8)"
65
+ _(columns["boolean_col"].sql_type).must_equal "bit"
66
+ _(columns["decimal_col"].sql_type).must_equal "decimal(18,0)"
67
+ _(columns["float_col"].sql_type).must_equal "float"
68
+ _(columns["string_col"].sql_type).must_equal "nvarchar(4000)"
69
+ _(columns["text_col"].sql_type).must_equal "nvarchar(max)"
70
+ _(columns["datetime_col"].sql_type).must_equal "datetime"
71
+ _(columns["timestamp_col"].sql_type).must_equal "datetime"
72
+ _(columns["time_col"].sql_type).must_equal "time(7)"
73
+ _(columns["date_col"].sql_type).must_equal "date"
74
+ _(columns["binary_col"].sql_type).must_equal "varbinary(max)"
75
+ assert_line :integer_col, type: "integer", limit: nil, precision: nil, scale: nil, default: nil
76
+ assert_line :bigint_col, type: "bigint", limit: nil, precision: nil, scale: nil, default: nil
77
+ assert_line :boolean_col, type: "boolean", limit: nil, precision: nil, scale: nil, default: nil
78
+ assert_line :decimal_col, type: "decimal", limit: nil, precision: 18, scale: 0, default: nil
79
+ assert_line :float_col, type: "float", limit: nil, precision: nil, scale: nil, default: nil
80
+ assert_line :string_col, type: "string", limit: nil, precision: nil, scale: nil, default: nil
81
+ assert_line :text_col, type: "text", limit: nil, precision: nil, scale: nil, default: nil
82
+ assert_line :datetime_col, type: "datetime", limit: nil, precision: nil, scale: nil, default: nil
83
+ assert_line :timestamp_col, type: "datetime", limit: nil, precision: nil, scale: nil, default: nil
84
+ assert_line :time_col, type: "time", limit: nil, precision: 7, scale: nil, default: nil
85
+ assert_line :date_col, type: "date", limit: nil, precision: nil, scale: nil, default: nil
86
+ assert_line :binary_col, type: "binary", limit: nil, precision: nil, scale: nil, default: nil
85
87
  # Our type methods.
86
- columns['real_col'].sql_type.must_equal 'real'
87
- columns['money_col'].sql_type.must_equal 'money'
88
- columns['smalldatetime_col'].sql_type.must_equal 'smalldatetime'
89
- columns['datetime2_col'].sql_type.must_equal 'datetime2(7)'
90
- columns['datetimeoffset'].sql_type.must_equal 'datetimeoffset(7)'
91
- columns['smallmoney_col'].sql_type.must_equal 'smallmoney'
92
- columns['char_col'].sql_type.must_equal 'char(1)'
93
- columns['varchar_col'].sql_type.must_equal 'varchar(8000)'
94
- columns['text_basic_col'].sql_type.must_equal 'text'
95
- columns['nchar_col'].sql_type.must_equal 'nchar(1)'
96
- columns['ntext_col'].sql_type.must_equal 'ntext'
97
- columns['binary_basic_col'].sql_type.must_equal 'binary(1)'
98
- columns['varbinary_col'].sql_type.must_equal 'varbinary(8000)'
99
- columns['uuid_col'].sql_type.must_equal 'uniqueidentifier'
100
- columns['sstimestamp_col'].sql_type.must_equal 'timestamp'
101
- columns['json_col'].sql_type.must_equal 'nvarchar(max)'
102
- assert_line :real_col, type: 'real', limit: nil, precision: nil, scale: nil, default: nil
103
- assert_line :money_col, type: 'money', limit: nil, precision: 19, scale: 4, default: nil
104
- assert_line :smalldatetime_col, type: 'smalldatetime', limit: nil, precision: nil, scale: nil, default: nil
105
- assert_line :datetime2_col, type: 'datetime', limit: nil, precision: 7, scale: nil, default: nil
106
- assert_line :datetimeoffset, type: 'datetimeoffset', limit: nil, precision: 7, scale: nil, default: nil
107
- assert_line :smallmoney_col, type: 'smallmoney', limit: nil, precision: 10, scale: 4, default: nil
108
- assert_line :char_col, type: 'char', limit: 1, precision: nil, scale: nil, default: nil
109
- assert_line :varchar_col, type: 'varchar', limit: nil, precision: nil, scale: nil, default: nil
110
- assert_line :text_basic_col, type: 'text_basic', limit: nil, precision: nil, scale: nil, default: nil
111
- assert_line :nchar_col, type: 'nchar', limit: 1, precision: nil, scale: nil, default: nil
112
- assert_line :ntext_col, type: 'ntext', limit: nil, precision: nil, scale: nil, default: nil
113
- assert_line :binary_basic_col, type: 'binary_basic', limit: 1, precision: nil, scale: nil, default: nil
114
- assert_line :varbinary_col, type: 'varbinary', limit: nil, precision: nil, scale: nil, default: nil
115
- assert_line :uuid_col, type: 'uuid', limit: nil, precision: nil, scale: nil, default: nil
116
- assert_line :sstimestamp_col, type: 'ss_timestamp', limit: nil, precision: nil, scale: nil, default: nil
117
- assert_line :json_col, type: 'text', limit: nil, precision: nil, scale: nil, default: nil
88
+ _(columns["real_col"].sql_type).must_equal "real"
89
+ _(columns["money_col"].sql_type).must_equal "money"
90
+ _(columns["smalldatetime_col"].sql_type).must_equal "smalldatetime"
91
+ _(columns["datetime2_col"].sql_type).must_equal "datetime2(7)"
92
+ _(columns["datetimeoffset"].sql_type).must_equal "datetimeoffset(7)"
93
+ _(columns["smallmoney_col"].sql_type).must_equal "smallmoney"
94
+ _(columns["char_col"].sql_type).must_equal "char(1)"
95
+ _(columns["varchar_col"].sql_type).must_equal "varchar(8000)"
96
+ _(columns["text_basic_col"].sql_type).must_equal "text"
97
+ _(columns["nchar_col"].sql_type).must_equal "nchar(1)"
98
+ _(columns["ntext_col"].sql_type).must_equal "ntext"
99
+ _(columns["binary_basic_col"].sql_type).must_equal "binary(1)"
100
+ _(columns["varbinary_col"].sql_type).must_equal "varbinary(8000)"
101
+ _(columns["uuid_col"].sql_type).must_equal "uniqueidentifier"
102
+ _(columns["sstimestamp_col"].sql_type).must_equal "timestamp"
103
+ _(columns["json_col"].sql_type).must_equal "nvarchar(max)"
104
+ assert_line :real_col, type: "real", limit: nil, precision: nil, scale: nil, default: nil
105
+ assert_line :money_col, type: "money", limit: nil, precision: 19, scale: 4, default: nil
106
+ assert_line :smalldatetime_col, type: "smalldatetime", limit: nil, precision: nil, scale: nil, default: nil
107
+ assert_line :datetime2_col, type: "datetime", limit: nil, precision: 7, scale: nil, default: nil
108
+ assert_line :datetimeoffset, type: "datetimeoffset", limit: nil, precision: 7, scale: nil, default: nil
109
+ assert_line :smallmoney_col, type: "smallmoney", limit: nil, precision: 10, scale: 4, default: nil
110
+ assert_line :char_col, type: "char", limit: 1, precision: nil, scale: nil, default: nil
111
+ assert_line :varchar_col, type: "varchar", limit: nil, precision: nil, scale: nil, default: nil
112
+ assert_line :text_basic_col, type: "text_basic", limit: nil, precision: nil, scale: nil, default: nil
113
+ assert_line :nchar_col, type: "nchar", limit: 1, precision: nil, scale: nil, default: nil
114
+ assert_line :ntext_col, type: "ntext", limit: nil, precision: nil, scale: nil, default: nil
115
+ assert_line :binary_basic_col, type: "binary_basic", limit: 1, precision: nil, scale: nil, default: nil
116
+ assert_line :varbinary_col, type: "varbinary", limit: nil, precision: nil, scale: nil, default: nil
117
+ assert_line :uuid_col, type: "uuid", limit: nil, precision: nil, scale: nil, default: nil
118
+ assert_line :sstimestamp_col, type: "ss_timestamp", limit: nil, precision: nil, scale: nil, default: nil
119
+ assert_line :json_col, type: "text", limit: nil, precision: nil, scale: nil, default: nil
118
120
  end
119
121
 
120
122
  # Special Cases
121
123
 
122
- it 'honor nonstandard primary keys' do
123
- generate_schema_for_table('movies') do |output|
124
+ it "honor nonstandard primary keys" do
125
+ generate_schema_for_table("movies") do |output|
124
126
  match = output.match(%r{create_table "movies"(.*)do})
125
127
  assert_not_nil(match, "nonstandardpk table not found")
126
128
  assert_match %r(primary_key: "movieid"), match[1], "non-standard primary key not preserved"
127
129
  end
128
130
  end
129
131
 
130
- it 'no id with model driven primary key' do
131
- output = generate_schema_for_table 'sst_no_pk_data'
132
- output.must_match %r{create_table "sst_no_pk_data".*id:\sfalse.*do}
133
- assert_line :name, type: 'string', limit: nil, default: nil, collation: nil
132
+ it "no id with model driven primary key" do
133
+ output = generate_schema_for_table "sst_no_pk_data"
134
+ _(output).must_match %r{create_table "sst_no_pk_data".*id:\sfalse.*do}
135
+ assert_line :name, type: "string", limit: nil, default: nil, collation: nil
134
136
  end
135
137
 
136
-
137
138
  private
138
139
 
139
140
  def generate_schema_for_table(*table_names)
140
- require 'stringio'
141
+ require "stringio"
141
142
  stream = StringIO.new
142
143
  ActiveRecord::SchemaDumper.ignore_tables = all_tables - table_names
143
144
  ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, stream)
@@ -147,6 +148,7 @@ class SchemaDumperTestSQLServer < ActiveRecord::TestCase
147
148
  type_matcher = /\A\s+t\.\w+\s+"(.*?)"[,\n]/
148
149
  @generated_schema.each_line do |line|
149
150
  next unless line =~ type_matcher
151
+
150
152
  @schema_lines[Regexp.last_match[1]] = SchemaLine.new(line)
151
153
  end
152
154
  @generated_schema
@@ -156,30 +158,30 @@ class SchemaDumperTestSQLServer < ActiveRecord::TestCase
156
158
  @schema_lines[column_name.to_s]
157
159
  end
158
160
 
159
- def assert_line(column_name, options={})
161
+ def assert_line(column_name, options = {})
160
162
  line = line(column_name)
161
163
  assert line, "Count not find line with column name: #{column_name.inspect} in schema:\n#{schema}"
162
164
  [:type, :limit, :precision, :scale, :collation, :default].each do |key|
163
165
  next unless options.key?(key)
166
+
164
167
  actual = key == :type ? line.send(:type_method) : line.send(key)
165
168
  expected = options[key]
166
169
  message = "#{key.to_s.titleize} of #{expected.inspect} not found in:\n#{line}"
167
170
  if expected.nil?
168
- actual.must_be_nil message
171
+ _(actual).must_be_nil message
169
172
  elsif expected.is_a?(Array)
170
- actual.must_include expected, message
173
+ _(actual).must_include expected, message
171
174
  elsif expected.is_a?(Float)
172
- actual.must_be_close_to expected, 0.001
175
+ _(actual).must_be_close_to expected, 0.001
173
176
  elsif expected.is_a?(Proc)
174
- actual.call.must_equal(expected.call)
177
+ _(actual.call).must_equal(expected.call)
175
178
  else
176
- actual.must_equal expected, message
179
+ _(actual).must_equal expected, message
177
180
  end
178
181
  end
179
182
  end
180
183
 
181
184
  class SchemaLine
182
-
183
185
  LINE_PARSER = %r{t\.(\w+)\s+"(.*?)"[,\s+](.*)}
184
186
 
185
187
  attr_reader :line,
@@ -227,8 +229,5 @@ class SchemaDumperTestSQLServer < ActiveRecord::TestCase
227
229
  rescue SyntaxError
228
230
  {}
229
231
  end
230
-
231
232
  end
232
-
233
233
  end
234
-