mongoid 7.5.4 → 8.1.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 (442) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +3 -3
  3. data/README.md +6 -6
  4. data/Rakefile +44 -46
  5. data/lib/config/locales/en.yml +92 -43
  6. data/lib/mongoid/association/accessors.rb +44 -11
  7. data/lib/mongoid/association/bindable.rb +50 -2
  8. data/lib/mongoid/association/builders.rb +5 -3
  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 +34 -11
  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/buildable.rb +2 -2
  15. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +4 -3
  16. data/lib/mongoid/association/embedded/embedded_in.rb +3 -2
  17. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
  18. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +4 -3
  19. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +85 -46
  20. data/lib/mongoid/association/embedded/embeds_many.rb +2 -2
  21. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +19 -5
  22. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +24 -5
  23. data/lib/mongoid/association/embedded/embeds_one.rb +3 -3
  24. data/lib/mongoid/association/macros.rb +8 -1
  25. data/lib/mongoid/association/many.rb +11 -7
  26. data/lib/mongoid/association/nested/many.rb +5 -4
  27. data/lib/mongoid/association/nested/nested_buildable.rb +4 -4
  28. data/lib/mongoid/association/nested/one.rb +45 -7
  29. data/lib/mongoid/association/one.rb +2 -2
  30. data/lib/mongoid/association/options.rb +9 -9
  31. data/lib/mongoid/association/proxy.rb +15 -4
  32. data/lib/mongoid/association/referenced/auto_save.rb +4 -3
  33. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  34. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  35. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +5 -6
  36. data/lib/mongoid/association/referenced/belongs_to.rb +2 -2
  37. data/lib/mongoid/association/referenced/counter_cache.rb +10 -10
  38. data/lib/mongoid/association/referenced/eager.rb +2 -2
  39. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +70 -13
  40. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +6 -3
  41. data/lib/mongoid/association/referenced/has_many/enumerable.rb +22 -30
  42. data/lib/mongoid/association/referenced/has_many/proxy.rb +40 -21
  43. data/lib/mongoid/association/referenced/has_many.rb +3 -3
  44. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  45. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +5 -5
  46. data/lib/mongoid/association/referenced/has_one/proxy.rb +9 -12
  47. data/lib/mongoid/association/referenced/has_one.rb +3 -3
  48. data/lib/mongoid/association/referenced/syncable.rb +4 -4
  49. data/lib/mongoid/association/reflections.rb +4 -4
  50. data/lib/mongoid/association/relatable.rb +44 -10
  51. data/lib/mongoid/association.rb +5 -5
  52. data/lib/mongoid/atomic/modifiers.rb +2 -2
  53. data/lib/mongoid/atomic.rb +16 -7
  54. data/lib/mongoid/attributes/dynamic.rb +4 -4
  55. data/lib/mongoid/attributes/nested.rb +6 -6
  56. data/lib/mongoid/attributes/processing.rb +37 -6
  57. data/lib/mongoid/attributes/projector.rb +2 -2
  58. data/lib/mongoid/attributes/readonly.rb +3 -3
  59. data/lib/mongoid/attributes.rb +51 -42
  60. data/lib/mongoid/changeable.rb +147 -14
  61. data/lib/mongoid/clients/options.rb +5 -1
  62. data/lib/mongoid/clients/sessions.rb +2 -14
  63. data/lib/mongoid/clients/storage_options.rb +2 -5
  64. data/lib/mongoid/clients/validators/storage.rb +3 -15
  65. data/lib/mongoid/collection_configurable.rb +58 -0
  66. data/lib/mongoid/composable.rb +2 -0
  67. data/lib/mongoid/config/defaults.rb +60 -0
  68. data/lib/mongoid/config/options.rb +3 -0
  69. data/lib/mongoid/config/validators/async_query_executor.rb +24 -0
  70. data/lib/mongoid/config/validators/client.rb +6 -6
  71. data/lib/mongoid/config/validators.rb +1 -0
  72. data/lib/mongoid/config.rb +153 -18
  73. data/lib/mongoid/contextual/aggregable/memory.rb +24 -16
  74. data/lib/mongoid/contextual/aggregable/mongo.rb +5 -5
  75. data/lib/mongoid/contextual/aggregable/none.rb +1 -1
  76. data/lib/mongoid/contextual/atomic.rb +1 -1
  77. data/lib/mongoid/contextual/geo_near.rb +7 -7
  78. data/lib/mongoid/contextual/map_reduce.rb +2 -2
  79. data/lib/mongoid/contextual/memory.rb +285 -58
  80. data/lib/mongoid/contextual/mongo/documents_loader.rb +177 -0
  81. data/lib/mongoid/contextual/mongo.rb +540 -346
  82. data/lib/mongoid/contextual/none.rb +193 -20
  83. data/lib/mongoid/contextual/queryable.rb +1 -1
  84. data/lib/mongoid/contextual.rb +14 -2
  85. data/lib/mongoid/copyable.rb +32 -8
  86. data/lib/mongoid/criteria/findable.rb +8 -5
  87. data/lib/mongoid/criteria/includable.rb +27 -22
  88. data/lib/mongoid/criteria/marshalable.rb +10 -2
  89. data/lib/mongoid/criteria/permission.rb +1 -1
  90. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -2
  91. data/lib/mongoid/criteria/queryable/extensions/array.rb +3 -16
  92. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
  93. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -2
  94. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
  95. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
  96. data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -17
  97. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +15 -9
  98. data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
  99. data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
  100. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
  101. data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -1
  102. data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -14
  103. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -12
  104. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
  105. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
  106. data/lib/mongoid/criteria/queryable/key.rb +4 -4
  107. data/lib/mongoid/criteria/queryable/mergeable.rb +1 -1
  108. data/lib/mongoid/criteria/queryable/optional.rb +11 -17
  109. data/lib/mongoid/criteria/queryable/options.rb +2 -2
  110. data/lib/mongoid/criteria/queryable/pipeline.rb +1 -1
  111. data/lib/mongoid/criteria/queryable/selectable.rb +47 -38
  112. data/lib/mongoid/criteria/queryable/selector.rb +92 -7
  113. data/lib/mongoid/criteria/queryable/smash.rb +40 -7
  114. data/lib/mongoid/criteria/queryable.rb +12 -7
  115. data/lib/mongoid/criteria/scopable.rb +2 -2
  116. data/lib/mongoid/criteria/translator.rb +45 -0
  117. data/lib/mongoid/criteria.rb +20 -40
  118. data/lib/mongoid/deprecable.rb +37 -0
  119. data/lib/mongoid/deprecation.rb +25 -0
  120. data/lib/mongoid/document.rb +127 -35
  121. data/lib/mongoid/equality.rb +8 -8
  122. data/lib/mongoid/errors/create_collection_failure.rb +33 -0
  123. data/lib/mongoid/errors/document_not_found.rb +10 -6
  124. data/lib/mongoid/errors/drop_collection_failure.rb +27 -0
  125. data/lib/mongoid/errors/immutable_attribute.rb +26 -0
  126. data/lib/mongoid/errors/invalid_async_query_executor.rb +25 -0
  127. data/lib/mongoid/errors/invalid_config_option.rb +1 -1
  128. data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -1
  129. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  130. data/lib/mongoid/errors/invalid_field.rb +6 -2
  131. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  132. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +22 -0
  133. data/lib/mongoid/errors/invalid_relation.rb +1 -1
  134. data/lib/mongoid/errors/invalid_relation_option.rb +1 -1
  135. data/lib/mongoid/errors/invalid_session_use.rb +1 -1
  136. data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
  137. data/lib/mongoid/errors/invalid_storage_parent.rb +2 -0
  138. data/lib/mongoid/errors/mongoid_error.rb +3 -3
  139. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -1
  140. data/lib/mongoid/errors/no_client_database.rb +1 -1
  141. data/lib/mongoid/errors/no_client_hosts.rb +1 -1
  142. data/lib/mongoid/errors/readonly_attribute.rb +1 -1
  143. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  144. data/lib/mongoid/errors/unknown_attribute.rb +1 -1
  145. data/lib/mongoid/errors.rb +6 -3
  146. data/lib/mongoid/extensions/array.rb +9 -7
  147. data/lib/mongoid/extensions/big_decimal.rb +33 -10
  148. data/lib/mongoid/extensions/binary.rb +42 -0
  149. data/lib/mongoid/extensions/boolean.rb +8 -2
  150. data/lib/mongoid/extensions/date.rb +26 -20
  151. data/lib/mongoid/extensions/date_time.rb +1 -1
  152. data/lib/mongoid/extensions/false_class.rb +1 -1
  153. data/lib/mongoid/extensions/float.rb +7 -4
  154. data/lib/mongoid/extensions/hash.rb +38 -9
  155. data/lib/mongoid/extensions/integer.rb +7 -4
  156. data/lib/mongoid/extensions/module.rb +1 -1
  157. data/lib/mongoid/extensions/object.rb +10 -8
  158. data/lib/mongoid/extensions/range.rb +41 -10
  159. data/lib/mongoid/extensions/regexp.rb +11 -4
  160. data/lib/mongoid/extensions/set.rb +11 -4
  161. data/lib/mongoid/extensions/string.rb +11 -22
  162. data/lib/mongoid/extensions/symbol.rb +4 -15
  163. data/lib/mongoid/extensions/time.rb +29 -16
  164. data/lib/mongoid/extensions/time_with_zone.rb +1 -2
  165. data/lib/mongoid/extensions/true_class.rb +1 -1
  166. data/lib/mongoid/extensions.rb +1 -0
  167. data/lib/mongoid/factory.rb +55 -7
  168. data/lib/mongoid/fields/foreign_key.rb +11 -4
  169. data/lib/mongoid/fields/localized.rb +19 -4
  170. data/lib/mongoid/fields/standard.rb +17 -7
  171. data/lib/mongoid/fields/validators/macro.rb +3 -9
  172. data/lib/mongoid/fields.rb +142 -28
  173. data/lib/mongoid/findable.rb +54 -24
  174. data/lib/mongoid/indexable/specification.rb +2 -2
  175. data/lib/mongoid/indexable/validators/options.rb +6 -2
  176. data/lib/mongoid/interceptable.rb +186 -16
  177. data/lib/mongoid/matchable.rb +1 -1
  178. data/lib/mongoid/matcher/eq_impl.rb +1 -1
  179. data/lib/mongoid/matcher/type.rb +1 -1
  180. data/lib/mongoid/matcher.rb +48 -14
  181. data/lib/mongoid/persistable/creatable.rb +19 -9
  182. data/lib/mongoid/persistable/deletable.rb +2 -2
  183. data/lib/mongoid/persistable/destroyable.rb +1 -1
  184. data/lib/mongoid/persistable/savable.rb +14 -2
  185. data/lib/mongoid/persistable/unsettable.rb +2 -2
  186. data/lib/mongoid/persistable/updatable.rb +69 -12
  187. data/lib/mongoid/persistable/upsertable.rb +21 -2
  188. data/lib/mongoid/persistable.rb +6 -3
  189. data/lib/mongoid/persistence_context.rb +6 -4
  190. data/lib/mongoid/query_cache.rb +13 -261
  191. data/lib/mongoid/railties/controller_runtime.rb +1 -1
  192. data/lib/mongoid/railties/database.rake +7 -2
  193. data/lib/mongoid/reloadable.rb +10 -8
  194. data/lib/mongoid/scopable.rb +15 -13
  195. data/lib/mongoid/selectable.rb +1 -2
  196. data/lib/mongoid/serializable.rb +17 -13
  197. data/lib/mongoid/stateful.rb +57 -10
  198. data/lib/mongoid/tasks/database.rake +12 -0
  199. data/lib/mongoid/tasks/database.rb +20 -2
  200. data/lib/mongoid/threaded/lifecycle.rb +5 -5
  201. data/lib/mongoid/threaded.rb +42 -12
  202. data/lib/mongoid/timestamps/created.rb +1 -1
  203. data/lib/mongoid/timestamps/updated.rb +2 -2
  204. data/lib/mongoid/touchable.rb +3 -4
  205. data/lib/mongoid/traversable.rb +10 -5
  206. data/lib/mongoid/utils.rb +22 -0
  207. data/lib/mongoid/validatable/associated.rb +98 -17
  208. data/lib/mongoid/validatable/localizable.rb +1 -1
  209. data/lib/mongoid/validatable/macros.rb +5 -7
  210. data/lib/mongoid/validatable/presence.rb +2 -2
  211. data/lib/mongoid/validatable/uniqueness.rb +9 -8
  212. data/lib/mongoid/validatable.rb +17 -6
  213. data/lib/mongoid/version.rb +1 -1
  214. data/lib/mongoid/warnings.rb +19 -4
  215. data/lib/mongoid.rb +17 -3
  216. data/spec/config/mongoid.yml +16 -0
  217. data/spec/integration/app_spec.rb +24 -19
  218. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  219. data/spec/integration/associations/embedded_spec.rb +15 -0
  220. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  221. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  222. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  223. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +61 -0
  224. data/spec/integration/associations/has_one_spec.rb +97 -1
  225. data/spec/integration/associations/scope_option_spec.rb +1 -1
  226. data/spec/integration/callbacks_models.rb +132 -1
  227. data/spec/integration/callbacks_spec.rb +381 -4
  228. data/spec/integration/criteria/range_spec.rb +95 -1
  229. data/spec/integration/discriminator_key_spec.rb +118 -80
  230. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  231. data/spec/integration/i18n_fallbacks_spec.rb +3 -32
  232. data/spec/integration/matcher_examples_spec.rb +20 -13
  233. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  234. data/spec/integration/matcher_operator_spec.rb +3 -5
  235. data/spec/integration/persistence/range_field_spec.rb +350 -0
  236. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  237. data/spec/mongoid/association/depending_spec.rb +9 -9
  238. data/spec/mongoid/association/eager_spec.rb +2 -1
  239. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  240. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  241. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +96 -9
  242. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  243. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +290 -65
  244. data/spec/mongoid/association/embedded/embeds_many_models.rb +37 -0
  245. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +16 -0
  246. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  247. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  248. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +15 -2
  249. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  250. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  251. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  252. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  253. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +19 -0
  254. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  255. data/spec/mongoid/association/referenced/belongs_to_spec.rb +4 -20
  256. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +186 -229
  257. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  258. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  259. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  260. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
  261. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +215 -177
  262. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  263. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  264. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  265. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  266. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  267. data/spec/mongoid/association/syncable_spec.rb +15 -1
  268. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  269. data/spec/mongoid/attributes/nested_spec.rb +80 -11
  270. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  271. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  272. data/spec/mongoid/attributes_spec.rb +526 -33
  273. data/spec/mongoid/changeable_spec.rb +429 -37
  274. data/spec/mongoid/clients/factory_spec.rb +23 -30
  275. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  276. data/spec/mongoid/clients_spec.rb +149 -15
  277. data/spec/mongoid/collection_configurable_spec.rb +158 -0
  278. data/spec/mongoid/config/defaults_spec.rb +160 -0
  279. data/spec/mongoid/config_spec.rb +214 -31
  280. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  281. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  282. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  283. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  284. data/spec/mongoid/contextual/memory_spec.rb +850 -88
  285. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
  286. data/spec/mongoid/contextual/mongo_spec.rb +2256 -1005
  287. data/spec/mongoid/contextual/none_spec.rb +60 -21
  288. data/spec/mongoid/copyable_spec.rb +453 -11
  289. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  290. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  291. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  292. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  293. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  294. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  295. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  296. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  297. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  298. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  299. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +4 -69
  300. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
  301. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  302. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  303. data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -484
  304. data/spec/mongoid/criteria/queryable/options_spec.rb +1 -1
  305. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +469 -0
  306. data/spec/mongoid/criteria/queryable/selectable_spec.rb +78 -86
  307. data/spec/mongoid/criteria/queryable/selector_spec.rb +15 -3
  308. data/spec/mongoid/criteria/translator_spec.rb +132 -0
  309. data/spec/mongoid/criteria_projection_spec.rb +1 -5
  310. data/spec/mongoid/criteria_spec.rb +469 -1205
  311. data/spec/mongoid/document_fields_spec.rb +173 -24
  312. data/spec/mongoid/document_spec.rb +32 -41
  313. data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
  314. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  315. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  316. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  317. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  318. data/spec/mongoid/errors/readonly_document_spec.rb +2 -2
  319. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  320. data/spec/mongoid/extensions/array_spec.rb +16 -2
  321. data/spec/mongoid/extensions/big_decimal_spec.rb +712 -212
  322. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  323. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  324. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  325. data/spec/mongoid/extensions/date_spec.rb +71 -1
  326. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  327. data/spec/mongoid/extensions/float_spec.rb +53 -74
  328. data/spec/mongoid/extensions/hash_spec.rb +33 -3
  329. data/spec/mongoid/extensions/integer_spec.rb +50 -64
  330. data/spec/mongoid/extensions/range_spec.rb +255 -54
  331. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  332. data/spec/mongoid/extensions/set_spec.rb +106 -0
  333. data/spec/mongoid/extensions/string_spec.rb +53 -25
  334. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  335. data/spec/mongoid/extensions/time_spec.rb +639 -106
  336. data/spec/mongoid/extensions/time_with_zone_spec.rb +24 -83
  337. data/spec/mongoid/factory_spec.rb +61 -1
  338. data/spec/mongoid/fields/localized_spec.rb +80 -37
  339. data/spec/mongoid/fields_spec.rb +503 -87
  340. data/spec/mongoid/findable_spec.rb +450 -58
  341. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  342. data/spec/mongoid/indexable_spec.rb +55 -30
  343. data/spec/mongoid/interceptable_spec.rb +824 -22
  344. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  345. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  346. data/spec/mongoid/mongoizable_spec.rb +285 -0
  347. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  348. data/spec/mongoid/persistable/deletable_spec.rb +28 -8
  349. data/spec/mongoid/persistable/destroyable_spec.rb +28 -8
  350. data/spec/mongoid/persistable/incrementable_spec.rb +37 -0
  351. data/spec/mongoid/persistable/logical_spec.rb +37 -0
  352. data/spec/mongoid/persistable/poppable_spec.rb +36 -0
  353. data/spec/mongoid/persistable/pullable_spec.rb +72 -0
  354. data/spec/mongoid/persistable/pushable_spec.rb +72 -0
  355. data/spec/mongoid/persistable/renamable_spec.rb +36 -0
  356. data/spec/mongoid/persistable/savable_spec.rb +96 -0
  357. data/spec/mongoid/persistable/settable_spec.rb +37 -0
  358. data/spec/mongoid/persistable/unsettable_spec.rb +36 -0
  359. data/spec/mongoid/persistable/updatable_spec.rb +20 -28
  360. data/spec/mongoid/persistable/upsertable_spec.rb +89 -1
  361. data/spec/mongoid/persistence_context_spec.rb +31 -57
  362. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  363. data/spec/mongoid/query_cache_spec.rb +56 -215
  364. data/spec/mongoid/reloadable_spec.rb +83 -6
  365. data/spec/mongoid/scopable_spec.rb +91 -1
  366. data/spec/mongoid/serializable_spec.rb +25 -39
  367. data/spec/mongoid/shardable_spec.rb +4 -4
  368. data/spec/mongoid/stateful_spec.rb +150 -8
  369. data/spec/mongoid/tasks/database_rake_spec.rb +74 -0
  370. data/spec/mongoid/tasks/database_spec.rb +127 -0
  371. data/spec/mongoid/timestamps_spec.rb +392 -4
  372. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  373. data/spec/mongoid/touchable_spec.rb +390 -2
  374. data/spec/mongoid/touchable_spec_models.rb +14 -8
  375. data/spec/mongoid/traversable_spec.rb +13 -35
  376. data/spec/mongoid/validatable/associated_spec.rb +27 -34
  377. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  378. data/spec/mongoid/validatable/uniqueness_spec.rb +58 -31
  379. data/spec/mongoid/warnings_spec.rb +35 -0
  380. data/spec/mongoid_spec.rb +34 -16
  381. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  382. data/spec/rails/mongoid_spec.rb +4 -16
  383. data/spec/spec_helper.rb +5 -0
  384. data/spec/support/constraints.rb +24 -0
  385. data/spec/support/immutable_ids.rb +118 -0
  386. data/spec/support/macros.rb +78 -0
  387. data/spec/support/models/artist.rb +0 -1
  388. data/spec/support/models/augmentation.rb +12 -0
  389. data/spec/support/models/band.rb +5 -0
  390. data/spec/support/models/book.rb +1 -0
  391. data/spec/support/models/building.rb +2 -0
  392. data/spec/support/models/catalog.rb +24 -0
  393. data/spec/support/models/circus.rb +3 -0
  394. data/spec/support/models/cover.rb +10 -0
  395. data/spec/support/models/fanatic.rb +8 -0
  396. data/spec/support/models/implant.rb +9 -0
  397. data/spec/support/models/label.rb +2 -0
  398. data/spec/support/models/lat_lng.rb +6 -0
  399. data/spec/support/models/name.rb +10 -0
  400. data/spec/support/models/passport.rb +9 -0
  401. data/spec/support/models/person.rb +2 -0
  402. data/spec/support/models/player.rb +2 -0
  403. data/spec/support/models/powerup.rb +12 -0
  404. data/spec/support/models/product.rb +1 -0
  405. data/spec/support/models/purse.rb +9 -0
  406. data/spec/support/models/registry.rb +1 -0
  407. data/spec/support/models/school.rb +14 -0
  408. data/spec/support/models/shield.rb +18 -0
  409. data/spec/support/models/student.rb +14 -0
  410. data/spec/support/models/weapon.rb +12 -0
  411. metadata +101 -96
  412. checksums.yaml.gz.sig +0 -0
  413. data/lib/mongoid/errors/eager_load.rb +0 -23
  414. data/lib/mongoid/errors/invalid_value.rb +0 -17
  415. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -60
  416. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -60
  417. data/spec/mongoid/errors/eager_load_spec.rb +0 -31
  418. data/spec/shared/LICENSE +0 -20
  419. data/spec/shared/bin/get-mongodb-download-url +0 -17
  420. data/spec/shared/bin/s3-copy +0 -45
  421. data/spec/shared/bin/s3-upload +0 -69
  422. data/spec/shared/lib/mrss/child_process_helper.rb +0 -80
  423. data/spec/shared/lib/mrss/cluster_config.rb +0 -231
  424. data/spec/shared/lib/mrss/constraints.rb +0 -378
  425. data/spec/shared/lib/mrss/docker_runner.rb +0 -291
  426. data/spec/shared/lib/mrss/eg_config_utils.rb +0 -51
  427. data/spec/shared/lib/mrss/event_subscriber.rb +0 -210
  428. data/spec/shared/lib/mrss/lite_constraints.rb +0 -238
  429. data/spec/shared/lib/mrss/server_version_registry.rb +0 -120
  430. data/spec/shared/lib/mrss/session_registry.rb +0 -69
  431. data/spec/shared/lib/mrss/session_registry_legacy.rb +0 -60
  432. data/spec/shared/lib/mrss/spec_organizer.rb +0 -179
  433. data/spec/shared/lib/mrss/utils.rb +0 -15
  434. data/spec/shared/share/Dockerfile.erb +0 -325
  435. data/spec/shared/share/haproxy-1.conf +0 -16
  436. data/spec/shared/share/haproxy-2.conf +0 -17
  437. data/spec/shared/shlib/config.sh +0 -27
  438. data/spec/shared/shlib/distro.sh +0 -74
  439. data/spec/shared/shlib/server.sh +0 -392
  440. data/spec/shared/shlib/set_env.sh +0 -169
  441. data.tar.gz.sig +0 -0
  442. metadata.gz.sig +0 -3
