mongoid 5.4.1 → 6.0.0.beta

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 (264) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/lib/config/locales/en.yml +23 -16
  5. data/lib/mongoid.rb +4 -9
  6. data/lib/mongoid/atomic.rb +1 -1
  7. data/lib/mongoid/atomic/modifiers.rb +8 -12
  8. data/lib/mongoid/attributes.rb +9 -11
  9. data/lib/mongoid/attributes/dynamic.rb +5 -6
  10. data/lib/mongoid/attributes/nested.rb +1 -1
  11. data/lib/mongoid/attributes/processing.rb +4 -0
  12. data/lib/mongoid/attributes/readonly.rb +22 -0
  13. data/lib/mongoid/cacheable.rb +36 -0
  14. data/lib/mongoid/changeable.rb +37 -1
  15. data/lib/mongoid/clients.rb +0 -63
  16. data/lib/mongoid/clients/factory.rb +0 -2
  17. data/lib/mongoid/clients/options.rb +54 -249
  18. data/lib/mongoid/clients/storage_options.rb +1 -69
  19. data/lib/mongoid/composable.rb +26 -2
  20. data/lib/mongoid/config.rb +1 -1
  21. data/lib/mongoid/config/options.rb +1 -1
  22. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -0
  23. data/lib/mongoid/contextual/atomic.rb +6 -9
  24. data/lib/mongoid/contextual/geo_near.rb +2 -3
  25. data/lib/mongoid/contextual/map_reduce.rb +97 -24
  26. data/lib/mongoid/contextual/memory.rb +7 -4
  27. data/lib/mongoid/contextual/mongo.rb +63 -54
  28. data/lib/mongoid/contextual/none.rb +2 -2
  29. data/lib/mongoid/copyable.rb +19 -19
  30. data/lib/mongoid/criteria.rb +5 -4
  31. data/lib/mongoid/criteria/findable.rb +2 -3
  32. data/lib/mongoid/criteria/includable.rb +63 -16
  33. data/lib/mongoid/criteria/marshalable.rb +2 -2
  34. data/lib/mongoid/criteria/modifiable.rb +17 -1
  35. data/lib/mongoid/criteria/options.rb +25 -0
  36. data/lib/mongoid/criteria/queryable.rb +86 -0
  37. data/lib/mongoid/criteria/queryable/aggregable.rb +120 -0
  38. data/lib/mongoid/criteria/queryable/extensions.rb +28 -0
  39. data/lib/mongoid/criteria/queryable/extensions/array.rb +185 -0
  40. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +37 -0
  41. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +34 -0
  42. data/lib/mongoid/criteria/queryable/extensions/date.rb +63 -0
  43. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +53 -0
  44. data/lib/mongoid/criteria/queryable/extensions/hash.rb +200 -0
  45. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +86 -0
  46. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +90 -0
  47. data/lib/mongoid/criteria/queryable/extensions/object.rb +206 -0
  48. data/lib/mongoid/criteria/queryable/extensions/range.rb +70 -0
  49. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +45 -0
  50. data/lib/mongoid/criteria/queryable/extensions/set.rb +34 -0
  51. data/lib/mongoid/criteria/queryable/extensions/string.rb +137 -0
  52. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +79 -0
  53. data/lib/mongoid/criteria/queryable/extensions/time.rb +60 -0
  54. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +54 -0
  55. data/lib/mongoid/criteria/queryable/forwardable.rb +65 -0
  56. data/lib/mongoid/criteria/queryable/key.rb +103 -0
  57. data/lib/mongoid/criteria/queryable/macroable.rb +27 -0
  58. data/lib/mongoid/criteria/queryable/mergeable.rb +271 -0
  59. data/lib/mongoid/criteria/queryable/optional.rb +411 -0
  60. data/lib/mongoid/criteria/queryable/options.rb +136 -0
  61. data/lib/mongoid/criteria/queryable/pipeline.rb +111 -0
  62. data/lib/mongoid/criteria/queryable/selectable.rb +662 -0
  63. data/lib/mongoid/criteria/queryable/selector.rb +196 -0
  64. data/lib/mongoid/criteria/queryable/smash.rb +103 -0
  65. data/lib/mongoid/document.rb +9 -23
  66. data/lib/mongoid/errors.rb +2 -1
  67. data/lib/mongoid/errors/ambiguous_relationship.rb +1 -1
  68. data/lib/mongoid/errors/delete_restriction.rb +2 -2
  69. data/lib/mongoid/errors/invalid_field.rb +2 -2
  70. data/lib/mongoid/errors/invalid_persistence_option.rb +29 -0
  71. data/lib/mongoid/errors/invalid_relation.rb +66 -0
  72. data/lib/mongoid/errors/inverse_not_found.rb +1 -1
  73. data/lib/mongoid/errors/mongoid_error.rb +1 -1
  74. data/lib/mongoid/evolvable.rb +1 -1
  75. data/lib/mongoid/extensions.rb +0 -5
  76. data/lib/mongoid/extensions/big_decimal.rb +17 -8
  77. data/lib/mongoid/extensions/date.rb +4 -1
  78. data/lib/mongoid/extensions/hash.rb +2 -3
  79. data/lib/mongoid/extensions/object.rb +2 -2
  80. data/lib/mongoid/extensions/string.rb +4 -3
  81. data/lib/mongoid/extensions/time.rb +5 -2
  82. data/lib/mongoid/factory.rb +1 -0
  83. data/lib/mongoid/fields/foreign_key.rb +2 -2
  84. data/lib/mongoid/fields/localized.rb +3 -8
  85. data/lib/mongoid/fields/validators/macro.rb +18 -0
  86. data/lib/mongoid/findable.rb +3 -3
  87. data/lib/mongoid/indexable.rb +17 -16
  88. data/lib/mongoid/indexable/specification.rb +1 -1
  89. data/lib/mongoid/indexable/validators/options.rb +1 -2
  90. data/lib/mongoid/interceptable.rb +6 -17
  91. data/lib/mongoid/loggable.rb +1 -1
  92. data/lib/mongoid/matchable.rb +3 -10
  93. data/lib/mongoid/matchable/gt.rb +2 -0
  94. data/lib/mongoid/matchable/gte.rb +2 -0
  95. data/lib/mongoid/matchable/lt.rb +2 -0
  96. data/lib/mongoid/matchable/lte.rb +2 -0
  97. data/lib/mongoid/persistable.rb +6 -5
  98. data/lib/mongoid/persistable/creatable.rb +2 -0
  99. data/lib/mongoid/persistable/deletable.rb +7 -3
  100. data/lib/mongoid/persistable/settable.rb +3 -16
  101. data/lib/mongoid/persistable/updatable.rb +10 -12
  102. data/lib/mongoid/persistence_context.rb +216 -0
  103. data/lib/mongoid/query_cache.rb +5 -30
  104. data/lib/mongoid/relations/accessors.rb +6 -2
  105. data/lib/mongoid/relations/auto_save.rb +12 -4
  106. data/lib/mongoid/relations/bindings/embedded/in.rb +4 -0
  107. data/lib/mongoid/relations/bindings/embedded/many.rb +8 -1
  108. data/lib/mongoid/relations/bindings/embedded/one.rb +10 -0
  109. data/lib/mongoid/relations/bindings/referenced/many.rb +4 -0
  110. data/lib/mongoid/relations/builders.rb +2 -2
  111. data/lib/mongoid/relations/builders/embedded/one.rb +1 -1
  112. data/lib/mongoid/relations/builders/nested_attributes/many.rb +1 -1
  113. data/lib/mongoid/relations/conversions.rb +1 -1
  114. data/lib/mongoid/relations/counter_cache.rb +28 -18
  115. data/lib/mongoid/relations/eager.rb +19 -7
  116. data/lib/mongoid/relations/eager/base.rb +5 -5
  117. data/lib/mongoid/relations/embedded/batchable.rb +9 -33
  118. data/lib/mongoid/relations/embedded/in.rb +16 -2
  119. data/lib/mongoid/relations/embedded/many.rb +23 -8
  120. data/lib/mongoid/relations/embedded/one.rb +17 -2
  121. data/lib/mongoid/relations/macros.rb +9 -2
  122. data/lib/mongoid/relations/metadata.rb +3 -3
  123. data/lib/mongoid/relations/nested_builder.rb +1 -1
  124. data/lib/mongoid/relations/options.rb +2 -2
  125. data/lib/mongoid/relations/proxy.rb +2 -33
  126. data/lib/mongoid/relations/referenced/in.rb +23 -11
  127. data/lib/mongoid/relations/referenced/many.rb +24 -16
  128. data/lib/mongoid/relations/referenced/many_to_many.rb +20 -13
  129. data/lib/mongoid/relations/referenced/one.rb +17 -1
  130. data/lib/mongoid/relations/reflections.rb +3 -5
  131. data/lib/mongoid/relations/touchable.rb +1 -1
  132. data/lib/mongoid/reloadable.rb +1 -1
  133. data/lib/mongoid/scopable.rb +3 -3
  134. data/lib/mongoid/serializable.rb +2 -3
  135. data/lib/mongoid/tasks/database.rb +1 -2
  136. data/lib/mongoid/threaded.rb +4 -4
  137. data/lib/mongoid/traversable.rb +1 -1
  138. data/lib/mongoid/validatable.rb +1 -1
  139. data/lib/mongoid/validatable/macros.rb +2 -4
  140. data/lib/mongoid/validatable/uniqueness.rb +1 -2
  141. data/lib/mongoid/version.rb +1 -1
  142. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +4 -7
  143. data/spec/app/models/album.rb +5 -1
  144. data/spec/app/models/artist.rb +21 -0
  145. data/spec/app/models/band.rb +0 -1
  146. data/spec/app/models/church.rb +0 -2
  147. data/spec/app/models/ordered_post.rb +5 -0
  148. data/spec/app/models/oscar.rb +1 -2
  149. data/spec/app/models/person.rb +3 -1
  150. data/spec/app/models/post.rb +0 -1
  151. data/spec/app/models/princess.rb +2 -0
  152. data/spec/app/models/record.rb +1 -0
  153. data/spec/app/models/thing.rb +1 -1
  154. data/spec/config/mongoid.yml +1 -5
  155. data/spec/mongoid/atomic/modifiers_spec.rb +17 -17
  156. data/spec/mongoid/atomic_spec.rb +17 -17
  157. data/spec/mongoid/attributes/nested_spec.rb +14 -14
  158. data/spec/mongoid/attributes/readonly_spec.rb +87 -44
  159. data/spec/mongoid/attributes_spec.rb +63 -0
  160. data/spec/mongoid/cacheable_spec.rb +112 -0
  161. data/spec/mongoid/changeable_spec.rb +58 -0
  162. data/spec/mongoid/clients/factory_spec.rb +3 -11
  163. data/spec/mongoid/clients/options_spec.rb +378 -96
  164. data/spec/mongoid/clients_spec.rb +207 -170
  165. data/spec/mongoid/composable_spec.rb +7 -0
  166. data/spec/mongoid/config_spec.rb +41 -21
  167. data/spec/mongoid/contextual/atomic_spec.rb +77 -343
  168. data/spec/mongoid/contextual/map_reduce_spec.rb +119 -111
  169. data/spec/mongoid/contextual/memory_spec.rb +56 -316
  170. data/spec/mongoid/contextual/mongo_spec.rb +104 -378
  171. data/spec/mongoid/copyable_spec.rb +8 -15
  172. data/spec/mongoid/criteria/modifiable_spec.rb +239 -7
  173. data/spec/mongoid/criteria/options_spec.rb +29 -0
  174. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +370 -0
  175. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +523 -0
  176. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +59 -0
  177. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +58 -0
  178. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +213 -0
  179. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +330 -0
  180. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +405 -0
  181. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +58 -0
  182. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +65 -0
  183. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +327 -0
  184. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +65 -0
  185. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +77 -0
  186. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +108 -0
  187. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +309 -0
  188. data/spec/mongoid/{extensions/origin/regexp_raw_spec.rb → criteria/queryable/extensions/regexp_spec.rb} +21 -20
  189. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +39 -0
  190. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +302 -0
  191. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +167 -0
  192. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +376 -0
  193. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +347 -0
  194. data/spec/mongoid/criteria/queryable/forwardable_spec.rb +87 -0
  195. data/spec/mongoid/criteria/queryable/key_spec.rb +52 -0
  196. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +49 -0
  197. data/spec/mongoid/criteria/queryable/optional_spec.rb +1786 -0
  198. data/spec/mongoid/criteria/queryable/options_spec.rb +360 -0
  199. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +200 -0
  200. data/spec/mongoid/criteria/queryable/queryable_spec.rb +137 -0
  201. data/spec/mongoid/criteria/queryable/selectable_spec.rb +4159 -0
  202. data/spec/mongoid/criteria/queryable/selector_spec.rb +778 -0
  203. data/spec/mongoid/criteria/queryable/smash_spec.rb +30 -0
  204. data/spec/mongoid/criteria_spec.rb +45 -63
  205. data/spec/mongoid/document_spec.rb +21 -88
  206. data/spec/mongoid/errors/invalid_relation_spec.rb +37 -0
  207. data/spec/mongoid/errors/mongoid_error_spec.rb +6 -3
  208. data/spec/mongoid/extensions/big_decimal_spec.rb +320 -18
  209. data/spec/mongoid/extensions/date_spec.rb +2 -6
  210. data/spec/mongoid/extensions/date_time_spec.rb +2 -6
  211. data/spec/mongoid/extensions/float_spec.rb +8 -1
  212. data/spec/mongoid/extensions/integer_spec.rb +8 -1
  213. data/spec/mongoid/extensions/object_spec.rb +11 -0
  214. data/spec/mongoid/extensions/string_spec.rb +21 -0
  215. data/spec/mongoid/extensions/time_spec.rb +4 -8
  216. data/spec/mongoid/extensions/time_with_zone_spec.rb +2 -6
  217. data/spec/mongoid/fields/localized_spec.rb +0 -91
  218. data/spec/mongoid/findable_spec.rb +46 -1
  219. data/spec/mongoid/indexable_spec.rb +6 -46
  220. data/spec/mongoid/interceptable_spec.rb +49 -10
  221. data/spec/mongoid/matchable/gt_spec.rb +11 -0
  222. data/spec/mongoid/matchable/gte_spec.rb +10 -0
  223. data/spec/mongoid/matchable/lt_spec.rb +11 -0
  224. data/spec/mongoid/matchable/lte_spec.rb +11 -0
  225. data/spec/mongoid/matchable_spec.rb +1 -51
  226. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  227. data/spec/mongoid/persistable/deletable_spec.rb +1 -1
  228. data/spec/mongoid/persistable/destroyable_spec.rb +6 -2
  229. data/spec/mongoid/persistable/savable_spec.rb +30 -30
  230. data/spec/mongoid/persistable/settable_spec.rb +0 -185
  231. data/spec/mongoid/persistable/updatable_spec.rb +166 -5
  232. data/spec/mongoid/persistence_context_spec.rb +654 -0
  233. data/spec/mongoid/positional_spec.rb +10 -10
  234. data/spec/mongoid/query_cache_spec.rb +89 -65
  235. data/spec/mongoid/relations/accessors_spec.rb +1 -1
  236. data/spec/mongoid/relations/auto_save_spec.rb +39 -6
  237. data/spec/mongoid/relations/builders_spec.rb +37 -10
  238. data/spec/mongoid/relations/counter_cache_spec.rb +64 -15
  239. data/spec/mongoid/relations/cyclic_spec.rb +0 -22
  240. data/spec/mongoid/relations/embedded/many_spec.rb +9 -41
  241. data/spec/mongoid/relations/embedded/one_spec.rb +2 -1
  242. data/spec/mongoid/relations/macros_spec.rb +395 -7
  243. data/spec/mongoid/relations/proxy_spec.rb +3 -1
  244. data/spec/mongoid/relations/referenced/in_spec.rb +41 -1
  245. data/spec/mongoid/relations/referenced/many_spec.rb +6 -29
  246. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +6 -29
  247. data/spec/mongoid/relations/reflections_spec.rb +9 -9
  248. data/spec/mongoid/reloadable_spec.rb +51 -0
  249. data/spec/mongoid/scopable_spec.rb +0 -12
  250. data/spec/mongoid/serializable_spec.rb +0 -50
  251. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  252. data/spec/mongoid/validatable/uniqueness_spec.rb +16 -9
  253. data/spec/mongoid/validatable_spec.rb +16 -0
  254. data/spec/spec_helper.rb +10 -10
  255. metadata +536 -479
  256. metadata.gz.sig +0 -0
  257. data/lib/mongoid/clients/thread_options.rb +0 -19
  258. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +0 -20
  259. data/lib/mongoid/extensions/decimal128.rb +0 -39
  260. data/lib/mongoid/extensions/origin/regexp_raw.rb +0 -43
  261. data/lib/mongoid/matchable/regexp.rb +0 -27
  262. data/spec/app/models/post_genre.rb +0 -6
  263. data/spec/mongoid/extensions/decimal128_spec.rb +0 -44
  264. data/spec/mongoid/matchable/regexp_spec.rb +0 -59
