mongoid 7.4.3 → 8.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (383) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +3 -3
  4. data/Rakefile +25 -0
  5. data/lib/config/locales/en.yml +52 -28
  6. data/lib/mongoid/association/accessors.rb +38 -9
  7. data/lib/mongoid/association/bindable.rb +50 -2
  8. data/lib/mongoid/association/builders.rb +4 -2
  9. data/lib/mongoid/association/constrainable.rb +0 -1
  10. data/lib/mongoid/association/eager_loadable.rb +29 -7
  11. data/lib/mongoid/association/embedded/batchable.rb +33 -10
  12. data/lib/mongoid/association/embedded/cyclic.rb +1 -1
  13. data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
  14. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +2 -2
  15. data/lib/mongoid/association/embedded/embedded_in.rb +3 -2
  16. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
  17. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +1 -1
  18. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +65 -41
  19. data/lib/mongoid/association/embedded/embeds_many.rb +2 -2
  20. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +18 -4
  21. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +23 -4
  22. data/lib/mongoid/association/embedded/embeds_one.rb +3 -3
  23. data/lib/mongoid/association/macros.rb +28 -1
  24. data/lib/mongoid/association/many.rb +11 -7
  25. data/lib/mongoid/association/nested/many.rb +5 -4
  26. data/lib/mongoid/association/nested/nested_buildable.rb +4 -4
  27. data/lib/mongoid/association/nested/one.rb +5 -5
  28. data/lib/mongoid/association/one.rb +2 -2
  29. data/lib/mongoid/association/options.rb +9 -9
  30. data/lib/mongoid/association/proxy.rb +14 -3
  31. data/lib/mongoid/association/referenced/auto_save.rb +4 -3
  32. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  33. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  34. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +5 -6
  35. data/lib/mongoid/association/referenced/belongs_to.rb +2 -2
  36. data/lib/mongoid/association/referenced/counter_cache.rb +10 -10
  37. data/lib/mongoid/association/referenced/eager.rb +2 -2
  38. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +70 -13
  39. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +6 -3
  40. data/lib/mongoid/association/referenced/has_many/enumerable.rb +20 -24
  41. data/lib/mongoid/association/referenced/has_many/proxy.rb +26 -16
  42. data/lib/mongoid/association/referenced/has_many.rb +3 -3
  43. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  44. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +5 -5
  45. data/lib/mongoid/association/referenced/has_one/proxy.rb +9 -12
  46. data/lib/mongoid/association/referenced/has_one.rb +3 -3
  47. data/lib/mongoid/association/referenced/syncable.rb +4 -4
  48. data/lib/mongoid/association/reflections.rb +2 -2
  49. data/lib/mongoid/association/relatable.rb +44 -10
  50. data/lib/mongoid/association.rb +5 -5
  51. data/lib/mongoid/atomic/modifiers.rb +2 -2
  52. data/lib/mongoid/atomic.rb +7 -0
  53. data/lib/mongoid/attributes/dynamic.rb +3 -3
  54. data/lib/mongoid/attributes/nested.rb +5 -5
  55. data/lib/mongoid/attributes/processing.rb +37 -6
  56. data/lib/mongoid/attributes/projector.rb +1 -1
  57. data/lib/mongoid/attributes/readonly.rb +2 -2
  58. data/lib/mongoid/attributes.rb +43 -40
  59. data/lib/mongoid/cacheable.rb +2 -2
  60. data/lib/mongoid/changeable.rb +43 -10
  61. data/lib/mongoid/clients/options.rb +5 -1
  62. data/lib/mongoid/clients/sessions.rb +2 -14
  63. data/lib/mongoid/clients/validators/storage.rb +3 -3
  64. data/lib/mongoid/config/options.rb +3 -0
  65. data/lib/mongoid/config/validators/client.rb +6 -6
  66. data/lib/mongoid/config.rb +62 -17
  67. data/lib/mongoid/contextual/aggregable/memory.rb +24 -16
  68. data/lib/mongoid/contextual/aggregable/mongo.rb +5 -5
  69. data/lib/mongoid/contextual/aggregable/none.rb +1 -1
  70. data/lib/mongoid/contextual/atomic.rb +1 -1
  71. data/lib/mongoid/contextual/geo_near.rb +7 -7
  72. data/lib/mongoid/contextual/map_reduce.rb +2 -2
  73. data/lib/mongoid/contextual/memory.rb +180 -21
  74. data/lib/mongoid/contextual/mongo.rb +260 -217
  75. data/lib/mongoid/contextual/none.rb +67 -5
  76. data/lib/mongoid/contextual/queryable.rb +1 -1
  77. data/lib/mongoid/contextual.rb +2 -2
  78. data/lib/mongoid/copyable.rb +32 -8
  79. data/lib/mongoid/criteria/findable.rb +7 -4
  80. data/lib/mongoid/criteria/includable.rb +24 -20
  81. data/lib/mongoid/criteria/marshalable.rb +10 -2
  82. data/lib/mongoid/criteria/permission.rb +1 -1
  83. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -2
  84. data/lib/mongoid/criteria/queryable/extensions/array.rb +3 -14
  85. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
  86. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -2
  87. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
  88. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
  89. data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -15
  90. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -9
  91. data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
  92. data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
  93. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
  94. data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -1
  95. data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -14
  96. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -12
  97. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
  98. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
  99. data/lib/mongoid/criteria/queryable/key.rb +3 -3
  100. data/lib/mongoid/criteria/queryable/mergeable.rb +21 -0
  101. data/lib/mongoid/criteria/queryable/optional.rb +5 -11
  102. data/lib/mongoid/criteria/queryable/options.rb +2 -2
  103. data/lib/mongoid/criteria/queryable/pipeline.rb +1 -1
  104. data/lib/mongoid/criteria/queryable/selectable.rb +31 -37
  105. data/lib/mongoid/criteria/queryable/selector.rb +93 -8
  106. data/lib/mongoid/criteria/queryable/smash.rb +40 -7
  107. data/lib/mongoid/criteria/queryable/storable.rb +1 -1
  108. data/lib/mongoid/criteria/queryable.rb +12 -7
  109. data/lib/mongoid/criteria/scopable.rb +2 -2
  110. data/lib/mongoid/criteria/translator.rb +45 -0
  111. data/lib/mongoid/criteria.rb +16 -35
  112. data/lib/mongoid/deprecable.rb +37 -0
  113. data/lib/mongoid/deprecation.rb +25 -0
  114. data/lib/mongoid/document.rb +135 -34
  115. data/lib/mongoid/equality.rb +8 -8
  116. data/lib/mongoid/errors/document_not_found.rb +33 -12
  117. data/lib/mongoid/errors/invalid_config_option.rb +1 -1
  118. data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -1
  119. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  120. data/lib/mongoid/errors/invalid_field.rb +6 -2
  121. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  122. data/lib/mongoid/errors/invalid_relation.rb +1 -1
  123. data/lib/mongoid/errors/invalid_relation_option.rb +1 -1
  124. data/lib/mongoid/errors/invalid_session_use.rb +1 -1
  125. data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
  126. data/lib/mongoid/errors/mongoid_error.rb +3 -3
  127. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -1
  128. data/lib/mongoid/errors/no_client_database.rb +1 -1
  129. data/lib/mongoid/errors/no_client_hosts.rb +1 -1
  130. data/lib/mongoid/errors/readonly_attribute.rb +1 -1
  131. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  132. data/lib/mongoid/errors/unknown_attribute.rb +1 -1
  133. data/lib/mongoid/errors.rb +2 -2
  134. data/lib/mongoid/extensions/array.rb +9 -7
  135. data/lib/mongoid/extensions/big_decimal.rb +33 -10
  136. data/lib/mongoid/extensions/binary.rb +42 -0
  137. data/lib/mongoid/extensions/boolean.rb +8 -2
  138. data/lib/mongoid/extensions/date.rb +26 -20
  139. data/lib/mongoid/extensions/date_time.rb +1 -1
  140. data/lib/mongoid/extensions/false_class.rb +1 -1
  141. data/lib/mongoid/extensions/float.rb +7 -4
  142. data/lib/mongoid/extensions/hash.rb +37 -8
  143. data/lib/mongoid/extensions/integer.rb +7 -4
  144. data/lib/mongoid/extensions/module.rb +1 -1
  145. data/lib/mongoid/extensions/object.rb +8 -6
  146. data/lib/mongoid/extensions/range.rb +41 -10
  147. data/lib/mongoid/extensions/regexp.rb +11 -4
  148. data/lib/mongoid/extensions/set.rb +11 -4
  149. data/lib/mongoid/extensions/string.rb +11 -22
  150. data/lib/mongoid/extensions/symbol.rb +4 -15
  151. data/lib/mongoid/extensions/time.rb +27 -16
  152. data/lib/mongoid/extensions/time_with_zone.rb +1 -2
  153. data/lib/mongoid/extensions/true_class.rb +1 -1
  154. data/lib/mongoid/extensions.rb +1 -0
  155. data/lib/mongoid/factory.rb +55 -7
  156. data/lib/mongoid/fields/foreign_key.rb +11 -4
  157. data/lib/mongoid/fields/localized.rb +9 -4
  158. data/lib/mongoid/fields/standard.rb +7 -7
  159. data/lib/mongoid/fields/validators/macro.rb +3 -9
  160. data/lib/mongoid/fields.rb +233 -40
  161. data/lib/mongoid/findable.rb +34 -13
  162. data/lib/mongoid/indexable/specification.rb +2 -2
  163. data/lib/mongoid/indexable/validators/options.rb +6 -2
  164. data/lib/mongoid/interceptable.rb +185 -16
  165. data/lib/mongoid/matchable.rb +1 -1
  166. data/lib/mongoid/matcher.rb +33 -13
  167. data/lib/mongoid/persistable/creatable.rb +18 -9
  168. data/lib/mongoid/persistable/deletable.rb +1 -1
  169. data/lib/mongoid/persistable/destroyable.rb +1 -1
  170. data/lib/mongoid/persistable/savable.rb +2 -2
  171. data/lib/mongoid/persistable/unsettable.rb +1 -1
  172. data/lib/mongoid/persistable/updatable.rb +19 -12
  173. data/lib/mongoid/persistable/upsertable.rb +1 -1
  174. data/lib/mongoid/persistable.rb +3 -3
  175. data/lib/mongoid/persistence_context.rb +63 -10
  176. data/lib/mongoid/query_cache.rb +8 -260
  177. data/lib/mongoid/railties/controller_runtime.rb +1 -1
  178. data/lib/mongoid/reloadable.rb +10 -8
  179. data/lib/mongoid/scopable.rb +26 -22
  180. data/lib/mongoid/selectable.rb +1 -2
  181. data/lib/mongoid/serializable.rb +10 -6
  182. data/lib/mongoid/shardable.rb +35 -11
  183. data/lib/mongoid/stateful.rb +35 -9
  184. data/lib/mongoid/tasks/database.rb +0 -2
  185. data/lib/mongoid/threaded/lifecycle.rb +5 -5
  186. data/lib/mongoid/threaded.rb +42 -12
  187. data/lib/mongoid/timestamps/created.rb +1 -1
  188. data/lib/mongoid/timestamps/updated.rb +2 -2
  189. data/lib/mongoid/touchable.rb +2 -3
  190. data/lib/mongoid/traversable.rb +5 -4
  191. data/lib/mongoid/validatable/localizable.rb +1 -1
  192. data/lib/mongoid/validatable/macros.rb +0 -2
  193. data/lib/mongoid/validatable/presence.rb +2 -2
  194. data/lib/mongoid/validatable/uniqueness.rb +9 -8
  195. data/lib/mongoid/validatable.rb +6 -6
  196. data/lib/mongoid/version.rb +1 -1
  197. data/lib/mongoid/warnings.rb +28 -0
  198. data/lib/mongoid.rb +2 -0
  199. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +4 -3
  200. data/spec/config/mongoid.yml +16 -0
  201. data/spec/integration/app_spec.rb +8 -12
  202. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  203. data/spec/integration/associations/embedded_spec.rb +15 -0
  204. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  205. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  206. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  207. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  208. data/spec/integration/associations/has_one_spec.rb +97 -1
  209. data/spec/integration/associations/scope_option_spec.rb +1 -1
  210. data/spec/integration/callbacks_models.rb +95 -1
  211. data/spec/integration/callbacks_spec.rb +246 -4
  212. data/spec/integration/criteria/range_spec.rb +95 -1
  213. data/spec/integration/discriminator_key_spec.rb +115 -76
  214. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  215. data/spec/integration/i18n_fallbacks_spec.rb +1 -17
  216. data/spec/integration/matcher_examples_spec.rb +20 -13
  217. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  218. data/spec/integration/matcher_operator_spec.rb +3 -5
  219. data/spec/integration/persistence/range_field_spec.rb +350 -0
  220. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  221. data/spec/mongoid/association/depending_spec.rb +9 -9
  222. data/spec/mongoid/association/eager_spec.rb +2 -1
  223. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  224. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  225. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +69 -9
  226. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  227. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +235 -40
  228. data/spec/mongoid/association/embedded/embeds_many_models.rb +36 -0
  229. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
  230. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  231. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  232. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  233. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  234. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  235. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  236. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
  237. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  238. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2 -2
  239. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +202 -201
  240. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  241. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  242. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  243. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +8 -8
  244. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +160 -119
  245. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  246. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  247. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  248. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  249. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  250. data/spec/mongoid/association/syncable_spec.rb +14 -0
  251. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  252. data/spec/mongoid/attributes/nested_spec.rb +80 -11
  253. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  254. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  255. data/spec/mongoid/attributes_spec.rb +551 -27
  256. data/spec/mongoid/cacheable_spec.rb +3 -3
  257. data/spec/mongoid/changeable_spec.rb +130 -13
  258. data/spec/mongoid/clients/factory_spec.rb +23 -30
  259. data/spec/mongoid/clients/options_spec.rb +1 -0
  260. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  261. data/spec/mongoid/clients_spec.rb +57 -2
  262. data/spec/mongoid/config_spec.rb +78 -18
  263. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  264. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  265. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  266. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  267. data/spec/mongoid/contextual/memory_spec.rb +1336 -69
  268. data/spec/mongoid/contextual/mongo_spec.rb +1253 -247
  269. data/spec/mongoid/contextual/none_spec.rb +38 -0
  270. data/spec/mongoid/copyable_spec.rb +451 -1
  271. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  272. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  273. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  274. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  275. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  276. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  277. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  278. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  279. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  280. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  281. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +0 -59
  282. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
  283. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  284. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  285. data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -484
  286. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +50 -0
  287. data/spec/mongoid/criteria/queryable/selectable_spec.rb +289 -124
  288. data/spec/mongoid/criteria/queryable/selector_spec.rb +89 -4
  289. data/spec/mongoid/criteria/queryable/storable_spec.rb +72 -0
  290. data/spec/mongoid/criteria/translator_spec.rb +132 -0
  291. data/spec/mongoid/criteria_projection_spec.rb +0 -1
  292. data/spec/mongoid/criteria_spec.rb +475 -1199
  293. data/spec/mongoid/document_fields_spec.rb +173 -24
  294. data/spec/mongoid/document_spec.rb +32 -41
  295. data/spec/mongoid/errors/document_not_found_spec.rb +76 -0
  296. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  297. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  298. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  299. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  300. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  301. data/spec/mongoid/extensions/array_spec.rb +16 -2
  302. data/spec/mongoid/extensions/big_decimal_spec.rb +712 -212
  303. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  304. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  305. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  306. data/spec/mongoid/extensions/date_spec.rb +71 -1
  307. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  308. data/spec/mongoid/extensions/float_spec.rb +53 -74
  309. data/spec/mongoid/extensions/hash_spec.rb +33 -3
  310. data/spec/mongoid/extensions/integer_spec.rb +50 -64
  311. data/spec/mongoid/extensions/range_spec.rb +255 -54
  312. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  313. data/spec/mongoid/extensions/set_spec.rb +106 -0
  314. data/spec/mongoid/extensions/string_spec.rb +53 -25
  315. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  316. data/spec/mongoid/extensions/time_spec.rb +634 -66
  317. data/spec/mongoid/extensions/time_with_zone_spec.rb +17 -31
  318. data/spec/mongoid/factory_spec.rb +61 -1
  319. data/spec/mongoid/fields/localized_spec.rb +37 -12
  320. data/spec/mongoid/fields_spec.rb +364 -50
  321. data/spec/mongoid/findable_spec.rb +80 -15
  322. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  323. data/spec/mongoid/indexable_spec.rb +39 -20
  324. data/spec/mongoid/interceptable_spec.rb +807 -27
  325. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  326. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  327. data/spec/mongoid/mongoizable_spec.rb +285 -0
  328. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  329. data/spec/mongoid/persistable/deletable_spec.rb +2 -2
  330. data/spec/mongoid/persistable/destroyable_spec.rb +2 -2
  331. data/spec/mongoid/persistable/upsertable_spec.rb +14 -0
  332. data/spec/mongoid/persistence_context_spec.rb +50 -1
  333. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  334. data/spec/mongoid/query_cache_spec.rb +0 -154
  335. data/spec/mongoid/reloadable_spec.rb +59 -2
  336. data/spec/mongoid/scopable_spec.rb +54 -16
  337. data/spec/mongoid/shardable_models.rb +14 -0
  338. data/spec/mongoid/shardable_spec.rb +157 -51
  339. data/spec/mongoid/stateful_spec.rb +28 -0
  340. data/spec/mongoid/timestamps_spec.rb +390 -0
  341. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  342. data/spec/mongoid/touchable_spec.rb +116 -0
  343. data/spec/mongoid/touchable_spec_models.rb +12 -8
  344. data/spec/mongoid/traversable_spec.rb +4 -11
  345. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  346. data/spec/mongoid/validatable/uniqueness_spec.rb +59 -31
  347. data/spec/mongoid/warnings_spec.rb +35 -0
  348. data/spec/mongoid_spec.rb +1 -1
  349. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  350. data/spec/rails/mongoid_spec.rb +4 -16
  351. data/spec/shared/lib/mrss/docker_runner.rb +7 -0
  352. data/spec/shared/lib/mrss/lite_constraints.rb +10 -2
  353. data/spec/shared/lib/mrss/server_version_registry.rb +16 -23
  354. data/spec/shared/lib/mrss/utils.rb +28 -6
  355. data/spec/shared/share/Dockerfile.erb +36 -40
  356. data/spec/shared/shlib/server.sh +32 -8
  357. data/spec/shared/shlib/set_env.sh +4 -4
  358. data/spec/support/constraints.rb +24 -0
  359. data/spec/support/macros.rb +46 -0
  360. data/spec/support/models/augmentation.rb +12 -0
  361. data/spec/support/models/band.rb +3 -0
  362. data/spec/support/models/catalog.rb +24 -0
  363. data/spec/support/models/circus.rb +3 -0
  364. data/spec/support/models/code.rb +2 -0
  365. data/spec/support/models/fanatic.rb +8 -0
  366. data/spec/support/models/implant.rb +9 -0
  367. data/spec/support/models/label.rb +2 -0
  368. data/spec/support/models/passport.rb +9 -0
  369. data/spec/support/models/person.rb +2 -0
  370. data/spec/support/models/player.rb +2 -0
  371. data/spec/support/models/powerup.rb +12 -0
  372. data/spec/support/models/purse.rb +9 -0
  373. data/spec/support/models/registry.rb +1 -0
  374. data/spec/support/models/school.rb +14 -0
  375. data/spec/support/models/shield.rb +18 -0
  376. data/spec/support/models/student.rb +14 -0
  377. data/spec/support/models/weapon.rb +12 -0
  378. data.tar.gz.sig +4 -1
  379. metadata +682 -635
  380. metadata.gz.sig +0 -0
  381. data/lib/mongoid/errors/eager_load.rb +0 -23
  382. data/lib/mongoid/errors/invalid_value.rb +0 -17
  383. data/spec/mongoid/errors/eager_load_spec.rb +0 -31
