bson 4.14.1 → 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 +33 -109
  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 +249 -14
  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 -143
  147. metadata.gz.sig +0 -0
@@ -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
@@ -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");
@@ -254,23 +255,37 @@ describe BSON::Int32 do
254
255
  end
255
256
  end
256
257
 
258
+ describe '#as_json' do
259
+ let(:object) { described_class.new(42) }
260
+
261
+ it 'returns an Integer' do
262
+ expect(object.as_json).to eq 42
263
+ end
264
+
265
+ it_behaves_like "a JSON serializable object"
266
+ end
267
+
257
268
  describe '#as_extended_json' do
269
+ let(:object) { described_class.new(42) }
270
+
258
271
  context 'canonical mode' do
259
- it 'returns $numberInt' do
260
- described_class.new(42).as_extended_json.should == {'$numberInt' => '42'}
272
+ it 'returns a Hash with key $numberInt' do
273
+ expect(object.as_extended_json).to eq({ '$numberInt' => '42' })
261
274
  end
262
275
  end
263
276
 
264
277
  context 'relaxed mode' do
265
- it 'returns integer' do
266
- described_class.new(42).as_extended_json(mode: :relaxed).should == 42
278
+ it 'returns an Integer' do
279
+ expect(object.as_extended_json(mode: :relaxed)).to eq 42
267
280
  end
268
281
  end
269
282
 
270
283
  context 'legacy mode' do
271
- it 'returns integer' do
272
- described_class.new(42).as_extended_json(mode: :legacy).should be 42
284
+ it 'returns an Integer' do
285
+ expect(object.as_extended_json(mode: :legacy)).to eq 42
273
286
  end
274
287
  end
288
+
289
+ it_behaves_like "an Extended JSON serializable object"
275
290
  end
276
291
  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");
@@ -298,23 +299,37 @@ describe BSON::Int64 do
298
299
  end
299
300
  end
300
301
 
302
+ describe '#as_json' do
303
+ let(:object) { described_class.new(42) }
304
+
305
+ it 'returns an Integer' do
306
+ expect(object.as_json).to eq 42
307
+ end
308
+
309
+ it_behaves_like "a JSON serializable object"
310
+ end
311
+
301
312
  describe '#as_extended_json' do
313
+ let(:object) { described_class.new(42) }
314
+
302
315
  context 'canonical mode' do
303
- it 'returns $numberLong' do
304
- described_class.new(42).as_extended_json.should == {'$numberLong' => '42'}
316
+ it 'returns a Hash with key $numberLong' do
317
+ expect(object.as_extended_json).to eq({ '$numberLong' => '42' })
305
318
  end
306
319
  end
307
320
 
308
321
  context 'relaxed mode' do
309
- it 'returns integer' do
310
- described_class.new(42).as_extended_json(mode: :relaxed).should == 42
322
+ it 'returns an Integer' do
323
+ expect(object.as_extended_json(mode: :relaxed)).to eq 42
311
324
  end
312
325
  end
313
326
 
314
327
  context 'legacy mode' do
315
- it 'returns integer' do
316
- described_class.new(42).as_extended_json(mode: :legacy).should be 42
328
+ it 'returns an Integer' do
329
+ expect(object.as_extended_json(mode: :legacy)).to eq 42
317
330
  end
318
331
  end
332
+
333
+ it_behaves_like "an Extended JSON serializable object"
319
334
  end
320
335
  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");
@@ -69,29 +70,60 @@ describe Integer do
69
70
  end
70
71
  end
71
72
 
72
- describe '#to_json' do
73
- it 'returns integer' do
74
- 42.to_json.should == '42'
73
+ describe '#as_json' do
74
+ it 'returns an integer string' do
75
+ expect(42.to_json).to eq '42'
75
76
  end
76
77
  end
77
78
 
78
79
  describe '#as_extended_json' do
79
- context 'canonical mode' do
80
- it 'returns $numberInt' do
81
- 42.as_extended_json.should == {'$numberInt' => '42'}
80
+
81
+ context 'when 32-bit representable' do
82
+ let(:object) { 42 }
83
+
84
+ context 'canonical mode' do
85
+ it 'returns $numberInt when small' do
86
+ expect(object.as_extended_json).to eq({ '$numberInt' => '42' })
87
+ end
82
88
  end
83
- end
84
89
 
85
- context 'relaxed mode' do
86
- it 'returns integer' do
87
- 42.as_extended_json(mode: :relaxed).should be 42
90
+ context 'relaxed mode' do
91
+ it 'returns integer' do
92
+ expect(object.as_extended_json(mode: :relaxed)).to eq 42
93
+ end
88
94
  end
