mongoid 7.2.1 → 9.0.0

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 (1082) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +20 -20
  4. data/LICENSE +1 -1
  5. data/README.md +7 -12
  6. data/Rakefile +58 -1
  7. data/lib/config/locales/en.yml +191 -60
  8. data/lib/mongoid/association/accessors.rb +67 -53
  9. data/lib/mongoid/association/bindable.rb +77 -31
  10. data/lib/mongoid/association/builders.rb +8 -14
  11. data/lib/mongoid/association/constrainable.rb +2 -5
  12. data/lib/mongoid/association/depending.rb +20 -12
  13. data/lib/mongoid/association/eager.rb +160 -0
  14. data/lib/mongoid/association/eager_loadable.rb +41 -11
  15. data/lib/mongoid/association/embedded/batchable.rb +63 -52
  16. data/lib/mongoid/association/embedded/cyclic.rb +4 -12
  17. data/lib/mongoid/association/embedded/eager.rb +23 -0
  18. data/lib/mongoid/association/embedded/embedded_in/binding.rb +29 -13
  19. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +3 -5
  20. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +25 -23
  21. data/lib/mongoid/association/embedded/embedded_in.rb +11 -26
  22. data/lib/mongoid/association/embedded/embeds_many/binding.rb +4 -9
  23. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +5 -6
  24. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +226 -203
  25. data/lib/mongoid/association/embedded/embeds_many.rb +3 -33
  26. data/lib/mongoid/association/embedded/embeds_one/binding.rb +3 -9
  27. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +20 -8
  28. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +131 -42
  29. data/lib/mongoid/association/embedded/embeds_one.rb +4 -30
  30. data/lib/mongoid/association/embedded.rb +2 -1
  31. data/lib/mongoid/association/macros.rb +47 -16
  32. data/lib/mongoid/association/many.rb +12 -24
  33. data/lib/mongoid/association/marshalable.rb +4 -5
  34. data/lib/mongoid/association/nested/many.rb +14 -19
  35. data/lib/mongoid/association/nested/nested_buildable.rb +36 -13
  36. data/lib/mongoid/association/nested/one.rb +54 -26
  37. data/lib/mongoid/association/nested.rb +1 -3
  38. data/lib/mongoid/association/one.rb +3 -11
  39. data/lib/mongoid/association/options.rb +18 -44
  40. data/lib/mongoid/association/proxy.rb +49 -42
  41. data/lib/mongoid/association/referenced/auto_save.rb +11 -15
  42. data/lib/mongoid/association/referenced/belongs_to/binding.rb +2 -7
  43. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +6 -6
  44. data/lib/mongoid/association/referenced/belongs_to/eager.rb +2 -2
  45. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +23 -32
  46. data/lib/mongoid/association/referenced/belongs_to.rb +13 -37
  47. data/lib/mongoid/association/referenced/counter_cache.rb +18 -26
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +15 -8
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +1 -3
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +2 -2
  51. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +191 -123
  52. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +23 -42
  53. data/lib/mongoid/association/referenced/has_many/binding.rb +1 -5
  54. data/lib/mongoid/association/referenced/has_many/buildable.rb +1 -3
  55. data/lib/mongoid/association/referenced/has_many/eager.rb +2 -2
  56. data/lib/mongoid/association/referenced/has_many/enumerable.rb +471 -496
  57. data/lib/mongoid/association/referenced/has_many/proxy.rb +182 -179
  58. data/lib/mongoid/association/referenced/has_many.rb +17 -43
  59. data/lib/mongoid/association/referenced/has_one/binding.rb +1 -7
  60. data/lib/mongoid/association/referenced/has_one/buildable.rb +5 -5
  61. data/lib/mongoid/association/referenced/has_one/eager.rb +3 -4
  62. data/lib/mongoid/association/referenced/has_one/proxy.rb +38 -41
  63. data/lib/mongoid/association/referenced/has_one.rb +17 -36
  64. data/lib/mongoid/association/referenced/syncable.rb +11 -27
  65. data/lib/mongoid/association/referenced.rb +1 -1
  66. data/lib/mongoid/association/reflections.rb +9 -9
  67. data/lib/mongoid/association/relatable.rb +55 -74
  68. data/lib/mongoid/association.rb +10 -22
  69. data/lib/mongoid/atomic/modifiers.rb +7 -53
  70. data/lib/mongoid/atomic/paths/embedded/many.rb +20 -5
  71. data/lib/mongoid/atomic/paths/embedded/one.rb +1 -5
  72. data/lib/mongoid/atomic/paths/embedded.rb +1 -3
  73. data/lib/mongoid/atomic/paths/root.rb +1 -5
  74. data/lib/mongoid/atomic/paths.rb +1 -1
  75. data/lib/mongoid/atomic.rb +39 -86
  76. data/lib/mongoid/atomic_update_preparer.rb +88 -0
  77. data/lib/mongoid/attributes/dynamic.rb +5 -21
  78. data/lib/mongoid/attributes/embedded.rb +34 -0
  79. data/lib/mongoid/attributes/nested.rb +9 -13
  80. data/lib/mongoid/attributes/processing.rb +43 -28
  81. data/lib/mongoid/attributes/projector.rb +120 -0
  82. data/lib/mongoid/attributes/readonly.rb +4 -8
  83. data/lib/mongoid/attributes.rb +85 -89
  84. data/lib/mongoid/cacheable.rb +5 -9
  85. data/lib/mongoid/changeable.rb +183 -97
  86. data/lib/mongoid/clients/factory.rb +58 -15
  87. data/lib/mongoid/clients/options.rb +117 -8
  88. data/lib/mongoid/clients/sessions.rb +246 -84
  89. data/lib/mongoid/clients/storage_options.rb +37 -11
  90. data/lib/mongoid/clients/validators/storage.rb +4 -24
  91. data/lib/mongoid/clients/validators.rb +1 -1
  92. data/lib/mongoid/clients.rb +37 -14
  93. data/lib/mongoid/collection_configurable.rb +59 -0
  94. data/lib/mongoid/composable.rb +7 -7
  95. data/lib/mongoid/config/defaults.rb +40 -0
  96. data/lib/mongoid/config/encryption.rb +213 -0
  97. data/lib/mongoid/config/environment.rb +25 -5
  98. data/lib/mongoid/config/introspection.rb +152 -0
  99. data/lib/mongoid/config/options.rb +11 -14
  100. data/lib/mongoid/config/validators/async_query_executor.rb +34 -0
  101. data/lib/mongoid/config/validators/client.rb +7 -23
  102. data/lib/mongoid/config/validators/option.rb +1 -3
  103. data/lib/mongoid/config/validators.rb +2 -1
  104. data/lib/mongoid/config.rb +183 -46
  105. data/lib/mongoid/contextual/aggregable/memory.rb +38 -26
  106. data/lib/mongoid/contextual/aggregable/mongo.rb +26 -32
  107. data/lib/mongoid/contextual/aggregable/none.rb +66 -0
  108. data/lib/mongoid/contextual/aggregable.rb +18 -0
  109. data/lib/mongoid/contextual/atomic.rb +97 -30
  110. data/lib/mongoid/contextual/command.rb +3 -5
  111. data/lib/mongoid/contextual/map_reduce.rb +8 -33
  112. data/lib/mongoid/contextual/memory.rb +396 -89
  113. data/lib/mongoid/contextual/mongo/documents_loader.rb +178 -0
  114. data/lib/mongoid/contextual/mongo.rb +640 -311
  115. data/lib/mongoid/contextual/none.rb +244 -30
  116. data/lib/mongoid/contextual/queryable.rb +5 -4
  117. data/lib/mongoid/contextual.rb +18 -7
  118. data/lib/mongoid/copyable.rb +34 -14
  119. data/lib/mongoid/criteria/findable.rb +52 -22
  120. data/lib/mongoid/criteria/includable.rb +31 -34
  121. data/lib/mongoid/criteria/inspectable.rb +4 -3
  122. data/lib/mongoid/criteria/marshalable.rb +14 -7
  123. data/lib/mongoid/criteria/modifiable.rb +5 -19
  124. data/lib/mongoid/criteria/options.rb +1 -3
  125. data/lib/mongoid/criteria/permission.rb +6 -2
  126. data/lib/mongoid/criteria/queryable/aggregable.rb +3 -15
  127. data/lib/mongoid/criteria/queryable/expandable.rb +1 -25
  128. data/lib/mongoid/criteria/queryable/extensions/array.rb +6 -41
  129. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -9
  130. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +5 -7
  131. data/lib/mongoid/criteria/queryable/extensions/date.rb +10 -11
  132. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +8 -7
  133. data/lib/mongoid/criteria/queryable/extensions/hash.rb +3 -41
  134. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +2 -14
  135. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +3 -21
  136. data/lib/mongoid/criteria/queryable/extensions/object.rb +7 -30
  137. data/lib/mongoid/criteria/queryable/extensions/range.rb +48 -17
  138. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +10 -13
  139. data/lib/mongoid/criteria/queryable/extensions/set.rb +3 -5
  140. data/lib/mongoid/criteria/queryable/extensions/string.rb +19 -34
  141. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +6 -22
  142. data/lib/mongoid/criteria/queryable/extensions/time.rb +8 -9
  143. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +9 -9
  144. data/lib/mongoid/criteria/queryable/extensions.rb +1 -5
  145. data/lib/mongoid/criteria/queryable/key.rb +15 -18
  146. data/lib/mongoid/criteria/queryable/macroable.rb +1 -3
  147. data/lib/mongoid/criteria/queryable/mergeable.rb +69 -50
  148. data/lib/mongoid/criteria/queryable/optional.rb +12 -62
  149. data/lib/mongoid/criteria/queryable/options.rb +3 -21
  150. data/lib/mongoid/criteria/queryable/pipeline.rb +2 -14
  151. data/lib/mongoid/criteria/queryable/selectable.rb +87 -124
  152. data/lib/mongoid/criteria/queryable/selector.rb +96 -25
  153. data/lib/mongoid/criteria/queryable/smash.rb +41 -18
  154. data/lib/mongoid/criteria/queryable/storable.rb +14 -9
  155. data/lib/mongoid/criteria/queryable.rb +12 -13
  156. data/lib/mongoid/criteria/scopable.rb +32 -21
  157. data/lib/mongoid/criteria/translator.rb +46 -0
  158. data/lib/mongoid/criteria.rb +60 -109
  159. data/lib/mongoid/deprecable.rb +38 -0
  160. data/lib/mongoid/deprecation.rb +29 -0
  161. data/lib/mongoid/document.rb +263 -173
  162. data/lib/mongoid/encryptable.rb +53 -0
  163. data/lib/mongoid/equality.rb +22 -25
  164. data/lib/mongoid/errors/ambiguous_relationship.rb +3 -5
  165. data/lib/mongoid/errors/attribute_not_loaded.rb +34 -0
  166. data/lib/mongoid/errors/callback.rb +1 -3
  167. data/lib/mongoid/errors/create_collection_failure.rb +34 -0
  168. data/lib/mongoid/errors/criteria_argument_required.rb +1 -1
  169. data/lib/mongoid/errors/delete_restriction.rb +9 -12
  170. data/lib/mongoid/errors/document_not_destroyed.rb +3 -7
  171. data/lib/mongoid/errors/document_not_found.rb +34 -21
  172. data/lib/mongoid/errors/drop_collection_failure.rb +28 -0
  173. data/lib/mongoid/errors/empty_config_file.rb +26 -0
  174. data/lib/mongoid/errors/immutable_attribute.rb +27 -0
  175. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -3
  176. data/lib/mongoid/errors/invalid_async_query_executor.rb +26 -0
  177. data/lib/mongoid/errors/invalid_auto_encryption_configuration.rb +33 -0
  178. data/lib/mongoid/errors/invalid_collection.rb +1 -1
  179. data/lib/mongoid/errors/invalid_config_file.rb +26 -0
  180. data/lib/mongoid/errors/invalid_config_option.rb +2 -4
  181. data/lib/mongoid/errors/invalid_dependent_strategy.rb +2 -4
  182. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +1 -1
  183. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +24 -0
  184. data/lib/mongoid/errors/invalid_elem_match_operator.rb +1 -1
  185. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +6 -5
  186. data/lib/mongoid/errors/invalid_estimated_count_scoping.rb +27 -0
  187. data/lib/mongoid/errors/invalid_expression_operator.rb +1 -1
  188. data/lib/mongoid/errors/invalid_field.rb +7 -7
  189. data/lib/mongoid/errors/invalid_field_operator.rb +1 -1
  190. data/lib/mongoid/errors/invalid_field_option.rb +1 -3
  191. data/lib/mongoid/errors/invalid_field_type.rb +27 -0
  192. data/lib/mongoid/errors/invalid_find.rb +1 -3
  193. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +23 -0
  194. data/lib/mongoid/errors/invalid_includes.rb +1 -3
  195. data/lib/mongoid/errors/invalid_index.rb +1 -3
  196. data/lib/mongoid/errors/invalid_options.rb +1 -3
  197. data/lib/mongoid/errors/invalid_path.rb +1 -3
  198. data/lib/mongoid/errors/invalid_persistence_option.rb +1 -5
  199. data/lib/mongoid/errors/invalid_query.rb +1 -1
  200. data/lib/mongoid/errors/invalid_relation.rb +2 -8
  201. data/lib/mongoid/errors/invalid_relation_option.rb +2 -4
  202. data/lib/mongoid/errors/invalid_scope.rb +1 -3
  203. data/lib/mongoid/errors/invalid_session_nesting.rb +17 -0
  204. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +1 -2
  205. data/lib/mongoid/errors/invalid_storage_options.rb +2 -4
  206. data/lib/mongoid/errors/invalid_time.rb +1 -3
  207. data/lib/mongoid/errors/invalid_transaction_nesting.rb +17 -0
  208. data/lib/mongoid/errors/inverse_not_found.rb +1 -3
  209. data/lib/mongoid/errors/mixed_client_configuration.rb +1 -3
  210. data/lib/mongoid/errors/mixed_relations.rb +1 -3
  211. data/lib/mongoid/errors/mongoid_error.rb +8 -16
  212. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +2 -4
  213. data/lib/mongoid/errors/no_client_config.rb +1 -3
  214. data/lib/mongoid/errors/no_client_database.rb +2 -4
  215. data/lib/mongoid/errors/no_client_hosts.rb +2 -4
  216. data/lib/mongoid/errors/no_clients_config.rb +1 -3
  217. data/lib/mongoid/errors/no_default_client.rb +1 -3
  218. data/lib/mongoid/errors/no_environment.rb +1 -3
  219. data/lib/mongoid/errors/no_map_reduce_output.rb +1 -3
  220. data/lib/mongoid/errors/no_metadata.rb +1 -3
  221. data/lib/mongoid/errors/no_parent.rb +1 -3
  222. data/lib/mongoid/errors/readonly_attribute.rb +2 -4
  223. data/lib/mongoid/errors/readonly_document.rb +2 -6
  224. data/lib/mongoid/errors/rollback.rb +15 -0
  225. data/lib/mongoid/errors/scope_overwrite.rb +1 -1
  226. data/lib/mongoid/errors/sessions_not_supported.rb +17 -0
  227. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +2 -2
  228. data/lib/mongoid/errors/transaction_error.rb +25 -0
  229. data/lib/mongoid/errors/transactions_not_supported.rb +17 -0
  230. data/lib/mongoid/errors/unknown_attribute.rb +2 -4
  231. data/lib/mongoid/errors/unknown_model.rb +1 -3
  232. data/lib/mongoid/errors/unsaved_document.rb +2 -2
  233. data/lib/mongoid/errors/unsupported_javascript.rb +1 -3
  234. data/lib/mongoid/errors/validations.rb +1 -1
  235. data/lib/mongoid/errors.rb +18 -5
  236. data/lib/mongoid/evolvable.rb +2 -4
  237. data/lib/mongoid/extensions/array.rb +20 -58
  238. data/lib/mongoid/extensions/big_decimal.rb +44 -24
  239. data/lib/mongoid/extensions/binary.rb +45 -0
  240. data/lib/mongoid/extensions/boolean.rb +11 -6
  241. data/lib/mongoid/extensions/date.rb +31 -29
  242. data/lib/mongoid/extensions/date_time.rb +5 -16
  243. data/lib/mongoid/extensions/decimal128.rb +3 -5
  244. data/lib/mongoid/extensions/false_class.rb +8 -10
  245. data/lib/mongoid/extensions/float.rb +11 -12
  246. data/lib/mongoid/extensions/hash.rb +28 -148
  247. data/lib/mongoid/extensions/integer.rb +13 -14
  248. data/lib/mongoid/extensions/module.rb +5 -5
  249. data/lib/mongoid/extensions/nil_class.rb +5 -7
  250. data/lib/mongoid/extensions/object.rb +32 -81
  251. data/lib/mongoid/extensions/object_id.rb +3 -7
  252. data/lib/mongoid/extensions/range.rb +47 -24
  253. data/lib/mongoid/extensions/raw_value.rb +34 -0
  254. data/lib/mongoid/extensions/regexp.rb +14 -7
  255. data/lib/mongoid/extensions/set.rb +24 -13
  256. data/lib/mongoid/extensions/string.rb +30 -62
  257. data/lib/mongoid/extensions/symbol.rb +9 -22
  258. data/lib/mongoid/extensions/time.rb +30 -40
  259. data/lib/mongoid/extensions/time_with_zone.rb +18 -11
  260. data/lib/mongoid/extensions/true_class.rb +8 -10
  261. data/lib/mongoid/extensions.rb +3 -20
  262. data/lib/mongoid/factory.rb +178 -37
  263. data/lib/mongoid/fields/encrypted.rb +48 -0
  264. data/lib/mongoid/fields/foreign_key.rb +39 -27
  265. data/lib/mongoid/fields/localized.rb +25 -15
  266. data/lib/mongoid/fields/standard.rb +22 -40
  267. data/lib/mongoid/fields/validators/macro.rb +6 -19
  268. data/lib/mongoid/fields/validators.rb +1 -1
  269. data/lib/mongoid/fields.rb +354 -76
  270. data/lib/mongoid/findable.rb +62 -22
  271. data/lib/mongoid/indexable/specification.rb +55 -34
  272. data/lib/mongoid/indexable/validators/options.rb +7 -9
  273. data/lib/mongoid/indexable.rb +2 -18
  274. data/lib/mongoid/inspectable.rb +34 -11
  275. data/lib/mongoid/interceptable.rb +197 -41
  276. data/lib/mongoid/loadable.rb +83 -0
  277. data/lib/mongoid/loggable.rb +1 -9
  278. data/lib/mongoid/matchable.rb +2 -6
  279. data/lib/mongoid/matcher/all.rb +15 -0
  280. data/lib/mongoid/matcher/and.rb +14 -0
  281. data/lib/mongoid/matcher/bits.rb +60 -0
  282. data/lib/mongoid/matcher/bits_all_clear.rb +41 -0
  283. data/lib/mongoid/matcher/bits_all_set.rb +41 -0
  284. data/lib/mongoid/matcher/bits_any_clear.rb +41 -0
  285. data/lib/mongoid/matcher/bits_any_set.rb +41 -0
  286. data/lib/mongoid/matcher/elem_match.rb +17 -1
  287. data/lib/mongoid/matcher/elem_match_expression.rb +14 -2
  288. data/lib/mongoid/matcher/eq.rb +15 -0
  289. data/lib/mongoid/matcher/eq_impl.rb +54 -2
  290. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +18 -1
  291. data/lib/mongoid/matcher/exists.rb +15 -0
  292. data/lib/mongoid/matcher/expression.rb +22 -14
  293. data/lib/mongoid/matcher/expression_operator.rb +14 -0
  294. data/lib/mongoid/matcher/field_expression.rb +19 -5
  295. data/lib/mongoid/matcher/field_operator.rb +30 -0
  296. data/lib/mongoid/matcher/gt.rb +15 -0
  297. data/lib/mongoid/matcher/gte.rb +15 -0
  298. data/lib/mongoid/matcher/in.rb +15 -0
  299. data/lib/mongoid/matcher/lt.rb +15 -0
  300. data/lib/mongoid/matcher/lte.rb +15 -0
  301. data/lib/mongoid/matcher/mod.rb +33 -0
  302. data/lib/mongoid/matcher/ne.rb +15 -0
  303. data/lib/mongoid/matcher/nin.rb +15 -0
  304. data/lib/mongoid/matcher/nor.rb +14 -0
  305. data/lib/mongoid/matcher/not.rb +16 -0
  306. data/lib/mongoid/matcher/or.rb +14 -0
  307. data/lib/mongoid/matcher/regex.rb +24 -0
  308. data/lib/mongoid/matcher/size.rb +16 -0
  309. data/lib/mongoid/matcher/type.rb +124 -0
  310. data/lib/mongoid/matcher.rb +59 -52
  311. data/lib/mongoid/persistable/creatable.rb +25 -29
  312. data/lib/mongoid/persistable/deletable.rb +10 -23
  313. data/lib/mongoid/persistable/destroyable.rb +37 -11
  314. data/lib/mongoid/persistable/incrementable.rb +2 -6
  315. data/lib/mongoid/persistable/logical.rb +1 -5
  316. data/lib/mongoid/persistable/maxable.rb +37 -0
  317. data/lib/mongoid/persistable/minable.rb +37 -0
  318. data/lib/mongoid/persistable/multipliable.rb +36 -0
  319. data/lib/mongoid/persistable/poppable.rb +1 -5
  320. data/lib/mongoid/persistable/pullable.rb +1 -7
  321. data/lib/mongoid/persistable/pushable.rb +1 -7
  322. data/lib/mongoid/persistable/renamable.rb +1 -5
  323. data/lib/mongoid/persistable/savable.rb +14 -8
  324. data/lib/mongoid/persistable/settable.rb +1 -5
  325. data/lib/mongoid/persistable/unsettable.rb +3 -7
  326. data/lib/mongoid/persistable/updatable.rb +114 -28
  327. data/lib/mongoid/persistable/upsertable.rb +33 -8
  328. data/lib/mongoid/persistable.rb +17 -27
  329. data/lib/mongoid/persistence_context.rb +111 -43
  330. data/lib/mongoid/positional.rb +1 -5
  331. data/lib/mongoid/railtie.rb +23 -15
  332. data/lib/mongoid/railties/bson_object_id_serializer.rb +39 -0
  333. data/lib/mongoid/railties/console_sandbox.rb +42 -0
  334. data/lib/mongoid/railties/controller_runtime.rb +21 -6
  335. data/lib/mongoid/railties/database.rake +19 -2
  336. data/lib/mongoid/reloadable.rb +45 -42
  337. data/lib/mongoid/scopable.rb +25 -53
  338. data/lib/mongoid/search_indexable.rb +167 -0
  339. data/lib/mongoid/selectable.rb +6 -17
  340. data/lib/mongoid/serializable.rb +11 -21
  341. data/lib/mongoid/shardable.rb +50 -16
  342. data/lib/mongoid/stateful.rb +66 -22
  343. data/lib/mongoid/stringified_symbol.rb +19 -7
  344. data/lib/mongoid/tasks/database.rake +25 -0
  345. data/lib/mongoid/tasks/database.rb +84 -8
  346. data/lib/mongoid/tasks/encryption.rake +59 -0
  347. data/lib/mongoid/tasks/encryption.rb +108 -0
  348. data/lib/mongoid/threaded/lifecycle.rb +6 -26
  349. data/lib/mongoid/threaded.rb +131 -92
  350. data/lib/mongoid/timestamps/created/short.rb +1 -1
  351. data/lib/mongoid/timestamps/created.rb +4 -4
  352. data/lib/mongoid/timestamps/short.rb +1 -1
  353. data/lib/mongoid/timestamps/timeless.rb +29 -7
  354. data/lib/mongoid/timestamps/updated/short.rb +1 -1
  355. data/lib/mongoid/timestamps/updated.rb +3 -5
  356. data/lib/mongoid/timestamps.rb +1 -1
  357. data/lib/mongoid/touchable.rb +155 -29
  358. data/lib/mongoid/traversable.rb +180 -125
  359. data/lib/mongoid/utils.rb +52 -0
  360. data/lib/mongoid/validatable/associated.rb +97 -21
  361. data/lib/mongoid/validatable/format.rb +1 -1
  362. data/lib/mongoid/validatable/length.rb +1 -1
  363. data/lib/mongoid/validatable/localizable.rb +2 -4
  364. data/lib/mongoid/validatable/macros.rb +10 -14
  365. data/lib/mongoid/validatable/presence.rb +7 -13
  366. data/lib/mongoid/validatable/queryable.rb +9 -3
  367. data/lib/mongoid/validatable/uniqueness.rb +26 -39
  368. data/lib/mongoid/validatable.rb +20 -29
  369. data/lib/mongoid/version.rb +2 -2
  370. data/lib/mongoid/warnings.rb +37 -0
  371. data/lib/mongoid.rb +56 -22
  372. data/lib/rails/generators/mongoid/config/config_generator.rb +25 -5
  373. data/lib/rails/generators/mongoid/config/templates/mongoid.rb +25 -0
  374. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +44 -64
  375. data/lib/rails/generators/mongoid/model/model_generator.rb +4 -1
  376. data/lib/rails/generators/mongoid_generator.rb +13 -1
  377. data/lib/rails/mongoid.rb +4 -32
  378. data/spec/config/mongoid.yml +16 -1
  379. data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
  380. data/spec/integration/active_job_spec.rb +32 -0
  381. data/spec/integration/app_spec.rb +180 -89
  382. data/spec/integration/associations/belongs_to_spec.rb +19 -1
  383. data/spec/integration/associations/embedded_dirty_spec.rb +58 -0
  384. data/spec/integration/associations/embedded_spec.rb +90 -7
  385. data/spec/integration/associations/embeds_many_spec.rb +197 -1
  386. data/spec/integration/associations/embeds_one_spec.rb +19 -1
  387. data/spec/integration/associations/foreign_key_spec.rb +10 -1
  388. data/spec/integration/associations/foreign_key_spec_models.rb +1 -1
  389. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +62 -0
  390. data/spec/integration/associations/has_many_spec.rb +1 -1
  391. data/spec/integration/associations/has_one_spec.rb +145 -1
  392. data/spec/integration/associations/nested_attributes_assignment_spec.rb +1 -1
  393. data/spec/integration/associations/reverse_population_spec.rb +1 -1
  394. data/spec/integration/associations/reverse_population_spec_models.rb +1 -1
  395. data/spec/integration/associations/scope_option_spec.rb +102 -0
  396. data/spec/integration/atomic/modifiers_spec.rb +1 -1
  397. data/spec/integration/bson_regexp_raw_spec.rb +1 -1
  398. data/spec/integration/callbacks_models.rb +147 -3
  399. data/spec/integration/callbacks_spec.rb +398 -8
  400. data/spec/integration/contextual/empty_spec.rb +142 -0
  401. data/spec/integration/criteria/alias_query_spec.rb +98 -0
  402. data/spec/integration/criteria/date_field_spec.rb +2 -2
  403. data/spec/integration/criteria/default_scope_spec.rb +52 -0
  404. data/spec/integration/criteria/logical_spec.rb +12 -0
  405. data/spec/integration/criteria/range_spec.rb +358 -0
  406. data/spec/integration/criteria/raw_value_spec.rb +525 -0
  407. data/spec/integration/criteria/time_with_zone_spec.rb +126 -15
  408. data/spec/integration/discriminator_key_spec.rb +119 -81
  409. data/spec/integration/discriminator_value_spec.rb +1 -1
  410. data/spec/integration/document_spec.rb +31 -1
  411. data/spec/integration/dots_and_dollars_spec.rb +278 -0
  412. data/spec/integration/encryption_spec.rb +100 -0
  413. data/spec/integration/i18n_fallbacks_spec.rb +10 -52
  414. data/spec/integration/matcher_examples_spec.rb +21 -14
  415. data/spec/integration/matcher_operator_data/bits_all_clear.yml +144 -0
  416. data/spec/integration/matcher_operator_data/bits_all_set.yml +144 -0
  417. data/spec/integration/matcher_operator_data/bits_any_clear.yml +144 -0
  418. data/spec/integration/matcher_operator_data/bits_any_set.yml +144 -0
  419. data/spec/integration/matcher_operator_data/comment.yml +22 -0
  420. data/spec/integration/matcher_operator_data/elem_match.yml +46 -0
  421. data/spec/integration/matcher_operator_data/implicit_traversal.yml +96 -0
  422. data/spec/integration/matcher_operator_data/in.yml +16 -0
  423. data/spec/integration/matcher_operator_data/mod.yml +55 -0
  424. data/spec/integration/matcher_operator_data/size.yml +0 -3
  425. data/spec/integration/matcher_operator_data/type.yml +64 -0
  426. data/spec/integration/matcher_operator_data/type_array.yml +15 -0
  427. data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
  428. data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
  429. data/spec/integration/matcher_operator_data/type_code.yml +26 -0
  430. data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
  431. data/spec/integration/matcher_operator_data/type_date.yml +39 -0
  432. data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
  433. data/spec/integration/matcher_operator_data/type_decimal.yml +37 -0
  434. data/spec/integration/matcher_operator_data/type_double.yml +15 -0
  435. data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
  436. data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
  437. data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
  438. data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
  439. data/spec/integration/matcher_operator_data/type_null.yml +23 -0
  440. data/spec/integration/matcher_operator_data/type_object.yml +23 -0
  441. data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
  442. data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
  443. data/spec/integration/matcher_operator_data/type_string.yml +15 -0
  444. data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
  445. data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
  446. data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
  447. data/spec/integration/matcher_operator_spec.rb +26 -3
  448. data/spec/integration/matcher_spec.rb +50 -1
  449. data/spec/integration/persistence/range_field_spec.rb +351 -0
  450. data/spec/integration/server_query_spec.rb +1 -1
  451. data/spec/integration/shardable_spec.rb +1 -1
  452. data/spec/integration/stringified_symbol_field_spec.rb +17 -3
  453. data/spec/lite_spec_helper.rb +47 -14
  454. data/spec/mongoid/association/accessors_spec.rb +31 -19
  455. data/spec/mongoid/association/auto_save_spec.rb +73 -34
  456. data/spec/mongoid/association/builders_spec.rb +2 -2
  457. data/spec/mongoid/association/constrainable_spec.rb +1 -1
  458. data/spec/mongoid/association/counter_cache_spec.rb +34 -34
  459. data/spec/mongoid/association/depending_spec.rb +397 -358
  460. data/spec/mongoid/association/eager_spec.rb +56 -6
  461. data/spec/mongoid/association/embedded/cyclic_spec.rb +3 -3
  462. data/spec/mongoid/association/embedded/dirty_spec.rb +3 -3
  463. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +3 -2
  464. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +55 -1
  465. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +110 -23
  466. data/spec/mongoid/association/embedded/embedded_in_spec.rb +19 -8
  467. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +1 -1
  468. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +113 -1
  469. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +712 -203
  470. data/spec/mongoid/association/embedded/embeds_many_models.rb +189 -1
  471. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +14 -2
  472. data/spec/mongoid/association/embedded/embeds_many_spec.rb +69 -1
  473. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +1 -1
  474. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +26 -1
  475. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +37 -24
  476. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +1 -1
  477. data/spec/mongoid/association/embedded/embeds_one_models.rb +25 -2
  478. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +2 -2
  479. data/spec/mongoid/association/embedded/embeds_one_spec.rb +29 -1
  480. data/spec/mongoid/association/macros_spec.rb +10 -10
  481. data/spec/mongoid/association/nested/many_spec.rb +1 -1
  482. data/spec/mongoid/association/nested/one_spec.rb +17 -13
  483. data/spec/mongoid/association/options_spec.rb +1 -1
  484. data/spec/mongoid/association/polymorphic_spec.rb +1 -1
  485. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +3 -2
  486. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +110 -17
  487. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +51 -15
  488. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +113 -59
  489. data/spec/mongoid/association/referenced/belongs_to_models.rb +12 -0
  490. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +22 -2
  491. data/spec/mongoid/association/referenced/belongs_to_spec.rb +27 -22
  492. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +2 -2
  493. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +28 -3
  494. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +32 -3
  495. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +1 -1
  496. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +386 -376
  497. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +44 -1
  498. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +2 -2
  499. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +57 -3
  500. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +2 -2
  501. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +131 -1
  502. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +24 -7
  503. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +313 -134
  504. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +1 -1
  505. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +1313 -2109
  506. data/spec/mongoid/association/referenced/has_many_models.rb +39 -2
  507. data/spec/mongoid/association/referenced/has_many_query_spec.rb +2 -2
  508. data/spec/mongoid/association/referenced/has_many_spec.rb +47 -1
  509. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +1 -1
  510. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +54 -10
  511. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +18 -2
  512. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +134 -28
  513. data/spec/mongoid/association/referenced/has_one_models.rb +43 -1
  514. data/spec/mongoid/association/referenced/has_one_query_spec.rb +2 -2
  515. data/spec/mongoid/association/referenced/has_one_spec.rb +22 -1
  516. data/spec/mongoid/association/reflections_spec.rb +1 -1
  517. data/spec/mongoid/association/syncable_spec.rb +47 -33
  518. data/spec/mongoid/association_spec.rb +1 -1
  519. data/spec/mongoid/atomic/modifiers_spec.rb +1 -1
  520. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +1 -1
  521. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +1 -1
  522. data/spec/mongoid/atomic/paths/root_spec.rb +1 -1
  523. data/spec/mongoid/atomic/paths_spec.rb +65 -27
  524. data/spec/mongoid/atomic_spec.rb +29 -7
  525. data/spec/mongoid/atomic_update_preparer_spec.rb +83 -0
  526. data/spec/mongoid/attributes/dynamic_spec.rb +1 -1
  527. data/spec/mongoid/attributes/embedded_spec.rb +118 -0
  528. data/spec/mongoid/attributes/nested_spec.rb +147 -78
  529. data/spec/mongoid/attributes/nested_spec_models.rb +49 -0
  530. data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
  531. data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
  532. data/spec/mongoid/attributes/projector_spec.rb +41 -0
  533. data/spec/mongoid/attributes/readonly_spec.rb +23 -23
  534. data/spec/mongoid/attributes_spec.rb +921 -69
  535. data/spec/mongoid/cacheable_spec.rb +5 -5
  536. data/spec/mongoid/changeable_spec.rb +468 -76
  537. data/spec/mongoid/clients/factory_spec.rb +152 -30
  538. data/spec/mongoid/clients/options_spec.rb +24 -12
  539. data/spec/mongoid/clients/sessions_spec.rb +49 -71
  540. data/spec/mongoid/clients/transactions_spec.rb +971 -176
  541. data/spec/mongoid/clients/transactions_spec_models.rb +159 -0
  542. data/spec/mongoid/clients_spec.rb +230 -22
  543. data/spec/mongoid/collection_configurable_spec.rb +159 -0
  544. data/spec/mongoid/composable_spec.rb +1 -1
  545. data/spec/mongoid/config/defaults_spec.rb +99 -0
  546. data/spec/mongoid/config/encryption_spec.rb +152 -0
  547. data/spec/mongoid/config/environment_spec.rb +126 -39
  548. data/spec/mongoid/config/introspection_spec.rb +114 -0
  549. data/spec/mongoid/config/options_spec.rb +1 -1
  550. data/spec/mongoid/config_spec.rb +375 -43
  551. data/spec/mongoid/contextual/aggregable/memory_spec.rb +432 -154
  552. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  553. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +63 -0
  554. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +95 -20
  555. data/spec/mongoid/contextual/aggregable/none_spec.rb +49 -0
  556. data/spec/mongoid/contextual/atomic_spec.rb +329 -87
  557. data/spec/mongoid/contextual/map_reduce_spec.rb +5 -19
  558. data/spec/mongoid/contextual/memory_spec.rb +1479 -127
  559. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +194 -0
  560. data/spec/mongoid/contextual/mongo_spec.rb +3374 -1254
  561. data/spec/mongoid/contextual/none_spec.rb +79 -68
  562. data/spec/mongoid/copyable_spec.rb +465 -23
  563. data/spec/mongoid/copyable_spec_models.rb +1 -1
  564. data/spec/mongoid/criteria/findable_spec.rb +295 -229
  565. data/spec/mongoid/criteria/includable_spec.rb +1493 -0
  566. data/spec/mongoid/criteria/includable_spec_models.rb +55 -0
  567. data/spec/mongoid/criteria/inspectable_spec.rb +1 -1
  568. data/spec/mongoid/criteria/marshalable_spec.rb +19 -2
  569. data/spec/mongoid/criteria/modifiable_spec.rb +38 -38
  570. data/spec/mongoid/criteria/options_spec.rb +1 -1
  571. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +2 -2
  572. data/spec/mongoid/criteria/queryable/expandable_spec.rb +1 -74
  573. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +8 -20
  574. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +135 -27
  575. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +2 -2
  576. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +32 -12
  577. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +12 -1
  578. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +1 -1
  579. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +1 -16
  580. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +1 -1
  581. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +1 -1
  582. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +74 -8
  583. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +1 -1
  584. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +238 -179
  585. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +1 -12
  586. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +1 -12
  587. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +1 -1
  588. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +48 -132
  589. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +5 -60
  590. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +12 -1
  591. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +12 -1
  592. data/spec/mongoid/criteria/queryable/key_spec.rb +1 -1
  593. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +106 -8
  594. data/spec/mongoid/criteria/queryable/optional_spec.rb +17 -486
  595. data/spec/mongoid/criteria/queryable/options_spec.rb +2 -2
  596. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +1 -1
  597. data/spec/mongoid/criteria/queryable/queryable_spec.rb +2 -2
  598. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +700 -26
  599. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +39 -0
  600. data/spec/mongoid/criteria/queryable/selectable_spec.rb +149 -683
  601. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +590 -0
  602. data/spec/mongoid/criteria/queryable/selector_spec.rb +186 -6
  603. data/spec/mongoid/criteria/queryable/smash_spec.rb +1 -1
  604. data/spec/mongoid/criteria/queryable/storable_spec.rb +87 -1
  605. data/spec/mongoid/criteria/scopable_spec.rb +128 -1
  606. data/spec/mongoid/criteria/translator_spec.rb +133 -0
  607. data/spec/mongoid/criteria_projection_spec.rb +407 -0
  608. data/spec/mongoid/criteria_spec.rb +1029 -1806
  609. data/spec/mongoid/document_fields_spec.rb +180 -5
  610. data/spec/mongoid/document_persistence_context_spec.rb +77 -1
  611. data/spec/mongoid/document_query_spec.rb +55 -4
  612. data/spec/mongoid/document_spec.rb +43 -172
  613. data/spec/mongoid/equality_spec.rb +7 -8
  614. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +1 -1
  615. data/spec/mongoid/errors/attribute_not_loaded_spec.rb +32 -0
  616. data/spec/mongoid/errors/callback_spec.rb +1 -1
  617. data/spec/mongoid/errors/delete_restriction_spec.rb +2 -2
  618. data/spec/mongoid/errors/document_not_destroyed_spec.rb +1 -1
  619. data/spec/mongoid/errors/document_not_found_spec.rb +77 -1
  620. data/spec/mongoid/errors/invalid_collection_spec.rb +1 -1
  621. data/spec/mongoid/errors/{eager_load_spec.rb → invalid_config_file_spec.rb} +6 -6
  622. data/spec/mongoid/errors/invalid_config_option_spec.rb +1 -1
  623. data/spec/mongoid/errors/invalid_field_option_spec.rb +1 -1
  624. data/spec/mongoid/errors/invalid_field_spec.rb +2 -2
  625. data/spec/mongoid/errors/invalid_field_type_spec.rb +56 -0
  626. data/spec/mongoid/errors/invalid_find_spec.rb +1 -1
  627. data/spec/mongoid/errors/invalid_includes_spec.rb +1 -1
  628. data/spec/mongoid/errors/invalid_index_spec.rb +1 -1
  629. data/spec/mongoid/errors/invalid_options_spec.rb +1 -1
  630. data/spec/mongoid/errors/invalid_path_spec.rb +1 -1
  631. data/spec/mongoid/errors/invalid_relation_spec.rb +1 -1
  632. data/spec/mongoid/errors/invalid_scope_spec.rb +2 -2
  633. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +1 -1
  634. data/spec/mongoid/errors/invalid_storage_options_spec.rb +1 -1
  635. data/spec/mongoid/errors/invalid_time_spec.rb +1 -1
  636. data/spec/mongoid/errors/inverse_not_found_spec.rb +1 -1
  637. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +1 -1
  638. data/spec/mongoid/errors/mixed_relations_spec.rb +1 -1
  639. data/spec/mongoid/errors/mongoid_error_spec.rb +4 -4
  640. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +1 -1
  641. data/spec/mongoid/errors/no_client_config_spec.rb +1 -1
  642. data/spec/mongoid/errors/no_client_database_spec.rb +1 -1
  643. data/spec/mongoid/errors/no_client_hosts_spec.rb +1 -1
  644. data/spec/mongoid/errors/no_clients_config_spec.rb +1 -1
  645. data/spec/mongoid/errors/no_environment_spec.rb +4 -4
  646. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +1 -1
  647. data/spec/mongoid/errors/no_metadata_spec.rb +1 -1
  648. data/spec/mongoid/errors/no_parent_spec.rb +1 -1
  649. data/spec/mongoid/errors/readonly_attribute_spec.rb +1 -1
  650. data/spec/mongoid/errors/readonly_document_spec.rb +3 -3
  651. data/spec/mongoid/errors/scope_overwrite_spec.rb +1 -1
  652. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +2 -2
  653. data/spec/mongoid/errors/unknown_attribute_spec.rb +3 -3
  654. data/spec/mongoid/errors/unsaved_document_spec.rb +1 -1
  655. data/spec/mongoid/errors/unsupported_javascript_spec.rb +1 -1
  656. data/spec/mongoid/errors/validations_spec.rb +1 -1
  657. data/spec/mongoid/extensions/array_spec.rb +19 -265
  658. data/spec/mongoid/extensions/big_decimal_spec.rb +713 -213
  659. data/spec/mongoid/extensions/binary_spec.rb +45 -10
  660. data/spec/mongoid/extensions/boolean_spec.rb +69 -83
  661. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +15 -11
  662. data/spec/mongoid/extensions/date_spec.rb +74 -22
  663. data/spec/mongoid/extensions/date_time_spec.rb +18 -19
  664. data/spec/mongoid/extensions/decimal128_spec.rb +1 -1
  665. data/spec/mongoid/extensions/false_class_spec.rb +2 -9
  666. data/spec/mongoid/extensions/float_spec.rb +56 -84
  667. data/spec/mongoid/extensions/hash_spec.rb +45 -219
  668. data/spec/mongoid/extensions/integer_spec.rb +53 -73
  669. data/spec/mongoid/extensions/module_spec.rb +1 -1
  670. data/spec/mongoid/extensions/nil_class_spec.rb +1 -1
  671. data/spec/mongoid/extensions/object_id_spec.rb +1 -1
  672. data/spec/mongoid/extensions/object_spec.rb +1 -177
  673. data/spec/mongoid/extensions/range_spec.rb +254 -64
  674. data/spec/mongoid/extensions/raw_value_spec.rb +67 -0
  675. data/spec/mongoid/extensions/regexp_spec.rb +59 -34
  676. data/spec/mongoid/extensions/set_spec.rb +105 -1
  677. data/spec/mongoid/extensions/string_spec.rb +21 -104
  678. data/spec/mongoid/extensions/stringified_symbol_spec.rb +1 -1
  679. data/spec/mongoid/extensions/symbol_spec.rb +15 -53
  680. data/spec/mongoid/extensions/time_spec.rb +345 -131
  681. data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -107
  682. data/spec/mongoid/extensions/true_class_spec.rb +2 -9
  683. data/spec/mongoid/factory_spec.rb +63 -2
  684. data/spec/mongoid/fields/foreign_key_spec.rb +282 -120
  685. data/spec/mongoid/fields/localized_spec.rb +85 -42
  686. data/spec/mongoid/fields/standard_spec.rb +1 -1
  687. data/spec/mongoid/fields_spec.rb +826 -121
  688. data/spec/mongoid/findable_spec.rb +442 -80
  689. data/spec/mongoid/indexable/specification_spec.rb +132 -14
  690. data/spec/mongoid/indexable_spec.rb +361 -23
  691. data/spec/mongoid/inspectable_spec.rb +93 -5
  692. data/spec/mongoid/interceptable_spec.rb +926 -116
  693. data/spec/mongoid/interceptable_spec_models.rb +236 -4
  694. data/spec/mongoid/loading_spec.rb +110 -0
  695. data/spec/mongoid/loggable_spec.rb +1 -1
  696. data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
  697. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +68 -88
  698. data/spec/mongoid/matcher/extract_attribute_spec.rb +5 -15
  699. data/spec/mongoid/mongoizable_spec.rb +286 -0
  700. data/spec/mongoid/monkey_patches_spec.rb +211 -0
  701. data/spec/mongoid/persistable/creatable_spec.rb +5 -5
  702. data/spec/mongoid/persistable/deletable_spec.rb +267 -27
  703. data/spec/mongoid/persistable/destroyable_spec.rb +409 -24
  704. data/spec/mongoid/persistable/incrementable_spec.rb +46 -9
  705. data/spec/mongoid/persistable/logical_spec.rb +42 -5
  706. data/spec/mongoid/persistable/maxable_spec.rb +147 -0
  707. data/spec/mongoid/persistable/minable_spec.rb +147 -0
  708. data/spec/mongoid/persistable/multipliable_spec.rb +227 -0
  709. data/spec/mongoid/persistable/poppable_spec.rb +41 -5
  710. data/spec/mongoid/persistable/pullable_spec.rb +81 -9
  711. data/spec/mongoid/persistable/pushable_spec.rb +81 -9
  712. data/spec/mongoid/persistable/renamable_spec.rb +40 -4
  713. data/spec/mongoid/persistable/savable_spec.rb +114 -20
  714. data/spec/mongoid/persistable/settable_spec.rb +77 -10
  715. data/spec/mongoid/persistable/unsettable_spec.rb +41 -5
  716. data/spec/mongoid/persistable/updatable_spec.rb +64 -52
  717. data/spec/mongoid/persistable/upsertable_spec.rb +124 -4
  718. data/spec/mongoid/persistable_spec.rb +4 -4
  719. data/spec/mongoid/persistence_context_spec.rb +58 -59
  720. data/spec/mongoid/positional_spec.rb +1 -1
  721. data/spec/mongoid/railties/bson_object_id_serializer_spec.rb +24 -0
  722. data/spec/mongoid/railties/console_sandbox_spec.rb +44 -0
  723. data/spec/mongoid/relations/proxy_spec.rb +7 -7
  724. data/spec/mongoid/reloadable_spec.rb +255 -30
  725. data/spec/mongoid/scopable_spec.rb +198 -58
  726. data/spec/mongoid/search_indexable_spec.rb +147 -0
  727. data/spec/mongoid/selectable_spec.rb +7 -7
  728. data/spec/mongoid/serializable_spec.rb +19 -40
  729. data/spec/mongoid/shardable_models.rb +15 -0
  730. data/spec/mongoid/shardable_spec.rb +181 -31
  731. data/spec/mongoid/stateful_spec.rb +152 -10
  732. data/spec/mongoid/tasks/database_rake_spec.rb +193 -42
  733. data/spec/mongoid/tasks/database_spec.rb +175 -2
  734. data/spec/mongoid/tasks/encryption_spec.rb +187 -0
  735. data/spec/mongoid/threaded_spec.rb +40 -3
  736. data/spec/mongoid/timestamps/created/short_spec.rb +2 -2
  737. data/spec/mongoid/timestamps/created_spec.rb +2 -2
  738. data/spec/mongoid/timestamps/timeless_spec.rb +3 -3
  739. data/spec/mongoid/timestamps/updated/short_spec.rb +4 -4
  740. data/spec/mongoid/timestamps/updated_spec.rb +4 -4
  741. data/spec/mongoid/timestamps_spec.rb +399 -11
  742. data/spec/mongoid/timestamps_spec_models.rb +68 -0
  743. data/spec/mongoid/touchable_spec.rb +971 -54
  744. data/spec/mongoid/touchable_spec_models.rb +154 -0
  745. data/spec/mongoid/traversable_spec.rb +79 -37
  746. data/spec/mongoid/validatable/associated_spec.rb +14 -31
  747. data/spec/mongoid/validatable/format_spec.rb +1 -1
  748. data/spec/mongoid/validatable/length_spec.rb +1 -1
  749. data/spec/mongoid/validatable/numericality_spec.rb +1 -1
  750. data/spec/mongoid/validatable/presence_spec.rb +27 -23
  751. data/spec/mongoid/validatable/uniqueness_spec.rb +170 -99
  752. data/spec/mongoid/validatable_spec.rb +4 -4
  753. data/spec/mongoid/warnings_spec.rb +36 -0
  754. data/spec/mongoid_spec.rb +61 -11
  755. data/spec/rails/controller_extension/controller_runtime_spec.rb +3 -3
  756. data/spec/rails/mongoid_spec.rb +28 -132
  757. data/spec/shared/bin/get-mongodb-download-url +17 -0
  758. data/spec/shared/bin/s3-copy +45 -0
  759. data/spec/shared/bin/s3-upload +69 -0
  760. data/spec/shared/lib/mrss/cluster_config.rb +24 -4
  761. data/spec/shared/lib/mrss/constraints.rb +77 -29
  762. data/spec/shared/lib/mrss/docker_runner.rb +40 -4
  763. data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
  764. data/spec/shared/lib/mrss/event_subscriber.rb +210 -0
  765. data/spec/shared/lib/mrss/lite_constraints.rb +64 -1
  766. data/spec/shared/lib/mrss/server_version_registry.rb +78 -34
  767. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  768. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  769. data/spec/shared/lib/mrss/spec_organizer.rb +32 -2
  770. data/spec/shared/lib/mrss/utils.rb +37 -0
  771. data/spec/shared/share/Dockerfile.erb +123 -71
  772. data/spec/shared/share/haproxy-1.conf +16 -0
  773. data/spec/shared/share/haproxy-2.conf +17 -0
  774. data/spec/shared/shlib/config.sh +27 -0
  775. data/spec/shared/shlib/distro.sh +2 -1
  776. data/spec/shared/shlib/server.sh +187 -40
  777. data/spec/shared/shlib/set_env.sh +49 -31
  778. data/spec/spec_helper.rb +46 -49
  779. data/spec/support/authorization.rb +1 -1
  780. data/spec/support/client_registry.rb +10 -0
  781. data/spec/support/constraints.rb +25 -1
  782. data/spec/support/crypt/models.rb +50 -0
  783. data/spec/support/crypt.rb +80 -0
  784. data/spec/support/expectations.rb +1 -1
  785. data/spec/support/feature_sandbox.rb +72 -0
  786. data/spec/support/helpers.rb +1 -0
  787. data/spec/support/immutable_ids.rb +119 -0
  788. data/spec/support/macros.rb +107 -1
  789. data/spec/support/models/account.rb +2 -2
  790. data/spec/support/models/acolyte.rb +1 -1
  791. data/spec/support/models/actor.rb +1 -1
  792. data/spec/support/models/actress.rb +1 -1
  793. data/spec/support/models/address.rb +7 -1
  794. data/spec/support/models/address_component.rb +1 -1
  795. data/spec/support/models/address_number.rb +1 -1
  796. data/spec/support/models/agency.rb +1 -1
  797. data/spec/support/models/agent.rb +1 -1
  798. data/spec/support/models/album.rb +1 -1
  799. data/spec/support/models/alert.rb +1 -1
  800. data/spec/support/models/animal.rb +1 -1
  801. data/spec/support/models/answer.rb +1 -1
  802. data/spec/support/models/appointment.rb +1 -1
  803. data/spec/support/models/armrest.rb +1 -1
  804. data/spec/support/models/array_field.rb +1 -1
  805. data/spec/support/models/article.rb +1 -1
  806. data/spec/support/models/artist.rb +3 -2
  807. data/spec/support/models/artwork.rb +1 -1
  808. data/spec/support/models/audible_sound.rb +4 -0
  809. data/spec/support/models/audio.rb +1 -1
  810. data/spec/support/models/augmentation.rb +13 -1
  811. data/spec/support/models/author.rb +1 -1
  812. data/spec/support/models/baby.rb +1 -1
  813. data/spec/support/models/band.rb +13 -1
  814. data/spec/support/models/bar.rb +1 -1
  815. data/spec/support/models/basic.rb +1 -1
  816. data/spec/support/models/bed.rb +1 -1
  817. data/spec/support/models/big_palette.rb +1 -1
  818. data/spec/support/models/birthday.rb +1 -1
  819. data/spec/support/models/bolt.rb +8 -0
  820. data/spec/support/models/bomb.rb +1 -1
  821. data/spec/support/models/book.rb +2 -1
  822. data/spec/support/models/breed.rb +1 -1
  823. data/spec/support/models/browser.rb +1 -1
  824. data/spec/support/models/building.rb +3 -1
  825. data/spec/support/models/building_address.rb +1 -1
  826. data/spec/support/models/bus.rb +1 -1
  827. data/spec/support/models/business.rb +1 -1
  828. data/spec/support/models/callback_test.rb +1 -1
  829. data/spec/support/models/canvas.rb +1 -1
  830. data/spec/support/models/car.rb +1 -1
  831. data/spec/support/models/cat.rb +1 -1
  832. data/spec/support/models/catalog.rb +25 -0
  833. data/spec/support/models/category.rb +1 -1
  834. data/spec/support/models/child.rb +1 -1
  835. data/spec/support/models/child_doc.rb +4 -4
  836. data/spec/support/models/church.rb +1 -1
  837. data/spec/support/models/circle.rb +1 -1
  838. data/spec/support/models/circuit.rb +1 -1
  839. data/spec/support/models/circus.rb +4 -1
  840. data/spec/support/models/code.rb +3 -1
  841. data/spec/support/models/coding/pull_request.rb +1 -1
  842. data/spec/support/models/coding.rb +1 -1
  843. data/spec/support/models/comment.rb +1 -1
  844. data/spec/support/models/company.rb +1 -1
  845. data/spec/support/models/consumption_period.rb +1 -1
  846. data/spec/support/models/contextable_item.rb +1 -1
  847. data/spec/support/models/contractor.rb +1 -1
  848. data/spec/support/models/cookie.rb +1 -1
  849. data/spec/support/models/country_code.rb +3 -1
  850. data/spec/support/models/courier_job.rb +1 -1
  851. data/spec/support/models/cover.rb +11 -0
  852. data/spec/support/models/crate.rb +1 -1
  853. data/spec/support/models/customer.rb +1 -1
  854. data/spec/support/models/customer_address.rb +1 -1
  855. data/spec/support/models/deed.rb +1 -1
  856. data/spec/support/models/definition.rb +1 -1
  857. data/spec/support/models/delegating_patient.rb +1 -1
  858. data/spec/support/models/description.rb +1 -1
  859. data/spec/support/models/dictionary.rb +1 -1
  860. data/spec/support/models/division.rb +1 -1
  861. data/spec/support/models/doctor.rb +1 -1
  862. data/spec/support/models/dog.rb +1 -1
  863. data/spec/support/models/dokument.rb +1 -1
  864. data/spec/support/models/draft.rb +1 -1
  865. data/spec/support/models/dragon.rb +1 -1
  866. data/spec/support/models/driver.rb +1 -1
  867. data/spec/support/models/drug.rb +1 -1
  868. data/spec/support/models/dungeon.rb +1 -1
  869. data/spec/support/models/edit.rb +1 -1
  870. data/spec/support/models/email.rb +1 -1
  871. data/spec/support/models/employer.rb +1 -1
  872. data/spec/support/models/entry.rb +1 -1
  873. data/spec/support/models/eraser.rb +1 -1
  874. data/spec/support/models/even.rb +1 -1
  875. data/spec/support/models/event.rb +1 -1
  876. data/spec/support/models/exhibition.rb +1 -1
  877. data/spec/support/models/exhibitor.rb +1 -1
  878. data/spec/support/models/explosion.rb +1 -1
  879. data/spec/support/models/eye.rb +1 -1
  880. data/spec/support/models/eye_bowl.rb +1 -1
  881. data/spec/support/models/face.rb +1 -1
  882. data/spec/support/models/fanatic.rb +9 -0
  883. data/spec/support/models/favorite.rb +8 -2
  884. data/spec/support/models/filesystem.rb +1 -1
  885. data/spec/support/models/fire_hydrant.rb +1 -1
  886. data/spec/support/models/firefox.rb +1 -1
  887. data/spec/support/models/fish.rb +1 -1
  888. data/spec/support/models/folder.rb +1 -1
  889. data/spec/support/models/folder_item.rb +1 -1
  890. data/spec/support/models/fruits.rb +1 -1
  891. data/spec/support/models/game.rb +1 -1
  892. data/spec/support/models/ghost.rb +1 -1
  893. data/spec/support/models/guitar.rb +1 -1
  894. data/spec/support/models/hole.rb +13 -0
  895. data/spec/support/models/home.rb +1 -1
  896. data/spec/support/models/house.rb +1 -1
  897. data/spec/support/models/html_writer.rb +1 -1
  898. data/spec/support/models/id_key.rb +1 -1
  899. data/spec/support/models/idnodef.rb +1 -1
  900. data/spec/support/models/image.rb +1 -1
  901. data/spec/support/models/implant.rb +10 -1
  902. data/spec/support/models/instrument.rb +1 -1
  903. data/spec/support/models/item.rb +1 -1
  904. data/spec/support/models/jar.rb +1 -1
  905. data/spec/support/models/kaleidoscope.rb +1 -1
  906. data/spec/support/models/kangaroo.rb +1 -1
  907. data/spec/support/models/label.rb +5 -2
  908. data/spec/support/models/language.rb +1 -1
  909. data/spec/support/models/lat_lng.rb +1 -1
  910. data/spec/support/models/league.rb +1 -1
  911. data/spec/support/models/learner.rb +1 -1
  912. data/spec/support/models/line_item.rb +1 -1
  913. data/spec/support/models/location.rb +1 -1
  914. data/spec/support/models/login.rb +1 -1
  915. data/spec/support/models/manufacturer.rb +1 -1
  916. data/spec/support/models/meat.rb +1 -1
  917. data/spec/support/models/membership.rb +2 -1
  918. data/spec/support/models/message.rb +1 -1
  919. data/spec/support/models/minim.rb +1 -1
  920. data/spec/support/models/mixed_drink.rb +1 -1
  921. data/spec/support/models/mop.rb +10 -1
  922. data/spec/support/models/movie.rb +1 -1
  923. data/spec/support/models/my_hash.rb +1 -1
  924. data/spec/support/models/name.rb +11 -1
  925. data/spec/support/models/name_only.rb +1 -1
  926. data/spec/support/models/node.rb +1 -1
  927. data/spec/support/models/note.rb +1 -1
  928. data/spec/support/models/nut.rb +8 -0
  929. data/spec/support/models/odd.rb +1 -1
  930. data/spec/support/models/order.rb +3 -1
  931. data/spec/support/models/ordered_post.rb +2 -2
  932. data/spec/support/models/ordered_preference.rb +1 -1
  933. data/spec/support/models/oscar.rb +1 -1
  934. data/spec/support/models/other_owner_object.rb +1 -1
  935. data/spec/support/models/override.rb +1 -1
  936. data/spec/support/models/ownable.rb +1 -1
  937. data/spec/support/models/owner.rb +1 -1
  938. data/spec/support/models/pack.rb +1 -1
  939. data/spec/support/models/page.rb +1 -1
  940. data/spec/support/models/page_question.rb +1 -1
  941. data/spec/support/models/palette.rb +1 -1
  942. data/spec/support/models/parent.rb +1 -1
  943. data/spec/support/models/parent_doc.rb +1 -1
  944. data/spec/support/models/passport.rb +15 -1
  945. data/spec/support/models/patient.rb +1 -1
  946. data/spec/support/models/pdf_writer.rb +1 -1
  947. data/spec/support/models/pencil.rb +1 -1
  948. data/spec/support/models/person.rb +19 -1
  949. data/spec/support/models/pet.rb +1 -1
  950. data/spec/support/models/pet_owner.rb +1 -1
  951. data/spec/support/models/phone.rb +3 -2
  952. data/spec/support/models/piano.rb +1 -1
  953. data/spec/support/models/pizza.rb +1 -1
  954. data/spec/support/models/player.rb +3 -1
  955. data/spec/support/models/post.rb +1 -1
  956. data/spec/support/models/post_genre.rb +1 -1
  957. data/spec/support/models/powerup.rb +13 -1
  958. data/spec/support/models/preference.rb +1 -1
  959. data/spec/support/models/princess.rb +1 -1
  960. data/spec/support/models/product.rb +2 -1
  961. data/spec/support/models/profile.rb +1 -1
  962. data/spec/support/models/pronunciation.rb +1 -1
  963. data/spec/support/models/pub.rb +1 -1
  964. data/spec/support/models/publication/encyclopedia.rb +1 -1
  965. data/spec/support/models/publication/review.rb +1 -1
  966. data/spec/support/models/publication.rb +1 -1
  967. data/spec/support/models/purchase.rb +1 -1
  968. data/spec/support/models/purchased_item.rb +11 -0
  969. data/spec/support/models/purse.rb +9 -0
  970. data/spec/support/models/question.rb +1 -1
  971. data/spec/support/models/quiz.rb +1 -1
  972. data/spec/support/models/rating.rb +1 -1
  973. data/spec/support/models/record.rb +1 -1
  974. data/spec/support/models/registry.rb +2 -1
  975. data/spec/support/models/role.rb +1 -1
  976. data/spec/support/models/root_category.rb +1 -1
  977. data/spec/support/models/sandbox/app/models/app_models_message.rb +4 -0
  978. data/spec/support/models/sandbox/lib/models/lib_models_message.rb +4 -0
  979. data/spec/support/models/sandbox/sandbox_message.rb +4 -0
  980. data/spec/support/models/sandbox/sandbox_user.rb +4 -0
  981. data/spec/support/models/sandbox/subdir/sandbox_comment.rb +4 -0
  982. data/spec/support/models/sandwich.rb +1 -1
  983. data/spec/support/models/scheduler.rb +1 -1
  984. data/spec/support/models/school.rb +15 -0
  985. data/spec/support/models/scribe.rb +1 -1
  986. data/spec/support/models/sealer.rb +8 -0
  987. data/spec/support/models/seat.rb +1 -1
  988. data/spec/support/models/seo.rb +1 -1
  989. data/spec/support/models/series.rb +1 -1
  990. data/spec/support/models/server.rb +1 -1
  991. data/spec/support/models/service.rb +1 -1
  992. data/spec/support/models/shape.rb +1 -1
  993. data/spec/support/models/shelf.rb +1 -1
  994. data/spec/support/models/shield.rb +19 -0
  995. data/spec/support/models/shipment_address.rb +1 -1
  996. data/spec/support/models/shipping_container.rb +1 -1
  997. data/spec/support/models/shipping_pack.rb +1 -1
  998. data/spec/support/models/shirt.rb +12 -0
  999. data/spec/support/models/shop.rb +1 -1
  1000. data/spec/support/models/short_agent.rb +1 -1
  1001. data/spec/support/models/short_quiz.rb +1 -1
  1002. data/spec/support/models/simple.rb +1 -1
  1003. data/spec/support/models/slave.rb +1 -1
  1004. data/spec/support/models/song.rb +1 -1
  1005. data/spec/support/models/sound.rb +1 -1
  1006. data/spec/support/models/spacer.rb +8 -0
  1007. data/spec/support/models/square.rb +1 -1
  1008. data/spec/support/models/staff.rb +1 -1
  1009. data/spec/support/models/store_as_dup_test1.rb +1 -1
  1010. data/spec/support/models/store_as_dup_test2.rb +1 -1
  1011. data/spec/support/models/store_as_dup_test3.rb +1 -1
  1012. data/spec/support/models/store_as_dup_test4.rb +1 -1
  1013. data/spec/support/models/strategy.rb +1 -1
  1014. data/spec/support/models/student.rb +15 -0
  1015. data/spec/support/models/sub_item.rb +1 -1
  1016. data/spec/support/models/subscription.rb +1 -1
  1017. data/spec/support/models/survey.rb +1 -1
  1018. data/spec/support/models/symptom.rb +1 -1
  1019. data/spec/support/models/system_role.rb +1 -0
  1020. data/spec/support/models/tag.rb +1 -1
  1021. data/spec/support/models/target.rb +1 -1
  1022. data/spec/support/models/template.rb +1 -1
  1023. data/spec/support/models/thing.rb +1 -1
  1024. data/spec/support/models/threadlocker.rb +8 -0
  1025. data/spec/support/models/title.rb +1 -1
  1026. data/spec/support/models/tool.rb +1 -1
  1027. data/spec/support/models/topping.rb +1 -1
  1028. data/spec/support/models/toy.rb +1 -1
  1029. data/spec/support/models/track.rb +1 -1
  1030. data/spec/support/models/translation.rb +1 -1
  1031. data/spec/support/models/tree.rb +1 -1
  1032. data/spec/support/models/truck.rb +1 -1
  1033. data/spec/support/models/updatable.rb +1 -1
  1034. data/spec/support/models/user.rb +1 -1
  1035. data/spec/support/models/user_account.rb +1 -1
  1036. data/spec/support/models/validation_callback.rb +1 -1
  1037. data/spec/support/models/vehicle.rb +1 -1
  1038. data/spec/support/models/version.rb +1 -1
  1039. data/spec/support/models/vertex.rb +1 -1
  1040. data/spec/support/models/vet_visit.rb +1 -1
  1041. data/spec/support/models/video.rb +1 -1
  1042. data/spec/support/models/video_game.rb +1 -1
  1043. data/spec/support/models/washer.rb +8 -0
  1044. data/spec/support/models/weapon.rb +13 -1
  1045. data/spec/support/models/wiki_page.rb +1 -1
  1046. data/spec/support/models/word.rb +1 -1
  1047. data/spec/support/models/word_origin.rb +1 -1
  1048. data/spec/support/models/writer.rb +1 -1
  1049. data/spec/support/rails_mock.rb +32 -0
  1050. data/spec/support/schema_maps/schema_map_aws.json +17 -0
  1051. data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
  1052. data/spec/support/schema_maps/schema_map_azure.json +17 -0
  1053. data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
  1054. data/spec/support/schema_maps/schema_map_gcp.json +17 -0
  1055. data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
  1056. data/spec/support/schema_maps/schema_map_kmip.json +17 -0
  1057. data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
  1058. data/spec/support/schema_maps/schema_map_local.json +18 -0
  1059. data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
  1060. data/spec/support/shared/time.rb +3 -22
  1061. data/spec/support/sinatra_mock.rb +7 -0
  1062. data/spec/support/spec_config.rb +42 -7
  1063. data.tar.gz.sig +0 -0
  1064. metadata +883 -562
  1065. metadata.gz.sig +0 -0
  1066. data/lib/mongoid/association/referenced/eager.rb +0 -184
  1067. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +0 -128
  1068. data/lib/mongoid/contextual/geo_near.rb +0 -269
  1069. data/lib/mongoid/errors/eager_load.rb +0 -26
  1070. data/lib/mongoid/errors/invalid_session_use.rb +0 -26
  1071. data/lib/mongoid/errors/invalid_storage_parent.rb +0 -28
  1072. data/lib/mongoid/errors/invalid_value.rb +0 -18
  1073. data/lib/mongoid/query_cache.rb +0 -333
  1074. data/lib/support/ruby_version.rb +0 -29
  1075. data/spec/mongoid/contextual/geo_near_spec.rb +0 -472
  1076. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -61
  1077. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -61
  1078. data/spec/mongoid/extensions_spec.rb +0 -32
  1079. data/spec/mongoid/query_cache_middleware_spec.rb +0 -61
  1080. data/spec/mongoid/query_cache_spec.rb +0 -978
  1081. data/spec/support/cluster_config.rb +0 -158
  1082. data/spec/support/session_registry.rb +0 -50
