mongoid 7.1.1 → 8.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1094) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +20 -20
  4. data/README.md +15 -8
  5. data/Rakefile +61 -5
  6. data/lib/config/locales/en.yml +162 -56
  7. data/lib/mongoid/association/accessors.rb +89 -40
  8. data/lib/mongoid/association/bindable.rb +50 -23
  9. data/lib/mongoid/association/builders.rb +5 -12
  10. data/lib/mongoid/association/constrainable.rb +1 -5
  11. data/lib/mongoid/association/depending.rb +5 -17
  12. data/lib/mongoid/association/eager_loadable.rb +29 -10
  13. data/lib/mongoid/association/embedded/batchable.rb +64 -52
  14. data/lib/mongoid/association/embedded/cyclic.rb +3 -12
  15. data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -9
  16. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +2 -5
  17. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +4 -16
  18. data/lib/mongoid/association/embedded/embedded_in.rb +4 -26
  19. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -7
  20. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +4 -6
  21. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +110 -92
  22. data/lib/mongoid/association/embedded/embeds_many.rb +4 -34
  23. data/lib/mongoid/association/embedded/embeds_one/binding.rb +0 -7
  24. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +19 -8
  25. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +50 -19
  26. data/lib/mongoid/association/embedded/embeds_one.rb +5 -31
  27. data/lib/mongoid/association/embedded.rb +0 -1
  28. data/lib/mongoid/association/macros.rb +27 -5
  29. data/lib/mongoid/association/many.rb +14 -27
  30. data/lib/mongoid/association/marshalable.rb +0 -5
  31. data/lib/mongoid/association/nested/many.rb +6 -16
  32. data/lib/mongoid/association/nested/nested_buildable.rb +4 -13
  33. data/lib/mongoid/association/nested/one.rb +48 -23
  34. data/lib/mongoid/association/nested.rb +0 -3
  35. data/lib/mongoid/association/one.rb +2 -11
  36. data/lib/mongoid/association/options.rb +9 -42
  37. data/lib/mongoid/association/proxy.rb +22 -27
  38. data/lib/mongoid/association/referenced/auto_save.rb +6 -14
  39. data/lib/mongoid/association/referenced/belongs_to/binding.rb +2 -8
  40. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +5 -6
  41. data/lib/mongoid/association/referenced/belongs_to/eager.rb +0 -1
  42. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +5 -19
  43. data/lib/mongoid/association/referenced/belongs_to.rb +11 -36
  44. data/lib/mongoid/association/referenced/counter_cache.rb +12 -25
  45. data/lib/mongoid/association/referenced/eager.rb +5 -26
  46. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +0 -5
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +0 -3
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +0 -1
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +81 -51
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +17 -41
  51. data/lib/mongoid/association/referenced/has_many/binding.rb +0 -5
  52. data/lib/mongoid/association/referenced/has_many/buildable.rb +0 -3
  53. data/lib/mongoid/association/referenced/has_many/eager.rb +0 -1
  54. data/lib/mongoid/association/referenced/has_many/enumerable.rb +438 -461
  55. data/lib/mongoid/association/referenced/has_many/proxy.rb +58 -84
  56. data/lib/mongoid/association/referenced/has_many.rb +15 -42
  57. data/lib/mongoid/association/referenced/has_one/binding.rb +0 -7
  58. data/lib/mongoid/association/referenced/has_one/buildable.rb +12 -5
  59. data/lib/mongoid/association/referenced/has_one/eager.rb +0 -1
  60. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +7 -22
  61. data/lib/mongoid/association/referenced/has_one/proxy.rb +9 -16
  62. data/lib/mongoid/association/referenced/has_one.rb +12 -35
  63. data/lib/mongoid/association/referenced/syncable.rb +4 -21
  64. data/lib/mongoid/association/referenced.rb +0 -1
  65. data/lib/mongoid/association/reflections.rb +4 -5
  66. data/lib/mongoid/association/relatable.rb +46 -71
  67. data/lib/mongoid/association.rb +5 -22
  68. data/lib/mongoid/atomic/modifiers.rb +7 -54
  69. data/lib/mongoid/atomic/paths/embedded/many.rb +19 -5
  70. data/lib/mongoid/atomic/paths/embedded/one.rb +0 -5
  71. data/lib/mongoid/atomic/paths/embedded.rb +0 -3
  72. data/lib/mongoid/atomic/paths/root.rb +0 -5
  73. data/lib/mongoid/atomic/paths.rb +0 -1
  74. data/lib/mongoid/atomic.rb +40 -47
  75. data/lib/mongoid/attributes/dynamic.rb +5 -22
  76. data/lib/mongoid/attributes/nested.rb +6 -11
  77. data/lib/mongoid/attributes/processing.rb +11 -21
  78. data/lib/mongoid/attributes/projector.rb +119 -0
  79. data/lib/mongoid/attributes/readonly.rb +3 -8
  80. data/lib/mongoid/attributes.rb +82 -88
  81. data/lib/mongoid/cacheable.rb +4 -9
  82. data/lib/mongoid/changeable.rb +148 -69
  83. data/lib/mongoid/clients/factory.rb +41 -17
  84. data/lib/mongoid/clients/options.rb +13 -14
  85. data/lib/mongoid/clients/sessions.rb +8 -11
  86. data/lib/mongoid/clients/storage_options.rb +7 -17
  87. data/lib/mongoid/clients/validators/storage.rb +3 -24
  88. data/lib/mongoid/clients/validators.rb +0 -1
  89. data/lib/mongoid/clients.rb +1 -10
  90. data/lib/mongoid/collection_configurable.rb +58 -0
  91. data/lib/mongoid/composable.rb +3 -7
  92. data/lib/mongoid/config/defaults.rb +60 -0
  93. data/lib/mongoid/config/environment.rb +28 -5
  94. data/lib/mongoid/config/options.rb +0 -11
  95. data/lib/mongoid/config/validators/async_query_executor.rb +24 -0
  96. data/lib/mongoid/config/validators/client.rb +6 -23
  97. data/lib/mongoid/config/validators/option.rb +0 -3
  98. data/lib/mongoid/config/validators.rb +1 -1
  99. data/lib/mongoid/config.rb +183 -39
  100. data/lib/mongoid/contextual/aggregable/memory.rb +37 -26
  101. data/lib/mongoid/contextual/aggregable/mongo.rb +29 -32
  102. data/lib/mongoid/contextual/aggregable/none.rb +65 -0
  103. data/lib/mongoid/contextual/aggregable.rb +17 -0
  104. data/lib/mongoid/contextual/atomic.rb +7 -27
  105. data/lib/mongoid/contextual/command.rb +0 -5
  106. data/lib/mongoid/contextual/geo_near.rb +8 -41
  107. data/lib/mongoid/contextual/map_reduce.rb +2 -33
  108. data/lib/mongoid/contextual/memory.rb +383 -79
  109. data/lib/mongoid/contextual/mongo/documents_loader.rb +177 -0
  110. data/lib/mongoid/contextual/mongo.rb +636 -283
  111. data/lib/mongoid/contextual/none.rb +262 -31
  112. data/lib/mongoid/contextual/queryable.rb +1 -4
  113. data/lib/mongoid/contextual.rb +14 -7
  114. data/lib/mongoid/copyable.rb +39 -16
  115. data/lib/mongoid/criteria/findable.rb +9 -19
  116. data/lib/mongoid/criteria/includable.rb +27 -31
  117. data/lib/mongoid/criteria/inspectable.rb +0 -3
  118. data/lib/mongoid/criteria/marshalable.rb +10 -7
  119. data/lib/mongoid/criteria/modifiable.rb +2 -20
  120. data/lib/mongoid/criteria/options.rb +0 -3
  121. data/lib/mongoid/criteria/permission.rb +1 -2
  122. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -15
  123. data/lib/mongoid/criteria/queryable/expandable.rb +0 -25
  124. data/lib/mongoid/criteria/queryable/extensions/array.rb +4 -40
  125. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -7
  126. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +3 -6
  127. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -8
  128. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -6
  129. data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -40
  130. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +0 -13
  131. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -20
  132. data/lib/mongoid/criteria/queryable/extensions/object.rb +3 -29
  133. data/lib/mongoid/criteria/queryable/extensions/range.rb +46 -16
  134. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +9 -18
  135. data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -4
  136. data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -31
  137. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -21
  138. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -8
  139. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +16 -6
  140. data/lib/mongoid/criteria/queryable/extensions.rb +0 -5
  141. data/lib/mongoid/criteria/queryable/key.rb +6 -19
  142. data/lib/mongoid/criteria/queryable/macroable.rb +0 -3
  143. data/lib/mongoid/criteria/queryable/mergeable.rb +123 -38
  144. data/lib/mongoid/criteria/queryable/optional.rb +11 -62
  145. data/lib/mongoid/criteria/queryable/options.rb +2 -21
  146. data/lib/mongoid/criteria/queryable/pipeline.rb +1 -14
  147. data/lib/mongoid/criteria/queryable/selectable.rb +138 -125
  148. data/lib/mongoid/criteria/queryable/selector.rb +94 -30
  149. data/lib/mongoid/criteria/queryable/smash.rb +40 -18
  150. data/lib/mongoid/criteria/queryable/storable.rb +14 -10
  151. data/lib/mongoid/criteria/queryable.rb +11 -13
  152. data/lib/mongoid/criteria/scopable.rb +27 -21
  153. data/lib/mongoid/criteria/translator.rb +45 -0
  154. data/lib/mongoid/criteria.rb +88 -108
  155. data/lib/mongoid/deprecable.rb +36 -0
  156. data/lib/mongoid/deprecation.rb +25 -0
  157. data/lib/mongoid/document.rb +149 -99
  158. data/lib/mongoid/equality.rb +32 -16
  159. data/lib/mongoid/errors/ambiguous_relationship.rb +2 -5
  160. data/lib/mongoid/errors/callback.rb +0 -3
  161. data/lib/mongoid/errors/create_collection_failure.rb +33 -0
  162. data/lib/mongoid/errors/criteria_argument_required.rb +0 -1
  163. data/lib/mongoid/errors/delete_restriction.rb +8 -12
  164. data/lib/mongoid/errors/document_not_destroyed.rb +2 -7
  165. data/lib/mongoid/errors/document_not_found.rb +33 -21
  166. data/lib/mongoid/errors/drop_collection_failure.rb +27 -0
  167. data/lib/mongoid/errors/empty_config_file.rb +25 -0
  168. data/lib/mongoid/errors/immutable_attribute.rb +26 -0
  169. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +0 -3
  170. data/lib/mongoid/errors/invalid_async_query_executor.rb +25 -0
  171. data/lib/mongoid/errors/invalid_collection.rb +0 -1
  172. data/lib/mongoid/errors/invalid_config_file.rb +25 -0
  173. data/lib/mongoid/errors/invalid_config_option.rb +1 -4
  174. data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -4
  175. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +24 -0
  176. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  177. data/lib/mongoid/errors/invalid_elem_match_operator.rb +32 -0
  178. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +25 -0
  179. data/lib/mongoid/errors/invalid_expression_operator.rb +27 -0
  180. data/lib/mongoid/errors/invalid_field.rb +6 -7
  181. data/lib/mongoid/errors/invalid_field_operator.rb +32 -0
  182. data/lib/mongoid/errors/invalid_field_option.rb +0 -3
  183. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  184. data/lib/mongoid/errors/invalid_find.rb +0 -3
  185. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +22 -0
  186. data/lib/mongoid/errors/invalid_includes.rb +0 -3
  187. data/lib/mongoid/errors/invalid_index.rb +0 -3
  188. data/lib/mongoid/errors/invalid_options.rb +0 -3
  189. data/lib/mongoid/errors/invalid_path.rb +0 -3
  190. data/lib/mongoid/errors/invalid_persistence_option.rb +0 -5
  191. data/lib/mongoid/errors/invalid_query.rb +40 -0
  192. data/lib/mongoid/errors/invalid_relation.rb +1 -8
  193. data/lib/mongoid/errors/invalid_relation_option.rb +1 -4
  194. data/lib/mongoid/errors/invalid_scope.rb +0 -3
  195. data/lib/mongoid/errors/invalid_session_use.rb +1 -6
  196. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +0 -1
  197. data/lib/mongoid/errors/invalid_storage_options.rb +1 -4
  198. data/lib/mongoid/errors/invalid_storage_parent.rb +2 -3
  199. data/lib/mongoid/errors/invalid_time.rb +0 -3
  200. data/lib/mongoid/errors/inverse_not_found.rb +0 -3
  201. data/lib/mongoid/errors/mixed_client_configuration.rb +0 -3
  202. data/lib/mongoid/errors/mixed_relations.rb +0 -3
  203. data/lib/mongoid/errors/mongoid_error.rb +4 -13
  204. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -4
  205. data/lib/mongoid/errors/no_client_config.rb +2 -5
  206. data/lib/mongoid/errors/no_client_database.rb +1 -4
  207. data/lib/mongoid/errors/no_client_hosts.rb +1 -4
  208. data/lib/mongoid/errors/no_clients_config.rb +0 -3
  209. data/lib/mongoid/errors/no_default_client.rb +1 -4
  210. data/lib/mongoid/errors/no_environment.rb +0 -3
  211. data/lib/mongoid/errors/no_map_reduce_output.rb +0 -3
  212. data/lib/mongoid/errors/no_metadata.rb +0 -3
  213. data/lib/mongoid/errors/no_parent.rb +0 -3
  214. data/lib/mongoid/errors/readonly_attribute.rb +1 -4
  215. data/lib/mongoid/errors/readonly_document.rb +1 -6
  216. data/lib/mongoid/errors/scope_overwrite.rb +0 -1
  217. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -2
  218. data/lib/mongoid/errors/unknown_attribute.rb +1 -4
  219. data/lib/mongoid/errors/unknown_model.rb +0 -3
  220. data/lib/mongoid/errors/unsaved_document.rb +1 -2
  221. data/lib/mongoid/errors/unsupported_javascript.rb +0 -3
  222. data/lib/mongoid/errors/validations.rb +0 -1
  223. data/lib/mongoid/errors.rb +15 -4
  224. data/lib/mongoid/evolvable.rb +1 -4
  225. data/lib/mongoid/extensions/array.rb +12 -36
  226. data/lib/mongoid/extensions/big_decimal.rb +33 -21
  227. data/lib/mongoid/extensions/binary.rb +42 -0
  228. data/lib/mongoid/extensions/boolean.rb +8 -6
  229. data/lib/mongoid/extensions/date.rb +26 -29
  230. data/lib/mongoid/extensions/date_time.rb +1 -10
  231. data/lib/mongoid/extensions/decimal128.rb +0 -5
  232. data/lib/mongoid/extensions/false_class.rb +3 -8
  233. data/lib/mongoid/extensions/float.rb +7 -11
  234. data/lib/mongoid/extensions/hash.rb +19 -37
  235. data/lib/mongoid/extensions/integer.rb +7 -13
  236. data/lib/mongoid/extensions/module.rb +1 -4
  237. data/lib/mongoid/extensions/nil_class.rb +0 -5
  238. data/lib/mongoid/extensions/object.rb +11 -48
  239. data/lib/mongoid/extensions/object_id.rb +0 -7
  240. data/lib/mongoid/extensions/range.rb +40 -20
  241. data/lib/mongoid/extensions/regexp.rb +12 -8
  242. data/lib/mongoid/extensions/set.rb +11 -11
  243. data/lib/mongoid/extensions/string.rb +12 -52
  244. data/lib/mongoid/extensions/symbol.rb +4 -22
  245. data/lib/mongoid/extensions/time.rb +28 -26
  246. data/lib/mongoid/extensions/time_with_zone.rb +14 -11
  247. data/lib/mongoid/extensions/true_class.rb +3 -8
  248. data/lib/mongoid/extensions.rb +17 -3
  249. data/lib/mongoid/factory.rb +80 -16
  250. data/lib/mongoid/fields/foreign_key.rb +11 -25
  251. data/lib/mongoid/fields/localized.rb +19 -15
  252. data/lib/mongoid/fields/standard.rb +17 -40
  253. data/lib/mongoid/fields/validators/macro.rb +25 -24
  254. data/lib/mongoid/fields/validators.rb +0 -1
  255. data/lib/mongoid/fields.rb +346 -75
  256. data/lib/mongoid/findable.rb +107 -31
  257. data/lib/mongoid/indexable/specification.rb +2 -17
  258. data/lib/mongoid/indexable/validators/options.rb +6 -9
  259. data/lib/mongoid/indexable.rb +3 -20
  260. data/lib/mongoid/inspectable.rb +2 -11
  261. data/lib/mongoid/interceptable.rb +79 -41
  262. data/lib/mongoid/loggable.rb +0 -9
  263. data/lib/mongoid/matchable.rb +2 -155
  264. data/lib/mongoid/matcher/all.rb +22 -0
  265. data/lib/mongoid/matcher/and.rb +21 -0
  266. data/lib/mongoid/matcher/bits.rb +41 -0
  267. data/lib/mongoid/matcher/bits_all_clear.rb +20 -0
  268. data/lib/mongoid/matcher/bits_all_set.rb +20 -0
  269. data/lib/mongoid/matcher/bits_any_clear.rb +20 -0
  270. data/lib/mongoid/matcher/bits_any_set.rb +20 -0
  271. data/lib/mongoid/matcher/elem_match.rb +36 -0
  272. data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
  273. data/lib/mongoid/matcher/eq.rb +11 -0
  274. data/lib/mongoid/matcher/eq_impl.rb +67 -0
  275. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +26 -0
  276. data/lib/mongoid/matcher/exists.rb +15 -0
  277. data/lib/mongoid/matcher/expression.rb +35 -0
  278. data/lib/mongoid/matcher/expression_operator.rb +19 -0
  279. data/lib/mongoid/matcher/field_expression.rb +62 -0
  280. data/lib/mongoid/matcher/field_operator.rb +54 -0
  281. data/lib/mongoid/matcher/gt.rb +17 -0
  282. data/lib/mongoid/matcher/gte.rb +17 -0
  283. data/lib/mongoid/matcher/in.rb +25 -0
  284. data/lib/mongoid/matcher/lt.rb +17 -0
  285. data/lib/mongoid/matcher/lte.rb +17 -0
  286. data/lib/mongoid/matcher/mod.rb +17 -0
  287. data/lib/mongoid/matcher/ne.rb +16 -0
  288. data/lib/mongoid/matcher/nin.rb +11 -0
  289. data/lib/mongoid/matcher/nor.rb +25 -0
  290. data/lib/mongoid/matcher/not.rb +29 -0
  291. data/lib/mongoid/matcher/or.rb +21 -0
  292. data/lib/mongoid/matcher/regex.rb +41 -0
  293. data/lib/mongoid/matcher/size.rb +26 -0
  294. data/lib/mongoid/matcher/type.rb +99 -0
  295. data/lib/mongoid/matcher.rb +130 -0
  296. data/lib/mongoid/persistable/creatable.rb +20 -29
  297. data/lib/mongoid/persistable/deletable.rb +4 -22
  298. data/lib/mongoid/persistable/destroyable.rb +9 -10
  299. data/lib/mongoid/persistable/incrementable.rb +0 -5
  300. data/lib/mongoid/persistable/logical.rb +0 -5
  301. data/lib/mongoid/persistable/poppable.rb +0 -5
  302. data/lib/mongoid/persistable/pullable.rb +0 -7
  303. data/lib/mongoid/persistable/pushable.rb +4 -8
  304. data/lib/mongoid/persistable/renamable.rb +0 -5
  305. data/lib/mongoid/persistable/savable.rb +13 -8
  306. data/lib/mongoid/persistable/settable.rb +0 -5
  307. data/lib/mongoid/persistable/unsettable.rb +2 -7
  308. data/lib/mongoid/persistable/updatable.rb +96 -29
  309. data/lib/mongoid/persistable/upsertable.rb +20 -8
  310. data/lib/mongoid/persistable.rb +6 -26
  311. data/lib/mongoid/persistence_context.rb +71 -43
  312. data/lib/mongoid/positional.rb +0 -5
  313. data/lib/mongoid/query_cache.rb +16 -236
  314. data/lib/mongoid/railtie.rb +0 -15
  315. data/lib/mongoid/railties/controller_runtime.rb +1 -2
  316. data/lib/mongoid/railties/database.rake +7 -2
  317. data/lib/mongoid/reloadable.rb +17 -20
  318. data/lib/mongoid/scopable.rb +32 -56
  319. data/lib/mongoid/selectable.rb +5 -17
  320. data/lib/mongoid/serializable.rb +11 -22
  321. data/lib/mongoid/shardable.rb +49 -16
  322. data/lib/mongoid/stateful.rb +57 -19
  323. data/lib/mongoid/stringified_symbol.rb +52 -0
  324. data/lib/mongoid/tasks/database.rake +12 -0
  325. data/lib/mongoid/tasks/database.rb +59 -11
  326. data/lib/mongoid/threaded/lifecycle.rb +5 -26
  327. data/lib/mongoid/threaded.rb +42 -67
  328. data/lib/mongoid/timestamps/created/short.rb +0 -1
  329. data/lib/mongoid/timestamps/created.rb +1 -2
  330. data/lib/mongoid/timestamps/short.rb +0 -1
  331. data/lib/mongoid/timestamps/timeless.rb +0 -7
  332. data/lib/mongoid/timestamps/updated/short.rb +0 -1
  333. data/lib/mongoid/timestamps/updated.rb +2 -5
  334. data/lib/mongoid/timestamps.rb +0 -1
  335. data/lib/mongoid/touchable.rb +34 -13
  336. data/lib/mongoid/traversable.rb +181 -59
  337. data/lib/mongoid/utils.rb +22 -0
  338. data/lib/mongoid/validatable/associated.rb +1 -4
  339. data/lib/mongoid/validatable/format.rb +0 -1
  340. data/lib/mongoid/validatable/length.rb +0 -1
  341. data/lib/mongoid/validatable/localizable.rb +1 -4
  342. data/lib/mongoid/validatable/macros.rb +5 -14
  343. data/lib/mongoid/validatable/presence.rb +6 -13
  344. data/lib/mongoid/validatable/queryable.rb +0 -3
  345. data/lib/mongoid/validatable/uniqueness.rb +26 -40
  346. data/lib/mongoid/validatable.rb +9 -27
  347. data/lib/mongoid/version.rb +1 -2
  348. data/lib/mongoid/warnings.rb +44 -0
  349. data/lib/mongoid.rb +42 -18
  350. data/lib/rails/generators/mongoid/config/config_generator.rb +8 -2
  351. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +12 -6
  352. data/lib/rails/generators/mongoid/model/model_generator.rb +0 -1
  353. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
  354. data/lib/rails/generators/mongoid_generator.rb +0 -1
  355. data/lib/rails/mongoid.rb +0 -3
  356. data/spec/README.md +19 -4
  357. data/spec/config/mongoid.yml +16 -0
  358. data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
  359. data/spec/integration/app_spec.rb +345 -0
  360. data/spec/integration/associations/belongs_to_spec.rb +18 -1
  361. data/spec/integration/associations/embedded_dirty_spec.rb +57 -0
  362. data/spec/integration/associations/embedded_spec.rb +163 -1
  363. data/spec/integration/associations/embeds_many_spec.rb +219 -0
  364. data/spec/integration/associations/embeds_one_spec.rb +41 -0
  365. data/spec/integration/associations/foreign_key_spec.rb +9 -1
  366. data/spec/integration/associations/foreign_key_spec_models.rb +0 -1
  367. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  368. data/spec/integration/associations/has_many_spec.rb +128 -0
  369. data/spec/integration/associations/has_one_spec.rb +272 -0
  370. data/spec/integration/associations/nested_attributes_assignment_spec.rb +115 -0
  371. data/spec/integration/associations/reverse_population_spec.rb +0 -1
  372. data/spec/integration/associations/reverse_population_spec_models.rb +0 -1
  373. data/spec/integration/associations/scope_option_spec.rb +101 -0
  374. data/spec/integration/atomic/modifiers_spec.rb +116 -0
  375. data/spec/integration/bson_regexp_raw_spec.rb +19 -0
  376. data/spec/integration/callbacks_models.rb +192 -0
  377. data/spec/integration/callbacks_spec.rb +584 -0
  378. data/spec/integration/contextual/empty_spec.rb +141 -0
  379. data/spec/integration/criteria/alias_query_spec.rb +161 -0
  380. data/spec/integration/criteria/date_field_spec.rb +40 -0
  381. data/spec/integration/criteria/default_scope_spec.rb +51 -0
  382. data/spec/integration/criteria/logical_spec.rb +43 -0
  383. data/spec/integration/criteria/range_spec.rb +359 -0
  384. data/spec/integration/criteria/time_with_zone_spec.rb +125 -15
  385. data/spec/integration/discriminator_key_spec.rb +391 -0
  386. data/spec/integration/discriminator_value_spec.rb +206 -0
  387. data/spec/integration/document_spec.rb +30 -1
  388. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  389. data/spec/integration/i18n_fallbacks_spec.rb +3 -19
  390. data/spec/integration/{matchable_spec.rb → matcher_examples_spec.rb} +130 -45
  391. data/spec/integration/matcher_operator_data/all.yml +140 -0
  392. data/spec/integration/matcher_operator_data/and.yml +93 -0
  393. data/spec/integration/matcher_operator_data/bits_all_clear.yml +159 -0
  394. data/spec/integration/matcher_operator_data/bits_all_set.yml +159 -0
  395. data/spec/integration/matcher_operator_data/bits_any_clear.yml +159 -0
  396. data/spec/integration/matcher_operator_data/bits_any_set.yml +159 -0
  397. data/spec/integration/matcher_operator_data/comment.yml +22 -0
  398. data/spec/integration/matcher_operator_data/elem_match.yml +409 -0
  399. data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
  400. data/spec/integration/matcher_operator_data/eq.yml +191 -0
  401. data/spec/integration/matcher_operator_data/exists.yml +213 -0
  402. data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
  403. data/spec/integration/matcher_operator_data/gt.yml +132 -0
  404. data/spec/integration/matcher_operator_data/gt_types.yml +63 -0
  405. data/spec/integration/matcher_operator_data/gte.yml +132 -0
  406. data/spec/integration/matcher_operator_data/gte_types.yml +15 -0
  407. data/spec/integration/matcher_operator_data/implicit.yml +331 -0
  408. data/spec/integration/matcher_operator_data/implicit_traversal.yml +112 -0
  409. data/spec/integration/matcher_operator_data/in.yml +210 -0
  410. data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
  411. data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
  412. data/spec/integration/matcher_operator_data/lt.yml +132 -0
  413. data/spec/integration/matcher_operator_data/lt_types.yml +15 -0
  414. data/spec/integration/matcher_operator_data/lte.yml +132 -0
  415. data/spec/integration/matcher_operator_data/lte_types.yml +15 -0
  416. data/spec/integration/matcher_operator_data/mod.yml +55 -0
  417. data/spec/integration/matcher_operator_data/multiple.yml +29 -0
  418. data/spec/integration/matcher_operator_data/ne.yml +150 -0
  419. data/spec/integration/matcher_operator_data/ne_types.yml +15 -0
  420. data/spec/integration/matcher_operator_data/nin.yml +114 -0
  421. data/spec/integration/matcher_operator_data/nor.yml +126 -0
  422. data/spec/integration/matcher_operator_data/not.yml +196 -0
  423. data/spec/integration/matcher_operator_data/or.yml +137 -0
  424. data/spec/integration/matcher_operator_data/regex.yml +174 -0
  425. data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
  426. data/spec/integration/matcher_operator_data/size.yml +174 -0
  427. data/spec/integration/matcher_operator_data/type.yml +70 -0
  428. data/spec/integration/matcher_operator_data/type_array.yml +16 -0
  429. data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
  430. data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
  431. data/spec/integration/matcher_operator_data/type_code.yml +26 -0
  432. data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
  433. data/spec/integration/matcher_operator_data/type_date.yml +39 -0
  434. data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
  435. data/spec/integration/matcher_operator_data/type_decimal.yml +41 -0
  436. data/spec/integration/matcher_operator_data/type_double.yml +15 -0
  437. data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
  438. data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
  439. data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
  440. data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
  441. data/spec/integration/matcher_operator_data/type_null.yml +23 -0
  442. data/spec/integration/matcher_operator_data/type_object.yml +23 -0
  443. data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
  444. data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
  445. data/spec/integration/matcher_operator_data/type_string.yml +15 -0
  446. data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
  447. data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
  448. data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
  449. data/spec/integration/matcher_operator_spec.rb +122 -0
  450. data/spec/integration/matcher_spec.rb +283 -0
  451. data/spec/integration/persistence/range_field_spec.rb +350 -0
  452. data/spec/integration/server_query_spec.rb +141 -0
  453. data/spec/integration/shardable_spec.rb +20 -5
  454. data/spec/integration/stringified_symbol_field_spec.rb +203 -0
  455. data/spec/lite_spec_helper.rb +25 -9
  456. data/spec/mongoid/association/accessors_spec.rb +282 -78
  457. data/spec/mongoid/association/auto_save_spec.rb +72 -34
  458. data/spec/mongoid/association/builders_spec.rb +1 -2
  459. data/spec/mongoid/association/constrainable_spec.rb +0 -1
  460. data/spec/mongoid/association/counter_cache_spec.rb +33 -34
  461. data/spec/mongoid/association/depending_spec.rb +429 -339
  462. data/spec/mongoid/association/eager_spec.rb +6 -6
  463. data/spec/mongoid/association/embedded/cyclic_spec.rb +2 -3
  464. data/spec/mongoid/association/embedded/dirty_spec.rb +2 -3
  465. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -2
  466. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -1
  467. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +150 -14
  468. data/spec/mongoid/association/embedded/embedded_in_spec.rb +0 -1
  469. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +0 -1
  470. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -1
  471. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +704 -198
  472. data/spec/mongoid/association/embedded/embeds_many_models.rb +194 -1
  473. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -1
  474. data/spec/mongoid/association/embedded/embeds_many_spec.rb +78 -1
  475. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +0 -1
  476. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -1
  477. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +36 -24
  478. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +0 -1
  479. data/spec/mongoid/association/embedded/embeds_one_models.rb +20 -1
  480. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +0 -1
  481. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -3
  482. data/spec/mongoid/association/macros_spec.rb +9 -10
  483. data/spec/mongoid/association/nested/many_spec.rb +0 -1
  484. data/spec/mongoid/association/nested/one_spec.rb +16 -13
  485. data/spec/mongoid/association/options_spec.rb +0 -1
  486. data/spec/mongoid/association/polymorphic_spec.rb +0 -1
  487. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -2
  488. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +109 -17
  489. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +50 -15
  490. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +112 -59
  491. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  492. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +20 -1
  493. data/spec/mongoid/association/referenced/belongs_to_spec.rb +26 -22
  494. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +1 -2
  495. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +26 -2
  496. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +31 -3
  497. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +0 -1
  498. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +523 -372
  499. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +43 -1
  500. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +0 -1
  501. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +56 -3
  502. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +1 -2
  503. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +130 -1
  504. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +23 -7
  505. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +413 -130
  506. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +0 -1
  507. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +857 -503
  508. data/spec/mongoid/association/referenced/has_many_models.rb +59 -2
  509. data/spec/mongoid/association/referenced/has_many_query_spec.rb +0 -1
  510. data/spec/mongoid/association/referenced/has_many_spec.rb +46 -1
  511. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +0 -1
  512. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +53 -10
  513. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +17 -2
  514. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +133 -28
  515. data/spec/mongoid/association/referenced/has_one_models.rb +63 -1
  516. data/spec/mongoid/association/referenced/has_one_query_spec.rb +0 -1
  517. data/spec/mongoid/association/referenced/has_one_spec.rb +22 -2
  518. data/spec/mongoid/association/reflections_spec.rb +0 -1
  519. data/spec/mongoid/association/syncable_spec.rb +46 -33
  520. data/spec/mongoid/association_spec.rb +0 -1
  521. data/spec/mongoid/atomic/modifiers_spec.rb +47 -1
  522. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +0 -1
  523. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +0 -1
  524. data/spec/mongoid/atomic/paths/root_spec.rb +0 -1
  525. data/spec/mongoid/atomic/paths_spec.rb +91 -13
  526. data/spec/mongoid/atomic_spec.rb +51 -7
  527. data/spec/mongoid/attributes/dynamic_spec.rb +0 -1
  528. data/spec/mongoid/attributes/nested_spec.rb +147 -79
  529. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  530. data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
  531. data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
  532. data/spec/mongoid/attributes/projector_spec.rb +40 -0
  533. data/spec/mongoid/attributes/readonly_spec.rb +22 -23
  534. data/spec/mongoid/attributes_spec.rb +888 -62
  535. data/spec/mongoid/cacheable_spec.rb +4 -5
  536. data/spec/mongoid/changeable_spec.rb +464 -73
  537. data/spec/mongoid/clients/factory_spec.rb +91 -9
  538. data/spec/mongoid/clients/options_spec.rb +27 -19
  539. data/spec/mongoid/clients/sessions_spec.rb +27 -67
  540. data/spec/mongoid/clients/transactions_spec.rb +69 -35
  541. data/spec/mongoid/clients_spec.rb +187 -24
  542. data/spec/mongoid/collection_configurable_spec.rb +158 -0
  543. data/spec/mongoid/composable_spec.rb +0 -1
  544. data/spec/mongoid/config/defaults_spec.rb +160 -0
  545. data/spec/mongoid/config/environment_spec.rb +124 -9
  546. data/spec/mongoid/config/options_spec.rb +0 -1
  547. data/spec/mongoid/config_spec.rb +465 -1
  548. data/spec/mongoid/contextual/aggregable/memory_spec.rb +431 -154
  549. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  550. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  551. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +120 -21
  552. data/spec/mongoid/contextual/aggregable/none_spec.rb +60 -0
  553. data/spec/mongoid/contextual/atomic_spec.rb +148 -86
  554. data/spec/mongoid/contextual/geo_near_spec.rb +28 -20
  555. data/spec/mongoid/contextual/map_reduce_spec.rb +20 -20
  556. data/spec/mongoid/contextual/memory_spec.rb +1826 -304
  557. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
  558. data/spec/mongoid/contextual/mongo_spec.rb +3501 -1272
  559. data/spec/mongoid/contextual/none_spec.rb +78 -68
  560. data/spec/mongoid/copyable_spec.rb +657 -37
  561. data/spec/mongoid/copyable_spec_models.rb +28 -1
  562. data/spec/mongoid/criteria/findable_spec.rb +109 -234
  563. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  564. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  565. data/spec/mongoid/criteria/inspectable_spec.rb +0 -1
  566. data/spec/mongoid/criteria/marshalable_spec.rb +18 -2
  567. data/spec/mongoid/criteria/modifiable_spec.rb +37 -38
  568. data/spec/mongoid/criteria/options_spec.rb +0 -1
  569. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +1 -2
  570. data/spec/mongoid/criteria/queryable/expandable_spec.rb +0 -74
  571. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -20
  572. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -27
  573. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +1 -2
  574. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -1
  575. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -1
  576. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +0 -1
  577. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -16
  578. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +0 -1
  579. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +0 -1
  580. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -8
  581. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +0 -1
  582. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +237 -179
  583. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +1 -2
  584. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +7 -8
  585. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +0 -1
  586. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +5 -71
  587. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -60
  588. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +30 -8
  589. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +39 -2
  590. data/spec/mongoid/criteria/queryable/key_spec.rb +0 -1
  591. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +143 -13
  592. data/spec/mongoid/criteria/queryable/optional_spec.rb +16 -486
  593. data/spec/mongoid/criteria/queryable/options_spec.rb +1 -2
  594. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +0 -1
  595. data/spec/mongoid/criteria/queryable/queryable_spec.rb +1 -2
  596. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +1186 -195
  597. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +38 -0
  598. data/spec/mongoid/criteria/queryable/selectable_spec.rb +307 -705
  599. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +589 -0
  600. data/spec/mongoid/criteria/queryable/selector_spec.rb +15 -4
  601. data/spec/mongoid/criteria/queryable/smash_spec.rb +0 -1
  602. data/spec/mongoid/criteria/queryable/storable_spec.rb +37 -1
  603. data/spec/mongoid/criteria/scopable_spec.rb +127 -1
  604. data/spec/mongoid/criteria/translator_spec.rb +132 -0
  605. data/spec/mongoid/criteria_projection_spec.rb +406 -0
  606. data/spec/mongoid/criteria_spec.rb +1267 -1739
  607. data/spec/mongoid/document_fields_spec.rb +179 -5
  608. data/spec/mongoid/document_persistence_context_spec.rb +32 -0
  609. data/spec/mongoid/document_query_spec.rb +51 -1
  610. data/spec/mongoid/document_spec.rb +151 -88
  611. data/spec/mongoid/equality_spec.rb +142 -42
  612. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +0 -1
  613. data/spec/mongoid/errors/callback_spec.rb +0 -1
  614. data/spec/mongoid/errors/delete_restriction_spec.rb +2 -3
  615. data/spec/mongoid/errors/document_not_destroyed_spec.rb +0 -1
  616. data/spec/mongoid/errors/document_not_found_spec.rb +76 -1
  617. data/spec/mongoid/errors/invalid_collection_spec.rb +0 -1
  618. data/spec/mongoid/errors/{eager_load_spec.rb → invalid_config_file_spec.rb} +5 -6
  619. data/spec/mongoid/errors/invalid_config_option_spec.rb +0 -1
  620. data/spec/mongoid/errors/invalid_field_option_spec.rb +0 -1
  621. data/spec/mongoid/errors/invalid_field_spec.rb +1 -2
  622. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  623. data/spec/mongoid/errors/invalid_find_spec.rb +0 -1
  624. data/spec/mongoid/errors/invalid_includes_spec.rb +0 -1
  625. data/spec/mongoid/errors/invalid_index_spec.rb +0 -1
  626. data/spec/mongoid/errors/invalid_options_spec.rb +0 -1
  627. data/spec/mongoid/errors/invalid_path_spec.rb +0 -1
  628. data/spec/mongoid/errors/invalid_relation_spec.rb +0 -1
  629. data/spec/mongoid/errors/invalid_scope_spec.rb +1 -2
  630. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +0 -1
  631. data/spec/mongoid/errors/invalid_storage_options_spec.rb +0 -1
  632. data/spec/mongoid/errors/invalid_time_spec.rb +0 -1
  633. data/spec/mongoid/errors/inverse_not_found_spec.rb +0 -1
  634. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +0 -1
  635. data/spec/mongoid/errors/mixed_relations_spec.rb +0 -1
  636. data/spec/mongoid/errors/mongoid_error_spec.rb +22 -9
  637. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +0 -1
  638. data/spec/mongoid/errors/no_client_config_spec.rb +2 -3
  639. data/spec/mongoid/errors/no_client_database_spec.rb +3 -4
  640. data/spec/mongoid/errors/no_client_hosts_spec.rb +3 -4
  641. data/spec/mongoid/errors/no_clients_config_spec.rb +0 -1
  642. data/spec/mongoid/errors/no_environment_spec.rb +3 -4
  643. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +0 -1
  644. data/spec/mongoid/errors/no_metadata_spec.rb +0 -1
  645. data/spec/mongoid/errors/no_parent_spec.rb +0 -1
  646. data/spec/mongoid/errors/readonly_attribute_spec.rb +0 -1
  647. data/spec/mongoid/errors/readonly_document_spec.rb +2 -3
  648. data/spec/mongoid/errors/scope_overwrite_spec.rb +0 -1
  649. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -2
  650. data/spec/mongoid/errors/unknown_attribute_spec.rb +2 -3
  651. data/spec/mongoid/errors/unsaved_document_spec.rb +0 -1
  652. data/spec/mongoid/errors/unsupported_javascript_spec.rb +0 -1
  653. data/spec/mongoid/errors/validations_spec.rb +0 -1
  654. data/spec/mongoid/extensions/array_spec.rb +16 -3
  655. data/spec/mongoid/extensions/big_decimal_spec.rb +712 -213
  656. data/spec/mongoid/extensions/binary_spec.rb +44 -10
  657. data/spec/mongoid/extensions/boolean_spec.rb +68 -83
  658. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -4
  659. data/spec/mongoid/extensions/date_spec.rb +71 -2
  660. data/spec/mongoid/extensions/date_time_spec.rb +15 -10
  661. data/spec/mongoid/extensions/decimal128_spec.rb +0 -1
  662. data/spec/mongoid/extensions/false_class_spec.rb +1 -2
  663. data/spec/mongoid/extensions/float_spec.rb +53 -75
  664. data/spec/mongoid/extensions/hash_spec.rb +30 -1
  665. data/spec/mongoid/extensions/integer_spec.rb +50 -65
  666. data/spec/mongoid/extensions/module_spec.rb +0 -1
  667. data/spec/mongoid/extensions/nil_class_spec.rb +0 -1
  668. data/spec/mongoid/extensions/object_id_spec.rb +0 -1
  669. data/spec/mongoid/extensions/object_spec.rb +0 -1
  670. data/spec/mongoid/extensions/range_spec.rb +255 -55
  671. data/spec/mongoid/extensions/regexp_spec.rb +58 -34
  672. data/spec/mongoid/extensions/set_spec.rb +106 -1
  673. data/spec/mongoid/extensions/string_spec.rb +58 -31
  674. data/spec/mongoid/extensions/stringified_symbol_spec.rb +84 -0
  675. data/spec/mongoid/extensions/symbol_spec.rb +18 -26
  676. data/spec/mongoid/extensions/time_spec.rb +639 -107
  677. data/spec/mongoid/extensions/time_with_zone_spec.rb +24 -84
  678. data/spec/mongoid/extensions/true_class_spec.rb +1 -2
  679. data/spec/mongoid/extensions_spec.rb +14 -3
  680. data/spec/mongoid/factory_spec.rb +323 -30
  681. data/spec/mongoid/fields/foreign_key_spec.rb +0 -1
  682. data/spec/mongoid/fields/localized_spec.rb +84 -42
  683. data/spec/mongoid/fields/standard_spec.rb +0 -1
  684. data/spec/mongoid/fields_spec.rb +855 -118
  685. data/spec/mongoid/findable_spec.rb +518 -65
  686. data/spec/mongoid/indexable/specification_spec.rb +2 -3
  687. data/spec/mongoid/indexable_spec.rb +85 -33
  688. data/spec/mongoid/inspectable_spec.rb +37 -3
  689. data/spec/mongoid/interceptable_spec.rb +702 -104
  690. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  691. data/spec/mongoid/loggable_spec.rb +0 -1
  692. data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
  693. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +239 -0
  694. data/spec/mongoid/matcher/extract_attribute_spec.rb +36 -0
  695. data/spec/mongoid/mongoizable_spec.rb +285 -0
  696. data/spec/mongoid/persistable/creatable_spec.rb +112 -30
  697. data/spec/mongoid/persistable/deletable_spec.rb +298 -19
  698. data/spec/mongoid/persistable/destroyable_spec.rb +226 -19
  699. data/spec/mongoid/persistable/incrementable_spec.rb +45 -9
  700. data/spec/mongoid/persistable/logical_spec.rb +41 -5
  701. data/spec/mongoid/persistable/poppable_spec.rb +40 -5
  702. data/spec/mongoid/persistable/pullable_spec.rb +80 -9
  703. data/spec/mongoid/persistable/pushable_spec.rb +80 -9
  704. data/spec/mongoid/persistable/renamable_spec.rb +39 -4
  705. data/spec/mongoid/persistable/savable_spec.rb +282 -26
  706. data/spec/mongoid/persistable/settable_spec.rb +76 -10
  707. data/spec/mongoid/persistable/unsettable_spec.rb +40 -5
  708. data/spec/mongoid/persistable/updatable_spec.rb +61 -50
  709. data/spec/mongoid/persistable/upsertable_spec.rb +91 -4
  710. data/spec/mongoid/persistable_spec.rb +3 -4
  711. data/spec/mongoid/persistence_context_spec.rb +57 -59
  712. data/spec/mongoid/positional_spec.rb +0 -1
  713. data/spec/mongoid/query_cache_middleware_spec.rb +7 -5
  714. data/spec/mongoid/query_cache_spec.rb +424 -68
  715. data/spec/mongoid/relations/proxy_spec.rb +7 -8
  716. data/spec/mongoid/reloadable_spec.rb +355 -27
  717. data/spec/mongoid/scopable_spec.rb +191 -39
  718. data/spec/mongoid/selectable_spec.rb +6 -7
  719. data/spec/mongoid/serializable_spec.rb +35 -39
  720. data/spec/mongoid/shardable_models.rb +15 -1
  721. data/spec/mongoid/shardable_spec.rb +181 -32
  722. data/spec/mongoid/stateful_spec.rb +151 -10
  723. data/spec/mongoid/tasks/database_rake_spec.rb +87 -14
  724. data/spec/mongoid/tasks/database_spec.rb +128 -2
  725. data/spec/mongoid/threaded_spec.rb +2 -3
  726. data/spec/mongoid/timestamps/created/short_spec.rb +1 -2
  727. data/spec/mongoid/timestamps/created_spec.rb +1 -2
  728. data/spec/mongoid/timestamps/timeless_spec.rb +2 -3
  729. data/spec/mongoid/timestamps/updated/short_spec.rb +3 -4
  730. data/spec/mongoid/timestamps/updated_spec.rb +3 -4
  731. data/spec/mongoid/timestamps_spec.rb +398 -11
  732. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  733. data/spec/mongoid/touchable_spec.rb +525 -36
  734. data/spec/mongoid/touchable_spec_models.rb +59 -0
  735. data/spec/mongoid/traversable_spec.rb +1143 -2
  736. data/spec/mongoid/validatable/associated_spec.rb +0 -1
  737. data/spec/mongoid/validatable/format_spec.rb +0 -1
  738. data/spec/mongoid/validatable/length_spec.rb +0 -1
  739. data/spec/mongoid/validatable/numericality_spec.rb +0 -1
  740. data/spec/mongoid/validatable/presence_spec.rb +26 -23
  741. data/spec/mongoid/validatable/uniqueness_spec.rb +125 -99
  742. data/spec/mongoid/validatable_spec.rb +3 -4
  743. data/spec/mongoid/warnings_spec.rb +35 -0
  744. data/spec/mongoid_spec.rb +35 -10
  745. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -3
  746. data/spec/rails/mongoid_spec.rb +4 -17
  747. data/spec/shared/LICENSE +20 -0
  748. data/spec/shared/bin/get-mongodb-download-url +17 -0
  749. data/spec/shared/bin/s3-copy +45 -0
  750. data/spec/shared/bin/s3-upload +69 -0
  751. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  752. data/spec/shared/lib/mrss/cluster_config.rb +231 -0
  753. data/spec/shared/lib/mrss/constraints.rb +378 -0
  754. data/spec/shared/lib/mrss/docker_runner.rb +298 -0
  755. data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
  756. data/spec/shared/lib/mrss/event_subscriber.rb +210 -0
  757. data/spec/shared/lib/mrss/lite_constraints.rb +238 -0
  758. data/spec/shared/lib/mrss/server_version_registry.rb +113 -0
  759. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  760. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  761. data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
  762. data/spec/shared/lib/mrss/utils.rb +37 -0
  763. data/spec/shared/share/Dockerfile.erb +321 -0
  764. data/spec/shared/share/haproxy-1.conf +16 -0
  765. data/spec/shared/share/haproxy-2.conf +17 -0
  766. data/spec/shared/shlib/config.sh +27 -0
  767. data/spec/shared/shlib/distro.sh +74 -0
  768. data/spec/shared/shlib/server.sh +416 -0
  769. data/spec/shared/shlib/set_env.sh +169 -0
  770. data/spec/spec_helper.rb +24 -54
  771. data/spec/support/authorization.rb +0 -1
  772. data/spec/support/client_registry.rb +9 -0
  773. data/spec/support/constraints.rb +34 -197
  774. data/spec/support/expectations.rb +0 -1
  775. data/spec/support/helpers.rb +1 -1
  776. data/spec/support/immutable_ids.rb +118 -0
  777. data/spec/support/macros.rb +109 -1
  778. data/spec/{app → support}/models/account.rb +1 -2
  779. data/spec/{app → support}/models/acolyte.rb +0 -1
  780. data/spec/{app → support}/models/actor.rb +1 -2
  781. data/spec/{app → support}/models/actress.rb +0 -1
  782. data/spec/{app → support}/models/address.rb +4 -1
  783. data/spec/{app → support}/models/address_component.rb +0 -1
  784. data/spec/{app → support}/models/address_number.rb +0 -1
  785. data/spec/{app → support}/models/agency.rb +0 -1
  786. data/spec/{app → support}/models/agent.rb +0 -1
  787. data/spec/{app → support}/models/album.rb +0 -1
  788. data/spec/{app → support}/models/alert.rb +0 -1
  789. data/spec/{app → support}/models/animal.rb +0 -1
  790. data/spec/{app → support}/models/answer.rb +0 -1
  791. data/spec/{app → support}/models/appointment.rb +0 -1
  792. data/spec/support/models/armrest.rb +9 -0
  793. data/spec/{app → support}/models/array_field.rb +0 -1
  794. data/spec/{app → support}/models/article.rb +0 -1
  795. data/spec/{app → support}/models/artist.rb +2 -2
  796. data/spec/{app → support}/models/artwork.rb +0 -1
  797. data/spec/support/models/audible_sound.rb +3 -0
  798. data/spec/{app → support}/models/audio.rb +0 -1
  799. data/spec/support/models/augmentation.rb +25 -0
  800. data/spec/{app → support}/models/author.rb +0 -1
  801. data/spec/{app → support}/models/baby.rb +0 -1
  802. data/spec/{app → support}/models/band.rb +8 -1
  803. data/spec/{app → support}/models/bar.rb +0 -1
  804. data/spec/{app → support}/models/basic.rb +0 -1
  805. data/spec/{app → support}/models/bed.rb +0 -1
  806. data/spec/{app → support}/models/big_palette.rb +0 -1
  807. data/spec/{app → support}/models/birthday.rb +0 -1
  808. data/spec/support/models/bolt.rb +7 -0
  809. data/spec/{app → support}/models/bomb.rb +0 -1
  810. data/spec/{app → support}/models/book.rb +1 -1
  811. data/spec/{app → support}/models/breed.rb +0 -1
  812. data/spec/{app → support}/models/browser.rb +1 -2
  813. data/spec/{app → support}/models/building.rb +2 -1
  814. data/spec/{app → support}/models/building_address.rb +0 -1
  815. data/spec/{app → support}/models/bus.rb +0 -1
  816. data/spec/{app → support}/models/business.rb +0 -1
  817. data/spec/{app → support}/models/callback_test.rb +0 -1
  818. data/spec/{app → support}/models/canvas.rb +1 -2
  819. data/spec/{app → support}/models/car.rb +0 -1
  820. data/spec/{app → support}/models/cat.rb +0 -1
  821. data/spec/support/models/catalog.rb +24 -0
  822. data/spec/{app → support}/models/category.rb +0 -1
  823. data/spec/{app → support}/models/child.rb +0 -1
  824. data/spec/{app → support}/models/child_doc.rb +3 -4
  825. data/spec/{app → support}/models/church.rb +0 -1
  826. data/spec/{app → support}/models/circle.rb +0 -1
  827. data/spec/{app → support}/models/circuit.rb +0 -1
  828. data/spec/{app → support}/models/circus.rb +3 -1
  829. data/spec/{app → support}/models/code.rb +2 -1
  830. data/spec/{app → support}/models/coding/pull_request.rb +0 -1
  831. data/spec/support/models/coding.rb +3 -0
  832. data/spec/{app → support}/models/comment.rb +0 -1
  833. data/spec/{app → support}/models/company.rb +0 -1
  834. data/spec/{app → support}/models/consumption_period.rb +0 -1
  835. data/spec/{app → support}/models/contextable_item.rb +0 -1
  836. data/spec/{app → support}/models/contractor.rb +0 -1
  837. data/spec/{app → support}/models/cookie.rb +0 -1
  838. data/spec/{app → support}/models/country_code.rb +2 -1
  839. data/spec/{app → support}/models/courier_job.rb +0 -1
  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 +0 -1
  846. data/spec/{app → support}/models/delegating_patient.rb +0 -1
  847. data/spec/{app → support}/models/description.rb +0 -1
  848. data/spec/{app → support}/models/dictionary.rb +6 -1
  849. data/spec/{app → support}/models/division.rb +0 -1
  850. data/spec/{app → support}/models/doctor.rb +0 -1
  851. data/spec/{app → support}/models/dog.rb +0 -1
  852. data/spec/{app → support}/models/dokument.rb +0 -1
  853. data/spec/{app → support}/models/draft.rb +0 -1
  854. data/spec/{app → support}/models/dragon.rb +0 -1
  855. data/spec/{app → support}/models/driver.rb +1 -2
  856. data/spec/{app → support}/models/drug.rb +0 -1
  857. data/spec/{app → support}/models/dungeon.rb +0 -1
  858. data/spec/{app → support}/models/edit.rb +0 -1
  859. data/spec/{app → support}/models/email.rb +0 -1
  860. data/spec/{app → support}/models/employer.rb +0 -1
  861. data/spec/{app → support}/models/entry.rb +0 -1
  862. data/spec/{app → support}/models/eraser.rb +0 -1
  863. data/spec/{app → support}/models/even.rb +0 -1
  864. data/spec/{app → support}/models/event.rb +0 -1
  865. data/spec/{app → support}/models/exhibition.rb +0 -1
  866. data/spec/{app → support}/models/exhibitor.rb +0 -1
  867. data/spec/{app → support}/models/explosion.rb +0 -1
  868. data/spec/{app → support}/models/eye.rb +0 -1
  869. data/spec/{app → support}/models/eye_bowl.rb +0 -1
  870. data/spec/{app → support}/models/face.rb +0 -1
  871. data/spec/support/models/fanatic.rb +8 -0
  872. data/spec/{app → support}/models/favorite.rb +0 -1
  873. data/spec/{app → support}/models/filesystem.rb +0 -1
  874. data/spec/{app → support}/models/fire_hydrant.rb +0 -1
  875. data/spec/{app → support}/models/firefox.rb +0 -1
  876. data/spec/{app → support}/models/fish.rb +0 -1
  877. data/spec/{app → support}/models/folder.rb +0 -1
  878. data/spec/{app → support}/models/folder_item.rb +0 -1
  879. data/spec/{app → support}/models/fruits.rb +0 -1
  880. data/spec/{app → support}/models/game.rb +0 -1
  881. data/spec/{app → support}/models/ghost.rb +0 -1
  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 +0 -1
  885. data/spec/{app → support}/models/house.rb +0 -1
  886. data/spec/{app → support}/models/html_writer.rb +0 -1
  887. data/spec/{app → support}/models/id_key.rb +0 -1
  888. data/spec/support/models/idnodef.rb +7 -0
  889. data/spec/{app → support}/models/image.rb +0 -1
  890. data/spec/{app → support}/models/implant.rb +9 -1
  891. data/spec/support/models/instrument.rb +8 -0
  892. data/spec/{app → support}/models/item.rb +1 -2
  893. data/spec/{app → support}/models/jar.rb +0 -1
  894. data/spec/{app → support}/models/kaleidoscope.rb +0 -1
  895. data/spec/{app → support}/models/kangaroo.rb +0 -1
  896. data/spec/{app → support}/models/label.rb +4 -2
  897. data/spec/{app → support}/models/language.rb +0 -1
  898. data/spec/{app → support}/models/lat_lng.rb +0 -1
  899. data/spec/{app → support}/models/league.rb +0 -1
  900. data/spec/{app → support}/models/learner.rb +0 -1
  901. data/spec/{app → support}/models/line_item.rb +0 -1
  902. data/spec/{app → support}/models/location.rb +0 -1
  903. data/spec/{app → support}/models/login.rb +0 -1
  904. data/spec/{app → support}/models/manufacturer.rb +0 -1
  905. data/spec/{app → support}/models/meat.rb +0 -1
  906. data/spec/{app → support}/models/membership.rb +1 -1
  907. data/spec/{app → support}/models/message.rb +0 -1
  908. data/spec/{app → support}/models/minim.rb +0 -1
  909. data/spec/{app → support}/models/mixed_drink.rb +0 -1
  910. data/spec/support/models/mop.rb +24 -0
  911. data/spec/{app → support}/models/movie.rb +0 -1
  912. data/spec/{app → support}/models/my_hash.rb +0 -1
  913. data/spec/{app → support}/models/name.rb +0 -1
  914. data/spec/{app → support}/models/name_only.rb +0 -1
  915. data/spec/{app → support}/models/node.rb +0 -1
  916. data/spec/{app → support}/models/note.rb +0 -1
  917. data/spec/support/models/nut.rb +7 -0
  918. data/spec/{app → support}/models/odd.rb +0 -1
  919. data/spec/support/models/order.rb +12 -0
  920. data/spec/{app → support}/models/ordered_post.rb +1 -2
  921. data/spec/{app → support}/models/ordered_preference.rb +0 -1
  922. data/spec/{app → support}/models/oscar.rb +0 -1
  923. data/spec/{app → support}/models/other_owner_object.rb +0 -1
  924. data/spec/{app → support}/models/override.rb +0 -1
  925. data/spec/{app → support}/models/ownable.rb +0 -1
  926. data/spec/{app → support}/models/owner.rb +2 -1
  927. data/spec/{app → support}/models/pack.rb +0 -1
  928. data/spec/{app → support}/models/page.rb +0 -1
  929. data/spec/{app → support}/models/page_question.rb +0 -1
  930. data/spec/{app → support}/models/palette.rb +1 -2
  931. data/spec/{app → support}/models/parent.rb +0 -1
  932. data/spec/{app → support}/models/parent_doc.rb +0 -1
  933. data/spec/support/models/passport.rb +22 -0
  934. data/spec/{app → support}/models/patient.rb +0 -1
  935. data/spec/{app → support}/models/pdf_writer.rb +0 -1
  936. data/spec/{app → support}/models/pencil.rb +0 -1
  937. data/spec/{app → support}/models/person.rb +20 -2
  938. data/spec/{app → support}/models/pet.rb +0 -1
  939. data/spec/{app → support}/models/pet_owner.rb +0 -1
  940. data/spec/{app → support}/models/phone.rb +3 -2
  941. data/spec/support/models/piano.rb +4 -0
  942. data/spec/{app → support}/models/pizza.rb +0 -1
  943. data/spec/{app → support}/models/player.rb +2 -1
  944. data/spec/{app → support}/models/post.rb +0 -1
  945. data/spec/{app → support}/models/post_genre.rb +0 -1
  946. data/spec/support/models/powerup.rb +25 -0
  947. data/spec/{app → support}/models/preference.rb +0 -1
  948. data/spec/{app → support}/models/princess.rb +0 -1
  949. data/spec/{app → support}/models/product.rb +1 -1
  950. data/spec/support/models/profile.rb +17 -0
  951. data/spec/{app → support}/models/pronunciation.rb +0 -1
  952. data/spec/{app → support}/models/pub.rb +0 -1
  953. data/spec/{app → support}/models/publication/encyclopedia.rb +0 -1
  954. data/spec/{app → support}/models/publication/review.rb +0 -1
  955. data/spec/support/models/publication.rb +4 -0
  956. data/spec/{app → support}/models/purchase.rb +0 -1
  957. data/spec/support/models/purchased_item.rb +10 -0
  958. data/spec/{app → support}/models/question.rb +0 -1
  959. data/spec/{app → support}/models/quiz.rb +0 -1
  960. data/spec/{app → support}/models/rating.rb +0 -1
  961. data/spec/{app → support}/models/record.rb +0 -1
  962. data/spec/{app → support}/models/registry.rb +1 -1
  963. data/spec/{app → support}/models/role.rb +0 -1
  964. data/spec/{app → support}/models/root_category.rb +0 -1
  965. data/spec/{app → support}/models/sandwich.rb +0 -1
  966. data/spec/{app → support}/models/scheduler.rb +0 -1
  967. data/spec/support/models/school.rb +14 -0
  968. data/spec/{app/models/profile.rb → support/models/scribe.rb} +2 -3
  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 +0 -1
  972. data/spec/{app → support}/models/series.rb +1 -1
  973. data/spec/{app → support}/models/server.rb +0 -1
  974. data/spec/{app → support}/models/service.rb +0 -1
  975. data/spec/{app → support}/models/shape.rb +2 -3
  976. data/spec/{app → support}/models/shelf.rb +0 -1
  977. data/spec/support/models/shield.rb +18 -0
  978. data/spec/{app → support}/models/shipment_address.rb +0 -1
  979. data/spec/{app → support}/models/shipping_container.rb +0 -1
  980. data/spec/{app → support}/models/shipping_pack.rb +0 -1
  981. data/spec/support/models/shirt.rb +11 -0
  982. data/spec/{app → support}/models/shop.rb +0 -1
  983. data/spec/{app → support}/models/short_agent.rb +0 -1
  984. data/spec/{app → support}/models/short_quiz.rb +0 -1
  985. data/spec/{app → support}/models/simple.rb +0 -1
  986. data/spec/{app → support}/models/slave.rb +0 -1
  987. data/spec/{app → support}/models/song.rb +0 -1
  988. data/spec/{app → support}/models/sound.rb +0 -1
  989. data/spec/support/models/spacer.rb +7 -0
  990. data/spec/{app → support}/models/square.rb +0 -1
  991. data/spec/{app → support}/models/staff.rb +0 -1
  992. data/spec/{app → support}/models/store_as_dup_test1.rb +0 -1
  993. data/spec/{app → support}/models/store_as_dup_test2.rb +0 -1
  994. data/spec/{app → support}/models/store_as_dup_test3.rb +0 -1
  995. data/spec/{app → support}/models/store_as_dup_test4.rb +0 -1
  996. data/spec/{app → support}/models/strategy.rb +0 -1
  997. data/spec/support/models/student.rb +14 -0
  998. data/spec/{app → support}/models/sub_item.rb +0 -1
  999. data/spec/{app → support}/models/subscription.rb +0 -1
  1000. data/spec/{app → support}/models/survey.rb +0 -1
  1001. data/spec/{app → support}/models/symptom.rb +0 -1
  1002. data/spec/support/models/system_role.rb +7 -0
  1003. data/spec/{app → support}/models/tag.rb +0 -1
  1004. data/spec/{app → support}/models/target.rb +0 -1
  1005. data/spec/{app → support}/models/template.rb +0 -1
  1006. data/spec/{app → support}/models/thing.rb +0 -1
  1007. data/spec/support/models/threadlocker.rb +7 -0
  1008. data/spec/{app → support}/models/title.rb +0 -1
  1009. data/spec/{app → support}/models/tool.rb +2 -3
  1010. data/spec/{app → support}/models/topping.rb +0 -1
  1011. data/spec/support/models/toy.rb +9 -0
  1012. data/spec/{app → support}/models/track.rb +0 -1
  1013. data/spec/{app → support}/models/translation.rb +0 -1
  1014. data/spec/{app → support}/models/tree.rb +0 -1
  1015. data/spec/{app → support}/models/truck.rb +2 -1
  1016. data/spec/{app → support}/models/updatable.rb +0 -1
  1017. data/spec/{app → support}/models/user.rb +0 -1
  1018. data/spec/{app → support}/models/user_account.rb +0 -1
  1019. data/spec/{app → support}/models/validation_callback.rb +0 -1
  1020. data/spec/{app → support}/models/vehicle.rb +7 -3
  1021. data/spec/{app → support}/models/version.rb +0 -1
  1022. data/spec/{app → support}/models/vertex.rb +0 -1
  1023. data/spec/{app → support}/models/vet_visit.rb +0 -1
  1024. data/spec/{app → support}/models/video.rb +0 -1
  1025. data/spec/{app → support}/models/video_game.rb +0 -1
  1026. data/spec/support/models/washer.rb +7 -0
  1027. data/spec/support/models/weapon.rb +25 -0
  1028. data/spec/{app → support}/models/wiki_page.rb +1 -1
  1029. data/spec/{app → support}/models/word.rb +0 -1
  1030. data/spec/{app → support}/models/word_origin.rb +0 -1
  1031. data/spec/{app → support}/models/writer.rb +2 -3
  1032. data/spec/support/schema_maps/schema_map_aws.json +17 -0
  1033. data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
  1034. data/spec/support/schema_maps/schema_map_azure.json +17 -0
  1035. data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
  1036. data/spec/support/schema_maps/schema_map_gcp.json +17 -0
  1037. data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
  1038. data/spec/support/schema_maps/schema_map_kmip.json +17 -0
  1039. data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
  1040. data/spec/support/schema_maps/schema_map_local.json +18 -0
  1041. data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
  1042. data/spec/support/shared/time.rb +0 -1
  1043. data/spec/support/spec_config.rb +28 -6
  1044. data.tar.gz.sig +0 -0
  1045. metadata +1216 -799
  1046. metadata.gz.sig +0 -0
  1047. data/lib/mongoid/errors/eager_load.rb +0 -26
  1048. data/lib/mongoid/errors/invalid_value.rb +0 -18
  1049. data/lib/mongoid/matchable/all.rb +0 -30
  1050. data/lib/mongoid/matchable/and.rb +0 -32
  1051. data/lib/mongoid/matchable/default.rb +0 -121
  1052. data/lib/mongoid/matchable/elem_match.rb +0 -36
  1053. data/lib/mongoid/matchable/eq.rb +0 -23
  1054. data/lib/mongoid/matchable/exists.rb +0 -25
  1055. data/lib/mongoid/matchable/gt.rb +0 -25
  1056. data/lib/mongoid/matchable/gte.rb +0 -25
  1057. data/lib/mongoid/matchable/in.rb +0 -26
  1058. data/lib/mongoid/matchable/lt.rb +0 -25
  1059. data/lib/mongoid/matchable/lte.rb +0 -25
  1060. data/lib/mongoid/matchable/ne.rb +0 -23
  1061. data/lib/mongoid/matchable/nin.rb +0 -24
  1062. data/lib/mongoid/matchable/nor.rb +0 -38
  1063. data/lib/mongoid/matchable/or.rb +0 -35
  1064. data/lib/mongoid/matchable/regexp.rb +0 -30
  1065. data/lib/mongoid/matchable/size.rb +0 -23
  1066. data/lib/support/ruby_version.rb +0 -29
  1067. data/spec/app/models/augmentation.rb +0 -14
  1068. data/spec/app/models/coding.rb +0 -4
  1069. data/spec/app/models/passport.rb +0 -8
  1070. data/spec/app/models/powerup.rb +0 -14
  1071. data/spec/app/models/publication.rb +0 -5
  1072. data/spec/app/models/weapon.rb +0 -14
  1073. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -61
  1074. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -61
  1075. data/spec/mongoid/matchable/all_spec.rb +0 -34
  1076. data/spec/mongoid/matchable/and_spec.rb +0 -190
  1077. data/spec/mongoid/matchable/default_spec.rb +0 -140
  1078. data/spec/mongoid/matchable/elem_match_spec.rb +0 -109
  1079. data/spec/mongoid/matchable/eq_spec.rb +0 -49
  1080. data/spec/mongoid/matchable/exists_spec.rb +0 -60
  1081. data/spec/mongoid/matchable/gt_spec.rb +0 -89
  1082. data/spec/mongoid/matchable/gte_spec.rb +0 -87
  1083. data/spec/mongoid/matchable/in_spec.rb +0 -52
  1084. data/spec/mongoid/matchable/lt_spec.rb +0 -88
  1085. data/spec/mongoid/matchable/lte_spec.rb +0 -88
  1086. data/spec/mongoid/matchable/ne_spec.rb +0 -49
  1087. data/spec/mongoid/matchable/nin_spec.rb +0 -51
  1088. data/spec/mongoid/matchable/nor_spec.rb +0 -210
  1089. data/spec/mongoid/matchable/or_spec.rb +0 -134
  1090. data/spec/mongoid/matchable/regexp_spec.rb +0 -62
  1091. data/spec/mongoid/matchable/size_spec.rb +0 -28
  1092. data/spec/mongoid/matchable_spec.rb +0 -856
  1093. data/spec/support/cluster_config.rb +0 -158
  1094. data/spec/support/lite_constraints.rb +0 -22
