mongoid 7.4.3 → 8.0.7

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 (383) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +3 -3
  4. data/Rakefile +25 -0
  5. data/lib/config/locales/en.yml +52 -28
  6. data/lib/mongoid/association/accessors.rb +38 -9
  7. data/lib/mongoid/association/bindable.rb +50 -2
  8. data/lib/mongoid/association/builders.rb +4 -2
  9. data/lib/mongoid/association/constrainable.rb +0 -1
  10. data/lib/mongoid/association/eager_loadable.rb +29 -7
  11. data/lib/mongoid/association/embedded/batchable.rb +33 -10
  12. data/lib/mongoid/association/embedded/cyclic.rb +1 -1
  13. data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
  14. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +2 -2
  15. data/lib/mongoid/association/embedded/embedded_in.rb +3 -2
  16. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
  17. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +1 -1
  18. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +65 -41
  19. data/lib/mongoid/association/embedded/embeds_many.rb +2 -2
  20. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +18 -4
  21. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +23 -4
  22. data/lib/mongoid/association/embedded/embeds_one.rb +3 -3
  23. data/lib/mongoid/association/macros.rb +28 -1
  24. data/lib/mongoid/association/many.rb +11 -7
  25. data/lib/mongoid/association/nested/many.rb +5 -4
  26. data/lib/mongoid/association/nested/nested_buildable.rb +4 -4
  27. data/lib/mongoid/association/nested/one.rb +5 -5
  28. data/lib/mongoid/association/one.rb +2 -2
  29. data/lib/mongoid/association/options.rb +9 -9
  30. data/lib/mongoid/association/proxy.rb +14 -3
  31. data/lib/mongoid/association/referenced/auto_save.rb +4 -3
  32. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  33. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  34. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +5 -6
  35. data/lib/mongoid/association/referenced/belongs_to.rb +2 -2
  36. data/lib/mongoid/association/referenced/counter_cache.rb +10 -10
  37. data/lib/mongoid/association/referenced/eager.rb +2 -2
  38. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +70 -13
  39. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +6 -3
  40. data/lib/mongoid/association/referenced/has_many/enumerable.rb +20 -24
  41. data/lib/mongoid/association/referenced/has_many/proxy.rb +26 -16
  42. data/lib/mongoid/association/referenced/has_many.rb +3 -3
  43. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  44. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +5 -5
  45. data/lib/mongoid/association/referenced/has_one/proxy.rb +9 -12
  46. data/lib/mongoid/association/referenced/has_one.rb +3 -3
  47. data/lib/mongoid/association/referenced/syncable.rb +4 -4
  48. data/lib/mongoid/association/reflections.rb +2 -2
  49. data/lib/mongoid/association/relatable.rb +44 -10
  50. data/lib/mongoid/association.rb +5 -5
  51. data/lib/mongoid/atomic/modifiers.rb +2 -2
  52. data/lib/mongoid/atomic.rb +7 -0
  53. data/lib/mongoid/attributes/dynamic.rb +3 -3
  54. data/lib/mongoid/attributes/nested.rb +5 -5
  55. data/lib/mongoid/attributes/processing.rb +37 -6
  56. data/lib/mongoid/attributes/projector.rb +1 -1
  57. data/lib/mongoid/attributes/readonly.rb +2 -2
  58. data/lib/mongoid/attributes.rb +43 -40
  59. data/lib/mongoid/cacheable.rb +2 -2
  60. data/lib/mongoid/changeable.rb +43 -10
  61. data/lib/mongoid/clients/options.rb +5 -1
  62. data/lib/mongoid/clients/sessions.rb +2 -14
  63. data/lib/mongoid/clients/validators/storage.rb +3 -3
  64. data/lib/mongoid/config/options.rb +3 -0
  65. data/lib/mongoid/config/validators/client.rb +6 -6
  66. data/lib/mongoid/config.rb +62 -17
  67. data/lib/mongoid/contextual/aggregable/memory.rb +24 -16
  68. data/lib/mongoid/contextual/aggregable/mongo.rb +5 -5
  69. data/lib/mongoid/contextual/aggregable/none.rb +1 -1
  70. data/lib/mongoid/contextual/atomic.rb +1 -1
  71. data/lib/mongoid/contextual/geo_near.rb +7 -7
  72. data/lib/mongoid/contextual/map_reduce.rb +2 -2
  73. data/lib/mongoid/contextual/memory.rb +180 -21
  74. data/lib/mongoid/contextual/mongo.rb +260 -217
  75. data/lib/mongoid/contextual/none.rb +67 -5
  76. data/lib/mongoid/contextual/queryable.rb +1 -1
  77. data/lib/mongoid/contextual.rb +2 -2
  78. data/lib/mongoid/copyable.rb +32 -8
  79. data/lib/mongoid/criteria/findable.rb +7 -4
  80. data/lib/mongoid/criteria/includable.rb +24 -20
  81. data/lib/mongoid/criteria/marshalable.rb +10 -2
  82. data/lib/mongoid/criteria/permission.rb +1 -1
  83. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -2
  84. data/lib/mongoid/criteria/queryable/extensions/array.rb +3 -14
  85. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
  86. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -2
  87. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
  88. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
  89. data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -15
  90. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -9
  91. data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
  92. data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
  93. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
  94. data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -1
  95. data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -14
  96. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -12
  97. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
  98. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
  99. data/lib/mongoid/criteria/queryable/key.rb +3 -3
  100. data/lib/mongoid/criteria/queryable/mergeable.rb +21 -0
  101. data/lib/mongoid/criteria/queryable/optional.rb +5 -11
  102. data/lib/mongoid/criteria/queryable/options.rb +2 -2
  103. data/lib/mongoid/criteria/queryable/pipeline.rb +1 -1
  104. data/lib/mongoid/criteria/queryable/selectable.rb +31 -37
  105. data/lib/mongoid/criteria/queryable/selector.rb +93 -8
  106. data/lib/mongoid/criteria/queryable/smash.rb +40 -7
  107. data/lib/mongoid/criteria/queryable/storable.rb +1 -1
  108. data/lib/mongoid/criteria/queryable.rb +12 -7
  109. data/lib/mongoid/criteria/scopable.rb +2 -2
  110. data/lib/mongoid/criteria/translator.rb +45 -0
  111. data/lib/mongoid/criteria.rb +16 -35
  112. data/lib/mongoid/deprecable.rb +37 -0
  113. data/lib/mongoid/deprecation.rb +25 -0
  114. data/lib/mongoid/document.rb +135 -34
  115. data/lib/mongoid/equality.rb +8 -8
  116. data/lib/mongoid/errors/document_not_found.rb +33 -12
  117. data/lib/mongoid/errors/invalid_config_option.rb +1 -1
  118. data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -1
  119. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  120. data/lib/mongoid/errors/invalid_field.rb +6 -2
  121. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  122. data/lib/mongoid/errors/invalid_relation.rb +1 -1
  123. data/lib/mongoid/errors/invalid_relation_option.rb +1 -1
  124. data/lib/mongoid/errors/invalid_session_use.rb +1 -1
  125. data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
  126. data/lib/mongoid/errors/mongoid_error.rb +3 -3
  127. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -1
  128. data/lib/mongoid/errors/no_client_database.rb +1 -1
  129. data/lib/mongoid/errors/no_client_hosts.rb +1 -1
  130. data/lib/mongoid/errors/readonly_attribute.rb +1 -1
  131. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  132. data/lib/mongoid/errors/unknown_attribute.rb +1 -1
  133. data/lib/mongoid/errors.rb +2 -2
  134. data/lib/mongoid/extensions/array.rb +9 -7
  135. data/lib/mongoid/extensions/big_decimal.rb +33 -10
  136. data/lib/mongoid/extensions/binary.rb +42 -0
  137. data/lib/mongoid/extensions/boolean.rb +8 -2
  138. data/lib/mongoid/extensions/date.rb +26 -20
  139. data/lib/mongoid/extensions/date_time.rb +1 -1
  140. data/lib/mongoid/extensions/false_class.rb +1 -1
  141. data/lib/mongoid/extensions/float.rb +7 -4
  142. data/lib/mongoid/extensions/hash.rb +37 -8
  143. data/lib/mongoid/extensions/integer.rb +7 -4
  144. data/lib/mongoid/extensions/module.rb +1 -1
  145. data/lib/mongoid/extensions/object.rb +8 -6
  146. data/lib/mongoid/extensions/range.rb +41 -10
  147. data/lib/mongoid/extensions/regexp.rb +11 -4
  148. data/lib/mongoid/extensions/set.rb +11 -4
  149. data/lib/mongoid/extensions/string.rb +11 -22
  150. data/lib/mongoid/extensions/symbol.rb +4 -15
  151. data/lib/mongoid/extensions/time.rb +27 -16
  152. data/lib/mongoid/extensions/time_with_zone.rb +1 -2
  153. data/lib/mongoid/extensions/true_class.rb +1 -1
  154. data/lib/mongoid/extensions.rb +1 -0
  155. data/lib/mongoid/factory.rb +55 -7
  156. data/lib/mongoid/fields/foreign_key.rb +11 -4
  157. data/lib/mongoid/fields/localized.rb +9 -4
  158. data/lib/mongoid/fields/standard.rb +7 -7
  159. data/lib/mongoid/fields/validators/macro.rb +3 -9
  160. data/lib/mongoid/fields.rb +233 -40
  161. data/lib/mongoid/findable.rb +34 -13
  162. data/lib/mongoid/indexable/specification.rb +2 -2
  163. data/lib/mongoid/indexable/validators/options.rb +6 -2
  164. data/lib/mongoid/interceptable.rb +185 -16
  165. data/lib/mongoid/matchable.rb +1 -1
  166. data/lib/mongoid/matcher.rb +33 -13
  167. data/lib/mongoid/persistable/creatable.rb +18 -9
  168. data/lib/mongoid/persistable/deletable.rb +1 -1
  169. data/lib/mongoid/persistable/destroyable.rb +1 -1
  170. data/lib/mongoid/persistable/savable.rb +2 -2
  171. data/lib/mongoid/persistable/unsettable.rb +1 -1
  172. data/lib/mongoid/persistable/updatable.rb +19 -12
  173. data/lib/mongoid/persistable/upsertable.rb +1 -1
  174. data/lib/mongoid/persistable.rb +3 -3
  175. data/lib/mongoid/persistence_context.rb +63 -10
  176. data/lib/mongoid/query_cache.rb +8 -260
  177. data/lib/mongoid/railties/controller_runtime.rb +1 -1
  178. data/lib/mongoid/reloadable.rb +10 -8
  179. data/lib/mongoid/scopable.rb +26 -22
  180. data/lib/mongoid/selectable.rb +1 -2
  181. data/lib/mongoid/serializable.rb +10 -6
  182. data/lib/mongoid/shardable.rb +35 -11
  183. data/lib/mongoid/stateful.rb +35 -9
  184. data/lib/mongoid/tasks/database.rb +0 -2
  185. data/lib/mongoid/threaded/lifecycle.rb +5 -5
  186. data/lib/mongoid/threaded.rb +42 -12
  187. data/lib/mongoid/timestamps/created.rb +1 -1
  188. data/lib/mongoid/timestamps/updated.rb +2 -2
  189. data/lib/mongoid/touchable.rb +2 -3
  190. data/lib/mongoid/traversable.rb +5 -4
  191. data/lib/mongoid/validatable/localizable.rb +1 -1
  192. data/lib/mongoid/validatable/macros.rb +0 -2
  193. data/lib/mongoid/validatable/presence.rb +2 -2
  194. data/lib/mongoid/validatable/uniqueness.rb +9 -8
  195. data/lib/mongoid/validatable.rb +6 -6
  196. data/lib/mongoid/version.rb +1 -1
  197. data/lib/mongoid/warnings.rb +28 -0
  198. data/lib/mongoid.rb +2 -0
  199. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +4 -3
  200. data/spec/config/mongoid.yml +16 -0
  201. data/spec/integration/app_spec.rb +8 -12
  202. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  203. data/spec/integration/associations/embedded_spec.rb +15 -0
  204. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  205. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  206. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  207. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  208. data/spec/integration/associations/has_one_spec.rb +97 -1
  209. data/spec/integration/associations/scope_option_spec.rb +1 -1
  210. data/spec/integration/callbacks_models.rb +95 -1
  211. data/spec/integration/callbacks_spec.rb +246 -4
  212. data/spec/integration/criteria/range_spec.rb +95 -1
  213. data/spec/integration/discriminator_key_spec.rb +115 -76
  214. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  215. data/spec/integration/i18n_fallbacks_spec.rb +1 -17
  216. data/spec/integration/matcher_examples_spec.rb +20 -13
  217. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  218. data/spec/integration/matcher_operator_spec.rb +3 -5
  219. data/spec/integration/persistence/range_field_spec.rb +350 -0
  220. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  221. data/spec/mongoid/association/depending_spec.rb +9 -9
  222. data/spec/mongoid/association/eager_spec.rb +2 -1
  223. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  224. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  225. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +69 -9
  226. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  227. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +235 -40
  228. data/spec/mongoid/association/embedded/embeds_many_models.rb +36 -0
  229. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
  230. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  231. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  232. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  233. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  234. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  235. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  236. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
  237. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  238. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2 -2
  239. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +202 -201
  240. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  241. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  242. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  243. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +8 -8
  244. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +160 -119
  245. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  246. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  247. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  248. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  249. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  250. data/spec/mongoid/association/syncable_spec.rb +14 -0
  251. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  252. data/spec/mongoid/attributes/nested_spec.rb +80 -11
  253. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  254. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  255. data/spec/mongoid/attributes_spec.rb +551 -27
  256. data/spec/mongoid/cacheable_spec.rb +3 -3
  257. data/spec/mongoid/changeable_spec.rb +130 -13
  258. data/spec/mongoid/clients/factory_spec.rb +23 -30
  259. data/spec/mongoid/clients/options_spec.rb +1 -0
  260. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  261. data/spec/mongoid/clients_spec.rb +57 -2
  262. data/spec/mongoid/config_spec.rb +78 -18
  263. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  264. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  265. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  266. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  267. data/spec/mongoid/contextual/memory_spec.rb +1336 -69
  268. data/spec/mongoid/contextual/mongo_spec.rb +1253 -247
  269. data/spec/mongoid/contextual/none_spec.rb +38 -0
  270. data/spec/mongoid/copyable_spec.rb +451 -1
  271. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  272. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  273. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  274. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  275. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  276. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  277. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  278. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  279. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  280. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  281. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +0 -59
  282. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
  283. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  284. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  285. data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -484
  286. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +50 -0
  287. data/spec/mongoid/criteria/queryable/selectable_spec.rb +289 -124
  288. data/spec/mongoid/criteria/queryable/selector_spec.rb +89 -4
  289. data/spec/mongoid/criteria/queryable/storable_spec.rb +72 -0
  290. data/spec/mongoid/criteria/translator_spec.rb +132 -0
  291. data/spec/mongoid/criteria_projection_spec.rb +0 -1
  292. data/spec/mongoid/criteria_spec.rb +475 -1199
  293. data/spec/mongoid/document_fields_spec.rb +173 -24
  294. data/spec/mongoid/document_spec.rb +32 -41
  295. data/spec/mongoid/errors/document_not_found_spec.rb +76 -0
  296. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  297. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  298. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  299. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  300. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  301. data/spec/mongoid/extensions/array_spec.rb +16 -2
  302. data/spec/mongoid/extensions/big_decimal_spec.rb +712 -212
  303. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  304. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  305. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  306. data/spec/mongoid/extensions/date_spec.rb +71 -1
  307. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  308. data/spec/mongoid/extensions/float_spec.rb +53 -74
  309. data/spec/mongoid/extensions/hash_spec.rb +33 -3
  310. data/spec/mongoid/extensions/integer_spec.rb +50 -64
  311. data/spec/mongoid/extensions/range_spec.rb +255 -54
  312. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  313. data/spec/mongoid/extensions/set_spec.rb +106 -0
  314. data/spec/mongoid/extensions/string_spec.rb +53 -25
  315. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  316. data/spec/mongoid/extensions/time_spec.rb +634 -66
  317. data/spec/mongoid/extensions/time_with_zone_spec.rb +17 -31
  318. data/spec/mongoid/factory_spec.rb +61 -1
  319. data/spec/mongoid/fields/localized_spec.rb +37 -12
  320. data/spec/mongoid/fields_spec.rb +364 -50
  321. data/spec/mongoid/findable_spec.rb +80 -15
  322. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  323. data/spec/mongoid/indexable_spec.rb +39 -20
  324. data/spec/mongoid/interceptable_spec.rb +807 -27
  325. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  326. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  327. data/spec/mongoid/mongoizable_spec.rb +285 -0
  328. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  329. data/spec/mongoid/persistable/deletable_spec.rb +2 -2
  330. data/spec/mongoid/persistable/destroyable_spec.rb +2 -2
  331. data/spec/mongoid/persistable/upsertable_spec.rb +14 -0
  332. data/spec/mongoid/persistence_context_spec.rb +50 -1
  333. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  334. data/spec/mongoid/query_cache_spec.rb +0 -154
  335. data/spec/mongoid/reloadable_spec.rb +59 -2
  336. data/spec/mongoid/scopable_spec.rb +54 -16
  337. data/spec/mongoid/shardable_models.rb +14 -0
  338. data/spec/mongoid/shardable_spec.rb +157 -51
  339. data/spec/mongoid/stateful_spec.rb +28 -0
  340. data/spec/mongoid/timestamps_spec.rb +390 -0
  341. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  342. data/spec/mongoid/touchable_spec.rb +116 -0
  343. data/spec/mongoid/touchable_spec_models.rb +12 -8
  344. data/spec/mongoid/traversable_spec.rb +4 -11
  345. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  346. data/spec/mongoid/validatable/uniqueness_spec.rb +59 -31
  347. data/spec/mongoid/warnings_spec.rb +35 -0
  348. data/spec/mongoid_spec.rb +1 -1
  349. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  350. data/spec/rails/mongoid_spec.rb +4 -16
  351. data/spec/shared/lib/mrss/docker_runner.rb +7 -0
  352. data/spec/shared/lib/mrss/lite_constraints.rb +10 -2
  353. data/spec/shared/lib/mrss/server_version_registry.rb +16 -23
  354. data/spec/shared/lib/mrss/utils.rb +28 -6
  355. data/spec/shared/share/Dockerfile.erb +36 -40
  356. data/spec/shared/shlib/server.sh +32 -8
  357. data/spec/shared/shlib/set_env.sh +4 -4
  358. data/spec/support/constraints.rb +24 -0
  359. data/spec/support/macros.rb +46 -0
  360. data/spec/support/models/augmentation.rb +12 -0
  361. data/spec/support/models/band.rb +3 -0
  362. data/spec/support/models/catalog.rb +24 -0
  363. data/spec/support/models/circus.rb +3 -0
  364. data/spec/support/models/code.rb +2 -0
  365. data/spec/support/models/fanatic.rb +8 -0
  366. data/spec/support/models/implant.rb +9 -0
  367. data/spec/support/models/label.rb +2 -0
  368. data/spec/support/models/passport.rb +9 -0
  369. data/spec/support/models/person.rb +2 -0
  370. data/spec/support/models/player.rb +2 -0
  371. data/spec/support/models/powerup.rb +12 -0
  372. data/spec/support/models/purse.rb +9 -0
  373. data/spec/support/models/registry.rb +1 -0
  374. data/spec/support/models/school.rb +14 -0
  375. data/spec/support/models/shield.rb +18 -0
  376. data/spec/support/models/student.rb +14 -0
  377. data/spec/support/models/weapon.rb +12 -0
  378. data.tar.gz.sig +4 -1
  379. metadata +682 -635
  380. metadata.gz.sig +0 -0
  381. data/lib/mongoid/errors/eager_load.rb +0 -23
  382. data/lib/mongoid/errors/invalid_value.rb +0 -17
  383. data/spec/mongoid/errors/eager_load_spec.rb +0 -31