@@ -1,11 +1,19 @@
1
1
  # frozen_string_literal: true
2
- # encoding: utf-8
2
+ # rubocop:todo all
3
3
 
4
4
  require "spec_helper"
5
5
  require_relative './interceptable_spec_models'
6
6
 
7
7
  describe Mongoid::Interceptable do
8
8
 
9
+ before do
10
+ # The find and initialize callbacks I added were causing failures
11
+ # because they were causing updates when we were asserting no updates
12
+ # happened.
13
+ Label.reset_callbacks(:initialize)
14
+ Label.reset_callbacks(:find)
15
+ end
16
+
9
17
  class TestClass
10
18
  include Mongoid::Interceptable
11
19
 
@@ -78,7 +86,7 @@ describe Mongoid::Interceptable do
78
86
  describe ".after_find" do
79
87
 
80
88
  let!(:player) do
81
- Player.create
89
+ Player.create!
82
90
  end
83
91
 
84
92
  context "when the callback is on a root document" do
@@ -131,7 +139,7 @@ describe Mongoid::Interceptable do
131
139
  context "when the callback is on an embedded document" do
132
140
 
133
141
  let!(:implant) do
134
- player.implants.create
142
+ player.implants.create!
135
143
  end
136
144
 
137
145
  context "when when the document is instantiated" do
