mongoid 7.5.4 → 8.1.9

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 (446) 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 +32 -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 +11 -6
  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 +48 -39
  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 +135 -36
  121. data/lib/mongoid/equality.rb +9 -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 +187 -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 +9 -2
  203. data/lib/mongoid/timestamps/updated.rb +2 -2
  204. data/lib/mongoid/touchable.rb +3 -4
  205. data/lib/mongoid/traversable.rb +41 -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 +26 -3
  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/association_spec.rb +60 -0
  269. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  270. data/spec/mongoid/attributes/nested_spec.rb +80 -11
  271. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  272. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  273. data/spec/mongoid/attributes/readonly_spec.rb +19 -0
  274. data/spec/mongoid/attributes_spec.rb +526 -33
  275. data/spec/mongoid/changeable_spec.rb +429 -37
  276. data/spec/mongoid/clients/factory_spec.rb +23 -30
  277. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  278. data/spec/mongoid/clients_spec.rb +149 -15
  279. data/spec/mongoid/collection_configurable_spec.rb +158 -0
  280. data/spec/mongoid/config/defaults_spec.rb +160 -0
  281. data/spec/mongoid/config_spec.rb +214 -31
  282. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  283. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  284. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  285. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  286. data/spec/mongoid/contextual/memory_spec.rb +850 -88
  287. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
  288. data/spec/mongoid/contextual/mongo_spec.rb +2256 -1005
  289. data/spec/mongoid/contextual/none_spec.rb +60 -21
  290. data/spec/mongoid/copyable_spec.rb +453 -11
  291. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  292. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  293. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  294. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  295. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  296. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  297. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  298. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  299. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  300. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  301. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +4 -69
  302. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
  303. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  304. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  305. data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -484
  306. data/spec/mongoid/criteria/queryable/options_spec.rb +1 -1
  307. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +469 -0
  308. data/spec/mongoid/criteria/queryable/selectable_spec.rb +107 -86
  309. data/spec/mongoid/criteria/queryable/selector_spec.rb +15 -3
  310. data/spec/mongoid/criteria/translator_spec.rb +132 -0
  311. data/spec/mongoid/criteria_projection_spec.rb +1 -5
  312. data/spec/mongoid/criteria_spec.rb +469 -1205
  313. data/spec/mongoid/document_fields_spec.rb +173 -24
  314. data/spec/mongoid/document_spec.rb +59 -41
  315. data/spec/mongoid/equality_spec.rb +6 -0
  316. data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
  317. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  318. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  319. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  320. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  321. data/spec/mongoid/errors/readonly_document_spec.rb +2 -2
  322. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  323. data/spec/mongoid/extensions/array_spec.rb +16 -2
  324. data/spec/mongoid/extensions/big_decimal_spec.rb +712 -212
  325. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  326. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  327. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  328. data/spec/mongoid/extensions/date_spec.rb +71 -1
  329. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  330. data/spec/mongoid/extensions/float_spec.rb +53 -74
  331. data/spec/mongoid/extensions/hash_spec.rb +33 -3
  332. data/spec/mongoid/extensions/integer_spec.rb +50 -64
  333. data/spec/mongoid/extensions/range_spec.rb +255 -54
  334. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  335. data/spec/mongoid/extensions/set_spec.rb +106 -0
  336. data/spec/mongoid/extensions/string_spec.rb +53 -25
  337. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  338. data/spec/mongoid/extensions/time_spec.rb +639 -106
  339. data/spec/mongoid/extensions/time_with_zone_spec.rb +24 -83
  340. data/spec/mongoid/factory_spec.rb +61 -1
  341. data/spec/mongoid/fields/localized_spec.rb +80 -37
  342. data/spec/mongoid/fields_spec.rb +503 -87
  343. data/spec/mongoid/findable_spec.rb +450 -58
  344. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  345. data/spec/mongoid/indexable_spec.rb +55 -30
  346. data/spec/mongoid/interceptable_spec.rb +904 -22
  347. data/spec/mongoid/interceptable_spec_models.rb +189 -22
  348. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  349. data/spec/mongoid/mongoizable_spec.rb +285 -0
  350. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  351. data/spec/mongoid/persistable/deletable_spec.rb +28 -8
  352. data/spec/mongoid/persistable/destroyable_spec.rb +28 -8
  353. data/spec/mongoid/persistable/incrementable_spec.rb +37 -0
  354. data/spec/mongoid/persistable/logical_spec.rb +37 -0
  355. data/spec/mongoid/persistable/poppable_spec.rb +36 -0
  356. data/spec/mongoid/persistable/pullable_spec.rb +72 -0
  357. data/spec/mongoid/persistable/pushable_spec.rb +72 -0
  358. data/spec/mongoid/persistable/renamable_spec.rb +36 -0
  359. data/spec/mongoid/persistable/savable_spec.rb +96 -0
  360. data/spec/mongoid/persistable/settable_spec.rb +37 -0
  361. data/spec/mongoid/persistable/unsettable_spec.rb +36 -0
  362. data/spec/mongoid/persistable/updatable_spec.rb +20 -28
  363. data/spec/mongoid/persistable/upsertable_spec.rb +89 -1
  364. data/spec/mongoid/persistence_context_spec.rb +31 -57
  365. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  366. data/spec/mongoid/query_cache_spec.rb +56 -215
  367. data/spec/mongoid/reloadable_spec.rb +83 -6
  368. data/spec/mongoid/scopable_spec.rb +91 -1
  369. data/spec/mongoid/serializable_spec.rb +25 -39
  370. data/spec/mongoid/shardable_spec.rb +4 -4
  371. data/spec/mongoid/stateful_spec.rb +150 -8
  372. data/spec/mongoid/tasks/database_rake_spec.rb +74 -0
  373. data/spec/mongoid/tasks/database_spec.rb +127 -0
  374. data/spec/mongoid/timestamps/created_spec.rb +23 -0
  375. data/spec/mongoid/timestamps_spec.rb +392 -4
  376. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  377. data/spec/mongoid/touchable_spec.rb +390 -2
  378. data/spec/mongoid/touchable_spec_models.rb +14 -8
  379. data/spec/mongoid/traversable_spec.rb +13 -35
  380. data/spec/mongoid/validatable/associated_spec.rb +27 -34
  381. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  382. data/spec/mongoid/validatable/uniqueness_spec.rb +58 -31
  383. data/spec/mongoid/warnings_spec.rb +35 -0
  384. data/spec/mongoid_spec.rb +34 -16
  385. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  386. data/spec/rails/mongoid_spec.rb +4 -16
  387. data/spec/spec_helper.rb +5 -0
  388. data/spec/support/constraints.rb +24 -0
  389. data/spec/support/immutable_ids.rb +118 -0
  390. data/spec/support/macros.rb +78 -0
  391. data/spec/support/models/artist.rb +0 -1
  392. data/spec/support/models/augmentation.rb +12 -0
  393. data/spec/support/models/band.rb +5 -0
  394. data/spec/support/models/book.rb +1 -0
  395. data/spec/support/models/building.rb +2 -0
  396. data/spec/support/models/catalog.rb +24 -0
  397. data/spec/support/models/circus.rb +3 -0
  398. data/spec/support/models/cover.rb +10 -0
  399. data/spec/support/models/fanatic.rb +8 -0
  400. data/spec/support/models/implant.rb +9 -0
  401. data/spec/support/models/label.rb +2 -0
  402. data/spec/support/models/lat_lng.rb +6 -0
  403. data/spec/support/models/name.rb +10 -0
  404. data/spec/support/models/passport.rb +9 -0
  405. data/spec/support/models/person.rb +2 -0
  406. data/spec/support/models/player.rb +2 -0
  407. data/spec/support/models/powerup.rb +12 -0
  408. data/spec/support/models/product.rb +1 -0
  409. data/spec/support/models/purse.rb +9 -0
  410. data/spec/support/models/registry.rb +1 -0
  411. data/spec/support/models/school.rb +14 -0
  412. data/spec/support/models/shield.rb +18 -0
  413. data/spec/support/models/student.rb +14 -0
  414. data/spec/support/models/weapon.rb +12 -0
  415. metadata +98 -96
  416. checksums.yaml.gz.sig +0 -0
  417. data/lib/mongoid/errors/eager_load.rb +0 -23
  418. data/lib/mongoid/errors/invalid_value.rb +0 -17
  419. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -60
  420. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -60
  421. data/spec/mongoid/errors/eager_load_spec.rb +0 -31
  422. data/spec/shared/LICENSE +0 -20
  423. data/spec/shared/bin/get-mongodb-download-url +0 -17
  424. data/spec/shared/bin/s3-copy +0 -45
  425. data/spec/shared/bin/s3-upload +0 -69
  426. data/spec/shared/lib/mrss/child_process_helper.rb +0 -80
  427. data/spec/shared/lib/mrss/cluster_config.rb +0 -231
  428. data/spec/shared/lib/mrss/constraints.rb +0 -378
  429. data/spec/shared/lib/mrss/docker_runner.rb +0 -291
  430. data/spec/shared/lib/mrss/eg_config_utils.rb +0 -51
  431. data/spec/shared/lib/mrss/event_subscriber.rb +0 -210
  432. data/spec/shared/lib/mrss/lite_constraints.rb +0 -238
  433. data/spec/shared/lib/mrss/server_version_registry.rb +0 -120
  434. data/spec/shared/lib/mrss/session_registry.rb +0 -69
  435. data/spec/shared/lib/mrss/session_registry_legacy.rb +0 -60
  436. data/spec/shared/lib/mrss/spec_organizer.rb +0 -179
  437. data/spec/shared/lib/mrss/utils.rb +0 -15
  438. data/spec/shared/share/Dockerfile.erb +0 -325
  439. data/spec/shared/share/haproxy-1.conf +0 -16
  440. data/spec/shared/share/haproxy-2.conf +0 -17
  441. data/spec/shared/shlib/config.sh +0 -27
  442. data/spec/shared/shlib/distro.sh +0 -74
  443. data/spec/shared/shlib/server.sh +0 -392
  444. data/spec/shared/shlib/set_env.sh +0 -169
  445. data.tar.gz.sig +0 -0
  446. metadata.gz.sig +0 -3