@@ -393,6 +393,22 @@ describe Mongoid::Fields do
393
393
  it "converts :time to Time" do
394
394
  expect(klass.field(:test, type: :time).type).to be(Time)
395
395
  end
396
+
397
+ context 'when using an unknown symbol' do
398
+ it 'raises InvalidFieldType' do
399
+ lambda do
400
+ klass.field(:test, type: :bogus)
401
+ end.should raise_error(Mongoid::Errors::InvalidFieldType, /defines a field 'test' with an unknown type value :bogus/)
402
+ end
403
+ end
404
+
405
+ context 'when using an unknown string' do
406
+ it 'raises InvalidFieldType' do
407
+ lambda do
408
+ klass.field(:test, type: 'bogus')
409
+ end.should raise_error(Mongoid::Errors::InvalidFieldType, /defines a field 'test' with an unknown type value "bogus"/)
410
+ end
411
+ end
396
412
  end
397
413
 
398
414
  context "when the options are valid" do
@@ -427,25 +443,25 @@ describe Mongoid::Fields do
427
443
  context "when the Symbol type is used" do
428
444
 
429
445
  before do
430
- Mongoid::Fields::Validators::Macro.class_eval do
431
- @field_type_is_symbol_warned = false
446
+ Mongoid::Warnings.class_eval do
447
+ @symbol_type_deprecated = false
432
448
  end