@@ -23,7 +23,7 @@ describe Mongoid::Extensions::Integer do
23
23
 
24
24
  describe ".demongoize" do
25
25
 
26
- context "when the the value is an integer" do
26
+ context "when the value is an integer" do
27
27
 
28
28
  it "returns a integer" do
29
29
  expect(Integer.demongoize(number)).to eq(number)
@@ -133,4 +133,11 @@ describe Mongoid::Extensions::Integer do
133
133
  expect(number.mongoize).to eq(number)
134
134
  end
135
135
  end
136
+
137
+ describe "#numeric?" do
138
+
139
+ it "returns true" do
140
+ expect(number.numeric?).to eq(true)
141
+ end
142
+ end
136
143
  end
@@ -289,4 +289,15 @@ describe Mongoid::Extensions::Object do
289
289
  end
290
290
  end
291
291
  end
292
+
293
+ describe "#numeric?" do
294
+
295
+ let(:object) do
296
+ Object.new
297
+ end
298
+
299
+ it "returns false" do
300
+ expect(object.numeric?).to eq(false)
301
+ end
302
+ end
292
303
  end
@@ -301,6 +301,27 @@ describe Mongoid::Extensions::String do
301
301
  expect("blah").to_not be_numeric
302
302
  end
303
303
  end