@@ -35,6 +35,22 @@ shared_context "rake task" do
35
35
  task.invoke
36
36
  end
37
37
  end
38
+
39
+ shared_examples_for "create_collections" do
40
+
41
+ it "receives create_collections" do
42
+ expect(Mongoid::Tasks::Database).to receive(:create_collections)
43
+ task.invoke
44
+ end
45
+ end
46
+
47
+ shared_examples_for "force create_collections" do
48
+
49
+ it "receives create_collections" do
50
+ expect(Mongoid::Tasks::Database).to receive(:create_collections).with(force: true)
51
+ task.invoke
52
+ end
53
+ end
38
54
  end
39
55
 
40
56
  shared_context "rails rake task" do
@@ -99,6 +115,10 @@ describe "db:setup" do
99
115
  expect(task.prerequisites).to include("mongoid:create_indexes")
100
116
  end
101
117
 
118
+ it "calls db:mongoid:create_collections" do
119
+ expect(task.prerequisites).to include("mongoid:create_collections")
120
+ end
121
+
102
122
  it "calls db:seed" do
103
123
  expect(task.prerequisites).to include("db:seed")
104
124
  end
@@ -113,6 +133,7 @@ describe "db:setup" do
113
133
 
114
134
  it "works" do
115
135
  expect(Mongoid::Tasks::Database).to receive(:create_indexes)