@@ -578,14 +578,6 @@ describe Mongoid::Interceptable do
578
578
  band.notes.push(note)
579
579
  record.notes.push(note)
580
580
  end
581
-
582
- context "when saving the root" do
583
-
584
- it "only executes the callbacks once for each embed" do
585
- expect(note).to receive(:update_saved).twice
586
- band.save!
587
- end
588
- end
589
581
  end
590
582
  end
591
583
 
@@ -1746,8 +1738,12 @@ describe Mongoid::Interceptable do
1746
1738
  [InterceptableSpec::CbChild, :after_validation],
1747
1739
  [InterceptableSpec::CbParent, :after_validation],
1748
1740
  [InterceptableSpec::CbParent, :before_save],
1741
+ [InterceptableSpec::CbParent, :around_save_open],
1749
1742
  [InterceptableSpec::CbParent, :before_create],
1743
+ [InterceptableSpec::CbParent, :around_create_open],
1744
+ [InterceptableSpec::CbParent, :around_create_close],
1750
1745
  [InterceptableSpec::CbParent, :after_create],
1746
+ [InterceptableSpec::CbParent, :around_save_close],
1751
1747
  [InterceptableSpec::CbParent, :after_save],
1752
1748
  ]
1753
1749
  end
@@ -1767,28 +1763,812 @@ describe Mongoid::Interceptable do
1767
1763
  end