304
+
305
+ context "when the string is NaN" do
306
+
307
+ it "returns true" do
308
+ expect("NaN").to be_numeric
309
+ end
310
+ end
311
+
312
+ context "when the string is Infinity" do
313
+
314
+ it "returns true" do
315
+ expect("Infinity").to be_numeric
316
+ end
317
+ end
318
+
319
+ context "when the string is -Infinity" do
320
+
321
+ it "returns true" do
322
+ expect("-Infinity").to be_numeric
323
+ end
324
+ end
304
325
  end
305
326
 
306
327
  describe "#singularize" do
@@ -204,12 +204,8 @@ describe Mongoid::Extensions::Time do
204
204
 
205
205
  context "when the string is an invalid time" do
206
206
 
207
- let(:epoch) do
208
- Time.utc(1970, 1, 1, 0, 0, 0, 0)
209
- end
210
-
211
- it "converts the time to epoch" do
212
- expect(Time.mongoize("time")).to eq(epoch)
207
+ it "converts the time to nil" do
208
+ expect(Time.mongoize("time")).to eq(nil)
213
209
  end
214
210
  end
215
211
 
@@ -281,7 +277,7 @@ describe Mongoid::Extensions::Time do
281
277
  end
282
278
 
283
279
  it "does not alter seconds with fractions" do