433
449
  end
434
450
 
435
451
  after do
436
- Band.fields.delete("should_warn")
452
+ Label.fields.delete("should_warn")
437
453
  end
438
454
 
439
455
  it "warns that the BSON symbol type is deprecated" do
440
456
  expect(Mongoid.logger).to receive(:warn)
441
457
 
442
- Band.field :should_warn, type: Symbol
458
+ Label.field :should_warn, type: Symbol
443
459
  end
444
460
 
445
461
  it "warns on first use of Symbol type only" do
446
462
  expect(Mongoid.logger).to receive(:warn).once
447
463
 
448
- Band.field :should_warn, type: Symbol
464
+ Label.field :should_warn, type: Symbol
449
465
  end
450
466
 
451
467
  context 'when using Symbol field type in multiple classes' do
@@ -456,7 +472,7 @@ describe Mongoid::Fields do
456
472
  it "warns on first use of Symbol type only" do
457
473
  expect(Mongoid.logger).to receive(:warn).once
458
474
 
459
- Band.field :should_warn, type: Symbol
475
+ Label.field :should_warn, type: Symbol
460
476
  Truck.field :should_warn, type: Symbol
461
477
  end
462
478
  end
@@ -466,7 +482,7 @@ describe Mongoid::Fields do
466
482
 
