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
@@ -2,11 +2,30 @@
2
2
 
3
3
  require "spec_helper"
4
4
 
5
+ module RefHasManySpec
6
+ module OverrideInitialize
7
+ class Parent
8
+ include Mongoid::Document
9
+ has_many :children, inverse_of: :parent
10
+ end
11
+
12
+ class Child
13
+ include Mongoid::Document
14
+ belongs_to :parent
15
+ field :name, type: String
16
+
17
+ def initialize(*args)
18
+ super
19
+ self.name ||= "default"
20
+ end
21
+ end
22
+ end
23
+ end
24
+
5
25
  describe Mongoid::Association::Referenced::HasMany::Proxy do
26
+ config_override :raise_not_found_error, true
6
27
 
7
28
  before :all do
8
- Mongoid.raise_not_found_error = true
9
-
10
29
  Drug.belongs_to :person, primary_key: :username
11
30
  Person.has_many :drugs, validate: false, primary_key: :username
12
31
  end
@@ -877,6 +896,14 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
877
896
  [ :build, :new ].each do |method|
878
897
 
879
898
  describe "##{method}" do
899
+ context 'when model has #initialize' do
900
+ let(:parent) { RefHasManySpec::OverrideInitialize::Parent.create }
901
+ let(:child) { parent.children.send(method) }
902
+
903
+ it 'should call #initialize' do
904
+ expect(child.name).to be == "default"
905
+ end
906
+ end
880
907
 
881
908
  context "when the association is not polymorphic" do
882
909
 
@@ -2077,154 +2104,114 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
2077
2104
  end
2078
2105
  end
2079
2106
 
2080
- describe "#delete" do
2081
-
2082
- let!(:person) do
2083
- Person.create!(username: 'arthurnn')
2084
- end
2107
+ %i[ delete delete_one ].each do |method|
2108
+ describe "##{method}" do
2109
+ let!(:person) { Person.create!(username: 'arthurnn') }
2085
2110
 
2086
- context "when the document is found" do
2111
+ context 'when the document is found' do
2112
+ context 'when no dependent option is set' do
2113
+ context 'when we are assigning attributes' do
2114
+ let!(:drug) { person.drugs.create! }
2115
+ let(:deleted) { person.drugs.send(method, drug) }
2087
2116
 
2088
- context "when no dependent option is set" do
2117
+ before do
2118
+ Mongoid::Threaded.begin_execution(:assign)
2119
+ end
2089
2120
 
2090
- context "when we are assigning attributes" do
2121
+ after do
2122
+ Mongoid::Threaded.exit_execution(:assign)
2123
+ end
2091
2124
 
2092
- let!(:drug) do
2093
- person.drugs.create!
2125
+ it 'does not cascade' do
2126
+ expect(deleted.changes.keys).to eq([ 'person_id' ])
2127
+ end
2094
2128
  end
2095
2129
 
2096
- before do
2097
- Mongoid::Threaded.begin_execution(:assign)
2098
- end
2130
+ context 'when the document is loaded' do
2131
+ let!(:drug) { person.drugs.create! }
2132
+ let!(:deleted) { person.drugs.send(method, drug) }
2099
2133
 
2100
- after do
2101
- Mongoid::Threaded.exit_execution(:assign)
2102
- end
2134
+ it 'returns the document' do
2135
+ expect(deleted).to eq(drug)
2136
+ end
2103
2137
 
2104
- let(:deleted) do
2105
- person.drugs.delete(drug)
2106
- end
2138
+ it 'deletes the foreign key' do
2139
+ expect(drug.person_id).to be_nil
2140
+ end
2107
2141
 
2108
- it "does not cascade" do
2109
- expect(deleted.changes.keys).to eq([ "person_id" ])
2142
+ it 'removes the document from the association' do
2143
+ expect(person.drugs).not_to include(drug)
2144
+ end
2110
2145
  end
2111
- end
2112
2146
 
2113
- context "when the document is loaded" do
2147
+ context 'when the document is not loaded' do
2148
+ let!(:drug) { Drug.create!(person_id: person.username) }
2149
+ let!(:deleted) { person.drugs.send(method, drug) }
2114
2150
 
2115
- let!(:drug) do
2116
- person.drugs.create!
2117
- end
2151
+ it 'returns the document' do
2152
+ expect(deleted).to eq(drug)
2153
+ end
2118
2154
 