284
- expect(DateTime.mongoize(1.11).to_f).to eq(1.11)
280
+ expect(DateTime.mongoize(11.11).to_f).to eq(11.11)
285
281
  end
286
282
 
287
283
  context "when using the ActiveSupport time zone" do
@@ -344,7 +340,7 @@ describe Mongoid::Extensions::Time do
344
340
  end
345
341
 
346
342
  it "does not alter seconds with fractions" do
347
- expect(Time.mongoize(102.25).to_f).to eq(102.25)
343
+ expect(Time.mongoize(102.63).to_f).to eq(102.63)
348
344
  end
349
345
  end
350
346
 
@@ -204,12 +204,8 @@ describe Mongoid::Extensions::TimeWithZone do
204
204
 
205
205
  context "when the string is an invalid time" do
206
206
 
207
- let(:epoch) do
208
- Time.utc(1970, 1, 1, 0, 0, 0)
209
- end
210
-
211
- it "returns epoch" do
212
- expect(ActiveSupport::TimeWithZone.mongoize("time")).to eq(epoch)
207
+ it "returns nil" do
208
+ expect(ActiveSupport::TimeWithZone.mongoize("time")).to eq(nil)
213
209
  end
214
210
  end
215
211
 
@@ -430,97 +430,6 @@ describe Mongoid::Fields::Localized do
430
430
  expect(value).to eq({ "de" => 100 })
