mongoid 5.4.1 → 6.1.1

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 (260) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +3 -3
  3. data/lib/config/locales/en.yml +19 -0
  4. data/lib/mongoid.rb +4 -4
  5. data/lib/mongoid/atomic.rb +2 -2
  6. data/lib/mongoid/atomic/modifiers.rb +8 -12
  7. data/lib/mongoid/attributes.rb +22 -21
  8. data/lib/mongoid/attributes/readonly.rb +22 -0
  9. data/lib/mongoid/cacheable.rb +36 -0
  10. data/lib/mongoid/changeable.rb +36 -0
  11. data/lib/mongoid/clients.rb +8 -63
  12. data/lib/mongoid/clients/options.rb +55 -250
  13. data/lib/mongoid/clients/storage_options.rb +1 -69
  14. data/lib/mongoid/composable.rb +29 -3
  15. data/lib/mongoid/config.rb +1 -0
  16. data/lib/mongoid/contextual/atomic.rb +5 -8
  17. data/lib/mongoid/contextual/map_reduce.rb +0 -4
  18. data/lib/mongoid/contextual/memory.rb +2 -2
  19. data/lib/mongoid/contextual/mongo.rb +40 -22
  20. data/lib/mongoid/contextual/none.rb +12 -0
  21. data/lib/mongoid/copyable.rb +13 -6
  22. data/lib/mongoid/criteria.rb +5 -2
  23. data/lib/mongoid/criteria/marshalable.rb +2 -2
  24. data/lib/mongoid/criteria/modifiable.rb +17 -1
  25. data/lib/mongoid/criteria/options.rb +25 -0
  26. data/lib/mongoid/criteria/queryable.rb +87 -0
  27. data/lib/mongoid/criteria/queryable/aggregable.rb +120 -0
  28. data/lib/mongoid/criteria/queryable/extensions.rb +28 -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/forwardable.rb +65 -0
  46. data/lib/mongoid/criteria/queryable/key.rb +103 -0
  47. data/lib/mongoid/criteria/queryable/macroable.rb +27 -0
  48. data/lib/mongoid/criteria/queryable/mergeable.rb +271 -0
  49. data/lib/mongoid/criteria/queryable/optional.rb +429 -0
  50. data/lib/mongoid/criteria/queryable/options.rb +153 -0
  51. data/lib/mongoid/criteria/queryable/pipeline.rb +111 -0
  52. data/lib/mongoid/criteria/queryable/selectable.rb +662 -0
  53. data/lib/mongoid/criteria/queryable/selector.rb +212 -0
  54. data/lib/mongoid/criteria/queryable/smash.rb +104 -0
  55. data/lib/mongoid/document.rb +30 -37
  56. data/lib/mongoid/errors.rb +2 -0
  57. data/lib/mongoid/errors/ambiguous_relationship.rb +1 -1
  58. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -1
  59. data/lib/mongoid/errors/invalid_field.rb +2 -2
  60. data/lib/mongoid/errors/invalid_persistence_option.rb +29 -0
  61. data/lib/mongoid/errors/invalid_relation.rb +66 -0
  62. data/lib/mongoid/evolvable.rb +1 -1
  63. data/lib/mongoid/extensions.rb +0 -4
  64. data/lib/mongoid/extensions/big_decimal.rb +17 -8
  65. data/lib/mongoid/extensions/date.rb +4 -1
  66. data/lib/mongoid/extensions/decimal128.rb +3 -3
  67. data/lib/mongoid/extensions/hash.rb +1 -0
  68. data/lib/mongoid/extensions/string.rb +4 -3
  69. data/lib/mongoid/extensions/time.rb +4 -1
  70. data/lib/mongoid/fields/validators/macro.rb +18 -0
  71. data/lib/mongoid/findable.rb +2 -2
  72. data/lib/mongoid/indexable.rb +15 -13
  73. data/lib/mongoid/interceptable.rb +5 -22
  74. data/lib/mongoid/matchable.rb +13 -7
  75. data/lib/mongoid/matchable/all.rb +2 -2
  76. data/lib/mongoid/matchable/and.rb +3 -3
  77. data/lib/mongoid/matchable/default.rb +2 -2
  78. data/lib/mongoid/matchable/elem_match.rb +28 -0
  79. data/lib/mongoid/matchable/exists.rb +2 -2
  80. data/lib/mongoid/matchable/gt.rb +4 -2
  81. data/lib/mongoid/matchable/gte.rb +4 -2
  82. data/lib/mongoid/matchable/in.rb +2 -2
  83. data/lib/mongoid/matchable/lt.rb +4 -2
  84. data/lib/mongoid/matchable/lte.rb +4 -2
  85. data/lib/mongoid/matchable/ne.rb +2 -2
  86. data/lib/mongoid/matchable/nin.rb +2 -2
  87. data/lib/mongoid/matchable/or.rb +3 -3
  88. data/lib/mongoid/matchable/regexp.rb +3 -3
  89. data/lib/mongoid/matchable/size.rb +2 -2
  90. data/lib/mongoid/persistable.rb +3 -5
  91. data/lib/mongoid/persistable/creatable.rb +2 -2
  92. data/lib/mongoid/persistable/deletable.rb +1 -1
  93. data/lib/mongoid/persistable/settable.rb +1 -1
  94. data/lib/mongoid/persistable/updatable.rb +5 -12
  95. data/lib/mongoid/persistable/upsertable.rb +1 -1
  96. data/lib/mongoid/persistence_context.rb +215 -0
  97. data/lib/mongoid/query_cache.rb +3 -6
  98. data/lib/mongoid/relations/accessors.rb +3 -0
  99. data/lib/mongoid/relations/auto_save.rb +12 -4
  100. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +4 -4
  101. data/lib/mongoid/relations/counter_cache.rb +15 -5
  102. data/lib/mongoid/relations/eager.rb +6 -11
  103. data/lib/mongoid/relations/eager/base.rb +3 -3
  104. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +2 -2
  105. data/lib/mongoid/relations/eager/has_many.rb +1 -1
  106. data/lib/mongoid/relations/embedded/batchable.rb +12 -36
  107. data/lib/mongoid/relations/embedded/in.rb +13 -1
  108. data/lib/mongoid/relations/embedded/many.rb +28 -10
  109. data/lib/mongoid/relations/embedded/one.rb +14 -1
  110. data/lib/mongoid/relations/macros.rb +9 -1
  111. data/lib/mongoid/relations/metadata.rb +3 -3
  112. data/lib/mongoid/relations/options.rb +2 -2
  113. data/lib/mongoid/relations/proxy.rb +1 -31
  114. data/lib/mongoid/relations/referenced/in.rb +19 -10
  115. data/lib/mongoid/relations/referenced/many.rb +23 -17
  116. data/lib/mongoid/relations/referenced/many_to_many.rb +20 -13
  117. data/lib/mongoid/relations/referenced/one.rb +15 -1
  118. data/lib/mongoid/relations/synchronization.rb +11 -11
  119. data/lib/mongoid/relations/touchable.rb +6 -3
  120. data/lib/mongoid/reloadable.rb +1 -1
  121. data/lib/mongoid/serializable.rb +1 -1
  122. data/lib/mongoid/traversable.rb +1 -1
  123. data/lib/mongoid/validatable/uniqueness.rb +1 -2
  124. data/lib/mongoid/version.rb +1 -1
  125. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +14 -3
  126. data/spec/app/models/album.rb +5 -1
  127. data/spec/app/models/artist.rb +21 -0
  128. data/spec/app/models/book.rb +2 -1
  129. data/spec/app/models/dokument.rb +1 -0
  130. data/spec/app/models/ordered_post.rb +5 -0
  131. data/spec/app/models/oscar.rb +1 -2
  132. data/spec/app/models/page.rb +1 -1
  133. data/spec/app/models/person.rb +3 -3
  134. data/spec/app/models/princess.rb +2 -0
  135. data/spec/app/models/record.rb +1 -0
  136. data/spec/app/models/subscription.rb +1 -0
  137. data/spec/app/models/thing.rb +1 -1
  138. data/spec/config/mongoid.yml +15 -0
  139. data/spec/mongoid/atomic/modifiers_spec.rb +17 -17
  140. data/spec/mongoid/atomic_spec.rb +17 -17
  141. data/spec/mongoid/attributes/nested_spec.rb +14 -14
  142. data/spec/mongoid/attributes/readonly_spec.rb +87 -44
  143. data/spec/mongoid/attributes_spec.rb +90 -5
  144. data/spec/mongoid/cacheable_spec.rb +112 -0
  145. data/spec/mongoid/changeable_spec.rb +58 -0
  146. data/spec/mongoid/clients/factory_spec.rb +31 -3
  147. data/spec/mongoid/clients/options_spec.rb +382 -96
  148. data/spec/mongoid/clients_spec.rb +243 -101
  149. data/spec/mongoid/composable_spec.rb +7 -0
  150. data/spec/mongoid/config_spec.rb +67 -11
  151. data/spec/mongoid/contextual/atomic_spec.rb +3 -3
  152. data/spec/mongoid/contextual/mongo_spec.rb +165 -20
  153. data/spec/mongoid/contextual/none_spec.rb +15 -0
  154. data/spec/mongoid/copyable_spec.rb +13 -4
  155. data/spec/mongoid/criteria/modifiable_spec.rb +239 -7
  156. data/spec/mongoid/criteria/options_spec.rb +29 -0
  157. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +370 -0
  158. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +523 -0
  159. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +59 -0
  160. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +58 -0
  161. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +213 -0
  162. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +330 -0
  163. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +405 -0
  164. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +58 -0
  165. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +65 -0
  166. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +327 -0
  167. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +65 -0
  168. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +77 -0
  169. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +108 -0
  170. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +309 -0
  171. data/spec/mongoid/{extensions/origin → criteria/queryable/extensions}/regexp_raw_spec.rb +2 -2
  172. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +90 -0
  173. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +39 -0
  174. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +302 -0
  175. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +167 -0
  176. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +376 -0
  177. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +347 -0
  178. data/spec/mongoid/criteria/queryable/forwardable_spec.rb +87 -0
  179. data/spec/mongoid/criteria/queryable/key_spec.rb +52 -0
  180. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +49 -0
  181. data/spec/mongoid/criteria/queryable/optional_spec.rb +1799 -0
  182. data/spec/mongoid/criteria/queryable/options_spec.rb +360 -0
  183. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +200 -0
  184. data/spec/mongoid/criteria/queryable/queryable_spec.rb +137 -0
  185. data/spec/mongoid/criteria/queryable/selectable_spec.rb +4174 -0
  186. data/spec/mongoid/criteria/queryable/selector_spec.rb +844 -0
  187. data/spec/mongoid/criteria/queryable/smash_spec.rb +30 -0
  188. data/spec/mongoid/criteria_spec.rb +152 -21
  189. data/spec/mongoid/document_spec.rb +37 -88
  190. data/spec/mongoid/errors/invalid_relation_spec.rb +37 -0
  191. data/spec/mongoid/errors/mongoid_error_spec.rb +6 -3
  192. data/spec/mongoid/extensions/big_decimal_spec.rb +320 -18
  193. data/spec/mongoid/extensions/boolean_spec.rb +14 -0
  194. data/spec/mongoid/extensions/date_spec.rb +2 -6
  195. data/spec/mongoid/extensions/date_time_spec.rb +2 -6
  196. data/spec/mongoid/extensions/decimal128_spec.rb +1 -1
  197. data/spec/mongoid/extensions/float_spec.rb +8 -1
  198. data/spec/mongoid/extensions/hash_spec.rb +15 -0
  199. data/spec/mongoid/extensions/integer_spec.rb +8 -1
  200. data/spec/mongoid/extensions/object_spec.rb +11 -0
  201. data/spec/mongoid/extensions/string_spec.rb +21 -0
  202. data/spec/mongoid/extensions/time_spec.rb +2 -6
  203. data/spec/mongoid/extensions/time_with_zone_spec.rb +2 -6
  204. data/spec/mongoid/findable_spec.rb +46 -1
  205. data/spec/mongoid/indexable_spec.rb +15 -3
  206. data/spec/mongoid/interceptable_spec.rb +68 -10
  207. data/spec/mongoid/matchable/all_spec.rb +4 -4
  208. data/spec/mongoid/matchable/and_spec.rb +10 -10
  209. data/spec/mongoid/matchable/default_spec.rb +12 -12
  210. data/spec/mongoid/matchable/elem_match_spec.rb +86 -0
  211. data/spec/mongoid/matchable/exists_spec.rb +5 -5
  212. data/spec/mongoid/matchable/gt_spec.rb +18 -7
  213. data/spec/mongoid/matchable/gte_spec.rb +17 -7
  214. data/spec/mongoid/matchable/in_spec.rb +5 -5
  215. data/spec/mongoid/matchable/lt_spec.rb +18 -7
  216. data/spec/mongoid/matchable/lte_spec.rb +18 -7
  217. data/spec/mongoid/matchable/ne_spec.rb +5 -5
  218. data/spec/mongoid/matchable/nin_spec.rb +5 -5
  219. data/spec/mongoid/matchable/or_spec.rb +7 -7
  220. data/spec/mongoid/matchable/regexp_spec.rb +5 -5
  221. data/spec/mongoid/matchable/size_spec.rb +3 -3
  222. data/spec/mongoid/matchable_spec.rb +173 -53
  223. data/spec/mongoid/persistable/creatable_spec.rb +7 -2
  224. data/spec/mongoid/persistable/deletable_spec.rb +16 -1
  225. data/spec/mongoid/persistable/destroyable_spec.rb +6 -2
  226. data/spec/mongoid/persistable/savable_spec.rb +35 -30
  227. data/spec/mongoid/persistable/settable_spec.rb +45 -29
  228. data/spec/mongoid/persistable/updatable_spec.rb +184 -5
  229. data/spec/mongoid/persistence_context_spec.rb +680 -0
  230. data/spec/mongoid/positional_spec.rb +10 -10
  231. data/spec/mongoid/query_cache_spec.rb +89 -0
  232. data/spec/mongoid/relations/accessors_spec.rb +1 -1
  233. data/spec/mongoid/relations/auto_save_spec.rb +39 -6
  234. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +4 -4
  235. data/spec/mongoid/relations/builders_spec.rb +37 -10
  236. data/spec/mongoid/relations/counter_cache_spec.rb +64 -3
  237. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +16 -0
  238. data/spec/mongoid/relations/eager_spec.rb +40 -0
  239. data/spec/mongoid/relations/embedded/many_spec.rb +63 -47
  240. data/spec/mongoid/relations/embedded/one_spec.rb +2 -1
  241. data/spec/mongoid/relations/macros_spec.rb +395 -7
  242. data/spec/mongoid/relations/metadata_spec.rb +15 -1
  243. data/spec/mongoid/relations/proxy_spec.rb +27 -1
  244. data/spec/mongoid/relations/referenced/in_spec.rb +41 -1
  245. data/spec/mongoid/relations/referenced/many_spec.rb +13 -25
  246. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +14 -26
  247. data/spec/mongoid/relations/synchronization_spec.rb +48 -2
  248. data/spec/mongoid/relations/touchable_spec.rb +40 -0
  249. data/spec/mongoid/reloadable_spec.rb +51 -0
  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 +18 -9
  253. data/spec/mongoid/validatable_spec.rb +16 -0
  254. data/spec/spec_helper.rb +20 -11
  255. metadata +524 -469
  256. checksums.yaml.gz.sig +0 -0
  257. data.tar.gz.sig +0 -0
  258. data/lib/mongoid/clients/thread_options.rb +0 -19
  259. data/lib/mongoid/extensions/origin/regexp_raw.rb +0 -43
  260. metadata.gz.sig +0 -0
