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/code_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::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,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.
|
|
@@ -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,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.
|
|
@@ -35,5 +36,58 @@ describe DateTime do
|
|
|
35
36
|
|
|
36
37
|
it_behaves_like "a serializable bson element"
|
|
37
38
|
end
|
|
39
|
+
|
|
40
|
+
context "when the dates don't both use Gregorian" do
|
|
41
|
+
|
|
42
|
+
let(:shakespeare_datetime) do
|
|
43
|
+
DateTime.iso8601('1616-04-23', Date::ENGLAND)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
let(:gregorian_datetime) do
|
|
47
|
+
DateTime.iso8601('1616-04-23', Date::GREGORIAN)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
context "when putting to bson" do
|
|
51
|
+
|
|
52
|
+
let(:shakespeare) do
|
|
53
|
+
{ a: shakespeare_datetime }.to_bson
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
let(:gregorian) do
|
|
57
|
+
{ a: gregorian_datetime }.to_bson
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
it "does not equal each other" do
|
|
61
|
+
expect(shakespeare.to_s).to_not eq(gregorian.to_s)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
it "the english date is 10 days later" do
|
|
65
|
+
expect(shakespeare.to_s).to eq({ a: DateTime.iso8601('1616-05-03', Date::GREGORIAN) }.to_bson.to_s)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
context "when putting and receiving from bson" do
|
|
70
|
+
|
|
71
|
+
let(:shakespeare) do
|
|
72
|
+
Hash.from_bson(BSON::ByteBuffer.new({ a: shakespeare_datetime }.to_bson.to_s))
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
let(:gregorian) do
|
|
76
|
+
Hash.from_bson(BSON::ByteBuffer.new({ a: gregorian_datetime }.to_bson.to_s))
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
it "does not equal each other" do
|
|
80
|
+
expect(shakespeare).to_not eq(gregorian)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
it "the english date is 10 days later" do
|
|
84
|
+
expect(shakespeare[:a]).to eq(DateTime.iso8601('1616-05-03', Date::GREGORIAN).to_time)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
it "the gregorian date is the same" do
|
|
88
|
+
expect(gregorian[:a]).to eq(DateTime.iso8601('1616-04-23', Date::GREGORIAN).to_time)
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
38
92
|
end
|
|
39
93
|
end
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
# rubocop:todo all
|
|
3
|
+
|
|
4
|
+
require 'spec_helper'
|
|
5
|
+
require 'json'
|
|
6
|
+
|
|
7
|
+
# These tests are copied from driver when the driver implemented Mongo:DBRef
|
|
8
|
+
# class, and are intended to verify that the current DBRef implementation is
|
|
9
|
+
# compatible with the legacy driver DBRef interface.
|
|
10
|
+
|
|
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
|
|
29
|
+
|
|
30
|
+
let(:object_id) do
|
|
31
|
+
BSON::ObjectId.new
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
describe '#as_json' do
|
|
35
|
+
|
|
36
|
+
context 'when the database is not provided' do
|
|
37
|
+
|
|
38
|
+
let(:dbref) do
|
|
39
|
+
described_class.new('users', object_id)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it 'returns the json document without database' do
|
|
43
|
+
expect(dbref.as_json).to eq({ '$ref' => 'users', '$id' => object_id })
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
context 'when the database is provided' do
|
|
48
|
+
|
|
49
|
+
let(:dbref) do
|
|
50
|
+
described_class.new('users', object_id, 'database')
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it 'returns the json document with database' do
|
|
54
|
+
expect(dbref.as_json).to eq({
|
|
55
|
+
'$ref' => 'users',
|
|
56
|
+
'$id' => object_id,
|
|
57
|
+
'$db' => 'database'
|
|
58
|
+
})
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
describe '#initialize' do
|
|
64
|
+
|
|
65
|
+
let(:dbref) do
|
|
66
|
+
described_class.new('users', object_id)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
it 'sets the collection' do
|
|
70
|
+
expect(dbref.collection).to eq('users')
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
it 'sets the id' do
|
|
74
|
+
expect(dbref.id).to eq(object_id)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
context 'when a database is provided' do
|
|
78
|
+
|
|
79
|
+
let(:dbref) do
|
|
80
|
+
described_class.new('users', object_id, 'db')
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
it 'sets the database' do
|
|
84
|
+
expect(dbref.database).to eq('db')
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
context 'when id is not provided' do
|
|
88
|
+
|
|
89
|
+
let(:dbref) do
|
|
90
|
+
described_class.new('users', nil, 'db')
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
it 'raises ArgumentError' do
|
|
94
|
+
lambda do
|
|
95
|
+
dbref
|
|
96
|
+
end.should raise_error(BSON::Error::InvalidDBRefArgument)
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
describe '#to_bson' do
|
|
103
|
+
|
|
104
|
+
let(:dbref) do
|
|
105
|
+
described_class.new('users', object_id, 'database')
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
it 'converts the underlying document to bson' do
|
|
109
|
+
expect(dbref.to_bson.to_s).to eq(dbref.as_json.to_bson.to_s)
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
describe '#to_json' do
|
|
114
|
+
|
|
115
|
+
context 'when the database is not provided' do
|
|
116
|
+
|
|
117
|
+
let(:dbref) do
|
|
118
|
+
described_class.new('users', object_id)
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
it 'returns the json document without database' do
|
|
122
|
+
expect(dbref.to_json).to eq("{\"$ref\":\"users\",\"$id\":#{object_id.to_json}}")
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
context 'when the database is provided' do
|
|
127
|
+
|
|
128
|
+
let(:dbref) do
|
|
129
|
+
described_class.new('users', object_id, 'database')
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
it 'returns the json document with database' do
|
|
133
|
+
expect(dbref.to_json).to eq("{\"$ref\":\"users\",\"$id\":#{object_id.to_json},\"$db\":\"database\"}")
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
describe '#from_bson' do
|
|
139
|
+
|
|
140
|
+
let(:buffer) do
|
|
141
|
+
dbref.to_bson
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
let(:decoded) do
|
|
145
|
+
BSON::Document.from_bson(BSON::ByteBuffer.new(buffer.to_s))
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
context 'when a database exists' do
|
|
149
|
+
|
|
150
|
+
let(:dbref) do
|
|
151
|
+
described_class.new('users', object_id, 'database')
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
it 'decodes the ref' do
|
|
155
|
+
expect(decoded.collection).to eq('users')
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
it 'decodes the id' do
|
|
159
|
+
expect(decoded.id).to eq(object_id)
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
it 'decodes the database' do
|
|
163
|
+
expect(decoded.database).to eq('database')
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
context 'when no database exists' do
|
|
168
|
+
|
|
169
|
+
let(:dbref) do
|
|
170
|
+
described_class.new('users', object_id)
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
it 'decodes the ref' do
|
|
174
|
+
expect(decoded.collection).to eq('users')
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
it 'decodes the id' do
|
|
178
|
+
expect(decoded.id).to eq(object_id)
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
it 'sets the database to nil' do
|
|
182
|
+
expect(decoded.database).to be_nil
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
end
|
|
186
|
+
end
|