@@ -75,27 +75,17 @@ describe Mongoid::Findable do
75
75
  context "when the document is not found" do
76
76
 
77
77
  context "when raising a not found error" do
78
-
79
- let!(:raise_option) { Mongoid.raise_not_found_error }
80
-
81
- before { Mongoid.raise_not_found_error = true }
82
-
83
- after { Mongoid.raise_not_found_error = raise_option }
78
+ config_override :raise_not_found_error, true
84
79
 
85
80
  it "raises an error" do
86
81
  expect {
87
82
  person.messages.find_by(body: 'bar')
88
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
83
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document not found for class Message with attributes/)
89
84
  end
90
85
  end
91
86
 
92
87
  context "when raising no error" do
93
-
94
- let!(:raise_option) { Mongoid.raise_not_found_error }
95
-
96
- before { Mongoid.raise_not_found_error = false }
97
-
98
- after { Mongoid.raise_not_found_error = raise_option }
88
+ config_override :raise_not_found_error, false
99
89
 
100
90
  it "returns nil" do
101
91
  expect(person.messages.find_by(body: 'bar')).to be_nil
@@ -134,27 +124,17 @@ describe Mongoid::Findable do
134
124
  context "when the document is not found" do
135
125
 
136
126
  context "when raising a not found error" do