@@ -82,6 +82,13 @@ describe Mongoid::Boolean do
82
82
  end
83
83
  end
84
84
 
85
+ context "when provided on" do
86
+
87
+ it "returns true" do
88
+ expect(described_class.mongoize("on")).to eq(true)
89
+ end
90
+ end
91
+
85
92
  context "when provided false" do
86
93
 
87
94
  it "returns false" do
@@ -123,6 +130,13 @@ describe Mongoid::Boolean do
123
130
  expect(described_class.mongoize("n")).to eq(false)
124
131
  end
125
132
  end
133
+
134
+ context "when provided off" do
135
+
136
+ it "returns true" do
137
+ expect(described_class.mongoize("off")).to eq(false)
138
+ end
139
+ end
126
140
  end
127
141
  end
128
142
 
@@ -135,12 +135,8 @@ describe Mongoid::Extensions::Date do
135
135
 
136
136
  context "when the string is an invalid time" do
137
137
 
138
- let(:epoch) do
139
- Date.new(1970, 1, 1)
140
- end
141
-
142
- it "returns epoch" do
143
- expect(Date.mongoize("time")).to eq(epoch)
138
+ it "returns nil" do
139
+ expect(Date.mongoize("time")).to eq(nil)
144
140
  end
145
141
  end
146
142
  end
