mongoid 7.5.3 → 8.1.2

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 (417) 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 +34 -11
  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.rb +7 -0
  55. data/lib/mongoid/attributes/dynamic.rb +4 -4
  56. data/lib/mongoid/attributes/nested.rb +6 -6
  57. data/lib/mongoid/attributes/processing.rb +37 -6
  58. data/lib/mongoid/attributes/projector.rb +2 -2
  59. data/lib/mongoid/attributes/readonly.rb +3 -3
  60. data/lib/mongoid/attributes.rb +51 -42
  61. data/lib/mongoid/changeable.rb +147 -14
  62. data/lib/mongoid/clients/options.rb +5 -1
  63. data/lib/mongoid/clients/sessions.rb +2 -14
  64. data/lib/mongoid/clients/storage_options.rb +2 -5
  65. data/lib/mongoid/clients/validators/storage.rb +3 -15
  66. data/lib/mongoid/collection_configurable.rb +58 -0
  67. data/lib/mongoid/composable.rb +2 -0
  68. data/lib/mongoid/config/defaults.rb +60 -0
  69. data/lib/mongoid/config/options.rb +3 -0
  70. data/lib/mongoid/config/validators/async_query_executor.rb +24 -0
  71. data/lib/mongoid/config/validators/client.rb +6 -6
  72. data/lib/mongoid/config/validators.rb +1 -0
  73. data/lib/mongoid/config.rb +140 -18
  74. data/lib/mongoid/contextual/aggregable/memory.rb +24 -16
  75. data/lib/mongoid/contextual/aggregable/mongo.rb +5 -5
  76. data/lib/mongoid/contextual/aggregable/none.rb +1 -1
  77. data/lib/mongoid/contextual/atomic.rb +1 -1
  78. data/lib/mongoid/contextual/geo_near.rb +7 -7
  79. data/lib/mongoid/contextual/map_reduce.rb +2 -2
  80. data/lib/mongoid/contextual/memory.rb +285 -58
  81. data/lib/mongoid/contextual/mongo/documents_loader.rb +177 -0
  82. data/lib/mongoid/contextual/mongo.rb +517 -346
  83. data/lib/mongoid/contextual/none.rb +193 -20
  84. data/lib/mongoid/contextual/queryable.rb +1 -1
  85. data/lib/mongoid/contextual.rb +14 -2
  86. data/lib/mongoid/copyable.rb +32 -8
  87. data/lib/mongoid/criteria/findable.rb +8 -5
  88. data/lib/mongoid/criteria/includable.rb +27 -22
  89. data/lib/mongoid/criteria/marshalable.rb +10 -2
  90. data/lib/mongoid/criteria/permission.rb +1 -1
  91. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -2
  92. data/lib/mongoid/criteria/queryable/extensions/array.rb +3 -16
  93. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
  94. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -2
  95. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
  96. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
  97. data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -17
  98. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -9
  99. data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
  100. data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
  101. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
  102. data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -1
  103. data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -14
  104. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -12
  105. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
  106. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
  107. data/lib/mongoid/criteria/queryable/key.rb +4 -4
  108. data/lib/mongoid/criteria/queryable/mergeable.rb +1 -1
  109. data/lib/mongoid/criteria/queryable/optional.rb +11 -17
  110. data/lib/mongoid/criteria/queryable/options.rb +2 -2
  111. data/lib/mongoid/criteria/queryable/pipeline.rb +1 -1
  112. data/lib/mongoid/criteria/queryable/selectable.rb +47 -38
  113. data/lib/mongoid/criteria/queryable/selector.rb +93 -8
  114. data/lib/mongoid/criteria/queryable/smash.rb +40 -7
  115. data/lib/mongoid/criteria/queryable/storable.rb +1 -1
  116. data/lib/mongoid/criteria/queryable.rb +12 -7
  117. data/lib/mongoid/criteria/scopable.rb +2 -2
  118. data/lib/mongoid/criteria/translator.rb +45 -0
  119. data/lib/mongoid/criteria.rb +20 -40
  120. data/lib/mongoid/deprecable.rb +36 -0
  121. data/lib/mongoid/deprecation.rb +25 -0
  122. data/lib/mongoid/document.rb +127 -35
  123. data/lib/mongoid/equality.rb +8 -8
  124. data/lib/mongoid/errors/create_collection_failure.rb +33 -0
  125. data/lib/mongoid/errors/document_not_found.rb +10 -6
  126. data/lib/mongoid/errors/drop_collection_failure.rb +27 -0
  127. data/lib/mongoid/errors/immutable_attribute.rb +26 -0
  128. data/lib/mongoid/errors/invalid_async_query_executor.rb +25 -0
  129. data/lib/mongoid/errors/invalid_config_option.rb +1 -1
  130. data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -1
  131. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  132. data/lib/mongoid/errors/invalid_field.rb +6 -2
  133. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  134. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +22 -0
  135. data/lib/mongoid/errors/invalid_relation.rb +1 -1
  136. data/lib/mongoid/errors/invalid_relation_option.rb +1 -1
  137. data/lib/mongoid/errors/invalid_session_use.rb +1 -1
  138. data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
  139. data/lib/mongoid/errors/invalid_storage_parent.rb +2 -0
  140. data/lib/mongoid/errors/mongoid_error.rb +3 -3
  141. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -1
  142. data/lib/mongoid/errors/no_client_database.rb +1 -1
  143. data/lib/mongoid/errors/no_client_hosts.rb +1 -1
  144. data/lib/mongoid/errors/readonly_attribute.rb +1 -1
  145. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  146. data/lib/mongoid/errors/unknown_attribute.rb +1 -1
  147. data/lib/mongoid/errors.rb +6 -3
  148. data/lib/mongoid/extensions/array.rb +9 -7
  149. data/lib/mongoid/extensions/big_decimal.rb +33 -10
  150. data/lib/mongoid/extensions/binary.rb +42 -0
  151. data/lib/mongoid/extensions/boolean.rb +8 -2
  152. data/lib/mongoid/extensions/date.rb +26 -20
  153. data/lib/mongoid/extensions/date_time.rb +1 -1
  154. data/lib/mongoid/extensions/false_class.rb +1 -1
  155. data/lib/mongoid/extensions/float.rb +7 -4
  156. data/lib/mongoid/extensions/hash.rb +19 -8
  157. data/lib/mongoid/extensions/integer.rb +7 -4
  158. data/lib/mongoid/extensions/module.rb +1 -1
  159. data/lib/mongoid/extensions/object.rb +10 -8
  160. data/lib/mongoid/extensions/range.rb +41 -10
  161. data/lib/mongoid/extensions/regexp.rb +11 -4
  162. data/lib/mongoid/extensions/set.rb +11 -4
  163. data/lib/mongoid/extensions/string.rb +11 -22
  164. data/lib/mongoid/extensions/symbol.rb +4 -15
  165. data/lib/mongoid/extensions/time.rb +29 -16
  166. data/lib/mongoid/extensions/time_with_zone.rb +1 -2
  167. data/lib/mongoid/extensions/true_class.rb +1 -1
  168. data/lib/mongoid/extensions.rb +1 -0
  169. data/lib/mongoid/factory.rb +55 -7
  170. data/lib/mongoid/fields/foreign_key.rb +11 -4
  171. data/lib/mongoid/fields/localized.rb +19 -4
  172. data/lib/mongoid/fields/standard.rb +17 -7
  173. data/lib/mongoid/fields/validators/macro.rb +3 -9
  174. data/lib/mongoid/fields.rb +129 -20
  175. data/lib/mongoid/findable.rb +54 -24
  176. data/lib/mongoid/indexable/specification.rb +2 -2
  177. data/lib/mongoid/indexable/validators/options.rb +6 -2
  178. data/lib/mongoid/interceptable.rb +76 -15
  179. data/lib/mongoid/matchable.rb +1 -1
  180. data/lib/mongoid/matcher/eq_impl.rb +1 -1
  181. data/lib/mongoid/matcher/type.rb +1 -1
  182. data/lib/mongoid/matcher.rb +33 -13
  183. data/lib/mongoid/persistable/creatable.rb +19 -9
  184. data/lib/mongoid/persistable/deletable.rb +2 -2
  185. data/lib/mongoid/persistable/destroyable.rb +1 -1
  186. data/lib/mongoid/persistable/savable.rb +14 -2
  187. data/lib/mongoid/persistable/unsettable.rb +2 -2
  188. data/lib/mongoid/persistable/updatable.rb +69 -12
  189. data/lib/mongoid/persistable/upsertable.rb +21 -2
  190. data/lib/mongoid/persistable.rb +6 -3
  191. data/lib/mongoid/persistence_context.rb +6 -4
  192. data/lib/mongoid/query_cache.rb +13 -261
  193. data/lib/mongoid/railties/controller_runtime.rb +1 -1
  194. data/lib/mongoid/railties/database.rake +7 -2
  195. data/lib/mongoid/reloadable.rb +10 -8
  196. data/lib/mongoid/scopable.rb +15 -13
  197. data/lib/mongoid/selectable.rb +1 -2
  198. data/lib/mongoid/serializable.rb +10 -6
  199. data/lib/mongoid/stateful.rb +57 -10
  200. data/lib/mongoid/tasks/database.rake +12 -0
  201. data/lib/mongoid/tasks/database.rb +20 -2
  202. data/lib/mongoid/threaded/lifecycle.rb +5 -5
  203. data/lib/mongoid/threaded.rb +42 -12
  204. data/lib/mongoid/timestamps/created.rb +1 -1
  205. data/lib/mongoid/timestamps/updated.rb +2 -2
  206. data/lib/mongoid/touchable.rb +2 -3
  207. data/lib/mongoid/traversable.rb +5 -4
  208. data/lib/mongoid/utils.rb +22 -0
  209. data/lib/mongoid/validatable/localizable.rb +1 -1
  210. data/lib/mongoid/validatable/macros.rb +5 -7
  211. data/lib/mongoid/validatable/presence.rb +2 -2
  212. data/lib/mongoid/validatable/uniqueness.rb +9 -8
  213. data/lib/mongoid/validatable.rb +9 -6
  214. data/lib/mongoid/version.rb +1 -1
  215. data/lib/mongoid/warnings.rb +19 -4
  216. data/lib/mongoid.rb +17 -3
  217. data/spec/config/mongoid.yml +16 -0
  218. data/spec/integration/app_spec.rb +10 -14
  219. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  220. data/spec/integration/associations/embedded_spec.rb +15 -0
  221. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  222. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  223. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  224. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  225. data/spec/integration/associations/has_one_spec.rb +97 -1
  226. data/spec/integration/associations/scope_option_spec.rb +1 -1
  227. data/spec/integration/callbacks_models.rb +132 -1
  228. data/spec/integration/callbacks_spec.rb +360 -4
  229. data/spec/integration/criteria/range_spec.rb +95 -1
  230. data/spec/integration/discriminator_key_spec.rb +118 -80
  231. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  232. data/spec/integration/i18n_fallbacks_spec.rb +3 -32
  233. data/spec/integration/matcher_examples_spec.rb +20 -13
  234. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  235. data/spec/integration/matcher_operator_spec.rb +3 -5
  236. data/spec/integration/persistence/range_field_spec.rb +350 -0
  237. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  238. data/spec/mongoid/association/depending_spec.rb +9 -9
  239. data/spec/mongoid/association/eager_spec.rb +2 -1
  240. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  241. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  242. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +96 -9
  243. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  244. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +255 -65
  245. data/spec/mongoid/association/embedded/embeds_many_models.rb +37 -0
  246. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
  247. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  248. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  249. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +15 -2
  250. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  251. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  252. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  253. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  254. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
  255. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  256. data/spec/mongoid/association/referenced/belongs_to_spec.rb +4 -20
  257. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +186 -229
  258. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  259. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  260. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  261. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
  262. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +173 -177
  263. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  264. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  265. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  266. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  267. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  268. data/spec/mongoid/association/syncable_spec.rb +15 -1
  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_spec.rb +510 -33
  274. data/spec/mongoid/changeable_spec.rb +429 -37
  275. data/spec/mongoid/clients/factory_spec.rb +23 -30
  276. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  277. data/spec/mongoid/clients_spec.rb +149 -15
  278. data/spec/mongoid/collection_configurable_spec.rb +158 -0
  279. data/spec/mongoid/config/defaults_spec.rb +160 -0
  280. data/spec/mongoid/config_spec.rb +214 -31
  281. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  282. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  283. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  284. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  285. data/spec/mongoid/contextual/memory_spec.rb +850 -88
  286. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
  287. data/spec/mongoid/contextual/mongo_spec.rb +1572 -435
  288. data/spec/mongoid/contextual/none_spec.rb +60 -21
  289. data/spec/mongoid/copyable_spec.rb +453 -11
  290. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  291. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  292. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  293. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  294. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  295. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  296. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  297. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  298. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  299. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  300. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +4 -69
  301. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
  302. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  303. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  304. data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -484
  305. data/spec/mongoid/criteria/queryable/options_spec.rb +1 -1
  306. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +469 -0
  307. data/spec/mongoid/criteria/queryable/selectable_spec.rb +78 -86
  308. data/spec/mongoid/criteria/queryable/selector_spec.rb +90 -5
  309. data/spec/mongoid/criteria/queryable/storable_spec.rb +72 -0
  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 +32 -41
  315. data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
  316. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  317. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  318. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  319. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  320. data/spec/mongoid/errors/readonly_document_spec.rb +2 -2
  321. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  322. data/spec/mongoid/extensions/array_spec.rb +16 -2
  323. data/spec/mongoid/extensions/big_decimal_spec.rb +712 -212
  324. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  325. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  326. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  327. data/spec/mongoid/extensions/date_spec.rb +71 -1
  328. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  329. data/spec/mongoid/extensions/float_spec.rb +53 -74
  330. data/spec/mongoid/extensions/hash_spec.rb +33 -3
  331. data/spec/mongoid/extensions/integer_spec.rb +50 -64
  332. data/spec/mongoid/extensions/range_spec.rb +255 -54
  333. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  334. data/spec/mongoid/extensions/set_spec.rb +106 -0
  335. data/spec/mongoid/extensions/string_spec.rb +53 -25
  336. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  337. data/spec/mongoid/extensions/time_spec.rb +639 -106
  338. data/spec/mongoid/extensions/time_with_zone_spec.rb +24 -83
  339. data/spec/mongoid/factory_spec.rb +61 -1
  340. data/spec/mongoid/fields/localized_spec.rb +80 -37
  341. data/spec/mongoid/fields_spec.rb +500 -84
  342. data/spec/mongoid/findable_spec.rb +450 -58
  343. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  344. data/spec/mongoid/indexable_spec.rb +55 -30
  345. data/spec/mongoid/interceptable_spec.rb +599 -8
  346. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  347. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  348. data/spec/mongoid/mongoizable_spec.rb +285 -0
  349. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  350. data/spec/mongoid/persistable/deletable_spec.rb +28 -8
  351. data/spec/mongoid/persistable/destroyable_spec.rb +28 -8
  352. data/spec/mongoid/persistable/incrementable_spec.rb +37 -0
  353. data/spec/mongoid/persistable/logical_spec.rb +37 -0
  354. data/spec/mongoid/persistable/poppable_spec.rb +36 -0
  355. data/spec/mongoid/persistable/pullable_spec.rb +72 -0
  356. data/spec/mongoid/persistable/pushable_spec.rb +72 -0
  357. data/spec/mongoid/persistable/renamable_spec.rb +36 -0
  358. data/spec/mongoid/persistable/savable_spec.rb +96 -0
  359. data/spec/mongoid/persistable/settable_spec.rb +37 -0
  360. data/spec/mongoid/persistable/unsettable_spec.rb +36 -0
  361. data/spec/mongoid/persistable/updatable_spec.rb +20 -28
  362. data/spec/mongoid/persistable/upsertable_spec.rb +89 -1
  363. data/spec/mongoid/persistence_context_spec.rb +31 -57
  364. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  365. data/spec/mongoid/query_cache_spec.rb +56 -215
  366. data/spec/mongoid/reloadable_spec.rb +83 -6
  367. data/spec/mongoid/scopable_spec.rb +91 -1
  368. data/spec/mongoid/serializable_spec.rb +9 -30
  369. data/spec/mongoid/shardable_spec.rb +4 -4
  370. data/spec/mongoid/stateful_spec.rb +150 -8
  371. data/spec/mongoid/tasks/database_rake_spec.rb +74 -0
  372. data/spec/mongoid/tasks/database_spec.rb +127 -0
  373. data/spec/mongoid/timestamps_spec.rb +392 -4
  374. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  375. data/spec/mongoid/touchable_spec.rb +390 -2
  376. data/spec/mongoid/touchable_spec_models.rb +14 -8
  377. data/spec/mongoid/traversable_spec.rb +13 -35
  378. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  379. data/spec/mongoid/validatable/uniqueness_spec.rb +58 -31
  380. data/spec/mongoid/warnings_spec.rb +35 -0
  381. data/spec/mongoid_spec.rb +34 -16
  382. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  383. data/spec/rails/mongoid_spec.rb +4 -16
  384. data/spec/spec_helper.rb +5 -0
  385. data/spec/support/constraints.rb +24 -0
  386. data/spec/support/immutable_ids.rb +118 -0
  387. data/spec/support/macros.rb +78 -0
  388. data/spec/support/models/artist.rb +0 -1
  389. data/spec/support/models/augmentation.rb +12 -0
  390. data/spec/support/models/band.rb +4 -0
  391. data/spec/support/models/book.rb +1 -0
  392. data/spec/support/models/building.rb +2 -0
  393. data/spec/support/models/catalog.rb +24 -0
  394. data/spec/support/models/circus.rb +3 -0
  395. data/spec/support/models/cover.rb +10 -0
  396. data/spec/support/models/fanatic.rb +8 -0
  397. data/spec/support/models/implant.rb +9 -0
  398. data/spec/support/models/label.rb +2 -0
  399. data/spec/support/models/passport.rb +9 -0
  400. data/spec/support/models/person.rb +2 -0
  401. data/spec/support/models/player.rb +2 -0
  402. data/spec/support/models/powerup.rb +12 -0
  403. data/spec/support/models/product.rb +1 -0
  404. data/spec/support/models/purse.rb +9 -0
  405. data/spec/support/models/registry.rb +1 -0
  406. data/spec/support/models/school.rb +14 -0
  407. data/spec/support/models/shield.rb +18 -0
  408. data/spec/support/models/student.rb +14 -0
  409. data/spec/support/models/weapon.rb +12 -0
  410. data.tar.gz.sig +0 -0
  411. metadata +718 -641
  412. metadata.gz.sig +0 -0
  413. data/lib/mongoid/errors/eager_load.rb +0 -23
  414. data/lib/mongoid/errors/invalid_value.rb +0 -17
  415. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -60
  416. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -60
  417. data/spec/mongoid/errors/eager_load_spec.rb +0 -31
