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
@@ -9,6 +9,12 @@ describe Mongoid::Config do
9
9
  end
10
10
  end
11
11
 
12
+ after do
13
+ Mongoid.configure do |config|
14
+ config.load_configuration(CONFIG)
15
+ end
16
+ end
17
+
12
18
  describe "#configured?" do
13
19
 
14
20
  after do
@@ -64,7 +70,7 @@ describe Mongoid::Config do
64
70
 
65
71
  before do
66
72
  if defined?(Rails)
67
- RailsTemp = Rails
73
+ RailsTemp = Rails unless defined?(RailsTemp)
68
74
  Object.send(:remove_const, :Rails)
69
75
  end
70
76
 
@@ -82,10 +88,62 @@ describe Mongoid::Config do
82
88
  end
83
89
  end
84
90
 
91
+ context 'when the belongs_to_required_by_default option is not set in the config' do
92
+
93
+ before do
94
+ Mongoid::Config.reset
95
+ Mongoid.configure do |config|
96
+ config.load_configuration(clients: CONFIG[:clients])
97
+ end
98
+ end
99
+
100
+ it 'sets the Mongoid.belongs_to_required_by_default value to true' do
101
+ expect(Mongoid.belongs_to_required_by_default).to be(true)
102
+ end
103
+ end
104
+
105
+ context 'when the belongs_to_required_by_default option is set in the config' do
106
+
107
+ before do
108
+ Mongoid.configure do |config|
109
+ config.load_configuration(conf)
110
+ end
111
+ end
112
+
113
+ context 'when the value is set to true' do
114
+
115
+ let(:conf) do
116
+ CONFIG.merge(options: { belongs_to_required_by_default: true })
117
+ end
118
+
119
+ it 'sets the Mongoid.belongs_to_required_by_default value to true' do
120
+ expect(Mongoid.belongs_to_required_by_default).to be(true)
121
+ end
122
+ end
123
+
124
+ context 'when the value is set to false' do
125
+
126
+ let(:conf) do
127
+ CONFIG.merge(options: { belongs_to_required_by_default: false })
128
+ end
129
+
130
+ before do
131
+ Mongoid::Config.reset
132
+ Mongoid.configure do |config|
133
+ config.load_configuration(conf)
134
+ end
135
+ end
136
+
137
+ it 'sets the Mongoid.belongs_to_required_by_default value to false' do
138
+ expect(Mongoid.belongs_to_required_by_default).to be(false)
139
+ end
140
+ end
141
+ end
142
+
85
143
  context 'when the app_name is set in the config' do
86
144
 
87
145
  let(:conf) do
88
- CONFIG.merge(options: {app_name: 'admin-reporting'})
146
+ CONFIG.merge(options: { app_name: 'admin-reporting' })
89
147
  end
90
148
 
91
149
  before do
@@ -137,6 +195,10 @@ describe Mongoid::Config do
137
195
  described_class.load!(file, :test)
138
196
  end
139
197
 
198
+ after do
199
+ client.close
200
+ end
201
+
140
202
  it "clears the previous clients" do
141
203
  expect(Mongoid::Clients.clients[:test]).to be_nil
142
204
  end
@@ -148,12 +210,6 @@ describe Mongoid::Config do
148
210
  described_class.load!(file, :test)
149
211
  end
150
212
 
151
- after do
152
- Mongoid.configure do |config|
153
- config.load_configuration(CONFIG)
154
- end
155
- end
156
-
157
213
  it "sets the Mongoid logger level" do
158
214
  expect(Mongoid.logger.level).to eq(Logger::WARN)
159
215
  end
@@ -176,7 +232,7 @@ describe Mongoid::Config do
176
232
 
177
233
  after do
178
234
  if defined?(Rails)
179
- RailsTemp = Rails
235
+ RailsTemp = Rails unless defined?(RailsTemp)
180
236
  Object.send(:remove_const, :Rails)
181
237
  end
182
238
  end
@@ -282,7 +338,7 @@ describe Mongoid::Config do
282
338
  context "when a default is provided" do
283
339
 
284
340
  before do
