Skip to content

Commit ee9264a

Browse files
committed
Re-implement part of RelationMergingTest to properly compare generated SQL.
1 parent 57442ec commit ee9264a

File tree

9 files changed

+344
-258
lines changed

9 files changed

+344
-258
lines changed

test/cases/adapters/postgresql/interval_test.rb

Lines changed: 118 additions & 116 deletions
Original file line numberDiff line numberDiff line change
@@ -3,138 +3,140 @@
33
require "cases/helper"
44
require "support/schema_dumping_helper"
55

6-
class PostgresqlIntervalTest < ActiveRecord::PostgreSQLTestCase
7-
include SchemaDumpingHelper
8-
9-
class IntervalDataType < ActiveRecord::Base
10-
attribute :maximum_term, :interval
11-
attribute :minimum_term, :interval, precision: 3
12-
attribute :default_term, :interval
13-
attribute :all_terms, :interval, array: true
14-
attribute :legacy_term, :string
15-
end
6+
module CockroachDB
7+
class PostgresqlIntervalTest < ActiveRecord::PostgreSQLTestCase
8+
include SchemaDumpingHelper
9+
10+
class IntervalDataType < ActiveRecord::Base
11+
attribute :maximum_term, :interval
12+
attribute :minimum_term, :interval, precision: 3
13+
attribute :default_term, :interval
14+
attribute :all_terms, :interval, array: true
15+
attribute :legacy_term, :string
16+
end
1617

17-
class DeprecatedIntervalDataType < ActiveRecord::Base; end
18-
19-
def setup
20-
@connection = ActiveRecord::Base.connection
21-
@connection.transaction do
22-
@connection.create_table("interval_data_types") do |t|
23-
t.interval "maximum_term"
24-
t.interval "minimum_term", precision: 3
25-
t.interval "default_term", default: "P3Y"
26-
t.interval "all_terms", array: true
27-
t.interval "legacy_term"
28-
end
29-
@connection.create_table("deprecated_interval_data_types") do |t|
30-
t.interval "duration"
18+
class DeprecatedIntervalDataType < ActiveRecord::Base; end
19+
20+
def setup
21+
@connection = ActiveRecord::Base.connection
22+
@connection.transaction do
23+
@connection.create_table("interval_data_types") do |t|
24+
t.interval "maximum_term"
25+
t.interval "minimum_term", precision: 3
26+
t.interval "default_term", default: "P3Y"
27+
t.interval "all_terms", array: true
28+
t.interval "legacy_term"
29+
end
30+
@connection.create_table("deprecated_interval_data_types") do |t|
31+
t.interval "duration"
32+
end
3133
end
34+
@column_max = IntervalDataType.columns_hash["maximum_term"]
35+
@column_min = IntervalDataType.columns_hash["minimum_term"]
36+
assert(@column_max.is_a?(ActiveRecord::ConnectionAdapters::PostgreSQLColumn))
37+
assert(@column_min.is_a?(ActiveRecord::ConnectionAdapters::PostgreSQLColumn))
38+
assert_nil @column_max.precision
39+
assert_equal 3, @column_min.precision
3240
end
33-
@column_max = IntervalDataType.columns_hash["maximum_term"]
34-
@column_min = IntervalDataType.columns_hash["minimum_term"]
35-
assert(@column_max.is_a?(ActiveRecord::ConnectionAdapters::PostgreSQLColumn))
36-
assert(@column_min.is_a?(ActiveRecord::ConnectionAdapters::PostgreSQLColumn))
37-
assert_nil @column_max.precision
38-
assert_equal 3, @column_min.precision
39-
end
4041

41-
teardown do
42-
@connection.execute "DROP TABLE IF EXISTS interval_data_types"
43-
@connection.execute "DROP TABLE IF EXISTS deprecated_interval_data_types"
44-
end
42+
teardown do
43+
@connection.execute "DROP TABLE IF EXISTS interval_data_types"
44+
@connection.execute "DROP TABLE IF EXISTS deprecated_interval_data_types"
45+
end
4546