467
483
  it "raises an error" do
468
484
  expect {
469
- Band.field :unacceptable, bad: true
485
+ Label.field :unacceptable, bad: true
470
486
  }.to raise_error(Mongoid::Errors::InvalidFieldOption)
471
487
  end
472
488
  end
@@ -551,6 +567,49 @@ describe Mongoid::Fields do
551
567
  end
552
568
  end
553
569
  end
570
+
571
+ context 'when the field is declared as BSON::Decimal128' do
572
+ let(:document) { Mop.create!(decimal128_field: BSON::Decimal128.new(Math::PI.to_s)).reload }
573
+
574
+ shared_context 'BSON::Decimal128 is BigDecimal' do
575
+ it 'should return a BigDecimal' do
576
+ expect(document.decimal128_field).to be_a BigDecimal
577
+ end
578
+ end
579
+
580
+ shared_context 'BSON::Decimal128 is BSON::Decimal128' do
581
+ it 'should return a BSON::Decimal128' do
582
+ expect(document.decimal128_field).to be_a BSON::Decimal128
583
+ end
584
+ end
585
+
586
+ it 'is declared as BSON::Decimal128' do
587
+ expect(Mop.fields['decimal128_field'].type).to be == BSON::Decimal128
588
+ end
589
+
590
+ context 'when BSON version <= 4' do
591
+ max_bson_version '4.99.99'
592
+ it_behaves_like 'BSON::Decimal128 is BSON::Decimal128'
593
+ end
594
+
595
+ context 'when BSON version >= 5' do
596
+ min_bson_version '5.0.0'
597
+
598
+ context 'when allow_bson5_decimal128 is false' do
599
+ config_override :allow_bson5_decimal128, false
600
+ it_behaves_like 'BSON::Decimal128 is BigDecimal'
601
+ end
602
+
603
+ context 'when allow_bson5_decimal128 is true' do
604
+ config_override :allow_bson5_decimal128, true
605
+ it_behaves_like 'BSON::Decimal128 is BSON::Decimal128'
606
+ end
607
+
608
+ context 'when allow_bson5_decimal128 is default' do
609
+ it_behaves_like 'BSON::Decimal128 is BigDecimal'
610
+ end
611
+ end
612
+ end
554
613
  end
