bson 4.15.0 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (147) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +4 -4
  4. data/Rakefile +5 -0
  5. data/ext/bson/bson-native.h +12 -4
  6. data/ext/bson/extconf.rb +8 -3
  7. data/ext/bson/init.c +11 -11
  8. data/ext/bson/read.c +21 -6
  9. data/ext/bson/util.c +168 -16
  10. data/ext/bson/write.c +30 -39
  11. data/lib/bson/active_support.rb +1 -0
  12. data/lib/bson/array.rb +57 -31
  13. data/lib/bson/big_decimal.rb +16 -6
  14. data/lib/bson/binary.rb +255 -128
  15. data/lib/bson/boolean.rb +1 -0
  16. data/lib/bson/code.rb +9 -11
  17. data/lib/bson/code_with_scope.rb +8 -10
  18. data/lib/bson/config.rb +1 -27
  19. data/lib/bson/date.rb +2 -1
  20. data/lib/bson/date_time.rb +2 -1
  21. data/lib/bson/db_pointer.rb +11 -12
  22. data/lib/bson/dbref.rb +11 -9
  23. data/lib/bson/decimal128/builder.rb +9 -8
  24. data/lib/bson/decimal128.rb +24 -110
  25. data/lib/bson/document.rb +1 -0
  26. data/lib/bson/environment.rb +1 -0
  27. data/lib/bson/error/bson_decode_error.rb +11 -0
  28. data/lib/bson/error/ext_json_parse_error.rb +11 -0
  29. data/lib/bson/error/illegal_key.rb +23 -0
  30. data/lib/bson/error/invalid_binary_type.rb +37 -0
  31. data/lib/bson/error/invalid_dbref_argument.rb +12 -0
  32. data/lib/bson/error/invalid_decimal128_argument.rb +25 -0
  33. data/lib/bson/error/invalid_decimal128_range.rb +27 -0
  34. data/lib/bson/error/invalid_decimal128_string.rb +26 -0
  35. data/lib/bson/error/invalid_key.rb +24 -0
  36. data/lib/bson/error/invalid_object_id.rb +11 -0
  37. data/lib/bson/error/invalid_regexp_pattern.rb +13 -0
  38. data/lib/bson/error/unrepresentable_precision.rb +19 -0
  39. data/lib/bson/error/unserializable_class.rb +13 -0
  40. data/lib/bson/error/unsupported_binary_subtype.rb +12 -0
  41. data/lib/bson/error/unsupported_type.rb +11 -0
  42. data/lib/bson/error.rb +16 -28
  43. data/lib/bson/ext_json.rb +1 -0
  44. data/lib/bson/false_class.rb +2 -1
  45. data/lib/bson/float.rb +2 -1
  46. data/lib/bson/hash.rb +127 -72
  47. data/lib/bson/int32.rb +16 -4
  48. data/lib/bson/int64.rb +16 -4
  49. data/lib/bson/integer.rb +3 -4
  50. data/lib/bson/json.rb +1 -0
  51. data/lib/bson/max_key.rb +7 -9
  52. data/lib/bson/min_key.rb +7 -9
  53. data/lib/bson/nil_class.rb +1 -0
  54. data/lib/bson/object.rb +5 -25
  55. data/lib/bson/object_id.rb +75 -121
  56. data/lib/bson/open_struct.rb +3 -2
  57. data/lib/bson/regexp.rb +35 -64
  58. data/lib/bson/registry.rb +2 -6
  59. data/lib/bson/specialized.rb +2 -1
  60. data/lib/bson/string.rb +4 -27
  61. data/lib/bson/symbol.rb +22 -19
  62. data/lib/bson/time.rb +2 -1
  63. data/lib/bson/time_with_zone.rb +13 -1
  64. data/lib/bson/timestamp.rb +2 -1
  65. data/lib/bson/true_class.rb +2 -1
  66. data/lib/bson/undefined.rb +14 -0
  67. data/lib/bson/version.rb +2 -1
  68. data/lib/bson.rb +3 -2
  69. data/spec/bson/array_spec.rb +19 -60
  70. data/spec/bson/big_decimal_spec.rb +16 -4
  71. data/spec/bson/binary_spec.rb +83 -74
  72. data/spec/bson/binary_uuid_spec.rb +1 -0
  73. data/spec/bson/boolean_spec.rb +1 -0
  74. data/spec/bson/byte_buffer_read_spec.rb +1 -0
  75. data/spec/bson/byte_buffer_spec.rb +1 -0
  76. data/spec/bson/byte_buffer_write_spec.rb +1 -0
  77. data/spec/bson/code_spec.rb +5 -3
  78. data/spec/bson/code_with_scope_spec.rb +5 -3
  79. data/spec/bson/config_spec.rb +1 -35
  80. data/spec/bson/date_spec.rb +1 -0
  81. data/spec/bson/date_time_spec.rb +1 -0
  82. data/spec/bson/dbref_legacy_spec.rb +20 -3
  83. data/spec/bson/dbref_spec.rb +9 -9
  84. data/spec/bson/decimal128_spec.rb +40 -20
  85. data/spec/bson/document_as_spec.rb +1 -0
  86. data/spec/bson/document_spec.rb +1 -1
  87. data/spec/bson/ext_json_parse_spec.rb +1 -0
  88. data/spec/bson/false_class_spec.rb +8 -0
  89. data/spec/bson/float_spec.rb +8 -3
  90. data/spec/bson/hash_as_spec.rb +1 -0
  91. data/spec/bson/hash_spec.rb +87 -75
  92. data/spec/bson/int32_spec.rb +21 -6
  93. data/spec/bson/int64_spec.rb +21 -6
  94. data/spec/bson/integer_spec.rb +45 -13
  95. data/spec/bson/json_spec.rb +1 -0
  96. data/spec/bson/max_key_spec.rb +5 -3
  97. data/spec/bson/min_key_spec.rb +5 -3
  98. data/spec/bson/nil_class_spec.rb +1 -0
  99. data/spec/bson/object_id_spec.rb +43 -4
  100. data/spec/bson/object_spec.rb +2 -1
  101. data/spec/bson/open_struct_spec.rb +14 -71
  102. data/spec/bson/raw_spec.rb +9 -15
  103. data/spec/bson/regexp_spec.rb +4 -3
  104. data/spec/bson/registry_spec.rb +2 -1
  105. data/spec/bson/string_spec.rb +13 -38
  106. data/spec/bson/symbol_raw_spec.rb +25 -0
  107. data/spec/bson/symbol_spec.rb +15 -18
  108. data/spec/bson/time_spec.rb +1 -0
  109. data/spec/bson/time_with_zone_spec.rb +1 -0
  110. data/spec/bson/timestamp_spec.rb +1 -0
  111. data/spec/bson/true_class_spec.rb +8 -0
  112. data/spec/bson/undefined_spec.rb +27 -0
  113. data/spec/bson_spec.rb +1 -0
  114. data/spec/runners/common_driver.rb +6 -5
  115. data/spec/runners/corpus.rb +6 -0
  116. data/spec/runners/corpus_legacy.rb +1 -0
  117. data/spec/shared/lib/mrss/constraints.rb +8 -16
  118. data/spec/shared/lib/mrss/docker_runner.rb +30 -3
  119. data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
  120. data/spec/shared/lib/mrss/event_subscriber.rb +15 -5
  121. data/spec/shared/lib/mrss/lite_constraints.rb +48 -1
  122. data/spec/shared/lib/mrss/server_version_registry.rb +16 -23
  123. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  124. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  125. data/spec/shared/lib/mrss/utils.rb +28 -6
  126. data/spec/shared/share/Dockerfile.erb +68 -85
  127. data/spec/shared/shlib/config.sh +27 -0
  128. data/spec/shared/shlib/server.sh +73 -24
  129. data/spec/shared/shlib/set_env.sh +39 -1
  130. data/spec/spec_helper.rb +1 -0
  131. data/spec/spec_tests/common_driver_spec.rb +9 -4
  132. data/spec/spec_tests/corpus_legacy_spec.rb +1 -0
  133. data/spec/spec_tests/corpus_spec.rb +13 -3
  134. data/spec/spec_tests/data/corpus/binary.json +5 -0
  135. data/spec/spec_tests/data/corpus/code.json +13 -13
  136. data/spec/spec_tests/data/corpus/decimal128-4.json +48 -0
  137. data/spec/spec_tests/data/corpus/decimal128-6.json +12 -0
  138. data/spec/spec_tests/data/corpus/decimal128-7.json +4 -0
  139. data/spec/spec_tests/data/corpus/document.json +20 -0
  140. data/spec/spec_tests/data/corpus/symbol.json +7 -7
  141. data/spec/spec_tests/data/corpus/top.json +18 -3
  142. data/spec/support/shared_examples.rb +28 -5
  143. data/spec/support/spec_config.rb +1 -0
  144. data/spec/support/utils.rb +49 -1
  145. data.tar.gz.sig +0 -0
  146. metadata +167 -144
  147. metadata.gz.sig +2 -1