@@ -580,10 +580,22 @@ describe Mongoid::Interceptable do
580
580
  end
581
581
 
582
582
  context "when saving the root" do
583
+ context 'with prevent_multiple_calls_of_embedded_callbacks enabled' do
584
+ config_override :prevent_multiple_calls_of_embedded_callbacks, true
583
585
 
584
- it "only executes the callbacks once for each embed" do
585
- expect(note).to receive(:update_saved).twice
586
- band.save!
586
+ it "executes the callbacks only once for each document" do
587
+ expect(note).to receive(:update_saved).once
588
+ band.save!
589
+ end
590
+ end
591
+
592
+ context 'with prevent_multiple_calls_of_embedded_callbacks disabled' do
593
+ config_override :prevent_multiple_calls_of_embedded_callbacks, false
594
+
595
+ it "executes the callbacks once for each ember" do
596
+ expect(note).to receive(:update_saved).twice
597
+ band.save!
598
+ end
587
599
  end
588
600
  end
589
601
  end
@@ -1746,8 +1758,12 @@ describe Mongoid::Interceptable do
1746
1758
  [InterceptableSpec::CbChild, :after_validation],
1747
1759
  [InterceptableSpec::CbParent, :after_validation],
1748
1760
  [InterceptableSpec::CbParent, :before_save],
