mongoid 7.5.1 → 8.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (424) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +3 -3
  4. data/README.md +6 -6
  5. data/Rakefile +25 -0
  6. data/lib/config/locales/en.yml +92 -43
  7. data/lib/mongoid/association/accessors.rb +40 -11
  8. data/lib/mongoid/association/bindable.rb +50 -2
  9. data/lib/mongoid/association/builders.rb +5 -3
  10. data/lib/mongoid/association/constrainable.rb +0 -1
  11. data/lib/mongoid/association/eager_loadable.rb +29 -7
  12. data/lib/mongoid/association/embedded/batchable.rb +54 -14
  13. data/lib/mongoid/association/embedded/cyclic.rb +1 -1
  14. data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
  15. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +2 -2
  16. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +4 -3
  17. data/lib/mongoid/association/embedded/embedded_in.rb +3 -2
  18. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
  19. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +4 -3
  20. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +69 -45
  21. data/lib/mongoid/association/embedded/embeds_many.rb +2 -2
  22. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +19 -5
  23. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +24 -5
  24. data/lib/mongoid/association/embedded/embeds_one.rb +3 -3
  25. data/lib/mongoid/association/macros.rb +8 -1
  26. data/lib/mongoid/association/many.rb +11 -7
  27. data/lib/mongoid/association/nested/many.rb +5 -4
  28. data/lib/mongoid/association/nested/nested_buildable.rb +4 -4
  29. data/lib/mongoid/association/nested/one.rb +45 -7
  30. data/lib/mongoid/association/one.rb +2 -2
  31. data/lib/mongoid/association/options.rb +9 -9
  32. data/lib/mongoid/association/proxy.rb +15 -4
  33. data/lib/mongoid/association/referenced/auto_save.rb +4 -3
  34. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  35. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  36. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +5 -6
  37. data/lib/mongoid/association/referenced/belongs_to.rb +2 -2
  38. data/lib/mongoid/association/referenced/counter_cache.rb +10 -10
  39. data/lib/mongoid/association/referenced/eager.rb +2 -2
  40. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +70 -13
  41. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +6 -3
  42. data/lib/mongoid/association/referenced/has_many/enumerable.rb +22 -30
  43. data/lib/mongoid/association/referenced/has_many/proxy.rb +29 -19
  44. data/lib/mongoid/association/referenced/has_many.rb +3 -3
  45. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  46. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +5 -5
  47. data/lib/mongoid/association/referenced/has_one/proxy.rb +9 -12
  48. data/lib/mongoid/association/referenced/has_one.rb +3 -3
  49. data/lib/mongoid/association/referenced/syncable.rb +4 -4
  50. data/lib/mongoid/association/reflections.rb +4 -4
  51. data/lib/mongoid/association/relatable.rb +44 -10
  52. data/lib/mongoid/association.rb +5 -5
  53. data/lib/mongoid/atomic/modifiers.rb +2 -2
  54. data/lib/mongoid/atomic/paths/embedded/many.rb +19 -0
  55. data/lib/mongoid/atomic.rb +7 -0
  56. data/lib/mongoid/attributes/dynamic.rb +4 -4
  57. data/lib/mongoid/attributes/nested.rb +6 -6
  58. data/lib/mongoid/attributes/processing.rb +37 -6
  59. data/lib/mongoid/attributes/projector.rb +2 -2
  60. data/lib/mongoid/attributes/readonly.rb +3 -3
  61. data/lib/mongoid/attributes.rb +51 -42
  62. data/lib/mongoid/cacheable.rb +2 -2
  63. data/lib/mongoid/changeable.rb +147 -14
  64. data/lib/mongoid/clients/options.rb +5 -1
  65. data/lib/mongoid/clients/sessions.rb +2 -14
  66. data/lib/mongoid/clients/storage_options.rb +2 -5
  67. data/lib/mongoid/clients/validators/storage.rb +3 -15
  68. data/lib/mongoid/collection_configurable.rb +58 -0
  69. data/lib/mongoid/composable.rb +2 -0
  70. data/lib/mongoid/config/defaults.rb +60 -0
  71. data/lib/mongoid/config/options.rb +3 -0
  72. data/lib/mongoid/config/validators/async_query_executor.rb +24 -0
  73. data/lib/mongoid/config/validators/client.rb +6 -6
  74. data/lib/mongoid/config/validators.rb +1 -0
  75. data/lib/mongoid/config.rb +145 -17
  76. data/lib/mongoid/contextual/aggregable/memory.rb +24 -16
  77. data/lib/mongoid/contextual/aggregable/mongo.rb +5 -5
  78. data/lib/mongoid/contextual/aggregable/none.rb +1 -1
  79. data/lib/mongoid/contextual/atomic.rb +1 -1
  80. data/lib/mongoid/contextual/geo_near.rb +7 -7
  81. data/lib/mongoid/contextual/map_reduce.rb +2 -2
  82. data/lib/mongoid/contextual/memory.rb +285 -58
  83. data/lib/mongoid/contextual/mongo/documents_loader.rb +177 -0
  84. data/lib/mongoid/contextual/mongo.rb +521 -333
  85. data/lib/mongoid/contextual/none.rb +193 -20
  86. data/lib/mongoid/contextual/queryable.rb +1 -1
  87. data/lib/mongoid/contextual.rb +14 -2
  88. data/lib/mongoid/copyable.rb +32 -8
  89. data/lib/mongoid/criteria/findable.rb +8 -5
  90. data/lib/mongoid/criteria/includable.rb +27 -22
  91. data/lib/mongoid/criteria/marshalable.rb +10 -2
  92. data/lib/mongoid/criteria/permission.rb +1 -1
  93. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -2
  94. data/lib/mongoid/criteria/queryable/extensions/array.rb +3 -16
  95. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
  96. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -2
  97. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
  98. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
  99. data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -17
  100. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -9
  101. data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
  102. data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
  103. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
  104. data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -1
  105. data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -14
  106. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -12
  107. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
  108. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
  109. data/lib/mongoid/criteria/queryable/key.rb +4 -4
  110. data/lib/mongoid/criteria/queryable/mergeable.rb +1 -1
  111. data/lib/mongoid/criteria/queryable/optional.rb +11 -17
  112. data/lib/mongoid/criteria/queryable/options.rb +2 -2
  113. data/lib/mongoid/criteria/queryable/pipeline.rb +1 -1
  114. data/lib/mongoid/criteria/queryable/selectable.rb +47 -38
  115. data/lib/mongoid/criteria/queryable/selector.rb +93 -8
  116. data/lib/mongoid/criteria/queryable/smash.rb +40 -7
  117. data/lib/mongoid/criteria/queryable/storable.rb +1 -1
  118. data/lib/mongoid/criteria/queryable.rb +12 -7
  119. data/lib/mongoid/criteria/scopable.rb +2 -2
  120. data/lib/mongoid/criteria/translator.rb +45 -0
  121. data/lib/mongoid/criteria.rb +20 -40
  122. data/lib/mongoid/deprecable.rb +36 -0
  123. data/lib/mongoid/deprecation.rb +25 -0
  124. data/lib/mongoid/document.rb +135 -36
  125. data/lib/mongoid/equality.rb +8 -8
  126. data/lib/mongoid/errors/create_collection_failure.rb +33 -0
  127. data/lib/mongoid/errors/document_not_found.rb +10 -6
  128. data/lib/mongoid/errors/drop_collection_failure.rb +27 -0
  129. data/lib/mongoid/errors/immutable_attribute.rb +26 -0
  130. data/lib/mongoid/errors/invalid_async_query_executor.rb +25 -0
  131. data/lib/mongoid/errors/invalid_config_option.rb +1 -1
  132. data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -1
  133. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  134. data/lib/mongoid/errors/invalid_field.rb +6 -2
  135. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  136. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +22 -0
  137. data/lib/mongoid/errors/invalid_relation.rb +1 -1
  138. data/lib/mongoid/errors/invalid_relation_option.rb +1 -1
  139. data/lib/mongoid/errors/invalid_session_use.rb +1 -1
  140. data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
  141. data/lib/mongoid/errors/invalid_storage_parent.rb +2 -0
  142. data/lib/mongoid/errors/mongoid_error.rb +3 -3
  143. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -1
  144. data/lib/mongoid/errors/no_client_database.rb +1 -1
  145. data/lib/mongoid/errors/no_client_hosts.rb +1 -1
  146. data/lib/mongoid/errors/readonly_attribute.rb +1 -1
  147. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  148. data/lib/mongoid/errors/unknown_attribute.rb +1 -1
  149. data/lib/mongoid/errors.rb +6 -3
  150. data/lib/mongoid/extensions/array.rb +9 -7
  151. data/lib/mongoid/extensions/big_decimal.rb +33 -10
  152. data/lib/mongoid/extensions/binary.rb +42 -0
  153. data/lib/mongoid/extensions/boolean.rb +8 -2
  154. data/lib/mongoid/extensions/date.rb +26 -20
  155. data/lib/mongoid/extensions/date_time.rb +1 -1
  156. data/lib/mongoid/extensions/false_class.rb +1 -1
  157. data/lib/mongoid/extensions/float.rb +7 -4
  158. data/lib/mongoid/extensions/hash.rb +19 -8
  159. data/lib/mongoid/extensions/integer.rb +7 -4
  160. data/lib/mongoid/extensions/module.rb +1 -1
  161. data/lib/mongoid/extensions/object.rb +10 -8
  162. data/lib/mongoid/extensions/range.rb +41 -10
  163. data/lib/mongoid/extensions/regexp.rb +11 -4
  164. data/lib/mongoid/extensions/set.rb +11 -4
  165. data/lib/mongoid/extensions/string.rb +11 -22
  166. data/lib/mongoid/extensions/symbol.rb +4 -15
  167. data/lib/mongoid/extensions/time.rb +29 -16
  168. data/lib/mongoid/extensions/time_with_zone.rb +1 -2
  169. data/lib/mongoid/extensions/true_class.rb +1 -1
  170. data/lib/mongoid/extensions.rb +1 -0
  171. data/lib/mongoid/factory.rb +55 -7
  172. data/lib/mongoid/fields/foreign_key.rb +11 -4
  173. data/lib/mongoid/fields/localized.rb +19 -4
  174. data/lib/mongoid/fields/standard.rb +17 -7
  175. data/lib/mongoid/fields/validators/macro.rb +3 -9
  176. data/lib/mongoid/fields.rb +129 -20
  177. data/lib/mongoid/findable.rb +54 -24
  178. data/lib/mongoid/indexable/specification.rb +2 -2
  179. data/lib/mongoid/indexable/validators/options.rb +6 -2
  180. data/lib/mongoid/interceptable.rb +76 -15
  181. data/lib/mongoid/matchable.rb +1 -1
  182. data/lib/mongoid/matcher/eq_impl.rb +1 -1
  183. data/lib/mongoid/matcher/type.rb +1 -1
  184. data/lib/mongoid/matcher.rb +33 -13
  185. data/lib/mongoid/persistable/creatable.rb +19 -9
  186. data/lib/mongoid/persistable/deletable.rb +2 -2
  187. data/lib/mongoid/persistable/destroyable.rb +1 -1
  188. data/lib/mongoid/persistable/savable.rb +14 -2
  189. data/lib/mongoid/persistable/unsettable.rb +2 -2
  190. data/lib/mongoid/persistable/updatable.rb +69 -12
  191. data/lib/mongoid/persistable/upsertable.rb +21 -2
  192. data/lib/mongoid/persistable.rb +6 -3
  193. data/lib/mongoid/persistence_context.rb +63 -10
  194. data/lib/mongoid/query_cache.rb +13 -261
  195. data/lib/mongoid/railties/controller_runtime.rb +1 -1
  196. data/lib/mongoid/railties/database.rake +7 -2
  197. data/lib/mongoid/reloadable.rb +10 -8
  198. data/lib/mongoid/scopable.rb +15 -13
  199. data/lib/mongoid/selectable.rb +1 -2
  200. data/lib/mongoid/serializable.rb +10 -6
  201. data/lib/mongoid/shardable.rb +35 -11
  202. data/lib/mongoid/stateful.rb +57 -10
  203. data/lib/mongoid/tasks/database.rake +12 -0
  204. data/lib/mongoid/tasks/database.rb +20 -2
  205. data/lib/mongoid/threaded/lifecycle.rb +5 -5
  206. data/lib/mongoid/threaded.rb +42 -12
  207. data/lib/mongoid/timestamps/created.rb +1 -1
  208. data/lib/mongoid/timestamps/updated.rb +2 -2
  209. data/lib/mongoid/touchable.rb +2 -3
  210. data/lib/mongoid/traversable.rb +5 -4
  211. data/lib/mongoid/utils.rb +22 -0
  212. data/lib/mongoid/validatable/localizable.rb +1 -1
  213. data/lib/mongoid/validatable/macros.rb +5 -7
  214. data/lib/mongoid/validatable/presence.rb +2 -2
  215. data/lib/mongoid/validatable/uniqueness.rb +9 -8
  216. data/lib/mongoid/validatable.rb +9 -6
  217. data/lib/mongoid/version.rb +1 -1
  218. data/lib/mongoid/warnings.rb +19 -4
  219. data/lib/mongoid.rb +17 -3
  220. data/spec/config/mongoid.yml +16 -0
  221. data/spec/integration/app_spec.rb +10 -14
  222. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  223. data/spec/integration/associations/embedded_spec.rb +15 -0
  224. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  225. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  226. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  227. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  228. data/spec/integration/associations/has_one_spec.rb +97 -1
  229. data/spec/integration/associations/scope_option_spec.rb +1 -1
  230. data/spec/integration/callbacks_models.rb +132 -1
  231. data/spec/integration/callbacks_spec.rb +360 -4
  232. data/spec/integration/criteria/range_spec.rb +95 -1
  233. data/spec/integration/discriminator_key_spec.rb +118 -80
  234. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  235. data/spec/integration/i18n_fallbacks_spec.rb +3 -32
  236. data/spec/integration/matcher_examples_spec.rb +20 -13
  237. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  238. data/spec/integration/matcher_operator_spec.rb +3 -5
  239. data/spec/integration/persistence/range_field_spec.rb +350 -0
  240. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  241. data/spec/mongoid/association/depending_spec.rb +9 -9
  242. data/spec/mongoid/association/eager_spec.rb +2 -1
  243. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  244. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  245. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +96 -9
  246. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  247. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +276 -65
  248. data/spec/mongoid/association/embedded/embeds_many_models.rb +158 -0
  249. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
  250. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  251. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  252. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +15 -2
  253. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  254. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  255. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  256. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  257. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
  258. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  259. data/spec/mongoid/association/referenced/belongs_to_spec.rb +4 -20
  260. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +215 -228
  261. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  262. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  263. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  264. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
  265. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +193 -177
  266. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  267. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  268. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  269. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  270. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  271. data/spec/mongoid/association/syncable_spec.rb +15 -1
  272. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  273. data/spec/mongoid/attributes/nested_spec.rb +80 -11
  274. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  275. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  276. data/spec/mongoid/attributes_spec.rb +554 -33
  277. data/spec/mongoid/cacheable_spec.rb +3 -3
  278. data/spec/mongoid/changeable_spec.rb +429 -37
  279. data/spec/mongoid/clients/factory_spec.rb +23 -30
  280. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  281. data/spec/mongoid/clients_spec.rb +179 -15
  282. data/spec/mongoid/collection_configurable_spec.rb +158 -0
  283. data/spec/mongoid/config/defaults_spec.rb +160 -0
  284. data/spec/mongoid/config_spec.rb +220 -30
  285. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  286. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  287. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  288. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  289. data/spec/mongoid/contextual/memory_spec.rb +850 -88
  290. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
  291. data/spec/mongoid/contextual/mongo_spec.rb +1570 -413
  292. data/spec/mongoid/contextual/none_spec.rb +60 -21
  293. data/spec/mongoid/copyable_spec.rb +453 -11
  294. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  295. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  296. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  297. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  298. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  299. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  300. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  301. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  302. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  303. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  304. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +4 -69
  305. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
  306. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  307. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  308. data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -484
  309. data/spec/mongoid/criteria/queryable/options_spec.rb +1 -1
  310. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +469 -0
  311. data/spec/mongoid/criteria/queryable/selectable_spec.rb +78 -86
  312. data/spec/mongoid/criteria/queryable/selector_spec.rb +90 -5
  313. data/spec/mongoid/criteria/queryable/storable_spec.rb +72 -0
  314. data/spec/mongoid/criteria/translator_spec.rb +132 -0
  315. data/spec/mongoid/criteria_projection_spec.rb +1 -5
  316. data/spec/mongoid/criteria_spec.rb +469 -1205
  317. data/spec/mongoid/document_fields_spec.rb +173 -24
  318. data/spec/mongoid/document_spec.rb +32 -41
  319. data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
  320. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  321. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  322. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  323. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  324. data/spec/mongoid/errors/readonly_document_spec.rb +2 -2
  325. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  326. data/spec/mongoid/extensions/array_spec.rb +16 -2
  327. data/spec/mongoid/extensions/big_decimal_spec.rb +712 -212
  328. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  329. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  330. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  331. data/spec/mongoid/extensions/date_spec.rb +71 -1
  332. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  333. data/spec/mongoid/extensions/float_spec.rb +53 -74
  334. data/spec/mongoid/extensions/hash_spec.rb +33 -3
  335. data/spec/mongoid/extensions/integer_spec.rb +50 -64
  336. data/spec/mongoid/extensions/range_spec.rb +255 -54
  337. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  338. data/spec/mongoid/extensions/set_spec.rb +106 -0
  339. data/spec/mongoid/extensions/string_spec.rb +53 -25
  340. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  341. data/spec/mongoid/extensions/time_spec.rb +639 -106
  342. data/spec/mongoid/extensions/time_with_zone_spec.rb +24 -83
  343. data/spec/mongoid/factory_spec.rb +61 -1
  344. data/spec/mongoid/fields/localized_spec.rb +80 -37
  345. data/spec/mongoid/fields_spec.rb +500 -84
  346. data/spec/mongoid/findable_spec.rb +450 -58
  347. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  348. data/spec/mongoid/indexable_spec.rb +55 -30
  349. data/spec/mongoid/interceptable_spec.rb +599 -8
  350. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  351. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  352. data/spec/mongoid/mongoizable_spec.rb +285 -0
  353. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  354. data/spec/mongoid/persistable/deletable_spec.rb +28 -8
  355. data/spec/mongoid/persistable/destroyable_spec.rb +28 -8
  356. data/spec/mongoid/persistable/incrementable_spec.rb +37 -0
  357. data/spec/mongoid/persistable/logical_spec.rb +37 -0
  358. data/spec/mongoid/persistable/poppable_spec.rb +36 -0
  359. data/spec/mongoid/persistable/pullable_spec.rb +72 -0
  360. data/spec/mongoid/persistable/pushable_spec.rb +72 -0
  361. data/spec/mongoid/persistable/renamable_spec.rb +36 -0
  362. data/spec/mongoid/persistable/savable_spec.rb +96 -0
  363. data/spec/mongoid/persistable/settable_spec.rb +37 -0
  364. data/spec/mongoid/persistable/unsettable_spec.rb +36 -0
  365. data/spec/mongoid/persistable/updatable_spec.rb +20 -28
  366. data/spec/mongoid/persistable/upsertable_spec.rb +89 -1
  367. data/spec/mongoid/persistence_context_spec.rb +57 -58
  368. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  369. data/spec/mongoid/query_cache_spec.rb +56 -215
  370. data/spec/mongoid/reloadable_spec.rb +83 -6
  371. data/spec/mongoid/scopable_spec.rb +91 -1
  372. data/spec/mongoid/serializable_spec.rb +9 -30
  373. data/spec/mongoid/shardable_models.rb +14 -0
  374. data/spec/mongoid/shardable_spec.rb +157 -51
  375. data/spec/mongoid/stateful_spec.rb +150 -8
  376. data/spec/mongoid/tasks/database_rake_spec.rb +74 -0
  377. data/spec/mongoid/tasks/database_spec.rb +127 -0
  378. data/spec/mongoid/timestamps_spec.rb +392 -4
  379. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  380. data/spec/mongoid/touchable_spec.rb +390 -2
  381. data/spec/mongoid/touchable_spec_models.rb +14 -8
  382. data/spec/mongoid/traversable_spec.rb +13 -35
  383. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  384. data/spec/mongoid/validatable/uniqueness_spec.rb +58 -31
  385. data/spec/mongoid/warnings_spec.rb +35 -0
  386. data/spec/mongoid_spec.rb +34 -10
  387. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  388. data/spec/rails/mongoid_spec.rb +4 -16
  389. data/spec/shared/lib/mrss/lite_constraints.rb +8 -0
  390. data/spec/shared/shlib/server.sh +5 -5
  391. data/spec/spec_helper.rb +5 -0
  392. data/spec/support/constraints.rb +24 -0
  393. data/spec/support/immutable_ids.rb +118 -0
  394. data/spec/support/macros.rb +78 -0
  395. data/spec/support/models/artist.rb +0 -1
  396. data/spec/support/models/augmentation.rb +12 -0
  397. data/spec/support/models/band.rb +4 -0
  398. data/spec/support/models/book.rb +1 -0
  399. data/spec/support/models/building.rb +2 -0
  400. data/spec/support/models/catalog.rb +24 -0
  401. data/spec/support/models/circus.rb +3 -0
  402. data/spec/support/models/cover.rb +10 -0
  403. data/spec/support/models/fanatic.rb +8 -0
  404. data/spec/support/models/implant.rb +9 -0
  405. data/spec/support/models/label.rb +2 -0
  406. data/spec/support/models/passport.rb +9 -0
  407. data/spec/support/models/person.rb +2 -0
  408. data/spec/support/models/player.rb +2 -0
  409. data/spec/support/models/powerup.rb +12 -0
  410. data/spec/support/models/product.rb +1 -0
  411. data/spec/support/models/purse.rb +9 -0
  412. data/spec/support/models/registry.rb +1 -0
  413. data/spec/support/models/school.rb +14 -0
  414. data/spec/support/models/shield.rb +18 -0
  415. data/spec/support/models/student.rb +14 -0
  416. data/spec/support/models/weapon.rb +12 -0
  417. data.tar.gz.sig +0 -0
  418. metadata +720 -638
  419. metadata.gz.sig +0 -0
  420. data/lib/mongoid/errors/eager_load.rb +0 -23
  421. data/lib/mongoid/errors/invalid_value.rb +0 -17
  422. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -60
  423. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -60
  424. data/spec/mongoid/errors/eager_load_spec.rb +0 -31
@@ -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
@@ -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