285
- described_class.load!(file)
341
+ described_class.load!(file, :test_with_max_staleness)
286
342
  end
287
343
 
288
344
  let(:default) do
@@ -301,7 +357,7 @@ describe Mongoid::Config do
301
357
 
302
358
  it "sets the read option" do
303
359
  expect(options["read"]).to eq({ "mode" => :primary_preferred,
304
- "tag_sets" => [{ "use" => "web" }]})
360
+ "max_staleness" => 100 })
305
361
  end
306
362
  end
307
363
  end
@@ -496,7 +496,7 @@ describe Mongoid::Contextual::Atomic do
496
496
  end
497
497
  end
498
498
 
499
- describe "#push_each" do
499
+ describe "#push_all" do
500
500
 
501
501
  context 'when the criteria does not have a collation' do
502
502
 
@@ -517,7 +517,7 @@ describe Mongoid::Contextual::Atomic do
517
517
  end
518
518
 
519
519
  before do
520
- context.push_each(members: [ "Alan", "Fletch" ])
520
+ context.push_all(members: [ "Alan", "Fletch" ])
521
521
  end
522
522
 
523
523
  it "pushes the values to existing arrays" do
@@ -548,7 +548,7 @@ describe Mongoid::Contextual::Atomic do
548
548
  end
549
549
 
550
550
  before do
551
- context.push_each(members: [ "Alan", "Fletch" ])
551
+ context.push_all(members: [ "Alan", "Fletch" ])
552
552
  end
553
553
 
554
554
  it "pushes the values to existing arrays" do
@@ -1,6 +1,7 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe Mongoid::Contextual::GeoNear do
4
+ max_server_version '4.0'
4
5
 
5
6
  describe "#average_distance" do
6
7
 
@@ -228,36 +228,36 @@ describe Mongoid::Contextual::Mongo do
228
228
  it "returns the number of documents deleted" do
229
229
  expect(deleted).to eq(1)
230
230
  end
231
- end
232
231
 
233
- context 'when the criteria has a collation', if: collation_supported? do
232
+ context 'when the criteria has a collation', if: collation_supported? do
234
233
 
235
- let(:criteria) do
236
- Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
237
- end
234
+ let(:criteria) do
235
+ Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
236
+ end
238
237
 
239
- let(:context) do
240
- described_class.new(criteria)
241
- end
238
+ let(:context) do
239
+ described_class.new(criteria)
240
+ end
242
241
 
243
- let!(:deleted) do
244
- context.send(method)
245
- end
242
+ let!(:deleted) do
243
+ context.send(method)
244
+ end
246
245
 
247
- it "deletes the matching documents" do
248
- expect(Band.find(new_order.id)).to eq(new_order)
249
- end
246
+ it "deletes the matching documents" do
247
+ expect(Band.find(new_order.id)).to eq(new_order)
248
+ end
250
249
 
251
- it "deletes the correct number of documents" do
252
- expect(Band.count).to eq(1)
253
- end
250
+ it "deletes the correct number of documents" do
251
+ expect(Band.count).to eq(1)
252
+ end
254
253
 
255
- it "returns the number of documents deleted" do
256
- expect(deleted).to eq(1)
254
+ it "returns the number of documents deleted" do
255
+ expect(deleted).to eq(1)
256
+ end
257
257
  end
258
258
  end
259
259
 
260
- context "when the selector is not constraining" do
260
+ context "when the selector is not contraining" do
261
261
 
262
262
  let(:criteria) do
263
263
  Band.all
@@ -275,6 +275,23 @@ describe Mongoid::Contextual::Mongo do
275
275
  expect(Band.count).to eq(0)
276
276
  end
277
277
  end
278
+
279
+ context 'when the write concern is unacknowledged' do
280
+
281
+ let(:criteria) do
282
+ Band.all
283
+ end
284
+
285
+ let!(:deleted) do
286
+ criteria.with(write: { w: 0 }) do |crit|
287
+ crit.send(method)
288
+ end
289
+ end
290
+
291
+ it 'returns 0' do
292
+ expect(deleted).to eq(0)
293
+ end
294
+ end
278
295
  end
279
296
  end
280
297
 