@@ -1,11 +1,18 @@
1
1
  # frozen_string_literal: true
2
- # encoding: utf-8
3
2
 
4
3
  require "spec_helper"
5
4
  require_relative './interceptable_spec_models'
6
5
 
7
6
  describe Mongoid::Interceptable do
8
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
+
9
16
  class TestClass
10
17
  include Mongoid::Interceptable
11
18
 
@@ -78,7 +85,7 @@ describe Mongoid::Interceptable do
78
85
  describe ".after_find" do
79
86
 
80
87
  let!(:player) do
81
- Player.create
88
+ Player.create!
82
89
  end
83
90
 
84
91
  context "when the callback is on a root document" do
@@ -131,7 +138,7 @@ describe Mongoid::Interceptable do
131
138
  context "when the callback is on an embedded document" do
132
139
 
133
140
  let!(:implant) do
134
- player.implants.create
141
+ player.implants.create!
135
142
  end
136
143
 
137
144
  context "when when the document is instantiated" do
@@ -201,7 +208,7 @@ describe Mongoid::Interceptable do
201
208
  ]
202
209
  })
203
210
  book.id = '123'
204
- book.save
211
+ book.save!
205
212
  book
206
213
  end
207
214
 
@@ -213,7 +220,7 @@ describe Mongoid::Interceptable do
213
220
  book.pages.each do | page |
