bson 4.15.0-java → 5.0.0-java
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
- checksums.yaml.gz.sig +0 -0
- data/README.md +4 -4
- data/Rakefile +5 -0
- data/lib/bson/active_support.rb +1 -0
- data/lib/bson/array.rb +57 -31
- data/lib/bson/big_decimal.rb +16 -6
- data/lib/bson/binary.rb +255 -128
- data/lib/bson/boolean.rb +1 -0
- data/lib/bson/code.rb +9 -11
- data/lib/bson/code_with_scope.rb +8 -10
- data/lib/bson/config.rb +1 -27
- data/lib/bson/date.rb +2 -1
- data/lib/bson/date_time.rb +2 -1
- data/lib/bson/db_pointer.rb +11 -12
- data/lib/bson/dbref.rb +11 -9
- data/lib/bson/decimal128/builder.rb +9 -8
- data/lib/bson/decimal128.rb +24 -110
- data/lib/bson/document.rb +1 -0
- data/lib/bson/environment.rb +1 -0
- data/lib/bson/error/bson_decode_error.rb +11 -0
- data/lib/bson/error/ext_json_parse_error.rb +11 -0
- data/lib/bson/error/illegal_key.rb +23 -0
- data/lib/bson/error/invalid_binary_type.rb +37 -0
- data/lib/bson/error/invalid_dbref_argument.rb +12 -0
- data/lib/bson/error/invalid_decimal128_argument.rb +25 -0
- data/lib/bson/error/invalid_decimal128_range.rb +27 -0
- data/lib/bson/error/invalid_decimal128_string.rb +26 -0
- data/lib/bson/error/invalid_key.rb +24 -0
- data/lib/bson/error/invalid_object_id.rb +11 -0
- data/lib/bson/error/invalid_regexp_pattern.rb +13 -0
- data/lib/bson/error/unrepresentable_precision.rb +19 -0
- data/lib/bson/error/unserializable_class.rb +13 -0
- data/lib/bson/error/unsupported_binary_subtype.rb +12 -0
- data/lib/bson/error/unsupported_type.rb +11 -0
- data/lib/bson/error.rb +16 -28
- data/lib/bson/ext_json.rb +1 -0
- data/lib/bson/false_class.rb +2 -1
- data/lib/bson/float.rb +2 -1
- data/lib/bson/hash.rb +127 -72
- data/lib/bson/int32.rb +16 -4
- data/lib/bson/int64.rb +16 -4
- data/lib/bson/integer.rb +3 -4
- data/lib/bson/json.rb +1 -0
- data/lib/bson/max_key.rb +7 -9
- data/lib/bson/min_key.rb +7 -9
- data/lib/bson/nil_class.rb +1 -0
- data/lib/bson/object.rb +5 -25
- data/lib/bson/object_id.rb +75 -121
- data/lib/bson/open_struct.rb +3 -2
- data/lib/bson/regexp.rb +35 -64
- data/lib/bson/registry.rb +2 -6
- data/lib/bson/specialized.rb +2 -1
- data/lib/bson/string.rb +4 -27
- data/lib/bson/symbol.rb +22 -19
- data/lib/bson/time.rb +2 -1
- data/lib/bson/time_with_zone.rb +13 -1
- data/lib/bson/timestamp.rb +2 -1
- data/lib/bson/true_class.rb +2 -1
- data/lib/bson/undefined.rb +14 -0
- data/lib/bson/version.rb +2 -1
- data/lib/bson-ruby.jar +0 -0
- data/lib/bson.rb +3 -2
- data/spec/bson/array_spec.rb +19 -60
- data/spec/bson/big_decimal_spec.rb +16 -4
- data/spec/bson/binary_spec.rb +83 -74
- data/spec/bson/binary_uuid_spec.rb +1 -0
- data/spec/bson/boolean_spec.rb +1 -0
- data/spec/bson/byte_buffer_read_spec.rb +1 -0
- data/spec/bson/byte_buffer_spec.rb +1 -0
- data/spec/bson/byte_buffer_write_spec.rb +1 -0
- data/spec/bson/code_spec.rb +5 -3
- data/spec/bson/code_with_scope_spec.rb +5 -3
- data/spec/bson/config_spec.rb +1 -35
- data/spec/bson/date_spec.rb +1 -0
- data/spec/bson/date_time_spec.rb +1 -0
- data/spec/bson/dbref_legacy_spec.rb +20 -3
- data/spec/bson/dbref_spec.rb +9 -9
- data/spec/bson/decimal128_spec.rb +40 -20
- data/spec/bson/document_as_spec.rb +1 -0
- data/spec/bson/document_spec.rb +1 -1
- data/spec/bson/ext_json_parse_spec.rb +1 -0
- data/spec/bson/false_class_spec.rb +8 -0
- data/spec/bson/float_spec.rb +8 -3
- data/spec/bson/hash_as_spec.rb +1 -0
- data/spec/bson/hash_spec.rb +87 -75
- data/spec/bson/int32_spec.rb +21 -6
- data/spec/bson/int64_spec.rb +21 -6
- data/spec/bson/integer_spec.rb +45 -13
- data/spec/bson/json_spec.rb +1 -0
- data/spec/bson/max_key_spec.rb +5 -3
- data/spec/bson/min_key_spec.rb +5 -3
- data/spec/bson/nil_class_spec.rb +1 -0
- data/spec/bson/object_id_spec.rb +43 -4
- data/spec/bson/object_spec.rb +2 -1
- data/spec/bson/open_struct_spec.rb +14 -71
- data/spec/bson/raw_spec.rb +9 -15
- data/spec/bson/regexp_spec.rb +4 -3
- data/spec/bson/registry_spec.rb +2 -1
- data/spec/bson/string_spec.rb +13 -38
- data/spec/bson/symbol_raw_spec.rb +25 -0
- data/spec/bson/symbol_spec.rb +15 -18
- data/spec/bson/time_spec.rb +1 -0
- data/spec/bson/time_with_zone_spec.rb +1 -0
- data/spec/bson/timestamp_spec.rb +1 -0
- data/spec/bson/true_class_spec.rb +8 -0
- data/spec/bson/undefined_spec.rb +27 -0
- data/spec/bson_spec.rb +1 -0
- data/spec/runners/common_driver.rb +6 -5
- data/spec/runners/corpus.rb +6 -0
- data/spec/runners/corpus_legacy.rb +1 -0
- data/spec/shared/lib/mrss/constraints.rb +8 -16
- data/spec/shared/lib/mrss/docker_runner.rb +30 -3
- data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
- data/spec/shared/lib/mrss/event_subscriber.rb +15 -5
- data/spec/shared/lib/mrss/lite_constraints.rb +48 -1
- data/spec/shared/lib/mrss/server_version_registry.rb +16 -23
- data/spec/shared/lib/mrss/session_registry.rb +69 -0
- data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
- data/spec/shared/lib/mrss/utils.rb +28 -6
- data/spec/shared/share/Dockerfile.erb +68 -85
- data/spec/shared/shlib/config.sh +27 -0
- data/spec/shared/shlib/server.sh +73 -24
- data/spec/shared/shlib/set_env.sh +39 -1
- data/spec/spec_helper.rb +1 -0
- data/spec/spec_tests/common_driver_spec.rb +9 -4
- data/spec/spec_tests/corpus_legacy_spec.rb +1 -0
- data/spec/spec_tests/corpus_spec.rb +13 -3
- data/spec/spec_tests/data/corpus/binary.json +5 -0
- data/spec/spec_tests/data/corpus/code.json +13 -13
- data/spec/spec_tests/data/corpus/decimal128-4.json +48 -0
- data/spec/spec_tests/data/corpus/decimal128-6.json +12 -0
- data/spec/spec_tests/data/corpus/decimal128-7.json +4 -0
- data/spec/spec_tests/data/corpus/document.json +20 -0
- data/spec/spec_tests/data/corpus/symbol.json +7 -7
- data/spec/spec_tests/data/corpus/top.json +18 -3
- data/spec/support/shared_examples.rb +28 -5
- data/spec/support/spec_config.rb +1 -0
- data/spec/support/utils.rb +49 -1
- data.tar.gz.sig +0 -0
- metadata +166 -142
- metadata.gz.sig +0 -0
data/spec/bson/code_spec.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# rubocop:todo all
|
1
2
|
# Copyright (C) 2009-2020 MongoDB Inc.
|
2
3
|
#
|
3
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -16,17 +17,18 @@ require "spec_helper"
|
|
16
17
|
|
17
18
|
describe BSON::Code do
|
18
19
|
|
19
|
-
describe "#
|
20
|
+
describe "#as_extended_json" do
|
20
21
|
|
21
22
|
let(:object) do
|
22
23
|
described_class.new("this.value = 5")
|
23
24
|
end
|
24
25
|
|
25
26
|
it "returns the binary data plus type" do
|
26
|
-
expect(object.
|
27
|
+
expect(object.as_extended_json).to eq({ "$code" => "this.value = 5" })
|
27
28
|
end
|
28
29
|
|
29
|
-
it_behaves_like
|
30
|
+
it_behaves_like 'an Extended JSON serializable object'
|
31
|
+
it_behaves_like '#as_json calls #as_extended_json'
|
30
32
|
end
|
31
33
|
|
32
34
|
describe "#to_bson/#from_bson" do
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# rubocop:todo all
|
1
2
|
# Copyright (C) 2009-2020 MongoDB Inc.
|
2
3
|
#
|
3
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -39,19 +40,20 @@ describe BSON::CodeWithScope do
|
|
39
40
|
end
|
40
41
|
end
|
41
42
|
|
42
|
-
describe "#
|
43
|
+
describe "#as_extended_json" do
|
43
44
|
|
44
45
|
let(:object) do
|
45
46
|
described_class.new("this.value = val", :val => "test")
|
46
47
|
end
|
47
48
|
|
48
49
|
it "returns the binary data plus type" do
|
49
|
-
expect(object.
|
50
|
+
expect(object.as_extended_json).to eq(
|
50
51
|
{ "$code" => "this.value = val", "$scope" => { :val => "test" }}
|
51
52
|
)
|
52
53
|
end
|
53
54
|
|
54
|
-
it_behaves_like
|
55
|
+
it_behaves_like 'an Extended JSON serializable object'
|
56
|
+
it_behaves_like '#as_json calls #as_extended_json'
|
55
57
|
end
|
56
58
|
|
57
59
|
describe "#to_bson" do
|
data/spec/bson/config_spec.rb
CHANGED
@@ -1,40 +1,6 @@
|
|
1
|
+
# rubocop:todo all
|
1
2
|
require "spec_helper"
|
2
3
|
|
3
4
|
describe BSON::Config do
|
4
5
|
|
5
|
-
describe "#validating_keys?" do
|
6
|
-
|
7
|
-
context "when the default is used" do
|
8
|
-
|
9
|
-
it "returns false" do
|
10
|
-
expect(described_class).to_not be_validating_keys
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
context "when configuring to false" do
|
15
|
-
|
16
|
-
before do
|
17
|
-
BSON::Config.validating_keys = false
|
18
|
-
end
|
19
|
-
|
20
|
-
it "returns false" do
|
21
|
-
expect(described_class).to_not be_validating_keys
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
context "when configuring to true" do
|
26
|
-
|
27
|
-
before do
|
28
|
-
BSON::Config.validating_keys = true
|
29
|
-
end
|
30
|
-
|
31
|
-
after do
|
32
|
-
BSON::Config.validating_keys = false
|
33
|
-
end
|
34
|
-
|
35
|
-
it "returns true" do
|
36
|
-
expect(described_class).to be_validating_keys
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
6
|
end
|
data/spec/bson/date_spec.rb
CHANGED
data/spec/bson/date_time_spec.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
#
|
2
|
+
# rubocop:todo all
|
3
3
|
|
4
4
|
require 'spec_helper'
|
5
5
|
require 'json'
|
@@ -8,7 +8,24 @@ require 'json'
|
|
8
8
|
# class, and are intended to verify that the current DBRef implementation is
|
9
9
|
# compatible with the legacy driver DBRef interface.
|
10
10
|
|
11
|
-
|
11
|
+
# For testing a class that emits warnings, without spamming the terminal
|
12
|
+
# with them.
|
13
|
+
def silenced_version_of(klass)
|
14
|
+
Class.new(klass) do
|
15
|
+
class <<self
|
16
|
+
def name
|
17
|
+
"#{superclass.name} (silenced)"
|
18
|
+
end
|
19
|
+
|
20
|
+
alias to_s name
|
21
|
+
end
|
22
|
+
|
23
|
+
def warn(*_args)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe silenced_version_of BSON::DBRef do
|
12
29
|
|
13
30
|
let(:object_id) do
|
14
31
|
BSON::ObjectId.new
|
@@ -76,7 +93,7 @@ describe BSON::DBRef do
|
|
76
93
|
it 'raises ArgumentError' do
|
77
94
|
lambda do
|
78
95
|
dbref
|
79
|
-
end.should raise_error(
|
96
|
+
end.should raise_error(BSON::Error::InvalidDBRefArgument)
|
80
97
|
end
|
81
98
|
end
|
82
99
|
end
|
data/spec/bson/dbref_spec.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
#
|
2
|
+
# rubocop:todo all
|
3
3
|
|
4
4
|
require 'spec_helper'
|
5
5
|
require 'json'
|
@@ -79,10 +79,10 @@ describe BSON::DBRef do
|
|
79
79
|
described_class.new({:$ref => 'users', :$id => object_id}, object_id)
|
80
80
|
end
|
81
81
|
|
82
|
-
it 'raises
|
82
|
+
it 'raises InvalidDBRefArgument' do
|
83
83
|
lambda do
|
84
84
|
dbref
|
85
|
-
end.should raise_error(
|
85
|
+
end.should raise_error(BSON::Error::InvalidDBRefArgument)
|
86
86
|
end
|
87
87
|
end
|
88
88
|
|
@@ -92,10 +92,10 @@ describe BSON::DBRef do
|
|
92
92
|
described_class.new({:$ref => 'users', :$id => object_id}, object_id, 'db')
|
93
93
|
end
|
94
94
|
|
95
|
-
it 'raises
|
95
|
+
it 'raises InvalidDBRefArgument' do
|
96
96
|
lambda do
|
97
97
|
dbref
|
98
|
-
end.should raise_error(
|
98
|
+
end.should raise_error(BSON::Error::InvalidDBRefArgument)
|
99
99
|
end
|
100
100
|
end
|
101
101
|
|
@@ -118,7 +118,7 @@ describe BSON::DBRef do
|
|
118
118
|
it 'raises an error' do
|
119
119
|
expect do
|
120
120
|
dbref
|
121
|
-
end.to raise_error(
|
121
|
+
end.to raise_error(BSON::Error::InvalidDBRefArgument, /DBRef must have \$ref/)
|
122
122
|
end
|
123
123
|
end
|
124
124
|
|
@@ -130,7 +130,7 @@ describe BSON::DBRef do
|
|
130
130
|
it 'raises an error' do
|
131
131
|
expect do
|
132
132
|
dbref
|
133
|
-
end.to raise_error(
|
133
|
+
end.to raise_error(BSON::Error::InvalidDBRefArgument, /DBRef must have \$id/)
|
134
134
|
end
|
135
135
|
end
|
136
136
|
|
@@ -142,7 +142,7 @@ describe BSON::DBRef do
|
|
142
142
|
it 'raises an error' do
|
143
143
|
expect do
|
144
144
|
dbref
|
145
|
-
end.to raise_error(
|
145
|
+
end.to raise_error(BSON::Error::InvalidDBRefArgument, /The value for key \$ref must be a string/)
|
146
146
|
end
|
147
147
|
end
|
148
148
|
|
@@ -154,7 +154,7 @@ describe BSON::DBRef do
|
|
154
154
|
it 'raises an error' do
|
155
155
|
expect do
|
156
156
|
dbref
|
157
|
-
end.to raise_error(
|
157
|
+
end.to raise_error(BSON::Error::InvalidDBRefArgument, /The value for key \$db must be a string/)
|
158
158
|
end
|
159
159
|
end
|
160
160
|
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# rubocop:todo all
|
1
2
|
# Copyright (C) 2016-2020 MongoDB Inc.
|
2
3
|
#
|
3
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -28,10 +29,10 @@ describe BSON::Decimal128 do
|
|
28
29
|
|
29
30
|
context 'when the argument is neither a BigDecimal or String' do
|
30
31
|
|
31
|
-
it 'raises an
|
32
|
+
it 'raises an InvalidDecimal128Argument error' do
|
32
33
|
expect {
|
33
34
|
described_class.new(:invalid)
|
34
|
-
}.to raise_exception(
|
35
|
+
}.to raise_exception(BSON::Error::InvalidDecimal128Argument, /A Decimal128 can only be created from a String or BigDecimal./ )
|
35
36
|
end
|
36
37
|
end
|
37
38
|
|
@@ -46,7 +47,7 @@ describe BSON::Decimal128 do
|
|
46
47
|
end
|
47
48
|
|
48
49
|
let(:from_bson) do
|
49
|
-
described_class.from_bson(buffer)
|
50
|
+
described_class.from_bson(buffer, mode: :bson)
|
50
51
|
end
|
51
52
|
|
52
53
|
let(:expected_bson) do
|
@@ -314,7 +315,7 @@ describe BSON::Decimal128 do
|
|
314
315
|
it 'raises InvalidRange' do
|
315
316
|
lambda do
|
316
317
|
described_class.new('1e10000')
|
317
|
-
end.should raise_error(BSON::
|
318
|
+
end.should raise_error(BSON::Error::InvalidDecimal128Range, /Value out of range/)
|
318
319
|
end
|
319
320
|
end
|
320
321
|
|
@@ -322,7 +323,7 @@ describe BSON::Decimal128 do
|
|
322
323
|
it 'raises UnrepresentablePrecision' do
|
323
324
|
lambda do
|
324
325
|
described_class.new('1.000000000000000000000000000000000000000000000000001')
|
325
|
-
end.should raise_error(BSON::
|
326
|
+
end.should raise_error(BSON::Error::UnrepresentablePrecision, /The value contains too much precision/)
|
326
327
|
end
|
327
328
|
end
|
328
329
|
end
|
@@ -344,7 +345,7 @@ describe BSON::Decimal128 do
|
|
344
345
|
end
|
345
346
|
|
346
347
|
let(:decimal128) do
|
347
|
-
BSON::Document.from_bson(buffer)['d']
|
348
|
+
BSON::Document.from_bson(buffer, mode: :bson)['d']
|
348
349
|
end
|
349
350
|
|
350
351
|
let(:object_from_string) do
|
@@ -1270,13 +1271,39 @@ describe BSON::Decimal128 do
|
|
1270
1271
|
described_class.new(BigDecimal('1.23'))
|
1271
1272
|
end
|
1272
1273
|
|
1273
|
-
it "returns the decimal128
|
1274
|
-
expect(object.as_json).to eq(
|
1274
|
+
it "returns the decimal128 as a string" do
|
1275
|
+
expect(object.as_json).to eq('1.23')
|
1276
|
+
end
|
1277
|
+
|
1278
|
+
%w[NaN -NaN SNaN -SNaN Infinity -Infinity].each do |value|
|
1279
|
+
context "when special value #{value}" do
|
1280
|
+
|
1281
|
+
let(:object) do
|
1282
|
+
described_class.new(value)
|
1283
|
+
end
|
1284
|
+
|
1285
|
+
it "returns nil to be consistent with ActiveSupport" do
|
1286
|
+
expect(object.as_json).to eq(nil)
|
1287
|
+
end
|
1288
|
+
end
|
1275
1289
|
end
|
1276
1290
|
|
1277
1291
|
it_behaves_like "a JSON serializable object"
|
1278
1292
|
end
|
1279
1293
|
|
1294
|
+
describe "#as_extended_json" do
|
1295
|
+
|
1296
|
+
let(:object) do
|
1297
|
+
described_class.new(BigDecimal('1.23'))
|
1298
|
+
end
|
1299
|
+
|
1300
|
+
it "returns the decimal128 with $numberDecimal key" do
|
1301
|
+
expect(object.as_extended_json).to eq({ "$numberDecimal" => '1.23' })
|
1302
|
+
end
|
1303
|
+
|
1304
|
+
it_behaves_like "an Extended JSON serializable object"
|
1305
|
+
end
|
1306
|
+
|
1280
1307
|
describe "::BSON_TYPE" do
|
1281
1308
|
|
1282
1309
|
it "returns 0x13" do
|
@@ -1361,7 +1388,7 @@ describe BSON::Decimal128 do
|
|
1361
1388
|
end
|
1362
1389
|
end
|
1363
1390
|
|
1364
|
-
describe "#
|
1391
|
+
describe "#to_d" do
|
1365
1392
|
|
1366
1393
|
shared_examples_for 'a decimal128 convertible to a Ruby BigDecimal' do
|
1367
1394
|
|
@@ -1370,6 +1397,10 @@ describe BSON::Decimal128 do
|
|
1370
1397
|
end
|
1371
1398
|
|
1372
1399
|
it 'properly converts the Decimal128 to a BigDecimal' do
|
1400
|
+
expect(decimal128.to_d).to eq(expected_big_decimal)
|
1401
|
+
end
|
1402
|
+
|
1403
|
+
it 'permits the alias #to_big_decimal' do
|
1373
1404
|
expect(decimal128.to_big_decimal).to eq(expected_big_decimal)
|
1374
1405
|
end
|
1375
1406
|
end
|
@@ -1592,17 +1623,6 @@ describe BSON::Decimal128 do
|
|
1592
1623
|
end
|
1593
1624
|
end
|
1594
1625
|
|
1595
|
-
context "when the class is loaded" do
|
1596
|
-
|
1597
|
-
let(:registered) do
|
1598
|
-
BSON::Registry.get(described_class::BSON_TYPE, 'field')
|
1599
|
-
end
|
1600
|
-
|
1601
|
-
it "registers the type" do
|
1602
|
-
expect(registered).to eq(described_class)
|
1603
|
-
end
|
1604
|
-
end
|
1605
|
-
|
1606
1626
|
%w(== ===).each do |eq_op|
|
1607
1627
|
let(:lhs) { described_class.new('1.2e12') }
|
1608
1628
|
|
data/spec/bson/document_spec.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# rubocop:todo all
|
1
2
|
# Copyright (C) 2009-2020 MongoDB Inc.
|
2
3
|
#
|
3
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -25,4 +26,11 @@ describe FalseClass do
|
|
25
26
|
it_behaves_like "a bson element"
|
26
27
|
it_behaves_like "a serializable bson element"
|
27
28
|
end
|
29
|
+
|
30
|
+
describe '#as_extended_json' do
|
31
|
+
let(:object) { false }
|
32
|
+
|
33
|
+
it_behaves_like '#as_extended_json returns self'
|
34
|
+
it_behaves_like 'an Extended JSON serializable object'
|
35
|
+
end
|
28
36
|
end
|
data/spec/bson/float_spec.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# rubocop:todo all
|
1
2
|
# Copyright (C) 2009-2020 MongoDB Inc.
|
2
3
|
#
|
3
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -34,15 +35,17 @@ describe Float do
|
|
34
35
|
end
|
35
36
|
|
36
37
|
describe '#as_extended_json' do
|
38
|
+
let(:object) { 42.0 }
|
39
|
+
|
37
40
|
context 'canonical mode' do
|
38
41
|
it 'returns $numberDouble' do
|
39
|
-
|
42
|
+
object.as_extended_json.should == {'$numberDouble' => '42.0'}
|
40
43
|
end
|
41
44
|
end
|
42
45
|
|
43
46
|
context 'relaxed mode' do
|
44
47
|
let(:serialized) do
|
45
|
-
|
48
|
+
object.as_extended_json(mode: :relaxed)
|
46
49
|
end
|
47
50
|
|
48
51
|
it 'returns float' do
|
@@ -53,7 +56,7 @@ describe Float do
|
|
53
56
|
|
54
57
|
context 'legacy mode' do
|
55
58
|
let(:serialized) do
|
56
|
-
|
59
|
+
object.as_extended_json(mode: :legacy)
|
57
60
|
end
|
58
61
|
|
59
62
|
it 'returns float' do
|
@@ -61,5 +64,7 @@ describe Float do
|
|
61
64
|
serialized.should be_within(0.00001).of(42)
|
62
65
|
end
|
63
66
|
end
|
67
|
+
|
68
|
+
it_behaves_like "an Extended JSON serializable object"
|
64
69
|
end
|
65
70
|
end
|
data/spec/bson/hash_as_spec.rb
CHANGED
data/spec/bson/hash_spec.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# rubocop:todo all
|
1
2
|
# Copyright (C) 2009-2020 MongoDB Inc.
|
2
3
|
#
|
3
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -52,93 +53,36 @@ describe Hash do
|
|
52
53
|
end
|
53
54
|
end
|
54
55
|
|
55
|
-
context "when the hash has
|
56
|
+
context "when the hash has dollar keys" do
|
56
57
|
|
57
58
|
let(:obj) do
|
58
59
|
{ "$testing" => "value" }
|
59
60
|
end
|
60
61
|
|
61
|
-
context "when validating keys" do
|
62
62
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
end
|
68
|
-
|
69
|
-
after do
|
70
|
-
BSON::Config.validating_keys = false
|
71
|
-
end
|
72
|
-
|
73
|
-
it "raises an error" do
|
74
|
-
expect {
|
75
|
-
obj.to_bson
|
76
|
-
}.to raise_error(BSON::String::IllegalKey)
|
77
|
-
end
|
78
|
-
|
79
|
-
context "when the hash contains an array of documents containing invalid keys" do
|
80
|
-
|
81
|
-
let(:obj) do
|
82
|
-
{ "array" => [{ "$testing" => "value" }] }
|
83
|
-
end
|
84
|
-
|
85
|
-
it "raises an error" do
|
86
|
-
expect {
|
87
|
-
obj.to_bson
|
88
|
-
}.to raise_error(BSON::String::IllegalKey)
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
context "when validating locally" do
|
94
|
-
|
95
|
-
it "raises an error" do
|
96
|
-
expect {
|
97
|
-
obj.to_bson(BSON::ByteBuffer.new, true)
|
98
|
-
}.to raise_error(BSON::String::IllegalKey)
|
99
|
-
end
|
63
|
+
let(:bson) do
|
64
|
+
"#{25.to_bson.to_s}#{String::BSON_TYPE}$testing#{BSON::NULL_BYTE}" +
|
65
|
+
"#{6.to_bson.to_s}value#{BSON::NULL_BYTE}#{BSON::NULL_BYTE}"
|
66
|
+
end
|
100
67
|
|
101
|
-
|
68
|
+
it "serializes the hash" do
|
69
|
+
expect(obj.to_bson.to_s).to eq(bson)
|
70
|
+
end
|
102
71
|
|
103
|
-
|
104
|
-
{ "array" => [{ "$testing" => "value" }] }
|
105
|
-
end
|
72
|
+
context "when the hash contains an array of documents containing invalid keys" do
|
106
73
|
|
107
|
-
|
108
|
-
|
109
|
-
obj.to_bson(BSON::ByteBuffer.new, true)
|
110
|
-
}.to raise_error(BSON::String::IllegalKey)
|
111
|
-
end
|
112
|
-
end
|
74
|
+
let(:obj) do
|
75
|
+
{ "array" => [{ "$testing" => "value" }] }
|
113
76
|
end
|
114
|
-
end
|
115
|
-
|
116
|
-
context "when not validating keys" do
|
117
77
|
|
118
78
|
let(:bson) do
|
119
|
-
"#{
|
120
|
-
"#{
|
79
|
+
"#{45.to_bson.to_s}#{Array::BSON_TYPE}array#{BSON::NULL_BYTE}" +
|
80
|
+
"#{[{ "$testing" => "value" }].to_bson.to_s}#{BSON::NULL_BYTE}"
|
121
81
|
end
|
122
82
|
|
123
83
|
it "serializes the hash" do
|
124
84
|
expect(obj.to_bson.to_s).to eq(bson)
|
125
85
|
end
|
126
|
-
|
127
|
-
context "when the hash contains an array of documents containing invalid keys" do
|
128
|
-
|
129
|
-
let(:obj) do
|
130
|
-
{ "array" => [{ "$testing" => "value" }] }
|
131
|
-
end
|
132
|
-
|
133
|
-
let(:bson) do
|
134
|
-
"#{45.to_bson.to_s}#{Array::BSON_TYPE}array#{BSON::NULL_BYTE}" +
|
135
|
-
"#{[{ "$testing" => "value" }].to_bson.to_s}#{BSON::NULL_BYTE}"
|
136
|
-
end
|
137
|
-
|
138
|
-
it "serializes the hash" do
|
139
|
-
expect(obj.to_bson.to_s).to eq(bson)
|
140
|
-
end
|
141
|
-
end
|
142
86
|
end
|
143
87
|
end
|
144
88
|
|
@@ -270,8 +214,28 @@ describe Hash do
|
|
270
214
|
end.to_not raise_error
|
271
215
|
end
|
272
216
|
|
273
|
-
it 'deserializes as a
|
274
|
-
expect(from_bson).to eq({"x" =>
|
217
|
+
it 'deserializes as a BigDecimal' do
|
218
|
+
expect(from_bson).to eq({"x" => BigDecimal(1)})
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
context 'when deserializing round-tripping a Decimal128' do
|
223
|
+
let(:to_bson) do
|
224
|
+
{x:BSON::Decimal128.new('1')}.to_bson
|
225
|
+
end
|
226
|
+
|
227
|
+
let(:from_bson) do
|
228
|
+
Hash.from_bson(to_bson)
|
229
|
+
end
|
230
|
+
|
231
|
+
it 'doesn\'t raise on serialization' do
|
232
|
+
expect do
|
233
|
+
to_bson
|
234
|
+
end.to_not raise_error
|
235
|
+
end
|
236
|
+
|
237
|
+
it 'deserializes as a BigDecimal' do
|
238
|
+
expect(from_bson).to eq({"x" => BigDecimal(1)})
|
275
239
|
end
|
276
240
|
end
|
277
241
|
end
|
@@ -348,7 +312,7 @@ describe Hash do
|
|
348
312
|
it 'works' do
|
349
313
|
expect do
|
350
314
|
hash.to_bson
|
351
|
-
end.
|
315
|
+
end.to_not raise_error
|
352
316
|
end
|
353
317
|
end
|
354
318
|
end
|
@@ -372,7 +336,7 @@ describe Hash do
|
|
372
336
|
let(:doc) { Hash.from_bson(buf) }
|
373
337
|
|
374
338
|
it 'overwrites first value with second value' do
|
375
|
-
doc.
|
339
|
+
expect(doc).to eq({ 'foo' => 'overwrite' })
|
376
340
|
end
|
377
341
|
end
|
378
342
|
|
@@ -394,8 +358,56 @@ describe Hash do
|
|
394
358
|
let(:doc) { Hash.from_bson(buf) }
|
395
359
|
|
396
360
|
it 'overwrites first value with second value' do
|
397
|
-
doc.
|
361
|
+
expect(doc).to eq({ 'foo' => :bar })
|
398
362
|
end
|
399
363
|
end
|
364
|
+
|
365
|
+
context 'when deserializing a hash with a BigDecimal' do
|
366
|
+
let(:to_bson) do
|
367
|
+
{x: BigDecimal('1')}.to_bson
|
368
|
+
end
|
369
|
+
|
370
|
+
context 'when it has mode: :bson' do
|
371
|
+
|
372
|
+
let(:from_bson) do
|
373
|
+
Hash.from_bson(to_bson, mode: :bson)
|
374
|
+
end
|
375
|
+
|
376
|
+
it 'deserializes as a BigDecimal' do
|
377
|
+
expect(from_bson).to eq({"x" => BSON::Decimal128.new('1')})
|
378
|
+
end
|
379
|
+
end
|
380
|
+
|
381
|
+
context 'when it doesn\'t have mode: :bson' do
|
382
|
+
|
383
|
+
let(:from_bson) do
|
384
|
+
Hash.from_bson(to_bson)
|
385
|
+
end
|
386
|
+
|
387
|
+
it 'deserializes as a BigDecimal' do
|
388
|
+
expect(from_bson).to eq({"x" => BigDecimal(1)})
|
389
|
+
end
|
390
|
+
end
|
391
|
+
end
|
392
|
+
end
|
393
|
+
|
394
|
+
describe '#as_extended_json' do
|
395
|
+
let(:object) do
|
396
|
+
{ 'foo' => :bar, 'baz' => ['qux', 1, 2.0, { 'lorem' => 1 }] }
|
397
|
+
end
|
398
|
+
|
399
|
+
let(:expected) do
|
400
|
+
{ "foo" => { "$symbol" => "bar" },
|
401
|
+
"baz" => [ "qux",
|
402
|
+
{ "$numberInt" => "1" },
|
403
|
+
{ "$numberDouble" => "2.0" },
|
404
|
+
{ "lorem" => { "$numberInt" => "1" } } ] }
|
405
|
+
end
|
406
|
+
|
407
|
+
it "returns the binary data plus type" do
|
408
|
+
expect(object.as_extended_json).to eq(expected)
|
409
|
+
end
|
410
|
+
|
411
|
+
it_behaves_like 'an Extended JSON serializable object'
|
400
412
|
end
|
401
413
|
end
|