mongoid 7.2.0.rc1 → 7.3.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 (214) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/Rakefile +45 -10
  5. data/lib/config/locales/en.yml +2 -2
  6. data/lib/mongoid/association/accessors.rb +1 -1
  7. data/lib/mongoid/association/constrainable.rb +1 -1
  8. data/lib/mongoid/association/depending.rb +4 -4
  9. data/lib/mongoid/association/embedded/batchable.rb +1 -1
  10. data/lib/mongoid/association/embedded/embedded_in.rb +1 -1
  11. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +10 -3
  12. data/lib/mongoid/association/nested/many.rb +1 -1
  13. data/lib/mongoid/association/nested/one.rb +4 -2
  14. data/lib/mongoid/association/proxy.rb +6 -1
  15. data/lib/mongoid/association/referenced/auto_save.rb +2 -2
  16. data/lib/mongoid/association/referenced/has_many/enumerable.rb +493 -495
  17. data/lib/mongoid/association/referenced/has_many/proxy.rb +2 -2
  18. data/lib/mongoid/association/referenced/has_one/buildable.rb +8 -0
  19. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +2 -2
  20. data/lib/mongoid/association/referenced/has_one/proxy.rb +6 -1
  21. data/lib/mongoid/attributes.rb +32 -14
  22. data/lib/mongoid/attributes/projector.rb +120 -0
  23. data/lib/mongoid/cacheable.rb +2 -2
  24. data/lib/mongoid/clients.rb +1 -1
  25. data/lib/mongoid/clients/factory.rb +22 -8
  26. data/lib/mongoid/config.rb +19 -2
  27. data/lib/mongoid/contextual/aggregable/mongo.rb +10 -8
  28. data/lib/mongoid/copyable.rb +6 -2
  29. data/lib/mongoid/criteria.rb +4 -5
  30. data/lib/mongoid/criteria/findable.rb +1 -1
  31. data/lib/mongoid/criteria/queryable/expandable.rb +0 -24
  32. data/lib/mongoid/criteria/queryable/extensions.rb +0 -4
  33. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +1 -1
  34. data/lib/mongoid/criteria/queryable/mergeable.rb +46 -20
  35. data/lib/mongoid/criteria/queryable/selectable.rb +8 -8
  36. data/lib/mongoid/criteria/queryable/selector.rb +0 -4
  37. data/lib/mongoid/document.rb +4 -17
  38. data/lib/mongoid/errors/delete_restriction.rb +8 -9
  39. data/lib/mongoid/evolvable.rb +1 -1
  40. data/lib/mongoid/extensions.rb +1 -0
  41. data/lib/mongoid/extensions/boolean.rb +1 -2
  42. data/lib/mongoid/extensions/false_class.rb +1 -1
  43. data/lib/mongoid/extensions/hash.rb +2 -2
  44. data/lib/mongoid/extensions/true_class.rb +1 -1
  45. data/lib/mongoid/fields.rb +46 -5
  46. data/lib/mongoid/inspectable.rb +1 -1
  47. data/lib/mongoid/interceptable.rb +3 -1
  48. data/lib/mongoid/matcher.rb +26 -43
  49. data/lib/mongoid/matcher/bits.rb +41 -0
  50. data/lib/mongoid/matcher/bits_all_clear.rb +20 -0
  51. data/lib/mongoid/matcher/bits_all_set.rb +20 -0
  52. data/lib/mongoid/matcher/bits_any_clear.rb +20 -0
  53. data/lib/mongoid/matcher/bits_any_set.rb +20 -0
  54. data/lib/mongoid/matcher/elem_match.rb +2 -1
  55. data/lib/mongoid/matcher/expression.rb +9 -14
  56. data/lib/mongoid/matcher/field_expression.rb +4 -5
  57. data/lib/mongoid/matcher/field_operator.rb +13 -11
  58. data/lib/mongoid/matcher/mod.rb +17 -0
  59. data/lib/mongoid/matcher/type.rb +99 -0
  60. data/lib/mongoid/persistable/deletable.rb +1 -2
  61. data/lib/mongoid/persistable/destroyable.rb +8 -2
  62. data/lib/mongoid/persistable/updatable.rb +27 -2
  63. data/lib/mongoid/query_cache.rb +35 -29
  64. data/lib/mongoid/reloadable.rb +5 -0
  65. data/lib/mongoid/selectable.rb +5 -7
  66. data/lib/mongoid/shardable.rb +21 -5
  67. data/lib/mongoid/stringified_symbol.rb +53 -0
  68. data/lib/mongoid/touchable.rb +23 -4
  69. data/lib/mongoid/version.rb +1 -1
  70. data/lib/rails/generators/mongoid/config/config_generator.rb +8 -1
  71. data/spec/README.md +19 -4
  72. data/spec/integration/app_spec.rb +175 -88
  73. data/spec/integration/associations/embeds_many_spec.rb +68 -0
  74. data/spec/integration/associations/embeds_one_spec.rb +24 -0
  75. data/spec/integration/associations/has_many_spec.rb +60 -0
  76. data/spec/integration/associations/has_one_spec.rb +108 -0
  77. data/spec/integration/callbacks_models.rb +49 -0
  78. data/spec/integration/callbacks_spec.rb +216 -0
  79. data/spec/integration/criteria/date_field_spec.rb +1 -1
  80. data/spec/integration/document_spec.rb +30 -0
  81. data/spec/integration/matcher_operator_data/bits_all_clear.yml +159 -0
  82. data/spec/integration/matcher_operator_data/bits_all_set.yml +159 -0
  83. data/spec/integration/matcher_operator_data/bits_any_clear.yml +159 -0
  84. data/spec/integration/matcher_operator_data/bits_any_set.yml +159 -0
  85. data/spec/integration/matcher_operator_data/comment.yml +22 -0
  86. data/spec/integration/matcher_operator_data/elem_match.yml +46 -0
  87. data/spec/integration/matcher_operator_data/gt_types.yml +63 -0
  88. data/spec/integration/matcher_operator_data/gte_types.yml +15 -0
  89. data/spec/integration/matcher_operator_data/implicit_traversal.yml +96 -0
  90. data/spec/integration/matcher_operator_data/in.yml +16 -0
  91. data/spec/integration/matcher_operator_data/lt_types.yml +15 -0
  92. data/spec/integration/matcher_operator_data/lte_types.yml +15 -0
  93. data/spec/integration/matcher_operator_data/mod.yml +55 -0
  94. data/spec/integration/matcher_operator_data/ne_types.yml +15 -0
  95. data/spec/integration/matcher_operator_data/type.yml +70 -0
  96. data/spec/integration/matcher_operator_data/type_array.yml +16 -0
  97. data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
  98. data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
  99. data/spec/integration/matcher_operator_data/type_code.yml +26 -0
  100. data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
  101. data/spec/integration/matcher_operator_data/type_date.yml +39 -0
  102. data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
  103. data/spec/integration/matcher_operator_data/type_decimal.yml +40 -0
  104. data/spec/integration/matcher_operator_data/type_double.yml +15 -0
  105. data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
  106. data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
  107. data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
  108. data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
  109. data/spec/integration/matcher_operator_data/type_null.yml +23 -0
  110. data/spec/integration/matcher_operator_data/type_object.yml +23 -0
  111. data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
  112. data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
  113. data/spec/integration/matcher_operator_data/type_string.yml +15 -0
  114. data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
  115. data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
  116. data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
  117. data/spec/integration/stringified_symbol_field_spec.rb +190 -0
  118. data/spec/lite_spec_helper.rb +9 -7
  119. data/spec/mongoid/association/depending_spec.rb +391 -352
  120. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +50 -0
  121. data/spec/mongoid/association/nested/one_spec.rb +18 -14
  122. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +25 -8
  123. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +1 -1
  124. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +1 -1
  125. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +1 -1
  126. data/spec/mongoid/association/referenced/has_many_models.rb +12 -0
  127. data/spec/mongoid/association/referenced/has_one_models.rb +20 -0
  128. data/spec/mongoid/association/referenced/has_one_spec.rb +1 -1
  129. data/spec/mongoid/atomic/paths_spec.rb +105 -12
  130. data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
  131. data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
  132. data/spec/mongoid/attributes/projector_spec.rb +41 -0
  133. data/spec/mongoid/attributes_spec.rb +333 -0
  134. data/spec/mongoid/clients/factory_spec.rb +48 -0
  135. data/spec/mongoid/config_spec.rb +32 -0
  136. data/spec/mongoid/contextual/atomic_spec.rb +17 -4
  137. data/spec/mongoid/contextual/mongo_spec.rb +2 -2
  138. data/spec/mongoid/copyable_spec.rb +44 -17
  139. data/spec/mongoid/copyable_spec_models.rb +14 -0
  140. data/spec/mongoid/criteria/modifiable_spec.rb +1 -1
  141. data/spec/mongoid/criteria/queryable/expandable_spec.rb +0 -73
  142. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +1 -1
  143. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +105 -7
  144. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +265 -24
  145. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +39 -0
  146. data/spec/mongoid/criteria/queryable/selectable_spec.rb +1 -565
  147. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +590 -0
  148. data/spec/mongoid/criteria_projection_spec.rb +411 -0
  149. data/spec/mongoid/criteria_spec.rb +0 -275
  150. data/spec/mongoid/document_fields_spec.rb +26 -0
  151. data/spec/mongoid/document_spec.rb +13 -13
  152. data/spec/mongoid/equality_spec.rb +0 -1
  153. data/spec/mongoid/errors/delete_restriction_spec.rb +1 -1
  154. data/spec/mongoid/extensions/false_class_spec.rb +1 -1
  155. data/spec/mongoid/extensions/string_spec.rb +5 -5
  156. data/spec/mongoid/extensions/stringified_symbol_spec.rb +85 -0
  157. data/spec/mongoid/extensions/true_class_spec.rb +1 -1
  158. data/spec/mongoid/fields/localized_spec.rb +4 -4
  159. data/spec/mongoid/fields_spec.rb +4 -4
  160. data/spec/mongoid/inspectable_spec.rb +12 -4
  161. data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
  162. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +68 -88
  163. data/spec/mongoid/matcher/extract_attribute_spec.rb +3 -13
  164. data/spec/mongoid/persistable/deletable_spec.rb +175 -1
  165. data/spec/mongoid/persistable/destroyable_spec.rb +191 -3
  166. data/spec/mongoid/persistable/savable_spec.rb +3 -5
  167. data/spec/mongoid/persistable/settable_spec.rb +30 -0
  168. data/spec/mongoid/persistable/upsertable_spec.rb +1 -1
  169. data/spec/mongoid/query_cache_middleware_spec.rb +8 -0
  170. data/spec/mongoid/reloadable_spec.rb +18 -1
  171. data/spec/mongoid/shardable_spec.rb +44 -0
  172. data/spec/mongoid/touchable_spec.rb +104 -16
  173. data/spec/mongoid/touchable_spec_models.rb +52 -0
  174. data/spec/mongoid/validatable_spec.rb +1 -1
  175. data/spec/shared/LICENSE +20 -0
  176. data/spec/shared/bin/get-mongodb-download-url +17 -0
  177. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  178. data/spec/shared/lib/mrss/cluster_config.rb +221 -0
  179. data/spec/shared/lib/mrss/constraints.rb +354 -0
  180. data/spec/shared/lib/mrss/docker_runner.rb +265 -0
  181. data/spec/shared/lib/mrss/lite_constraints.rb +191 -0
  182. data/spec/shared/lib/mrss/server_version_registry.rb +115 -0
  183. data/spec/shared/lib/mrss/spec_organizer.rb +162 -0
  184. data/spec/shared/lib/mrss/utils.rb +15 -0
  185. data/spec/shared/share/Dockerfile.erb +231 -0
  186. data/spec/shared/shlib/distro.sh +73 -0
  187. data/spec/shared/shlib/server.sh +290 -0
  188. data/spec/shared/shlib/set_env.sh +128 -0
  189. data/spec/spec_helper.rb +7 -1
  190. data/spec/support/client_registry.rb +9 -0
  191. data/spec/support/constraints.rb +0 -226
  192. data/spec/support/models/bolt.rb +8 -0
  193. data/spec/support/models/customer.rb +11 -0
  194. data/spec/support/models/customer_address.rb +12 -0
  195. data/spec/support/models/dictionary.rb +6 -0
  196. data/spec/support/models/hole.rb +13 -0
  197. data/spec/support/models/mop.rb +9 -0
  198. data/spec/support/models/nut.rb +8 -0
  199. data/spec/support/models/order.rb +11 -0
  200. data/spec/support/models/person.rb +8 -0
  201. data/spec/support/models/sealer.rb +8 -0
  202. data/spec/support/models/series.rb +1 -0
  203. data/spec/support/models/shirt.rb +12 -0
  204. data/spec/support/models/spacer.rb +8 -0
  205. data/spec/support/models/threadlocker.rb +8 -0
  206. data/spec/support/models/washer.rb +8 -0
  207. data/spec/support/models/wiki_page.rb +1 -0
  208. data/spec/support/spec_config.rb +8 -0
  209. metadata +655 -507
  210. metadata.gz.sig +0 -0
  211. data/spec/support/child_process_helper.rb +0 -79
  212. data/spec/support/cluster_config.rb +0 -158
  213. data/spec/support/lite_constraints.rb +0 -22
  214. data/spec/support/spec_organizer.rb +0 -130