214
221
  page.notes.destroy_all
215
222
  page.notes.new(message: new_message)
216
- page.save
223
+ page.save!
217
224
  end
218
225
  end
219
226
 
@@ -276,7 +283,7 @@ describe Mongoid::Interceptable do
276
283
 
277
284
  before do
278
285
  expect(artist).to receive(:before_create_stub).once.and_return(true)
279
- artist.save
286
+ artist.save!
280
287
  end
281
288
 
282
289
  it "gets saved" do
@@ -321,7 +328,7 @@ describe Mongoid::Interceptable do
321
328
  end
322
329
 
323
330
  it "the save returns true" do
324
- expect(artist.save).to be true
331
+ expect(artist.save!).to be true
325
332
  end
326
333
  end
327
334
 
@@ -345,7 +352,7 @@ describe Mongoid::Interceptable do
345
352
  context "when updating" do
346
353
 
347
354
  let(:artist) do
348
- Artist.create(name: "Depeche Mode").tap do |artist|
355
+ Artist.create!(name: "Depeche Mode").tap do |artist|
349
356
  artist.name = "The Mountain Goats"
350
357
  end
351
358
  end
@@ -361,7 +368,7 @@ describe Mongoid::Interceptable do
361
368
  end
362
369
 
363
370
  it "the save returns true" do