431
431
  end
432
432
  end
433
-
434
- context 'when the type is Boolean' do
435
-
436
- before do
437
- I18n.enforce_available_locales = false
438
- ::I18n.locale = :de
439
- end
440
-
441
- after do
442
- ::I18n.locale = :en
443
- end
444
-
445
- context "when the value is false" do
446
-
447
- let(:field) do
448
- described_class.new(:boolean_value, localize: true, type: Boolean)
449
- end
450
-
451
- let(:value) do
452
- field.demongoize({ "de" => false })
453
- end
454
-
455
- it "returns the boolean value from the set locale" do
456
- expect(value).to eq(false)
457
- end
458
- end
459
-
460
- context "when the value is true" do
461
-
462
- let(:field) do
463
- described_class.new(:boolean_value, localize: true, type: Boolean)
464
- end
465
-
466
- let(:value) do
467
- field.demongoize({"de" => true})
468
- end
469
-
470
- it "returns the boolean value from the set locale" do
471
- expect(value).to eq(true)
472
- end
473
- end
474
-
475
- context "when fallbacks are defined" do
476
-
477
- before(:all) do
478
- require "i18n/backend/fallbacks"
479
- I18n::Backend::Simple.send(:include, I18n::Backend::Fallbacks)
480
- end
481
-
482
- context "when the lookup does not need to use fallbacks" do
483
-
484
- context "when the value is false" do
485
-
486
- before do
487
- ::I18n.fallbacks[:de] = [:en, :es]
488
- end
489
-
490
- let(:field) do
491
- described_class.new(:boolean_value, localize: true, type: Boolean)
492
- end
493
-
494
- let(:value) do
495
- field.demongoize({"de" => false})
496
- end
497
-
498
- it "returns the boolean value from the set locale" do
499
- expect(value).to eq(false)
500
- end
501
- end
502
-
503
- context "when the value is true" do
504
-
505
- before do
506
- ::I18n.fallbacks[:de] = [:en, :es]
507
- end
508
-
509
- let(:field) do
510
- described_class.new(:boolean_value, localize: true, type: Boolean)
511
- end
512
-
513
- let(:value) do
514
- field.demongoize({"de" => true})
515
- end
516
-
517
- it "returns the boolean value from the set locale" do
518
- expect(value).to eq(true)
519
- end
520
- end
521
- end
522
- end
523
- end
524
433
  end