@@ -129,12 +129,8 @@ describe Mongoid::Extensions::DateTime do
129
129
 
130
130
  context "when the string is an invalid time" do
131
131
 
132
- let(:epoch) do
133
- Time.utc(1970, 1, 1, 0, 0, 0, 0)
134
- end
135
-
136
- it "returns epoch" do
137
- expect(DateTime.mongoize("time")).to eq(epoch)
132
+ it "returns nil" do
133
+ expect(DateTime.mongoize("time")).to eq(nil)
138
134
  end
139
135
  end
140
136
  end
@@ -41,4 +41,4 @@ describe Mongoid::Extensions::Decimal128 do
41
41
  end
42
42
  end
43
43
  end
44
- end
44
+ end
@@ -23,7 +23,7 @@ describe Mongoid::Extensions::Float do
23
23
 
24
24
  describe ".demongoize" do
25
25
 
26
- context "when the the value is a float" do
26
+ context "when the value is a float" do
27
27
 
28
28
  it "returns a float" do
29
29
  expect(Float.demongoize(number)).to eq(number)
@@ -144,4 +144,11 @@ describe Mongoid::Extensions::Float do
144
144
  expect(number.mongoize).to eq(number)
145
145
  end
146
146
  end
147
+
148
+ describe "#numeric?" do
149
+
150
+ it "returns true" do
151
+ expect(number.numeric?).to eq(true)
152
+ end
153
+ end
147
154
  end