@@ -201,7 +209,7 @@ describe Mongoid::Interceptable do
201
209
  ]
202
210
  })
203
211
  book.id = '123'
204
- book.save
212
+ book.save!
205
213
  book
206
214
  end
207
215
 
@@ -213,7 +221,7 @@ describe Mongoid::Interceptable do
213
221
  book.pages.each do | page |
214
222
  page.notes.destroy_all
215
223
  page.notes.new(message: new_message)
216
- page.save
224
+ page.save!
217
225
  end
218
226
  end
219
227
 
@@ -276,7 +284,7 @@ describe Mongoid::Interceptable do
276
284
 
277
285
  before do
278
286
  expect(artist).to receive(:before_create_stub).once.and_return(true)
279
- artist.save
287
+ artist.save!
280
288
  end
281
289
 
282
290
  it "gets saved" do
@@ -321,7 +329,7 @@ describe Mongoid::Interceptable do
321
329
  end
322
330
 
323
331
  it "the save returns true" do
324
- expect(artist.save).to be true
332
+ expect(artist.save!).to be true
325
333
  end
326
334
  end
327
335
 
@@ -345,7 +353,7 @@ describe Mongoid::Interceptable do
345
353
  context "when updating" do
346
354
 
347
355
  let(:artist) do
348
- Artist.create(name: "Depeche Mode").tap do |artist|
356
+ Artist.create!(name: "Depeche Mode").tap do |artist|
349
357
  artist.name = "The Mountain Goats"