364
- expect(artist.save).to be true
371
+ expect(artist.save!).to be true
365
372
  end
366
373
  end
367
374
 
@@ -386,7 +393,7 @@ describe Mongoid::Interceptable do
386
393
  describe ".before_destroy" do
387
394
 
388
395
  let(:artist) do
389
- Artist.create(name: "Depeche Mode")
396
+ Artist.create!(name: "Depeche Mode")
390
397
  end
391
398
 
392
399
  before do
@@ -431,7 +438,7 @@ describe Mongoid::Interceptable do
431
438
  end
432
439
 
433
440
  let!(:record) do
434
- moderat.records.create(name: "Moderat")
441
+ moderat.records.create!(name: "Moderat")
435
442
  end
436
443
 
437
444
  before do
@@ -545,7 +552,7 @@ describe Mongoid::Interceptable do
545
552
 
546
553
  it "does not cascade to the child" do
547
554
  Band.accepts_nested_attributes_for :records, allow_destroy: true
548
- expect(band.update_attributes(attributes)).to be true
555
+ expect(band.update_attributes!(attributes)).to be true
549
556
  end
550
557
  end
551
558
  end
@@ -573,10 +580,22 @@ describe Mongoid::Interceptable do
573
580
  end
574
581
 
575
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
576
591
 