2119
- let!(:deleted) do
2120
- person.drugs.delete(drug)
2121
- end
2155
+ it 'deletes the foreign key' do
2156
+ expect(drug.person_id).to be_nil
2157
+ end
2122
2158
 
2123
- it "returns the document" do
2124
- expect(deleted).to eq(drug)
2159
+ it 'removes the document from the association' do
2160
+ expect(person.drugs).not_to include(drug)
2161
+ end
2125
2162
  end
2163
+ end
2126
2164
 
2127
- it "deletes the foreign key" do
2128
- expect(drug.person_id).to be_nil
2129
- end
2165
+ context 'when dependent is delete' do
2166
+ context 'when the document is loaded' do
2167
+ let!(:post) { person.posts.create!(title: 'test') }
2168
+ let!(:deleted) { person.posts.send(method, post) }
2130
2169
 
2131
- it "removes the document from the association" do
2132
- expect(person.drugs).to_not include(drug)
2133
- end
2134
- end
2170
+ it 'returns the document' do
2171
+ expect(deleted).to eq(post)
2172
+ end
2135
2173
 
2136
- context "when the document is not loaded" do
2174
+ it 'deletes the document' do
2175
+ expect(post).to be_destroyed
2176
+ end
2137
2177
 
2138
- let!(:drug) do
2139
- Drug.create!(person_id: person.username)
2178
+ it 'removes the document from the association' do
2179
+ expect(person.posts).not_to include(post)
2180
+ end
2140
2181
  end
2141
2182
 
2142
- let!(:deleted) do
2143
- person.drugs.delete(drug)
2144
- end
2183
+ context 'when the document is not loaded' do
2184
+ let!(:post) { Post.create!(title: 'foo', person_id: person.id) }
2185
+ let!(:deleted) { person.posts.send(method, post) }
2145
2186
 
2146
- it "returns the document" do
2147
- expect(deleted).to eq(drug)
2148
- end
2187
+ it 'returns the document' do
2188
+ expect(deleted).to eq(post)
2189
+ end
2149
2190
 
2150
- it "deletes the foreign key" do
2151
- expect(drug.person_id).to be_nil
2152
- end
2191
+ it 'deletes the document' do
2192
+ expect(post).to be_destroyed
2193
+ end
2153
2194
 
2154
- it "removes the document from the association" do
2155
- expect(person.drugs).to_not include(drug)
2195
+ it 'removes the document from the association' do
2196
+ expect(person.posts).not_to include(post)
2197
+ end
2156
2198
  end
2157
2199
  end
2158
2200
  end
2159
2201
 
2160
- context "when dependent is delete" do
2161
-
2162
- context "when the document is loaded" do
2202
+ context 'when the document is not found' do
2203
+ let!(:post) { Post.create!(title: 'foo') }
2204
+ let!(:deleted) { person.posts.send(method, post) }
2163
2205
 
2164
- let!(:post) do
2165
- person.posts.create!(title: "test")
2166
- end
2167
-
2168
- let!(:deleted) do
2169
- person.posts.delete(post)
2170
- end
2171
-
2172
- it "returns the document" do
2173
- expect(deleted).to eq(post)
2174
- end
2175
-
2176
- it "deletes the document" do
2177
- expect(post).to be_destroyed
2178
- end
2179
-
2180
- it "removes the document from the association" do
2181
- expect(person.posts).to_not include(post)
2182
- end
2206
+ it 'returns nil' do
2207
+ expect(deleted).to be_nil
2183
2208
  end
2184
2209
 
2185
- context "when the document is not loaded" do
2186
-
2187
- let!(:post) do
2188
- Post.create!(title: "foo", person_id: person.id)
2189
- end
2190
-
2191
- let!(:deleted) do
2192
- person.posts.delete(post)
2193
- end
2194
-
2195
- it "returns the document" do
2196
- expect(deleted).to eq(post)
2197
- end
2198
-
2199
- it "deletes the document" do
2200
- expect(post).to be_destroyed
2201
- end
2202
-
2203
- it "removes the document from the association" do
2204
- expect(person.posts).to_not include(post)
2205
- end
2210
+ it 'does not delete the document' do
2211
+ expect(post).to be_persisted
2206
2212
  end
2207
2213
  end
2208
2214
  end