46-
IntervalTestCase = Struct.new(:input, :expected)
47-
def test_postgresql_interval_parser
48-
tests = [
49-
IntervalTestCase.new('6 years', 6.year),
50-
IntervalTestCase.new('6 years 5 mons', 6.year + 5.month),
51-
IntervalTestCase.new('6 years 5 mons 4 days', 6.year + 5.month + 4.days),
52-
IntervalTestCase.new('6 years 5 mons 4 days 03:00:00', 6.year + 5.month + 4.days + 3.hours),
53-
IntervalTestCase.new('6 years 5 mons 4 days 03:02:00', 6.year + 5.month + 4.days + 3.hours + 2.minutes),
54-
IntervalTestCase.new('6 years 5 mons 4 days 03:02:01',
55-
6.year + 5.month + 4.days + 3.hours + 2.minutes + 1.second),
56-
IntervalTestCase.new('6 years 5 mons 4 days 03:02:01.2',
57-
6.year + 5.month + 4.days + 3.hours + 2.minutes + 1.2.seconds)
58-
]
59-
tests.each do |test_case|
60-
result = ActiveRecord::ConnectionAdapters::CockroachDB::PostgresqlInterval::Parser.parse(test_case.input)
61-
assert_equal test_case.expected, result
47+
IntervalTestCase = Struct.new(:input, :expected)
48+
def test_postgresql_interval_parser
49+
tests = [
50+
IntervalTestCase.new('6 years', 6.year),
51+
IntervalTestCase.new('6 years 5 mons', 6.year + 5.month),
52+
IntervalTestCase.new('6 years 5 mons 4 days', 6.year + 5.month + 4.days),
53+
IntervalTestCase.new('6 years 5 mons 4 days 03:00:00', 6.year + 5.month + 4.days + 3.hours),
54+
IntervalTestCase.new('6 years 5 mons 4 days 03:02:00', 6.year + 5.month + 4.days + 3.hours + 2.minutes),
55+
IntervalTestCase.new('6 years 5 mons 4 days 03:02:01',
56+
6.year + 5.month + 4.days + 3.hours + 2.minutes + 1.second),
57+
IntervalTestCase.new('6 years 5 mons 4 days 03:02:01.2',
58+
6.year + 5.month + 4.days + 3.hours + 2.minutes + 1.2.seconds)
59+
]
60+
tests.each do |test_case|
61+
result = ActiveRecord::ConnectionAdapters::CockroachDB::PostgresqlInterval::Parser.parse(test_case.input)
62+
assert_equal test_case.expected, result
63+
end
6264
end
63-
end
6465

65-
def test_postgresql_interval_parser_error
66-
assert_raises(ActiveRecord::ConnectionAdapters::CockroachDB::PostgresqlInterval::ParseError) do
67-
test_str = 'This is an invalid interval'
68-
ActiveRecord::ConnectionAdapters::CockroachDB::PostgresqlInterval::Parser.parse(test_str)
66+
def test_postgresql_interval_parser_error
67+
assert_raises(ActiveRecord::ConnectionAdapters::CockroachDB::PostgresqlInterval::ParseError) do
68+
test_str = 'This is an invalid interval'
69+
ActiveRecord::ConnectionAdapters::CockroachDB::PostgresqlInterval::Parser.parse(test_str)
70+
end
6971
end
70-
end
7172

72-
def test_column
73-
assert_equal :interval, @column_max.type
74-
assert_equal :interval, @column_min.type
75-
assert_equal "interval", @column_max.sql_type
76-
assert_equal "interval(3)", @column_min.sql_type
77-
end
73+
def test_column
74+
assert_equal :interval, @column_max.type
75+
assert_equal :interval, @column_min.type
76+
assert_equal "interval", @column_max.sql_type
77+
assert_equal "interval(3)", @column_min.sql_type
78+
end
7879

79-
def test_simple_interval
80-
IntervalDataType.create!(
81-
maximum_term: 6.year + 5.month + 4.days + 3.hours + 2.minutes + 1.seconds
82-
)
83-
i = IntervalDataType.last!
84-
assert_equal "P6Y5M4DT3H2M1S", i.maximum_term.iso8601
85-
end
80+
def test_simple_interval
81+
IntervalDataType.create!(
82+
maximum_term: 6.year + 5.month + 4.days + 3.hours + 2.minutes + 1.seconds
83+
)
84+
i = IntervalDataType.last!
85+
assert_equal "P6Y5M4DT3H2M1S", i.maximum_term.iso8601
86+
end
8687