137
-
138
- let!(:raise_option) { Mongoid.raise_not_found_error }
139
-
140
- before { Mongoid.raise_not_found_error = true }
141
-
142
- after { Mongoid.raise_not_found_error = raise_option }
127
+ config_override :raise_not_found_error, true
143
128
 
144
129
  it "raises an error" do
145
130
  expect {
146
131
  Person.find_by(ssn: "333-22-1111")
147
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
132
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document not found for class Person with attributes/)
148
133
  end
149
134
  end
150
135
 
151
136
  context "when raising no error" do
152
-
153
- let!(:raise_option) { Mongoid.raise_not_found_error }
154
-
155
- before { Mongoid.raise_not_found_error = false }
156
-
157
- after { Mongoid.raise_not_found_error = raise_option }
137
+ config_override :raise_not_found_error, false
158
138
 
159
139
  context "when no block is provided" do
160
140
 
@@ -213,7 +193,7 @@ describe Mongoid::Findable do
213
193
  it "raises an error" do
214
194
  expect {
215
195
  Person.find_by!(ssn: "333-22-1111")
216
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
196
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document not found for class Person with attributes/)
217
197
  end
218
198
  end
219
199
  end
@@ -222,43 +202,411 @@ describe Mongoid::Findable do
222
202
 
223
203
  describe "##{method}" do
