bson 4.1.1 → 5.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/README.md +106 -7
- data/Rakefile +86 -43
- data/ext/bson/{native-endian.h → bson-endian.h} +14 -107
- data/ext/bson/bson-native.h +135 -0
- data/ext/bson/bytebuf.c +133 -0
- data/ext/bson/endian.c +117 -0
- data/ext/bson/extconf.rb +8 -3
- data/ext/bson/init.c +364 -0
- data/ext/bson/libbson-utf8.c +230 -0
- data/ext/bson/read.c +470 -0
- data/ext/bson/util.c +250 -0
- data/ext/bson/write.c +675 -0
- data/lib/bson/active_support.rb +19 -0
- data/lib/bson/array.rb +97 -30
- data/lib/bson/big_decimal.rb +77 -0
- data/lib/bson/binary.rb +510 -70
- data/lib/bson/boolean.rb +15 -4
- data/lib/bson/code.rb +25 -12
- data/lib/bson/code_with_scope.rb +41 -15
- data/lib/bson/config.rb +3 -28
- data/lib/bson/date.rb +16 -4
- data/lib/bson/date_time.rb +6 -4
- data/lib/bson/db_pointer.rb +110 -0
- data/lib/bson/dbref.rb +154 -0
- data/lib/bson/decimal128/builder.rb +456 -0
- data/lib/bson/decimal128.rb +272 -0
- data/lib/bson/document.rb +177 -7
- data/lib/bson/environment.rb +17 -2
- 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 +22 -0
- data/lib/bson/ext_json.rb +389 -0
- data/lib/bson/false_class.rb +6 -4
- data/lib/bson/float.rb +43 -7
- data/lib/bson/hash.rb +152 -37
- data/lib/bson/int32.rb +104 -6
- data/lib/bson/int64.rb +111 -8
- data/lib/bson/integer.rb +43 -9
- data/lib/bson/json.rb +3 -1
- data/lib/bson/max_key.rb +21 -10
- data/lib/bson/min_key.rb +21 -10
- data/lib/bson/nil_class.rb +7 -3
- data/lib/bson/object.rb +25 -17
- data/lib/bson/object_id.rb +98 -113
- data/lib/bson/open_struct.rb +59 -0
- data/lib/bson/regexp.rb +129 -56
- data/lib/bson/registry.rb +7 -10
- data/lib/bson/specialized.rb +8 -4
- data/lib/bson/string.rb +12 -32
- data/lib/bson/symbol.rb +107 -11
- data/lib/bson/time.rb +68 -7
- data/lib/bson/time_with_zone.rb +67 -0
- data/lib/bson/timestamp.rb +50 -10
- data/lib/bson/true_class.rb +6 -4
- data/lib/bson/undefined.rb +28 -2
- data/lib/bson/vector.rb +44 -0
- data/lib/bson/version.rb +6 -14
- data/lib/bson.rb +22 -12
- data/spec/README.md +14 -0
- data/spec/bson/array_spec.rb +38 -62
- data/spec/bson/big_decimal_spec.rb +328 -0
- data/spec/bson/binary_spec.rb +199 -53
- data/spec/bson/binary_uuid_spec.rb +190 -0
- data/spec/bson/boolean_spec.rb +2 -1
- data/spec/bson/byte_buffer_read_spec.rb +198 -0
- data/spec/bson/byte_buffer_spec.rb +122 -381
- data/spec/bson/byte_buffer_write_spec.rb +855 -0
- data/spec/bson/code_spec.rb +6 -4
- data/spec/bson/code_with_scope_spec.rb +6 -4
- data/spec/bson/config_spec.rb +1 -35
- data/spec/bson/date_spec.rb +2 -1
- data/spec/bson/date_time_spec.rb +55 -1
- data/spec/bson/dbref_legacy_spec.rb +186 -0
- data/spec/bson/dbref_spec.rb +487 -0
- data/spec/bson/decimal128_spec.rb +1840 -0
- data/spec/bson/document_as_spec.rb +61 -0
- data/spec/bson/document_spec.rb +205 -32
- data/spec/bson/ext_json_parse_spec.rb +346 -0
- data/spec/bson/false_class_spec.rb +9 -1
- data/spec/bson/float_spec.rb +42 -1
- data/spec/bson/hash_as_spec.rb +58 -0
- data/spec/bson/hash_spec.rb +318 -66
- data/spec/bson/int32_spec.rb +248 -1
- data/spec/bson/int64_spec.rb +308 -1
- data/spec/bson/integer_spec.rb +61 -3
- data/spec/bson/json_spec.rb +2 -1
- data/spec/bson/max_key_spec.rb +6 -4
- data/spec/bson/min_key_spec.rb +6 -4
- data/spec/bson/nil_class_spec.rb +2 -1
- data/spec/bson/object_id_spec.rb +95 -5
- data/spec/bson/object_spec.rb +3 -2
- data/spec/bson/open_struct_spec.rb +87 -0
- data/spec/bson/raw_spec.rb +594 -0
- data/spec/bson/regexp_spec.rb +61 -8
- data/spec/bson/registry_spec.rb +3 -2
- data/spec/bson/string_spec.rb +26 -33
- data/spec/bson/symbol_raw_spec.rb +70 -0
- data/spec/bson/symbol_spec.rb +77 -20
- data/spec/bson/time_spec.rb +206 -2
- data/spec/bson/time_with_zone_spec.rb +69 -0
- data/spec/bson/timestamp_spec.rb +58 -2
- data/spec/bson/true_class_spec.rb +9 -1
- data/spec/bson/undefined_spec.rb +28 -1
- data/spec/bson/vector_spec.rb +33 -0
- data/spec/bson_spec.rb +2 -1
- data/spec/runners/binary_vector.rb +78 -0
- data/spec/runners/common_driver.rb +348 -0
- data/spec/runners/corpus.rb +191 -0
- data/spec/runners/corpus_legacy.rb +248 -0
- data/spec/shared/LICENSE +20 -0
- data/spec/shared/bin/get-mongodb-download-url +17 -0
- data/spec/shared/bin/s3-copy +45 -0
- data/spec/shared/bin/s3-upload +69 -0
- data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
- data/spec/shared/lib/mrss/cluster_config.rb +231 -0
- data/spec/shared/lib/mrss/constraints.rb +378 -0
- data/spec/shared/lib/mrss/docker_runner.rb +298 -0
- data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
- data/spec/shared/lib/mrss/event_subscriber.rb +210 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +238 -0
- data/spec/shared/lib/mrss/release/candidate.rb +281 -0
- data/spec/shared/lib/mrss/release/product_data.rb +144 -0
- data/spec/shared/lib/mrss/server_version_registry.rb +113 -0
- 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/spec_organizer.rb +179 -0
- data/spec/shared/lib/mrss/utils.rb +37 -0
- data/spec/shared/lib/tasks/candidate.rake +64 -0
- data/spec/shared/share/Dockerfile.erb +251 -0
- data/spec/shared/share/haproxy-1.conf +16 -0
- data/spec/shared/share/haproxy-2.conf +17 -0
- data/spec/shared/shlib/config.sh +27 -0
- data/spec/shared/shlib/distro.sh +84 -0
- data/spec/shared/shlib/server.sh +423 -0
- data/spec/shared/shlib/set_env.sh +110 -0
- data/spec/spec_helper.rb +61 -1
- data/spec/spec_tests/binary_vector_spec.rb +82 -0
- data/spec/spec_tests/common_driver_spec.rb +84 -0
- data/spec/spec_tests/corpus_legacy_spec.rb +72 -0
- data/spec/spec_tests/corpus_spec.rb +134 -0
- data/spec/spec_tests/data/binary_vector/README.md +61 -0
- data/spec/spec_tests/data/binary_vector/float32.json +65 -0
- data/spec/spec_tests/data/binary_vector/int8.json +57 -0
- data/spec/spec_tests/data/binary_vector/packed_bit.json +83 -0
- data/spec/spec_tests/data/corpus/README.md +15 -0
- data/spec/spec_tests/data/corpus/array.json +49 -0
- data/spec/spec_tests/data/corpus/binary.json +153 -0
- data/spec/spec_tests/data/corpus/boolean.json +27 -0
- data/spec/spec_tests/data/corpus/code.json +67 -0
- data/spec/spec_tests/data/corpus/code_w_scope.json +78 -0
- data/spec/spec_tests/data/corpus/datetime.json +42 -0
- data/spec/spec_tests/data/corpus/dbpointer.json +56 -0
- data/spec/spec_tests/data/corpus/dbref.json +51 -0
- data/spec/spec_tests/data/corpus/decimal128-1.json +317 -0
- data/spec/spec_tests/data/corpus/decimal128-2.json +793 -0
- data/spec/spec_tests/data/corpus/decimal128-3.json +1771 -0
- data/spec/spec_tests/data/corpus/decimal128-4.json +165 -0
- data/spec/spec_tests/data/corpus/decimal128-5.json +402 -0
- data/spec/spec_tests/data/corpus/decimal128-6.json +131 -0
- data/spec/spec_tests/data/corpus/decimal128-7.json +327 -0
- data/spec/spec_tests/data/corpus/document.json +60 -0
- data/spec/spec_tests/data/corpus/double.json +87 -0
- data/spec/spec_tests/data/corpus/int32.json +43 -0
- data/spec/spec_tests/data/corpus/int64.json +43 -0
- data/spec/spec_tests/data/corpus/maxkey.json +12 -0
- data/spec/spec_tests/data/corpus/minkey.json +12 -0
- data/spec/spec_tests/data/corpus/multi-type-deprecated.json +15 -0
- data/spec/spec_tests/data/corpus/multi-type.json +11 -0
- data/spec/spec_tests/data/corpus/null.json +12 -0
- data/spec/spec_tests/data/corpus/oid.json +28 -0
- data/spec/spec_tests/data/corpus/regex.json +65 -0
- data/spec/spec_tests/data/corpus/string.json +72 -0
- data/spec/spec_tests/data/corpus/symbol.json +80 -0
- data/spec/spec_tests/data/corpus/timestamp.json +34 -0
- data/spec/spec_tests/data/corpus/top.json +262 -0
- data/spec/spec_tests/data/corpus/undefined.json +15 -0
- data/spec/spec_tests/data/corpus_legacy/array.json +49 -0
- data/spec/spec_tests/data/corpus_legacy/binary.json +69 -0
- data/spec/spec_tests/data/corpus_legacy/boolean.json +27 -0
- data/spec/spec_tests/data/corpus_legacy/code.json +67 -0
- data/spec/spec_tests/data/corpus_legacy/code_w_scope.json +78 -0
- data/spec/spec_tests/data/corpus_legacy/document.json +36 -0
- data/spec/spec_tests/data/corpus_legacy/double.json +69 -0
- data/spec/spec_tests/data/corpus_legacy/failures/datetime.json +31 -0
- data/spec/spec_tests/data/corpus_legacy/failures/dbpointer.json +42 -0
- data/spec/spec_tests/data/corpus_legacy/failures/int64.json +38 -0
- data/spec/spec_tests/data/corpus_legacy/failures/symbol.json +62 -0
- data/spec/spec_tests/data/corpus_legacy/int32.json +38 -0
- data/spec/spec_tests/data/corpus_legacy/maxkey.json +12 -0
- data/spec/spec_tests/data/corpus_legacy/minkey.json +12 -0
- data/spec/spec_tests/data/corpus_legacy/null.json +12 -0
- data/spec/spec_tests/data/corpus_legacy/oid.json +28 -0
- data/spec/spec_tests/data/corpus_legacy/regex.json +37 -0
- data/spec/spec_tests/data/corpus_legacy/string.json +67 -0
- data/spec/spec_tests/data/corpus_legacy/timestamp.json +18 -0
- data/spec/spec_tests/data/corpus_legacy/top.json +62 -0
- data/spec/spec_tests/data/corpus_legacy/undefined.json +13 -0
- data/spec/spec_tests/data/decimal128/decimal128-1.json +363 -0
- data/spec/spec_tests/data/decimal128/decimal128-2.json +793 -0
- data/spec/spec_tests/data/decimal128/decimal128-3.json +1771 -0
- data/spec/spec_tests/data/decimal128/decimal128-4.json +165 -0
- data/spec/spec_tests/data/decimal128/decimal128-5.json +402 -0
- data/spec/spec_tests/data/decimal128/decimal128-6.json +131 -0
- data/spec/spec_tests/data/decimal128/decimal128-7.json +327 -0
- data/spec/support/shared_examples.rb +32 -11
- data/spec/support/spec_config.rb +17 -0
- data/spec/support/utils.rb +58 -0
- metadata +284 -45
- checksums.yaml.gz.sig +0 -3
- data/ext/bson/native.c +0 -722
- data.tar.gz.sig +0 -0
- metadata.gz.sig +0 -0
data/spec/bson/min_key_spec.rb
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
#
|
|
1
|
+
# rubocop:todo all
|
|
2
|
+
# Copyright (C) 2009-2020 MongoDB Inc.
|
|
2
3
|
#
|
|
3
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
5
|
# you may not use this file except in compliance with the License.
|
|
@@ -16,17 +17,18 @@ require "spec_helper"
|
|
|
16
17
|
|
|
17
18
|
describe BSON::MinKey do
|
|
18
19
|
|
|
19
|
-
describe "#
|
|
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.
|
|
27
|
+
expect(object.as_extended_json).to eq({ "$minKey" => 1 })
|
|
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 "#==" do
|
data/spec/bson/nil_class_spec.rb
CHANGED
data/spec/bson/object_id_spec.rb
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
#
|
|
1
|
+
# rubocop:todo all
|
|
2
|
+
# Copyright (C) 2009-2020 MongoDB Inc.
|
|
2
3
|
#
|
|
3
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
5
|
# you may not use this file except in compliance with 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
|
|
224
|
-
expect(object.as_json).to eq(
|
|
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::
|
|
326
|
+
}.to raise_error(BSON::Error::InvalidObjectId)
|
|
315
327
|
end
|
|
316
328
|
end
|
|
317
329
|
end
|
|
@@ -392,6 +404,43 @@ describe BSON::ObjectId do
|
|
|
392
404
|
end
|
|
393
405
|
end
|
|
394
406
|
|
|
407
|
+
describe "#clone" do
|
|
408
|
+
|
|
409
|
+
context "when the data has not been generated yet" do
|
|
410
|
+
|
|
411
|
+
let!(:object_id) do
|
|
412
|
+
described_class.new
|
|
413
|
+
end
|
|
414
|
+
|
|
415
|
+
let!(:clone) do
|
|
416
|
+
object_id.clone
|
|
417
|
+
end
|
|
418
|
+
|
|
419
|
+
it "generates and copies the data" do
|
|
420
|
+
expect(clone).to eq(object_id)
|
|
421
|
+
end
|
|
422
|
+
end
|
|
423
|
+
|
|
424
|
+
context "when the data has been generated" do
|
|
425
|
+
|
|
426
|
+
let!(:object_id) do
|
|
427
|
+
described_class.new
|
|
428
|
+
end
|
|
429
|
+
|
|
430
|
+
let(:clone) do
|
|
431
|
+
object_id.clone
|
|
432
|
+
end
|
|
433
|
+
|
|
434
|
+
before do
|
|
435
|
+
object_id.to_s
|
|
436
|
+
end
|
|
437
|
+
|
|
438
|
+
it "copies the data" do
|
|
439
|
+
expect(clone).to eq(object_id)
|
|
440
|
+
end
|
|
441
|
+
end
|
|
442
|
+
end
|
|
443
|
+
|
|
395
444
|
describe "#inspect" do
|
|
396
445
|
|
|
397
446
|
let(:object_id) do
|
|
@@ -555,7 +604,48 @@ describe BSON::ObjectId do
|
|
|
555
604
|
it "raises an exception on serialization" do
|
|
556
605
|
expect {
|
|
557
606
|
hash.to_bson
|
|
558
|
-
}.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 the timestamp is larger than a 32-bit integer' do
|
|
626
|
+
let(:distant_future) { Time.at(2 ** 32) }
|
|
627
|
+
|
|
628
|
+
before do
|
|
629
|
+
allow(Time).to receive(:now).and_return(distant_future)
|
|
630
|
+
end
|
|
631
|
+
|
|
632
|
+
let(:object_id) { BSON::ObjectId.new }
|
|
633
|
+
|
|
634
|
+
it 'wraps the timestamp to 0' do
|
|
635
|
+
expect(object_id.to_time).to be == Time.at(0)
|
|
636
|
+
end
|
|
637
|
+
end
|
|
638
|
+
|
|
639
|
+
context 'when fork changes the pid' do
|
|
640
|
+
before do
|
|
641
|
+
skip 'requires Process.fork' unless Process.respond_to?(:fork)
|
|
642
|
+
end
|
|
643
|
+
|
|
644
|
+
let(:parent_id) { BSON::ObjectId.new }
|
|
645
|
+
let(:child_id) { Utils.perform_in_child { BSON::ObjectId.new } }
|
|
646
|
+
|
|
647
|
+
it 'changes the process portion of the object-id' do
|
|
648
|
+
expect(child_id._process_part).not_to be == parent_id._process_part
|
|
559
649
|
end
|
|
560
650
|
end
|
|
561
651
|
end
|
data/spec/bson/object_spec.rb
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
#
|
|
1
|
+
# rubocop:todo all
|
|
2
|
+
# Copyright (C) 2009-2020 MongoDB Inc.
|
|
2
3
|
#
|
|
3
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
5
|
# you may not use this file except in compliance with 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
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# rubocop:todo all
|
|
2
|
+
# Copyright (C) 2016-2020 MongoDB Inc.
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
require "spec_helper"
|
|
17
|
+
|
|
18
|
+
describe OpenStruct do
|
|
19
|
+
|
|
20
|
+
describe "#to_bson" do
|
|
21
|
+
|
|
22
|
+
let(:type) { 3.chr }
|
|
23
|
+
|
|
24
|
+
it_behaves_like "a bson element"
|
|
25
|
+
|
|
26
|
+
context "when the struct is a single level" do
|
|
27
|
+
|
|
28
|
+
let(:obj) do
|
|
29
|
+
described_class.new({"key" => "value" })
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
let(:bson) do
|
|
33
|
+
"#{20.to_bson.to_s}#{String::BSON_TYPE}key#{BSON::NULL_BYTE}" +
|
|
34
|
+
"#{6.to_bson.to_s}value#{BSON::NULL_BYTE}#{BSON::NULL_BYTE}"
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it_behaves_like "a serializable bson element"
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
context "when the struct has dollar keys" do
|
|
41
|
+
|
|
42
|
+
let(:obj) do
|
|
43
|
+
described_class.new({ "$testing" => "value" })
|
|
44
|
+
end
|
|
45
|
+
|
|
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
|
|
50
|
+
|
|
51
|
+
it "serializes the struct" do
|
|
52
|
+
expect(obj.to_bson.to_s).to eq(bson)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
context "when the struct contains an array of documents containing invalid keys" do
|
|
56
|
+
|
|
57
|
+
let(:obj) do
|
|
58
|
+
described_class.new({ "array" => [{ "$testing" => "value" }] })
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
let(:bson) do
|
|
62
|
+
"#{45.to_bson.to_s}#{Array::BSON_TYPE}array#{BSON::NULL_BYTE}" +
|
|
63
|
+
"#{[{ "$testing" => "value" }].to_bson.to_s}#{BSON::NULL_BYTE}"
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
it "serializes the struct" do
|
|
67
|
+
expect(obj.to_bson.to_s).to eq(bson)
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
context "when the struct is embedded" do
|
|
73
|
+
|
|
74
|
+
let(:obj) do
|
|
75
|
+
described_class.new({ "field" => OpenStruct.new({ "key" => "value" })})
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
let(:bson) do
|
|
79
|
+
"#{32.to_bson.to_s}#{Hash::BSON_TYPE}field#{BSON::NULL_BYTE}" +
|
|
80
|
+
"#{20.to_bson.to_s}#{String::BSON_TYPE}key#{BSON::NULL_BYTE}" +
|
|
81
|
+
"#{6.to_bson.to_s}value#{BSON::NULL_BYTE}#{BSON::NULL_BYTE}#{BSON::NULL_BYTE}"
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
it_behaves_like "a serializable bson element"
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|