87-
def test_interval_type
88-
IntervalDataType.create!(
89-
maximum_term: 6.year + 5.month + 4.days + 3.hours + 2.minutes + 1.seconds,
90-
minimum_term: 1.year + 2.month + 3.days + 4.hours + 5.minutes + (6.234567).seconds,
91-
all_terms: [1.month, 1.year, 1.hour],
92-
legacy_term: "33 years",
93-
)
94-
i = IntervalDataType.last!
95-
96-
assert_equal "P6Y5M4DT3H2M1S", i.maximum_term.iso8601
97-
assert_equal "P1Y2M3DT4H5M6.235S", i.minimum_term.iso8601
98-
assert_equal "P3Y", i.default_term.iso8601
99-
assert_equal %w[ P1M P1Y PT1H ], i.all_terms.map(&:iso8601)
100-
assert_equal "33 years", i.legacy_term
101-
end
88+
def test_interval_type
89+
IntervalDataType.create!(
90+
maximum_term: 6.year + 5.month + 4.days + 3.hours + 2.minutes + 1.seconds,
91+
minimum_term: 1.year + 2.month + 3.days + 4.hours + 5.minutes + (6.234567).seconds,
92+
all_terms: [1.month, 1.year, 1.hour],
93+
legacy_term: "33 years",
94+
)
95+
i = IntervalDataType.last!
96+
97+
assert_equal "P6Y5M4DT3H2M1S", i.maximum_term.iso8601
98+
assert_equal "P1Y2M3DT4H5M6.235S", i.minimum_term.iso8601
99+
assert_equal "P3Y", i.default_term.iso8601
100+
assert_equal %w[ P1M P1Y PT1H ], i.all_terms.map(&:iso8601)
101+
assert_equal "33 years", i.legacy_term
102+
end
102103

103-
def test_interval_type_cast_from_invalid_string
104-
i = IntervalDataType.create!(maximum_term: "1 year 2 minutes")
105-
i.reload
106-
assert_nil i.maximum_term
107-
end
104+
def test_interval_type_cast_from_invalid_string
105+
i = IntervalDataType.create!(maximum_term: "1 year 2 minutes")
106+
i.reload
107+
assert_nil i.maximum_term
108+
end
108109

109-
def test_interval_type_cast_from_numeric
110-
i = IntervalDataType.create!(minimum_term: 36000)
111-
i.reload
112-
assert_equal "PT10H", i.minimum_term.iso8601
113-
end
110+
def test_interval_type_cast_from_numeric
111+
i = IntervalDataType.create!(minimum_term: 36000)
112+
i.reload
113+
assert_equal "PT10H", i.minimum_term.iso8601
114+
end
114115

115-
def test_interval_type_cast_from_numeric_with_fraction
116-
i = IntervalDataType.create!(minimum_term: 36000.05)
117-
i.reload
118-
assert_equal "PT10H0.05S", i.minimum_term.iso8601
119-
end
116+
def test_interval_type_cast_from_numeric_with_fraction
117+
i = IntervalDataType.create!(minimum_term: 36000.05)
118+
i.reload
119+
assert_equal "PT10H0.05S", i.minimum_term.iso8601
120+
end
120121

121-
def test_interval_type_cast_string_and_numeric_from_user
122-
i = IntervalDataType.new(maximum_term: "P1YT2M", minimum_term: "PT10H", legacy_term: "P1DT1H")
123-
assert i.maximum_term.is_a?(ActiveSupport::Duration)
124-
assert i.legacy_term.is_a?(String)
125-
assert_equal "P1YT2M", i.maximum_term.iso8601
126-
assert_equal "PT10H", i.minimum_term.iso8601
127-
assert_equal "P1DT1H", i.legacy_term
128-
end
122+
def test_interval_type_cast_string_and_numeric_from_user
123+
i = IntervalDataType.new(maximum_term: "P1YT2M", minimum_term: "PT10H", legacy_term: "P1DT1H")
124+
assert i.maximum_term.is_a?(ActiveSupport::Duration)
125+
assert i.legacy_term.is_a?(String)
126+
assert_equal "P1YT2M", i.maximum_term.iso8601
127+
assert_equal "PT10H", i.minimum_term.iso8601
128+
assert_equal "P1DT1H", i.legacy_term
129+
end
129130