577
- it "only executes the callbacks once for each embed" do
578
- expect(note).to receive(:update_saved).twice
579
- band.save
592
+ context 'with prevent_multiple_calls_of_embedded_callbacks disabled' do
593
+ config_override :prevent_multiple_calls_of_embedded_callbacks, false
594
+
595
+ it "executes the callbacks once for each ember" do
596
+ expect(note).to receive(:update_saved).twice
597
+ band.save!
598
+ end
580
599
  end
581
600
  end
582
601
  end
@@ -585,7 +604,7 @@ describe Mongoid::Interceptable do
585
604
  context "when cascading after initialize" do
586
605
 
587
606
  let!(:person) do
588
- Person.create
607
+ Person.create!
589
608
  end
590
609
 
591
610
  before do
@@ -624,7 +643,7 @@ describe Mongoid::Interceptable do
624
643
  end
625
644
 
626
645
  before do
627
- band.save
646
+ band.save!
628
647
  end
629
648
 
630
649
  it "executes the callback" do
@@ -635,7 +654,7 @@ describe Mongoid::Interceptable do
635
654
  context "when the parent is persisted" do
636
655
 
637
656
  let(:band) do
638
- Band.create(name: "Moderat")
657
+ Band.create!(name: "Moderat")
639
658
  end