1768
1764
  end
1769
1765
 
1770
- let(:expected) do
1771
- [
1772
- [InterceptableSpec::CbParent, :before_validation],
1773
- [InterceptableSpec::CbCascadedChild, :before_validation],
1774
- [InterceptableSpec::CbCascadedChild, :after_validation],
1775
- [InterceptableSpec::CbParent, :after_validation],
1776
- [InterceptableSpec::CbParent, :before_save],
1777
- [InterceptableSpec::CbCascadedChild, :before_save],
1778
- [InterceptableSpec::CbParent, :before_create],
1779
- [InterceptableSpec::CbCascadedChild, :before_create],
1780
- [InterceptableSpec::CbParent, :after_create],
1781
- [InterceptableSpec::CbCascadedChild, :after_create],
1782
- [InterceptableSpec::CbParent, :after_save],
1783
- [InterceptableSpec::CbCascadedChild, :after_save],
1784
- ]
1766
+ context 'with around callbacks' do
1767
+ config_override :around_callbacks_for_embeds, true
1768
+
1769
+ let(:expected) do
1770
+ [
1771
+ [InterceptableSpec::CbCascadedChild, :before_validation],
1772
+ [InterceptableSpec::CbCascadedChild, :after_validation],
1773
+ [InterceptableSpec::CbParent, :before_validation],
1774
+ [InterceptableSpec::CbCascadedChild, :before_validation],
1775
+ [InterceptableSpec::CbCascadedChild, :after_validation],
1776
+
1777
+ [InterceptableSpec::CbParent, :after_validation],
1778
+ [InterceptableSpec::CbParent, :before_save],
1779
+ [InterceptableSpec::CbParent, :around_save_open],
1780
+ [InterceptableSpec::CbParent, :before_create],
1781
+ [InterceptableSpec::CbParent, :around_create_open],
1782
+
1783
+ [InterceptableSpec::CbCascadedChild, :before_save],
1784
+ [InterceptableSpec::CbCascadedChild, :around_save_open],
1785
+ [InterceptableSpec::CbCascadedChild, :before_create],
1786
+ [InterceptableSpec::CbCascadedChild, :around_create_open],
1787
+
1788
+ [InterceptableSpec::CbCascadedChild, :around_create_close],
1789
+ [InterceptableSpec::CbCascadedChild, :after_create],
1790
+ [InterceptableSpec::CbCascadedChild, :around_save_close],
1791
+ [InterceptableSpec::CbCascadedChild, :after_save],
1792
+
1793
+ [InterceptableSpec::CbParent, :around_create_close],
1794
+ [InterceptableSpec::CbParent, :after_create],
1795
+ [InterceptableSpec::CbParent, :around_save_close],
1796
+ [InterceptableSpec::CbParent, :after_save]
1797
+ ]
1798
+ end
1799
+
1800
+ it 'calls callbacks in the right order' do
1801
+ parent.save!
1802
+ expect(registry.calls).to eq expected
1803
+ end
1785
1804
  end