136
+ expect(Mongoid::Tasks::Database).to receive(:create_collections)
116
137
  expect(Rails).to receive(:root).and_return(".")
117
138
  expect(Rails).to receive(:application).and_return(application)
118
139
  task.invoke
@@ -169,9 +190,14 @@ describe "db:test:prepare" do
169
190
  expect(task.prerequisites).to include("mongoid:create_indexes")
170
191
  end
171
192
 
193
+ it "calls mongoid:create_collections" do
194
+ expect(task.prerequisites).to include("mongoid:create_collections")
195
+ end
196
+
172
197
  it "works" do
173
198
  expect(Rails).to receive(:application).and_return(application)
174
199
  expect(Mongoid::Tasks::Database).to receive(:create_indexes)
200
+ expect(Mongoid::Tasks::Database).to receive(:create_collections)
175
201
  task.invoke
176
202
  end
177
203
  end
@@ -200,6 +226,54 @@ describe "db:mongoid:create_indexes" do
200
226
  end
201
227
  end
202
228
 
229
+ describe "db:mongoid:create_collections" do
230
+ include_context "rake task"
231
+
232
+ it_behaves_like "create_collections"
233
+
234
+ it "calls load_models" do
235
+ expect(task.prerequisites).to include("load_models")
236
+ end
237
+
238
+ it "calls environment" do
239
+ expect(task.prerequisites).to include("environment")
240
+ end
241
+
242
+ context "when using rails task" do
243
+ include_context "rails rake task"
244
+
245
+ before do
246
+ expect(Rails).to receive(:application).and_return(application)
247
+ end
248
+
249
+ it_behaves_like "create_collections"
250
+ end
251
+ end
252
+
253
+ describe "db:mongoid:create_collections:force" do
254
+ include_context "rake task"
255
+
256
+ it_behaves_like "force create_collections"
257
+
258
+ it "calls load_models" do
259
+ expect(task.prerequisites).to include("load_models")
260
+ end
261
+
262
+ it "calls environment" do
263
+ expect(task.prerequisites).to include("environment")
264
+ end
265
+
266
+ context "when using rails task" do
267
+ include_context "rails rake task"
268
+
269
+ before do
270
+ expect(Rails).to receive(:application).and_return(application)
271
+ end
272
+
273
+ it_behaves_like "force create_collections"
274
+ end
275
+ end
276
+
203
277
  describe "db:mongoid:remove_undefined_indexes" do