640
659
 
641
660
  let!(:label) do
@@ -643,7 +662,7 @@ describe Mongoid::Interceptable do
643
662
  end
644
663
 
645
664
  before do
646
- band.save
665
+ band.save!
647
666
  end
648
667
 
649
668
  it "executes the callback" do
@@ -655,7 +674,7 @@ describe Mongoid::Interceptable do
655
674
  context "when the child is persisted" do
656
675
 
657
676
  let(:band) do
658
- Band.create(name: "Moderat")
677
+ Band.create!(name: "Moderat")
659
678
  end
660
679
 
661
680
  let!(:label) do
@@ -664,7 +683,7 @@ describe Mongoid::Interceptable do
664
683
 
665
684
  before do
666
685
  label.after_create_called = false
667
- band.save
686
+ band.save!
668
687
  end
669
688
 
670
689
  it "does not execute the callback" do
@@ -688,7 +707,7 @@ describe Mongoid::Interceptable do
688
707
  end
689
708
 
690
709
  before do
691
- band.save
710
+ band.save!
692
711
  end
693
712
 
694
713
  it "executes the callback" do
@@ -699,7 +718,7 @@ describe Mongoid::Interceptable do
699
718
  context "when the parent is persisted" do
700
719
 
701
720
  let(:band) do