525
434
  end
526
435
  end
@@ -476,7 +476,7 @@ describe Mongoid::Findable do
476
476
  end
477
477
  end
478
478
 
479
- Origin::Selectable.forwardables.each do |method|
479
+ Mongoid::Criteria::Queryable::Selectable.forwardables.each do |method|
480
480
 
481
481
  describe "##{method}" do
482
482
 
@@ -485,4 +485,49 @@ describe Mongoid::Findable do
485
485
  end
486
486
  end
487
487
  end
488
+
489
+ context 'when Mongoid is configured to use activesupport time zone' do
490
+
491
+ before do
492
+ Mongoid.use_utc = false
493
+ Mongoid.use_activesupport_time_zone = true
494
+ Time.zone = "Asia/Kolkata"
495
+ end
496
+
497
+ let!(:time) do
498
+ Time.zone.now.tap do |t|
499
+ User.create(last_login: t, name: 'Tom')
500
+ end
501
+ end
502
+
503
+ it 'uses activesupport time zone' do
504
+ expect(User.distinct(:last_login).first.to_s).to eql(time.in_time_zone('Asia/Kolkata').to_s)
505
+ end
506
+
507
+ it 'loads other fields accurately' do
508
+ expect(User.distinct(:name)).to match_array(['Tom'])
509
+ end
510
+ end
511
+
512
+ context 'when Mongoid is not configured to use activesupport time zone' do
513
+
514
+ before do
515
+ Mongoid.use_utc = true
516
+ Mongoid.use_activesupport_time_zone = false
517
+ end
518
+
519
+ let!(:time) do
520
+ Time.now.tap do |t|
521
+ User.create(last_login: t, name: 'Tom')
522
+ end
523
+ end
524
+
525
+ it 'uses utc' do
526
+ expect(User.distinct(:last_login).first.to_s).to eql(time.utc.to_s)
527
+ end
528
+
529
+ it 'loads other fields accurately' do
530
+ expect(User.distinct(:name)).to match_array(['Tom'])
531
+ end
532
+ end
488
533
  end