224
204
 
225
- let!(:person) do
205
+ let!(:person1) do
226
206
  Person.create!
227
207
  end
228
208
 
229
- it "returns the first matching document" do
230
- expect(Person.send(method)).to eq(person)
209
+ let!(:person2) do
210
+ Person.create!
231
211
  end
232
212
 
233
- it "doen't raise when passing options" do
234
- expect do
235
- Person.first(id_sort: :none)
236
- end.to_not raise_error
213
+ it "returns the first matching document" do
214
+ expect(Person.send(method)).to eq(person1)
237
215
  end
238
216
 
239
217
  it "passes the limit through" do
240
- Person.first(1).length.should == 1
218
+ expect(Person.send(method, 1)).to eq([ person1 ])
219
+ end
220
+
221
+ it "returns nil when no documents are found" do
222
+ expect(Band.send(method)).to be_nil
241
223
  end
242
224
  end
243
225
  end
244
226
 
245
- describe "#last" do
246
- let!(:person) do
227
+ describe "#first!" do
228
+ let!(:person1) do
229
+ Person.create!
230
+ end
231
+
232
+ let!(:person2) do
247
233
  Person.create!
248
234
  end
249
235
 
250
236
  it "returns the first matching document" do
251
- expect(Person.last).to eq(person)
237
+ expect(Person.first!).to eq(person1)
252
238
  end