95
+
96
+ context 'legacy mode' do
97
+ it 'returns integer' do
98
+ expect(object.as_extended_json(mode: :legacy)).to eq 42
99
+ end
100
+ end
101
+
102
+ it_behaves_like "an Extended JSON serializable object"
89
103
  end
90
104
 
91
- context 'legacy mode' do
92
- it 'returns integer' do
93
- 42.as_extended_json(mode: :legacy).should be 42
105
+ context 'when not 32-bit representable' do
106
+ let(:object) { 18014398241046527 }
107
+
108
+ context 'canonical mode' do
109
+ it 'returns $numberInt when small' do
110
+ expect(object.as_extended_json).to eq({ '$numberLong' => '18014398241046527' })
111
+ end
112
+ end
113
+
114
+ context 'relaxed mode' do
115
+ it 'returns integer' do
116
+ expect(object.as_extended_json(mode: :relaxed)).to eq 18014398241046527
117
+ end
94
118
  end
119
+
120
+ context 'legacy mode' do
121
+ it 'returns integer' do
122
+ expect(object.as_extended_json(mode: :legacy)).to eq 18014398241046527
123
+ end
124
+ end
125
+
126
+ it_behaves_like "an Extended JSON serializable object"
95
127
  end
96
128
  end
97
129
  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");
@@ -49,17 +50,18 @@ describe BSON::MaxKey do
49
50
  end
50
51
  end
51
52
 
52
- describe "#as_json" do
53
+ describe "#as_extended_json" do
53
54
 
54
55
  let(:object) do
55
56
  described_class.new
56
57
  end
57
58
 
58
59
  it "returns the binary data plus type" do
59
- expect(object.as_json).to eq({ "$maxKey" => 1 })
60
+ expect(object.as_extended_json).to eq({ "$maxKey" => 1 })
60
61
  end
61
62
 
62
- it_behaves_like "a JSON serializable object"
63
+ it_behaves_like 'an Extended JSON serializable object'
64
+ it_behaves_like '#as_json calls #as_extended_json'
63
65
  end
64
66
 
65
67
  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");
@@ -16,17 +17,18 @@ require "spec_helper"
16
17
 
17
18
  describe BSON::MinKey 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
23
24
  end
24
25
 
25
26
  it "returns the binary data plus type" do
26
- expect(object.as_json).to eq({ "$minKey" => 1 })
27
+ expect(object.as_extended_json).to eq({ "$minKey" => 1 })
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 "#==" 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");
@@ -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");
@@ -220,13 +221,24 @@ describe BSON::ObjectId do
220
221
  described_class.new
221
222
  end
222
223
 
223
- it "returns the object id with $oid key" do
224
- expect(object.as_json).to eq({ "$oid" => object.to_s })
224
+ it "returns the object id as a string" do
225
+ expect(object.as_json).to eq(object.to_s)
225
226
  end
226
227
 
227
228
  it_behaves_like "a JSON serializable object"
228
229
  end
229
230
 
231
+ describe "#as_extended_json" do
232
+
233
+ let(:object) do
234
+ described_class.new
235
+ end
236
+
237
+ it "returns the object id with $oid key" do
238
+ expect(object.as_extended_json).to eq({ "$oid" => object.to_s })
239
+ end
240
+ end
241
+
230
242
  describe "::BSON_TYPE" do
231
243
 
232
244
  it "returns 0x07" do
@@ -311,7 +323,7 @@ describe BSON::ObjectId do
311
323
  it "raises an error" do
312
324
  expect {
313
325
  described_class.from_string("asadsf")
314
- }.to raise_error(BSON::ObjectId::Invalid)
326
+ }.to raise_error(BSON::Error::InvalidObjectId)
315
327
  end
316
328
  end
317
329
  end
@@ -592,7 +604,34 @@ describe BSON::ObjectId do
592
604
  it "raises an exception on serialization" do
593
605
  expect {
594
606
  hash.to_bson
595
- }.to raise_error(BSON::InvalidKey)
607
+ }.to raise_error(BSON::Error::InvalidKey)
608
+ end
609
+ end
610
+
611
+ context 'when the counter wraps' do
612
+ before do
613
+ BSON::ObjectId._generator.reset_counter(0xFFFFFF)
614
+ end
615
+
616
+ let(:before) { BSON::ObjectId.new }
617
+ let(:after) { BSON::ObjectId.new }
618
+
619
+ it 'resets the counter portion to 0' do
620
+ expect(before._counter_part).to be == "ffffff"
621
+ expect(after._counter_part).to be == "000000"
622
+ end
623
+ end
624
+
625
+ context 'when fork changes the pid' do
626
+ before do
627
+ skip 'requires Process.fork' unless Process.respond_to?(:fork)
628
+ end
629
+
630
+ let(:parent_id) { BSON::ObjectId.new }
631
+ let(:child_id) { Utils.perform_in_child { BSON::ObjectId.new } }
632
+
633
+ it 'changes the process portion of the object-id' do
634
+ expect(child_id._process_part).not_to be == parent_id._process_part
596
635
  end