1786
1805
 
1787
- it 'calls callbacks in the right order' do
1788
- pending 'MONGOID-3795'
1806
+ context 'without around callbacks' do
1807
+ config_override :around_callbacks_for_embeds, false
1789
1808
 
1790
- parent.save!
1791
- expect(registry.calls).to eq expected
1809
+ let(:expected) do
1810
+ [
1811
+ [InterceptableSpec::CbCascadedChild, :before_validation],
1812
+ [InterceptableSpec::CbCascadedChild, :after_validation],
1813
+ [InterceptableSpec::CbParent, :before_validation],
1814
+ [InterceptableSpec::CbCascadedChild, :before_validation],
1815
+ [InterceptableSpec::CbCascadedChild, :after_validation],
1816
+
1817
+ [InterceptableSpec::CbParent, :after_validation],
1818
+ [InterceptableSpec::CbParent, :before_save],
1819
+ [InterceptableSpec::CbParent, :around_save_open],
1820
+ [InterceptableSpec::CbParent, :before_create],
1821
+ [InterceptableSpec::CbParent, :around_create_open],
1822
+
1823
+ [InterceptableSpec::CbCascadedChild, :before_save],
1824
+ [InterceptableSpec::CbCascadedChild, :before_create],
1825
+
1826
+ [InterceptableSpec::CbCascadedChild, :after_create],
1827
+ [InterceptableSpec::CbCascadedChild, :after_save],
1828
+
1829
+ [InterceptableSpec::CbParent, :around_create_close],
1830
+ [InterceptableSpec::CbParent, :after_create],
1831
+ [InterceptableSpec::CbParent, :around_save_close],
1832
+ [InterceptableSpec::CbParent, :after_save]
1833
+ ]
1834
+ end
1835
+
1836
+ it 'calls callbacks in the right order' do
1837
+ parent.save!
1838
+ expect(registry.calls).to eq expected
1839
+ end
1840
+ end
1841
+ end
1842
+
1843
+ context "with associations" do
1844
+ context "has_one" do
1845
+ let(:registry) { InterceptableSpec::CallbackRegistry.new }
1846
+
1847
+ let(:parent) do
1848
+ InterceptableSpec::CbHasOneParent.new(registry).tap do |parent|
1849
+ parent.child = InterceptableSpec::CbHasOneChild.new(registry)
1850
+ end
1851
+ end
1852
+
1853
+ let(:expected) do
1854
+ [
1855
+ [InterceptableSpec::CbHasOneParent, :before_validation],
1856
+ [InterceptableSpec::CbHasOneChild, :before_validation],
1857
+ [InterceptableSpec::CbHasOneChild, :after_validation],
1858
+ [InterceptableSpec::CbHasOneParent, :after_validation],
1859
+ [InterceptableSpec::CbHasOneParent, :before_save],
1860
+
1861
+ [InterceptableSpec::CbHasOneParent, :around_save_open],
1862
+ [InterceptableSpec::CbHasOneParent, :before_create],
1863
+ [InterceptableSpec::CbHasOneParent, :around_create_open],
1864
+
1865
+ [InterceptableSpec::CbHasOneParent, :insert_into_database],
1866
+
1867
+ [InterceptableSpec::CbHasOneChild, :before_validation],
1868
+ [InterceptableSpec::CbHasOneChild, :after_validation],
1869
+ [InterceptableSpec::CbHasOneChild, :before_save],
1870
+ [InterceptableSpec::CbHasOneChild, :around_save_open],
1871
+ [InterceptableSpec::CbHasOneChild, :before_create],
1872
+ [InterceptableSpec::CbHasOneChild, :around_create_open],
1873
+
1874
+ [InterceptableSpec::CbHasOneChild, :around_create_close],
1875
+ [InterceptableSpec::CbHasOneChild, :after_create],
1876
+ [InterceptableSpec::CbHasOneChild, :around_save_close],
1877
+ [InterceptableSpec::CbHasOneChild, :after_save],
1878
+
1879
+ [InterceptableSpec::CbHasOneParent, :around_create_close],
1880
+ [InterceptableSpec::CbHasOneParent, :after_create],
1881
+ [InterceptableSpec::CbHasOneParent, :around_save_close],
1882
+ [InterceptableSpec::CbHasOneParent, :after_save],
1883
+ ]
1884
+ end
1885
+
1886
+ it 'calls callbacks in the right order' do
1887
+ parent.save!
1888
+ expect(registry.calls).to eq expected
1889
+ end
1890
+ end
1891
+
1892
+ context "embeds_one" do
1893
+ let(:registry) { InterceptableSpec::CallbackRegistry.new }
1894
+
1895
+ let(:parent) do
1896
+ InterceptableSpec::CbEmbedsOneParent.new(registry).tap do |parent|
1897
+ parent.child = InterceptableSpec::CbEmbedsOneChild.new(registry)
1898
+ end
1899
+ end
1900
+
1901
+ context "create" do
1902
+ context "with around callbacks" do
1903
+ config_override :around_callbacks_for_embeds, true
1904
+
1905
+ let(:expected) do
1906
+ [
1907
+ [InterceptableSpec::CbEmbedsOneChild, :before_validation],
1908
+ [InterceptableSpec::CbEmbedsOneChild, :after_validation],
1909
+ [InterceptableSpec::CbEmbedsOneParent, :before_validation],
1910
+ [InterceptableSpec::CbEmbedsOneChild, :before_validation],
1911
+ [InterceptableSpec::CbEmbedsOneChild, :after_validation],
1912
+ [InterceptableSpec::CbEmbedsOneParent, :after_validation],
1913
+
1914
+ [InterceptableSpec::CbEmbedsOneParent, :before_save],
1915
+ [InterceptableSpec::CbEmbedsOneParent, :around_save_open],
1916
+ [InterceptableSpec::CbEmbedsOneParent, :before_create],
1917
+ [InterceptableSpec::CbEmbedsOneParent, :around_create_open],
1918
+
1919
+ [InterceptableSpec::CbEmbedsOneChild, :before_save],
1920
+ [InterceptableSpec::CbEmbedsOneChild, :around_save_open],
1921
+ [InterceptableSpec::CbEmbedsOneChild, :before_create],
1922
+ [InterceptableSpec::CbEmbedsOneChild, :around_create_open],
1923
+
1924
+ [InterceptableSpec::CbEmbedsOneParent, :insert_into_database],
1925
+
1926
+ [InterceptableSpec::CbEmbedsOneChild, :around_create_close],
1927
+ [InterceptableSpec::CbEmbedsOneChild, :after_create],
1928
+ [InterceptableSpec::CbEmbedsOneChild, :around_save_close],
1929
+ [InterceptableSpec::CbEmbedsOneChild, :after_save],
1930
+
1931
+ [InterceptableSpec::CbEmbedsOneParent, :around_create_close],
1932
+ [InterceptableSpec::CbEmbedsOneParent, :after_create],
1933
+ [InterceptableSpec::CbEmbedsOneParent, :around_save_close],
1934
+ [InterceptableSpec::CbEmbedsOneParent, :after_save]
1935
+ ]
1936
+ end
1937
+
1938
+ it 'calls callbacks in the right order' do
1939
+ parent.save!
1940
+ expect(registry.calls).to eq expected
1941
+ end
1942
+ end
1943
+
1944
+ context "without around callbacks" do
1945
+ config_override :around_callbacks_for_embeds, false
1946
+
1947
+ let(:expected) do
1948
+ [
1949
+ [InterceptableSpec::CbEmbedsOneChild, :before_validation],
1950
+ [InterceptableSpec::CbEmbedsOneChild, :after_validation],
1951
+ [InterceptableSpec::CbEmbedsOneParent, :before_validation],
1952
+ [InterceptableSpec::CbEmbedsOneChild, :before_validation],
1953
+ [InterceptableSpec::CbEmbedsOneChild, :after_validation],
1954
+ [InterceptableSpec::CbEmbedsOneParent, :after_validation],
1955
+
1956
+ [InterceptableSpec::CbEmbedsOneParent, :before_save],
1957
+ [InterceptableSpec::CbEmbedsOneParent, :around_save_open],
1958
+ [InterceptableSpec::CbEmbedsOneParent, :before_create],
1959
+ [InterceptableSpec::CbEmbedsOneParent, :around_create_open],
1960
+
1961
+ [InterceptableSpec::CbEmbedsOneChild, :before_save],
1962
+ [InterceptableSpec::CbEmbedsOneChild, :before_create],
1963
+
1964
+ [InterceptableSpec::CbEmbedsOneParent, :insert_into_database],
1965
+
1966
+ [InterceptableSpec::CbEmbedsOneChild, :after_create],
1967
+ [InterceptableSpec::CbEmbedsOneChild, :after_save],
1968
+
1969
+ [InterceptableSpec::CbEmbedsOneParent, :around_create_close],
1970
+ [InterceptableSpec::CbEmbedsOneParent, :after_create],
1971
+ [InterceptableSpec::CbEmbedsOneParent, :around_save_close],
1972
+ [InterceptableSpec::CbEmbedsOneParent, :after_save]
1973
+ ]
1974
+ end
1975
+
1976
+ it 'calls callbacks in the right order' do
1977
+ parent.save!
1978
+ expect(registry.calls).to eq expected
1979
+ end
1980
+ end
1981
+ end
1982
+
1983
+ context "update" do
1984
+ context "with around callbacks" do
1985
+ config_override :around_callbacks_for_embeds, true
1986
+
1987
+ let(:expected) do
1988
+ [
1989
+ [InterceptableSpec::CbEmbedsOneChild, :before_validation],
1990
+ [InterceptableSpec::CbEmbedsOneChild, :after_validation],
1991
+ [InterceptableSpec::CbEmbedsOneParent, :before_validation],
1992
+ [InterceptableSpec::CbEmbedsOneChild, :before_validation],
1993
+ [InterceptableSpec::CbEmbedsOneChild, :after_validation],
1994
+ [InterceptableSpec::CbEmbedsOneParent, :after_validation],
1995
+
1996
+ [InterceptableSpec::CbEmbedsOneParent, :before_save],
1997
+ [InterceptableSpec::CbEmbedsOneParent, :around_save_open],
1998
+ [InterceptableSpec::CbEmbedsOneParent, :before_update],
1999
+ [InterceptableSpec::CbEmbedsOneParent, :around_update_open],
2000
+
2001
+ [InterceptableSpec::CbEmbedsOneChild, :before_save],
2002
+ [InterceptableSpec::CbEmbedsOneChild, :around_save_open],
2003
+ [InterceptableSpec::CbEmbedsOneChild, :before_update],
2004
+ [InterceptableSpec::CbEmbedsOneChild, :around_update_open],
2005
+
2006
+ [InterceptableSpec::CbEmbedsOneChild, :around_update_close],
2007
+ [InterceptableSpec::CbEmbedsOneChild, :after_update],
2008
+ [InterceptableSpec::CbEmbedsOneChild, :around_save_close],
2009
+ [InterceptableSpec::CbEmbedsOneChild, :after_save],
2010
+
2011
+ [InterceptableSpec::CbEmbedsOneParent, :around_update_close],
2012
+ [InterceptableSpec::CbEmbedsOneParent, :after_update],
2013
+ [InterceptableSpec::CbEmbedsOneParent, :around_save_close],
2014
+ [InterceptableSpec::CbEmbedsOneParent, :after_save]
2015
+ ]
2016
+ end
2017
+
2018
+ it 'calls callbacks in the right order' do
2019
+ parent.callback_registry = nil
2020
+ parent.child.callback_registry = nil
2021
+ parent.save!
2022
+
2023
+ parent.callback_registry = registry
2024
+ parent.child.callback_registry = registry
2025
+ parent.name = "name"
2026
+ parent.child.age = 10
2027
+
2028
+ parent.save!
2029
+ expect(registry.calls).to eq expected
2030
+ end
2031
+ end
2032
+
2033
+ context "without around callbacks" do
2034
+ config_override :around_callbacks_for_embeds, false
2035
+
2036
+ let(:expected) do
2037
+ [
2038
+ [InterceptableSpec::CbEmbedsOneChild, :before_validation],
2039
+ [InterceptableSpec::CbEmbedsOneChild, :after_validation],
2040
+ [InterceptableSpec::CbEmbedsOneParent, :before_validation],
2041
+ [InterceptableSpec::CbEmbedsOneChild, :before_validation],
2042
+ [InterceptableSpec::CbEmbedsOneChild, :after_validation],
2043
+ [InterceptableSpec::CbEmbedsOneParent, :after_validation],
2044
+
2045
+ [InterceptableSpec::CbEmbedsOneParent, :before_save],
2046
+ [InterceptableSpec::CbEmbedsOneParent, :around_save_open],
2047
+ [InterceptableSpec::CbEmbedsOneParent, :before_update],
2048
+ [InterceptableSpec::CbEmbedsOneParent, :around_update_open],
2049
+
2050
+ [InterceptableSpec::CbEmbedsOneChild, :before_save],
2051
+ [InterceptableSpec::CbEmbedsOneChild, :before_update],
2052
+
2053
+ [InterceptableSpec::CbEmbedsOneChild, :after_update],
2054
+ [InterceptableSpec::CbEmbedsOneChild, :after_save],
2055
+
2056
+ [InterceptableSpec::CbEmbedsOneParent, :around_update_close],
2057
+ [InterceptableSpec::CbEmbedsOneParent, :after_update],
2058
+ [InterceptableSpec::CbEmbedsOneParent, :around_save_close],
2059
+ [InterceptableSpec::CbEmbedsOneParent, :after_save]
2060
+ ]
2061
+ end
2062
+
2063
+ it 'calls callbacks in the right order' do
2064
+ parent.callback_registry = nil
2065
+ parent.child.callback_registry = nil
2066
+ parent.save!
2067
+
2068
+ parent.callback_registry = registry
2069
+ parent.child.callback_registry = registry
2070
+ parent.name = "name"
2071
+ parent.child.age = 10
2072
+
2073
+ parent.save!
2074
+ expect(registry.calls).to eq expected
2075
+ end
2076
+ end
2077
+ end
2078
+ end
2079
+
2080
+ context "has_many" do
2081
+ let(:registry) { InterceptableSpec::CallbackRegistry.new }
2082
+
2083
+ let(:parent) do
2084
+ InterceptableSpec::CbHasManyParent.new(registry).tap do |parent|
2085
+ parent.children = [
2086
+ InterceptableSpec::CbHasManyChild.new(registry),
2087
+ InterceptableSpec::CbHasManyChild.new(registry)
2088
+ ]
2089
+ end
2090
+ end
2091
+
2092
+ let(:expected) do
2093
+ [
2094
+ [InterceptableSpec::CbHasManyParent, :before_validation],
2095
+ [InterceptableSpec::CbHasManyChild, :before_validation],
2096
+ [InterceptableSpec::CbHasManyChild, :after_validation],
2097
+ [InterceptableSpec::CbHasManyChild, :before_validation],
2098
+ [InterceptableSpec::CbHasManyChild, :after_validation],
2099
+ [InterceptableSpec::CbHasManyParent, :after_validation],
2100
+
2101
+ [InterceptableSpec::CbHasManyParent, :before_save],
2102
+ [InterceptableSpec::CbHasManyParent, :around_save_open],
2103
+ [InterceptableSpec::CbHasManyParent, :before_create],
2104
+ [InterceptableSpec::CbHasManyParent, :around_create_open],
2105
+
2106
+ [InterceptableSpec::CbHasManyParent, :insert_into_database],
2107
+
2108
+ [InterceptableSpec::CbHasManyChild, :before_validation],
2109
+ [InterceptableSpec::CbHasManyChild, :after_validation],
2110
+ [InterceptableSpec::CbHasManyChild, :before_save],
2111
+ [InterceptableSpec::CbHasManyChild, :around_save_open],
2112
+ [InterceptableSpec::CbHasManyChild, :before_create],
2113
+ [InterceptableSpec::CbHasManyChild, :around_create_open],
2114
+ [InterceptableSpec::CbHasManyChild, :around_create_close],
2115
+ [InterceptableSpec::CbHasManyChild, :after_create],
2116
+ [InterceptableSpec::CbHasManyChild, :around_save_close],
2117
+ [InterceptableSpec::CbHasManyChild, :after_save],
2118
+
2119
+ [InterceptableSpec::CbHasManyChild, :before_validation],
2120
+ [InterceptableSpec::CbHasManyChild, :after_validation],
2121
+ [InterceptableSpec::CbHasManyChild, :before_save],
2122
+ [InterceptableSpec::CbHasManyChild, :around_save_open],
2123
+ [InterceptableSpec::CbHasManyChild, :before_create],
2124
+ [InterceptableSpec::CbHasManyChild, :around_create_open],
2125
+ [InterceptableSpec::CbHasManyChild, :around_create_close],
2126
+ [InterceptableSpec::CbHasManyChild, :after_create],
2127
+ [InterceptableSpec::CbHasManyChild, :around_save_close],
2128
+ [InterceptableSpec::CbHasManyChild, :after_save],
2129
+
2130
+ [InterceptableSpec::CbHasManyParent, :around_create_close],
2131
+ [InterceptableSpec::CbHasManyParent, :after_create],
2132
+ [InterceptableSpec::CbHasManyParent, :around_save_close],
2133
+ [InterceptableSpec::CbHasManyParent, :after_save]
2134
+ ]
2135
+ end
2136
+
2137
+ it 'calls callbacks in the right order' do
2138
+ parent.save!
2139
+ expect(registry.calls).to eq expected
2140
+ end
2141
+ end
2142
+
2143
+ context "embeds_many" do
2144
+ let(:registry) { InterceptableSpec::CallbackRegistry.new }
2145
+
2146
+ let(:parent) do
2147
+ InterceptableSpec::CbEmbedsManyParent.new(registry).tap do |parent|
2148
+ parent.children = [
2149
+ InterceptableSpec::CbEmbedsManyChild.new(registry),
2150
+ InterceptableSpec::CbEmbedsManyChild.new(registry),
2151
+ ]
2152
+ end
2153
+ end
2154
+
2155
+ context "with around callbacks" do
2156
+ config_override :around_callbacks_for_embeds, true
2157
+
2158
+ let(:expected) do
2159
+ [
2160
+ [InterceptableSpec::CbEmbedsManyChild, :before_validation],
2161
+ [InterceptableSpec::CbEmbedsManyChild, :after_validation],
2162
+ [InterceptableSpec::CbEmbedsManyChild, :before_validation],
2163
+ [InterceptableSpec::CbEmbedsManyChild, :after_validation],
2164
+ [InterceptableSpec::CbEmbedsManyParent, :before_validation],
2165
+ [InterceptableSpec::CbEmbedsManyChild, :before_validation],
2166
+ [InterceptableSpec::CbEmbedsManyChild, :after_validation],
2167
+ [InterceptableSpec::CbEmbedsManyChild, :before_validation],
2168
+ [InterceptableSpec::CbEmbedsManyChild, :after_validation],
2169
+ [InterceptableSpec::CbEmbedsManyParent, :after_validation],
2170
+
2171
+ [InterceptableSpec::CbEmbedsManyParent, :before_save],
2172
+ [InterceptableSpec::CbEmbedsManyParent, :around_save_open],
2173
+ [InterceptableSpec::CbEmbedsManyParent, :before_create],
2174
+ [InterceptableSpec::CbEmbedsManyParent, :around_create_open],
2175
+
2176
+ [InterceptableSpec::CbEmbedsManyChild, :before_save],
2177
+ [InterceptableSpec::CbEmbedsManyChild, :around_save_open],
2178
+ [InterceptableSpec::CbEmbedsManyChild, :before_save],
2179
+
2180
+ [InterceptableSpec::CbEmbedsManyChild, :around_save_open],
2181
+ [InterceptableSpec::CbEmbedsManyChild, :before_create],
2182
+ [InterceptableSpec::CbEmbedsManyChild, :around_create_open],
2183
+
2184
+ [InterceptableSpec::CbEmbedsManyChild, :before_create],
2185
+ [InterceptableSpec::CbEmbedsManyChild, :around_create_open],
2186
+
2187
+ [InterceptableSpec::CbEmbedsManyParent, :insert_into_database],
2188
+
2189
+ [InterceptableSpec::CbEmbedsManyChild, :around_create_close],
2190
+ [InterceptableSpec::CbEmbedsManyChild, :after_create],
2191
+
2192
+ [InterceptableSpec::CbEmbedsManyChild, :around_create_close],
2193
+ [InterceptableSpec::CbEmbedsManyChild, :after_create],
2194
+
2195
+ [InterceptableSpec::CbEmbedsManyChild, :around_save_close],
2196
+ [InterceptableSpec::CbEmbedsManyChild, :after_save],
2197
+
2198
+ [InterceptableSpec::CbEmbedsManyChild, :around_save_close],
2199
+ [InterceptableSpec::CbEmbedsManyChild, :after_save],
2200
+
2201
+ [InterceptableSpec::CbEmbedsManyParent, :around_create_close],
2202
+ [InterceptableSpec::CbEmbedsManyParent, :after_create],
2203
+ [InterceptableSpec::CbEmbedsManyParent, :around_save_close],
2204
+ [InterceptableSpec::CbEmbedsManyParent, :after_save]
2205
+ ]
2206
+ end
2207
+
2208
+ it 'calls callbacks in the right order' do
2209
+ parent.save!
2210
+ expect(registry.calls).to eq expected
2211
+ end
2212
+ end
2213
+
2214
+ context "without around callbacks" do
2215
+ config_override :around_callbacks_for_embeds, false
2216
+
2217
+ let(:expected) do
2218
+ [
2219
+ [InterceptableSpec::CbEmbedsManyChild, :before_validation],
2220
+ [InterceptableSpec::CbEmbedsManyChild, :after_validation],
2221
+ [InterceptableSpec::CbEmbedsManyChild, :before_validation],
2222
+ [InterceptableSpec::CbEmbedsManyChild, :after_validation],
2223
+ [InterceptableSpec::CbEmbedsManyParent, :before_validation],
2224
+ [InterceptableSpec::CbEmbedsManyChild, :before_validation],
2225
+ [InterceptableSpec::CbEmbedsManyChild, :after_validation],
2226
+ [InterceptableSpec::CbEmbedsManyChild, :before_validation],
2227
+ [InterceptableSpec::CbEmbedsManyChild, :after_validation],
2228
+ [InterceptableSpec::CbEmbedsManyParent, :after_validation],
2229
+
2230
+ [InterceptableSpec::CbEmbedsManyParent, :before_save],
2231
+ [InterceptableSpec::CbEmbedsManyParent, :around_save_open],
2232
+ [InterceptableSpec::CbEmbedsManyParent, :before_create],
2233
+ [InterceptableSpec::CbEmbedsManyParent, :around_create_open],
2234
+
2235
+ [InterceptableSpec::CbEmbedsManyChild, :before_save],
2236
+ [InterceptableSpec::CbEmbedsManyChild, :before_save],
2237
+
2238
+ [InterceptableSpec::CbEmbedsManyChild, :before_create],
2239
+
2240
+ [InterceptableSpec::CbEmbedsManyChild, :before_create],
2241
+
2242
+ [InterceptableSpec::CbEmbedsManyParent, :insert_into_database],
2243
+
2244
+ [InterceptableSpec::CbEmbedsManyChild, :after_create],
2245
+
2246
+ [InterceptableSpec::CbEmbedsManyChild, :after_create],
2247
+
2248
+ [InterceptableSpec::CbEmbedsManyChild, :after_save],
2249
+
2250
+ [InterceptableSpec::CbEmbedsManyChild, :after_save],
2251
+
2252
+ [InterceptableSpec::CbEmbedsManyParent, :around_create_close],
2253
+ [InterceptableSpec::CbEmbedsManyParent, :after_create],
2254
+ [InterceptableSpec::CbEmbedsManyParent, :around_save_close],
2255
+ [InterceptableSpec::CbEmbedsManyParent, :after_save]
2256
+ ]
2257
+ end
2258
+
2259
+ it 'calls callbacks in the right order' do
2260
+ parent.save!
2261
+ expect(registry.calls).to eq expected
2262
+ end
2263
+ end
2264
+ end
2265
+ end
2266
+
2267
+ context "when accessing parent document from callbacks" do
2268
+ shared_examples 'accesses the correct parent' do
2269
+ it "accesses the correct parent in after_find" do
2270
+ expect(from_db.after_find_player).to eq(player._id)
2271
+ end
2272
+
2273
+ it "accesses the correct parent in after_initialize" do
2274
+ expect(from_db.after_initialize_player).to eq(player._id)
2275
+ end
2276
+
2277
+ it "accesses the correct parent in default" do
2278
+ expect(from_db.after_default_player).to eq(player._id)
2279
+ end
2280
+
2281
+ it "accesses the correct parent in unpersisted after_initialize" do
2282
+ expect(unpersisted.after_initialize_player).to eq(player._id)
2283
+ end
2284
+ end
2285
+
2286
+ context "when using create methods" do
2287
+
2288
+ context "when the child is an embeds_many association" do
2289
+ let!(:player) do
2290
+ Player.create!.tap do |player|
2291
+ player.implants.create!
2292
+ end
2293
+ end
2294
+
2295
+ let(:unpersisted) { player.implants.first }
2296
+
2297
+ before do
2298
+ # The default is originally set when creating this document, and it is
2299
+ # subsequently persisted to the database. Therefore when we retrieve
2300
+ # this document from the database, this field is already set, and
2301
+ # the default Proc is not called. This unset is needed to allow the
2302
+ # default Proc to be called when the document is retrieved from the
2303
+ # database.
2304
+ Player.find(player.id).implants.first.unset(:after_default_player)
2305
+ end
2306
+
2307
+ let(:from_db) do
2308
+ Player.find(player.id).implants.first
2309
+ end
2310
+
2311
+ include_examples 'accesses the correct parent'
2312
+ end
2313
+
2314
+ context "when the child is an embeds_one association" do
2315
+ let!(:player) do
2316
+ Player.create!.tap do |player|
2317
+ player.create_augmentation
2318
+ end
2319
+ end
2320
+
2321
+ let(:unpersisted) { player.augmentation }
2322
+
2323
+ before do
2324
+ Player.find(player.id).augmentation.unset(:after_default_player)
2325
+ end
2326
+
2327
+ let(:from_db) do
2328
+ Player.find(player.id).augmentation
2329
+ end
2330
+
2331
+ include_examples 'accesses the correct parent'
2332
+ end
2333
+
2334
+ context "when the child is a has_many association" do
2335
+ let!(:player) do
2336
+ Player.create!.tap do |player|
2337
+ player.weapons.create!
2338
+ end
2339
+ end
2340
+
2341
+ let(:unpersisted) { player.weapons.first }
2342
+
2343
+ before do
2344
+ Player.find(player.id).weapons.first.unset(:after_default_player)
2345
+ end
2346
+
2347
+ let(:from_db) do
2348
+ Player.find(player.id).weapons.first
2349
+ end
2350
+
2351
+ include_examples 'accesses the correct parent'
2352
+ end
2353
+
2354
+ context "when the child is a has_one association" do
2355
+ let!(:player) do
2356
+ Player.create!.tap do |player|
2357
+ player.create_powerup
2358
+ player.save!
2359
+ end
2360
+ end
2361
+
2362
+ let(:unpersisted) { player.powerup }
2363
+
2364
+ before do
2365
+ Player.find(player.id).powerup.unset(:after_default_player)
2366
+ end
2367
+
2368
+ let(:from_db) do
2369
+ Player.find(player.id).powerup
2370
+ end
2371
+
2372
+ include_examples 'accesses the correct parent'
2373
+ end
2374
+
2375
+ context "when the child is a has_and_belongs_to_many association" do
2376
+ let!(:player) do
2377
+ Player.create!.tap do |player|
2378
+ player.shields.create!
2379
+ end
2380
+ end
2381
+
2382
+ let(:unpersisted) { player.shields.first }
2383
+
2384
+ before do
2385
+ Player.find(player.id).shields.unset(:after_default_player)
2386
+ end
2387
+
2388
+ let(:from_db) do
2389
+ Player.find(player.id).shields.first
2390
+ end
2391
+
2392
+ include_examples 'accesses the correct parent'
2393
+ end
2394
+ end
2395
+
2396
+ context "when using build methods" do
2397
+
2398
+ context "when the child is an embeds_many association" do
2399
+ let!(:player) do
2400
+ Player.create!.tap do |player|
2401
+ player.implants.build
2402
+ player.implants.first.save!
2403
+ end
2404
+ end
2405
+
2406
+ let(:unpersisted) { player.implants.first }
2407
+
2408
+ before do
2409
+ Player.find(player.id).implants.first.unset(:after_default_player)
2410
+ end
2411
+
2412
+ let(:from_db) do
2413
+ Player.find(player.id).implants.first
2414
+ end
2415
+
2416
+ include_examples 'accesses the correct parent'
2417
+ end
2418
+
2419
+ context "when the child is an embeds_one association" do
2420
+ let!(:player) do
2421
+ Player.create!.tap do |player|
2422
+ player.build_augmentation
2423
+ player.save!
2424
+ end
2425
+ end
2426
+
2427
+ let(:unpersisted) { player.augmentation }
2428
+
2429
+ before do
2430
+ Player.find(player.id).augmentation.unset(:after_default_player)
2431
+ end
2432
+
2433
+ let(:from_db) do
2434
+ Player.find(player.id).augmentation
2435
+ end
2436
+
2437
+ include_examples 'accesses the correct parent'
2438
+ end
2439
+
2440
+ context "when the child is a has_many association" do
2441
+ let!(:player) do
2442
+ Player.create!.tap do |player|
2443
+ player.weapons.build
2444
+ player.weapons.first.save!
2445
+ end
2446
+ end
2447
+
2448
+ let(:unpersisted) { player.weapons.first }
2449
+
2450
+ before do
2451
+ Player.find(player.id).weapons.first.unset(:after_default_player)
2452
+ end
2453
+
2454
+ let(:from_db) do
2455
+ Player.find(player.id).weapons.first
2456
+ end
2457
+
2458
+ include_examples 'accesses the correct parent'
2459
+ end
2460
+
2461
+ context "when the child is a has_one association" do
2462
+ let!(:player) do
2463
+ Player.create!.tap do |player|
2464
+ player.build_powerup
2465
+ player.powerup.save!
2466
+ end
2467
+ end
2468
+
2469
+ let(:unpersisted) { player.powerup }
2470
+
2471
+ before do
2472
+ Player.find(player.id).powerup.unset(:after_default_player)
2473
+ end
2474
+
2475
+ let(:from_db) do
2476
+ Player.find(player.id).powerup
2477
+ end
2478
+
2479
+ include_examples 'accesses the correct parent'
2480
+ end
2481
+
2482
+ context "when the child is a has_and_belongs_to_many association" do
2483
+ let!(:player) do
2484
+ Player.create!.tap do |player|
2485
+ player.shields.build
2486
+ player.shields.first.save!
2487
+ end
2488
+ end
2489
+
2490
+ let(:unpersisted) { player.shields.first }
2491
+
2492
+ before do
2493
+ Player.find(player.id).shields.unset(:after_default_player)
2494
+ end
2495
+
2496
+ let(:from_db) do
2497
+ Player.find(player.id).shields.first
2498
+ end
2499
+
2500
+ include_examples 'accesses the correct parent'
2501
+ end
2502
+ end
2503
+ end
2504
+
2505
+ context "when accessing associations in defaults" do
2506
+ context "when not using autobuilding" do
2507
+ let(:band) { InterceptableBand.create(name: "Molejo") }
2508
+ let(:song) { band.songs.create(name: "Cilada") }
2509
+
2510
+ it "assigns the default correctly" do
2511
+ expect(song.band_name).to eq("Molejo")
2512
+ end
2513
+ end
2514
+
2515
+ context "when using autobuilding" do
2516
+ before do
2517
+ InterceptablePlane.create!.tap do |plane|
2518
+ plane.wings.create!
2519
+ end
2520
+ end
2521
+
2522
+ let(:plane) { InterceptablePlane.first }
2523
+ let(:wing) { InterceptableWing.first }
2524
+ let(:engine) { wing.engine }
2525
+
2526
+ it "sets the defaults correctly" do
2527
+ expect(wing._id).to eq("hello-wing")
2528
+ expect(wing.p_id).to eq(plane._id.to_s)
2529
+ expect(wing.e_id).to eq(engine._id.to_s)
2530
+ expect(engine._id).to eq("hello-engine-#{wing.id}")
2531
+ end
2532
+ end
2533
+ end
2534
+
2535
+ # This case is rather niche. The _ids method used to use the `.only` method
2536
+ # to get only the _ids for an association, which was causing a
2537
+ # MissingAttributeError to be raised when accessing another association. This
2538
+ # was fixed by using `.pluck` over `.only`. Look at MONGOID-5306 for a more
2539
+ # detailed explanation.
2540
+ context "when accessing _ids in validate and access an association in after_initialize" do
2541
+ it "doesn't raise a MissingAttributeError" do
2542
+ company = InterceptableCompany.create!
2543
+ shop = InterceptableShop.create!(company: company)
2544
+ user = InterceptableUser.new
2545
+ user.company = company
2546
+ expect do
2547
+ user.save!
2548
+ end.to_not raise_error(ActiveModel::MissingAttributeError)
2549
+ end
2550
+ end
2551
+
2552
+ context "when around callbacks for embedded are disabled" do
2553
+ config_override :around_callbacks_for_embeds, false
2554
+
2555
+ context "when around callback is defined" do
2556
+ let(:registry) { InterceptableSpec::CallbackRegistry.new }
2557
+
2558
+ let(:parent) do
2559
+ InterceptableSpec::CbEmbedsOneParent.new(registry).tap do |parent|
2560
+ parent.child = InterceptableSpec::CbEmbedsOneChild.new(registry)
2561
+ end
2562
+ end
2563
+
2564
+ before do
2565
+ expect(Mongoid.logger).to receive(:warn).with(/Around callbacks are disabled for embedded documents/).twice.and_call_original
2566
+ expect(Mongoid.logger).to receive(:warn).with(/To enable around callbacks for embedded documents/).twice.and_call_original
2567
+ end
2568
+
2569
+ it "logs a warning" do
2570
+ parent.save!
2571
+ end
1792
2572
  end
1793
2573
  end
1794
2574
  end