555
614
 
556
615
  describe "#getter_before_type_cast" do
@@ -568,8 +627,144 @@ describe Mongoid::Fields do
568
627
  context "when the attribute has been assigned" do
569
628
 
570
629
  it "returns the attribute before type cast" do
571
- person.age = "old"
572
- expect(person.age_before_type_cast).to eq("old")
630
+ person.age = "42"
631
+ expect(person.age_before_type_cast).to eq("42")
632
+ end
633
+ end
634
+
635
+ context "when reloading" do
636
+
637
+ let(:product) do
638
+ Product.create!(price: '1')
639
+ end
640
+
641
+ before do
642
+ product.reload
643
+ end
644
+
645
+ it "resets the attributes_before_type_cast to the attributes hash" do
646
+ expect(product.attributes_before_type_cast).to eq(product.attributes)
647
+ end
648
+
649
+ it "the *_before_type_cast method returns the demongoized value" do
650
+ expect(product.price_before_type_cast).to eq(1)
651
+ end
652
+ end
653
+
654
+ context "when reloading and writing a demongoizable value" do
655
+
656
+ let(:product) do
657
+ Product.create!.tap do |product|
658
+ Product.collection.update_one({ _id: product.id }, { :$set => { price: '1' }})
659
+ end
660
+ end
661
+
662
+ before do
663
+ product.reload
664
+ end
665
+
666
+ it "resets the attributes_before_type_cast to the attributes hash" do
667
+ expect(product.attributes_before_type_cast).to eq(product.attributes)
668
+ end
669
+
670
+ it "the *_before_type_cast method returns the mongoized value" do
671
+ expect(product.price_before_type_cast).to eq('1')
672
+ end
673
+ end
674
+
675
+ context "when reading from the db" do
676
+
677
+ let(:product) do
678
+ Product.create!(price: '1')
679
+ end
680
+
681
+ let(:from_db) do
682
+ Product.find(product.id)
683
+ end
684
+
685
+ it "resets the attributes_before_type_cast to the attributes hash" do
686
+ expect(from_db.attributes_before_type_cast).to eq(from_db.attributes)
687
+ end
688
+
689
+ it "the *_before_type_cast method returns the demongoized value" do
690
+ expect(from_db.price_before_type_cast).to eq(1)
691
+ end
692
+ end
693
+
694
+ context "when reading from the db after writing a demongoizable value" do
695
+
696
+ let(:product) do
697
+ Product.create!.tap do |product|
698
+ Product.collection.update_one({ _id: product.id }, { :$set => { price: '1' }})
699
+ end
700
+ end
701
+
702
+ let(:from_db) do
703
+ Product.find(product.id)
704
+ end
705
+
706
+ it "resets the attributes_before_type_cast to the attributes hash" do
707
+ expect(from_db.attributes_before_type_cast).to eq(from_db.attributes)
708
+ end
709
+
710
+ it "the *_before_type_cast method returns the mongoized value" do
711
+ expect(from_db.price_before_type_cast).to eq('1')
712
+ end
713
+ end
714
+
715
+ context "when making a new model" do
716
+
717
+ context "when using new with no options" do
718
+ let(:product) { Product.new }
719
+
720
+ it "sets the attributes_before_type_cast to the attributes hash" do
721
+ expect(product.attributes_before_type_cast).to eq(product.attributes)
722
+ end
723
+ end
724
+
725
+ context "when using new with options" do
726
+ let(:product) { Product.new(price: '1') }
727
+
728
+ let(:abtc) do
729
+ product.attributes.merge('price' => '1')
730
+ end
731
+
732
+ it "has the attributes before type cast" do
733
+ expect(product.attributes_before_type_cast).to eq(abtc)
734
+ end
735
+ end
736
+
737
+ context "when persisting the model" do
738
+ let(:product) { Product.new(price: '1') }
739
+
740
+ let(:abtc) do
741
+ product.attributes.merge('price' => '1')
742
+ end
743
+
744
+ before do
745
+ expect(product.attributes_before_type_cast).to eq(abtc)
746
+ product.save!
747
+ end
748
+
749
+ it "resets the attributes_before_type_cast to the attributes" do
750
+ expect(product.attributes_before_type_cast).to eq(product.attributes)
751
+ end
752
+ end
753
+
754
+ context "when using create! without options" do
755
+ let(:product) { Product.create! }
756
+
757
+ it "resets the attributes_before_type_cast to the attributes" do
758
+ expect(product.attributes_before_type_cast).to eq(product.attributes)
759
+ end
760
+ end
761
+
762
+ context "when using create! with options" do
763
+ let(:product) { Product.create!(price: '1') }
764
+
765
+ it "resets the attributes_before_type_cast to the attributes" do
766
+ expect(product.attributes_before_type_cast).to eq(product.attributes)
767
+ end
573
768
  end