350
358
  end
351
359
  end
@@ -361,7 +369,7 @@ describe Mongoid::Interceptable do
361
369
  end
362
370
 
363
371
  it "the save returns true" do
364
- expect(artist.save).to be true
372
+ expect(artist.save!).to be true
365
373
  end
366
374
  end
367
375
 
@@ -386,7 +394,7 @@ describe Mongoid::Interceptable do
386
394
  describe ".before_destroy" do
387
395
 
388
396
  let(:artist) do
389
- Artist.create(name: "Depeche Mode")
397
+ Artist.create!(name: "Depeche Mode")
390
398
  end
391
399
 
392
400
  before do
@@ -431,7 +439,7 @@ describe Mongoid::Interceptable do
431
439
  end
432
440
 
433
441
  let!(:record) do
434
- moderat.records.create(name: "Moderat")
442
+ moderat.records.create!(name: "Moderat")
435
443
  end
436
444
 
437
445
  before do
@@ -545,7 +553,7 @@ describe Mongoid::Interceptable do
545
553
 
546
554
  it "does not cascade to the child" do
547
555
  Band.accepts_nested_attributes_for :records, allow_destroy: true
548
- expect(band.update_attributes(attributes)).to be true
556
+ expect(band.update_attributes!(attributes)).to be true
549
557
  end