702
- Band.create(name: "Moderat")
721
+ Band.create!(name: "Moderat")
703
722
  end
704
723
 
705
724
  let!(:label) do
@@ -707,7 +726,7 @@ describe Mongoid::Interceptable do
707
726
  end
708
727
 
709
728
  before do
710
- band.save
729
+ band.save!
711
730
  end
712
731
 
713
732
  it "executes the callback" do
@@ -719,7 +738,7 @@ describe Mongoid::Interceptable do
719
738
  context "when the child is persisted" do
720
739
 
721
740
  let(:band) do
722
- Band.create(name: "Moderat")
741
+ Band.create!(name: "Moderat")
723
742
  end
724
743
 
725
744
  let!(:label) do
@@ -727,7 +746,7 @@ describe Mongoid::Interceptable do
727
746
  end
728
747
 
729
748
  before do
730
- band.save
749
+ band.save!
731
750
  end
732
751
 
733
752
  it "executes the callback" do
@@ -751,7 +770,7 @@ describe Mongoid::Interceptable do
751
770
  end
752
771
 
753
772
  before do
754
- band.save
773
+ band.save!
755
774
  end
756
775
 
757
776
  it "does not execute the callback" do
@@ -762,7 +781,7 @@ describe Mongoid::Interceptable do
762
781
  context "when the parent is persisted" do
763
782
 
764
783
  let(:band) do
765
- Band.create(name: "Moderat")
784
+ Band.create!(name: "Moderat")
766
785
  end
767
786
 
768
787
  let!(:label) do
@@ -770,7 +789,7 @@ describe Mongoid::Interceptable do
770
789
  end
771
790
 
772
791
  before do
773
- band.save
792
+ band.save!
774
793
  end
775
794
 
776
795
  it "does not execute the callback" do
@@ -782,7 +801,7 @@ describe Mongoid::Interceptable do
782
801
  context "when the child is persisted" do
783
802
 
784
803
  let(:band) do
785
- Band.create(name: "Moderat")
804
+ Band.create!(name: "Moderat")
786
805
  end
787
806
 
788
807
  context "when the child is dirty" do
@@ -793,7 +812,7 @@ describe Mongoid::Interceptable do
793
812
 
794
813
  before do
795
814
  label.name = "Nothing"
796
- band.save
815
+ band.save!
797
816
  end
798
817
 
799
818
  it "executes the callback" do
@@ -808,7 +827,7 @@ describe Mongoid::Interceptable do
808
827
  end
809
828
 
810
829
  before do
811
- band.save
830
+ band.save!
812
831
  end
813
832
 
814
833
  it "does not execute the callback" do
@@ -833,7 +852,7 @@ describe Mongoid::Interceptable do
833
852
  end
834
853
 
835
854
  before do
836
- band.save
855
+ band.save!
837
856
  end
838
857
 
839
858
  it "executes the callback" do
@@ -844,7 +863,7 @@ describe Mongoid::Interceptable do
844
863
  context "when the parent is persisted" do
845
864
 
846
865
  let(:band) do
847
- Band.create(name: "Moderat")
866
+ Band.create!(name: "Moderat")
848
867
  end
849
868
 
850
869
  let!(:label) do
@@ -852,7 +871,7 @@ describe Mongoid::Interceptable do
852
871
  end
853
872
 
854
873
  before do
855
- band.save
874
+ band.save!
856
875
  end
857
876
 
858
877
  it "executes the callback" do
@@ -864,7 +883,7 @@ describe Mongoid::Interceptable do
864
883
  context "when the child is persisted" do
865
884
 
866
885
  let(:band) do
867
- Band.create(name: "Moderat")
886
+ Band.create!(name: "Moderat")
868
887
  end
869
888
 
870
889
  let!(:label) do
@@ -872,7 +891,7 @@ describe Mongoid::Interceptable do
872
891
  end
873
892
 
874
893
  before do
875
- band.save
894
+ band.save!
876
895
  end
877
896
 
878
897
  it "executes the callback" do
@@ -896,7 +915,7 @@ describe Mongoid::Interceptable do
896
915
  end
897
916
 
898
917
  before do
899
- band.save
918
+ band.save!
900
919
  end
901
920
 
902
921
  it "executes the callback" do
@@ -907,7 +926,7 @@ describe Mongoid::Interceptable do
907
926
  context "when the parent is persisted" do
908
927
 
909
928
  let(:band) do
910
- Band.create(name: "Moderat")
929
+ Band.create!(name: "Moderat")
911
930
  end
912
931
 
913
932
  let!(:record) do
@@ -915,7 +934,7 @@ describe Mongoid::Interceptable do
915
934
  end
916
935
 
917
936
  before do
918
- band.save
937
+ band.save!
919
938
  end
920
939
 
921
940
  it "executes the callback" do
@@ -927,16 +946,16 @@ describe Mongoid::Interceptable do
927
946
  context "when the child is persisted" do
928
947
 
929
948
  let(:band) do
930
- Band.create(name: "Moderat")
949
+ Band.create!(name: "Moderat")
931
950
  end
932
951
 
933
952
  let!(:record) do
934
- band.records.create(name: "Moderat")
953
+ band.records.create!(name: "Moderat")
935
954
  end
936
955
 
937
956
  before do
938
957
  record.before_create_called = false
939
- band.save
958
+ band.save!
940
959
  end
941
960
 
942
961
  it "does not execute the callback" do
@@ -960,7 +979,7 @@ describe Mongoid::Interceptable do
960
979
  end
961
980
 
962
981
  before do
963
- band.save
982
+ band.save!
964
983
  end
965
984
 
966
985
  it "executes the callback" do
@@ -975,7 +994,7 @@ describe Mongoid::Interceptable do
975
994
  context "when the parent is persisted" do
976
995
 
977
996
  let(:band) do
978
- Band.create(name: "Moderat")
997
+ Band.create!(name: "Moderat")
979
998
  end
980
999
 
981
1000
  let!(:record) do
@@ -983,7 +1002,7 @@ describe Mongoid::Interceptable do
983
1002
  end
984
1003
 
985
1004
  before do
986
- band.save
1005
+ band.save!
987
1006
  end
988
1007
 
989
1008
  it "executes the callback" do
@@ -999,15 +1018,15 @@ describe Mongoid::Interceptable do
999
1018
  context "when the child is persisted" do
1000
1019
 
1001
1020
  let(:band) do
1002
- Band.create(name: "Moderat")
1021
+ Band.create!(name: "Moderat")
1003
1022
  end
1004
1023
 
1005
1024
  let!(:record) do
1006
- band.records.create(name: "Moderat")
1025
+ band.records.create!(name: "Moderat")
1007
1026
  end
1008
1027
 
1009
1028
  before do
1010
- band.save
1029
+ band.save!
1011
1030
  end
1012
1031
 
1013
1032
  it "executes the callback" do
@@ -1022,7 +1041,7 @@ describe Mongoid::Interceptable do
1022
1041
  context "when the child is created" do
1023
1042
 
1024
1043
  let!(:band) do
1025
- Band.create
1044
+ Band.create!
1026
1045
  end
1027
1046
 
1028
1047
  let!(:label) do
@@ -1050,7 +1069,7 @@ describe Mongoid::Interceptable do
1050
1069
  end
1051
1070
 
1052
1071
  before do
1053
- band.save
1072
+ band.save!
1054
1073
  end
1055
1074
 
1056
1075
  it "does not execute the callback" do
@@ -1061,7 +1080,7 @@ describe Mongoid::Interceptable do
1061
1080
  context "when the parent is persisted" do
1062
1081
 
1063
1082
  let(:band) do
1064
- Band.create(name: "Moderat")
1083
+ Band.create!(name: "Moderat")
1065
1084
  end
1066
1085
 
1067
1086
  let!(:record) do
@@ -1069,7 +1088,7 @@ describe Mongoid::Interceptable do
1069
1088
  end
1070
1089
 
1071
1090
  before do
1072
- band.save
1091
+ band.save!
1073
1092
  end
1074
1093
 
1075
1094
  it "does not execute the callback" do
@@ -1081,18 +1100,18 @@ describe Mongoid::Interceptable do
1081
1100
  context "when the child is persisted" do
1082
1101
 
1083
1102
  let(:band) do
1084
- Band.create(name: "Moderat")
1103
+ Band.create!(name: "Moderat")
1085
1104
  end
1086
1105
 
1087
1106
  let!(:record) do
1088
- band.records.create(name: "Moderat")
1107
+ band.records.create!(name: "Moderat")
1089
1108
  end
1090
1109
 
1091
1110
  context "when the child is dirty" do
1092
1111
 
1093
1112
  before do
1094
1113
  record.name = "Nothing"
1095
- band.save
1114
+ band.save!
1096
1115
  end
1097
1116
 
1098
1117
  it "executes the callback" do
@@ -1107,7 +1126,7 @@ describe Mongoid::Interceptable do
1107
1126
  context "when the child is not dirty" do
1108
1127
 
1109
1128
  before do
1110
- band.save
1129
+ band.save!
1111
1130
  end
1112
1131
 
1113
1132
  it "does not execute the callback" do
@@ -1132,7 +1151,7 @@ describe Mongoid::Interceptable do
1132
1151
  end
1133
1152
 
1134
1153
  before do
1135
- band.save
1154
+ band.save!
1136
1155
  end
1137
1156
 
1138
1157
  it "executes the callback" do
@@ -1147,7 +1166,7 @@ describe Mongoid::Interceptable do
1147
1166
  context "when the parent is persisted" do
1148
1167
 
1149
1168
  let(:band) do
1150
- Band.create(name: "Moderat")
1169
+ Band.create!(name: "Moderat")
1151
1170
  end
1152
1171
 
1153
1172
  let!(:record) do
@@ -1155,7 +1174,7 @@ describe Mongoid::Interceptable do
1155
1174
  end
1156
1175
 
1157
1176
  before do
1158
- band.save
1177
+ band.save!
1159
1178
  end
1160
1179
 
1161
1180
  it "executes the callback" do
@@ -1170,7 +1189,7 @@ describe Mongoid::Interceptable do
1170
1189
  context 'when the parent is updated' do
1171
1190
 
1172
1191
  let(:band) do
1173
- Band.create(name: "Moderat")
1192
+ Band.create!(name: "Moderat")
1174
1193
  end
1175
1194
 
1176
1195
  before do
@@ -1190,7 +1209,7 @@ describe Mongoid::Interceptable do
1190
1209
  context 'when the parent is updated' do
1191
1210
 
1192
1211
  let(:band) do
1193
- Band.create(name: "Moderat")
1212
+ Band.create!(name: "Moderat")
1194
1213
  end
1195
1214
 