@@ -1,3 +1,4 @@
1
+ # rubocop:todo all
1
2
  require 'spec_helper'
2
3
 
3
4
  describe BSON::ByteBuffer do
@@ -1,3 +1,4 @@
1
+ # rubocop:todo all
1
2
  require 'spec_helper'
2
3
 
3
4
  describe BSON::ByteBuffer 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");
@@ -16,17 +17,18 @@ require "spec_helper"
16
17
 
17
18
  describe BSON::Code do
18
19
 
19
- describe "#as_json" do
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.as_json).to eq({ "$code" => "this.value = 5" })
27
+ expect(object.as_extended_json).to eq({ "$code" => "this.value = 5" })
27
28
  end
28
29
 
29
- it_behaves_like "a JSON serializable object"
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 "#as_json" do
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.as_json).to eq(
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 "a JSON serializable object"
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
@@ -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
@@ -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");
@@ -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");
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
- # encoding: utf-8
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
- describe BSON::DBRef do
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(ArgumentError)
96
+ end.should raise_error(BSON::Error::InvalidDBRefArgument)
80
97
  end
81
98
  end
82
99
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
- # encoding: utf-8
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 ArgumentError' do
82
+ it 'raises InvalidDBRefArgument' do
83
83
  lambda do
84
84
  dbref
85
- end.should raise_error(ArgumentError)
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 ArgumentError' do
95
+ it 'raises InvalidDBRefArgument' do
96
96
  lambda do
97
97
  dbref
98
- end.should raise_error(ArgumentError)
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(ArgumentError, /DBRef must have \$ref/)
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(ArgumentError, /DBRef must have \$id/)
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(ArgumentError, /The value for key \$ref must be a string/)
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(ArgumentError, /The value for key \$db must be a string/)
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 ArgumentError' do
32
+ it 'raises an InvalidDecimal128Argument error' do
32
33
  expect {
33
34
  described_class.new(:invalid)
34
- }.to raise_exception(ArgumentError)
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::Decimal128::InvalidRange, /Value out of range/)
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::Decimal128::UnrepresentablePrecision, /The value contains too much precision/)
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 with $numberDecimal key" do
1274
- expect(object.as_json).to eq({ "$numberDecimal" => object.to_s })
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 "#to_big_decimal" do
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
 