253
239
 
254
- it "doen't raise when passing options" do
240
+ it "raises an error when there are no documents" do
255
241
  expect do
256
- Person.last(id_sort: :none)
257
- end.to_not raise_error
242
+ Band.first!
243
+ end.to raise_error(Mongoid::Errors::DocumentNotFound, /Could not find a document of class Band./)
244
+ end
245
+ end
246
+
247
+ describe "#last" do
248
+ let!(:person1) do
249
+ Person.create!
250
+ end
251
+
252
+ let!(:person2) do
253
+ Person.create!
254
+ end
255
+
256
+ it "returns the first matching document" do
257
+ expect(Person.last).to eq(person2)
258
258
  end
259
259
 
260
260
  it "passes the limit through" do
261
- Person.last(1).length.should == 1
261
+ expect(Person.last(1)).to eq([ person2 ])
262
+ end
263
+
264
+ it "returns nil when no documents are found" do
265
+ expect(Band.last).to be_nil
266
+ end
267
+ end
268
+
269
+ describe "#last!" do
270
+ let!(:person1) do
271
+ Person.create!
272
+ end
273
+
274
+ let!(:person2) do
275
+ Person.create!
276
+ end
277
+
278
+ it "returns the last matching document" do
279
+ expect(Person.last!).to eq(person2)
280
+ end
281
+
282
+ it "raises an error when there are no documents" do
283
+ expect do
284
+ Band.last!
285
+ end.to raise_error(Mongoid::Errors::DocumentNotFound, /Could not find a document of class Band./)
286
+ end
287
+ end
288
+
289
+ describe "#second" do
290
+ let!(:person1) do
291
+ Person.create!
292
+ end
293
+
294
+ let!(:person2) do
295
+ Person.create!
296
+ end
297
+
298
+ it "returns the second matching document" do
299
+ expect(Person.second).to eq(person2)
300
+ end
301
+
302
+ it "returns nil when no documents are found" do
303
+ expect(Band.second).to be_nil
304
+ end
305
+ end
306
+
307
+ describe "#second!" do
308
+ let!(:person1) do
309
+ Person.create!
310
+ end
311
+
312
+ let!(:person2) do
313
+ Person.create!
314
+ end
315
+
316
+ it "returns the second matching document" do
317
+ expect(Person.second!).to eq(person2)
318
+ end
319
+
320
+ it "raises an error when there are no documents" do
321
+ expect do
322
+ Band.second!
323
+ end.to raise_error(Mongoid::Errors::DocumentNotFound, /Could not find a document of class Band./)
324
+ end
325
+ end
326
+
327
+ describe "#third" do
328
+ let!(:person1) do
329
+ Person.create!
330
+ end
331
+
332
+ let!(:person2) do
333
+ Person.create!
334
+ end
335
+
336
+ let!(:person3) do
337
+ Person.create!
338
+ end
339
+
340
+ it "returns the third matching document" do
341
+ expect(Person.third).to eq(person3)
342
+ end
343
+
344
+ it "returns nil when no documents are found" do
345
+ expect(Band.third).to be_nil
346
+ end
347
+ end
348
+
349
+ describe "#third!" do
350
+ let!(:person1) do
351
+ Person.create!
352
+ end
353
+
354
+ let!(:person2) do
355
+ Person.create!
356
+ end
357
+
358
+ let!(:person3) do
359
+ Person.create!
360
+ end
361
+
362
+ it "returns the third matching document" do
363
+ expect(Person.third!).to eq(person3)
364
+ end
365
+
366
+ it "raises an error when there are no documents" do
367
+ expect do
368
+ Band.third!
369
+ end.to raise_error(Mongoid::Errors::DocumentNotFound, /Could not find a document of class Band./)
370
+ end
371
+ end
372
+
373
+ describe "#fourth" do
374
+ let!(:person1) do
375
+ Person.create!
376
+ end
377
+
378
+ let!(:person2) do
379
+ Person.create!
380
+ end
381
+
382
+ let!(:person3) do
383
+ Person.create!
384
+ end
385
+
386
+ let!(:person4) do
387
+ Person.create!
388
+ end
389
+
390
+ it "returns the fourth matching document" do
391
+ expect(Person.fourth).to eq(person4)
392
+ end
393
+
394
+ it "returns nil when no documents are found" do
395
+ expect(Band.fourth).to be_nil
396
+ end
397
+ end
398
+
399
+ describe "#fourth!" do
400
+ let!(:person1) do
401
+ Person.create!
402
+ end
403
+
404
+ let!(:person2) do
405
+ Person.create!
406
+ end
407
+
408
+ let!(:person3) do
409
+ Person.create!
410
+ end
411
+
412
+ let!(:person4) do
413
+ Person.create!
414
+ end
415
+
416
+ it "returns the fourth matching document" do
417
+ expect(Person.fourth!).to eq(person4)
418
+ end
419
+
420
+ it "raises an error when there are no documents" do
421
+ expect do
422
+ Band.fourth!
423
+ end.to raise_error(Mongoid::Errors::DocumentNotFound, /Could not find a document of class Band./)
424
+ end
425
+ end
426
+
427
+ describe "#fifth" do
428
+ let!(:person1) do
429
+ Person.create!
430
+ end
431
+
432
+ let!(:person2) do
433
+ Person.create!
434
+ end
435
+
436
+ let!(:person3) do
437
+ Person.create!
438
+ end
439
+
440
+ let!(:person4) do
441
+ Person.create!
442
+ end
443
+
444
+ let!(:person5) do
445
+ Person.create!
446
+ end
447
+
448
+ it "returns the fifth matching document" do
449
+ expect(Person.fifth).to eq(person5)
450
+ end
451
+
452
+ it "returns nil when no documents are found" do
453
+ expect(Band.fifth).to be_nil
454
+ end
455
+ end
456
+
457
+ describe "#fifth!" do
458
+ let!(:person1) do
459
+ Person.create!
460
+ end
461
+
462
+ let!(:person2) do
463
+ Person.create!
464
+ end
465
+
466
+ let!(:person3) do
467
+ Person.create!
468
+ end
469
+
470
+ let!(:person4) do
471
+ Person.create!
472
+ end
473
+
474
+ let!(:person5) do
475
+ Person.create!
476
+ end
477
+
478
+ it "returns the fifth matching document" do
479
+ expect(Person.fifth!).to eq(person5)
480
+ end
481
+
482
+ it "raises an error when there are no documents" do
483
+ expect do
484
+ Band.fifth!
485
+ end.to raise_error(Mongoid::Errors::DocumentNotFound, /Could not find a document of class Band./)
486
+ end
487
+ end
488
+
489
+ describe "#second_to_last" do
490
+ let!(:person1) do
491
+ Person.create!
492
+ end
493
+
494
+ let!(:person2) do
495
+ Person.create!
496
+ end
497
+
498
+ let!(:person3) do
499
+ Person.create!
500
+ end
501
+
502
+ let!(:person4) do
503
+ Person.create!
504
+ end
505
+
506
+ let!(:person5) do
507
+ Person.create!
508
+ end
509
+
510
+ it "returns the second to last matching document" do
511
+ expect(Person.second_to_last).to eq(person4)
512
+ end
513
+
514
+ it "returns nil when no documents are found" do
515
+ expect(Band.second_to_last).to be_nil
516
+ end
517
+ end
518
+
519
+ describe "#second_to_last!" do
520
+ let!(:person1) do
521
+ Person.create!
522
+ end
523
+
524
+ let!(:person2) do
525
+ Person.create!
526
+ end
527
+
528
+ let!(:person3) do
529
+ Person.create!
530
+ end
531
+
532
+ let!(:person4) do
533
+ Person.create!
534
+ end
535
+
536
+ let!(:person5) do
537
+ Person.create!
538
+ end
539
+
540
+ it "returns the second to last matching document" do
541
+ expect(Person.second_to_last!).to eq(person4)
542
+ end
543
+
544
+ it "raises an error when there are no documents" do
545
+ expect do
546
+ Band.second_to_last!
547
+ end.to raise_error(Mongoid::Errors::DocumentNotFound, /Could not find a document of class Band./)
548
+ end
549
+ end
550
+
551
+ describe "#third_to_last" do
552
+ let!(:person1) do
553
+ Person.create!
554
+ end
555
+
556
+ let!(:person2) do
557
+ Person.create!
558
+ end
559
+
560
+ let!(:person3) do
561
+ Person.create!
562
+ end
563
+
564
+ let!(:person4) do
565
+ Person.create!
566
+ end
567
+
568
+ let!(:person5) do
569
+ Person.create!
570
+ end
571
+
572
+ it "returns the third to last matching document" do
573
+ expect(Person.third_to_last).to eq(person3)
574
+ end
575
+
576
+ it "returns nil when no documents are found" do
577
+ expect(Band.third_to_last).to be_nil
578
+ end
579
+ end
580
+
581
+ describe "#third_to_last!" do
582
+ let!(:person1) do
583
+ Person.create!
584
+ end
585
+
586
+ let!(:person2) do
587
+ Person.create!
588
+ end
589
+
590
+ let!(:person3) do
591
+ Person.create!
592
+ end
593
+
594
+ let!(:person4) do
595
+ Person.create!
596
+ end
597
+
598
+ let!(:person5) do
599
+ Person.create!
600
+ end
601
+
602
+ it "returns the third to last matching document" do
603
+ expect(Person.third_to_last!).to eq(person3)
604
+ end
605
+
606
+ it "raises an error when there are no documents" do
607
+ expect do
608
+ Band.third_to_last!
609
+ end.to raise_error(Mongoid::Errors::DocumentNotFound, /Could not find a document of class Band./)
262
610
  end
