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.
Files changed (226) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +106 -7
  3. data/Rakefile +86 -43
  4. data/ext/bson/{native-endian.h → bson-endian.h} +14 -107
  5. data/ext/bson/bson-native.h +135 -0
  6. data/ext/bson/bytebuf.c +133 -0
  7. data/ext/bson/endian.c +117 -0
  8. data/ext/bson/extconf.rb +8 -3
  9. data/ext/bson/init.c +364 -0
  10. data/ext/bson/libbson-utf8.c +230 -0
  11. data/ext/bson/read.c +470 -0
  12. data/ext/bson/util.c +250 -0
  13. data/ext/bson/write.c +675 -0
  14. data/lib/bson/active_support.rb +19 -0
  15. data/lib/bson/array.rb +97 -30
  16. data/lib/bson/big_decimal.rb +77 -0
  17. data/lib/bson/binary.rb +510 -70
  18. data/lib/bson/boolean.rb +15 -4
  19. data/lib/bson/code.rb +25 -12
  20. data/lib/bson/code_with_scope.rb +41 -15
  21. data/lib/bson/config.rb +3 -28
  22. data/lib/bson/date.rb +16 -4
  23. data/lib/bson/date_time.rb +6 -4
  24. data/lib/bson/db_pointer.rb +110 -0
  25. data/lib/bson/dbref.rb +154 -0
  26. data/lib/bson/decimal128/builder.rb +456 -0
  27. data/lib/bson/decimal128.rb +272 -0
  28. data/lib/bson/document.rb +177 -7
  29. data/lib/bson/environment.rb +17 -2
  30. data/lib/bson/error/bson_decode_error.rb +11 -0
  31. data/lib/bson/error/ext_json_parse_error.rb +11 -0
  32. data/lib/bson/error/illegal_key.rb +23 -0
  33. data/lib/bson/error/invalid_binary_type.rb +37 -0
  34. data/lib/bson/error/invalid_dbref_argument.rb +12 -0
  35. data/lib/bson/error/invalid_decimal128_argument.rb +25 -0
  36. data/lib/bson/error/invalid_decimal128_range.rb +27 -0
  37. data/lib/bson/error/invalid_decimal128_string.rb +26 -0
  38. data/lib/bson/error/invalid_key.rb +24 -0
  39. data/lib/bson/error/invalid_object_id.rb +11 -0
  40. data/lib/bson/error/invalid_regexp_pattern.rb +13 -0
  41. data/lib/bson/error/unrepresentable_precision.rb +19 -0
  42. data/lib/bson/error/unserializable_class.rb +13 -0
  43. data/lib/bson/error/unsupported_binary_subtype.rb +12 -0
  44. data/lib/bson/error/unsupported_type.rb +11 -0
  45. data/lib/bson/error.rb +22 -0
  46. data/lib/bson/ext_json.rb +389 -0
  47. data/lib/bson/false_class.rb +6 -4
  48. data/lib/bson/float.rb +43 -7
  49. data/lib/bson/hash.rb +152 -37
  50. data/lib/bson/int32.rb +104 -6
  51. data/lib/bson/int64.rb +111 -8
  52. data/lib/bson/integer.rb +43 -9
  53. data/lib/bson/json.rb +3 -1
  54. data/lib/bson/max_key.rb +21 -10
  55. data/lib/bson/min_key.rb +21 -10
  56. data/lib/bson/nil_class.rb +7 -3
  57. data/lib/bson/object.rb +25 -17
  58. data/lib/bson/object_id.rb +98 -113
  59. data/lib/bson/open_struct.rb +59 -0
  60. data/lib/bson/regexp.rb +129 -56
  61. data/lib/bson/registry.rb +7 -10
  62. data/lib/bson/specialized.rb +8 -4
  63. data/lib/bson/string.rb +12 -32
  64. data/lib/bson/symbol.rb +107 -11
  65. data/lib/bson/time.rb +68 -7
  66. data/lib/bson/time_with_zone.rb +67 -0
  67. data/lib/bson/timestamp.rb +50 -10
  68. data/lib/bson/true_class.rb +6 -4
  69. data/lib/bson/undefined.rb +28 -2
  70. data/lib/bson/vector.rb +44 -0
  71. data/lib/bson/version.rb +6 -14
  72. data/lib/bson.rb +22 -12
  73. data/spec/README.md +14 -0
  74. data/spec/bson/array_spec.rb +38 -62
  75. data/spec/bson/big_decimal_spec.rb +328 -0
  76. data/spec/bson/binary_spec.rb +199 -53
  77. data/spec/bson/binary_uuid_spec.rb +190 -0
  78. data/spec/bson/boolean_spec.rb +2 -1
  79. data/spec/bson/byte_buffer_read_spec.rb +198 -0
  80. data/spec/bson/byte_buffer_spec.rb +122 -381
  81. data/spec/bson/byte_buffer_write_spec.rb +855 -0
  82. data/spec/bson/code_spec.rb +6 -4
  83. data/spec/bson/code_with_scope_spec.rb +6 -4
  84. data/spec/bson/config_spec.rb +1 -35
  85. data/spec/bson/date_spec.rb +2 -1
  86. data/spec/bson/date_time_spec.rb +55 -1
  87. data/spec/bson/dbref_legacy_spec.rb +186 -0
  88. data/spec/bson/dbref_spec.rb +487 -0
  89. data/spec/bson/decimal128_spec.rb +1840 -0
  90. data/spec/bson/document_as_spec.rb +61 -0
  91. data/spec/bson/document_spec.rb +205 -32
  92. data/spec/bson/ext_json_parse_spec.rb +346 -0
  93. data/spec/bson/false_class_spec.rb +9 -1
  94. data/spec/bson/float_spec.rb +42 -1
  95. data/spec/bson/hash_as_spec.rb +58 -0
  96. data/spec/bson/hash_spec.rb +318 -66
  97. data/spec/bson/int32_spec.rb +248 -1
  98. data/spec/bson/int64_spec.rb +308 -1
  99. data/spec/bson/integer_spec.rb +61 -3
  100. data/spec/bson/json_spec.rb +2 -1
  101. data/spec/bson/max_key_spec.rb +6 -4
  102. data/spec/bson/min_key_spec.rb +6 -4
  103. data/spec/bson/nil_class_spec.rb +2 -1
  104. data/spec/bson/object_id_spec.rb +95 -5
  105. data/spec/bson/object_spec.rb +3 -2
  106. data/spec/bson/open_struct_spec.rb +87 -0
  107. data/spec/bson/raw_spec.rb +594 -0
  108. data/spec/bson/regexp_spec.rb +61 -8
  109. data/spec/bson/registry_spec.rb +3 -2
  110. data/spec/bson/string_spec.rb +26 -33
  111. data/spec/bson/symbol_raw_spec.rb +70 -0
  112. data/spec/bson/symbol_spec.rb +77 -20
  113. data/spec/bson/time_spec.rb +206 -2
  114. data/spec/bson/time_with_zone_spec.rb +69 -0
  115. data/spec/bson/timestamp_spec.rb +58 -2
  116. data/spec/bson/true_class_spec.rb +9 -1
  117. data/spec/bson/undefined_spec.rb +28 -1
  118. data/spec/bson/vector_spec.rb +33 -0
  119. data/spec/bson_spec.rb +2 -1
  120. data/spec/runners/binary_vector.rb +78 -0
  121. data/spec/runners/common_driver.rb +348 -0
  122. data/spec/runners/corpus.rb +191 -0
  123. data/spec/runners/corpus_legacy.rb +248 -0
  124. data/spec/shared/LICENSE +20 -0
  125. data/spec/shared/bin/get-mongodb-download-url +17 -0
  126. data/spec/shared/bin/s3-copy +45 -0
  127. data/spec/shared/bin/s3-upload +69 -0
  128. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  129. data/spec/shared/lib/mrss/cluster_config.rb +231 -0
  130. data/spec/shared/lib/mrss/constraints.rb +378 -0
  131. data/spec/shared/lib/mrss/docker_runner.rb +298 -0
  132. data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
  133. data/spec/shared/lib/mrss/event_subscriber.rb +210 -0
  134. data/spec/shared/lib/mrss/lite_constraints.rb +238 -0
  135. data/spec/shared/lib/mrss/release/candidate.rb +281 -0
  136. data/spec/shared/lib/mrss/release/product_data.rb +144 -0
  137. data/spec/shared/lib/mrss/server_version_registry.rb +113 -0
  138. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  139. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  140. data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
  141. data/spec/shared/lib/mrss/utils.rb +37 -0
  142. data/spec/shared/lib/tasks/candidate.rake +64 -0
  143. data/spec/shared/share/Dockerfile.erb +251 -0
  144. data/spec/shared/share/haproxy-1.conf +16 -0
  145. data/spec/shared/share/haproxy-2.conf +17 -0
  146. data/spec/shared/shlib/config.sh +27 -0
  147. data/spec/shared/shlib/distro.sh +84 -0
  148. data/spec/shared/shlib/server.sh +423 -0
  149. data/spec/shared/shlib/set_env.sh +110 -0
  150. data/spec/spec_helper.rb +61 -1
  151. data/spec/spec_tests/binary_vector_spec.rb +82 -0
  152. data/spec/spec_tests/common_driver_spec.rb +84 -0
  153. data/spec/spec_tests/corpus_legacy_spec.rb +72 -0
  154. data/spec/spec_tests/corpus_spec.rb +134 -0
  155. data/spec/spec_tests/data/binary_vector/README.md +61 -0
  156. data/spec/spec_tests/data/binary_vector/float32.json +65 -0
  157. data/spec/spec_tests/data/binary_vector/int8.json +57 -0
  158. data/spec/spec_tests/data/binary_vector/packed_bit.json +83 -0
  159. data/spec/spec_tests/data/corpus/README.md +15 -0
  160. data/spec/spec_tests/data/corpus/array.json +49 -0
  161. data/spec/spec_tests/data/corpus/binary.json +153 -0
  162. data/spec/spec_tests/data/corpus/boolean.json +27 -0
  163. data/spec/spec_tests/data/corpus/code.json +67 -0
  164. data/spec/spec_tests/data/corpus/code_w_scope.json +78 -0
  165. data/spec/spec_tests/data/corpus/datetime.json +42 -0
  166. data/spec/spec_tests/data/corpus/dbpointer.json +56 -0
  167. data/spec/spec_tests/data/corpus/dbref.json +51 -0
  168. data/spec/spec_tests/data/corpus/decimal128-1.json +317 -0
  169. data/spec/spec_tests/data/corpus/decimal128-2.json +793 -0
  170. data/spec/spec_tests/data/corpus/decimal128-3.json +1771 -0
  171. data/spec/spec_tests/data/corpus/decimal128-4.json +165 -0
  172. data/spec/spec_tests/data/corpus/decimal128-5.json +402 -0
  173. data/spec/spec_tests/data/corpus/decimal128-6.json +131 -0
  174. data/spec/spec_tests/data/corpus/decimal128-7.json +327 -0
  175. data/spec/spec_tests/data/corpus/document.json +60 -0
  176. data/spec/spec_tests/data/corpus/double.json +87 -0
  177. data/spec/spec_tests/data/corpus/int32.json +43 -0
  178. data/spec/spec_tests/data/corpus/int64.json +43 -0
  179. data/spec/spec_tests/data/corpus/maxkey.json +12 -0
  180. data/spec/spec_tests/data/corpus/minkey.json +12 -0
  181. data/spec/spec_tests/data/corpus/multi-type-deprecated.json +15 -0
  182. data/spec/spec_tests/data/corpus/multi-type.json +11 -0
  183. data/spec/spec_tests/data/corpus/null.json +12 -0
  184. data/spec/spec_tests/data/corpus/oid.json +28 -0
  185. data/spec/spec_tests/data/corpus/regex.json +65 -0
  186. data/spec/spec_tests/data/corpus/string.json +72 -0
  187. data/spec/spec_tests/data/corpus/symbol.json +80 -0
  188. data/spec/spec_tests/data/corpus/timestamp.json +34 -0
  189. data/spec/spec_tests/data/corpus/top.json +262 -0
  190. data/spec/spec_tests/data/corpus/undefined.json +15 -0
  191. data/spec/spec_tests/data/corpus_legacy/array.json +49 -0
  192. data/spec/spec_tests/data/corpus_legacy/binary.json +69 -0
  193. data/spec/spec_tests/data/corpus_legacy/boolean.json +27 -0
  194. data/spec/spec_tests/data/corpus_legacy/code.json +67 -0
  195. data/spec/spec_tests/data/corpus_legacy/code_w_scope.json +78 -0
  196. data/spec/spec_tests/data/corpus_legacy/document.json +36 -0
  197. data/spec/spec_tests/data/corpus_legacy/double.json +69 -0
  198. data/spec/spec_tests/data/corpus_legacy/failures/datetime.json +31 -0
  199. data/spec/spec_tests/data/corpus_legacy/failures/dbpointer.json +42 -0
  200. data/spec/spec_tests/data/corpus_legacy/failures/int64.json +38 -0
  201. data/spec/spec_tests/data/corpus_legacy/failures/symbol.json +62 -0
  202. data/spec/spec_tests/data/corpus_legacy/int32.json +38 -0
  203. data/spec/spec_tests/data/corpus_legacy/maxkey.json +12 -0
  204. data/spec/spec_tests/data/corpus_legacy/minkey.json +12 -0
  205. data/spec/spec_tests/data/corpus_legacy/null.json +12 -0
  206. data/spec/spec_tests/data/corpus_legacy/oid.json +28 -0
  207. data/spec/spec_tests/data/corpus_legacy/regex.json +37 -0
  208. data/spec/spec_tests/data/corpus_legacy/string.json +67 -0
  209. data/spec/spec_tests/data/corpus_legacy/timestamp.json +18 -0
  210. data/spec/spec_tests/data/corpus_legacy/top.json +62 -0
  211. data/spec/spec_tests/data/corpus_legacy/undefined.json +13 -0
  212. data/spec/spec_tests/data/decimal128/decimal128-1.json +363 -0
  213. data/spec/spec_tests/data/decimal128/decimal128-2.json +793 -0
  214. data/spec/spec_tests/data/decimal128/decimal128-3.json +1771 -0
  215. data/spec/spec_tests/data/decimal128/decimal128-4.json +165 -0
  216. data/spec/spec_tests/data/decimal128/decimal128-5.json +402 -0
  217. data/spec/spec_tests/data/decimal128/decimal128-6.json +131 -0
  218. data/spec/spec_tests/data/decimal128/decimal128-7.json +327 -0
  219. data/spec/support/shared_examples.rb +32 -11
  220. data/spec/support/spec_config.rb +17 -0
  221. data/spec/support/utils.rb +58 -0
  222. metadata +284 -45
  223. checksums.yaml.gz.sig +0 -3
  224. data/ext/bson/native.c +0 -722
  225. data.tar.gz.sig +0 -0
  226. metadata.gz.sig +0 -0
@@ -1,4 +1,5 @@
1
- # Copyright (C) 2009-2014 MongoDB Inc.
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 "#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,4 +1,5 @@
1
- # Copyright (C) 2009-2014 MongoDB Inc.
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 "#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,4 +1,5 @@
1
- # Copyright (C) 2009-2014 MongoDB Inc.
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.
@@ -1,4 +1,5 @@
1
- # Copyright (C) 2009-2014 MongoDB Inc.
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