mongoid 5.4.0 → 6.4.8

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 (301) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +3 -3
  4. data/Rakefile +26 -0
  5. data/lib/config/locales/en.yml +40 -0
  6. data/lib/mongoid/atomic/modifiers.rb +2 -2
  7. data/lib/mongoid/atomic.rb +5 -5
  8. data/lib/mongoid/attributes/readonly.rb +22 -0
  9. data/lib/mongoid/attributes.rb +22 -21
  10. data/lib/mongoid/cacheable.rb +36 -0
  11. data/lib/mongoid/changeable.rb +36 -0
  12. data/lib/mongoid/clients/options.rb +55 -250
  13. data/lib/mongoid/clients/sessions.rb +113 -0
  14. data/lib/mongoid/clients/storage_options.rb +2 -69
  15. data/lib/mongoid/clients.rb +10 -63
  16. data/lib/mongoid/composable.rb +29 -2
  17. data/lib/mongoid/config.rb +1 -0
  18. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
  19. data/lib/mongoid/contextual/atomic.rb +4 -4
  20. data/lib/mongoid/contextual/map_reduce.rb +7 -3
  21. data/lib/mongoid/contextual/memory.rb +9 -4
  22. data/lib/mongoid/contextual/mongo.rb +65 -30
  23. data/lib/mongoid/contextual/none.rb +12 -0
  24. data/lib/mongoid/copyable.rb +13 -6
  25. data/lib/mongoid/criteria/marshalable.rb +2 -2
  26. data/lib/mongoid/criteria/modifiable.rb +29 -3
  27. data/lib/mongoid/criteria/options.rb +25 -0
  28. data/lib/mongoid/criteria/queryable/aggregable.rb +120 -0
  29. data/lib/mongoid/criteria/queryable/extensions/array.rb +185 -0
  30. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +37 -0
  31. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +34 -0
  32. data/lib/mongoid/criteria/queryable/extensions/date.rb +63 -0
  33. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +53 -0
  34. data/lib/mongoid/criteria/queryable/extensions/hash.rb +200 -0
  35. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +86 -0
  36. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +90 -0
  37. data/lib/mongoid/criteria/queryable/extensions/object.rb +206 -0
  38. data/lib/mongoid/criteria/queryable/extensions/range.rb +70 -0
  39. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +79 -0
  40. data/lib/mongoid/criteria/queryable/extensions/set.rb +34 -0
  41. data/lib/mongoid/criteria/queryable/extensions/string.rb +137 -0
  42. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +79 -0
  43. data/lib/mongoid/criteria/queryable/extensions/time.rb +60 -0
  44. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +54 -0
  45. data/lib/mongoid/criteria/queryable/extensions.rb +28 -0
  46. data/lib/mongoid/criteria/queryable/forwardable.rb +65 -0
  47. data/lib/mongoid/criteria/queryable/key.rb +103 -0
  48. data/lib/mongoid/criteria/queryable/macroable.rb +27 -0
  49. data/lib/mongoid/criteria/queryable/mergeable.rb +273 -0
  50. data/lib/mongoid/criteria/queryable/optional.rb +429 -0
  51. data/lib/mongoid/criteria/queryable/options.rb +153 -0
  52. data/lib/mongoid/criteria/queryable/pipeline.rb +111 -0
  53. data/lib/mongoid/criteria/queryable/selectable.rb +689 -0
  54. data/lib/mongoid/criteria/queryable/selector.rb +212 -0
  55. data/lib/mongoid/criteria/queryable/smash.rb +104 -0
  56. data/lib/mongoid/criteria/queryable.rb +87 -0
  57. data/lib/mongoid/criteria.rb +6 -2
  58. data/lib/mongoid/document.rb +34 -41
  59. data/lib/mongoid/errors/ambiguous_relationship.rb +1 -1
  60. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -1
  61. data/lib/mongoid/errors/invalid_field.rb +2 -2
  62. data/lib/mongoid/errors/invalid_persistence_option.rb +29 -0
  63. data/lib/mongoid/errors/invalid_relation.rb +66 -0
  64. data/lib/mongoid/errors/invalid_session_use.rb +24 -0
  65. data/lib/mongoid/errors.rb +3 -0
  66. data/lib/mongoid/evolvable.rb +1 -1
  67. data/lib/mongoid/extensions/big_decimal.rb +17 -8
  68. data/lib/mongoid/extensions/date.rb +4 -1
  69. data/lib/mongoid/extensions/decimal128.rb +3 -3
  70. data/lib/mongoid/extensions/hash.rb +1 -0
  71. data/lib/mongoid/extensions/regexp.rb +1 -0
  72. data/lib/mongoid/extensions/string.rb +6 -3
  73. data/lib/mongoid/extensions/time.rb +4 -1
  74. data/lib/mongoid/extensions.rb +0 -4
  75. data/lib/mongoid/factory.rb +2 -1
  76. data/lib/mongoid/fields/validators/macro.rb +18 -0
  77. data/lib/mongoid/findable.rb +2 -2
  78. data/lib/mongoid/indexable.rb +16 -14
  79. data/lib/mongoid/interceptable.rb +9 -22
  80. data/lib/mongoid/matchable/all.rb +2 -2
  81. data/lib/mongoid/matchable/and.rb +3 -3
  82. data/lib/mongoid/matchable/default.rb +2 -2
  83. data/lib/mongoid/matchable/elem_match.rb +28 -0
  84. data/lib/mongoid/matchable/exists.rb +2 -2
  85. data/lib/mongoid/matchable/gt.rb +4 -2
  86. data/lib/mongoid/matchable/gte.rb +4 -2
  87. data/lib/mongoid/matchable/in.rb +2 -2
  88. data/lib/mongoid/matchable/lt.rb +4 -2
  89. data/lib/mongoid/matchable/lte.rb +4 -2
  90. data/lib/mongoid/matchable/ne.rb +2 -2
  91. data/lib/mongoid/matchable/nin.rb +2 -2
  92. data/lib/mongoid/matchable/nor.rb +37 -0
  93. data/lib/mongoid/matchable/or.rb +3 -3
  94. data/lib/mongoid/matchable/regexp.rb +3 -3
  95. data/lib/mongoid/matchable/size.rb +2 -2
  96. data/lib/mongoid/matchable.rb +16 -7
  97. data/lib/mongoid/persistable/creatable.rb +5 -3
  98. data/lib/mongoid/persistable/deletable.rb +5 -3
  99. data/lib/mongoid/persistable/destroyable.rb +1 -5
  100. data/lib/mongoid/persistable/settable.rb +5 -5
  101. data/lib/mongoid/persistable/updatable.rb +7 -14
  102. data/lib/mongoid/persistable/upsertable.rb +2 -1
  103. data/lib/mongoid/persistable.rb +4 -6
  104. data/lib/mongoid/persistence_context.rb +220 -0
  105. data/lib/mongoid/query_cache.rb +67 -23
  106. data/lib/mongoid/railtie.rb +17 -1
  107. data/lib/mongoid/railties/controller_runtime.rb +86 -0
  108. data/lib/mongoid/relations/accessors.rb +3 -0
  109. data/lib/mongoid/relations/auto_save.rb +12 -4
  110. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +4 -4
  111. data/lib/mongoid/relations/counter_cache.rb +15 -5
  112. data/lib/mongoid/relations/eager/base.rb +3 -3
  113. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +2 -2
  114. data/lib/mongoid/relations/eager/has_many.rb +1 -1
  115. data/lib/mongoid/relations/eager.rb +6 -11
  116. data/lib/mongoid/relations/embedded/batchable.rb +20 -18
  117. data/lib/mongoid/relations/embedded/in.rb +13 -1
  118. data/lib/mongoid/relations/embedded/many.rb +51 -10
  119. data/lib/mongoid/relations/embedded/one.rb +14 -1
  120. data/lib/mongoid/relations/macros.rb +9 -1
  121. data/lib/mongoid/relations/many.rb +4 -0
  122. data/lib/mongoid/relations/metadata.rb +3 -3
  123. data/lib/mongoid/relations/options.rb +2 -2
  124. data/lib/mongoid/relations/proxy.rb +1 -31
  125. data/lib/mongoid/relations/referenced/in.rb +19 -10
  126. data/lib/mongoid/relations/referenced/many.rb +30 -26
  127. data/lib/mongoid/relations/referenced/many_to_many.rb +20 -13
  128. data/lib/mongoid/relations/referenced/one.rb +15 -1
  129. data/lib/mongoid/relations/synchronization.rb +12 -12
  130. data/lib/mongoid/relations/targets/enumerable.rb +24 -4
  131. data/lib/mongoid/relations/touchable.rb +7 -4
  132. data/lib/mongoid/reloadable.rb +2 -2
  133. data/lib/mongoid/scopable.rb +3 -3
  134. data/lib/mongoid/serializable.rb +1 -1
  135. data/lib/mongoid/stateful.rb +1 -0
  136. data/lib/mongoid/tasks/database.rb +3 -2
  137. data/lib/mongoid/threaded.rb +74 -0
  138. data/lib/mongoid/traversable.rb +1 -1
  139. data/lib/mongoid/validatable/uniqueness.rb +1 -2
  140. data/lib/mongoid/version.rb +1 -1
  141. data/lib/mongoid.rb +6 -6
  142. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +18 -3
  143. data/spec/app/models/agent.rb +2 -0
  144. data/spec/app/models/album.rb +5 -1
  145. data/spec/app/models/array_field.rb +7 -0
  146. data/spec/app/models/artist.rb +21 -0
  147. data/spec/app/models/band.rb +3 -0
  148. data/spec/app/models/book.rb +2 -1
  149. data/spec/app/models/delegating_patient.rb +16 -0
  150. data/spec/app/models/dokument.rb +1 -0
  151. data/spec/app/models/ordered_post.rb +5 -0
  152. data/spec/app/models/oscar.rb +1 -2
  153. data/spec/app/models/page.rb +1 -1
  154. data/spec/app/models/person.rb +3 -3
  155. data/spec/app/models/princess.rb +2 -0
  156. data/spec/app/models/record.rb +1 -0
  157. data/spec/app/models/subscription.rb +1 -0
  158. data/spec/app/models/thing.rb +1 -1
  159. data/spec/config/mongoid.yml +15 -0
  160. data/spec/integration/document_spec.rb +22 -0
  161. data/spec/mongoid/atomic/modifiers_spec.rb +3 -3
  162. data/spec/mongoid/atomic_spec.rb +5 -5
  163. data/spec/mongoid/attributes/nested_spec.rb +18 -14
  164. data/spec/mongoid/attributes/readonly_spec.rb +87 -44
  165. data/spec/mongoid/attributes_spec.rb +90 -5
  166. data/spec/mongoid/cacheable_spec.rb +112 -0
  167. data/spec/mongoid/changeable_spec.rb +58 -0
  168. data/spec/mongoid/clients/factory_spec.rb +80 -28
  169. data/spec/mongoid/clients/options_spec.rb +396 -95
  170. data/spec/mongoid/clients/sessions_spec.rb +334 -0
  171. data/spec/mongoid/clients_spec.rb +243 -101
  172. data/spec/mongoid/composable_spec.rb +7 -0
  173. data/spec/mongoid/config_spec.rb +67 -11
  174. data/spec/mongoid/contextual/atomic_spec.rb +3 -3
  175. data/spec/mongoid/contextual/geo_near_spec.rb +1 -0
  176. data/spec/mongoid/contextual/mongo_spec.rb +275 -22
  177. data/spec/mongoid/contextual/none_spec.rb +15 -0
  178. data/spec/mongoid/copyable_spec.rb +13 -4
  179. data/spec/mongoid/criteria/modifiable_spec.rb +297 -16
  180. data/spec/mongoid/criteria/options_spec.rb +29 -0
  181. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +370 -0
  182. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +523 -0
  183. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +59 -0
  184. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +58 -0
  185. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +213 -0
  186. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +330 -0
  187. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +405 -0
  188. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +58 -0
  189. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +65 -0
  190. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +327 -0
  191. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +65 -0
  192. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +77 -0
  193. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +108 -0
  194. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +309 -0
  195. data/spec/mongoid/{extensions/origin → criteria/queryable/extensions}/regexp_raw_spec.rb +2 -2
  196. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +90 -0
  197. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +39 -0
  198. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +302 -0
  199. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +167 -0
  200. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +376 -0
  201. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +347 -0
  202. data/spec/mongoid/criteria/queryable/forwardable_spec.rb +87 -0
  203. data/spec/mongoid/criteria/queryable/key_spec.rb +52 -0
  204. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +49 -0
  205. data/spec/mongoid/criteria/queryable/optional_spec.rb +1799 -0
  206. data/spec/mongoid/criteria/queryable/options_spec.rb +360 -0
  207. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +200 -0
  208. data/spec/mongoid/criteria/queryable/queryable_spec.rb +137 -0
  209. data/spec/mongoid/criteria/queryable/selectable_spec.rb +4242 -0
  210. data/spec/mongoid/criteria/queryable/selector_spec.rb +844 -0
  211. data/spec/mongoid/criteria/queryable/smash_spec.rb +30 -0
  212. data/spec/mongoid/criteria/scopable_spec.rb +81 -0
  213. data/spec/mongoid/criteria_spec.rb +156 -22
  214. data/spec/mongoid/document_spec.rb +100 -90
  215. data/spec/mongoid/errors/invalid_relation_spec.rb +37 -0
  216. data/spec/mongoid/errors/mongoid_error_spec.rb +6 -3
  217. data/spec/mongoid/extensions/big_decimal_spec.rb +321 -19
  218. data/spec/mongoid/extensions/boolean_spec.rb +14 -0
  219. data/spec/mongoid/extensions/date_spec.rb +2 -6
  220. data/spec/mongoid/extensions/date_time_spec.rb +2 -6
  221. data/spec/mongoid/extensions/decimal128_spec.rb +1 -1
  222. data/spec/mongoid/extensions/float_spec.rb +8 -1
  223. data/spec/mongoid/extensions/hash_spec.rb +15 -0
  224. data/spec/mongoid/extensions/integer_spec.rb +8 -1
  225. data/spec/mongoid/extensions/object_spec.rb +11 -0
  226. data/spec/mongoid/extensions/regexp_spec.rb +23 -0
  227. data/spec/mongoid/extensions/string_spec.rb +53 -4
  228. data/spec/mongoid/extensions/time_spec.rb +2 -6
  229. data/spec/mongoid/extensions/time_with_zone_spec.rb +2 -6
  230. data/spec/mongoid/factory_spec.rb +11 -0
  231. data/spec/mongoid/fields_spec.rb +1 -1
  232. data/spec/mongoid/findable_spec.rb +47 -2
  233. data/spec/mongoid/indexable_spec.rb +15 -3
  234. data/spec/mongoid/interceptable_spec.rb +85 -19
  235. data/spec/mongoid/matchable/all_spec.rb +4 -4
  236. data/spec/mongoid/matchable/and_spec.rb +10 -10
  237. data/spec/mongoid/matchable/default_spec.rb +12 -12
  238. data/spec/mongoid/matchable/elem_match_spec.rb +86 -0
  239. data/spec/mongoid/matchable/exists_spec.rb +5 -5
  240. data/spec/mongoid/matchable/gt_spec.rb +18 -7
  241. data/spec/mongoid/matchable/gte_spec.rb +17 -7
  242. data/spec/mongoid/matchable/in_spec.rb +5 -5
  243. data/spec/mongoid/matchable/lt_spec.rb +18 -7
  244. data/spec/mongoid/matchable/lte_spec.rb +18 -7
  245. data/spec/mongoid/matchable/ne_spec.rb +5 -5
  246. data/spec/mongoid/matchable/nin_spec.rb +5 -5
  247. data/spec/mongoid/matchable/nor_spec.rb +209 -0
  248. data/spec/mongoid/matchable/or_spec.rb +7 -7
  249. data/spec/mongoid/matchable/regexp_spec.rb +5 -5
  250. data/spec/mongoid/matchable/size_spec.rb +3 -3
  251. data/spec/mongoid/matchable_spec.rb +199 -54
  252. data/spec/mongoid/persistable/creatable_spec.rb +7 -2
  253. data/spec/mongoid/persistable/deletable_spec.rb +35 -1
  254. data/spec/mongoid/persistable/destroyable_spec.rb +25 -2
  255. data/spec/mongoid/persistable/incrementable_spec.rb +6 -6
  256. data/spec/mongoid/persistable/savable_spec.rb +34 -29
  257. data/spec/mongoid/persistable/settable_spec.rb +77 -27
  258. data/spec/mongoid/persistable/updatable_spec.rb +182 -3
  259. data/spec/mongoid/persistable_spec.rb +16 -16
  260. data/spec/mongoid/persistence_context_spec.rb +694 -0
  261. data/spec/mongoid/positional_spec.rb +1 -1
  262. data/spec/mongoid/query_cache_spec.rb +170 -12
  263. data/spec/mongoid/relations/accessors_spec.rb +1 -1
  264. data/spec/mongoid/relations/auto_save_spec.rb +39 -6
  265. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +4 -4
  266. data/spec/mongoid/relations/builders_spec.rb +37 -10
  267. data/spec/mongoid/relations/counter_cache_spec.rb +64 -3
  268. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +16 -0
  269. data/spec/mongoid/relations/eager_spec.rb +40 -0
  270. data/spec/mongoid/relations/embedded/many_spec.rb +305 -59
  271. data/spec/mongoid/relations/embedded/one_spec.rb +2 -1
  272. data/spec/mongoid/relations/macros_spec.rb +415 -7
  273. data/spec/mongoid/relations/metadata_spec.rb +15 -1
  274. data/spec/mongoid/relations/proxy_spec.rb +27 -1
  275. data/spec/mongoid/relations/referenced/in_spec.rb +41 -1
  276. data/spec/mongoid/relations/referenced/many_spec.rb +35 -25
  277. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +14 -26
  278. data/spec/mongoid/relations/synchronization_spec.rb +48 -2
  279. data/spec/mongoid/relations/targets/enumerable_spec.rb +108 -0
  280. data/spec/mongoid/relations/touchable_spec.rb +40 -0
  281. data/spec/mongoid/reloadable_spec.rb +51 -0
  282. data/spec/mongoid/scopable_spec.rb +13 -0
  283. data/spec/mongoid/serializable_spec.rb +0 -50
  284. data/spec/mongoid/threaded_spec.rb +68 -0
  285. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  286. data/spec/mongoid/validatable/uniqueness_spec.rb +18 -9
  287. data/spec/mongoid/validatable_spec.rb +16 -0
  288. data/spec/rails/controller_extension/controller_runtime_spec.rb +110 -0
  289. data/spec/spec_helper.rb +101 -8
  290. data/spec/support/cluster_config.rb +158 -0
  291. data/spec/support/constraints.rb +101 -0
  292. data/spec/support/macros.rb +20 -0
  293. data/spec/support/session_registry.rb +50 -0
  294. data/spec/support/spec_config.rb +42 -0
  295. data.tar.gz.sig +0 -0
  296. metadata +163 -61
  297. metadata.gz.sig +0 -0
  298. data/lib/mongoid/clients/thread_options.rb +0 -19
  299. data/lib/mongoid/extensions/origin/regexp_raw.rb +0 -43
  300. data/lib/mongoid/railties/document.rb +0 -12
  301. data/spec/mongoid/railties/document_spec.rb +0 -24