263
611
  end
264
612
 
@@ -502,7 +850,7 @@ describe Mongoid::Findable do
502
850
  Band.pluck(:follows)
503
851
  end
504
852
 
505
- it "returns a array with nil values" do
853
+ it "returns an array with nil values" do
506
854
  expect(plucked).to eq([nil, nil, nil])
507
855
  end
508
856
  end
@@ -551,12 +899,9 @@ describe Mongoid::Findable do
551
899
  end
552
900
 
553
901
  context 'when Mongoid is configured to use activesupport time zone' do
554
-
555
- before do
556
- Mongoid.use_utc = false
557
- Mongoid.use_activesupport_time_zone = true
558
- Time.zone = "Asia/Kolkata"
559
- end
902
+ config_override :use_utc, false
903
+ config_override :use_activesupport_time_zone, true
904
+ time_zone_override "Asia/Kolkata"
560
905
 
561
906
  let!(:time) do
562
907
  Time.zone.now.tap do |t|
@@ -564,8 +909,33 @@ describe Mongoid::Findable do
564
909
  end
565
910
  end
566
911
 
567
- it 'uses activesupport time zone' do
568
- expect(User.distinct(:last_login).first.to_s).to eql(time.in_time_zone('Asia/Kolkata').to_s)
912
+ context 'when distinct does not demongoize' do
913
+ config_override :legacy_pluck_distinct, true
914
+
915
+ let(:distinct) do
916
+ User.distinct(:last_login).first
917
+ end
918
+
919
+ it 'uses activesupport time zone' do
920
+ distinct.should be_a(ActiveSupport::TimeWithZone)
921
+ expect(distinct.to_s).to eql(time.in_time_zone('Asia/Kolkata').to_s)
922
+ end
923
+ end
924
+
925
+ context 'when distinct demongoizes' do
926
+ config_override :legacy_pluck_distinct, false
927
+
928
+ let(:distinct) do
929
+ User.distinct(:last_login).first
930
+ end
931
+
932
+ it 'uses activesupport time zone' do
933
+ distinct.should be_a(DateTime)
934
+ # Time and DateTime have different stringifications:
935
+ # 2022-03-16T21:12:32+00:00
936
+ # 2022-03-16 21:12:32 UTC
937
+ expect(distinct.to_s).to eql(time.in_time_zone('Asia/Kolkata').to_datetime.to_s)
938
+ end
569
939
  end