1761
+ [InterceptableSpec::CbParent, :around_save_open],
1749
1762
  [InterceptableSpec::CbParent, :before_create],
1763
+ [InterceptableSpec::CbParent, :around_create_open],
1764
+ [InterceptableSpec::CbParent, :around_create_close],
1750
1765
  [InterceptableSpec::CbParent, :after_create],
1766
+ [InterceptableSpec::CbParent, :around_save_close],
1751
1767
  [InterceptableSpec::CbParent, :after_save],
1752
1768
  ]
1753
1769
  end
@@ -1769,26 +1785,601 @@ describe Mongoid::Interceptable do
1769
1785
 
1770
1786
  let(:expected) do
1771
1787
  [
1788
+ [InterceptableSpec::CbCascadedChild, :before_validation],
1789
+ [InterceptableSpec::CbCascadedChild, :after_validation],
1772
1790
  [InterceptableSpec::CbParent, :before_validation],
1773
1791
  [InterceptableSpec::CbCascadedChild, :before_validation],
1774
1792
  [InterceptableSpec::CbCascadedChild, :after_validation],
1793
+
1775
1794
  [InterceptableSpec::CbParent, :after_validation],
1776
1795
  [InterceptableSpec::CbParent, :before_save],
1777
- [InterceptableSpec::CbCascadedChild, :before_save],
1796
+ [InterceptableSpec::CbParent, :around_save_open],
1778
1797
  [InterceptableSpec::CbParent, :before_create],
1798
+ [InterceptableSpec::CbParent, :around_create_open],
1799
+
1800
+ [InterceptableSpec::CbCascadedChild, :before_save],
1801
+ [InterceptableSpec::CbCascadedChild, :around_save_open],
1779
1802
  [InterceptableSpec::CbCascadedChild, :before_create],
1780
- [InterceptableSpec::CbParent, :after_create],
1803
+ [InterceptableSpec::CbCascadedChild, :around_create_open],
1804
+
1805
+ [InterceptableSpec::CbCascadedChild, :around_create_close],
1781
1806
  [InterceptableSpec::CbCascadedChild, :after_create],
1782
- [InterceptableSpec::CbParent, :after_save],
1807
+ [InterceptableSpec::CbCascadedChild, :around_save_close],
1783
1808
  [InterceptableSpec::CbCascadedChild, :after_save],
1809
+
1810
+ [InterceptableSpec::CbParent, :around_create_close],
1811
+ [InterceptableSpec::CbParent, :after_create],
1812
+ [InterceptableSpec::CbParent, :around_save_close],
1813
+ [InterceptableSpec::CbParent, :after_save]
1784
1814
  ]