550
558
  end
551
559
  end
@@ -573,10 +581,24 @@ describe Mongoid::Interceptable do
573
581
  end
574
582
 
575
583
  context "when saving the root" do
584
+ context 'with prevent_multiple_calls_of_embedded_callbacks enabled' do
585
+ config_override :prevent_multiple_calls_of_embedded_callbacks, true
586
+ config_override :around_callbacks_for_embeds, true
587
+
588
+ it "executes the callbacks only once for each document" do
589
+ expect(note).to receive(:update_saved).once
590
+ band.save!
591
+ end
592
+ end
593
+
594
+ context 'with prevent_multiple_calls_of_embedded_callbacks disabled' do
595
+ config_override :prevent_multiple_calls_of_embedded_callbacks, false
596
+ config_override :around_callbacks_for_embeds, true
576
597
 
577
- it "only executes the callbacks once for each embed" do
578
- expect(note).to receive(:update_saved).twice
579
- band.save
598
+ it "executes the callbacks once for each ember" do
599
+ expect(note).to receive(:update_saved).twice
600
+ band.save!
601
+ end
580
602
  end
581
603
  end
582
604
  end
@@ -585,7 +607,7 @@ describe Mongoid::Interceptable do
585
607
  context "when cascading after initialize" do
586
608
 
587
609
  let!(:person) do
588
- Person.create
610
+ Person.create!
589
611
  end
590
612
 
591
613
  before do
@@ -624,7 +646,7 @@ describe Mongoid::Interceptable do
624
646
  end
625
647
 
626
648
  before do
627
- band.save
649
+ band.save!
628
650
  end
629
651
 
630
652
  it "executes the callback" do
@@ -635,7 +657,7 @@ describe Mongoid::Interceptable do
635
657
  context "when the parent is persisted" do
636
658
 
637
659
  let(:band) do
638
- Band.create(name: "Moderat")
660
+ Band.create!(name: "Moderat")
639
661
  end
640
662
 
641
663
  let!(:label) do
@@ -643,7 +665,7 @@ describe Mongoid::Interceptable do
643
665
  end
644
666
 
645
667
  before do
646
- band.save
668
+ band.save!
647
669
  end
648
670
 
649
671
  it "executes the callback" do
@@ -655,7 +677,7 @@ describe Mongoid::Interceptable do
655
677
  context "when the child is persisted" do
656
678
 
657
679
  let(:band) do
658
- Band.create(name: "Moderat")
680
+ Band.create!(name: "Moderat")
659
681
  end
660
682
 
661
683
  let!(:label) do
@@ -664,7 +686,7 @@ describe Mongoid::Interceptable do
664
686
 
665
687
  before do
666
688
  label.after_create_called = false
667
- band.save
689
+ band.save!
668
690
  end
669
691
 
670
692
  it "does not execute the callback" do
@@ -688,7 +710,7 @@ describe Mongoid::Interceptable do
688
710
  end
689
711
 
690
712
  before do
691
- band.save
713
+ band.save!
692
714
  end
693
715
 
694
716
  it "executes the callback" do
@@ -699,7 +721,7 @@ describe Mongoid::Interceptable do
699
721
  context "when the parent is persisted" do
700
722
 
701
723
  let(:band) do
702
- Band.create(name: "Moderat")
724
+ Band.create!(name: "Moderat")
703
725
  end
704
726
 
705
727
  let!(:label) do
@@ -707,7 +729,7 @@ describe Mongoid::Interceptable do
707
729
  end
708
730
 
709
731
  before do
710
- band.save
732
+ band.save!
711
733
  end
712
734
 
713
735
  it "executes the callback" do
@@ -719,7 +741,7 @@ describe Mongoid::Interceptable do
719
741
  context "when the child is persisted" do
720
742
 
721
743
  let(:band) do
722
- Band.create(name: "Moderat")
744
+ Band.create!(name: "Moderat")
723
745
  end
724
746
 
725
747
  let!(:label) do
@@ -727,7 +749,7 @@ describe Mongoid::Interceptable do
727
749
  end
728
750
 
729
751
  before do
730
- band.save
752
+ band.save!
731
753
  end
732
754
 
733
755
  it "executes the callback" do
@@ -751,7 +773,7 @@ describe Mongoid::Interceptable do
751
773
  end
752
774
 
753
775
  before do
754
- band.save
776
+ band.save!
755
777
  end
756
778
 
757
779
  it "does not execute the callback" do
@@ -762,7 +784,7 @@ describe Mongoid::Interceptable do
762
784
  context "when the parent is persisted" do
763
785
 
764
786
  let(:band) do
765
- Band.create(name: "Moderat")
787
+ Band.create!(name: "Moderat")
766
788
  end
767
789
 
768
790
  let!(:label) do
@@ -770,7 +792,7 @@ describe Mongoid::Interceptable do
770
792
  end
771
793
 
772
794
  before do
773
- band.save
795
+ band.save!
774
796
  end
775
797
 
776
798
  it "does not execute the callback" do
@@ -782,7 +804,7 @@ describe Mongoid::Interceptable do
782
804
  context "when the child is persisted" do
783
805
 
784
806
  let(:band) do
785
- Band.create(name: "Moderat")
807
+ Band.create!(name: "Moderat")
786
808
  end
787
809
 
788
810
  context "when the child is dirty" do
@@ -793,7 +815,7 @@ describe Mongoid::Interceptable do
793
815
 
794
816
  before do
795
817
  label.name = "Nothing"
796
- band.save
818
+ band.save!
797
819
  end
798
820
 
799
821
  it "executes the callback" do
@@ -808,7 +830,7 @@ describe Mongoid::Interceptable do
808
830
  end
809
831
 
810
832
  before do
811
- band.save
833
+ band.save!
812
834
  end
813
835
 
814
836
  it "does not execute the callback" do
@@ -833,7 +855,7 @@ describe Mongoid::Interceptable do
833
855
  end
834
856
 
835
857
  before do
836
- band.save
858
+ band.save!
837
859
  end
838
860
 
839
861
  it "executes the callback" do
@@ -844,7 +866,7 @@ describe Mongoid::Interceptable do
844
866
  context "when the parent is persisted" do
845
867
 
846
868
  let(:band) do
847
- Band.create(name: "Moderat")
869
+ Band.create!(name: "Moderat")
848
870
  end
849
871
 
850
872
  let!(:label) do
@@ -852,7 +874,7 @@ describe Mongoid::Interceptable do
852
874
  end
853
875
 
854
876
  before do
855
- band.save
877
+ band.save!
856
878
  end
857
879
 
858
880
  it "executes the callback" do
@@ -864,7 +886,7 @@ describe Mongoid::Interceptable do
864
886
  context "when the child is persisted" do
865
887
 
866
888
  let(:band) do
867
- Band.create(name: "Moderat")
889
+ Band.create!(name: "Moderat")
868
890
  end
869
891
 
870
892
  let!(:label) do
@@ -872,7 +894,7 @@ describe Mongoid::Interceptable do
872
894
  end
873
895
 
874
896
  before do
875
- band.save
897
+ band.save!
876
898
  end
877
899
 
878
900
  it "executes the callback" do
@@ -896,7 +918,7 @@ describe Mongoid::Interceptable do
896
918
  end
897
919
 
898
920
  before do
899
- band.save
921
+ band.save!
900
922
  end
901
923
 
902
924
  it "executes the callback" do
@@ -907,7 +929,7 @@ describe Mongoid::Interceptable do
907
929
  context "when the parent is persisted" do
908
930
 
909
931
  let(:band) do
910
- Band.create(name: "Moderat")
932
+ Band.create!(name: "Moderat")
911
933
  end
912
934
 
913
935
  let!(:record) do
@@ -915,7 +937,7 @@ describe Mongoid::Interceptable do
915
937
  end
916
938
 
917
939
  before do
918
- band.save
940
+ band.save!
919
941
  end
920
942
 
921
943
  it "executes the callback" do
@@ -927,16 +949,16 @@ describe Mongoid::Interceptable do
927
949
  context "when the child is persisted" do
928
950
 
929
951
  let(:band) do
930
- Band.create(name: "Moderat")
952
+ Band.create!(name: "Moderat")
931
953
  end
932
954
 
933
955
  let!(:record) do
934
- band.records.create(name: "Moderat")
956
+ band.records.create!(name: "Moderat")
935
957
  end
936
958
 
937
959
  before do
938
960
  record.before_create_called = false
939
- band.save
961
+ band.save!
940
962
  end
941
963
 
942
964
  it "does not execute the callback" do
@@ -960,7 +982,7 @@ describe Mongoid::Interceptable do
960
982
  end
961
983
 
962
984
  before do
963
- band.save
985
+ band.save!
964
986
  end
965
987
 
966
988
  it "executes the callback" do
@@ -975,7 +997,7 @@ describe Mongoid::Interceptable do
975
997
  context "when the parent is persisted" do
976
998
 
977
999
  let(:band) do
978
- Band.create(name: "Moderat")
1000
+ Band.create!(name: "Moderat")
979
1001
  end
980
1002
 
981
1003
  let!(:record) do
@@ -983,7 +1005,7 @@ describe Mongoid::Interceptable do
983
1005
  end
984
1006
 
985
1007
  before do
986
- band.save
1008
+ band.save!
987
1009
  end
988
1010
 
989
1011
  it "executes the callback" do
@@ -999,15 +1021,15 @@ describe Mongoid::Interceptable do
999
1021
  context "when the child is persisted" do
1000
1022
 
1001
1023
  let(:band) do
1002
- Band.create(name: "Moderat")
1024
+ Band.create!(name: "Moderat")
1003
1025
  end
1004
1026
 
1005
1027
  let!(:record) do
1006
- band.records.create(name: "Moderat")
1028
+ band.records.create!(name: "Moderat")
1007
1029
  end
1008
1030
 
1009
1031
  before do
1010
- band.save
1032
+ band.save!
1011
1033
  end
1012
1034
 
1013
1035
  it "executes the callback" do
@@ -1022,7 +1044,7 @@ describe Mongoid::Interceptable do
1022
1044
  context "when the child is created" do
1023
1045
 
1024
1046
  let!(:band) do
1025
- Band.create
1047
+ Band.create!
1026
1048
  end
1027
1049
 
1028
1050
  let!(:label) do
@@ -1050,7 +1072,7 @@ describe Mongoid::Interceptable do
1050
1072
  end
1051
1073
 
1052
1074
  before do
1053
- band.save
1075
+ band.save!
1054
1076
  end
1055
1077
 
1056
1078
  it "does not execute the callback" do
@@ -1061,7 +1083,7 @@ describe Mongoid::Interceptable do
1061
1083
  context "when the parent is persisted" do
1062
1084
 
1063
1085
  let(:band) do
1064
- Band.create(name: "Moderat")
1086
+ Band.create!(name: "Moderat")
1065
1087
  end
1066
1088
 
1067
1089
  let!(:record) do