2209
-
2210
- context "when the document is not found" do
2211
-
2212
- let!(:post) do
2213
- Post.create!(title: "foo")
2214
- end
2215
-
2216
- let!(:deleted) do
2217
- person.posts.delete(post)
2218
- end
2219
-
2220
- it "returns nil" do
2221
- expect(deleted).to be_nil
2222
- end
2223
-
2224
- it "does not delete the document" do
2225
- expect(post).to be_persisted
2226
- end
2227
- end
2228
2215
  end
2229
2216
 
2230
2217
  [ :delete_all, :destroy_all ].each do |method|
@@ -2239,10 +2226,8 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
2239
2226
  Person.create!(username: 'durran')
2240
2227
  end
2241
2228
 
2242
- before do
2243
- person.posts.create!(title: "Testing")
2244
- person.posts.create!(title: "Test")
2245
- end
2229
+ let!(:post1) { person.posts.create!(title: "Testing") }
2230
+ let!(:post2) { person.posts.create!(title: "Test") }
2246
2231
 
2247
2232
  it "removes the correct posts" do
2248
2233
  person.posts.send(method, { title: "Testing" })
@@ -2258,6 +2243,11 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
2258
2243
  it "returns the number of documents deleted" do
2259
2244
  expect(person.posts.send(method, { title: "Testing" })).to eq(1)
2260
2245
  end
2246
+
2247
+ it "sets the association locally" do
2248
+ person.posts.send(method, { title: "Testing" })
2249
+ expect(person.posts).to eq([post2])
2250
+ end
2261
2251
  end
2262
2252
 
2263
2253
  context "when conditions are not provided" do
@@ -2284,6 +2274,11 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
2284
2274
  it "returns the number of documents deleted" do
2285
2275
  expect(person.posts.send(method)).to eq(2)
2286
2276
  end
2277
+
2278
+ it "sets the association locally" do
2279
+ person.posts.send(method)
2280
+ expect(person.posts).to eq([])
2281
+ end
2287
2282
  end
2288
2283
  end
2289
2284
 
@@ -2295,10 +2290,8 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
2295
2290
  Movie.create!(title: "Bladerunner")
2296
2291
  end
2297
2292
 
2298
- before do
2299
- movie.ratings.create!(value: 1)
2300
- movie.ratings.create!(value: 2)
2301
- end
2293
+ let!(:rating1) { movie.ratings.create!(value: 1) }
2294
+ let!(:rating2) { movie.ratings.create!(value: 2) }
2302
2295
 
2303
2296
  it "removes the correct ratings" do
2304
2297
  movie.ratings.send(method, { value: 1 })
@@ -2313,6 +2306,11 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
2313
2306
  it "returns the number of documents deleted" do
2314
2307
  expect(movie.ratings.send(method, { value: 1 })).to eq(1)
2315
2308
  end
2309
+
2310
+ it "sets the association locally" do
2311
+ movie.ratings.send(method, { value: 1 })
2312
+ expect(movie.ratings).to eq([rating2])
2313
+ end
2316
2314
  end
2317
2315
 
2318
2316
  context "when conditions are not provided" do
@@ -2339,6 +2337,11 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
2339
2337
  it "returns the number of documents deleted" do
2340
2338
  expect(movie.ratings.send(method)).to eq(2)
2341
2339
  end
2340
+
2341
+ it "sets the association locally" do
2342
+ movie.ratings.send(method)
2343
+ expect(movie.ratings).to eq([])
2344
+ end
2342
2345
  end
2343
2346
  end
2344
2347
  end
@@ -2524,39 +2527,29 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
2524
2527
  it "raises an error" do
2525
2528
  expect {
2526
2529
  person.posts.find(post.id)
2527
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
2530
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Post with id\(s\)/)
2528
2531
  end
2529
2532
  end
2530
2533
 
2531
2534
  context "when the id does not match" do
2532
2535
 
2533
2536
  context "when config set to raise error" do
2534
-
2535
- before do
2536
- Mongoid.raise_not_found_error = true
2537
- end
2537
+ config_override :raise_not_found_error, true
2538
2538
 
2539
2539
  it "raises an error" do
2540
2540
  expect {
2541
2541
  person.posts.find(BSON::ObjectId.new)
2542
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
2542
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Post with id\(s\)/)
2543
2543
  end
2544
2544
  end
2545
2545
 
2546
2546
  context "when config set not to raise error" do