597
636
  end
598
637
  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");
@@ -25,7 +26,7 @@ describe BSON::Object do
25
26
  it "raises an exception" do
26
27
  expect {
27
28
  object.to_bson_key
28
- }.to raise_error(BSON::InvalidKey)
29
+ }.to raise_error(BSON::Error::InvalidKey)
29
30
  end
30
31
  end
31
32
  end
@@ -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");
@@ -36,93 +37,35 @@ describe OpenStruct do
36
37
  it_behaves_like "a serializable bson element"
37
38
  end
38
39
 
39
- context "when the struct has invalid keys" do
40
+ context "when the struct has dollar keys" do
40
41
 
41
42
  let(:obj) do
42
43
  described_class.new({ "$testing" => "value" })
43
44
  end
44
45
 
45
- context "when validating keys" do
46
-
47
- context "when validating globally" do
48
-
49
- before do
50
- BSON::Config.validating_keys = true
51
- end
52
-
53
- after do
54
- BSON::Config.validating_keys = false
55
- end
56
-
57
- it "raises an error" do
58
- expect {
59
- obj.to_bson
60
- }.to raise_error(BSON::String::IllegalKey)
61
- end
62
-
63
- context "when the struct contains an array of documents containing invalid keys" do
64
-
65
- let(:obj) do
66
- described_class.new({ "array" => [{ "$testing" => "value" }] })
67
- end
68
-
69
- it "raises an error" do
70
- expect {
71
- obj.to_bson
72
- }.to raise_error(BSON::String::IllegalKey)
73
- end
74
- end
75
- end
76
-
77
- context "when validating locally" do
78
-
79
- it "raises an error" do
80
- expect {
81
- obj.to_bson(BSON::ByteBuffer.new, true)
82
- }.to raise_error(BSON::String::IllegalKey)
83
- end
46
+ let(:bson) do
47
+ "#{25.to_bson.to_s}#{String::BSON_TYPE}$testing#{BSON::NULL_BYTE}" +
48
+ "#{6.to_bson.to_s}value#{BSON::NULL_BYTE}#{BSON::NULL_BYTE}"
49
+ end
84
50
 
85
- context "when the struct contains an array of documents containing invalid keys" do
51
+ it "serializes the struct" do
52
+ expect(obj.to_bson.to_s).to eq(bson)
53
+ end
86
54
 
87
- let(:obj) do
88
- described_class.new({ "array" => [{ "$testing" => "value" }] })
89
- end
55
+ context "when the struct contains an array of documents containing invalid keys" do
90
56
 
91
- it "raises an error" do
92
- expect {
93
- obj.to_bson(BSON::ByteBuffer.new, true)
94
- }.to raise_error(BSON::String::IllegalKey)
95
- end
96
- end
57
+ let(:obj) do
58
+ described_class.new({ "array" => [{ "$testing" => "value" }] })
97
59
  end
98
- end
99
-
100
- context "when not validating keys" do
101
60
 
102
61
  let(:bson) do
103
- "#{25.to_bson.to_s}#{String::BSON_TYPE}$testing#{BSON::NULL_BYTE}" +
104
- "#{6.to_bson.to_s}value#{BSON::NULL_BYTE}#{BSON::NULL_BYTE}"
62
+ "#{45.to_bson.to_s}#{Array::BSON_TYPE}array#{BSON::NULL_BYTE}" +
63
+ "#{[{ "$testing" => "value" }].to_bson.to_s}#{BSON::NULL_BYTE}"
105
64
  end
106
65
 
107
66
  it "serializes the struct" do
108
67
  expect(obj.to_bson.to_s).to eq(bson)
109
68
  end
110
-
111
- context "when the struct contains an array of documents containing invalid keys" do
112
-
113
- let(:obj) do
114
- described_class.new({ "array" => [{ "$testing" => "value" }] })
115
- end
116
-
117
- let(:bson) do
118
- "#{45.to_bson.to_s}#{Array::BSON_TYPE}array#{BSON::NULL_BYTE}" +
119
- "#{[{ "$testing" => "value" }].to_bson.to_s}#{BSON::NULL_BYTE}"
120
- end
121
-
122
- it "serializes the struct" do
123
- expect(obj.to_bson.to_s).to eq(bson)
124
- end
125
- end
126
69
  end
127
70
  end
128
71