1196
1215
  before do
@@ -1209,15 +1228,15 @@ describe Mongoid::Interceptable do
1209
1228
  context "when the child is persisted" do
1210
1229
 
1211
1230
  let(:band) do
1212
- Band.create(name: "Moderat")
1231
+ Band.create!(name: "Moderat")
1213
1232
  end
1214
1233
 
1215
1234
  let!(:record) do
1216
- band.records.create(name: "Moderat")
1235
+ band.records.create!(name: "Moderat")
1217
1236
  end
1218
1237
 
1219
1238
  before do
1220
- band.save
1239
+ band.save!
1221
1240
  end
1222
1241
 
1223
1242
  it "executes the callback" do
@@ -1252,7 +1271,7 @@ describe Mongoid::Interceptable do
1252
1271
  end
1253
1272
 
1254
1273
  before do
1255
- band.save
1274
+ band.save!
1256
1275
  end
1257
1276
 
1258
1277
  it "executes the callback" do
@@ -1263,7 +1282,7 @@ describe Mongoid::Interceptable do
1263
1282
  context "when the root is persisted" do
1264
1283
 
1265
1284
  let(:band) do
1266
- Band.create(name: "Moderat")
1285
+ Band.create!(name: "Moderat")
1267
1286
  end
1268
1287
 
1269
1288
  let!(:record) do
@@ -1275,7 +1294,7 @@ describe Mongoid::Interceptable do
1275
1294
  end
1276
1295
 
1277
1296
  before do
1278
- band.save
1297
+ band.save!
1279
1298
  end
1280
1299
 
1281
1300
  it "executes the callback" do
@@ -1287,20 +1306,20 @@ describe Mongoid::Interceptable do
1287
1306
  context "when the child is persisted" do
1288
1307
 
1289
1308
  let(:band) do
1290
- Band.create(name: "Moderat")
1309
+ Band.create!(name: "Moderat")
1291
1310
  end
1292
1311
 
1293
1312
  let!(:record) do
1294
- band.records.create(name: "Moderat")
1313
+ band.records.create!(name: "Moderat")
1295
1314
  end
1296
1315
 
1297
1316
  let!(:track) do
1298
- record.tracks.create(name: "Berlin")
1317
+ record.tracks.create!(name: "Berlin")
1299
1318
  end
1300
1319
 
1301
1320
  before do
1302
1321
  track.before_create_called = false
1303
- band.save
1322
+ band.save!
1304
1323
  end
1305
1324
 
1306
1325
  it "does not execute the callback" do
@@ -1328,7 +1347,7 @@ describe Mongoid::Interceptable do
1328
1347
  end
1329
1348
 
1330
1349
  before do
1331
- band.save
1350
+ band.save!
1332
1351
  end
1333
1352
 
1334
1353
  let(:reloaded) do
@@ -1347,7 +1366,7 @@ describe Mongoid::Interceptable do
1347
1366
  context "when the parent is persisted" do
1348
1367
 
1349
1368
  let(:band) do
1350
- Band.create(name: "Moderat")
1369
+ Band.create!(name: "Moderat")
1351
1370
  end
1352
1371
 
1353
1372
  let!(:record) do
@@ -1359,7 +1378,7 @@ describe Mongoid::Interceptable do
1359
1378
  end
1360
1379
 
1361
1380
  before do
1362
- band.save
1381
+ band.save!
1363
1382
  end
1364
1383
 
1365
1384
  let(:reloaded) do
@@ -1379,19 +1398,19 @@ describe Mongoid::Interceptable do
1379
1398
  context "when the child is persisted" do
1380
1399
 
1381
1400
  let(:band) do
1382
- Band.create(name: "Moderat")
1401
+ Band.create!(name: "Moderat")
1383
1402
  end
1384
1403
 
1385
1404
  let!(:record) do
1386
- band.records.create(name: "Moderat")
1405
+ band.records.create!(name: "Moderat")
1387
1406
  end
1388
1407
 
1389
1408
  let!(:track) do
1390
- record.tracks.create(name: "Berlin")
1409
+ record.tracks.create!(name: "Berlin")
1391
1410
  end
1392
1411
 
1393
1412
  before do
1394
- band.save
1413
+ band.save!
1395
1414
  end
1396
1415
 
1397
1416
  let(:reloaded) do
@@ -1427,7 +1446,7 @@ describe Mongoid::Interceptable do
1427
1446
  end
1428
1447
 
1429
1448
  before do
1430
- band.save
1449
+ band.save!
1431
1450
  end
1432
1451
 
1433
1452
  it "does not execute the callback" do
@@ -1438,7 +1457,7 @@ describe Mongoid::Interceptable do
1438
1457
  context "when the parent is persisted" do
1439
1458
 
1440
1459
  let(:band) do
1441
- Band.create(name: "Moderat")
1460
+ Band.create!(name: "Moderat")
1442
1461
  end
1443
1462
 
1444
1463
  let!(:record) do
@@ -1450,7 +1469,7 @@ describe Mongoid::Interceptable do
1450
1469
  end
1451
1470
 
1452
1471
  before do
1453
- band.save
1472
+ band.save!
1454
1473
  end
1455
1474
 
1456
1475
  it "does not execute the callback" do
@@ -1462,22 +1481,22 @@ describe Mongoid::Interceptable do
1462
1481
  context "when the child is persisted" do
1463
1482
 
1464
1483
  let(:band) do
1465
- Band.create(name: "Moderat")
1484
+ Band.create!(name: "Moderat")
1466
1485
  end
1467
1486
 
1468
1487
  let!(:record) do
1469
- band.records.create(name: "Moderat")
1488
+ band.records.create!(name: "Moderat")
1470
1489
  end
1471
1490
 
1472
1491
  let!(:track) do
1473
- record.tracks.create(name: "Berlin")
1492
+ record.tracks.create!(name: "Berlin")
1474
1493
  end
1475
1494
 
1476
1495
  context "when the child is dirty" do
1477
1496
 
1478
1497
  before do
1479
1498
  track.name = "Rusty Nails"
1480
- band.save
1499
+ band.save!
1481
1500
  end
1482
1501
 
1483
1502
  let(:reloaded) do
@@ -1496,7 +1515,7 @@ describe Mongoid::Interceptable do
1496
1515
  context "when the child is not dirty" do
1497
1516
 
1498
1517
  before do
1499
- band.save
1518
+ band.save!
1500
1519
  end
1501
1520
 
1502
1521
  it "does not execute the callback" do
@@ -1544,7 +1563,7 @@ describe Mongoid::Interceptable do
1544
1563
  end
1545
1564
 
1546
1565
  before do
1547
- band.save
1566
+ band.save!
1548
1567
  end
1549
1568
 
1550
1569
  it "executes the callback" do
@@ -1555,7 +1574,7 @@ describe Mongoid::Interceptable do
1555
1574
  context "when the parent is persisted" do
1556
1575
 
1557
1576
  let(:band) do
1558
- Band.create(name: "Moderat")
1577
+ Band.create!(name: "Moderat")
1559
1578
  end
1560
1579
 
1561
1580
  let!(:record) do
@@ -1567,7 +1586,7 @@ describe Mongoid::Interceptable do
1567
1586
  end
1568
1587
 
1569
1588
  before do
1570
- band.save
1589
+ band.save!
1571
1590
  end
1572
1591
 
1573
1592
  it "executes the callback" do
@@ -1579,19 +1598,19 @@ describe Mongoid::Interceptable do
1579
1598
  context "when the child is persisted" do
1580
1599
 
1581
1600
  let(:band) do
1582
- Band.create(name: "Moderat")
1601
+ Band.create!(name: "Moderat")
1583
1602
  end
1584
1603
 
1585
1604
  let!(:record) do
1586
- band.records.create(name: "Moderat")
1605
+ band.records.create!(name: "Moderat")
1587
1606
  end
1588
1607
 
1589
1608
  let!(:track) do
1590
- record.tracks.create(name: "Berlin")
1609
+ record.tracks.create!(name: "Berlin")
1591
1610
  end
1592
1611
 
1593
1612
  before do
1594
- band.save
1613
+ band.save!
1595
1614
  end
1596
1615
 
1597
1616
  it "executes the callback" do
@@ -1618,11 +1637,11 @@ describe Mongoid::Interceptable do
1618
1637
  end
1619
1638
 
1620
1639
  before do
1621
- parent.save
1640
+ parent.save!
1622
1641
  end
1623
1642
 
1624
1643
  it "does not duplicate the child documents" do
1625
- parent.children.create(position: 1)
1644
+ parent.children.create!(position: 1)
1626
1645
  expect(ParentDoc.find(parent.id).children.size).to eq(1)
1627
1646
  end
1628
1647
  end
@@ -1673,7 +1692,7 @@ describe Mongoid::Interceptable do
1673
1692
  context "when updating a document" do
1674
1693
 
1675
1694
  let(:person) do
1676
- Person.create.tap do |person|
1695
+ Person.create!.tap do |person|
1677
1696
  person.attributes = {
1678
1697
  mode: :prevent_save,
1679
1698
  title: "Associate",
@@ -1707,8 +1726,8 @@ describe Mongoid::Interceptable do
1707
1726
  context "when loading a model multiple times" do
1708
1727
 
1709
1728
  before do
1710
- load "spec/app/models/callback_test.rb"
1711
- load "spec/app/models/callback_test.rb"
1729
+ load File.join(MODELS, "callback_test.rb")
1730
+ load File.join(MODELS, "callback_test.rb")
1712
1731
  end
1713
1732
 
1714
1733
  let(:callback) do
@@ -1739,8 +1758,12 @@ describe Mongoid::Interceptable do
1739
1758
  [InterceptableSpec::CbChild, :after_validation],
1740
1759
  [InterceptableSpec::CbParent, :after_validation],
1741
1760
  [InterceptableSpec::CbParent, :before_save],
1761
+ [InterceptableSpec::CbParent, :around_save_open],
1742
1762
  [InterceptableSpec::CbParent, :before_create],
1763
+ [InterceptableSpec::CbParent, :around_create_open],
1764
+ [InterceptableSpec::CbParent, :around_create_close],
1743
1765
  [InterceptableSpec::CbParent, :after_create],
1766
+ [InterceptableSpec::CbParent, :around_save_close],
1744
1767
  [InterceptableSpec::CbParent, :after_save],
1745
1768
  ]
1746
1769
  end
@@ -1762,26 +1785,601 @@ describe Mongoid::Interceptable do
1762
1785
 
1763
1786
  let(:expected) do
1764
1787
  [
1788
+ [InterceptableSpec::CbCascadedChild, :before_validation],
1789
+ [InterceptableSpec::CbCascadedChild, :after_validation],
1765
1790
  [InterceptableSpec::CbParent, :before_validation],
1766
1791
  [InterceptableSpec::CbCascadedChild, :before_validation],
1767
1792
  [InterceptableSpec::CbCascadedChild, :after_validation],
1793
+
1768
1794
  [InterceptableSpec::CbParent, :after_validation],
1769
1795
  [InterceptableSpec::CbParent, :before_save],
1770
- [InterceptableSpec::CbCascadedChild, :before_save],
1796
+ [InterceptableSpec::CbParent, :around_save_open],
1771
1797
  [InterceptableSpec::CbParent, :before_create],
1798
+ [InterceptableSpec::CbParent, :around_create_open],
1799
+
1800
+ [InterceptableSpec::CbCascadedChild, :before_save],
1801
+ [InterceptableSpec::CbCascadedChild, :around_save_open],
1772
1802
  [InterceptableSpec::CbCascadedChild, :before_create],
1773
- [InterceptableSpec::CbParent, :after_create],
1803
+ [InterceptableSpec::CbCascadedChild, :around_create_open],
1804
+
1805
+ [InterceptableSpec::CbCascadedChild, :around_create_close],
1774
1806
  [InterceptableSpec::CbCascadedChild, :after_create],
1775
- [InterceptableSpec::CbParent, :after_save],
1807
+ [InterceptableSpec::CbCascadedChild, :around_save_close],
1776
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]
1777
1814
  ]
1778
1815
  end
1779
1816
 
1780
1817
  it 'calls callbacks in the right order' do
1781
- pending 'MONGOID-3795'
1782
-
1783
1818
  parent.save!
1784
1819
  expect(registry.calls).to eq expected
1785
1820
  end
1786
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
1787
2385
  end