@@ -1,3 +1,4 @@
1
+ # rubocop:todo all
1
2
  # Copyright (C) 2021 MongoDB Inc.
2
3
  #
3
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # encoding: utf-8
1
+ # rubocop:todo all
2
2
 
3
3
  # Copyright (C) 2009-2020 MongoDB Inc.
4
4
  #
@@ -1,3 +1,4 @@
1
+ # rubocop:todo all
1
2
  # Copyright (C) 2020 MongoDB Inc.
2
3
  #
3
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -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
@@ -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.0.as_extended_json.should == {'$numberDouble' => '42.0'}
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
- 42.0.as_extended_json(mode: :relaxed)
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
- 42.0.as_extended_json(mode: :legacy)
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
@@ -1,3 +1,4 @@
1
+ # rubocop:todo all
1
2
  # Copyright (C) 2021 MongoDB Inc.
2
3
  #
3
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -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 invalid keys" do
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
- context "when validating globally" do
64
-
65
- before do
66
- BSON::Config.validating_keys = true
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
- context "when the hash contains an array of documents containing invalid keys" do
68
+ it "serializes the hash" do
69
+ expect(obj.to_bson.to_s).to eq(bson)
70
+ end
102
71
 
103
- let(:obj) do
104
- { "array" => [{ "$testing" => "value" }] }
105
- end
72
+ context "when the hash contains an array of documents containing invalid keys" do
106
73
 
107
- it "raises an error" do
108
- expect {
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
- "#{25.to_bson.to_s}#{String::BSON_TYPE}$testing#{BSON::NULL_BYTE}" +
120
- "#{6.to_bson.to_s}value#{BSON::NULL_BYTE}#{BSON::NULL_BYTE}"
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 BSON::Decimal128' do
274
- expect(from_bson).to eq({"x" => BSON::Decimal128.new('1')})
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.not_to raise_error
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.should == {'foo' => 'overwrite'}
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.should == {'foo' => :bar}
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