574
769
  end
575
770
  end
@@ -725,6 +920,22 @@ describe Mongoid::Fields do
725
920
  end
726
921
  end
727
922
  end
923
+
924
+ context "when the field needs to be mongoized" do
925
+
926
+ before do
927
+ product.price = "1"
928
+ product.save!
929
+ end
930
+
931
+ it "mongoizes the value" do
932
+ expect(product.price).to eq(1)
933
+ end
934
+
935
+ it "stores the value in the mongoized form" do
936
+ expect(product.attributes_before_type_cast["price"]).to eq(1)
937
+ end
938
+ end
728
939
  end
729
940
 
730
941
  describe "#defaults" do
@@ -861,7 +1072,7 @@ describe Mongoid::Fields do
861
1072
  it "raises an error" do
862
1073
  expect {
863
1074
  Person.field(meth)
864
- }.to raise_error(Mongoid::Errors::InvalidField)
1075
+ }.to raise_error(Mongoid::Errors::InvalidField, /Defining a field named '#{meth}' is not allowed/)
865
1076
  end
866
1077
  end
867
1078
  end
@@ -988,7 +1199,7 @@ describe Mongoid::Fields do
988
1199
  end
989
1200
 
990
1201
  it "uses the alias to write the attribute" do
991
- (person.alias = expect(true)).to be true
1202
+ expect(person.alias = true).to be true
992
1203
  end
993
1204
 
994
1205
  it "uses the alias to read the attribute" do
@@ -1000,7 +1211,7 @@ describe Mongoid::Fields do
1000
1211
  end
1001
1212
 
1002
1213
  it "uses the name to write the attribute" do
1003
- (person.aliased = expect(true)).to be true
1214
+ expect(person.aliased = true).to be true
1004
1215
  end
1005
1216
 
1006
1217
  it "uses the name to read the attribute" do
@@ -1229,71 +1440,147 @@ describe Mongoid::Fields do
1229
1440
 
1230
1441
  context "when a field is defined as a big decimal" do
1231
1442
 
1232
- let(:band) do
1233
- Band.new(name: "Tool")
1234
- end
1235
-
1236
- let(:decimal) do
1237
- BigDecimal("1000000.00")
1238
- end
1443
+ context 'when Mongoid.map_big_decimal_to_decimal128 is false' do
1444
+ config_override :map_big_decimal_to_decimal128, false
1239
1445
 
1240
- context "when setting to a big decimal" do
1241
-
1242
- before do
1243
- band.sales = decimal
1446
+ let(:band) do
1447
+ Band.new(name: "Tool")
1244
1448
  end
1245
1449
 
1246
- it "properly persists as a string" do
1247
- expect(band.attributes["sales"]).to eq(decimal.to_s)
1450
+ let(:decimal) do
1451
+ BigDecimal("1000000.00")
1248
1452
  end
1249
1453
 
1250
- it "returns the proper big decimal" do
1251
- expect(band.sales).to eq(decimal)
1454
+ context "when setting to a big decimal" do
1455
+
1456
+ before do
1457
+ band.sales = decimal
1458
+ end
1459
+
1460
+ it "properly persists as a string" do
1461
+ expect(band.attributes["sales"]).to eq(decimal.to_s)
1462
+ end
1463
+
1464
+ it "returns the proper big decimal" do
1465
+ expect(band.sales).to eq(decimal)
1466
+ end
1252
1467
  end
1253
- end
1254
1468
 
1255
- context "when setting to a string" do
1469
+ context "when setting to a string" do
1256
1470
 
1257
- before do
1258
- band.sales = decimal.to_s
1471
+ before do
1472
+ band.sales = decimal.to_s
1473
+ end
1474
+
1475
+ it "properly persists as a string" do
1476
+ expect(band.attributes["sales"]).to eq(decimal.to_s)
1477
+ end
1478
+
1479
+ it "returns the proper big decimal" do
1480
+ expect(band.sales).to eq(decimal)
1481
+ end
1259
1482
  end