2547
+ config_override :raise_not_found_error, false
2547
2548
 
2548
2549
  let(:post) do
2549
2550
  person.posts.find(BSON::ObjectId.new)
2550
2551
  end
2551
2552
 
2552
- before do
2553
- Mongoid.raise_not_found_error = false
2554
- end
2555
-
2556
- after do
2557
- Mongoid.raise_not_found_error = true
2558
- end
2559
-
2560
2553
  it "returns nil" do
2561
2554
  expect(post).to be_nil
2562
2555
  end
@@ -2580,32 +2573,22 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
2580
2573
  context "when the ids do not match" do
2581
2574
 
2582
2575
  context "when config set to raise error" do
2583
-
2584
- before do
2585
- Mongoid.raise_not_found_error = true
2586
- end
2576
+ config_override :raise_not_found_error, true
2587
2577
 
2588
2578
  it "raises an error" do
2589
2579
  expect {
2590
2580
  person.posts.find([ BSON::ObjectId.new ])
2591
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
2581
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Post with id\(s\)/)
2592
2582
  end
2593
2583
  end
2594
2584
 
2595
2585
  context "when config set not to raise error" do
2586
+ config_override :raise_not_found_error, false
2596
2587
 
2597
2588
  let(:posts) do
2598
2589
  person.posts.find([ BSON::ObjectId.new ])
2599
2590
  end
2600
2591
 
2601
- before do
2602
- Mongoid.raise_not_found_error = false
2603
- end
2604
-
2605
- after do
2606
- Mongoid.raise_not_found_error = true
2607
- end
2608
-
2609
2592
  it "returns an empty array" do
2610
2593
  expect(posts).to be_empty
2611
2594
  end
@@ -2644,32 +2627,22 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
2644
2627
  context "when the id does not match" do
2645
2628
 
2646
2629
  context "when config set to raise error" do
2647
-
2648
- before do
2649
- Mongoid.raise_not_found_error = true
2650
- end
2630
+ config_override :raise_not_found_error, true
2651
2631
 
2652
2632
  it "raises an error" do
2653
2633
  expect {
2654
2634
  movie.ratings.find(BSON::ObjectId.new)
2655
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
2635
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Rating with id\(s\)/)
2656
2636
  end
2657
2637
  end
2658
2638
 
2659
2639
  context "when config set not to raise error" do
2640
+ config_override :raise_not_found_error, false
2660
2641
 
2661
2642
  let(:rating) do
2662
2643
  movie.ratings.find(BSON::ObjectId.new)
2663
2644
  end
2664
2645
 
2665
- before do
2666
- Mongoid.raise_not_found_error = false
2667
- end
2668
-
2669
- after do
2670
- Mongoid.raise_not_found_error = true
2671
- end
2672
-
2673
2646
  it "returns nil" do
2674
2647
  expect(rating).to be_nil
2675
2648
  end
@@ -2701,32 +2674,22 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
2701
2674
  context "when the ids do not match" do
2702
2675
 
2703
2676
  context "when config set to raise error" do
2704
-
2705
- before do
2706
- Mongoid.raise_not_found_error = true
2707
- end
2677
+ config_override :raise_not_found_error, true
2708
2678
 
2709
2679
  it "raises an error" do
2710
2680
  expect {
2711
2681
  movie.ratings.find([ BSON::ObjectId.new ])
2712
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
2682
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Rating with id\(s\)/)
2713
2683
  end
2714
2684
  end
2715
2685
 
2716
2686
  context "when config set not to raise error" do
2687
+ config_override :raise_not_found_error, false
2717
2688
 
2718
2689
  let(:ratings) do
2719
2690
  movie.ratings.find([ BSON::ObjectId.new ])
2720
2691
  end
2721
2692
 
2722
- before do
2723
- Mongoid.raise_not_found_error = false
2724
- end
2725
-
2726
- after do
2727
- Mongoid.raise_not_found_error = true
2728
- end
2729
-
2730
2693
  it "returns an empty array" do
2731
2694
  expect(ratings).to be_empty
2732
2695
  end
@@ -4089,4 +4052,57 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
4089
4052
  expect(band.same_name).to eq([agent])
4090
4053
  end
4091
4054
  end