570
940
 
571
941
  it 'loads other fields accurately' do
@@ -574,11 +944,8 @@ describe Mongoid::Findable do
574
944
  end
575
945
 
576
946
  context 'when Mongoid is not configured to use activesupport time zone' do
577
-
578
- before do
579
- Mongoid.use_utc = true
580
- Mongoid.use_activesupport_time_zone = false
581
- end
947
+ config_override :use_utc, true
948
+ config_override :use_activesupport_time_zone, false
582
949
 
583
950
  let!(:time) do
584
951
  Time.now.tap do |t|
@@ -586,8 +953,33 @@ describe Mongoid::Findable do
586
953
  end
587
954
  end
588
955
 
589
- it 'uses utc' do
590
- expect(User.distinct(:last_login).first.to_s).to eql(time.utc.to_s)
956
+ context 'when distinct does not demongoize' do
957
+ config_override :legacy_pluck_distinct, true
958
+
959
+ let(:distinct) do
960
+ User.distinct(:last_login).first
961
+ end
962
+
963
+ it 'uses utc' do
964
+ distinct.should be_a(Time)
965
+ expect(distinct.to_s).to eql(time.utc.to_s)
966
+ end
967
+ end
968
+
969
+ context 'when distinct demongoizes' do
970
+ config_override :legacy_pluck_distinct, false
971
+
972
+ let(:distinct) do
973
+ User.distinct(:last_login).first
974
+ end
975
+
976
+ it 'uses utc' do
977
+ distinct.should be_a(DateTime)
978
+ # Time and DateTime have different stringifications:
979
+ # 2022-03-16T21:12:32+00:00
980
+ # 2022-03-16 21:12:32 UTC
981
+ expect(distinct.to_s).to eql(time.utc.to_datetime.to_s)
982
+ end
591
983
  end
592
984
 
593
985
  it 'loads other fields accurately' do
@@ -85,7 +85,7 @@ describe Mongoid::Indexable::Specification do
85
85
  Band,
86
86
  { name: 1, title: 1, years: -1 },
87
87
  background: true,
88
- drop_dups: true
88
+ unique: true
89
89
  )
90
90
  end
91
91
 
@@ -98,7 +98,7 @@ describe Mongoid::Indexable::Specification do
98
98
  end
99
99
 
100
100
  it "normalizes the options" do
101
- expect(spec.options).to eq(background: true, drop_dups: true)
101
+ expect(spec.options).to eq(background: true, unique: true)
102
102
  end
103
103
  end
104
104