1260
1483
 
1261
- it "properly persists as a string" do
1262
- expect(band.attributes["sales"]).to eq(decimal.to_s)
1484
+ context "when setting to an integer" do
1485
+
1486
+ before do
1487
+ band.sales = decimal.to_i
1488
+ end
1489
+
1490
+ it "properly persists as a string" do
1491
+ expect(band.attributes["sales"]).to eq("1000000")
1492
+ end
1493
+
1494
+ it "returns the proper big decimal" do
1495
+ expect(band.sales).to eq(decimal)
1496
+ end
1263
1497
  end
1264
1498
 
1265
- it "returns the proper big decimal" do
1266
- expect(band.sales).to eq(decimal)
1499
+ context "when setting to a float" do
1500
+
1501
+ before do
1502
+ band.sales = decimal.to_f
1503
+ end
1504
+
1505
+ it "properly persists as a string" do
1506
+ expect(band.attributes["sales"]).to eq(decimal.to_s)
1507
+ end
1508
+
1509
+ it "returns the proper big decimal" do
1510
+ expect(band.sales).to eq(decimal)
1511
+ end
1267
1512
  end
1268
1513
  end
1269
1514
 
1270
- context "when setting to an integer" do
1515
+ context 'when Mongoid.map_big_decimal_to_decimal128 is true' do
1516
+ config_override :map_big_decimal_to_decimal128, true
1271
1517
 
1272
- before do
1273
- band.sales = decimal.to_i
1518
+ let(:band) do
1519
+ Band.new(name: "Tool")
1274
1520
  end
1275
1521
 
1276
- it "properly persists as a string" do
1277
- expect(band.attributes["sales"]).to eq("1000000")
1522
+ let(:decimal) do
1523
+ BigDecimal("1000000.00")
1278
1524
  end
1279
1525
 
1280
- it "returns the proper big decimal" do
1281
- expect(band.sales).to eq(decimal)
1526
+ context "when setting to a big decimal" do
1527
+
1528
+ before do
1529
+ band.sales = decimal
1530
+ end
1531
+
1532
+ it "properly persists as a BSON::Decimal128" do
1533
+ expect(band.attributes["sales"]).to eq(BSON::Decimal128.new(decimal))
1534
+ end
1535
+
1536
+ it "returns the proper big decimal" do
1537
+ expect(band.sales).to eq(decimal)
1538
+ end
1282
1539
  end
1283
- end
1284
1540
 
1285
- context "when setting to a float" do
1541
+ context "when setting to a string" do
1286
1542
 
1287
- before do
1288
- band.sales = decimal.to_f
1543
+ before do
1544
+ band.sales = decimal.to_s
1545
+ end
1546
+
1547
+ it "persists as a BSON::Decimal128" do
1548
+ expect(band.attributes["sales"]).to eq(BSON::Decimal128.new(decimal.to_s))
1549
+ end
1550
+
1551
+ it "returns the proper big decimal" do
1552
+ expect(band.sales).to eq(decimal)
1553
+ end
1289
1554
  end
1290
1555
 
1291
- it "properly persists as a string" do
1292
- expect(band.attributes["sales"]).to eq(decimal.to_s)
1556
+ context "when setting to an integer" do
1557
+
1558
+ before do
1559
+ band.sales = decimal.to_i
1560
+ end
1561
+
1562
+ it "persists as a BSON::Decimal128" do
1563
+ expect(band.attributes["sales"]).to eq(BSON::Decimal128.new(decimal.to_i.to_s))
1564
+ end
1565
+
1566
+ it "returns the proper big decimal" do
1567
+ expect(band.sales).to eq(decimal)
1568
+ end
1293
1569
  end
1294
1570
 
1295
- it "returns the proper big decimal" do
1296
- expect(band.sales).to eq(decimal)
1571
+ context "when setting to a float" do
1572
+
1573
+ before do
1574
+ band.sales = decimal.to_f
1575
+ end
1576
+
1577
+ it "properly persists as a BSON::Decimal128" do
1578
+ expect(band.attributes["sales"]).to eq(BSON::Decimal128.new(decimal.to_f.to_s))
1579
+ end
1580
+
1581
+ it "returns the proper big decimal" do
1582
+ expect(band.sales).to eq(decimal)
1583
+ end
1297
1584
  end
1298
1585
  end
1299
1586
  end
@@ -1620,6 +1907,33 @@ describe Mongoid::Fields do
1620
1907
  it_behaves_like 'pre-fix database_field_name'
1621
1908
  end
1622
1909
  end
1910
+
1911
+ context 'when getting the database field name of a belongs_to associations' do
1912
+ # These tests only apply when the flag is not set
1913
+ config_override :broken_alias_handling, false
1914
+
1915
+ context "when the broken_alias_handling is not set" do
1916
+ context "when the association is the last item" do
1917
+ let(:name) do
1918
+ Game.database_field_name("person")
1919
+ end
1920
+
1921
+ it "gets the alias" do
1922
+ expect(name).to eq("person_id")
1923
+ end
1924
+ end
1925
+
1926
+ context "when the association is not the last item" do
1927
+ let(:name) do
1928
+ Game.database_field_name("person.name")
1929
+ end
1930
+
1931
+ it "gets the alias" do
1932
+ expect(name).to eq("person.name")
1933
+ end
1934
+ end
1935
+ end
1936
+ end
1623
1937
  end
1624
1938
 
1625
1939
  describe "#get_field" do