4055
+
4056
+ context "when removing a document with counter_cache on" do
4057
+ let(:post) { Post.create! }
4058
+ let(:person1) { Person.create! }
4059
+ let(:person2) { Person.create! }
4060
+
4061
+ before do
4062
+ post.update_attribute(:person, person1)
4063
+ expect(person1.posts_count).to eq 1
4064
+
4065
+ person2
4066
+ post.update_attribute(:person, person2)
4067
+ person1.reload
4068
+ expect(person1.posts_count).to eq 0
4069
+ expect(person2.posts_count).to eq 1
4070
+
4071
+ post.update_attribute(:person, nil)
4072
+ person1.reload
4073
+ person2.reload
4074
+ end
4075
+
4076
+ it "the count field is updated" do
4077
+ expect(person2.posts_count).to eq 0
4078
+ end
4079
+ end
4080
+
4081
+ context "when there is a foreign key in the aliased associations" do
4082
+ it "has the correct aliases" do
4083
+ expect(Band.aliased_associations["artist_ids"]).to eq("artists")
4084
+ expect(Artist.aliased_associations.key?("band_id")).to be false
4085
+ expect(Artist.aliased_fields["band"]).to eq("band_id")
4086
+ end
4087
+ end
4088
+
4089
+ context "when executing concat on foreign key array from the db" do
4090
+ config_override :legacy_attributes, false
4091
+
4092
+ before do
4093
+ Agent.create!
4094
+ Basic.create!
4095
+ end
4096
+
4097
+ let!(:agent) { Agent.first }
4098
+ let!(:basic) { Basic.first }
4099
+
4100
+ before do
4101
+ agent.basic_ids.concat([basic.id])
4102
+ end
4103
+
4104
+ it "works on the first attempt" do
4105
+ expect(agent.basic_ids).to eq([basic.id])
4106
+ end
4107
+ end
4092
4108
  end
@@ -42,6 +42,7 @@ end
42
42
 
43
43
  class HmmSchool
44
44
  include Mongoid::Document
45
+ include Mongoid::Timestamps
45
46
 
46
47
  has_many :students, class_name: 'HmmStudent'
47
48
 
@@ -51,8 +52,9 @@ end
51
52
 
52
53
  class HmmStudent
53
54
  include Mongoid::Document
55
+ include Mongoid::Timestamps
54
56
 
55
- belongs_to :school, class_name: 'HmmSchool'
57
+ belongs_to :school, class_name: 'HmmSchool', touch: true
56
58
 
57
59
  field :name, type: String
58
60
  field :grade, type: Integer, default: 3
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "spec_helper"
4
+ require_relative './has_many_models'
4
5
 
5
6
  describe Mongoid::Association::Referenced::HasMany do
6
7
 
@@ -1245,4 +1246,28 @@ describe Mongoid::Association::Referenced::HasMany do
1245
1246
  expect(association.create_relation(owner, target)).to be_a(Array)
1246
1247
  end
1247
1248
  end
1249
+
1250
+ context "when adding an object to the association" do
1251
+ let!(:start_time) { Timecop.freeze(Time.at(Time.now.to_i)) }
1252
+
1253
+ let(:update_time) do
1254
+ Timecop.freeze(Time.at(Time.now.to_i) + 2)
1255
+ end
1256
+
1257
+ after do
1258
+ Timecop.return
1259
+ end
1260
+
1261
+ let!(:school) { HmmSchool.create! }
1262
+ let!(:student) { HmmStudent.create! }
1263
+
1264
+ before do
1265
+ update_time
1266
+ student.update(school: school)
1267
+ end
1268
+
1269
+ it "updates the updated_at" do
1270
+ expect(student.updated_at).to eq(update_time)
1271
+ end
1272
+ end
1248
1273
  end
@@ -91,7 +91,7 @@ describe Mongoid::Association::Referenced::HasOne::Buildable do
91
91
  expect(document).to eq(object)
92
92
  end
93
93
 
94
- context 'when the object is already related to another object' do
94
+ context 'when the object is already associated with another object' do
95
95
 
96
96
  let(:original_person) do
97
97
  Person.new
@@ -105,7 +105,7 @@ describe Mongoid::Association::Referenced::HasOne::Buildable do
105
105
  association.build(Person.new, object)
106
106
  end
107
107
 
108
- it 'clears the object of its previous relation' do
108
+ it 'clears the object of its previous association' do
109
109
  expect(original_person.account).to be_nil
110
110
  end
111
111