@@ -0,0 +1,694 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::PersistenceContext do
4
+
5
+ let(:persistence_context) do
6
+ described_class.new(object, options)
7
+ end
8
+
9
+ let(:object) do
10
+ Band
11
+ end
12
+
13
+ describe '.set' do
14
+
15
+ let(:options) do
16
+ { collection: :other }
17
+ end
18
+
19
+ context 'when the persistence context is set on the thread' do
20
+
21
+ let!(:persistence_context) do
22
+ described_class.set(object, options)
23
+ end
24
+
25
+ it 'sets the persistence context for the object on the current thread' do
26
+ expect(described_class.get(object)).to be(persistence_context)
27
+ expect(described_class.get(object)).not_to be(nil)
28
+ expect(described_class.get(object).collection.name).to eq('other')
29
+ end
30
+
31
+ it 'only sets persistence context for the object on the current thread' do
32
+ Thread.new do
33
+ expect(described_class.get(object)).not_to be(persistence_context)
34
+ expect(described_class.get(object)).to be(nil)
35
+ end.value
36
+ end
37
+ end
38
+ end
39
+
40
+
41
+ describe '.get' do
42
+
43
+ let(:options) do
44
+ { collection: :other }
45
+ end
46
+
47
+ context 'when there has been a persistence context set on the current thread' do
48
+
49
+ let!(:persistence_context) do
50
+ described_class.set(object, options)
51
+ end
52
+
53
+ it 'gets the persistence context for the object on the current thread' do
54
+ expect(described_class.get(object)).to be(persistence_context)
55
+ expect(described_class.get(object).collection.name).to eq('other')
56
+ end
57
+
58
+ it 'does not get persistence context for the object from another thread' do
59
+ Thread.new do
60
+ expect(described_class.get(object)).not_to be(persistence_context)
61
+ expect(described_class.get(object)).to be(nil)
62
+ end.value
63
+ end
64
+ end
65
+ end
66
+
67
+ describe '.clear' do
68
+
69
+ let(:options) do
70
+ { collection: :other }
71
+ end
72
+
73
+ context 'when the method throws an error' do
74
+
75
+ let!(:persistence_context) do
76
+ described_class.set(object, options).tap do |cxt|
77
+ allow(cxt).to receive(:client).and_raise(Mongoid::Errors::NoClientConfig.new('default'))
78
+ end
79
+ end
80
+
81
+ it 'clears the context anyway' do
82
+ begin; described_class.clear(object); rescue; end
83
+ expect(described_class.get(object)).to be(nil)
84
+ end
85
+ end
86
+
87
+ context 'when there has been a persistence context set on the current thread' do
88
+
89
+ let!(:persistence_context) do
90
+ described_class.set(object, options)
91
+ end
92
+
93
+ context 'when no cluster is passed to the method' do
94
+
95
+ before do
96
+ described_class.clear(object)
97
+ end
98
+
99
+ it 'clears the persistence context for the object on the current thread' do
100
+ expect(described_class.get(object)).to be(nil)
101
+ end
102
+ end
103
+
104
+ context 'when a cluster is passed to the method' do
105
+
106
+ context 'when the cluster is the same as that of the persistence context on the current thread' do
107
+
108
+ let(:client) do
109
+ persistence_context.client
110
+ end
111
+
112
+ before do
113
+ described_class.clear(object, client.cluster)
114
+ end
115
+
116
+ it 'does not close the cluster' do
117
+ expect(client).not_to receive(:close)
118
+ described_class.clear(object, client.cluster.dup)
119
+ end
120
+ end
121
+
122
+ context 'when the cluster is not the same as that of the persistence context on the current thread' do
123
+
124
+ let!(:client) do
125
+ persistence_context.client
126
+ end
127
+
128
+ it 'closes the client' do
129
+ expect(client).to receive(:close).and_call_original
130
+ described_class.clear(object, client.cluster.dup)
131
+ end
132
+ end
133
+ end
134
+ end
135
+ end
136
+
137
+ describe '#initialize' do
138
+
139
+ let(:options) do
140
+ { collection: 'other' }
141
+ end
142
+
143
+ context 'when an object is passed' do
144
+
145
+ context 'when the object is a klass' do
146
+
147
+ it 'sets the object on the persistence context' do
148
+ expect(persistence_context.instance_variable_get(:@object)).to eq(object)
149
+ end
150
+ end
151
+
152
+ context 'when the object is a model instance' do
153
+
154
+ let(:object) do
155
+ Band.new
156
+ end
157
+
158
+ it 'sets the object on the persistence context' do
159
+ expect(persistence_context.instance_variable_get(:@object)).to eq(object)
160
+ end
161
+ end
162
+ end
163
+
164
+ context 'when options are passed' do
165
+
166
+ let(:options) do
167
+ { connect_timeout: 3 }
168
+ end
169
+
170
+ context 'when the options are valid client options' do
171
+
172
+ it 'sets the options on the persistence context object' do
173
+ expect(persistence_context.options).to eq(options)
174
+ end
175
+ end
176
+
177
+ context 'when the options are not valid client options' do
178
+
179
+ context 'when the options are valid extra options' do
180
+
181
+ let(:options) do
182
+ { collection: 'other' }
183
+ end
184
+
185
+ it 'sets the options on the persistence context object' do
186
+ expect(persistence_context.collection_name).to eq(options[:collection].to_sym)
187
+ end
188
+ end
189
+
190
+ context 'when the options are not valid extra options' do
191
+
192
+ let(:options) do
193
+ { invalid: 'option' }
194
+ end
195
+
196
+ it 'raises an InvalidPersistenceOption error' do
197
+ expect {
198
+ persistence_context
199
+ }.to raise_error(Mongoid::Errors::InvalidPersistenceOption)
200
+ end
201
+ end
202
+ end
203
+ end
204
+ end
205
+
206
+ describe '#collection' do
207
+
208
+ let(:persistence_context) do
209
+ described_class.new(object, options)
210
+ end
211
+
212
+ let(:options) do
213
+ { read: { 'mode' => :secondary } }
214
+ end
215
+
216
+ context 'when a parent object is passed' do
217
+
218
+ it 'uses the collection of the parent object' do
219
+ expect(persistence_context.collection(Person.new).name).to eq('people')
220
+ end
221
+
222
+ it 'does not memoize the collection' do
223
+ persistence_context.collection
224
+ expect(persistence_context.collection(Person.new).name).to eq('people')
225
+ end
226
+
227
+ it 'keeps the other options of the persistence context' do
228
+ expect(persistence_context.collection(Person.new).options[:read]).to eq(options[:read])
229
+ end
230
+
231
+ context 'when the parent object has a client set' do
232
+
233
+ let(:file) do
234
+ File.join(File.dirname(__FILE__), "..", "config", "mongoid.yml")
235
+ end
236
+
237
+ before do
238
+ Mongoid::Clients.clear
239
+ Mongoid.load!(file, :test)
240
+ Person.store_in(client: 'reports')
241
+ end
242
+
243
+ after do
244
+ Person.reset_storage_options!
245
+ end
246
+
247
+ it 'uses the client of the parent object' do
248
+ expect(persistence_context.collection(Person.new).client.database.name).to eq('reports')
249
+ end
250
+ end
251
+ end
252
+
253
+ context 'when a parent object is not passed' do
254
+
255
+ it 'uses the collection of the object' do
256
+ expect(persistence_context.collection.name).to eq('bands')
257
+ end
258
+
259
+ it 'does not memoize the collection' do
260
+ persistence_context.collection(Person.new)
261
+ expect(persistence_context.collection.name).to eq('bands')
262
+ end
263
+
264
+ it 'keeps the other options of the persistence context' do
265
+ expect(persistence_context.collection.client.options[:read]).to eq(options[:read])
266
+ end
267
+ end
268
+ end
269
+
270
+ describe '#collection_name' do
271
+
272
+ let(:persistence_context) do
273
+ described_class.new(object, options)
274
+ end
275
+
276
+ let(:options) do
277
+ { collection: 'other' }
278
+ end
279
+
280
+ context 'when storage options are set on the object' do
281
+
282
+ context 'when there are no options passed to the Persistence Context' do
283
+
284
+ let(:options) do
285
+ { }
286
+ end
287
+
288
+ after do
289
+ object.reset_storage_options!
290
+ end
291
+
292
+ context 'when the storage options is static' do
293
+
294
+ before do
295
+ object.store_in collection: :schmands
296
+ end
297
+
298
+ it 'uses the storage options' do
299
+ expect(persistence_context.collection_name).to eq(:schmands)
300
+ end
301
+ end
302
+
303
+ context 'when the storage options is a block' do
304
+
305
+ before do
306
+ object.store_in collection: ->{ :schmands }
307
+ end
308
+
309
+ it 'uses the storage options' do
310
+ expect(persistence_context.collection_name).to eq(:schmands)
311
+ end
312
+ end
313
+ end
314
+
315
+ context 'when there are options passed to the Persistence Context' do
316
+
317
+ let(:options) do
318
+ { collection: 'other' }
319
+ end
320
+
321
+ after do
322
+ object.reset_storage_options!
323
+ end
324
+
325
+ context 'when the storage options is static' do
326
+
327
+ before do
328
+ object.store_in collection: :schmands
329
+ end
330
+
331
+ it 'uses the persistence context options' do
332
+ expect(persistence_context.collection_name).to eq(:other)
333
+ end
334
+ end
335
+
336
+ context 'when the storage options is a block' do
337
+
338
+ before do
339
+ object.store_in collection: ->{ :schmands }
340
+ end
341
+
342
+ it 'uses the persistence context options' do
343
+ expect(persistence_context.collection_name).to eq(:other)
344
+ end
345
+ end
346
+ end
347
+ end
348
+
349
+ context 'when storage options are not set on the object' do
350
+
351
+ context 'when there are options passed to the Persistence Context' do
352
+
353
+ let(:options) do
354
+ { collection: 'other' }
355
+ end
356
+
357
+ it 'uses the persistence context options' do
358
+ expect(persistence_context.collection_name).to eq(:other)
359
+ end
360
+ end
361
+ end
362
+ end
363
+
364
+ describe '#database_name' do
365
+
366
+ let(:persistence_context) do
367
+ described_class.new(object, options)
368
+ end
369
+
370
+ let(:options) do
371
+ { database: 'other' }
372
+ end
373
+
374
+ context 'when storage options are set on the object' do
375
+
376
+ context 'when there are no options passed to the Persistence Context' do
377
+
378
+ let(:options) do
379
+ { }
380
+ end
381
+
382
+ after do
383
+ object.reset_storage_options!
384
+ end
385
+
386
+ context 'when there is a database override' do
387
+
388
+ before do
389
+ object.store_in database: :musique
390
+ end
391
+
392
+ before do
393
+ Mongoid::Threaded.database_override = :other
394
+ end
395
+
396
+ after do
397
+ Mongoid::Threaded.database_override = nil
398
+ end
399
+
400
+ it 'uses the override' do
401
+ expect(persistence_context.database_name).to eq(:other)
402
+ end
403
+ end
404
+
405
+ context 'when the storage options is static' do
406
+
407
+ before do
408
+ object.store_in database: :musique
409
+ end
410
+
411
+ it 'uses the storage options' do
412
+ expect(persistence_context.database_name).to eq(:musique)
413
+ end
414
+ end
415
+
416
+ context 'when the storage options is a block' do
417
+
418
+ before do
419
+ object.store_in database: ->{ :musique }
420
+ end
421
+ it 'uses the storage options' do
422
+ expect(persistence_context.database_name).to eq(:musique)
423
+ end
424
+ end
425
+ end
426
+
427
+ context 'when there are options passed to the Persistence Context' do
428
+
429
+ let(:options) do
430
+ { database: 'musique' }
431
+ end
432
+
433
+ context 'when there is a database override' do
434
+
435
+ before do
436
+ Mongoid::Threaded.database_override = :other
437
+ end
438
+
439
+ after do
440
+ Mongoid::Threaded.database_override = nil
441
+ end
442
+
443
+ it 'uses the persistence context options' do
444
+ expect(persistence_context.database_name).to eq(:musique)
445
+ end
446
+ end
447
+
448
+ context 'when the storage options is static' do
449
+
450
+ before do
451
+ object.store_in database: :sounds
452
+ end
453
+
454
+ after do
455
+ object.reset_storage_options!
456
+ end
457
+
458
+ it 'uses the persistence context options' do
459
+ expect(persistence_context.database_name).to eq(:musique)
460
+ end
461
+ end
462
+
463
+ context 'when the storage options is a block' do
464
+
465
+ before do
466
+ object.store_in database: ->{ :sounds }
467
+ end
468
+
469
+ after do
470
+ object.reset_storage_options!
471
+ end
472
+
473
+ it 'uses the persistence context options' do
474
+ expect(persistence_context.database_name).to eq(:musique)
475
+ end
476
+ end
477
+ end
478
+ end
479
+
480
+ context 'when storage options are not set on the object' do
481
+
482
+ context 'when there are options passed to the Persistence Context' do
483
+
484
+ let(:options) do
485
+ { database: 'musique' }
486
+ end
487
+
488
+ it 'uses the persistence context options' do
489
+ expect(persistence_context.database_name).to eq(:musique)
490
+ end
491
+
492
+ context 'when there is a database override' do
493
+
494
+ before do
495
+ Mongoid::Threaded.database_override = :other
496
+ end
497
+
498
+ after do
499
+ Mongoid::Threaded.database_override = nil
500
+ end
501
+
502
+ it 'uses the persistence context options' do
503
+ expect(persistence_context.database_name).to eq(:musique)
504
+ end
505
+ end
506
+ end
507
+
508
+ context 'when there are no options passed to the Persistence Context' do
509
+
510
+ context 'when there is a database override' do
511
+
512
+ before do
513
+ Mongoid::Threaded.database_override = :other
514
+ end
515
+
516
+ after do
517
+ Mongoid::Threaded.database_override = nil
518
+ end
519
+
520
+ it 'uses the database override options' do
521
+ expect(persistence_context.database_name).to eq(Mongoid::Threaded.database_override)
522
+ end
523
+ end
524
+ end
525
+ end
526
+ end
527
+
528
+ describe '#client' do
529
+
530
+ let(:persistence_context) do
531
+ described_class.new(object, options)
532
+ end
533
+
534
+ let(:options) do
535
+ { }
536
+ end
537
+
538
+ before do
539
+ Mongoid.clients[:alternative] = { database: :mongoid_test, hosts: [ "#{HOST}:#{PORT}" ] }
540
+ end
541
+
542
+ after do
543
+ Mongoid.clients.delete(:alternative)
544
+ end
545
+
546
+ context 'when the client is set in the options' do
547
+
548
+ let(:options) do
549
+ { client: :alternative }
550
+ end
551
+
552
+ after do
553
+ persistence_context.client.close
554
+ end
555
+
556
+ it 'uses the client option' do
557
+ expect(persistence_context.client).to eq(Mongoid::Clients.with_name(:alternative))
558
+ end
559
+
560
+ context 'when there is a client override' do
561
+
562
+ before do
563
+ Mongoid::Threaded.client_override = :other
564
+ end
565
+
566
+ after do
567
+ persistence_context.client.close
568
+ Mongoid::Threaded.client_override = nil
569
+ end
570
+
571
+ it 'uses the client option' do
572
+ expect(persistence_context.client).to eq(Mongoid::Clients.with_name(:alternative))
573
+ end
574
+ end
575
+
576
+ context 'when there are storage options set' do
577
+
578
+ after do
579
+ object.reset_storage_options!
580
+ end
581
+
582
+ context 'when the storage options is static' do
583
+
584
+ before do
585
+ object.store_in client: :other
586
+ end
587
+
588
+ it 'uses the persistence context options' do
589
+ expect(persistence_context.client).to eq(Mongoid::Clients.with_name(:alternative))
590
+ end
591
+ end
592
+
593
+ context 'when the storage options is a block' do
594
+
595
+ before do
596
+ object.store_in client: ->{ :other }
597
+ end
598
+
599
+ it 'uses the persistence context options' do
600
+ expect(persistence_context.client).to eq(Mongoid::Clients.with_name(:alternative))
601
+ end
602
+ end
603
+ end
604
+ end
605
+
606
+ context 'when there is no client option set' do
607
+
608
+ let(:options) do
609
+ { }
610
+ end
611
+
612
+ context 'when there is a client override' do
613
+
614
+ before do
615
+ Mongoid::Threaded.client_override = :alternative
616
+ end
617
+
618
+ after do
619
+ Mongoid::Threaded.client_override = nil
620
+ end
621
+
622
+ it 'uses the client override' do
623
+ expect(persistence_context.client).to eq(Mongoid::Clients.with_name(:alternative))
624
+ end
625
+ end
626
+
627
+ context 'when there are storage options set' do
628
+
629
+ after do
630
+ object.reset_storage_options!
631
+ end
632
+
633
+ context 'when the storage options is static' do
634
+
635
+ before do
636
+ object.store_in client: :alternative
637
+ end
638
+
639
+ it 'uses the client storage option' do
640
+ expect(persistence_context.client).to eq(Mongoid::Clients.with_name(:alternative))
641
+ end
642
+ end
643
+
644
+ context 'when the storage options is a block' do
645
+
646
+ before do
647
+ object.store_in client: ->{ :alternative }
648
+ end
649
+
650
+ it 'uses the client storage option' do
651
+ expect(persistence_context.client).to eq(Mongoid::Clients.with_name(:alternative))
652
+ end
653
+ end
654
+
655
+ context 'when there is a client override' do
656
+
657
+ before do
658
+ Mongoid::Threaded.client_override = :alternative
659
+ end
660
+
661
+ after do
662
+ Mongoid::Threaded.client_override = nil
663
+ end
664
+
665
+ it 'uses the client override' do
666
+ expect(persistence_context.client).to eq(Mongoid::Clients.with_name(:alternative))
667
+ end
668
+ end
669
+ end
670
+ end
671
+
672
+ context 'when there are client options set' do
673
+
674
+ let(:options) do
675
+ { connect_timeout: 3 }
676
+ end
677
+
678
+ it 'applies the options to the client' do
679
+ expect(persistence_context.client.options[:connect_timeout]).to eq(options[:connect_timeout])
680
+ end
681
+ end
682
+
683
+ context 'when there is a database name set in the options' do
684
+
685
+ let(:options) do
686
+ { database: 'other' }
687
+ end
688
+
689
+ it 'uses the database from the options' do
690
+ expect(persistence_context.client.database.name).to eq(options[:database])
691
+ end
692
+ end
693
+ end
694
+ end
@@ -18,7 +18,7 @@ describe Mongoid::Positional do
18
18
  "children.0.children.1.children.3.field" => "value"
19
19
  },
20
20
  "$push" => {
21
- "children.0.children.1.children.3.fields" => {'$each' => [ "value", "value" ]}
21
+ "children.0.children.1.children.3.fields" => { '$each' => [ "value", "value" ] }
22
22
  }
23
23
  }
24
24
  end