@@ -85,7 +85,7 @@ describe Mongoid::Findable do
85
85
  it "raises an error" do
86
86
  expect {
87
87
  person.messages.find_by(body: 'bar')
88
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
88
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document not found for class Message with attributes/)
89
89
  end
90
90
  end
91
91
 
@@ -144,7 +144,7 @@ describe Mongoid::Findable do
144
144
  it "raises an error" do
145
145
  expect {
146
146
  Person.find_by(ssn: "333-22-1111")
147
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
147
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document not found for class Person with attributes/)
148
148
  end
149
149
  end
150
150
 
@@ -213,7 +213,7 @@ describe Mongoid::Findable do
213
213
  it "raises an error" do
214
214
  expect {
215
215
  Person.find_by!(ssn: "333-22-1111")
216
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
216
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document not found for class Person with attributes/)
217
217
  end
218
218
  end
219
219
  end
@@ -229,6 +229,24 @@ describe Mongoid::Findable do
229
229
  it "returns the first matching document" do
230
230
  expect(Person.send(method)).to eq(person)
231
231
  end
232
+
233
+ it "passes the limit through" do
234
+ expect(Person.last(1)).to eq([ person ])
235
+ end
236
+ end
237
+ end
238
+
239
+ describe "#last" do
240
+ let!(:person) do
241
+ Person.create!
242
+ end
243
+
244
+ it "returns the first matching document" do
245
+ expect(Person.last).to eq(person)
246
+ end
247
+
248
+ it "passes the limit through" do
249
+ expect(Person.last(1)).to eq([ person ])
232
250
  end
233
251
  end
234
252
 
@@ -472,7 +490,7 @@ describe Mongoid::Findable do
472
490
  Band.pluck(:follows)
473
491
  end
474
492
 
475
- it "returns a array with nil values" do
493
+ it "returns an array with nil values" do
476
494
  expect(plucked).to eq([nil, nil, nil])
477
495
  end
478
496
  end
@@ -521,10 +539,10 @@ describe Mongoid::Findable do
521
539
  end
522
540
 
523
541
  context 'when Mongoid is configured to use activesupport time zone' do
542
+ config_override :use_utc, false
543
+ config_override :use_activesupport_time_zone, true
524
544
 
525
545
  before do
526
- Mongoid.use_utc = false
527
- Mongoid.use_activesupport_time_zone = true
528
546
  Time.zone = "Asia/Kolkata"
529
547
  end
530
548
 
@@ -534,8 +552,33 @@ describe Mongoid::Findable do
534
552
  end
535
553
  end
536
554
 
537
- it 'uses activesupport time zone' do
538
- expect(User.distinct(:last_login).first.to_s).to eql(time.in_time_zone('Asia/Kolkata').to_s)
555
+ context 'when distinct does not demongoize' do
556
+ config_override :legacy_pluck_distinct, true
557
+
558
+ let(:distinct) do
559
+ User.distinct(:last_login).first
560
+ end
561
+
562
+ it 'uses activesupport time zone' do
563
+ distinct.should be_a(ActiveSupport::TimeWithZone)
564
+ expect(distinct.to_s).to eql(time.in_time_zone('Asia/Kolkata').to_s)
565
+ end
566
+ end
567
+
568
+ context 'when distinct demongoizes' do
569
+ config_override :legacy_pluck_distinct, false
570
+
571
+ let(:distinct) do
572
+ User.distinct(:last_login).first
573
+ end
574
+
575
+ it 'uses activesupport time zone' do
576
+ distinct.should be_a(DateTime)
577
+ # Time and DateTime have different stringifications:
578
+ # 2022-03-16T21:12:32+00:00
579
+ # 2022-03-16 21:12:32 UTC
580
+ expect(distinct.to_s).to eql(time.in_time_zone('Asia/Kolkata').to_datetime.to_s)
581
+ end
539
582
  end
540
583
 
541
584
  it 'loads other fields accurately' do
@@ -544,11 +587,8 @@ describe Mongoid::Findable do
544
587
  end
545
588
 
546
589
  context 'when Mongoid is not configured to use activesupport time zone' do
547
-
548
- before do
549
- Mongoid.use_utc = true
550
- Mongoid.use_activesupport_time_zone = false
551
- end
590
+ config_override :use_utc, true
591
+ config_override :use_activesupport_time_zone, false
552
592
 
553
593
  let!(:time) do
554
594
  Time.now.tap do |t|
@@ -556,8 +596,33 @@ describe Mongoid::Findable do
556
596
  end
557
597
  end
558
598
 
559
- it 'uses utc' do
560
- expect(User.distinct(:last_login).first.to_s).to eql(time.utc.to_s)
599
+ context 'when distinct does not demongoize' do
600
+ config_override :legacy_pluck_distinct, true
601
+
602
+ let(:distinct) do
603
+ User.distinct(:last_login).first
604
+ end
605
+
606
+ it 'uses utc' do
607
+ distinct.should be_a(Time)
608
+ expect(distinct.to_s).to eql(time.utc.to_s)
609
+ end
610
+ end
611
+
612
+ context 'when distinct demongoizes' do
613
+ config_override :legacy_pluck_distinct, false
614
+
615
+ let(:distinct) do
616
+ User.distinct(:last_login).first
617
+ end
618
+
619
+ it 'uses utc' do
620
+ distinct.should be_a(DateTime)
621
+ # Time and DateTime have different stringifications:
622
+ # 2022-03-16T21:12:32+00:00
623
+ # 2022-03-16 21:12:32 UTC
624
+ expect(distinct.to_s).to eql(time.utc.to_datetime.to_s)
625
+ end
561
626
  end
562
627
 
563
628
  it 'loads other fields accurately' do