204
278
  include_context "rake task"
205
279
 
@@ -4,6 +4,59 @@ require "spec_helper"
4
4
 
5
5
  describe "Mongoid::Tasks::Database" do
6
6
 
7
+ before(:all) do
8
+ module DatabaseSpec
9
+ class Measurement
10
+ include Mongoid::Document
11
+
12
+ field :timestamp, type: Time
13
+ field :temperature, type: Integer
14
+
15
+ embeds_many :comments
16
+
17
+ store_in collection: "measurement",
18
+ collection_options: {
19
+ capped: true, size: 10000
20
+ }
21
+ end
22
+
23
+ class Comment
24
+ include Mongoid::Document
25
+
26
+ field :content, type: String
27
+
28
+ embedded_in :measurement
29
+
30
+ store_in collection_options: {
31
+ capped: true, size: 10000
32
+ }
33
+ end
34
+
35
+ class Note
36
+ include Mongoid::Document
37
+
38
+ field :text
39
+
40
+ recursively_embeds_one
41
+
42
+ store_in collection_options: {
43
+ capped: true, size: 10000
44
+ }
45
+ end
46
+ end
47
+ end
48
+
49
+ after(:all) do
50
+ Mongoid.deregister_model(DatabaseSpec::Measurement)
51
+ DatabaseSpec.send(:remove_const, :Measurement)
52
+ Mongoid.deregister_model(DatabaseSpec::Comment)
53
+ DatabaseSpec.send(:remove_const, :Comment)
54
+ Mongoid.deregister_model(DatabaseSpec::Note)
55
+ DatabaseSpec.send(:remove_const, :Note)
56
+ Object.send(:remove_const, :DatabaseSpec)
57
+ end
58
+
59
+
7
60
  let(:logger) do
8
61
  double("logger").tap do |log|
9
62
  allow(log).to receive(:info)
@@ -18,6 +71,80 @@ describe "Mongoid::Tasks::Database" do
18
71
  [ User, Account, Address, Draft ]
19
72
  end
20
73
 