@@ -363,6 +380,27 @@ describe Mongoid::Contextual::Mongo do
363
380
  end
364
381
  end
365
382
  end
383
+
384
+ context 'when the write concern is unacknowledged' do
385
+
386
+ before do
387
+ 2.times { Band.create }
388
+ end
389
+
390
+ let(:criteria) do
391
+ Band.all
392
+ end
393
+
394
+ let!(:deleted) do
395
+ criteria.with(write: { w: 0 }) do |crit|
396
+ crit.send(method)
397
+ end
398
+ end
399
+
400
+ it 'returns 0' do
401
+ expect(deleted).to eq(0)
402
+ end
403
+ end
366
404
  end
367
405
 
368
406
  describe "#distinct" do
@@ -413,7 +451,7 @@ describe Mongoid::Contextual::Mongo do
413
451
  end
414
452
 
415
453
  it "returns the distinct field values" do
416
- expect(context.distinct(:years)).to eq([ 30, 25 ])
454
+ expect(context.distinct(:years).sort).to eq([ 25, 30 ])
417
455
  end
418
456
  end
419
457
 
@@ -1124,6 +1162,92 @@ describe Mongoid::Contextual::Mongo do
1124
1162
  end
1125
1163
  end
1126
1164
 
1165
+ context 'when the criteria has no sort' do
1166
+
1167
+ let(:criteria) do
1168
+ Band.all
1169
+ end
1170
+
1171
+ let(:context) do
1172
+ described_class.new(criteria)
1173
+ end
1174
+
1175
+
1176
+ it 'applies a sort on _id' do
1177
+ expect(context.send(method)).to eq(depeche_mode)
1178
+ end
1179
+
1180
+ context 'when calling #last' do
1181
+
1182
+ it 'returns the last document, sorted by _id' do
1183
+ expect(context.send(method)).to eq(depeche_mode)
1184
+ expect(context.last).to eq(new_order)
1185
+ end
1186
+ end
1187
+
1188
+ context 'with option { sort: :none }' do
1189
+
1190
+ let(:opts) do
1191
+ { id_sort: :none }
1192
+ end
1193
+
1194
+ it 'does not apply the sort on _id' do
1195
+ expect(context.send(method, opts)).to eq(depeche_mode)
1196
+ end
1197
+
1198
+ context 'when calling #last' do
1199
+
1200
+ it 'does not apply a sort on _id' do
1201
+ expect(context.send(method, opts)).to eq(depeche_mode)
1202
+ expect(context.last(opts)).to eq(depeche_mode)
1203
+ end
1204
+ end
1205
+ end
1206
+ end
1207
+
1208
+ context 'when the criteria has a sort' do
1209
+
1210
+ let(:criteria) do
1211
+ Band.desc(:name)
1212
+ end
1213
+
1214
+ let(:context) do
1215
+ described_class.new(criteria)
1216
+ end
1217
+
1218
+
1219
+ it 'applies the criteria sort' do
1220
+ expect(context.send(method)).to eq(new_order)
1221
+ end
1222
+
1223
+ context 'when calling #last' do
1224
+
1225
+ it 'applies the criteria sort' do
1226
+ expect(context.send(method)).to eq(new_order)
1227
+ expect(context.last).to eq(depeche_mode)
1228
+ end
1229
+ end
1230
+
1231
+ context 'with option { sort: :none }' do
1232
+
1233
+ let(:opts) do
1234
+ { id_sort: :none }
1235
+ end
1236
+
1237
+ it 'applies the criteria sort' do
1238
+ expect(context.send(method, opts)).to eq(new_order)
1239
+ end
1240
+
1241
+ context 'when calling #last' do
1242
+
1243
+ it 'applies the criteria sort' do
1244
+ expect(context.send(method, opts)).to eq(new_order)
1245
+ expect(context.last(opts)).to eq(depeche_mode)
1246
+ end
1247
+ end
1248
+ end
1249
+ end
1250
+
1127
1251
  context "when using .sort" do
1128
1252
 
1129
1253
  let(:criteria) do
@@ -1674,6 +1798,65 @@ describe Mongoid::Contextual::Mongo do
1674
1798
  end
