couchrest_model 2.1.0.rc1 → 2.2.0.beta1
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 +4 -4
- data/.gitignore +1 -1
- data/.travis.yml +15 -4
- data/Gemfile.activesupport-4.x +4 -0
- data/Gemfile.activesupport-5.x +4 -0
- data/README.md +2 -0
- data/VERSION +1 -1
- data/couchrest_model.gemspec +3 -2
- data/history.md +14 -1
- data/lib/couchrest/model/associations.rb +3 -8
- data/lib/couchrest/model/base.rb +15 -7
- data/lib/couchrest/model/casted_array.rb +22 -34
- data/lib/couchrest/model/configuration.rb +2 -0
- data/lib/couchrest/model/design.rb +4 -3
- data/lib/couchrest/model/designs/view.rb +37 -32
- data/lib/couchrest/model/dirty.rb +93 -19
- data/lib/couchrest/model/embeddable.rb +2 -14
- data/lib/couchrest/model/extended_attachments.rb +2 -4
- data/lib/couchrest/model/persistence.rb +14 -17
- data/lib/couchrest/model/properties.rb +46 -54
- data/lib/couchrest/model/property.rb +0 -3
- data/lib/couchrest/model/proxyable.rb +20 -4
- data/lib/couchrest/model/validations/uniqueness.rb +4 -1
- data/lib/couchrest_model.rb +2 -2
- data/spec/fixtures/models/article.rb +1 -1
- data/spec/fixtures/models/card.rb +2 -1
- data/spec/fixtures/models/person.rb +1 -0
- data/spec/fixtures/models/project.rb +3 -0
- data/spec/unit/assocations_spec.rb +73 -73
- data/spec/unit/attachment_spec.rb +34 -34
- data/spec/unit/base_spec.rb +102 -102
- data/spec/unit/casted_array_spec.rb +7 -7
- data/spec/unit/casted_spec.rb +7 -7
- data/spec/unit/configuration_spec.rb +11 -11
- data/spec/unit/connection_spec.rb +30 -30
- data/spec/unit/core_extensions/{time_parsing.rb → time_parsing_spec.rb} +21 -21
- data/spec/unit/design_spec.rb +38 -38
- data/spec/unit/designs/design_mapper_spec.rb +26 -26
- data/spec/unit/designs/migrations_spec.rb +13 -13
- data/spec/unit/designs/view_spec.rb +319 -274
- data/spec/unit/designs_spec.rb +39 -39
- data/spec/unit/dirty_spec.rb +188 -103
- data/spec/unit/embeddable_spec.rb +119 -117
- data/spec/unit/inherited_spec.rb +4 -4
- data/spec/unit/persistence_spec.rb +122 -122
- data/spec/unit/properties_spec.rb +466 -16
- data/spec/unit/property_protection_spec.rb +32 -32
- data/spec/unit/property_spec.rb +45 -436
- data/spec/unit/proxyable_spec.rb +140 -82
- data/spec/unit/subclass_spec.rb +14 -14
- data/spec/unit/translations_spec.rb +5 -5
- data/spec/unit/typecast_spec.rb +131 -131
- data/spec/unit/utils/migrate_spec.rb +2 -2
- data/spec/unit/validations_spec.rb +31 -31
- metadata +27 -12
- data/lib/couchrest/model/casted_hash.rb +0 -84
@@ -17,9 +17,9 @@ describe CouchRest::Model::CastedArray do
|
|
17
17
|
prop = double('Property')
|
18
18
|
parent = double('Parent')
|
19
19
|
obj = klass.new([], prop, parent)
|
20
|
-
obj.casted_by_property.
|
21
|
-
obj.casted_by.
|
22
|
-
obj.
|
20
|
+
expect(obj.casted_by_property).to eql(prop)
|
21
|
+
expect(obj.casted_by).to eql(parent)
|
22
|
+
expect(obj).to be_empty
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
@@ -34,16 +34,16 @@ describe CouchRest::Model::CastedArray do
|
|
34
34
|
], property)
|
35
35
|
end
|
36
36
|
it "should return an array" do
|
37
|
-
obj.as_couch_json.
|
37
|
+
expect(obj.as_couch_json).to be_a(Array)
|
38
38
|
end
|
39
39
|
it "should call as_couch_json on each value" do
|
40
|
-
obj.first.
|
40
|
+
expect(obj.first).to receive(:as_couch_json)
|
41
41
|
obj.as_couch_json
|
42
42
|
end
|
43
43
|
it "should return value if no as_couch_json method" do
|
44
44
|
obj = klass.new(['Felix', 'Garfield'], CouchRest::Model::Property.new(:title, :type => String))
|
45
|
-
obj.first.
|
46
|
-
obj.as_couch_json.first.
|
45
|
+
expect(obj.first).not_to respond_to(:as_couch_json)
|
46
|
+
expect(obj.as_couch_json.first).to eql('Felix')
|
47
47
|
end
|
48
48
|
|
49
49
|
end
|
data/spec/unit/casted_spec.rb
CHANGED
@@ -23,11 +23,11 @@ describe "casting an extended document" do
|
|
23
23
|
end
|
24
24
|
|
25
25
|
it "should retain all properties of the casted attribute" do
|
26
|
-
@car.driver.
|
26
|
+
expect(@car.driver).to eq(@driver)
|
27
27
|
end
|
28
28
|
|
29
29
|
it "should let the casted document know who casted it" do
|
30
|
-
@car.driver.casted_by.
|
30
|
+
expect(@car.driver.casted_by).to eq(@car)
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
@@ -39,17 +39,17 @@ describe "assigning a value to casted attribute after initializing an object" do
|
|
39
39
|
end
|
40
40
|
|
41
41
|
it "should not create an empty casted object" do
|
42
|
-
@car.driver.
|
42
|
+
expect(@car.driver).to be_nil
|
43
43
|
end
|
44
44
|
|
45
45
|
it "should let you assign the value" do
|
46
46
|
@car.driver = @driver
|
47
|
-
@car.driver.name.
|
47
|
+
expect(@car.driver.name).to eq('Matt')
|
48
48
|
end
|
49
49
|
|
50
50
|
it "should cast attribute" do
|
51
51
|
@car.driver = JSON.parse(@driver.to_json)
|
52
|
-
@car.driver.
|
52
|
+
expect(@car.driver).to be_instance_of(Driver)
|
53
53
|
end
|
54
54
|
|
55
55
|
end
|
@@ -63,10 +63,10 @@ describe "casting a model from parsed JSON" do
|
|
63
63
|
end
|
64
64
|
|
65
65
|
it "should cast casted attribute" do
|
66
|
-
@new_car.driver.
|
66
|
+
expect(@new_car.driver).to be_instance_of(Driver)
|
67
67
|
end
|
68
68
|
|
69
69
|
it "should retain all properties of the casted attribute" do
|
70
|
-
@new_car.driver.
|
70
|
+
expect(@new_car.driver).to eq(@driver)
|
71
71
|
end
|
72
72
|
end
|
@@ -13,7 +13,7 @@ describe CouchRest::Model::Configuration do
|
|
13
13
|
@class.configure do |config|
|
14
14
|
config.foo_bar = 'monkey'
|
15
15
|
end
|
16
|
-
@class.foo_bar.
|
16
|
+
expect(@class.foo_bar).to eq('monkey')
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
@@ -22,7 +22,7 @@ describe CouchRest::Model::Configuration do
|
|
22
22
|
it "should add a class level accessor" do
|
23
23
|
@class.add_config :foo_bar
|
24
24
|
@class.foo_bar = 'foo'
|
25
|
-
@class.foo_bar.
|
25
|
+
expect(@class.foo_bar).to eq('foo')
|
26
26
|
end
|
27
27
|
|
28
28
|
['foo', :foo, 45, ['foo', :bar]].each do |val|
|
@@ -31,13 +31,13 @@ describe CouchRest::Model::Configuration do
|
|
31
31
|
@child_class = Class.new(@class)
|
32
32
|
|
33
33
|
@class.foo_bar = val
|
34
|
-
@class.foo_bar.
|
35
|
-
@child_class.foo_bar.
|
34
|
+
expect(@class.foo_bar).to eq(val)
|
35
|
+
expect(@child_class.foo_bar).to eq(val)
|
36
36
|
|
37
37
|
@child_class.foo_bar = "bar"
|
38
|
-
@child_class.foo_bar.
|
38
|
+
expect(@child_class.foo_bar).to eq("bar")
|
39
39
|
|
40
|
-
@class.foo_bar.
|
40
|
+
expect(@class.foo_bar).to eq(val)
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
@@ -45,13 +45,13 @@ describe CouchRest::Model::Configuration do
|
|
45
45
|
it "should add an instance level accessor" do
|
46
46
|
@class.add_config :foo_bar
|
47
47
|
@class.foo_bar = 'foo'
|
48
|
-
@class.new.foo_bar.
|
48
|
+
expect(@class.new.foo_bar).to eq('foo')
|
49
49
|
end
|
50
50
|
|
51
51
|
it "should add a convenient in-class setter" do
|
52
52
|
@class.add_config :foo_bar
|
53
53
|
@class.foo_bar "monkey"
|
54
|
-
@class.foo_bar.
|
54
|
+
expect(@class.foo_bar).to eq("monkey")
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
@@ -67,10 +67,10 @@ describe CouchRest::Model::Configuration do
|
|
67
67
|
Cat.instance_eval do
|
68
68
|
model_type_key 'cat-type'
|
69
69
|
end
|
70
|
-
CouchRest::Model::Base.model_type_key.
|
71
|
-
Cat.model_type_key.
|
70
|
+
expect(CouchRest::Model::Base.model_type_key).to eql(default_model_key)
|
71
|
+
expect(Cat.model_type_key).to eql('cat-type')
|
72
72
|
cat = Cat.new
|
73
|
-
cat.model_type_key.
|
73
|
+
expect(cat.model_type_key).to eql('cat-type')
|
74
74
|
end
|
75
75
|
end
|
76
76
|
|
@@ -14,20 +14,20 @@ describe CouchRest::Model::Connection do
|
|
14
14
|
|
15
15
|
describe "#database" do
|
16
16
|
it "should respond to" do
|
17
|
-
@obj.
|
17
|
+
expect(@obj).to respond_to(:database)
|
18
18
|
end
|
19
19
|
it "should provided class's database" do
|
20
|
-
@obj.class.
|
20
|
+
expect(@obj.class).to receive :database
|
21
21
|
@obj.database
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
25
|
describe "#server" do
|
26
26
|
it "should respond to method" do
|
27
|
-
@obj.
|
27
|
+
expect(@obj).to respond_to(:server)
|
28
28
|
end
|
29
29
|
it "should return class's server" do
|
30
|
-
@obj.class.
|
30
|
+
expect(@obj.class).to receive :server
|
31
31
|
@obj.server
|
32
32
|
end
|
33
33
|
end
|
@@ -36,13 +36,13 @@ describe CouchRest::Model::Connection do
|
|
36
36
|
describe "default configuration" do
|
37
37
|
|
38
38
|
it "should provide environment" do
|
39
|
-
@class.environment.
|
39
|
+
expect(@class.environment).to eql(:development)
|
40
40
|
end
|
41
41
|
it "should provide connection config file" do
|
42
|
-
@class.connection_config_file.
|
42
|
+
expect(@class.connection_config_file).to eql(File.join(Dir.pwd, 'config', 'couchdb.yml'))
|
43
43
|
end
|
44
44
|
it "should provided simple connection details" do
|
45
|
-
@class.connection[:prefix].
|
45
|
+
expect(@class.connection[:prefix]).to eql('couchrest')
|
46
46
|
end
|
47
47
|
|
48
48
|
end
|
@@ -51,46 +51,46 @@ describe CouchRest::Model::Connection do
|
|
51
51
|
|
52
52
|
describe ".use_database" do
|
53
53
|
it "should respond to" do
|
54
|
-
@class.
|
54
|
+
expect(@class).to respond_to(:use_database)
|
55
55
|
end
|
56
56
|
it "should set the database if object provided" do
|
57
57
|
db = @class.server.database('test')
|
58
58
|
@class.use_database(db)
|
59
|
-
@class.database.
|
59
|
+
expect(@class.database).to eql(db)
|
60
60
|
end
|
61
61
|
it "should never prepare the database before it is needed" do
|
62
62
|
db = @class.server.database('test')
|
63
|
-
@class.
|
63
|
+
expect(@class).not_to receive(:prepare_database)
|
64
64
|
@class.use_database('test')
|
65
65
|
@class.use_database(db)
|
66
66
|
end
|
67
67
|
it "should use the database specified" do
|
68
68
|
@class.use_database(:test)
|
69
|
-
@class.database.name.
|
69
|
+
expect(@class.database.name).to eql('couchrest_test')
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
73
73
|
describe ".database" do
|
74
74
|
it "should respond to" do
|
75
|
-
@class.
|
75
|
+
expect(@class).to respond_to(:database)
|
76
76
|
end
|
77
77
|
it "should provide a database object" do
|
78
|
-
@class.database.
|
78
|
+
expect(@class.database).to be_a(CouchRest::Database)
|
79
79
|
end
|
80
80
|
it "should provide a database with default name" do
|
81
|
-
@class.database.name.
|
81
|
+
expect(@class.database.name).to eql('couchrest')
|
82
82
|
end
|
83
83
|
end
|
84
84
|
|
85
85
|
describe ".server" do
|
86
86
|
it "should respond to" do
|
87
|
-
@class.
|
87
|
+
expect(@class).to respond_to(:server)
|
88
88
|
end
|
89
89
|
it "should provide a server object" do
|
90
|
-
@class.server.
|
90
|
+
expect(@class.server).to be_a(CouchRest::Server)
|
91
91
|
end
|
92
92
|
it "should provide a server with default config" do
|
93
|
-
@class.server.uri.to_s.
|
93
|
+
expect(@class.server.uri.to_s).to eql("http://localhost:5984")
|
94
94
|
end
|
95
95
|
it "should allow the configuration to be overwritten" do
|
96
96
|
@class.connection = {
|
@@ -102,37 +102,37 @@ describe CouchRest::Model::Connection do
|
|
102
102
|
:username => 'foo',
|
103
103
|
:password => 'bar'
|
104
104
|
}
|
105
|
-
@class.server.uri.to_s.
|
105
|
+
expect(@class.server.uri.to_s).to eql("https://foo:bar@127.0.0.1:5985")
|
106
106
|
end
|
107
107
|
|
108
108
|
it "should pass through the persistent connection option" do
|
109
109
|
@class.connection[:persistent] = false
|
110
|
-
expect(@class.server.connection_options[:persistent]).to
|
110
|
+
expect(@class.server.connection_options[:persistent]).to be_falsey
|
111
111
|
end
|
112
112
|
|
113
113
|
end
|
114
114
|
|
115
115
|
describe ".prepare_database" do
|
116
116
|
it "should respond to" do
|
117
|
-
@class.
|
117
|
+
expect(@class).to respond_to(:prepare_database)
|
118
118
|
end
|
119
119
|
|
120
120
|
it "should join the database name correctly" do
|
121
121
|
@class.connection[:suffix] = 'db'
|
122
122
|
db = @class.prepare_database('test')
|
123
|
-
db.name.
|
123
|
+
expect(db.name).to eql('couchrest_test_db')
|
124
124
|
end
|
125
125
|
|
126
126
|
it "should ignore nil values in database name" do
|
127
127
|
@class.connection[:suffix] = nil
|
128
128
|
db = @class.prepare_database('test')
|
129
|
-
db.name.
|
129
|
+
expect(db.name).to eql('couchrest_test')
|
130
130
|
end
|
131
131
|
|
132
132
|
it "should use the .use_database value" do
|
133
133
|
@class.use_database('testing')
|
134
134
|
db = @class.prepare_database
|
135
|
-
db.name.
|
135
|
+
expect(db.name).to eql('couchrest_testing')
|
136
136
|
end
|
137
137
|
end
|
138
138
|
|
@@ -140,26 +140,26 @@ describe CouchRest::Model::Connection do
|
|
140
140
|
|
141
141
|
describe ".connection_configuration" do
|
142
142
|
it "should provide main config by default" do
|
143
|
-
@class.send(:connection_configuration).
|
143
|
+
expect(@class.send(:connection_configuration)).to eql(@class.connection)
|
144
144
|
end
|
145
145
|
it "should load file if available" do
|
146
146
|
@class.connection_config_file = File.join(FIXTURE_PATH, 'config', 'couchdb.yml')
|
147
147
|
hash = @class.send(:connection_configuration)
|
148
|
-
hash[:protocol].
|
149
|
-
hash[:host].
|
150
|
-
hash[:join].
|
148
|
+
expect(hash[:protocol]).to eql('https')
|
149
|
+
expect(hash[:host]).to eql('sample.cloudant.com')
|
150
|
+
expect(hash[:join]).to eql('_')
|
151
151
|
end
|
152
152
|
end
|
153
153
|
|
154
154
|
describe ".load_connection_config_file" do
|
155
155
|
it "should provide an empty hash if config not found" do
|
156
|
-
@class.send(:load_connection_config_file).
|
156
|
+
expect(@class.send(:load_connection_config_file)).to eql({})
|
157
157
|
end
|
158
158
|
it "should load file if available" do
|
159
159
|
@class.connection_config_file = File.join(FIXTURE_PATH, 'config', 'couchdb.yml')
|
160
160
|
hash = @class.send(:load_connection_config_file)
|
161
|
-
hash[:development].
|
162
|
-
@class.server.uri.to_s.
|
161
|
+
expect(hash[:development]).not_to be_nil
|
162
|
+
expect(@class.server.uri.to_s).to eql("https://test:user@sample.cloudant.com")
|
163
163
|
end
|
164
164
|
|
165
165
|
end
|
@@ -6,46 +6,46 @@ describe "Time Parsing core extension" do
|
|
6
6
|
describe "Time" do
|
7
7
|
|
8
8
|
it "should respond to .parse_iso8601" do
|
9
|
-
Time.respond_to?("parse_iso8601").
|
9
|
+
expect(Time.respond_to?("parse_iso8601")).to be_truthy
|
10
10
|
end
|
11
11
|
|
12
12
|
describe "#as_json" do
|
13
13
|
|
14
14
|
it "should convert local time to JSON string" do
|
15
15
|
time = Time.new(2011, 04, 01, 19, 05, 30, "+02:00")
|
16
|
-
time.as_json.
|
16
|
+
expect(time.as_json).to eql("2011-04-01T19:05:30.000+02:00")
|
17
17
|
end
|
18
18
|
|
19
19
|
it "should convert utc time to JSON string" do
|
20
20
|
time = Time.utc(2011, 04, 01, 19, 05, 30)
|
21
|
-
time.as_json.
|
21
|
+
expect(time.as_json).to eql("2011-04-01T19:05:30.000Z")
|
22
22
|
end
|
23
23
|
|
24
24
|
it "should convert local time with fraction to JSON" do
|
25
25
|
time = Time.new(2011, 04, 01, 19, 05, 30.123, "+02:00")
|
26
|
-
time.as_json.
|
26
|
+
expect(time.as_json).to eql("2011-04-01T19:05:30.123+02:00")
|
27
27
|
end
|
28
28
|
|
29
29
|
it "should convert utc time with fraction to JSON" do
|
30
30
|
time = Time.utc(2011, 04, 01, 19, 05, 30.123)
|
31
|
-
time.as_json.
|
31
|
+
expect(time.as_json).to eql("2011-04-01T19:05:30.123Z")
|
32
32
|
end
|
33
33
|
|
34
34
|
it "should allow fraction digits" do
|
35
35
|
time = Time.utc(2011, 04, 01, 19, 05, 30.123456)
|
36
|
-
time.as_json(:fraction_digits => 6).
|
36
|
+
expect(time.as_json(:fraction_digits => 6)).to eql("2011-04-01T19:05:30.123456Z")
|
37
37
|
end
|
38
38
|
|
39
39
|
it "should use CouchRest::Model::Base.time_fraction_digits config option" do
|
40
40
|
CouchRest::Model::Base.time_fraction_digits = 6
|
41
41
|
time = Time.utc(2011, 04, 01, 19, 05, 30.123456)
|
42
|
-
time.as_json.
|
42
|
+
expect(time.as_json).to eql("2011-04-01T19:05:30.123456Z")
|
43
43
|
CouchRest::Model::Base.time_fraction_digits = 3 # Back to normal
|
44
44
|
end
|
45
45
|
|
46
46
|
it "should cope with a nil options parameter" do
|
47
47
|
time = Time.utc(2011, 04, 01, 19, 05, 30.123456)
|
48
|
-
|
48
|
+
expect { time.as_json(nil) }.not_to raise_error
|
49
49
|
end
|
50
50
|
|
51
51
|
end
|
@@ -56,69 +56,69 @@ describe "Time Parsing core extension" do
|
|
56
56
|
|
57
57
|
before :each do
|
58
58
|
# Time.parse should not be called for these tests!
|
59
|
-
Time.
|
59
|
+
allow(Time).to receive(:parse).and_return(nil)
|
60
60
|
end
|
61
61
|
|
62
62
|
it "should parse JSON time" do
|
63
63
|
txt = "2011-04-01T19:05:30Z"
|
64
|
-
Time.parse_iso8601(txt).
|
64
|
+
expect(Time.parse_iso8601(txt)).to eql(Time.utc(2011, 04, 01, 19, 05, 30))
|
65
65
|
end
|
66
66
|
|
67
67
|
it "should parse JSON time as UTC without Z" do
|
68
68
|
txt = "2011-04-01T19:05:30"
|
69
|
-
Time.parse_iso8601(txt).
|
69
|
+
expect(Time.parse_iso8601(txt)).to eql(Time.utc(2011, 04, 01, 19, 05, 30))
|
70
70
|
end
|
71
71
|
|
72
72
|
it "should parse basic time as UTC" do
|
73
73
|
txt = "2011-04-01 19:05:30"
|
74
|
-
Time.parse_iso8601(txt).
|
74
|
+
expect(Time.parse_iso8601(txt)).to eql(Time.utc(2011, 04, 01, 19, 05, 30))
|
75
75
|
end
|
76
76
|
|
77
77
|
it "should parse JSON time with zone" do
|
78
78
|
txt = "2011-04-01T19:05:30 +02:00"
|
79
|
-
Time.parse_iso8601(txt).
|
79
|
+
expect(Time.parse_iso8601(txt)).to eql(Time.new(2011, 04, 01, 19, 05, 30, "+02:00"))
|
80
80
|
end
|
81
81
|
|
82
82
|
it "should parse JSON time with zone 2" do
|
83
83
|
txt = "2011-04-01T19:05:30-0200"
|
84
|
-
Time.parse_iso8601(txt).
|
84
|
+
expect(Time.parse_iso8601(txt)).to eql(Time.new(2011, 04, 01, 19, 05, 30, "-02:00"))
|
85
85
|
end
|
86
86
|
|
87
87
|
it "should parse dodgy time with zone" do
|
88
88
|
txt = "2011-04-01 19:05:30 +0200"
|
89
|
-
Time.parse_iso8601(txt).
|
89
|
+
expect(Time.parse_iso8601(txt)).to eql(Time.new(2011, 04, 01, 19, 05, 30, "+02:00"))
|
90
90
|
end
|
91
91
|
|
92
92
|
it "should parse dodgy time with zone 2" do
|
93
93
|
txt = "2011-04-01 19:05:30+0230"
|
94
|
-
Time.parse_iso8601(txt).
|
94
|
+
expect(Time.parse_iso8601(txt)).to eql(Time.new(2011, 04, 01, 19, 05, 30, "+02:30"))
|
95
95
|
end
|
96
96
|
|
97
97
|
it "should parse dodgy time with zone 3" do
|
98
98
|
txt = "2011-04-01 19:05:30 0230"
|
99
|
-
Time.parse_iso8601(txt).
|
99
|
+
expect(Time.parse_iso8601(txt)).to eql(Time.new(2011, 04, 01, 19, 05, 30, "+02:30"))
|
100
100
|
end
|
101
101
|
|
102
102
|
it "should parse JSON time with second fractions" do
|
103
103
|
txt = "2014-12-11T16:53:54.000Z"
|
104
|
-
Time.parse_iso8601(txt).
|
104
|
+
expect(Time.parse_iso8601(txt)).to eql(Time.utc(2014, 12, 11, 16, 53, Rational(54000, 1000)))
|
105
105
|
end
|
106
106
|
|
107
107
|
it "should avoid rounding errors parsing JSON time with second fractions" do
|
108
108
|
txt = "2014-12-11T16:53:54.548Z"
|
109
|
-
Time.parse_iso8601(txt).
|
109
|
+
expect(Time.parse_iso8601(txt)).to eql(Time.utc(2014, 12, 11, 16, 53, Rational(54548,1000)))
|
110
110
|
end
|
111
111
|
|
112
112
|
end
|
113
113
|
|
114
114
|
it "avoids seconds rounding error" do
|
115
115
|
time_string = "2014-12-11T16:54:54.549Z"
|
116
|
-
Time.parse_iso8601(time_string).as_json.
|
116
|
+
expect(Time.parse_iso8601(time_string).as_json).to eql(time_string)
|
117
117
|
end
|
118
118
|
|
119
119
|
describe "resorting back to normal parse" do
|
120
120
|
before :each do
|
121
|
-
Time.
|
121
|
+
expect(Time).to receive(:parse)
|
122
122
|
end
|
123
123
|
it "should work with weird time" do
|
124
124
|
txt = "16/07/1981 05:04:00"
|