mongoid 7.0.2 → 8.1.1

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