130-
def test_deprecated_legacy_type
131-
assert_deprecated do
132-
DeprecatedIntervalDataType.new
131+
def test_deprecated_legacy_type
132+
assert_deprecated do
133+
DeprecatedIntervalDataType.new
134+
end
133135
end
134-
end
135136

136-
def test_schema_dump_with_default_value
137-
output = dump_table_schema "interval_data_types"
138-
assert_match %r{t\.interval "default_term", default: "3 years 0 mons 0 days 0 hours 0 minutes 0 seconds"}, output
137+
def test_schema_dump_with_default_value
138+
output = dump_table_schema "interval_data_types"
139+
assert_match %r{t\.interval "default_term", default: "3 years 0 mons 0 days 0 hours 0 minutes 0 seconds"}, output
140+
end
139141
end
140-
end
142+
end

test/cases/adapters/postgresql/uuid_test.rb

Lines changed: 38 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3,52 +3,54 @@
33
require "cases/helper"
44
require "support/schema_dumping_helper"
55

6-
module PostgresqlUUIDHelper
7-
def connection
8-
@connection ||= ActiveRecord::Base.connection
9-
end
6+
module CockroachDB
7+
module PostgresqlUUIDHelper
8+
def connection
9+
@connection ||= ActiveRecord::Base.connection
10+
end
1011

11-
def drop_table(name)
12-
connection.drop_table name, if_exists: true
13-
end
12+
def drop_table(name)
13+
connection.drop_table name, if_exists: true
14+
end
1415

15-
def uuid_function
16-
connection.supports_pgcrypto_uuid? ? "gen_random_uuid()" : "uuid_generate_v4()"
17-
end
16+
def uuid_function
17+
connection.supports_pgcrypto_uuid? ? "gen_random_uuid()" : "uuid_generate_v4()"
18+
end
1819

19-
def uuid_default
20-
connection.supports_pgcrypto_uuid? ? {} : { default: uuid_function }
20+
def uuid_default
21+
connection.supports_pgcrypto_uuid? ? {} : { default: uuid_function }
22+
end
2123
end
22-
end
2324

24-
class PostgresqlUUIDTest < ActiveRecord::PostgreSQLTestCase
25-
include PostgresqlUUIDHelper
26-
include SchemaDumpingHelper
25+
class PostgresqlUUIDTest < ActiveRecord::PostgreSQLTestCase
26+
include PostgresqlUUIDHelper
27+
include SchemaDumpingHelper
2728

28-
class UUIDType < ActiveRecord::Base
29-
self.table_name = "uuid_data_type"
30-
end
29+
class UUIDType < ActiveRecord::Base
30+
self.table_name = "uuid_data_type"
31+
end
3132

32-
setup do
33-
enable_extension!("uuid-ossp", connection)
34-
enable_extension!("pgcrypto", connection) if connection.supports_pgcrypto_uuid?
33+
setup do
34+
enable_extension!("uuid-ossp", connection)
35+
enable_extension!("pgcrypto", connection) if connection.supports_pgcrypto_uuid?
3536

36-
connection.create_table "uuid_data_type" do |t|
37-
t.uuid "guid"
37+
connection.create_table "uuid_data_type" do |t|
38+
t.uuid "guid"
39+
end
3840
end
39-
end
4041

41-
teardown do
42-
drop_table "uuid_data_type"
43-
end
42+
teardown do
43+
drop_table "uuid_data_type"
44+
end
4445

4546

46-
# This test case is nearly identical to the ActiveRecord test, except that
47-
# the input guid is a valid UUID since CockroachDB will raise an exception
48-
# if the UUID is invalid whereas Postgres won't.
49-
def test_uuid_change_case_does_not_mark_dirty
50-
model = UUIDType.create!(guid: "A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11")
51-
model.guid = model.guid.swapcase
52-
assert_not_predicate model, :changed?
47+
# This test case is nearly identical to the ActiveRecord test, except that
48+
# the input guid is a valid UUID since CockroachDB will raise an exception
49+
# if the UUID is invalid whereas Postgres won't.
50+
def test_uuid_change_case_does_not_mark_dirty
51+
model = UUIDType.create!(guid: "A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11")
52+
model.guid = model.guid.swapcase
53+
assert_not_predicate model, :changed?
54+
end
5355
end
54-
end
56+
end

0 commit comments

Comments
 (0)