33require "cases/helper"
44require "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
0 commit comments