74
+ describe '.create_collections' do
75
+ context 'collection_options are specified' do
76
+ let(:models) do
77
+ [DatabaseSpec::Measurement]
78
+ end
79
+
80
+ after do
81
+ DatabaseSpec::Measurement.collection.drop
82
+ end
83
+
84
+ [true, false].each do |force|
85
+ context "when force is #{force}" do
86
+ it 'creates the collection' do
87
+ expect(DatabaseSpec::Measurement).to receive(:create_collection).once.with(force: force)
88
+ Mongoid::Tasks::Database.create_collections(models, force: force)
89
+ end
90
+ end
91
+ end
92
+ end
93
+
94
+ context 'collection_options are not specified' do
95
+ let(:models) do
96
+ [Person]
97
+ end
98
+
99
+ [true, false].each do |force|
100
+ context "when force is #{force}" do
101
+ it 'creates the collection' do
102
+ expect(Person).to receive(:create_collection).once.with(force: force)
103
+ Mongoid::Tasks::Database.create_collections(models, force: force)
104
+ end
105
+ end
106
+ end
107
+
108
+ context "when collection options is defined on embedded model" do
109
+
110
+ let(:models) do
111
+ [DatabaseSpec::Comment]
112
+ end
113
+
114
+ let(:logger) do
115
+ double("logger").tap do |log|
116
+ expect(log).to receive(:info).once.with(/MONGOID: collection options ignored on: .*, please define in the root model/)
117
+ end
118
+ end
119
+
120
+ before do
121
+ allow(Mongoid::Tasks::Database).to receive(:logger).and_return(logger)
122
+ end
123
+
124
+ it "does nothing, but logging" do
125
+ expect(DatabaseSpec::Comment).to receive(:create_collection).never
126
+ Mongoid::Tasks::Database.create_collections(models)
127
+ end
128
+ end
129
+
130
+ context "when collection options is defined on cyclic model" do
131
+
132
+ let(:models) do
133
+ [DatabaseSpec::Note]
134
+ end
135
+
136
+ after do
137
+ DatabaseSpec::Note.collection.drop
138
+ end
139
+
140
+ it "creates the collection" do
141
+ expect(DatabaseSpec::Note).to receive(:create_collection).once
142
+ Mongoid::Tasks::Database.create_collections(models)
143
+ end
144
+ end
145
+ end
146
+ end
147
+
21
148
  describe ".create_indexes" do
22
149
 
23
150
  let!(:klass) do
@@ -43,4 +43,27 @@ describe Mongoid::Timestamps::Created do
43
43
  expect(quiz.created_at).to be_within(10).of(Time.now.utc)
44
44
  end
45
45
  end
46
+
47
+ context "when the document is destroyed" do
48
+ let(:book) do
49
+ Book.create!
50
+ end
51
+
52
+ before do
53
+ Cover.before_save do
54
+ destroy if title == "delete me"
55
+ end
56
+ end
57
+
58
+ after do
59
+ Cover.reset_callbacks(:save)
60
+ end
61
+
62
+ it "does not set the created_at timestamp" do
63
+ book.covers << Cover.new(title: "delete me")
64
+ expect {
65
+ book.save
66
+ }.not_to raise_error
67
+ end
68
+ end
46
69
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "spec_helper"
4
+ require_relative './timestamps_spec_models'
4
5
 
5
6
  describe Mongoid::Timestamps do
6
7
 
@@ -14,6 +15,10 @@ describe Mongoid::Timestamps do
14
15
  Dokument.fields
15
16
  end
16
17
 
18
+ let(:time_zone) { "Pacific Time (US & Canada)" }
19
+
20
+ time_zone_override "Pacific Time (US & Canada)"
21
+
17
22
  before do
18
23
  document.run_callbacks(:create)
19
24
  document.run_callbacks(:save)
@@ -35,6 +40,14 @@ describe Mongoid::Timestamps do
35
40
  expect(document.updated_at).to be_within(10).of(Time.now.utc)
36
41
  end
37
42
 
43
+ it "sets the created_at to the correct time zone" do
44
+ expect(document.created_at.time_zone.name).to eq(time_zone)
45
+ end
46
+
47
+ it "sets the updated_at to the correct time zone" do
48
+ expect(document.updated_at.time_zone.name).to eq(time_zone)
49
+ end
50
+
38
51
  it "ensures created_at equals updated_at on new records" do
39
52
  expect(document.updated_at).to eq(document.created_at)
40
53
  end
@@ -59,17 +72,20 @@ describe Mongoid::Timestamps do
59
72
  context "when the document has changed with updated_at specified" do
60
73
 
61
74
  let(:document) do