@@ -0,0 +1,33 @@
1
+ - name: bson int64 - matches
2
+ document:
3
+ number: !ruby/object:BSON::Int64
4
+ value: 392141
5
+ query:
6
+ number:
7
+ $type: 18
8
+ matches: true
9
+
10
+ - name: small integer - does not match
11
+ document:
12
+ pi: 3
13
+ query:
14
+ pi:
15
+ $type: 18
16
+ matches: false
17
+
18
+ - name: big integer - matches
19
+ document:
20
+ # Exactly 2**32
21
+ pi: 4294967296
22
+ query:
23
+ pi:
24
+ $type: 18
25
+ matches: true
26
+
27
+ - name: existing field - does not match long
28
+ document:
29
+ name: "foo"
30
+ query:
31
+ name:
32
+ $type: 18
33
+ matches: false
@@ -0,0 +1,17 @@
1
+ - name: existing field - matches MaxKey
2
+ document:
3
+ pi: !ruby/object:BSON::MaxKey
4
+ # dummy field so MaxKey gets constructed
5
+ test: 42
6
+ query:
7
+ pi:
8
+ $type: 127
9
+ matches: true
10
+
11
+ - name: existing field - does not match MaxKey
12
+ document:
13
+ pi: 3
14
+ query:
15
+ pi:
16
+ $type: 127
17
+ matches: false
@@ -0,0 +1,17 @@
1
+ - name: existing field - matches MinKey
2
+ document:
3
+ pi: !ruby/object:BSON::MinKey
4
+ # dummy field so MinKey gets constructed
5
+ test: 42
6
+ query:
7
+ pi:
8
+ $type: -1
9
+ matches: true
10
+
11
+ - name: existing field - does not match MinKey
12
+ document:
13
+ pi: 3
14
+ query:
15
+ pi:
16
+ $type: -1
17
+ matches: false
@@ -0,0 +1,23 @@
1
+ - name: existing field - matches
2
+ document:
3
+ name:
4
+ query:
5
+ name:
6
+ $type: 10
7
+ matches: true
8
+
9
+ - name: missing field - does not match
10
+ document:
11
+ x:
12
+ query:
13
+ name:
14
+ $type: 10
15
+ matches: false
16
+
17
+ - name: existing field - does not match
18
+ document:
19
+ pi: 3
20
+ query:
21
+ pi:
22
+ $type: 10
23
+ matches: false
@@ -0,0 +1,23 @@
1
+ - name: hash value - matches
2
+ document:
3
+ name: {first_name: "bob"}
4
+ query:
5
+ name:
6
+ $type: 3
7
+ matches: true
8
+
9
+ - name: array value - does not match
10
+ document:
11
+ name: [1]
12
+ query:
13
+ name:
14
+ $type: 3
15
+ matches: false
16
+
17
+ - name: existing field - does not match Object
18
+ document:
19
+ pi: 3
20
+ query:
21
+ pi:
22
+ $type: 3
23
+ matches: false
@@ -0,0 +1,25 @@
1
+ - name: existing field - matches ObjectId
2
+ document:
3
+ new_id: !ruby/object:BSON::ObjectId
4
+ raw_data: !binary |-
5
+ Xt0Zj+G4MlyV5hyJ
6
+ query:
7
+ new_id:
8
+ $type: 7
9
+ matches: true
10
+
11
+ - name: integer - does not match
12
+ document:
13
+ pi: 3
14
+ query:
15
+ pi:
16
+ $type: 7
17
+ matches: false
18
+
19
+ - name: string - does not match
20
+ document:
21
+ pi: hello
22
+ query:
23
+ pi:
24
+ $type: 7
25
+ matches: false
@@ -0,0 +1,44 @@
1
+ - name: bson regexp in untyped field - matches
2
+ document:
3
+ name: !ruby/object:BSON::Regexp::Raw
4
+ pattern: /test/
5
+ options: ''
6
+ query:
7
+ name:
8
+ $type: 11
9
+ matches: true
10
+
11
+ - name: ruby regexp in untyped field - matches
12
+ document:
13
+ name: /test/
14
+ query:
15
+ name:
16
+ $type: 11
17
+ # Regexp is serialized as a string
18
+ matches: false
19
+
20
+ - name: ruby regexp field - matches
21
+ document:
22
+ regexp_field: /test/
23
+ query:
24
+ regexp_field:
25
+ $type: 11
26
+ matches: true
27
+
28
+ - name: bson regexp field - matches
29
+ document:
30
+ bson_regexp_field: !ruby/object:BSON::Regexp::Raw
31
+ pattern: /test/
32
+ options: ''
33
+ query:
34
+ bson_regexp_field:
35
+ $type: 11
36
+ matches: true
37
+
38
+ - name: existing field - does not match regex
39
+ document:
40
+ pi: 3
41
+ query:
42
+ pi:
43
+ $type: 11
44
+ matches: false
@@ -0,0 +1,15 @@
1
+ - name: existing field - matches string
2
+ document:
3
+ name: bob
4
+ query:
5
+ name:
6
+ $type: 2
7
+ matches: true
8
+
9
+ - name: existing field - does not match string
10
+ document:
11
+ pi: 3
12
+ query:
13
+ pi:
14
+ $type: 2
15
+ matches: false
@@ -0,0 +1,32 @@
1
+ - name: symbol in untyped field - matches
2
+ document:
3
+ name: :hello
4
+ query:
5
+ name:
6
+ $type: 14
7
+ matches: true
8
+
9
+ - name: symbol field - matches
10
+ document:
11
+ symbol_field: :hello
12
+ query:
13
+ symbol_field:
14
+ $type: 14
15
+ matches: true
16
+
17
+ - name: bson symbol - matches
18
+ document:
19
+ bson_symbol_field: !ruby/object:BSON::Symbol::Raw
20
+ symbol: hello
21
+ query:
22
+ bson_symbol_field:
23
+ $type: 14
24
+ matches: true
25
+
26
+ - name: string field - does not match
27
+ document:
28
+ pi: hello
29
+ query:
30
+ pi:
31
+ $type: 14
32
+ matches: false
@@ -0,0 +1,25 @@
1
+ - name: existing field - matches timestamp
2
+ document:
3
+ time: !ruby/object:BSON::Timestamp
4
+ seconds: 4
5
+ increment: 2
6
+ query:
7
+ time:
8
+ $type: 17
9
+ matches: true
10
+
11
+ - name: existing field - does not match timestamp
12
+ document:
13
+ name: 3
14
+ query:
15
+ name:
16
+ $type: 17
17
+ matches: false
18
+
19
+ - name: Ruby Time instance - does not match
20
+ document:
21
+ time_field: 2020-11-19 00:00:00
22
+ query:
23
+ time_field:
24
+ $type: 17
25
+ matches: false
@@ -0,0 +1,17 @@
1
+ - name: existing field - matches undefined
2
+ document:
3
+ price: !ruby/object:BSON::Undefined
4
+ # dummy field so Undefined gets constructed
5
+ test: 42
6
+ query:
7
+ price:
8
+ $type: 6
9
+ matches: true
10
+
11
+ - name: existing field - does not match undefined
12
+ document:
13
+ pi: 3
14
+ query:
15
+ pi:
16
+ $type: 6
17
+ matches: false
@@ -0,0 +1,190 @@
1
+ require "spec_helper"
2
+
3
+ describe "StringifiedSymbol fields" do
4
+
5
+ before do
6
+ Order.destroy_all
7
+ end
8
+
9
+ context "when querying the database" do
10
+
11
+ let!(:document) do
12
+ Order.create!(saved_status: :test)
13
+ end
14
+
15
+ let(:string_query) do
16
+ {'saved_status' => {'$eq' => 'test'}}
17
+ end
18
+
19
+ let(:symbol_query) do
20
+ {'saved_status' => {'$eq' => :test}}
21
+ end
22
+
23
+ it "can be queried with a string" do
24
+ doc = Order.where(string_query).first
25
+ expect(doc.saved_status).to eq(:test)
26
+ end
27
+
28
+ it "can be queried with a symbol" do
29
+ doc = Order.where(symbol_query).first
30
+ expect(doc.saved_status).to eq(:test)
31
+ end
32
+ end
33
+
34
+ # Using command monitoring to test that StringifiedSymbol sends a string and returns a symbol
35
+ let(:client) { Order.collection.client }
36
+
37
+ before do
38
+ client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
39
+ end
40
+
41
+ after do
42
+ client.unsubscribe(Mongo::Monitoring::COMMAND, subscriber)
43
+ end
44
+
45
+ let(:subscriber) do
46
+ EventSubscriber.new
47
+ end
48
+
49
+ let(:find_events) do
50
+ subscriber.started_events.select { |event| event.command_name.to_s == 'find' }
51
+ end
52
+
53
+ let(:insert_events) do
54
+ subscriber.started_events.select { |event| event.command_name.to_s == 'insert' }
55
+ end
56
+
57
+ let(:update_events) do
58
+ subscriber.started_events.select { |event| event.command_name.to_s == 'update' }
59
+ end
60
+
61
+ before do
62
+ subscriber.clear_events!
63
+ end
64
+
65
+ let(:query) do
66
+ {'saved_status' => {'$eq' => 'test'}}
67
+ end
68
+
69
+ let!(:document1) do
70
+ Order.create!(saved_status: :test)
71
+ end
72
+
73
+ let!(:document2) do
74
+ Order.where(query).first
75
+ end
76
+
77
+ context "when inserting document" do
78
+
79
+ it "sends the value as a string" do
80
+ Order.create!(saved_status: :test)
81
+ event = insert_events.first
82
+ doc = event.command["documents"].first
83
+ expect(doc["saved_status"]).to eq("test")
84
+ end
85
+
86
+ it "sends the value as a string" do
87
+ Order.create!(saved_status: 42)
88
+ event = insert_events.second
89
+ doc = event.command["documents"].first
90
+ expect(doc["saved_status"]).to eq("42")
91
+ end
92
+
93
+ it "sends the value as a string" do
94
+ Order.create(saved_status: [0, 1, 2])
95
+ event = insert_events.second
96
+ doc = event.command["documents"].first
97
+ expect(doc["saved_status"]).to eq("[0, 1, 2]")
98
+ end
99
+ end
100
+
101
+ context "when finding document" do
102
+
103
+ it "receives the value as a symbol" do
104
+ event = find_events.first
105
+ expect(document2.saved_status).to eq(:test)
106
+ end
107
+ end
108
+
109
+ context "when reading a BSON Symbol field" do
110
+
111
+ before do
112
+ client["orders"].insert_one(saved_status: BSON::Symbol::Raw.new("test"), _id: 12)
113
+ end
114
+
115
+ it "receives the value as a symbol" do
116
+ expect(Order.find(12).saved_status).to eq(:test)
117
+ end
118
+
119
+ it "saves the value as a string" do
120
+ s = Order.find(12)
121
+ s.saved_status = :other
122
+ s.save!
123
+ event = update_events.first
124
+ expect(event.command["updates"].first["u"]["$set"]["saved_status"]).to eq("other")
125
+ end
126
+ end
127
+
128
+ context "when value is nil" do
129
+
130
+ before do
131
+ client["orders"].insert_one(saved_status: nil, _id: 15)
132
+ end
133
+
134
+ it "returns nil" do
135
+ expect(Order.find(15).saved_status).to be_nil
136
+ end
137
+ end
138
+
139
+ context "when writing nil" do
140
+
141
+ before do
142
+ client["orders"].insert_one(saved_status: "hello", _id: 16)
143
+ end
144
+
145
+ it "saves the value as nil" do
146
+ s = Order.find(16)
147
+ s.saved_status = nil
148
+ s.save!
149
+ event = update_events.first
150
+ expect(event.command["updates"].first["u"]["$set"]["saved_status"]).to be_nil
151
+ end
152
+ end
153
+
154
+ context "when reading an integer" do
155
+
156
+ before do
157
+ client["orders"].insert_one(saved_status: 42, _id: 13)
158
+ end
159
+
160
+ it "receives the value as a symbol" do
161
+ expect(Order.find(13).saved_status).to eq(:"42")
162
+ end
163
+
164
+ it "saves the value as a string" do
165
+ s = Order.find(13)
166
+ s.saved_status = 24
167
+ s.save!
168
+ event = update_events.first
169
+ expect(event.command["updates"].first["u"]["$set"]["saved_status"]).to eq("24")
170
+ end
171
+ end
172
+
173
+ context "when reading an array" do
174
+ before do
175
+ client["orders"].insert_one(saved_status: [0, 1, 2], _id: 14)
176
+ end
177
+
178
+ it "receives the value as a symbol" do
179
+ expect(Order.find(14).saved_status).to be(:"[0, 1, 2]")
180
+ end
181
+
182
+ it "saves the value as a string" do
183
+ s = Order.find(14)
184
+ s.saved_status = [3, 4, 5]
185
+ s.save!
186
+ event = update_events.first
187
+ expect(event.command["updates"].first["u"]["$set"]["saved_status"]).to eq("[3, 4, 5]")
188
+ end
189
+ end
190
+ end