@@ -58,7 +58,9 @@ describe Mongoid::Indexable do
58
58
  end
59
59
 
60
60
  let(:indexes) do
61
- klass.with(database: "mongoid_optional").collection.indexes
61
+ klass.with(database: "mongoid_optional") do |klass|
62
+ klass.collection.indexes
63
+ end
62
64
  end
63
65
 
64
66
  it "creates the indexes" do
@@ -107,39 +109,13 @@ describe Mongoid::Indexable do
107
109
  end
108
110
 
109
111
  let(:indexes) do
110
- klass.with(database: "mongoid_optional").collection.indexes
111
- end
112
-
113
- it "creates the indexes" do
114
- expect(indexes.get(_type: 1)).to_not be_nil
115
- end
116
- end
117
-
118
- context "when a collation option is specified", if: collation_supported? do
119
-
120
- let(:klass) do
121
- Class.new do
122
- include Mongoid::Document
123
- store_in collection: "test_db_indexes"
124
- index({name: 1}, {collation: {locale: 'en_US', strength: 2}})
112
+ klass.with(database: "mongoid_optional") do |klass|
113
+ klass.collection.indexes
125
114
  end
126
115
  end
127
116
 
128
- before do
129
- klass.create_indexes
130
- end
131
-
132
- after do
133
- klass.remove_indexes
134
- end
135
-
136
- let(:indexes) do
137
- klass.collection.indexes
138
- end
139
-
140
117
  it "creates the indexes" do
141
- expect(indexes.get("name_1")["collation"]).to_not be_nil
142
- expect(indexes.get("name_1")["collation"]["locale"]).to eq('en_US')
118
+ expect(indexes.get(_type: 1)).to_not be_nil
143
119
  end
144
120
  end
145
121
  end
@@ -177,7 +153,6 @@ describe Mongoid::Indexable do
177
153
  Class.new do
178
154
  include Mongoid::Document
179
155
  field :a, as: :authentication_token
180
- store_in collection: :specs
181
156
  end
182
157
  end
183
158
 
@@ -286,21 +261,6 @@ describe Mongoid::Indexable do
286
261
  end
287
262
  end
288
263
 
289
- context "when providing a collation option", if: collation_supported? do
290
-
291
- before do
292
- klass.index({ name: 1 }, collation: { locale: 'en_US', strength: 2 })
293
- end
294
-
295
- let(:options) do
296
- klass.index_specification(name: 1).options
297
- end
298
-
299
- it "sets the index with a collation option" do
300
- expect(options).to eq(collation: { locale: 'en_US', strength: 2 })
301
- end
302
- end
303
-
304
264
  context "when providing a compound index" do
305
265
 
306
266
  before do
@@ -280,13 +280,18 @@ describe Mongoid::Interceptable do
280
280
  end
281
281
  end
282
282
 
283
- context "callback returns false" do
283
+ context "callback aborts the callback chain" do
284
284
 
285
285
  before do