1785
1815
  end
1786
1816
 
1787
1817
  it 'calls callbacks in the right order' do
1788
- pending 'MONGOID-3795'
1789
-
1790
1818
  parent.save!
1791
1819
  expect(registry.calls).to eq expected
1792
1820
  end
1793
1821
  end
1822
+
1823
+ context "with associations" do
1824
+ context "has_one" do
1825
+ let(:registry) { InterceptableSpec::CallbackRegistry.new }
1826
+
1827
+ let(:parent) do
1828
+ InterceptableSpec::CbHasOneParent.new(registry).tap do |parent|
1829
+ parent.child = InterceptableSpec::CbHasOneChild.new(registry)
1830
+ end
1831
+ end
1832
+
1833
+ let(:expected) do
1834
+ [
1835
+ [InterceptableSpec::CbHasOneParent, :before_validation],
1836
+ [InterceptableSpec::CbHasOneChild, :before_validation],
1837
+ [InterceptableSpec::CbHasOneChild, :after_validation],
1838
+ [InterceptableSpec::CbHasOneParent, :after_validation],
1839
+ [InterceptableSpec::CbHasOneParent, :before_save],
1840
+
1841
+ [InterceptableSpec::CbHasOneParent, :around_save_open],
1842
+ [InterceptableSpec::CbHasOneParent, :before_create],
1843
+ [InterceptableSpec::CbHasOneParent, :around_create_open],
1844
+
1845
+ [InterceptableSpec::CbHasOneParent, :insert_into_database],
1846
+
1847
+ [InterceptableSpec::CbHasOneChild, :before_validation],
1848
+ [InterceptableSpec::CbHasOneChild, :after_validation],
1849
+ [InterceptableSpec::CbHasOneChild, :before_save],
1850
+ [InterceptableSpec::CbHasOneChild, :around_save_open],
1851
+ [InterceptableSpec::CbHasOneChild, :before_create],
1852
+ [InterceptableSpec::CbHasOneChild, :around_create_open],
1853
+
1854
+ [InterceptableSpec::CbHasOneChild, :around_create_close],
1855
+ [InterceptableSpec::CbHasOneChild, :after_create],
1856
+ [InterceptableSpec::CbHasOneChild, :around_save_close],
1857
+ [InterceptableSpec::CbHasOneChild, :after_save],
1858
+
1859
+ [InterceptableSpec::CbHasOneParent, :around_create_close],
1860
+ [InterceptableSpec::CbHasOneParent, :after_create],
1861
+ [InterceptableSpec::CbHasOneParent, :around_save_close],
1862
+ [InterceptableSpec::CbHasOneParent, :after_save],
1863
+ ]
1864
+ end
1865
+
1866
+ it 'calls callbacks in the right order' do
1867
+ parent.save!
1868
+ expect(registry.calls).to eq expected
1869
+ end
1870
+ end
1871
+
1872
+ context "embeds_one" do
1873
+ let(:registry) { InterceptableSpec::CallbackRegistry.new }
1874
+
1875
+ let(:parent) do
1876
+ InterceptableSpec::CbEmbedsOneParent.new(registry).tap do |parent|
1877
+ parent.child = InterceptableSpec::CbEmbedsOneChild.new(registry)
1878
+ end
1879
+ end
1880
+
1881
+ context "create" do
1882
+ let(:expected) do
1883
+ [
1884
+ [InterceptableSpec::CbEmbedsOneChild, :before_validation],
1885
+ [InterceptableSpec::CbEmbedsOneChild, :after_validation],
1886
+ [InterceptableSpec::CbEmbedsOneParent, :before_validation],
1887
+ [InterceptableSpec::CbEmbedsOneChild, :before_validation],
1888
+ [InterceptableSpec::CbEmbedsOneChild, :after_validation],
1889
+ [InterceptableSpec::CbEmbedsOneParent, :after_validation],
1890
+
1891
+ [InterceptableSpec::CbEmbedsOneParent, :before_save],
1892
+ [InterceptableSpec::CbEmbedsOneParent, :around_save_open],
1893
+ [InterceptableSpec::CbEmbedsOneParent, :before_create],
1894
+ [InterceptableSpec::CbEmbedsOneParent, :around_create_open],
1895
+
1896
+ [InterceptableSpec::CbEmbedsOneChild, :before_save],
1897
+ [InterceptableSpec::CbEmbedsOneChild, :around_save_open],
1898
+ [InterceptableSpec::CbEmbedsOneChild, :before_create],
1899
+ [InterceptableSpec::CbEmbedsOneChild, :around_create_open],
1900
+
1901
+ [InterceptableSpec::CbEmbedsOneParent, :insert_into_database],
1902
+
1903
+ [InterceptableSpec::CbEmbedsOneChild, :around_create_close],
1904
+ [InterceptableSpec::CbEmbedsOneChild, :after_create],
1905
+ [InterceptableSpec::CbEmbedsOneChild, :around_save_close],
1906
+ [InterceptableSpec::CbEmbedsOneChild, :after_save],
1907
+
1908
+ [InterceptableSpec::CbEmbedsOneParent, :around_create_close],
1909
+ [InterceptableSpec::CbEmbedsOneParent, :after_create],
1910
+ [InterceptableSpec::CbEmbedsOneParent, :around_save_close],
1911
+ [InterceptableSpec::CbEmbedsOneParent, :after_save]
1912
+ ]
1913
+ end
1914
+
1915
+ it 'calls callbacks in the right order' do
1916
+ parent.save!
1917
+ expect(registry.calls).to eq expected
1918
+ end
1919
+ end
1920
+
1921
+ context "update" do
1922
+ let(:expected) do
1923
+ [
1924
+ [InterceptableSpec::CbEmbedsOneChild, :before_validation],
1925
+ [InterceptableSpec::CbEmbedsOneChild, :after_validation],
1926
+ [InterceptableSpec::CbEmbedsOneParent, :before_validation],
1927
+ [InterceptableSpec::CbEmbedsOneChild, :before_validation],
1928
+ [InterceptableSpec::CbEmbedsOneChild, :after_validation],
1929
+ [InterceptableSpec::CbEmbedsOneParent, :after_validation],
1930
+
1931
+ [InterceptableSpec::CbEmbedsOneParent, :before_save],
1932
+ [InterceptableSpec::CbEmbedsOneParent, :around_save_open],
1933
+ [InterceptableSpec::CbEmbedsOneParent, :before_update],
1934
+ [InterceptableSpec::CbEmbedsOneParent, :around_update_open],
1935
+
1936
+ [InterceptableSpec::CbEmbedsOneChild, :before_save],
1937
+ [InterceptableSpec::CbEmbedsOneChild, :around_save_open],
1938
+ [InterceptableSpec::CbEmbedsOneChild, :before_update],
1939
+ [InterceptableSpec::CbEmbedsOneChild, :around_update_open],
1940
+
1941
+ [InterceptableSpec::CbEmbedsOneChild, :around_update_close],
1942
+ [InterceptableSpec::CbEmbedsOneChild, :after_update],
1943
+ [InterceptableSpec::CbEmbedsOneChild, :around_save_close],
1944
+ [InterceptableSpec::CbEmbedsOneChild, :after_save],
1945
+
1946
+ [InterceptableSpec::CbEmbedsOneParent, :around_update_close],
1947
+ [InterceptableSpec::CbEmbedsOneParent, :after_update],
1948
+ [InterceptableSpec::CbEmbedsOneParent, :around_save_close],
1949
+ [InterceptableSpec::CbEmbedsOneParent, :after_save]
1950
+ ]
1951
+ end
1952
+
1953
+ it 'calls callbacks in the right order' do
1954
+ parent.callback_registry = nil
1955
+ parent.child.callback_registry = nil
1956
+ parent.save!
1957
+
1958
+ parent.callback_registry = registry
1959
+ parent.child.callback_registry = registry
1960
+ parent.name = "name"
1961
+ parent.child.age = 10
1962
+
1963
+ parent.save!
1964
+ expect(registry.calls).to eq expected
1965
+ end
1966
+ end
1967
+ end
1968
+
1969
+ context "has_many" do
1970
+ let(:registry) { InterceptableSpec::CallbackRegistry.new }
1971
+
1972
+ let(:parent) do
1973
+ InterceptableSpec::CbHasManyParent.new(registry).tap do |parent|
1974
+ parent.children = [
1975
+ InterceptableSpec::CbHasManyChild.new(registry),
1976
+ InterceptableSpec::CbHasManyChild.new(registry)
1977
+ ]
1978
+ end
1979
+ end
1980
+
1981
+ let(:expected) do
1982
+ [
1983
+ [InterceptableSpec::CbHasManyParent, :before_validation],
1984
+ [InterceptableSpec::CbHasManyChild, :before_validation],
1985
+ [InterceptableSpec::CbHasManyChild, :after_validation],
1986
+ [InterceptableSpec::CbHasManyChild, :before_validation],
1987
+ [InterceptableSpec::CbHasManyChild, :after_validation],
1988
+ [InterceptableSpec::CbHasManyParent, :after_validation],
1989
+
1990
+ [InterceptableSpec::CbHasManyParent, :before_save],
1991
+ [InterceptableSpec::CbHasManyParent, :around_save_open],
1992
+ [InterceptableSpec::CbHasManyParent, :before_create],
1993
+ [InterceptableSpec::CbHasManyParent, :around_create_open],
1994
+
1995
+ [InterceptableSpec::CbHasManyParent, :insert_into_database],
1996
+
1997
+ [InterceptableSpec::CbHasManyChild, :before_validation],
1998
+ [InterceptableSpec::CbHasManyChild, :after_validation],
1999
+ [InterceptableSpec::CbHasManyChild, :before_save],
2000
+ [InterceptableSpec::CbHasManyChild, :around_save_open],
2001
+ [InterceptableSpec::CbHasManyChild, :before_create],
2002
+ [InterceptableSpec::CbHasManyChild, :around_create_open],
2003
+ [InterceptableSpec::CbHasManyChild, :around_create_close],
2004
+ [InterceptableSpec::CbHasManyChild, :after_create],
2005
+ [InterceptableSpec::CbHasManyChild, :around_save_close],
2006
+ [InterceptableSpec::CbHasManyChild, :after_save],
2007
+
2008
+ [InterceptableSpec::CbHasManyChild, :before_validation],
2009
+ [InterceptableSpec::CbHasManyChild, :after_validation],
2010
+ [InterceptableSpec::CbHasManyChild, :before_save],
2011
+ [InterceptableSpec::CbHasManyChild, :around_save_open],
2012
+ [InterceptableSpec::CbHasManyChild, :before_create],
2013
+ [InterceptableSpec::CbHasManyChild, :around_create_open],
2014
+ [InterceptableSpec::CbHasManyChild, :around_create_close],
2015
+ [InterceptableSpec::CbHasManyChild, :after_create],
2016
+ [InterceptableSpec::CbHasManyChild, :around_save_close],
2017
+ [InterceptableSpec::CbHasManyChild, :after_save],
2018
+
2019
+ [InterceptableSpec::CbHasManyParent, :around_create_close],
2020
+ [InterceptableSpec::CbHasManyParent, :after_create],
2021
+ [InterceptableSpec::CbHasManyParent, :around_save_close],
2022
+ [InterceptableSpec::CbHasManyParent, :after_save]
2023
+ ]
2024
+ end
2025
+
2026
+ it 'calls callbacks in the right order' do
2027
+ parent.save!
2028
+ expect(registry.calls).to eq expected
2029
+ end
2030
+ end
2031
+
2032
+ context "embeds_many" do
2033
+ let(:registry) { InterceptableSpec::CallbackRegistry.new }
2034
+
2035
+ let(:parent) do
2036
+ InterceptableSpec::CbEmbedsManyParent.new(registry).tap do |parent|
2037
+ parent.children = [
2038
+ InterceptableSpec::CbEmbedsManyChild.new(registry),
2039
+ InterceptableSpec::CbEmbedsManyChild.new(registry),
2040
+ ]
2041
+ end
2042
+ end
2043
+
2044
+ let(:expected) do
2045
+ [
2046
+ [InterceptableSpec::CbEmbedsManyChild, :before_validation],
2047
+ [InterceptableSpec::CbEmbedsManyChild, :after_validation],
2048
+ [InterceptableSpec::CbEmbedsManyChild, :before_validation],
2049
+ [InterceptableSpec::CbEmbedsManyChild, :after_validation],
2050
+ [InterceptableSpec::CbEmbedsManyParent, :before_validation],
2051
+ [InterceptableSpec::CbEmbedsManyChild, :before_validation],
2052
+ [InterceptableSpec::CbEmbedsManyChild, :after_validation],
2053
+ [InterceptableSpec::CbEmbedsManyChild, :before_validation],
2054
+ [InterceptableSpec::CbEmbedsManyChild, :after_validation],
2055
+ [InterceptableSpec::CbEmbedsManyParent, :after_validation],
2056
+
2057
+ [InterceptableSpec::CbEmbedsManyParent, :before_save],
2058
+ [InterceptableSpec::CbEmbedsManyParent, :around_save_open],
2059
+ [InterceptableSpec::CbEmbedsManyParent, :before_create],
2060
+ [InterceptableSpec::CbEmbedsManyParent, :around_create_open],
2061
+
2062
+ [InterceptableSpec::CbEmbedsManyChild, :before_save],
2063
+ [InterceptableSpec::CbEmbedsManyChild, :around_save_open],
2064
+ [InterceptableSpec::CbEmbedsManyChild, :before_save],
2065
+
2066
+ [InterceptableSpec::CbEmbedsManyChild, :around_save_open],
2067
+ [InterceptableSpec::CbEmbedsManyChild, :before_create],
2068
+ [InterceptableSpec::CbEmbedsManyChild, :around_create_open],
2069
+
2070
+ [InterceptableSpec::CbEmbedsManyChild, :before_create],
2071
+ [InterceptableSpec::CbEmbedsManyChild, :around_create_open],
2072
+
2073
+ [InterceptableSpec::CbEmbedsManyParent, :insert_into_database],
2074
+
2075
+ [InterceptableSpec::CbEmbedsManyChild, :around_create_close],
2076
+ [InterceptableSpec::CbEmbedsManyChild, :after_create],
2077
+
2078
+ [InterceptableSpec::CbEmbedsManyChild, :around_create_close],
2079
+ [InterceptableSpec::CbEmbedsManyChild, :after_create],
2080
+
2081
+ [InterceptableSpec::CbEmbedsManyChild, :around_save_close],
2082
+ [InterceptableSpec::CbEmbedsManyChild, :after_save],
2083
+
2084
+ [InterceptableSpec::CbEmbedsManyChild, :around_save_close],
2085
+ [InterceptableSpec::CbEmbedsManyChild, :after_save],
2086
+
2087
+ [InterceptableSpec::CbEmbedsManyParent, :around_create_close],
2088
+ [InterceptableSpec::CbEmbedsManyParent, :after_create],
2089
+ [InterceptableSpec::CbEmbedsManyParent, :around_save_close],
2090
+ [InterceptableSpec::CbEmbedsManyParent, :after_save]
2091
+ ]
2092
+ end
2093
+
2094
+ it 'calls callbacks in the right order' do
2095
+ parent.save!
2096
+ expect(registry.calls).to eq expected
2097
+ end
2098
+ end
2099
+ end
2100
+
2101
+ context "when accessing parent document from callbacks" do
2102
+ shared_examples 'accesses the correct parent' do
2103
+ it "accesses the correct parent in after_find" do
2104
+ expect(from_db.after_find_player).to eq(player._id)
2105
+ end
2106
+
2107
+ it "accesses the correct parent in after_initialize" do
2108
+ expect(from_db.after_initialize_player).to eq(player._id)
2109
+ end
2110
+
2111
+ it "accesses the correct parent in default" do
2112
+ expect(from_db.after_default_player).to eq(player._id)
2113
+ end
2114
+
2115
+ it "accesses the correct parent in unpersisted after_initialize" do
2116
+ expect(unpersisted.after_initialize_player).to eq(player._id)
2117
+ end
2118
+ end
2119
+
2120
+ context "when using create methods" do
2121
+
2122
+ context "when the child is an embeds_many association" do
2123
+ let!(:player) do
2124
+ Player.create!.tap do |player|
2125
+ player.implants.create!
2126
+ end
2127
+ end
2128
+
2129
+ let(:unpersisted) { player.implants.first }
2130
+
2131
+ before do
2132
+ # The default is originally set when creating this document, and it is
2133
+ # subsequently persisted to the database. Therefore when we retrieve
2134
+ # this document from the database, this field is already set, and
2135
+ # the default Proc is not called. This unset is needed to allow the
2136
+ # default Proc to be called when the document is retrieved from the
2137
+ # database.
2138
+ Player.find(player.id).implants.first.unset(:after_default_player)
2139
+ end
2140
+
2141
+ let(:from_db) do
2142
+ Player.find(player.id).implants.first
2143
+ end
2144
+
2145
+ include_examples 'accesses the correct parent'
2146
+ end
2147
+
2148
+ context "when the child is an embeds_one association" do
2149
+ let!(:player) do
2150
+ Player.create!.tap do |player|
2151
+ player.create_augmentation
2152
+ end
2153
+ end
2154
+
2155
+ let(:unpersisted) { player.augmentation }
2156
+
2157
+ before do
2158
+ Player.find(player.id).augmentation.unset(:after_default_player)
2159
+ end
2160
+
2161
+ let(:from_db) do
2162
+ Player.find(player.id).augmentation
2163
+ end
2164
+
2165
+ include_examples 'accesses the correct parent'
2166
+ end
2167
+
2168
+ context "when the child is a has_many association" do
2169
+ let!(:player) do
2170
+ Player.create!.tap do |player|
2171
+ player.weapons.create!
2172
+ end
2173
+ end
2174
+
2175
+ let(:unpersisted) { player.weapons.first }
2176
+
2177
+ before do
2178
+ Player.find(player.id).weapons.first.unset(:after_default_player)
2179
+ end
2180
+
2181
+ let(:from_db) do
2182
+ Player.find(player.id).weapons.first
2183
+ end
2184
+
2185
+ include_examples 'accesses the correct parent'
2186
+ end
2187
+
2188
+ context "when the child is a has_one association" do
2189
+ let!(:player) do
2190
+ Player.create!.tap do |player|
2191
+ player.create_powerup
2192
+ player.save!
2193
+ end
2194
+ end
2195
+
2196
+ let(:unpersisted) { player.powerup }
2197
+
2198
+ before do
2199
+ Player.find(player.id).powerup.unset(:after_default_player)
2200
+ end
2201
+
2202
+ let(:from_db) do
2203
+ Player.find(player.id).powerup
2204
+ end
2205
+
2206
+ include_examples 'accesses the correct parent'
2207
+ end
2208
+
2209
+ context "when the child is a has_and_belongs_to_many association" do
2210
+ let!(:player) do
2211
+ Player.create!.tap do |player|
2212
+ player.shields.create!
2213
+ end
2214
+ end
2215
+
2216
+ let(:unpersisted) { player.shields.first }
2217
+
2218
+ before do
2219
+ Player.find(player.id).shields.unset(:after_default_player)
2220
+ end
2221
+
2222
+ let(:from_db) do
2223
+ Player.find(player.id).shields.first
2224
+ end
2225
+
2226
+ include_examples 'accesses the correct parent'
2227
+ end
2228
+ end
2229
+
2230
+ context "when using build methods" do
2231
+
2232
+ context "when the child is an embeds_many association" do
2233
+ let!(:player) do
2234
+ Player.create!.tap do |player|
2235
+ player.implants.build
2236
+ player.implants.first.save!
2237
+ end
2238
+ end
2239
+
2240
+ let(:unpersisted) { player.implants.first }
2241
+
2242
+ before do
2243
+ Player.find(player.id).implants.first.unset(:after_default_player)
2244
+ end
2245
+
2246
+ let(:from_db) do
2247
+ Player.find(player.id).implants.first
2248
+ end
2249
+
2250
+ include_examples 'accesses the correct parent'
2251
+ end
2252
+
2253
+ context "when the child is an embeds_one association" do
2254
+ let!(:player) do
2255
+ Player.create!.tap do |player|
2256
+ player.build_augmentation
2257
+ player.save!
2258
+ end
2259
+ end
2260
+
2261
+ let(:unpersisted) { player.augmentation }
2262
+
2263
+ before do
2264
+ Player.find(player.id).augmentation.unset(:after_default_player)
2265
+ end
2266
+
2267
+ let(:from_db) do
2268
+ Player.find(player.id).augmentation
2269
+ end
2270
+
2271
+ include_examples 'accesses the correct parent'
2272
+ end
2273
+
2274
+ context "when the child is a has_many association" do
2275
+ let!(:player) do
2276
+ Player.create!.tap do |player|
2277
+ player.weapons.build
2278
+ player.weapons.first.save!
2279
+ end
2280
+ end
2281
+
2282
+ let(:unpersisted) { player.weapons.first }
2283
+
2284
+ before do
2285
+ Player.find(player.id).weapons.first.unset(:after_default_player)
2286
+ end
2287
+
2288
+ let(:from_db) do
2289
+ Player.find(player.id).weapons.first
2290
+ end
2291
+
2292
+ include_examples 'accesses the correct parent'
2293
+ end
2294
+
2295
+ context "when the child is a has_one association" do
2296
+ let!(:player) do
2297
+ Player.create!.tap do |player|
2298
+ player.build_powerup
2299
+ player.powerup.save!
2300
+ end
2301
+ end
2302
+
2303
+ let(:unpersisted) { player.powerup }
2304
+
2305
+ before do
2306
+ Player.find(player.id).powerup.unset(:after_default_player)
2307
+ end
2308
+
2309
+ let(:from_db) do
2310
+ Player.find(player.id).powerup
2311
+ end
2312
+
2313
+ include_examples 'accesses the correct parent'
2314
+ end
2315
+
2316
+ context "when the child is a has_and_belongs_to_many association" do
2317
+ let!(:player) do
2318
+ Player.create!.tap do |player|
2319
+ player.shields.build
2320
+ player.shields.first.save!
2321
+ end
2322
+ end
2323
+
2324
+ let(:unpersisted) { player.shields.first }
2325
+
2326
+ before do
2327
+ Player.find(player.id).shields.unset(:after_default_player)
2328
+ end
2329
+
2330
+ let(:from_db) do
2331
+ Player.find(player.id).shields.first
2332
+ end
2333
+
2334
+ include_examples 'accesses the correct parent'
2335
+ end
2336
+ end
2337
+ end
2338
+
2339
+ context "when accessing associations in defaults" do
2340
+ context "when not using autobuilding" do
2341
+ let(:band) { InterceptableBand.create(name: "Molejo") }
2342
+ let(:song) { band.songs.create(name: "Cilada") }
2343
+
2344
+ it "assigns the default correctly" do
2345
+ expect(song.band_name).to eq("Molejo")
2346
+ end
2347
+ end
2348
+
2349
+ context "when using autobuilding" do
2350
+ before do
2351
+ InterceptablePlane.create!.tap do |plane|
2352
+ plane.wings.create!
2353
+ end
2354
+ end
2355
+
2356
+ let(:plane) { InterceptablePlane.first }
2357
+ let(:wing) { InterceptableWing.first }
2358
+ let(:engine) { wing.engine }
2359
+
2360
+ it "sets the defaults correctly" do
2361
+ expect(wing._id).to eq("hello-wing")
2362
+ expect(wing.p_id).to eq(plane._id.to_s)
2363
+ expect(wing.e_id).to eq(engine._id.to_s)
2364
+ expect(engine._id).to eq("hello-engine-#{wing.id}")
2365
+ end
2366
+ end
2367
+ end
2368
+
2369
+ # This case is rather niche. The _ids method used to use the `.only` method
2370
+ # to get only the _ids for an association, which was causing a
2371
+ # MissingAttributeError to be raised when accessing another association. This
2372
+ # was fixed by using `.pluck` over `.only`. Look at MONGOID-5306 for a more
2373
+ # detailed explanation.
2374
+ context "when accessing _ids in validate and access an association in after_initialize" do
2375
+ it "doesn't raise a MissingAttributeError" do
2376
+ company = InterceptableCompany.create!
2377
+ shop = InterceptableShop.create!(company: company)
2378
+ user = InterceptableUser.new
2379
+ user.company = company
2380
+ expect do
2381
+ user.save!
2382
+ end.to_not raise_error(ActiveModel::MissingAttributeError)
2383
+ end
2384
+ end
1794
2385
  end