1675
1799
  end
1676
1800
 
1801
+ context "when the output specifies a different db" do
1802
+
1803
+ let(:criteria) do
1804
+ Band.limit(1)
1805
+ end
1806
+
1807
+ let(:context) do
1808
+ described_class.new(criteria)
1809
+ end
1810
+
1811
+ after do
1812
+ Band.with(database: 'another-db') do |b|
1813
+ b.all.delete
1814
+ end
1815
+ end
1816
+
1817
+ context 'when db is a string' do
1818
+
1819
+ let(:results) do
1820
+ context.map_reduce(map, reduce).out(merge: :mr_output, db: 'another-db')
1821
+ end
1822
+
1823
+ it "returns the correct number of documents" do
1824
+ expect(results.count).to eq(1)
1825
+ end
1826
+
1827
+ it "contains the entire results" do
1828
+ expect(results).to eq([
1829
+ { "_id" => "Depeche Mode", "value" => { "likes" => 200 }}
1830
+ ])
1831
+ end
1832
+
1833
+ it 'writes to the specified db' do
1834
+ expect(Band.mongo_client.with(database: 'another-db')[:mr_output].find.count).to eq(1)
1835
+ end
1836
+ end
1837
+
1838
+ context 'when db is a symbol' do
1839
+
1840
+ let(:results) do
1841
+ context.map_reduce(map, reduce).out(merge: :mr_output, 'db' => 'another-db')
1842
+ end
1843
+
1844
+ it "returns the correct number of documents" do
1845
+ expect(results.count).to eq(1)
1846
+ end
1847
+
1848
+ it "contains the entire results" do
1849
+ expect(results).to eq([
1850
+ { "_id" => "Depeche Mode", "value" => { "likes" => 200 }}
1851
+ ])
1852
+ end
1853
+
1854
+ it 'writes to the specified db' do
1855
+ expect(Band.mongo_client.with(database: 'another-db')[:mr_output].find.count).to eq(1)
1856
+ end
1857
+ end
1858
+ end
1859
+
1677
1860
  context "when providing no output" do
1678
1861
 
1679
1862
  let(:criteria) do
@@ -1949,6 +2132,41 @@ describe Mongoid::Contextual::Mongo do
1949
2132
  expect(context.update).to be false
1950
2133
  end
1951
2134
  end
2135
+
2136
+ context 'when provided array filters', if: array_filters_supported? do
2137
+
2138
+ before do
2139
+ Band.delete_all
2140
+ b = Band.new(name: 'Depeche Mode')
2141
+ b.labels << Label.new(name: 'Warner')
2142
+ b.labels << Label.new(name: 'Sony')
2143
+ b.labels << Label.new(name: 'Cbs')
2144
+ b.save
2145
+
2146
+ b = Band.new(name: 'FKA Twigs')
2147
+ b.labels << Label.new(name: 'Warner')
2148
+ b.labels << Label.new(name: 'Cbs')
2149
+ b.save
2150
+ end
2151
+
2152
+
2153
+ let(:criteria) do
2154
+ Band.where(name: 'Depeche Mode')
2155
+ end
2156
+
2157
+ let!(:update) do
2158
+ context.update({ '$set' => { 'labels.$[i].name' => 'Sony' } },
2159
+ array_filters: [{ 'i.name' => 'Cbs' }])
2160
+ end
2161
+
2162
+ it 'applies the array filters' do
2163
+ expect(Band.where(name: 'Depeche Mode').first.labels.collect(&:name)).to match_array(['Warner', 'Sony', 'Sony'])
2164
+ end
2165
+
2166
+ it 'does not affect other documents' do
2167
+ expect(Band.where(name: 'FKA Twigs').first.labels.collect(&:name)).to match_array(['Warner', 'Cbs'])
2168
+ end
2169
+ end
1952
2170
  end
1953
2171
 
1954
2172
  describe "#update_all" do
@@ -2086,6 +2304,41 @@ describe Mongoid::Contextual::Mongo do
2086
2304
  expect(context.update_all).to be false
2087
2305
  end
2088
2306
  end