@@ -1069,7 +1091,7 @@ describe Mongoid::Interceptable do
1069
1091
  end
1070
1092
 
1071
1093
  before do
1072
- band.save
1094
+ band.save!
1073
1095
  end
1074
1096
 
1075
1097
  it "does not execute the callback" do
@@ -1081,18 +1103,18 @@ describe Mongoid::Interceptable do
1081
1103
  context "when the child is persisted" do
1082
1104
 
1083
1105
  let(:band) do
1084
- Band.create(name: "Moderat")
1106
+ Band.create!(name: "Moderat")
1085
1107
  end
1086
1108
 
1087
1109
  let!(:record) do
1088
- band.records.create(name: "Moderat")
1110
+ band.records.create!(name: "Moderat")
1089
1111
  end
1090
1112
 
1091
1113
  context "when the child is dirty" do
1092
1114
 
1093
1115
  before do
1094
1116
  record.name = "Nothing"
1095
- band.save
1117
+ band.save!
1096
1118
  end
1097
1119
 
1098
1120
  it "executes the callback" do
@@ -1107,7 +1129,7 @@ describe Mongoid::Interceptable do
1107
1129
  context "when the child is not dirty" do
1108
1130
 
1109
1131
  before do
1110
- band.save
1132
+ band.save!
1111
1133
  end
1112
1134
 
1113
1135
  it "does not execute the callback" do
@@ -1132,7 +1154,7 @@ describe Mongoid::Interceptable do
1132
1154
  end
1133
1155
 
1134
1156
  before do
1135
- band.save
1157
+ band.save!
1136
1158
  end
1137
1159
 
1138
1160
  it "executes the callback" do
@@ -1147,7 +1169,7 @@ describe Mongoid::Interceptable do
1147
1169
  context "when the parent is persisted" do
1148
1170
 
1149
1171
  let(:band) do
1150
- Band.create(name: "Moderat")
1172
+ Band.create!(name: "Moderat")
1151
1173
  end
1152
1174
 
1153
1175
  let!(:record) do
@@ -1155,7 +1177,7 @@ describe Mongoid::Interceptable do
1155
1177
  end
1156
1178
 
1157
1179
  before do
1158
- band.save
1180
+ band.save!
1159
1181
  end
1160
1182
 
1161
1183
  it "executes the callback" do
@@ -1170,7 +1192,7 @@ describe Mongoid::Interceptable do
1170
1192
  context 'when the parent is updated' do
1171
1193
 
1172
1194
  let(:band) do
1173
- Band.create(name: "Moderat")
1195
+ Band.create!(name: "Moderat")
1174
1196
  end
1175
1197
 
1176
1198
  before do
@@ -1190,7 +1212,7 @@ describe Mongoid::Interceptable do
1190
1212
  context 'when the parent is updated' do
1191
1213
 
1192
1214
  let(:band) do
1193
- Band.create(name: "Moderat")
1215
+ Band.create!(name: "Moderat")
1194
1216
  end
1195
1217
 
1196
1218
  before do
@@ -1209,15 +1231,15 @@ describe Mongoid::Interceptable do
1209
1231
  context "when the child is persisted" do
1210
1232
 
1211
1233
  let(:band) do
1212
- Band.create(name: "Moderat")
1234
+ Band.create!(name: "Moderat")
1213
1235
  end
1214
1236
 
1215
1237
  let!(:record) do
1216
- band.records.create(name: "Moderat")
1238
+ band.records.create!(name: "Moderat")
1217
1239
  end
1218
1240
 
1219
1241
  before do
1220
- band.save
1242
+ band.save!
1221
1243
  end
1222
1244
 
1223
1245
  it "executes the callback" do
@@ -1252,7 +1274,7 @@ describe Mongoid::Interceptable do
1252
1274
  end
1253
1275
 
1254
1276
  before do
1255
- band.save
1277
+ band.save!
1256
1278
  end
1257
1279
 
1258
1280
  it "executes the callback" do
@@ -1263,7 +1285,7 @@ describe Mongoid::Interceptable do
1263
1285
  context "when the root is persisted" do
1264
1286
 
1265
1287
  let(:band) do
1266
- Band.create(name: "Moderat")
1288
+ Band.create!(name: "Moderat")
1267
1289
  end
1268
1290
 
1269
1291
  let!(:record) do
@@ -1275,7 +1297,7 @@ describe Mongoid::Interceptable do
1275
1297
  end
1276
1298
 
1277
1299
  before do
1278
- band.save
1300
+ band.save!
1279
1301
  end
1280
1302
 
1281
1303
  it "executes the callback" do
@@ -1287,20 +1309,20 @@ describe Mongoid::Interceptable do
1287
1309
  context "when the child is persisted" do
1288
1310
 
1289
1311
  let(:band) do
1290
- Band.create(name: "Moderat")
1312
+ Band.create!(name: "Moderat")
1291
1313
  end
1292
1314
 
1293
1315
  let!(:record) do
1294
- band.records.create(name: "Moderat")
1316
+ band.records.create!(name: "Moderat")
1295
1317
  end
1296
1318
 
1297
1319
  let!(:track) do
1298
- record.tracks.create(name: "Berlin")
1320
+ record.tracks.create!(name: "Berlin")
1299
1321
  end
1300
1322
 
1301
1323
  before do
1302
1324
  track.before_create_called = false
1303
- band.save
1325
+ band.save!
1304
1326
  end
1305
1327
 
1306
1328
  it "does not execute the callback" do
@@ -1328,7 +1350,7 @@ describe Mongoid::Interceptable do
1328
1350
  end
1329
1351
 
1330
1352
  before do
1331
- band.save
1353
+ band.save!
1332
1354
  end
1333
1355
 
1334
1356
  let(:reloaded) do
@@ -1347,7 +1369,7 @@ describe Mongoid::Interceptable do
1347
1369
  context "when the parent is persisted" do
1348
1370
 
1349
1371
  let(:band) do
1350
- Band.create(name: "Moderat")
1372
+ Band.create!(name: "Moderat")
1351
1373
  end
1352
1374
 
1353
1375
  let!(:record) do
@@ -1359,7 +1381,7 @@ describe Mongoid::Interceptable do
1359
1381
  end
1360
1382
 
1361
1383
  before do
1362
- band.save
1384
+ band.save!
1363
1385
  end
1364
1386
 
1365
1387
  let(:reloaded) do
@@ -1379,19 +1401,19 @@ describe Mongoid::Interceptable do
1379
1401
  context "when the child is persisted" do
1380
1402
 
1381
1403
  let(:band) do
1382
- Band.create(name: "Moderat")
1404
+ Band.create!(name: "Moderat")
1383
1405
  end
1384
1406
 
1385
1407
  let!(:record) do
1386
- band.records.create(name: "Moderat")
1408
+ band.records.create!(name: "Moderat")
1387
1409
  end
1388
1410
 
1389
1411
  let!(:track) do
1390
- record.tracks.create(name: "Berlin")
1412
+ record.tracks.create!(name: "Berlin")
1391
1413
  end
1392
1414
 
1393
1415
  before do
1394
- band.save
1416
+ band.save!
1395
1417
  end
1396
1418
 
1397
1419
  let(:reloaded) do
@@ -1427,7 +1449,7 @@ describe Mongoid::Interceptable do
1427
1449
  end
1428
1450
 
1429
1451
  before do
1430
- band.save
1452
+ band.save!
1431
1453
  end
1432
1454
 
1433
1455
  it "does not execute the callback" do
@@ -1438,7 +1460,7 @@ describe Mongoid::Interceptable do
1438
1460
  context "when the parent is persisted" do
1439
1461
 
1440
1462
  let(:band) do
1441
- Band.create(name: "Moderat")
1463
+ Band.create!(name: "Moderat")
1442
1464
  end
1443
1465
 
1444
1466
  let!(:record) do
@@ -1450,7 +1472,7 @@ describe Mongoid::Interceptable do
1450
1472
  end
1451
1473
 
1452
1474
  before do
1453
- band.save
1475
+ band.save!
1454
1476
  end
1455
1477
 
1456
1478
  it "does not execute the callback" do
@@ -1462,22 +1484,22 @@ describe Mongoid::Interceptable do
1462
1484
  context "when the child is persisted" do
1463
1485
 
1464
1486
  let(:band) do
1465
- Band.create(name: "Moderat")
1487
+ Band.create!(name: "Moderat")
1466
1488
  end
1467
1489
 
1468
1490
  let!(:record) do
1469
- band.records.create(name: "Moderat")
1491
+ band.records.create!(name: "Moderat")
1470
1492
  end
1471
1493
 
1472
1494
  let!(:track) do
1473
- record.tracks.create(name: "Berlin")
1495
+ record.tracks.create!(name: "Berlin")
1474
1496
  end
1475
1497
 
1476
1498
  context "when the child is dirty" do
1477
1499
 
1478
1500
  before do
1479
1501
  track.name = "Rusty Nails"
1480
- band.save
1502
+ band.save!
1481
1503
  end
1482
1504
 
1483
1505
  let(:reloaded) do
@@ -1496,7 +1518,7 @@ describe Mongoid::Interceptable do
1496
1518
  context "when the child is not dirty" do
1497
1519
 
1498
1520
  before do
1499
- band.save
1521
+ band.save!
1500
1522
  end
1501
1523
 
1502
1524
  it "does not execute the callback" do
@@ -1544,7 +1566,7 @@ describe Mongoid::Interceptable do
1544
1566
  end
1545
1567
 
1546
1568
  before do
1547
- band.save
1569
+ band.save!
1548
1570
  end
1549
1571
 
1550
1572
  it "executes the callback" do
@@ -1555,7 +1577,7 @@ describe Mongoid::Interceptable do
1555
1577
  context "when the parent is persisted" do
1556
1578
 
1557
1579
  let(:band) do
1558
- Band.create(name: "Moderat")
1580
+ Band.create!(name: "Moderat")
1559
1581
  end
1560
1582
 
1561
1583
  let!(:record) do
@@ -1567,7 +1589,7 @@ describe Mongoid::Interceptable do
1567
1589
  end
1568
1590
 
1569
1591
  before do
1570
- band.save
1592
+ band.save!
1571
1593
  end
1572
1594
 
1573
1595
  it "executes the callback" do
@@ -1579,19 +1601,19 @@ describe Mongoid::Interceptable do
1579
1601
  context "when the child is persisted" do
1580
1602
 
1581
1603
  let(:band) do
1582
- Band.create(name: "Moderat")
1604
+ Band.create!(name: "Moderat")
1583
1605
  end
1584
1606
 
1585
1607
  let!(:record) do
1586
- band.records.create(name: "Moderat")
1608
+ band.records.create!(name: "Moderat")
1587
1609
  end
1588
1610
 
1589
1611
  let!(:track) do
1590
- record.tracks.create(name: "Berlin")
1612
+ record.tracks.create!(name: "Berlin")
1591
1613
  end
1592
1614
 
1593
1615
  before do
1594
- band.save
1616
+ band.save!
1595
1617
  end
1596
1618
 
1597
1619
  it "executes the callback" do
@@ -1618,11 +1640,11 @@ describe Mongoid::Interceptable do
1618
1640
  end
1619
1641
 
1620
1642
  before do
1621
- parent.save
1643
+ parent.save!
1622
1644
  end
1623
1645
 
1624
1646
  it "does not duplicate the child documents" do
1625
- parent.children.create(position: 1)
1647
+ parent.children.create!(position: 1)
1626
1648
  expect(ParentDoc.find(parent.id).children.size).to eq(1)
1627
1649
  end
1628
1650
  end
@@ -1673,7 +1695,7 @@ describe Mongoid::Interceptable do
1673
1695
  context "when updating a document" do
1674
1696
 
1675
1697
  let(:person) do
1676
- Person.create.tap do |person|
1698
+ Person.create!.tap do |person|
1677
1699
  person.attributes = {
1678
1700
  mode: :prevent_save,
1679
1701
  title: "Associate",
@@ -1739,8 +1761,12 @@ describe Mongoid::Interceptable do
1739
1761
  [InterceptableSpec::CbChild, :after_validation],
1740
1762
  [InterceptableSpec::CbParent, :after_validation],
1741
1763
  [InterceptableSpec::CbParent, :before_save],
1764
+ [InterceptableSpec::CbParent, :around_save_open],
1742
1765
  [InterceptableSpec::CbParent, :before_create],
1766
+ [InterceptableSpec::CbParent, :around_create_open],
1767
+ [InterceptableSpec::CbParent, :around_create_close],
1743
1768
  [InterceptableSpec::CbParent, :after_create],
1769
+ [InterceptableSpec::CbParent, :around_save_close],
1744
1770
  [InterceptableSpec::CbParent, :after_save],
1745
1771
  ]
1746
1772
  end
@@ -1760,28 +1786,812 @@ describe Mongoid::Interceptable do
1760
1786
  end
1761
1787
  end
1762
1788
 
1763
- let(:expected) do
1764
- [
1765
- [InterceptableSpec::CbParent, :before_validation],
1766
- [InterceptableSpec::CbCascadedChild, :before_validation],
1767
- [InterceptableSpec::CbCascadedChild, :after_validation],
1768
- [InterceptableSpec::CbParent, :after_validation],
1769
- [InterceptableSpec::CbParent, :before_save],
1770
- [InterceptableSpec::CbCascadedChild, :before_save],
1771
- [InterceptableSpec::CbParent, :before_create],
1772
- [InterceptableSpec::CbCascadedChild, :before_create],
1773
- [InterceptableSpec::CbParent, :after_create],
1774
- [InterceptableSpec::CbCascadedChild, :after_create],
1775
- [InterceptableSpec::CbParent, :after_save],
1776
- [InterceptableSpec::CbCascadedChild, :after_save],
1777
- ]
1789
+ context 'with around callbacks' do
1790
+ config_override :around_callbacks_for_embeds, true
1791
+
1792
+ let(:expected) do
1793
+ [
1794
+ [InterceptableSpec::CbCascadedChild, :before_validation],
1795
+ [InterceptableSpec::CbCascadedChild, :after_validation],
1796
+ [InterceptableSpec::CbParent, :before_validation],
1797
+ [InterceptableSpec::CbCascadedChild, :before_validation],
1798
+ [InterceptableSpec::CbCascadedChild, :after_validation],
1799
+
1800
+ [InterceptableSpec::CbParent, :after_validation],
1801
+ [InterceptableSpec::CbParent, :before_save],
1802
+ [InterceptableSpec::CbParent, :around_save_open],
1803
+ [InterceptableSpec::CbParent, :before_create],
1804
+ [InterceptableSpec::CbParent, :around_create_open],
1805
+
1806
+ [InterceptableSpec::CbCascadedChild, :before_save],
1807
+ [InterceptableSpec::CbCascadedChild, :around_save_open],
1808
+ [InterceptableSpec::CbCascadedChild, :before_create],
1809
+ [InterceptableSpec::CbCascadedChild, :around_create_open],
1810
+
1811
+ [InterceptableSpec::CbCascadedChild, :around_create_close],
1812
+ [InterceptableSpec::CbCascadedChild, :after_create],
1813
+ [InterceptableSpec::CbCascadedChild, :around_save_close],
1814
+ [InterceptableSpec::CbCascadedChild, :after_save],
1815
+
1816
+ [InterceptableSpec::CbParent, :around_create_close],
1817
+ [InterceptableSpec::CbParent, :after_create],
1818
+ [InterceptableSpec::CbParent, :around_save_close],
1819
+ [InterceptableSpec::CbParent, :after_save]
1820
+ ]
1821
+ end
1822
+
1823
+ it 'calls callbacks in the right order' do
1824
+ parent.save!
1825
+ expect(registry.calls).to eq expected
1826
+ end
1778
1827
  end
1779
1828
 
1780
- it 'calls callbacks in the right order' do
1781
- pending 'MONGOID-3795'
1829
+ context 'without around callbacks' do
1830
+ config_override :around_callbacks_for_embeds, false
1782
1831
 
