mongoid-ultra 9.0.0.0.alpha1

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