@@ -247,6 +247,21 @@ describe Mongoid::Extensions::Hash do
247
247
  end
248
248
  end
249
249
 
250
+ context "when the parent key is not present" do
251
+
252
+ let(:hash) do
253
+ { "101" => { "name" => "hundred and one" } }
254
+ end
255
+
256
+ let(:nested) do
257
+ hash.__nested__("100.name")
258
+ end
259
+
260
+ it "should return nil" do
261
+ expect(nested).to eq(nil)
262
+ end
263
+ end
264
+
250
265
  describe ".demongoize" do
251
266
 
252
267
  let(:hash) do
@@ -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
 
@@ -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
 
@@ -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
@@ -2,6 +2,10 @@ require "spec_helper"
2
2
 
3
3
  describe Mongoid::Indexable do
4
4
 
5
+ after do
6
+ Person.collection.drop
7
+ end
8
+
5
9
  describe ".included" do
6
10
 
7
11
  let(:klass) do
@@ -58,7 +62,9 @@ describe Mongoid::Indexable do
58
62
  end
59
63
 
60
64
  let(:indexes) do
61
- klass.with(database: "mongoid_optional").collection.indexes
65
+ klass.with(database: "mongoid_optional") do |klass|
66
+ klass.collection.indexes
67
+ end
62
68
  end
