postgres_ext 0.3.1 → 0.4.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.
- checksums.yaml +7 -0
- data/.travis.yml +15 -5
- data/CHANGELOG.md +3 -0
- data/Gemfile +2 -2
- data/README.md +4 -0
- data/docs/type_casting.md +19 -0
- data/lib/postgres_ext/active_record/connection_adapters/postgres_adapter.rb +149 -3
- data/lib/postgres_ext/active_record/relation/predicate_builder.rb +1 -1
- data/lib/postgres_ext/version.rb +1 -1
- data/spec/columns/array_spec.rb +3 -4
- data/spec/columns/ranges/daterange_spec.rb +37 -0
- data/spec/columns/ranges/int4range_spec.rb +38 -0
- data/spec/columns/ranges/int8range_spec.rb +38 -0
- data/spec/columns/ranges/numrange_spec.rb +37 -0
- data/spec/columns/ranges/tsrange_spec.rb +37 -0
- data/spec/dummy/app/models/person.rb +1 -1
- data/spec/dummy/config/application.rb +1 -1
- data/spec/dummy/db/migrate/20120501163758_create_people.rb +1 -0
- data/spec/dummy/db/schema.rb +9 -8
- data/spec/migrations/array_spec.rb +20 -0
- data/spec/migrations/ranges/daterange_spec.rb +27 -0
- data/spec/migrations/ranges/int4range_spec.rb +27 -0
- data/spec/migrations/ranges/int8range_spec.rb +27 -0
- data/spec/migrations/ranges/numrange_spec.rb +27 -0
- data/spec/migrations/ranges/tsrange_spec.rb +27 -0
- data/spec/migrations/ranges/tstzrange_spec.rb +27 -0
- data/spec/models/ranges/daterange_spec.rb +88 -0
- data/spec/models/ranges/int4range_spec.rb +85 -0
- data/spec/models/ranges/int8range_spec.rb +85 -0
- data/spec/models/ranges/numrange_spec.rb +85 -0
- data/spec/models/ranges/tsrange_spec.rb +89 -0
- data/spec/models/ranges/tstzrange_spec.rb +89 -0
- data/spec/queries/sanity_spec.rb +1 -0
- data/spec/schema_dumper/array_spec.rb +1 -1
- data/spec/schema_dumper/ranges/daterange_spec.rb +18 -0
- data/spec/schema_dumper/ranges/int4range_spec.rb +18 -0
- data/spec/schema_dumper/ranges/int8range_spec.rb +18 -0
- data/spec/schema_dumper/ranges/numrange_spec.rb +18 -0
- data/spec/schema_dumper/ranges/tsrange_spec.rb +18 -0
- data/spec/schema_dumper/ranges/tstzrange_spec.rb +17 -0
- metadata +53 -27
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'int8range column' do
|
4
|
+
let!(:adapter) { ActiveRecord::Base.connection }
|
5
|
+
let!(:int8_range_column) { ActiveRecord::ConnectionAdapters::PostgreSQLColumn.new 'field', nil, 'int8range'}
|
6
|
+
|
7
|
+
describe '#type_class' do
|
8
|
+
it 'converts an end-inclusive PostgreSQL integer range to a Ruby range' do
|
9
|
+
int8_range_column.type_cast('[0,4]').should eq 0..4
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'converts an end-exclusive PostgreSQL integer range to a Ruby range' do
|
13
|
+
int8_range_column.type_cast('[0,4)').should eq 0...4
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'converts an infinite PostgreSQL integer range to a Ruby range' do
|
17
|
+
int8_range_column.type_cast('(,4)').should eq -(1.0/0.0)...4
|
18
|
+
int8_range_column.type_cast('[0,)').should eq 0..(1.0/0.0)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe 'int8 range to SQL statment conversion' do
|
23
|
+
it 'returns an end-inclusive PostgreSQL range' do
|
24
|
+
value = int8_range_column.type_cast('[0,4]')
|
25
|
+
adapter.type_cast(value, int8_range_column).should eq '[0,4]'
|
26
|
+
end
|
27
|
+
it 'returns an end-exclusive PostgreSQL range' do
|
28
|
+
value = int8_range_column.type_cast('[0,4)')
|
29
|
+
adapter.type_cast(value, int8_range_column).should eq '[0,4)'
|
30
|
+
end
|
31
|
+
it 'converts an infinite PostgreSQL integer range to a Ruby range' do
|
32
|
+
value = int8_range_column.type_cast('(,4)')
|
33
|
+
adapter.type_cast(value, int8_range_column).should eq '(,4)'
|
34
|
+
value = int8_range_column.type_cast('[0,)')
|
35
|
+
adapter.type_cast(value, int8_range_column).should eq '[0,)'
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'numrange column' do
|
4
|
+
let!(:adapter) { ActiveRecord::Base.connection }
|
5
|
+
let!(:numeric_range_column) { ActiveRecord::ConnectionAdapters::PostgreSQLColumn.new 'field', nil, 'numrange'}
|
6
|
+
describe '#type_class' do
|
7
|
+
it 'converts an end-inclusive PostgreSQL integer range to a Ruby range' do
|
8
|
+
numeric_range_column.type_cast('[0,4.1]').should eq 0.0..4.1
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'converts an end-exclusive PostgreSQL integer range to a Ruby range' do
|
12
|
+
numeric_range_column.type_cast('[0,4)').should eq 0.0...4.0
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'converts an infinite PostgreSQL integer range to a Ruby range' do
|
16
|
+
numeric_range_column.type_cast('(,4)').should eq -(1.0/0.0)...4.0
|
17
|
+
numeric_range_column.type_cast('[0,)').should eq 0.0..(1.0/0.0)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe 'Numeric range to SQL statment conversion' do
|
22
|
+
it 'returns an end-inclusive PostgreSQL range' do
|
23
|
+
value = numeric_range_column.type_cast('[0,4.0]')
|
24
|
+
adapter.type_cast(value, numeric_range_column).should eq '[0.0,4.0]'
|
25
|
+
end
|
26
|
+
it 'returns an end-exclusive PostgreSQL range' do
|
27
|
+
value = numeric_range_column.type_cast('[0,4.0)')
|
28
|
+
adapter.type_cast(value, numeric_range_column).should eq '[0.0,4.0)'
|
29
|
+
end
|
30
|
+
it 'converts an infinite PostgreSQL integer range to a Ruby range' do
|
31
|
+
value = numeric_range_column.type_cast('(,4.0)')
|
32
|
+
adapter.type_cast(value, numeric_range_column).should eq '(,4.0)'
|
33
|
+
value = numeric_range_column.type_cast('[0,)')
|
34
|
+
adapter.type_cast(value, numeric_range_column).should eq '[0.0,)'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'tsrange column' do
|
4
|
+
let!(:adapter) { ActiveRecord::Base.connection }
|
5
|
+
let!(:ts_range_column) { ActiveRecord::ConnectionAdapters::PostgreSQLColumn.new 'field', nil, 'tsrange'}
|
6
|
+
|
7
|
+
describe '#type_class' do
|
8
|
+
it 'converts an end-inclusive PostgreSQL integer range to a Ruby range' do
|
9
|
+
ts_range_column.type_cast('[2011-01-01 12:34:00,2012-01-31 08:00:01]').should eq Time.new(2011, 01, 01, 12, 34)..Time.new(2012, 01, 31, 8, 0, 1)
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'converts an end-exclusive PostgreSQL integer range to a Ruby range' do
|
13
|
+
ts_range_column.type_cast('[2011-01-01 12:34:00,2012-01-31 08:00:01)').should eq Time.new(2011, 01, 01, 12, 34)...Time.new(2012, 01, 31, 8, 0, 1)
|
14
|
+
end
|
15
|
+
|
16
|
+
#it 'converts an infinite PostgreSQL integer range to a Ruby range' do
|
17
|
+
## Cannot have a range from -Infinity to a ts
|
18
|
+
## ts_range_column.type_cast('(,2011-01-01)').should eq -(1.0/0.0)...4
|
19
|
+
#ts_range_column.type_cast('[2011-01-01 12:34:00,)').should eq Time.new(2011,01,01, 12, 34)..(1.0/0.0)
|
20
|
+
#end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe 'Time range to SQL statment conversion' do
|
24
|
+
it 'returns an end-inclusive PostgreSQL range' do
|
25
|
+
value = ts_range_column.type_cast('[2011-01-01 12:34:00,2012-01-31 08:00:01]')
|
26
|
+
adapter.type_cast(value, ts_range_column).should eq '[2011-01-01 12:34:00,2012-01-31 08:00:01]'
|
27
|
+
end
|
28
|
+
it 'returns an end-exclusive PostgreSQL range' do
|
29
|
+
value = ts_range_column.type_cast('[2011-01-01 12:34:00,2012-01-31 08:00:01)')
|
30
|
+
adapter.type_cast(value, ts_range_column).should eq '[2011-01-01 12:34:00,2012-01-31 08:00:01)'
|
31
|
+
end
|
32
|
+
#it 'converts an infinite PostgreSQL integer range to a Ruby range' do
|
33
|
+
#value = ts_range_column.type_cast('[2011-01-01 12:34:00,)')
|
34
|
+
#adapter.type_cast(value, ts_range_column).should eq '[2011-01-01 12:34:00,)'
|
35
|
+
#end
|
36
|
+
end
|
37
|
+
end
|
@@ -27,7 +27,7 @@ module Dummy
|
|
27
27
|
|
28
28
|
# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
|
29
29
|
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
|
30
|
-
|
30
|
+
config.time_zone = 'Eastern Time (US & Canada)'
|
31
31
|
|
32
32
|
# The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
|
33
33
|
# config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
|
data/spec/dummy/db/schema.rb
CHANGED
@@ -14,14 +14,15 @@
|
|
14
14
|
ActiveRecord::Schema.define(:version => 20120501163758) do
|
15
15
|
|
16
16
|
create_table "people", :force => true do |t|
|
17
|
-
t.inet
|
18
|
-
t.cidr
|
19
|
-
t.integer
|
20
|
-
t.string
|
21
|
-
t.text
|
22
|
-
t.integer
|
23
|
-
t.
|
24
|
-
t.datetime
|
17
|
+
t.inet "ip"
|
18
|
+
t.cidr "subnet"
|
19
|
+
t.integer "tag_ids", :array => true
|
20
|
+
t.string "tags", :array => true
|
21
|
+
t.text "biography"
|
22
|
+
t.integer "lucky_number"
|
23
|
+
t.num_rang "num_range"
|
24
|
+
t.datetime "created_at", :null => false
|
25
|
+
t.datetime "updated_at", :null => false
|
25
26
|
end
|
26
27
|
|
27
28
|
end
|
@@ -82,6 +82,26 @@ describe 'Array migrations' do
|
|
82
82
|
end
|
83
83
|
end
|
84
84
|
|
85
|
+
context 'Change Column' do
|
86
|
+
after { connection.drop_table :data_types }
|
87
|
+
it 'updates the column definitions' do
|
88
|
+
lambda do
|
89
|
+
connection.create_table :data_types do |t|
|
90
|
+
t.integer :array_1, :array => true, :default => []
|
91
|
+
end
|
92
|
+
|
93
|
+
connection.change_column :data_types, :array_1, :integer, :array => true, :default => [], :null => false
|
94
|
+
end.should_not raise_exception
|
95
|
+
|
96
|
+
columns = connection.columns(:data_types)
|
97
|
+
|
98
|
+
array_1 = columns.detect { |c| c.name == 'array_1'}
|
99
|
+
array_1.sql_type.should eq 'integer[]'
|
100
|
+
array_1.default.should eq []
|
101
|
+
array_1.null.should be_false
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
85
105
|
context 'Default Values' do
|
86
106
|
describe 'String defaults' do
|
87
107
|
after { connection.drop_table :default_strings }
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'daterange migrations' do
|
4
|
+
let!(:connection) { ActiveRecord::Base.connection }
|
5
|
+
after { connection.drop_table :data_types }
|
6
|
+
|
7
|
+
it 'creates an daterange column' do
|
8
|
+
lambda do
|
9
|
+
connection.create_table :data_types do |t|
|
10
|
+
t.daterange :date_range_1
|
11
|
+
t.daterange :date_range_2, :date_range_3
|
12
|
+
t.column :date_range_4, :daterange
|
13
|
+
end
|
14
|
+
end.should_not raise_exception
|
15
|
+
|
16
|
+
columns = connection.columns(:data_types)
|
17
|
+
date_range_1 = columns.detect { |c| c.name == 'date_range_1'}
|
18
|
+
date_range_2 = columns.detect { |c| c.name == 'date_range_2'}
|
19
|
+
date_range_3 = columns.detect { |c| c.name == 'date_range_3'}
|
20
|
+
date_range_4 = columns.detect { |c| c.name == 'date_range_4'}
|
21
|
+
|
22
|
+
date_range_1.sql_type.should eq 'daterange'
|
23
|
+
date_range_2.sql_type.should eq 'daterange'
|
24
|
+
date_range_3.sql_type.should eq 'daterange'
|
25
|
+
date_range_4.sql_type.should eq 'daterange'
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'int4range migrations' do
|
4
|
+
let!(:connection) { ActiveRecord::Base.connection }
|
5
|
+
after { connection.drop_table :data_types }
|
6
|
+
|
7
|
+
it 'creates an numrange column' do
|
8
|
+
lambda do
|
9
|
+
connection.create_table :data_types do |t|
|
10
|
+
t.int4range :range_1
|
11
|
+
t.int4range :range_2, :range_3
|
12
|
+
t.column :range_4, :int4range
|
13
|
+
end
|
14
|
+
end.should_not raise_exception
|
15
|
+
|
16
|
+
columns = connection.columns(:data_types)
|
17
|
+
range_1 = columns.detect { |c| c.name == 'range_1'}
|
18
|
+
range_2 = columns.detect { |c| c.name == 'range_2'}
|
19
|
+
range_3 = columns.detect { |c| c.name == 'range_3'}
|
20
|
+
range_4 = columns.detect { |c| c.name == 'range_4'}
|
21
|
+
|
22
|
+
range_1.sql_type.should eq 'int4range'
|
23
|
+
range_2.sql_type.should eq 'int4range'
|
24
|
+
range_3.sql_type.should eq 'int4range'
|
25
|
+
range_4.sql_type.should eq 'int4range'
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'int8range migrations' do
|
4
|
+
let!(:connection) { ActiveRecord::Base.connection }
|
5
|
+
after { connection.drop_table :data_types }
|
6
|
+
|
7
|
+
it 'creates an numrange column' do
|
8
|
+
lambda do
|
9
|
+
connection.create_table :data_types do |t|
|
10
|
+
t.int8range :range_1
|
11
|
+
t.int8range :range_2, :range_3
|
12
|
+
t.column :range_4, :int8range
|
13
|
+
end
|
14
|
+
end.should_not raise_exception
|
15
|
+
|
16
|
+
columns = connection.columns(:data_types)
|
17
|
+
range_1 = columns.detect { |c| c.name == 'range_1'}
|
18
|
+
range_2 = columns.detect { |c| c.name == 'range_2'}
|
19
|
+
range_3 = columns.detect { |c| c.name == 'range_3'}
|
20
|
+
range_4 = columns.detect { |c| c.name == 'range_4'}
|
21
|
+
|
22
|
+
range_1.sql_type.should eq 'int8range'
|
23
|
+
range_2.sql_type.should eq 'int8range'
|
24
|
+
range_3.sql_type.should eq 'int8range'
|
25
|
+
range_4.sql_type.should eq 'int8range'
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'numrange migrations' do
|
4
|
+
let!(:connection) { ActiveRecord::Base.connection }
|
5
|
+
after { connection.drop_table :data_types }
|
6
|
+
|
7
|
+
it 'creates an numrange column' do
|
8
|
+
lambda do
|
9
|
+
connection.create_table :data_types do |t|
|
10
|
+
t.numrange :num_range_1
|
11
|
+
t.numrange :num_range_2, :num_range_3
|
12
|
+
t.column :num_range_4, :numrange
|
13
|
+
end
|
14
|
+
end.should_not raise_exception
|
15
|
+
|
16
|
+
columns = connection.columns(:data_types)
|
17
|
+
num_range_1 = columns.detect { |c| c.name == 'num_range_1'}
|
18
|
+
num_range_2 = columns.detect { |c| c.name == 'num_range_2'}
|
19
|
+
num_range_3 = columns.detect { |c| c.name == 'num_range_3'}
|
20
|
+
num_range_4 = columns.detect { |c| c.name == 'num_range_4'}
|
21
|
+
|
22
|
+
num_range_1.sql_type.should eq 'numrange'
|
23
|
+
num_range_2.sql_type.should eq 'numrange'
|
24
|
+
num_range_3.sql_type.should eq 'numrange'
|
25
|
+
num_range_4.sql_type.should eq 'numrange'
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'tsrange migrations' do
|
4
|
+
let!(:connection) { ActiveRecord::Base.connection }
|
5
|
+
after { connection.drop_table :data_types }
|
6
|
+
|
7
|
+
it 'creates an tsrange column' do
|
8
|
+
lambda do
|
9
|
+
connection.create_table :data_types do |t|
|
10
|
+
t.tsrange :ts_range_1
|
11
|
+
t.tsrange :ts_range_2, :ts_range_3
|
12
|
+
t.column :ts_range_4, :tsrange
|
13
|
+
end
|
14
|
+
end.should_not raise_exception
|
15
|
+
|
16
|
+
columns = connection.columns(:data_types)
|
17
|
+
ts_range_1 = columns.detect { |c| c.name == 'ts_range_1'}
|
18
|
+
ts_range_2 = columns.detect { |c| c.name == 'ts_range_2'}
|
19
|
+
ts_range_3 = columns.detect { |c| c.name == 'ts_range_3'}
|
20
|
+
ts_range_4 = columns.detect { |c| c.name == 'ts_range_4'}
|
21
|
+
|
22
|
+
ts_range_1.sql_type.should eq 'tsrange'
|
23
|
+
ts_range_2.sql_type.should eq 'tsrange'
|
24
|
+
ts_range_3.sql_type.should eq 'tsrange'
|
25
|
+
ts_range_4.sql_type.should eq 'tsrange'
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'tstzrange migrations' do
|
4
|
+
let!(:connection) { ActiveRecord::Base.connection }
|
5
|
+
after { connection.drop_table :data_types }
|
6
|
+
|
7
|
+
it 'creates an tstzrange column' do
|
8
|
+
lambda do
|
9
|
+
connection.create_table :data_types do |t|
|
10
|
+
t.tstzrange :tstz_range_1
|
11
|
+
t.tstzrange :tstz_range_2, :tstz_range_3
|
12
|
+
t.column :tstz_range_4, :tstzrange
|
13
|
+
end
|
14
|
+
end.should_not raise_exception
|
15
|
+
|
16
|
+
columns = connection.columns(:data_types)
|
17
|
+
tstz_range_1 = columns.detect { |c| c.name == 'tstz_range_1'}
|
18
|
+
tstz_range_2 = columns.detect { |c| c.name == 'tstz_range_2'}
|
19
|
+
tstz_range_3 = columns.detect { |c| c.name == 'tstz_range_3'}
|
20
|
+
tstz_range_4 = columns.detect { |c| c.name == 'tstz_range_4'}
|
21
|
+
|
22
|
+
tstz_range_1.sql_type.should eq 'tstzrange'
|
23
|
+
tstz_range_2.sql_type.should eq 'tstzrange'
|
24
|
+
tstz_range_3.sql_type.should eq 'tstzrange'
|
25
|
+
tstz_range_4.sql_type.should eq 'tstzrange'
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Models with daterange columns' do
|
4
|
+
let!(:adapter) { ActiveRecord::Base.connection }
|
5
|
+
|
6
|
+
context 'no default value, range' do
|
7
|
+
before do
|
8
|
+
adapter.create_table :date_rangers, :force => true do |t|
|
9
|
+
t.daterange :best_estimate
|
10
|
+
end
|
11
|
+
class DateRanger < ActiveRecord::Base
|
12
|
+
attr_accessible :best_estimate
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
after do
|
17
|
+
adapter.drop_table :date_rangers
|
18
|
+
Object.send(:remove_const, :DateRanger)
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '#create' do
|
22
|
+
it 'creates an record when there is no assignment' do
|
23
|
+
range = DateRanger.create()
|
24
|
+
range.reload
|
25
|
+
range.best_estimate.should eq nil
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'creates an record with a range' do
|
29
|
+
date_range = Date.new(2011, 01, 01)..Date.new(2012, 01, 31)
|
30
|
+
range = DateRanger.create( :best_estimate => date_range)
|
31
|
+
range.reload
|
32
|
+
range.best_estimate.should eq Date.new(2011, 01, 01)...Date.new(2012, 02, 01)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe 'range assignment' do
|
37
|
+
it 'updates an record with an range string' do
|
38
|
+
date_range = Date.new(2011, 01, 01)..Date.new(2012, 01, 31)
|
39
|
+
new_date_range = Date.new(2012, 01, 01)...Date.new(2012, 02, 01)
|
40
|
+
range = DateRanger.create( :best_estimate => date_range)
|
41
|
+
range.best_estimate = new_date_range
|
42
|
+
range.save
|
43
|
+
|
44
|
+
range.reload
|
45
|
+
range.best_estimate.should eq new_date_range
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'converts empty strings to nil' do
|
49
|
+
range = DateRanger.create
|
50
|
+
range.best_estimate = ''
|
51
|
+
range.save
|
52
|
+
|
53
|
+
range.reload
|
54
|
+
range.best_estimate.should eq nil
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
context 'default value, date range' do
|
60
|
+
before do
|
61
|
+
adapter.create_table :date_default_rangers, :force => true do |t|
|
62
|
+
t.daterange :best_estimate, :default => Date.new(2011, 01, 01)..Date.new(2011, 01, 31)
|
63
|
+
end
|
64
|
+
class DateDefaultRanger < ActiveRecord::Base
|
65
|
+
attr_accessible :best_estimate
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
after do
|
70
|
+
adapter.drop_table :date_default_rangers
|
71
|
+
Object.send(:remove_const, :DateDefaultRanger)
|
72
|
+
end
|
73
|
+
|
74
|
+
describe '#create' do
|
75
|
+
it 'creates an record when there is no assignment' do
|
76
|
+
range = DateDefaultRanger.create()
|
77
|
+
range.reload
|
78
|
+
range.best_estimate.should eq Date.new(2011, 01, 01)...Date.new(2011, 02, 01)
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'creates an record with a range' do
|
82
|
+
range = DateDefaultRanger.create(:best_estimate => Date.new(2012, 01, 01)..Date.new(2012, 12, 31))
|
83
|
+
range.reload
|
84
|
+
range.best_estimate.should eq Date.new(2012, 01, 01)...Date.new(2013, 01, 01)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|