mongoid 7.0.13 → 8.0.8

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