63
69
 
64
70
  it "creates the indexes" do
@@ -107,7 +113,9 @@ describe Mongoid::Indexable do
107
113
  end
108
114
 
109
115
  let(:indexes) do
110
- klass.with(database: "mongoid_optional").collection.indexes
116
+ klass.with(database: "mongoid_optional") do |klass|
117
+ klass.collection.indexes
118
+ end
111
119
  end
112
120
 
113
121
  it "creates the indexes" do
@@ -121,7 +129,7 @@ describe Mongoid::Indexable do
121
129
  Class.new do
122
130
  include Mongoid::Document
123
131
  store_in collection: "test_db_indexes"
124
- index({name: 1}, {collation: {locale: 'en_US', strength: 2}})
132
+ index({ name: 1 }, { collation: { locale: 'en_US', strength: 2 }})
125
133
  end
126
134
  end
127
135
 
@@ -181,6 +189,10 @@ describe Mongoid::Indexable do
181
189
  end
182
190
  end
183
191
 
192
+ after do
193
+ klass.collection.drop
194
+ end
195
+
184
196
  context "when indexing a field that is aliased" do
185
197
 
186
198
  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
@@ -1132,6 +1152,25 @@ describe Mongoid::Interceptable do
1132
1152
  expect(band.reload.records.first.before_validation_called).to be true