286
- expect(artist).to receive(:before_create_stub).once.and_return(false)
286
+ Artist.before_create(:before_create_fail_stub)
287
+ expect(artist).to receive(:before_create_fail_stub).once.and_call_original
287
288
  artist.save
288
289
  end
289
290
 
291
+ after do
292
+ Artist.reset_callbacks(:create)
293
+ end
294
+
290
295
  it "does not get saved" do
291
296
  expect(artist.persisted?).to be false
292
297
  end
@@ -316,13 +321,18 @@ describe Mongoid::Interceptable do
316
321
  end
317
322
  end
318
323
 
319
- context "when callback returns false" do
324
+ context "when callback halts the callback chain" do
320
325
 
321
326
  before do
322
- expect(artist).to receive(:before_save_stub).once.and_return(false)
327
+ Artist.before_save(:before_save_fail_stub)
328
+ end
329
+
330
+ after do
331
+ Artist.reset_callbacks(:save)
323
332
  end
324
333
 
325
334
  it "the save returns false" do
335
+ expect(artist).to receive(:before_save_fail_stub).once.and_call_original
326
336
  expect(artist.save).to be false
327
337
  end
328
338
  end
@@ -343,7 +353,7 @@ describe Mongoid::Interceptable do
343
353
  context "when the callback returns true" do
344
354
 
345
355
  before do
346
- expect(artist).to receive(:before_save_stub).once.and_return(true)
356
+ expect(artist).to receive(:before_update_stub).once.and_return(true)
347
357
  end
348
358
 
349
359
  it "the save returns true" do
@@ -351,13 +361,18 @@ describe Mongoid::Interceptable do
351
361
  end
352
362
  end
353
363
 
354
- context "when the callback returns false" do
364
+ context "when the callback halts the callback chain" do
355
365
 
356
366
  before do
357
- expect(artist).to receive(:before_save_stub).once.and_return(false)
367
+ Artist.before_update(:before_update_fail_stub)
368
+ end
369
+
370
+ after do
371
+ Artist.reset_callbacks(:update)
358
372
  end
359
373
 
360
374
  it "the save returns false" do
375
+ expect(artist).to receive(:before_update_fail_stub).once.and_call_original
361
376
  expect(artist.save).to be false
362
377
  end
363
378
  end
@@ -389,13 +404,18 @@ describe Mongoid::Interceptable do
389
404
  end
390
405
  end
391
406
 
392
- context "when the callback returns false" do
407
+ context "when the callback halts the callback chain" do
393
408
 
394
409
  before do
395
- expect(artist).to receive(:before_destroy_stub).once.and_return(false)
410
+ Artist.before_destroy(:before_destroy_fail_stub)
411
+ end
412
+
413
+ after do
414
+ Artist.reset_callbacks(:destroy)
396
415
  end
397
416
 
398
417
  it "the destroy returns false" do
418
+ expect(artist).to receive(:before_destroy_fail_stub).once.and_call_original
399
419
  expect(artist.destroy).to be false
400
420
  end
401
421
  end
@@ -1434,6 +1454,25 @@ describe Mongoid::Interceptable do
1434
1454
  end
1435
1455
  end
1436
1456
 
1457
+ describe '#after_destroy' do
1458
+
1459
+ context 'when the parent is updated in a child after_destroy callback' do
1460
+
1461
+ let!(:person) do
1462
+ Person.create!(ordered_posts: [OrderedPost.new])
1463
+ end
1464
+
1465
+ before do
1466
+ post = OrderedPost.first
1467
+ post.destroy
1468
+ end
1469
+
1470
+ it 'updates the parent' do
1471
+ expect(person.reload.title).to eq('Minus one ordered post.')
1472
+ end
1473
+ end
1474
+ end
1475
+
1437
1476
  describe "#before_validation" do
1438
1477
 
1439
1478
  context "when the child is new" do
@@ -1544,7 +1583,7 @@ describe Mongoid::Interceptable do
1544
1583
 
1545
1584
  before(:all) do
1546
1585
  Person.before_save do |doc|
1547
- doc.mode != :prevent_save
1586
+ throw(:abort) if doc.mode == :prevent_save
1548
1587
  end
1549
1588
  end
1550
1589