1783
- parent.save!
1784
- expect(registry.calls).to eq expected
1832
+ let(:expected) do
1833
+ [
1834
+ [InterceptableSpec::CbCascadedChild, :before_validation],
1835
+ [InterceptableSpec::CbCascadedChild, :after_validation],
1836
+ [InterceptableSpec::CbParent, :before_validation],
1837
+ [InterceptableSpec::CbCascadedChild, :before_validation],
1838
+ [InterceptableSpec::CbCascadedChild, :after_validation],
1839
+
1840
+ [InterceptableSpec::CbParent, :after_validation],
1841
+ [InterceptableSpec::CbParent, :before_save],
1842
+ [InterceptableSpec::CbParent, :around_save_open],
1843
+ [InterceptableSpec::CbParent, :before_create],
1844
+ [InterceptableSpec::CbParent, :around_create_open],
1845
+
1846
+ [InterceptableSpec::CbCascadedChild, :before_save],
1847
+ [InterceptableSpec::CbCascadedChild, :before_create],
1848
+
1849
+ [InterceptableSpec::CbCascadedChild, :after_create],
1850
+ [InterceptableSpec::CbCascadedChild, :after_save],
1851
+
1852
+ [InterceptableSpec::CbParent, :around_create_close],
1853
+ [InterceptableSpec::CbParent, :after_create],
1854
+ [InterceptableSpec::CbParent, :around_save_close],
1855
+ [InterceptableSpec::CbParent, :after_save]
1856
+ ]
1857
+ end
1858
+
1859
+ it 'calls callbacks in the right order' do
1860
+ parent.save!
1861
+ expect(registry.calls).to eq expected
1862
+ end
1863
+ end
1864
+ end
1865
+
1866
+ context "with associations" do
1867
+ context "has_one" do
1868
+ let(:registry) { InterceptableSpec::CallbackRegistry.new }
1869
+
1870
+ let(:parent) do
1871
+ InterceptableSpec::CbHasOneParent.new(registry).tap do |parent|
1872
+ parent.child = InterceptableSpec::CbHasOneChild.new(registry)
1873
+ end
1874
+ end
1875
+
1876
+ let(:expected) do
1877
+ [
1878
+ [InterceptableSpec::CbHasOneParent, :before_validation],
1879
+ [InterceptableSpec::CbHasOneChild, :before_validation],
1880
+ [InterceptableSpec::CbHasOneChild, :after_validation],
1881
+ [InterceptableSpec::CbHasOneParent, :after_validation],
1882
+ [InterceptableSpec::CbHasOneParent, :before_save],
1883
+
1884
+ [InterceptableSpec::CbHasOneParent, :around_save_open],
1885
+ [InterceptableSpec::CbHasOneParent, :before_create],
1886
+ [InterceptableSpec::CbHasOneParent, :around_create_open],
1887
+
1888
+ [InterceptableSpec::CbHasOneParent, :insert_into_database],
1889
+
1890
+ [InterceptableSpec::CbHasOneChild, :before_validation],
1891
+ [InterceptableSpec::CbHasOneChild, :after_validation],
1892
+ [InterceptableSpec::CbHasOneChild, :before_save],
1893
+ [InterceptableSpec::CbHasOneChild, :around_save_open],
1894
+ [InterceptableSpec::CbHasOneChild, :before_create],
1895
+ [InterceptableSpec::CbHasOneChild, :around_create_open],
1896
+
1897
+ [InterceptableSpec::CbHasOneChild, :around_create_close],
1898
+ [InterceptableSpec::CbHasOneChild, :after_create],
1899
+ [InterceptableSpec::CbHasOneChild, :around_save_close],
1900
+ [InterceptableSpec::CbHasOneChild, :after_save],
1901
+
1902
+ [InterceptableSpec::CbHasOneParent, :around_create_close],
1903
+ [InterceptableSpec::CbHasOneParent, :after_create],
1904
+ [InterceptableSpec::CbHasOneParent, :around_save_close],
1905
+ [InterceptableSpec::CbHasOneParent, :after_save],
1906
+ ]
1907
+ end
1908
+
1909
+ it 'calls callbacks in the right order' do
1910
+ parent.save!
1911
+ expect(registry.calls).to eq expected
1912
+ end
1913
+ end
1914
+
1915
+ context "embeds_one" do
1916
+ let(:registry) { InterceptableSpec::CallbackRegistry.new }
1917
+
1918
+ let(:parent) do
1919
+ InterceptableSpec::CbEmbedsOneParent.new(registry).tap do |parent|
1920
+ parent.child = InterceptableSpec::CbEmbedsOneChild.new(registry)
1921
+ end
1922
+ end
1923
+
1924
+ context "create" do
1925
+ context "with around callbacks" do
1926
+ config_override :around_callbacks_for_embeds, true
1927
+
1928
+ let(:expected) do
1929
+ [
1930
+ [InterceptableSpec::CbEmbedsOneChild, :before_validation],
1931
+ [InterceptableSpec::CbEmbedsOneChild, :after_validation],
1932
+ [InterceptableSpec::CbEmbedsOneParent, :before_validation],
1933
+ [InterceptableSpec::CbEmbedsOneChild, :before_validation],
1934
+ [InterceptableSpec::CbEmbedsOneChild, :after_validation],
1935
+ [InterceptableSpec::CbEmbedsOneParent, :after_validation],
1936
+
1937
+ [InterceptableSpec::CbEmbedsOneParent, :before_save],
1938
+ [InterceptableSpec::CbEmbedsOneParent, :around_save_open],
1939
+ [InterceptableSpec::CbEmbedsOneParent, :before_create],
1940
+ [InterceptableSpec::CbEmbedsOneParent, :around_create_open],
1941
+
1942
+ [InterceptableSpec::CbEmbedsOneChild, :before_save],
1943
+ [InterceptableSpec::CbEmbedsOneChild, :around_save_open],
1944
+ [InterceptableSpec::CbEmbedsOneChild, :before_create],
1945
+ [InterceptableSpec::CbEmbedsOneChild, :around_create_open],
1946
+
1947
+ [InterceptableSpec::CbEmbedsOneParent, :insert_into_database],
1948
+
1949
+ [InterceptableSpec::CbEmbedsOneChild, :around_create_close],
1950
+ [InterceptableSpec::CbEmbedsOneChild, :after_create],
1951
+ [InterceptableSpec::CbEmbedsOneChild, :around_save_close],
1952
+ [InterceptableSpec::CbEmbedsOneChild, :after_save],
1953
+
1954
+ [InterceptableSpec::CbEmbedsOneParent, :around_create_close],
1955
+ [InterceptableSpec::CbEmbedsOneParent, :after_create],
1956
+ [InterceptableSpec::CbEmbedsOneParent, :around_save_close],
1957
+ [InterceptableSpec::CbEmbedsOneParent, :after_save]
1958
+ ]
1959
+ end
1960
+
1961
+ it 'calls callbacks in the right order' do
1962
+ parent.save!
1963
+ expect(registry.calls).to eq expected
1964
+ end
1965
+ end
1966
+
1967
+ context "without around callbacks" do
1968
+ config_override :around_callbacks_for_embeds, false
1969
+
1970
+ let(:expected) do
1971
+ [
1972
+ [InterceptableSpec::CbEmbedsOneChild, :before_validation],
1973
+ [InterceptableSpec::CbEmbedsOneChild, :after_validation],
1974
+ [InterceptableSpec::CbEmbedsOneParent, :before_validation],
1975
+ [InterceptableSpec::CbEmbedsOneChild, :before_validation],
1976
+ [InterceptableSpec::CbEmbedsOneChild, :after_validation],
1977
+ [InterceptableSpec::CbEmbedsOneParent, :after_validation],
1978
+
1979
+ [InterceptableSpec::CbEmbedsOneParent, :before_save],
1980
+ [InterceptableSpec::CbEmbedsOneParent, :around_save_open],
1981
+ [InterceptableSpec::CbEmbedsOneParent, :before_create],
1982
+ [InterceptableSpec::CbEmbedsOneParent, :around_create_open],
1983
+
1984
+ [InterceptableSpec::CbEmbedsOneChild, :before_save],
1985
+ [InterceptableSpec::CbEmbedsOneChild, :before_create],
1986
+
1987
+ [InterceptableSpec::CbEmbedsOneParent, :insert_into_database],
1988
+
1989
+ [InterceptableSpec::CbEmbedsOneChild, :after_create],
1990
+ [InterceptableSpec::CbEmbedsOneChild, :after_save],
1991
+
1992
+ [InterceptableSpec::CbEmbedsOneParent, :around_create_close],
1993
+ [InterceptableSpec::CbEmbedsOneParent, :after_create],
1994
+ [InterceptableSpec::CbEmbedsOneParent, :around_save_close],
1995
+ [InterceptableSpec::CbEmbedsOneParent, :after_save]
1996
+ ]
1997
+ end
1998
+
1999
+ it 'calls callbacks in the right order' do
2000
+ parent.save!
2001
+ expect(registry.calls).to eq expected
2002
+ end
2003
+ end
2004
+ end
2005
+
2006
+ context "update" do
2007
+ context "with around callbacks" do
2008
+ config_override :around_callbacks_for_embeds, true
2009
+
2010
+ let(:expected) do
2011
+ [
2012
+ [InterceptableSpec::CbEmbedsOneChild, :before_validation],
2013
+ [InterceptableSpec::CbEmbedsOneChild, :after_validation],
2014
+ [InterceptableSpec::CbEmbedsOneParent, :before_validation],
2015
+ [InterceptableSpec::CbEmbedsOneChild, :before_validation],
2016
+ [InterceptableSpec::CbEmbedsOneChild, :after_validation],
2017
+ [InterceptableSpec::CbEmbedsOneParent, :after_validation],
2018
+
2019
+ [InterceptableSpec::CbEmbedsOneParent, :before_save],
2020
+ [InterceptableSpec::CbEmbedsOneParent, :around_save_open],
2021
+ [InterceptableSpec::CbEmbedsOneParent, :before_update],
2022
+ [InterceptableSpec::CbEmbedsOneParent, :around_update_open],
2023
+
2024
+ [InterceptableSpec::CbEmbedsOneChild, :before_save],
2025
+ [InterceptableSpec::CbEmbedsOneChild, :around_save_open],
2026
+ [InterceptableSpec::CbEmbedsOneChild, :before_update],
2027
+ [InterceptableSpec::CbEmbedsOneChild, :around_update_open],
2028
+
2029
+ [InterceptableSpec::CbEmbedsOneChild, :around_update_close],
2030
+ [InterceptableSpec::CbEmbedsOneChild, :after_update],
2031
+ [InterceptableSpec::CbEmbedsOneChild, :around_save_close],
2032
+ [InterceptableSpec::CbEmbedsOneChild, :after_save],
2033
+
2034
+ [InterceptableSpec::CbEmbedsOneParent, :around_update_close],
2035
+ [InterceptableSpec::CbEmbedsOneParent, :after_update],
2036
+ [InterceptableSpec::CbEmbedsOneParent, :around_save_close],
2037
+ [InterceptableSpec::CbEmbedsOneParent, :after_save]
2038
+ ]
2039
+ end
2040
+
2041
+ it 'calls callbacks in the right order' do
2042
+ parent.callback_registry = nil
2043
+ parent.child.callback_registry = nil
2044
+ parent.save!
2045
+
2046
+ parent.callback_registry = registry
2047
+ parent.child.callback_registry = registry
2048
+ parent.name = "name"
2049
+ parent.child.age = 10
2050
+
2051
+ parent.save!
2052
+ expect(registry.calls).to eq expected
2053
+ end
2054
+ end
2055
+
2056
+ context "without around callbacks" do
2057
+ config_override :around_callbacks_for_embeds, false
2058
+
2059
+ let(:expected) do
2060
+ [
2061
+ [InterceptableSpec::CbEmbedsOneChild, :before_validation],
2062
+ [InterceptableSpec::CbEmbedsOneChild, :after_validation],
2063
+ [InterceptableSpec::CbEmbedsOneParent, :before_validation],
2064
+ [InterceptableSpec::CbEmbedsOneChild, :before_validation],
2065
+ [InterceptableSpec::CbEmbedsOneChild, :after_validation],
2066
+ [InterceptableSpec::CbEmbedsOneParent, :after_validation],
2067
+
2068
+ [InterceptableSpec::CbEmbedsOneParent, :before_save],
2069
+ [InterceptableSpec::CbEmbedsOneParent, :around_save_open],
2070
+ [InterceptableSpec::CbEmbedsOneParent, :before_update],
2071
+ [InterceptableSpec::CbEmbedsOneParent, :around_update_open],
2072
+
2073
+ [InterceptableSpec::CbEmbedsOneChild, :before_save],
2074
+ [InterceptableSpec::CbEmbedsOneChild, :before_update],
2075
+
2076
+ [InterceptableSpec::CbEmbedsOneChild, :after_update],
2077
+ [InterceptableSpec::CbEmbedsOneChild, :after_save],
2078
+
2079
+ [InterceptableSpec::CbEmbedsOneParent, :around_update_close],
2080
+ [InterceptableSpec::CbEmbedsOneParent, :after_update],
2081
+ [InterceptableSpec::CbEmbedsOneParent, :around_save_close],
2082
+ [InterceptableSpec::CbEmbedsOneParent, :after_save]
2083
+ ]
2084
+ end
2085
+
2086
+ it 'calls callbacks in the right order' do
2087
+ parent.callback_registry = nil
2088
+ parent.child.callback_registry = nil
2089
+ parent.save!
2090
+
2091
+ parent.callback_registry = registry
2092
+ parent.child.callback_registry = registry
2093
+ parent.name = "name"
2094
+ parent.child.age = 10
2095
+
2096
+ parent.save!
2097
+ expect(registry.calls).to eq expected
2098
+ end
2099
+ end
2100
+ end
2101
+ end
2102
+
2103
+ context "has_many" do
2104
+ let(:registry) { InterceptableSpec::CallbackRegistry.new }
2105
+
2106
+ let(:parent) do
2107
+ InterceptableSpec::CbHasManyParent.new(registry).tap do |parent|
2108
+ parent.children = [
2109
+ InterceptableSpec::CbHasManyChild.new(registry),
2110
+ InterceptableSpec::CbHasManyChild.new(registry)
2111
+ ]
2112
+ end
2113
+ end
2114
+
2115
+ let(:expected) do
2116
+ [
2117
+ [InterceptableSpec::CbHasManyParent, :before_validation],
2118
+ [InterceptableSpec::CbHasManyChild, :before_validation],
2119
+ [InterceptableSpec::CbHasManyChild, :after_validation],
2120
+ [InterceptableSpec::CbHasManyChild, :before_validation],
2121
+ [InterceptableSpec::CbHasManyChild, :after_validation],
2122
+ [InterceptableSpec::CbHasManyParent, :after_validation],
2123
+
2124
+ [InterceptableSpec::CbHasManyParent, :before_save],
2125
+ [InterceptableSpec::CbHasManyParent, :around_save_open],
2126
+ [InterceptableSpec::CbHasManyParent, :before_create],
2127
+ [InterceptableSpec::CbHasManyParent, :around_create_open],
2128
+
2129
+ [InterceptableSpec::CbHasManyParent, :insert_into_database],
2130
+
2131
+ [InterceptableSpec::CbHasManyChild, :before_validation],
2132
+ [InterceptableSpec::CbHasManyChild, :after_validation],
2133
+ [InterceptableSpec::CbHasManyChild, :before_save],
2134
+ [InterceptableSpec::CbHasManyChild, :around_save_open],
2135
+ [InterceptableSpec::CbHasManyChild, :before_create],
2136
+ [InterceptableSpec::CbHasManyChild, :around_create_open],
2137
+ [InterceptableSpec::CbHasManyChild, :around_create_close],
2138
+ [InterceptableSpec::CbHasManyChild, :after_create],
2139
+ [InterceptableSpec::CbHasManyChild, :around_save_close],
2140
+ [InterceptableSpec::CbHasManyChild, :after_save],
2141
+
2142
+ [InterceptableSpec::CbHasManyChild, :before_validation],
2143
+ [InterceptableSpec::CbHasManyChild, :after_validation],
2144
+ [InterceptableSpec::CbHasManyChild, :before_save],
2145
+ [InterceptableSpec::CbHasManyChild, :around_save_open],
2146
+ [InterceptableSpec::CbHasManyChild, :before_create],
2147
+ [InterceptableSpec::CbHasManyChild, :around_create_open],
2148
+ [InterceptableSpec::CbHasManyChild, :around_create_close],
2149
+ [InterceptableSpec::CbHasManyChild, :after_create],
2150
+ [InterceptableSpec::CbHasManyChild, :around_save_close],
2151
+ [InterceptableSpec::CbHasManyChild, :after_save],
2152
+
2153
+ [InterceptableSpec::CbHasManyParent, :around_create_close],
2154
+ [InterceptableSpec::CbHasManyParent, :after_create],
2155
+ [InterceptableSpec::CbHasManyParent, :around_save_close],
2156
+ [InterceptableSpec::CbHasManyParent, :after_save]
2157
+ ]
2158
+ end
2159
+
2160
+ it 'calls callbacks in the right order' do
2161
+ parent.save!
2162
+ expect(registry.calls).to eq expected
2163
+ end
2164
+ end
2165
+
2166
+ context "embeds_many" do
2167
+ let(:registry) { InterceptableSpec::CallbackRegistry.new }
2168
+
2169
+ let(:parent) do
2170
+ InterceptableSpec::CbEmbedsManyParent.new(registry).tap do |parent|
2171
+ parent.children = [
2172
+ InterceptableSpec::CbEmbedsManyChild.new(registry),
2173
+ InterceptableSpec::CbEmbedsManyChild.new(registry),
2174
+ ]
2175
+ end
2176
+ end
2177
+
2178
+ context "with around callbacks" do
2179
+ config_override :around_callbacks_for_embeds, true
2180
+
2181
+ let(:expected) do
2182
+ [
2183
+ [InterceptableSpec::CbEmbedsManyChild, :before_validation],
2184
+ [InterceptableSpec::CbEmbedsManyChild, :after_validation],
2185
+ [InterceptableSpec::CbEmbedsManyChild, :before_validation],
2186
+ [InterceptableSpec::CbEmbedsManyChild, :after_validation],
2187
+ [InterceptableSpec::CbEmbedsManyParent, :before_validation],
2188
+ [InterceptableSpec::CbEmbedsManyChild, :before_validation],
2189
+ [InterceptableSpec::CbEmbedsManyChild, :after_validation],
2190
+ [InterceptableSpec::CbEmbedsManyChild, :before_validation],
2191
+ [InterceptableSpec::CbEmbedsManyChild, :after_validation],
2192
+ [InterceptableSpec::CbEmbedsManyParent, :after_validation],
2193
+
2194
+ [InterceptableSpec::CbEmbedsManyParent, :before_save],
2195
+ [InterceptableSpec::CbEmbedsManyParent, :around_save_open],
2196
+ [InterceptableSpec::CbEmbedsManyParent, :before_create],
2197
+ [InterceptableSpec::CbEmbedsManyParent, :around_create_open],
2198
+
2199
+ [InterceptableSpec::CbEmbedsManyChild, :before_save],
2200
+ [InterceptableSpec::CbEmbedsManyChild, :around_save_open],
2201
+ [InterceptableSpec::CbEmbedsManyChild, :before_save],
2202
+
2203
+ [InterceptableSpec::CbEmbedsManyChild, :around_save_open],
2204
+ [InterceptableSpec::CbEmbedsManyChild, :before_create],
2205
+ [InterceptableSpec::CbEmbedsManyChild, :around_create_open],
2206
+
2207
+ [InterceptableSpec::CbEmbedsManyChild, :before_create],
2208
+ [InterceptableSpec::CbEmbedsManyChild, :around_create_open],
2209
+
2210
+ [InterceptableSpec::CbEmbedsManyParent, :insert_into_database],
2211
+
2212
+ [InterceptableSpec::CbEmbedsManyChild, :around_create_close],
2213
+ [InterceptableSpec::CbEmbedsManyChild, :after_create],
2214
+
2215
+ [InterceptableSpec::CbEmbedsManyChild, :around_create_close],
2216
+ [InterceptableSpec::CbEmbedsManyChild, :after_create],
2217
+
2218
+ [InterceptableSpec::CbEmbedsManyChild, :around_save_close],
2219
+ [InterceptableSpec::CbEmbedsManyChild, :after_save],
2220
+
2221
+ [InterceptableSpec::CbEmbedsManyChild, :around_save_close],
2222
+ [InterceptableSpec::CbEmbedsManyChild, :after_save],
2223
+
2224
+ [InterceptableSpec::CbEmbedsManyParent, :around_create_close],
2225
+ [InterceptableSpec::CbEmbedsManyParent, :after_create],
2226
+ [InterceptableSpec::CbEmbedsManyParent, :around_save_close],
2227
+ [InterceptableSpec::CbEmbedsManyParent, :after_save]
2228
+ ]
2229
+ end
2230
+
2231
+ it 'calls callbacks in the right order' do
2232
+ parent.save!
2233
+ expect(registry.calls).to eq expected
2234
+ end
2235
+ end
2236
+
2237
+ context "without around callbacks" do
2238
+ config_override :around_callbacks_for_embeds, false
2239
+
2240
+ let(:expected) do
2241
+ [
2242
+ [InterceptableSpec::CbEmbedsManyChild, :before_validation],
2243
+ [InterceptableSpec::CbEmbedsManyChild, :after_validation],
2244
+ [InterceptableSpec::CbEmbedsManyChild, :before_validation],
2245
+ [InterceptableSpec::CbEmbedsManyChild, :after_validation],
2246
+ [InterceptableSpec::CbEmbedsManyParent, :before_validation],
2247
+ [InterceptableSpec::CbEmbedsManyChild, :before_validation],
2248
+ [InterceptableSpec::CbEmbedsManyChild, :after_validation],
2249
+ [InterceptableSpec::CbEmbedsManyChild, :before_validation],
2250
+ [InterceptableSpec::CbEmbedsManyChild, :after_validation],
2251
+ [InterceptableSpec::CbEmbedsManyParent, :after_validation],
2252
+
2253
+ [InterceptableSpec::CbEmbedsManyParent, :before_save],
2254
+ [InterceptableSpec::CbEmbedsManyParent, :around_save_open],
2255
+ [InterceptableSpec::CbEmbedsManyParent, :before_create],
2256
+ [InterceptableSpec::CbEmbedsManyParent, :around_create_open],
2257
+
2258
+ [InterceptableSpec::CbEmbedsManyChild, :before_save],
2259
+ [InterceptableSpec::CbEmbedsManyChild, :before_save],
2260
+
2261
+ [InterceptableSpec::CbEmbedsManyChild, :before_create],
2262
+
2263
+ [InterceptableSpec::CbEmbedsManyChild, :before_create],
2264
+
2265
+ [InterceptableSpec::CbEmbedsManyParent, :insert_into_database],
2266
+
2267
+ [InterceptableSpec::CbEmbedsManyChild, :after_create],
2268
+
2269
+ [InterceptableSpec::CbEmbedsManyChild, :after_create],
2270
+
2271
+ [InterceptableSpec::CbEmbedsManyChild, :after_save],
2272
+
2273
+ [InterceptableSpec::CbEmbedsManyChild, :after_save],
2274
+
2275
+ [InterceptableSpec::CbEmbedsManyParent, :around_create_close],
2276
+ [InterceptableSpec::CbEmbedsManyParent, :after_create],
2277
+ [InterceptableSpec::CbEmbedsManyParent, :around_save_close],
2278
+ [InterceptableSpec::CbEmbedsManyParent, :after_save]
2279
+ ]
2280
+ end
2281
+
2282
+ it 'calls callbacks in the right order' do
2283
+ parent.save!
2284
+ expect(registry.calls).to eq expected
2285
+ end
2286
+ end
2287
+ end
2288
+ end
2289
+
2290
+ context "when accessing parent document from callbacks" do
2291
+ shared_examples 'accesses the correct parent' do
2292
+ it "accesses the correct parent in after_find" do
2293
+ expect(from_db.after_find_player).to eq(player._id)
2294
+ end
2295
+
2296
+ it "accesses the correct parent in after_initialize" do
2297
+ expect(from_db.after_initialize_player).to eq(player._id)
2298
+ end
2299
+
2300
+ it "accesses the correct parent in default" do
2301
+ expect(from_db.after_default_player).to eq(player._id)
2302
+ end
2303
+
2304
+ it "accesses the correct parent in unpersisted after_initialize" do
2305
+ expect(unpersisted.after_initialize_player).to eq(player._id)
2306
+ end
2307
+ end
2308
+
2309
+ context "when using create methods" do
2310
+
2311
+ context "when the child is an embeds_many association" do
2312
+ let!(:player) do
2313
+ Player.create!.tap do |player|
2314
+ player.implants.create!
2315
+ end
2316
+ end
2317
+
2318
+ let(:unpersisted) { player.implants.first }
2319
+
2320
+ before do
2321
+ # The default is originally set when creating this document, and it is
2322
+ # subsequently persisted to the database. Therefore when we retrieve
2323
+ # this document from the database, this field is already set, and
2324
+ # the default Proc is not called. This unset is needed to allow the
2325
+ # default Proc to be called when the document is retrieved from the
2326
+ # database.
2327
+ Player.find(player.id).implants.first.unset(:after_default_player)
2328
+ end
2329
+
2330
+ let(:from_db) do
2331
+ Player.find(player.id).implants.first
2332
+ end
2333
+
2334
+ include_examples 'accesses the correct parent'
2335
+ end
2336
+
2337
+ context "when the child is an embeds_one association" do
2338
+ let!(:player) do
2339
+ Player.create!.tap do |player|
2340
+ player.create_augmentation
2341
+ end
2342
+ end
2343
+
2344
+ let(:unpersisted) { player.augmentation }
2345
+
2346
+ before do
2347
+ Player.find(player.id).augmentation.unset(:after_default_player)
2348
+ end
2349
+
2350
+ let(:from_db) do
2351
+ Player.find(player.id).augmentation
2352
+ end
2353
+
2354
+ include_examples 'accesses the correct parent'
2355
+ end
2356
+
2357
+ context "when the child is a has_many association" do
2358
+ let!(:player) do
2359
+ Player.create!.tap do |player|
2360
+ player.weapons.create!
2361
+ end
2362
+ end
2363
+
2364
+ let(:unpersisted) { player.weapons.first }
2365
+
2366
+ before do
2367
+ Player.find(player.id).weapons.first.unset(:after_default_player)
2368
+ end
2369
+
2370
+ let(:from_db) do
2371
+ Player.find(player.id).weapons.first
2372
+ end
2373
+
2374
+ include_examples 'accesses the correct parent'
2375
+ end
2376
+
2377
+ context "when the child is a has_one association" do
2378
+ let!(:player) do
2379
+ Player.create!.tap do |player|
2380
+ player.create_powerup
2381
+ player.save!
2382
+ end
2383
+ end
2384
+
2385
+ let(:unpersisted) { player.powerup }
2386
+
2387
+ before do
2388
+ Player.find(player.id).powerup.unset(:after_default_player)
2389
+ end
2390
+
2391
+ let(:from_db) do
2392
+ Player.find(player.id).powerup
2393
+ end
2394
+
2395
+ include_examples 'accesses the correct parent'
2396
+ end
2397
+
2398
+ context "when the child is a has_and_belongs_to_many association" do
2399
+ let!(:player) do
2400
+ Player.create!.tap do |player|
2401
+ player.shields.create!
2402
+ end
2403
+ end
2404
+
2405
+ let(:unpersisted) { player.shields.first }
2406
+
2407
+ before do
2408
+ Player.find(player.id).shields.unset(:after_default_player)
2409
+ end
2410
+
2411
+ let(:from_db) do
2412
+ Player.find(player.id).shields.first
2413
+ end
2414
+
2415
+ include_examples 'accesses the correct parent'
2416
+ end
2417
+ end
2418
+
2419
+ context "when using build methods" do
2420
+
2421
+ context "when the child is an embeds_many association" do
2422
+ let!(:player) do
2423
+ Player.create!.tap do |player|
2424
+ player.implants.build
2425
+ player.implants.first.save!
2426
+ end
2427
+ end
2428
+
2429
+ let(:unpersisted) { player.implants.first }
2430
+
2431
+ before do
2432
+ Player.find(player.id).implants.first.unset(:after_default_player)
2433
+ end
2434
+
2435
+ let(:from_db) do
2436
+ Player.find(player.id).implants.first
2437
+ end
2438
+
2439
+ include_examples 'accesses the correct parent'
2440
+ end
2441
+
2442
+ context "when the child is an embeds_one association" do
2443
+ let!(:player) do
2444
+ Player.create!.tap do |player|
2445
+ player.build_augmentation
2446
+ player.save!
2447
+ end
2448
+ end
2449
+
2450
+ let(:unpersisted) { player.augmentation }
2451
+
2452
+ before do
2453
+ Player.find(player.id).augmentation.unset(:after_default_player)
2454
+ end
2455
+
2456
+ let(:from_db) do
2457
+ Player.find(player.id).augmentation
2458
+ end
2459
+
2460
+ include_examples 'accesses the correct parent'
2461
+ end
2462
+
2463
+ context "when the child is a has_many association" do
2464
+ let!(:player) do
2465
+ Player.create!.tap do |player|
2466
+ player.weapons.build
2467
+ player.weapons.first.save!
2468
+ end
2469
+ end
2470
+
2471
+ let(:unpersisted) { player.weapons.first }
2472
+
2473
+ before do
2474
+ Player.find(player.id).weapons.first.unset(:after_default_player)
2475
+ end
2476
+
2477
+ let(:from_db) do
2478
+ Player.find(player.id).weapons.first
2479
+ end
2480
+
2481
+ include_examples 'accesses the correct parent'
2482
+ end
2483
+
2484
+ context "when the child is a has_one association" do
2485
+ let!(:player) do
2486
+ Player.create!.tap do |player|
2487
+ player.build_powerup
2488
+ player.powerup.save!
2489
+ end
2490
+ end
2491
+
2492
+ let(:unpersisted) { player.powerup }
2493
+
2494
+ before do
2495
+ Player.find(player.id).powerup.unset(:after_default_player)
2496
+ end
2497
+
2498
+ let(:from_db) do
2499
+ Player.find(player.id).powerup
2500
+ end
2501
+
2502
+ include_examples 'accesses the correct parent'
2503
+ end
2504
+
2505
+ context "when the child is a has_and_belongs_to_many association" do
2506
+ let!(:player) do
2507
+ Player.create!.tap do |player|
2508
+ player.shields.build
2509
+ player.shields.first.save!
2510
+ end
2511
+ end
2512
+
2513
+ let(:unpersisted) { player.shields.first }
2514
+
2515
+ before do
2516
+ Player.find(player.id).shields.unset(:after_default_player)
2517
+ end
2518
+
2519
+ let(:from_db) do
2520
+ Player.find(player.id).shields.first
2521
+ end
2522
+
2523
+ include_examples 'accesses the correct parent'
2524
+ end
2525
+ end
2526
+ end
2527
+
2528
+ context "when accessing associations in defaults" do
2529
+ context "when not using autobuilding" do
2530
+ let(:band) { InterceptableBand.create(name: "Molejo") }
2531
+ let(:song) { band.songs.create(name: "Cilada") }
2532
+
2533
+ it "assigns the default correctly" do
2534
+ expect(song.band_name).to eq("Molejo")
2535
+ end
2536
+ end
2537
+
2538
+ context "when using autobuilding" do
2539
+ before do
2540
+ InterceptablePlane.create!.tap do |plane|
2541
+ plane.wings.create!
2542
+ end
2543
+ end
2544
+
2545
+ let(:plane) { InterceptablePlane.first }
2546
+ let(:wing) { InterceptableWing.first }
2547
+ let(:engine) { wing.engine }
2548
+
2549
+ it "sets the defaults correctly" do
2550
+ expect(wing._id).to eq("hello-wing")
2551
+ expect(wing.p_id).to eq(plane._id.to_s)
2552
+ expect(wing.e_id).to eq(engine._id.to_s)
2553
+ expect(engine._id).to eq("hello-engine-#{wing.id}")
2554
+ end
2555
+ end
2556
+ end
2557
+
2558
+ # This case is rather niche. The _ids method used to use the `.only` method
2559
+ # to get only the _ids for an association, which was causing a
2560
+ # MissingAttributeError to be raised when accessing another association. This
2561
+ # was fixed by using `.pluck` over `.only`. Look at MONGOID-5306 for a more
2562
+ # detailed explanation.
2563
+ context "when accessing _ids in validate and access an association in after_initialize" do
2564
+ it "doesn't raise AttributeNotLoaded" do
2565
+ company = InterceptableCompany.create!
2566
+ shop = InterceptableShop.create!(company: company)
2567
+ user = InterceptableUser.new
2568
+ user.company = company
2569
+ expect do
2570
+ user.save!
2571
+ end.to_not raise_error(Mongoid::Errors::AttributeNotLoaded)
2572
+ end
2573
+ end
2574
+
2575
+ context "when around callbacks for embedded are disabled" do
2576
+ config_override :around_callbacks_for_embeds, false
2577
+
2578
+ context "when around callback is defined" do
2579
+ let(:registry) { InterceptableSpec::CallbackRegistry.new }
2580
+
2581
+ let(:parent) do
2582
+ InterceptableSpec::CbEmbedsOneParent.new(registry).tap do |parent|
2583
+ parent.child = InterceptableSpec::CbEmbedsOneChild.new(registry)
2584
+ end
2585
+ end
2586
+
2587
+ before do
2588
+ expect(Mongoid.logger).to receive(:warn).with(/Around callbacks are disabled for embedded documents/).twice.and_call_original
2589
+ expect(Mongoid.logger).to receive(:warn).with(/To enable around callbacks for embedded documents/).twice.and_call_original
2590
+ end
2591
+
2592
+ it "logs a warning" do
2593
+ parent.save!
2594
+ end
1785
2595
  end
1786
2596
  end
1787
2597
  end