2307
+
2308
+ context 'when provided array filters', if: array_filters_supported? do
2309
+
2310
+ before do
2311
+ Band.delete_all
2312
+ b = Band.new(name: 'Depeche Mode')
2313
+ b.labels << Label.new(name: 'Warner')
2314
+ b.labels << Label.new(name: 'Sony')
2315
+ b.labels << Label.new(name: 'Cbs')
2316
+ b.save
2317
+
2318
+ b = Band.new(name: 'FKA Twigs')
2319
+ b.labels << Label.new(name: 'Warner')
2320
+ b.labels << Label.new(name: 'Cbs')
2321
+ b.save
2322
+ end
2323
+
2324
+
2325
+ let(:criteria) do
2326
+ Band.all
2327
+ end
2328
+
2329
+ let!(:update) do
2330
+ context.update_all({ '$set' => { 'labels.$[i].name' => 'Sony' } },
2331
+ array_filters: [{ 'i.name' => 'Cbs' }])
2332
+ end
2333
+
2334
+ it 'applies the array filters' do
2335
+ expect(Band.where(name: 'Depeche Mode').first.labels.collect(&:name)).to match_array(['Warner', 'Sony', 'Sony'])
2336
+ end
2337
+
2338
+ it 'updates all documents' do
2339
+ expect(Band.where(name: 'FKA Twigs').first.labels.collect(&:name)).to match_array(['Warner', 'Sony'])
2340
+ end
2341
+ end
2089
2342
  end
2090
2343
 
2091
2344
  describe '#pipeline' do
@@ -2110,7 +2363,7 @@ describe Mongoid::Contextual::Mongo do
2110
2363
  end
2111
2364
 
2112
2365
  it 'creates a pipeline with the selector as one of the $match criteria' do
2113
- expect(pipeline_match).to include({ :'$text' => { :'$search' => "New Order" } })
2366
+ expect(pipeline_match).to include({ '$text' => { '$search' => "New Order" } })
2114
2367
  end
2115
2368
 
2116
2369
  it 'creates a pipeline with the $exists operator as one of the $match criteria' do
@@ -65,6 +65,21 @@ describe Mongoid::Contextual::None do
65
65
  end
66
66
  end
67
67
 
68
+ describe "#distinct" do
69
+
70
+ let!(:band) do
71
+ Band.create(name: "Depeche Mode")
72
+ end
73
+
74
+ let(:context) do
75
+ described_class.new(Band.where(name: "Depeche Mode"))
76
+ end
77
+
78
+ it "returns an empty array" do
79
+ expect(context.distinct(:id)).to eq([])
80
+ end
81
+ end
82
+
68
83
  describe "#pluck" do
69
84
 
70
85
  let!(:band) do
@@ -54,22 +54,31 @@ describe Mongoid::Copyable do
54
54
  end
55
55
  end
56
56
 
57
- context "when a document has old renamed fields" do
57
+ context "when a document has fields from a legacy schema" do
58
58
 
59
59
  let!(:actor) do
60
60
  Actor.create(name: "test")
61
61
  end
62
62
 
63
63
  before do
64
- Actor.collection.find(_id: actor.id).update_one("$set" => { "this_is_not_a_field" => 1 })
64
+ legacy_fields = { "this_is_not_a_field" => 1, "this_legacy_field_is_nil" => nil }
65
+ Actor.collection.find(_id: actor.id).update_one("$set" => legacy_fields)
65
66
  end
66
67
 
67
68
  let(:cloned) do
68
69
  actor.reload.send(method)
69
70
  end
70
71
 
71
- it "copies the document without error" do
72
- expect(cloned.this_is_not_a_field).to eq(1)
72
+ it "sets the legacy attribute" do
73
+ expect(cloned.attributes['this_is_not_a_field']).to eq(1)
74
+ end
75
+
76
+ it "contains legacy attributes that are nil" do
77
+ expect(cloned.attributes.key?('this_legacy_field_is_nil')).to eq(true)
78
+ end
79
+
80
+ it "copies the known attributes" do
81
+ expect(cloned.name).to eq('test')
73
82
  end
74
83
  end
75
84