1133
1153
  end
1134
1154
  end
1155
+
1156
+ context 'when the parent is updated' do
1157
+
1158
+ let(:band) do
1159
+ Band.create(name: "Moderat")
1160
+ end
1161
+
1162
+ before do
1163
+ band.update(records: [ { name: 'Black on Both Sides' }])
1164
+ end
1165
+
1166
+ it 'executes the callback' do
1167
+ expect(band.records.first.before_validation_called).to be true
1168
+ end
1169
+
1170
+ it 'persists the change' do
1171
+ expect(band.reload.records.first.before_validation_called).to be true
1172
+ end
1173
+ end
1135
1174
  end
1136
1175
 
1137
1176
  context "when the child is persisted" do
@@ -1434,6 +1473,25 @@ describe Mongoid::Interceptable do
1434
1473
  end
1435
1474
  end
1436
1475
 
1476
+ describe '#after_destroy' do
1477
+
1478
+ context 'when the parent is updated in a child after_destroy callback' do
1479
+
1480
+ let!(:person) do
1481
+ Person.create!(ordered_posts: [OrderedPost.new])
1482
+ end
1483
+
1484
+ before do
1485
+ post = OrderedPost.first
1486
+ post.destroy
1487
+ end
1488
+
1489
+ it 'updates the parent' do
1490
+ expect(person.reload.title).to eq('Minus one ordered post.')
1491
+ end
1492
+ end
1493
+ end
1494
+
1437
1495
  describe "#before_validation" do
1438
1496
 
1439
1497
  context "when the child is new" do
@@ -1544,7 +1602,7 @@ describe Mongoid::Interceptable do
1544
1602
 
1545
1603
  before(:all) do
1546
1604
  Person.before_save do |doc|
1547
- doc.mode != :prevent_save
1605
+ throw(:abort) if doc.mode == :prevent_save
1548
1606
  end
1549
1607
  end
1550
1608