62
- Dokument.new(created_at: Time.now.utc)
75
+ Dokument.create(created_at: Time.now.utc)
76
+ end
77
+
78
+ let(:expected_updated_at) do
79
+ DateTime.parse("2001-06-12")
63
80
  end
64
81
 
65
82
  before do
66
- document.new_record = false
67
- document.updated_at = DateTime.parse("2001-06-12")
83
+ document.updated_at = expected_updated_at
68
84
  end
69
85
 
70
86
  it "does not set updated at" do
71
- expect(document).to receive(:updated_at=).never
72
87
  document.save!
88
+ expect(document.reload.updated_at).to be == expected_updated_at
73
89
  end
74
90
  end
75
91
 
@@ -107,4 +123,376 @@ describe Mongoid::Timestamps do
107
123
  expect(document.updated_at).to be_within(1).of(Time.now)
108
124
  end
109
125
  end
126
+
127
+ # This section of tests describes the behavior of the updated_at field for
128
+ # different updates on referenced associations, as outlined in PR #5219.
129
+ describe "updated_at attribute" do
130
+ let!(:start_time) { Timecop.freeze(Time.at(Time.now.to_i)) }
131
+
132
+ let(:update_time) do
133
+ Timecop.freeze(Time.at(Time.now.to_i) + 2)
134
+ end
135
+
136
+ after do
137
+ Timecop.return
138
+ end
139
+
140
+ context "when touch: true" do
141
+ let(:user) { TimestampsSpec::Touch::User.create! }
142
+ let(:address) { TimestampsSpec::Touch::Address.create! }
143
+ let(:account) { TimestampsSpec::Touch::Account.create! }
144
+ let(:pet) { TimestampsSpec::Touch::Pet.create! }
145
+
146
+ before do
147
+ [user, address, account, pet]
148
+ update_time
149
+ end
150
+
151
+ context "when HABTM association" do
152
+
153
+ context "when updating the association itself" do
154
+ before do
155
+ user.update(addresses: [address])
156
+ end
157
+
158
+ it "updates the timestamps correctly" do
159
+ pending "MONGOID-4953"
160
+ user.updated_at.should == update_time
161
+ address.updated_at.should == update_time
162
+ end
163
+
164
+ it "updates the timestamps in the db correctly" do
165
+ pending "MONGOID-4953"
166
+ user.reload.updated_at.should == update_time
167
+ address.reload.updated_at.should == update_time
168
+ end
169
+ end
170
+
171
+ context "when updating the association's foreign key" do
172
+ before do
173
+ user.update(address_ids: [address.id])
174
+ end
175
+
176
+ it "updates the timestamps correctly" do
177
+ user.updated_at.should == update_time
178
+ address.updated_at.should == start_time
179
+ end
180
+
181
+ it "updates the timestamps in the db correctly" do
182
+ user.reload.updated_at.should == update_time
183
+ address.reload.updated_at.should == start_time
184
+ end
185
+ end
186
+ end
187
+
188
+ context "when has_many association" do
189
+
190
+ context "when updating the association itself" do
191
+ before do
192
+ user.update(accounts: [account])
193
+ end
194
+
195
+ it "updates the timestamps correctly" do
196
+ user.updated_at.should == update_time
197
+ account.updated_at.should == update_time
198
+ end
199
+
200
+ it "updates the timestamps in the db correctly" do
201
+ user.reload.updated_at.should == update_time
202
+ account.reload.updated_at.should == update_time
203
+ end
204
+ end
205
+
206
+ context "when updating the association's foreign key" do
207
+ before do
208
+ user.update(account_ids: [account.id])
209
+ end
210
+
211
+ it "updates the timestamps correctly" do
212
+ user.updated_at.should == update_time
213
+ account.updated_at.should == start_time
214
+ end
215
+
216
+ # The Account object's updated_at is updated in the database but not
217
+ # locally, since, in this case, the Account object is not passed into
218
+ # the update function, so the Account object updated locally is not
219
+ # the same as the one that we have locally here.
220
+ it "updates the timestamps in the db correctly" do
221
+ user.reload.updated_at.should == update_time
222
+ account.reload.updated_at.should == update_time
223
+ end
224
+ end
225
+ end
226
+
227
+ context "when belongs_to association; on has_many" do
228
+
229
+ context "when updating the association itself" do
230
+ before do
231
+ account.update(user: user)
232
+ end
233
+
234
+ it "updates the timestamps correctly" do
235
+ user.updated_at.should == update_time
236
+ account.updated_at.should == update_time
237
+ end
238
+
239
+ it "updates the timestamps in the db correctly" do
240
+ user.reload.updated_at.should == update_time
241
+ account.reload.updated_at.should == update_time
242
+ end
243
+ end
244
+
245
+ context "when updating the association's foreign key" do
246
+ before do
247
+ account.update(user_id: user.id)
248
+ end
249
+
250
+ it "updates the timestamps correctly" do
251
+ user.updated_at.should == start_time
252
+ account.updated_at.should == update_time
253
+ end
254
+
255
+ # The User object's updated_at is updated in the database but not
256
+ # locally, since, in this case, the User object is not passed into
257
+ # the update function, so the User object updated locally is not
258
+ # the same as the one that we have locally here.
259
+ it "updates the timestamps in the db correctly" do
260
+ user.reload.updated_at.should == update_time
261
+ account.reload.updated_at.should == update_time
262
+ end
263
+ end
264
+ end
265
+
266
+ context "when has_one association" do
267
+
268
+ context "when updating the association itself" do
269
+ before do
270
+ user.update(pet: pet)
271
+ end
272
+
273
+ it "updates the timestamps correctly" do
274
+ user.updated_at.should == update_time
275
+ pet.updated_at.should == update_time
276
+ end
277
+
278
+ it "updates the timestamps in the db correctly" do
279
+ user.reload.updated_at.should == update_time
280
+ pet.reload.updated_at.should == update_time
281
+ end
282
+ end
283
+ end
284
+
285
+ context "when belongs_to association; on has_one" do
286
+
287
+ context "when updating the association itself" do
288
+ before do
289
+ pet.update(user: user)
290
+ end
291
+
292
+ it "updates the timestamps correctly" do
293
+ user.updated_at.should == update_time
294
+ pet.updated_at.should == update_time
295
+ end
296
+
297
+ it "updates the timestamps in the db correctly" do
298
+ user.reload.updated_at.should == update_time
299
+ pet.reload.updated_at.should == update_time
300
+ end
301
+ end
302
+
303
+ context "when updating the association's foreign key" do
304
+ before do
305
+ pet.update(user_id: pet.id)
306
+ end
307
+
308
+ it "updates the timestamps correctly" do
309
+ user.updated_at.should == start_time
310
+ pet.updated_at.should == update_time
311
+ end
312
+
313
+ it "updates the timestamps in the db correctly" do
314
+ user.reload.updated_at.should == start_time
315
+ pet.reload.updated_at.should == update_time
316
+ end
317
+ end
318
+ end
319
+ end
320
+
321
+ context "when touch: false" do
322
+ let(:user) { TimestampsSpec::NoTouch::User.create! }
323
+ let(:address) { TimestampsSpec::NoTouch::Address.create! }
324
+ let(:account) { TimestampsSpec::NoTouch::Account.create! }
325
+ let(:pet) { TimestampsSpec::NoTouch::Pet.create! }
326
+
327
+ before do
328
+ [user, address, account, pet]
329
+ update_time
330
+ end
331
+
332
+ context "when HABTM association" do
333
+
334
+ context "when updating the association itself" do
335
+ before do
336
+ user.update(addresses: [address])
337
+ end
338
+
339
+ it "updates the timestamps correctly" do
340
+ pending "MONGOID-4953"
341
+ user.updated_at.should == update_time
342
+ address.updated_at.should == update_time
343
+ end
344
+
345
+ it "updates the timestamps in the db correctly" do
346
+ pending "MONGOID-4953"
347
+ user.reload.updated_at.should == update_time
348
+ address.reload.updated_at.should == update_time
349
+ end
350
+ end
351
+
352
+ context "when updating the association's foreign key" do
353
+ before do
354
+ user.update(address_ids: [address.id])
355
+ end
356
+
357
+ it "updates the timestamps correctly" do
358
+ user.updated_at.should == update_time
359
+ address.updated_at.should == start_time
360
+ end
361
+
362
+ it "updates the timestamps in the db correctly" do
363
+ user.reload.updated_at.should == update_time
364
+ address.reload.updated_at.should == start_time
365
+ end
366
+ end
367
+ end
368
+
369
+ context "when has_many association" do
370
+
371
+ context "when updating the association itself" do
372
+ before do
373
+ user.update(accounts: [account])
374
+ end
375
+
376
+ it "updates the timestamps correctly" do
377
+ user.updated_at.should == start_time
378
+ account.updated_at.should == update_time
379
+ end
380
+
381
+ it "updates the timestamps in the db correctly" do
382
+ user.reload.updated_at.should == start_time
383
+ account.reload.updated_at.should == update_time
384
+ end
385
+ end
386
+
387
+ context "when updating the association's foreign key" do
388
+ before do
389
+ user.update(account_ids: [account.id])
390
+ end
391
+
392
+ it "updates the timestamps correctly" do
393
+ user.updated_at.should == start_time
394
+ account.updated_at.should == start_time
395
+ end
396
+
397
+ # The Account object's updated_at is updated in the database but not
398
+ # locally, since, in this case, the Account object is not passed into
399
+ # the update function, so the Account object updated locally is not
400
+ # the same as the one that we have locally here.
401
+ it "updates the timestamps in the db correctly" do
402
+ user.reload.updated_at.should == start_time
403
+ account.reload.updated_at.should == update_time
404
+ end
405
+ end
406
+ end
407
+
408
+ context "when belongs_to association; on has_many" do
409
+
410
+ context "when updating the association itself" do
411
+ before do
412
+ account.update(user: user)
413
+ end
414
+
415
+ it "updates the timestamps correctly" do
416
+ user.updated_at.should == start_time
417
+ account.updated_at.should == update_time
418
+ end
419
+
420
+ it "updates the timestamps in the db correctly" do
421
+ user.reload.updated_at.should == start_time
422
+ account.reload.updated_at.should == update_time
423
+ end
424
+ end
425
+
426
+ context "when updating the association's foreign key" do
427
+ before do
428
+ account.update(user_id: user.id)
429
+ end
430
+
431
+ it "updates the timestamps correctly" do
432
+ user.updated_at.should == start_time
433
+ account.updated_at.should == update_time
434
+ end
435
+
436
+ it "updates the timestamps in the db correctly" do
437
+ user.reload.updated_at.should == start_time
438
+ account.reload.updated_at.should == update_time
439
+ end
440
+ end
441
+ end
442
+
443
+ context "when has_one association" do
444
+
445
+ context "when updating the association itself" do
446
+ before do
447
+ user.update(pet: pet)
448
+ end
449
+
450
+ it "updates the timestamps correctly" do
451
+ user.updated_at.should == start_time
452
+ pet.updated_at.should == update_time
453
+ end
454
+
455
+ it "updates the timestamps in the db correctly" do
456
+ user.reload.updated_at.should == start_time
457
+ pet.reload.updated_at.should == update_time
458
+ end
459
+ end
460
+ end
461
+
462
+ context "when belongs_to association; on has_one" do
463
+
464
+ context "when updating the association itself" do
465
+ before do
466
+ pet.update(user: user)
467
+ end
468
+
469
+ it "updates the timestamps correctly" do
470
+ user.updated_at.should == start_time
471
+ pet.updated_at.should == update_time
472
+ end
473
+
474
+ it "updates the timestamps in the db correctly" do
475
+ user.reload.updated_at.should == start_time
476
+ pet.reload.updated_at.should == update_time
477
+ end
478
+ end
479
+
480
+ context "when updating the association's foreign key" do
481
+ before do
482
+ pet.update(user_id: pet.id)
483
+ end
484
+
485
+ it "updates the timestamps correctly" do
486
+ user.updated_at.should == start_time
487
+ pet.updated_at.should == update_time
488
+ end
489
+
490
+ it "updates the timestamps in the db correctly" do
491
+ user.reload.updated_at.should == start_time
492
+ pet.reload.updated_at.should == update_time
493
+ end
494
+ end
495
+ end
496
+ end
497
+ end
110
498
  end