mongoid 3.1.5 → 8.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1501) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +636 -33
  4. data/LICENSE +2 -1
  5. data/README.md +32 -24
  6. data/Rakefile +75 -5
  7. data/lib/config/locales/en.yml +301 -132
  8. data/lib/mongoid/association/accessors.rb +431 -0
  9. data/lib/mongoid/association/bindable.rb +227 -0
  10. data/lib/mongoid/association/builders.rb +86 -0
  11. data/lib/mongoid/association/constrainable.rb +42 -0
  12. data/lib/mongoid/association/depending.rb +128 -0
  13. data/lib/mongoid/association/eager_loadable.rb +57 -0
  14. data/lib/mongoid/association/embedded/batchable.rb +398 -0
  15. data/lib/mongoid/association/embedded/cyclic.rb +102 -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 +111 -0
  19. data/lib/mongoid/association/embedded/embedded_in.rb +135 -0
  20. data/lib/mongoid/association/embedded/embeds_many/binding.rb +42 -0
  21. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +45 -0
  22. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +571 -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 +164 -0
  27. data/lib/mongoid/association/embedded/embeds_one.rb +150 -0
  28. data/lib/mongoid/association/embedded.rb +6 -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 +116 -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 +122 -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/eager.rb +163 -0
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +72 -0
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +40 -0
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +53 -0
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +345 -0
  51. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +273 -0
  52. data/lib/mongoid/association/referenced/has_many/binding.rb +36 -0
  53. data/lib/mongoid/association/referenced/has_many/buildable.rb +38 -0
  54. data/lib/mongoid/association/referenced/has_many/eager.rb +44 -0
  55. data/lib/mongoid/association/referenced/has_many/enumerable.rb +494 -0
  56. data/lib/mongoid/association/referenced/has_many/proxy.rb +551 -0
  57. data/lib/mongoid/association/referenced/has_many.rb +251 -0
  58. data/lib/mongoid/association/referenced/has_one/binding.rb +42 -0
  59. data/lib/mongoid/association/referenced/has_one/buildable.rb +74 -0
  60. data/lib/mongoid/association/referenced/has_one/eager.rb +36 -0
  61. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +113 -0
  62. data/lib/mongoid/association/referenced/has_one/proxy.rb +108 -0
  63. data/lib/mongoid/association/referenced/has_one.rb +184 -0
  64. data/lib/mongoid/association/referenced/syncable.rb +155 -0
  65. data/lib/mongoid/association/referenced.rb +9 -0
  66. data/lib/mongoid/association/reflections.rb +69 -0
  67. data/lib/mongoid/association/relatable.rb +489 -0
  68. data/lib/mongoid/association.rb +135 -0
  69. data/lib/mongoid/atomic/modifiers.rb +41 -61
  70. data/lib/mongoid/atomic/paths/embedded/many.rb +24 -8
  71. data/lib/mongoid/atomic/paths/embedded/one.rb +5 -8
  72. data/lib/mongoid/atomic/paths/embedded.rb +3 -34
  73. data/lib/mongoid/atomic/paths/root.rb +4 -20
  74. data/lib/mongoid/atomic/paths.rb +2 -1
  75. data/lib/mongoid/atomic.rb +52 -69
  76. data/lib/mongoid/attributes/dynamic.rb +141 -0
  77. data/lib/mongoid/attributes/nested.rb +93 -0
  78. data/lib/mongoid/attributes/processing.rb +35 -97
  79. data/lib/mongoid/attributes/projector.rb +119 -0
  80. data/lib/mongoid/attributes/readonly.rb +27 -10
  81. data/lib/mongoid/attributes.rb +159 -181
  82. data/lib/mongoid/cacheable.rb +33 -0
  83. data/lib/mongoid/changeable.rb +420 -0
  84. data/lib/mongoid/clients/factory.rb +105 -0
  85. data/lib/mongoid/clients/options.rb +111 -0
  86. data/lib/mongoid/clients/sessions.rb +113 -0
  87. data/lib/mongoid/clients/storage_options.rb +79 -0
  88. data/lib/mongoid/clients/validators/storage.rb +58 -0
  89. data/lib/mongoid/clients/validators.rb +3 -0
  90. data/lib/mongoid/clients.rb +79 -0
  91. data/lib/mongoid/composable.rb +128 -0
  92. data/lib/mongoid/config/environment.rb +51 -13
  93. data/lib/mongoid/config/options.rb +30 -18
  94. data/lib/mongoid/config/validators/client.rb +128 -0
  95. data/lib/mongoid/config/validators/option.rb +3 -4
  96. data/lib/mongoid/config/validators.rb +3 -2
  97. data/lib/mongoid/config.rb +170 -89
  98. data/lib/mongoid/contextual/aggregable/memory.rb +40 -27
  99. data/lib/mongoid/contextual/aggregable/mongo.rb +33 -36
  100. data/lib/mongoid/contextual/aggregable/none.rb +65 -0
  101. data/lib/mongoid/contextual/aggregable.rb +17 -0
  102. data/lib/mongoid/contextual/atomic.rb +80 -79
  103. data/lib/mongoid/contextual/command.rb +8 -11
  104. data/lib/mongoid/contextual/geo_near.rb +42 -44
  105. data/lib/mongoid/contextual/map_reduce.rb +33 -127
  106. data/lib/mongoid/contextual/memory.rb +226 -88
  107. data/lib/mongoid/contextual/mongo.rb +466 -293
  108. data/lib/mongoid/contextual/none.rb +193 -0
  109. data/lib/mongoid/contextual/queryable.rb +3 -4
  110. data/lib/mongoid/contextual.rb +11 -11
  111. data/lib/mongoid/copyable.rb +68 -20
  112. data/lib/mongoid/criteria/findable.rb +143 -0
  113. data/lib/mongoid/criteria/includable.rb +92 -0
  114. data/lib/mongoid/criteria/inspectable.rb +24 -0
  115. data/lib/mongoid/criteria/marshalable.rb +55 -0
  116. data/lib/mongoid/criteria/modifiable.rb +235 -0
  117. data/lib/mongoid/criteria/options.rb +24 -0
  118. data/lib/mongoid/criteria/permission.rb +71 -0
  119. data/lib/mongoid/criteria/queryable/aggregable.rb +109 -0
  120. data/lib/mongoid/criteria/queryable/expandable.rb +68 -0
  121. data/lib/mongoid/criteria/queryable/extensions/array.rb +151 -0
  122. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +57 -0
  123. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +33 -0
  124. data/lib/mongoid/criteria/queryable/extensions/date.rb +63 -0
  125. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +52 -0
  126. data/lib/mongoid/criteria/queryable/extensions/hash.rb +163 -0
  127. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +75 -0
  128. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +81 -0
  129. data/lib/mongoid/criteria/queryable/extensions/object.rb +182 -0
  130. data/lib/mongoid/criteria/queryable/extensions/range.rb +102 -0
  131. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +72 -0
  132. data/lib/mongoid/criteria/queryable/extensions/set.rb +33 -0
  133. data/lib/mongoid/criteria/queryable/extensions/string.rb +122 -0
  134. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +74 -0
  135. data/lib/mongoid/criteria/queryable/extensions/time.rb +60 -0
  136. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +66 -0
  137. data/lib/mongoid/criteria/queryable/extensions.rb +25 -0
  138. data/lib/mongoid/criteria/queryable/key.rb +177 -0
  139. data/lib/mongoid/criteria/queryable/macroable.rb +26 -0
  140. data/lib/mongoid/criteria/queryable/mergeable.rb +434 -0
  141. data/lib/mongoid/criteria/queryable/optional.rb +380 -0
  142. data/lib/mongoid/criteria/queryable/options.rb +136 -0
  143. data/lib/mongoid/criteria/queryable/pipeline.rb +106 -0
  144. data/lib/mongoid/criteria/queryable/selectable.rb +937 -0
  145. data/lib/mongoid/criteria/queryable/selector.rb +287 -0
  146. data/lib/mongoid/criteria/queryable/smash.rb +128 -0
  147. data/lib/mongoid/criteria/queryable/storable.rb +237 -0
  148. data/lib/mongoid/criteria/queryable.rb +90 -0
  149. data/lib/mongoid/criteria/scopable.rb +166 -0
  150. data/lib/mongoid/criteria.rb +177 -189
  151. data/lib/mongoid/deprecable.rb +36 -0
  152. data/lib/mongoid/deprecation.rb +25 -0
  153. data/lib/mongoid/document.rb +193 -139
  154. data/lib/mongoid/equality.rb +35 -18
  155. data/lib/mongoid/errors/ambiguous_relationship.rb +5 -6
  156. data/lib/mongoid/errors/callback.rb +2 -3
  157. data/lib/mongoid/errors/criteria_argument_required.rb +18 -0
  158. data/lib/mongoid/errors/delete_restriction.rb +10 -13
  159. data/lib/mongoid/errors/document_not_destroyed.rb +22 -0
  160. data/lib/mongoid/errors/document_not_found.rb +36 -21
  161. data/lib/mongoid/errors/empty_config_file.rb +25 -0
  162. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +19 -0
  163. data/lib/mongoid/errors/invalid_collection.rb +2 -1
  164. data/lib/mongoid/errors/invalid_config_file.rb +25 -0
  165. data/lib/mongoid/errors/invalid_config_option.rb +3 -4
  166. data/lib/mongoid/errors/invalid_dependent_strategy.rb +31 -0
  167. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +24 -0
  168. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  169. data/lib/mongoid/errors/invalid_elem_match_operator.rb +32 -0
  170. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +25 -0
  171. data/lib/mongoid/errors/invalid_expression_operator.rb +27 -0
  172. data/lib/mongoid/errors/invalid_field.rb +10 -9
  173. data/lib/mongoid/errors/invalid_field_operator.rb +32 -0
  174. data/lib/mongoid/errors/invalid_field_option.rb +2 -3
  175. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  176. data/lib/mongoid/errors/invalid_find.rb +2 -3
  177. data/lib/mongoid/errors/invalid_includes.rb +2 -3
  178. data/lib/mongoid/errors/invalid_index.rb +2 -3
  179. data/lib/mongoid/errors/invalid_options.rb +4 -5
  180. data/lib/mongoid/errors/invalid_path.rb +2 -3
  181. data/lib/mongoid/errors/invalid_persistence_option.rb +26 -0
  182. data/lib/mongoid/errors/invalid_query.rb +40 -0
  183. data/lib/mongoid/errors/invalid_relation.rb +61 -0
  184. data/lib/mongoid/errors/invalid_relation_option.rb +28 -0
  185. data/lib/mongoid/errors/invalid_scope.rb +2 -3
  186. data/lib/mongoid/errors/invalid_session_use.rb +21 -0
  187. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +6 -5
  188. data/lib/mongoid/errors/invalid_storage_options.rb +4 -5
  189. data/lib/mongoid/errors/invalid_storage_parent.rb +25 -0
  190. data/lib/mongoid/errors/invalid_time.rb +2 -3
  191. data/lib/mongoid/errors/inverse_not_found.rb +4 -5
  192. data/lib/mongoid/errors/mixed_client_configuration.rb +27 -0
  193. data/lib/mongoid/errors/mixed_relations.rb +2 -3
  194. data/lib/mongoid/errors/mongoid_error.rb +22 -23
  195. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +3 -4
  196. data/lib/mongoid/errors/no_client_config.rb +21 -0
  197. data/lib/mongoid/errors/no_client_database.rb +26 -0
  198. data/lib/mongoid/errors/no_client_hosts.rb +26 -0
  199. data/lib/mongoid/errors/no_clients_config.rb +19 -0
  200. data/lib/mongoid/errors/no_default_client.rb +22 -0
  201. data/lib/mongoid/errors/no_environment.rb +2 -3
  202. data/lib/mongoid/errors/no_map_reduce_output.rb +2 -3
  203. data/lib/mongoid/errors/no_metadata.rb +2 -3
  204. data/lib/mongoid/errors/no_parent.rb +2 -3
  205. data/lib/mongoid/errors/readonly_attribute.rb +3 -4
  206. data/lib/mongoid/errors/readonly_document.rb +21 -0
  207. data/lib/mongoid/errors/scope_overwrite.rb +2 -1
  208. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +3 -1
  209. data/lib/mongoid/errors/unknown_attribute.rb +3 -4
  210. data/lib/mongoid/errors/unknown_model.rb +24 -0
  211. data/lib/mongoid/errors/unsaved_document.rb +3 -2
  212. data/lib/mongoid/errors/unsupported_javascript.rb +2 -3
  213. data/lib/mongoid/errors/validations.rb +2 -1
  214. data/lib/mongoid/errors.rb +30 -9
  215. data/lib/mongoid/evolvable.rb +4 -5
  216. data/lib/mongoid/extensions/array.rb +45 -52
  217. data/lib/mongoid/extensions/big_decimal.rb +41 -22
  218. data/lib/mongoid/extensions/binary.rb +42 -0
  219. data/lib/mongoid/extensions/boolean.rb +19 -17
  220. data/lib/mongoid/extensions/date.rb +33 -23
  221. data/lib/mongoid/extensions/date_time.rb +5 -13
  222. data/lib/mongoid/extensions/decimal128.rb +36 -0
  223. data/lib/mongoid/extensions/false_class.rb +5 -8
  224. data/lib/mongoid/extensions/float.rb +11 -16
  225. data/lib/mongoid/extensions/hash.rb +88 -49
  226. data/lib/mongoid/extensions/integer.rb +10 -18
  227. data/lib/mongoid/extensions/module.rb +3 -4
  228. data/lib/mongoid/extensions/nil_class.rb +2 -5
  229. data/lib/mongoid/extensions/object.rb +38 -62
  230. data/lib/mongoid/extensions/object_id.rb +7 -12
  231. data/lib/mongoid/extensions/range.rb +46 -17
  232. data/lib/mongoid/extensions/regexp.rb +15 -8
  233. data/lib/mongoid/extensions/set.rb +17 -15
  234. data/lib/mongoid/extensions/string.rb +40 -80
  235. data/lib/mongoid/extensions/symbol.rb +7 -23
  236. data/lib/mongoid/extensions/time.rb +42 -25
  237. data/lib/mongoid/extensions/time_with_zone.rb +27 -10
  238. data/lib/mongoid/extensions/true_class.rb +5 -8
  239. data/lib/mongoid/extensions.rb +31 -13
  240. data/lib/mongoid/factory.rb +99 -11
  241. data/lib/mongoid/fields/foreign_key.rb +26 -34
  242. data/lib/mongoid/fields/localized.rb +24 -13
  243. data/lib/mongoid/fields/standard.rb +19 -73
  244. data/lib/mongoid/fields/validators/macro.rb +56 -15
  245. data/lib/mongoid/fields/validators.rb +2 -1
  246. data/lib/mongoid/fields.rb +342 -87
  247. data/lib/mongoid/findable.rb +219 -0
  248. data/lib/mongoid/indexable/specification.rb +103 -0
  249. data/lib/mongoid/indexable/validators/options.rb +110 -0
  250. data/lib/mongoid/indexable.rb +148 -0
  251. data/lib/mongoid/inspectable.rb +52 -0
  252. data/lib/mongoid/interceptable.rb +312 -0
  253. data/lib/mongoid/loggable.rb +15 -18
  254. data/lib/mongoid/matchable.rb +23 -0
  255. data/lib/mongoid/matcher/all.rb +22 -0
  256. data/lib/mongoid/matcher/and.rb +21 -0
  257. data/lib/mongoid/matcher/bits.rb +41 -0
  258. data/lib/mongoid/matcher/bits_all_clear.rb +20 -0
  259. data/lib/mongoid/matcher/bits_all_set.rb +20 -0
  260. data/lib/mongoid/matcher/bits_any_clear.rb +20 -0
  261. data/lib/mongoid/matcher/bits_any_set.rb +20 -0
  262. data/lib/mongoid/matcher/elem_match.rb +36 -0
  263. data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
  264. data/lib/mongoid/matcher/eq.rb +11 -0
  265. data/lib/mongoid/matcher/eq_impl.rb +67 -0
  266. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +26 -0
  267. data/lib/mongoid/matcher/exists.rb +15 -0
  268. data/lib/mongoid/matcher/expression.rb +35 -0
  269. data/lib/mongoid/matcher/expression_operator.rb +19 -0
  270. data/lib/mongoid/matcher/field_expression.rb +62 -0
  271. data/lib/mongoid/matcher/field_operator.rb +54 -0
  272. data/lib/mongoid/matcher/gt.rb +17 -0
  273. data/lib/mongoid/matcher/gte.rb +17 -0
  274. data/lib/mongoid/matcher/in.rb +25 -0
  275. data/lib/mongoid/matcher/lt.rb +17 -0
  276. data/lib/mongoid/matcher/lte.rb +17 -0
  277. data/lib/mongoid/matcher/mod.rb +17 -0
  278. data/lib/mongoid/matcher/ne.rb +16 -0
  279. data/lib/mongoid/matcher/nin.rb +11 -0
  280. data/lib/mongoid/matcher/nor.rb +25 -0
  281. data/lib/mongoid/matcher/not.rb +29 -0
  282. data/lib/mongoid/matcher/or.rb +21 -0
  283. data/lib/mongoid/matcher/regex.rb +41 -0
  284. data/lib/mongoid/matcher/size.rb +26 -0
  285. data/lib/mongoid/matcher/type.rb +99 -0
  286. data/lib/mongoid/matcher.rb +115 -0
  287. data/lib/mongoid/persistable/creatable.rb +181 -0
  288. data/lib/mongoid/persistable/deletable.rb +132 -0
  289. data/lib/mongoid/persistable/destroyable.rb +57 -0
  290. data/lib/mongoid/persistable/incrementable.rb +35 -0
  291. data/lib/mongoid/persistable/logical.rb +36 -0
  292. data/lib/mongoid/persistable/poppable.rb +36 -0
  293. data/lib/mongoid/persistable/pullable.rb +50 -0
  294. data/lib/mongoid/persistable/pushable.rb +66 -0
  295. data/lib/mongoid/persistable/renamable.rb +37 -0
  296. data/lib/mongoid/persistable/savable.rb +47 -0
  297. data/lib/mongoid/persistable/settable.rb +93 -0
  298. data/lib/mongoid/persistable/unsettable.rb +36 -0
  299. data/lib/mongoid/persistable/updatable.rb +165 -0
  300. data/lib/mongoid/persistable/upsertable.rb +51 -0
  301. data/lib/mongoid/persistable.rb +305 -0
  302. data/lib/mongoid/persistence_context.rb +239 -0
  303. data/lib/mongoid/positional.rb +72 -0
  304. data/lib/mongoid/query_cache.rb +64 -0
  305. data/lib/mongoid/railtie.rb +35 -78
  306. data/lib/mongoid/railties/controller_runtime.rb +88 -0
  307. data/lib/mongoid/railties/database.rake +18 -25
  308. data/lib/mongoid/reloadable.rb +94 -0
  309. data/lib/mongoid/scopable.rb +324 -0
  310. data/lib/mongoid/selectable.rb +49 -0
  311. data/lib/mongoid/serializable.rb +170 -0
  312. data/lib/mongoid/shardable.rb +130 -0
  313. data/lib/mongoid/stateful.rb +134 -0
  314. data/lib/mongoid/stringified_symbol.rb +52 -0
  315. data/lib/mongoid/tasks/database.rake +38 -0
  316. data/lib/mongoid/tasks/database.rb +194 -0
  317. data/lib/mongoid/threaded/lifecycle.rb +28 -70
  318. data/lib/mongoid/threaded.rb +142 -219
  319. data/lib/mongoid/timestamps/created/short.rb +2 -1
  320. data/lib/mongoid/timestamps/created.rb +9 -5
  321. data/lib/mongoid/timestamps/short.rb +2 -1
  322. data/lib/mongoid/timestamps/timeless.rb +52 -16
  323. data/lib/mongoid/timestamps/updated/short.rb +4 -3
  324. data/lib/mongoid/timestamps/updated.rb +14 -9
  325. data/lib/mongoid/timestamps.rb +4 -3
  326. data/lib/mongoid/touchable.rb +131 -0
  327. data/lib/mongoid/traversable.rb +337 -0
  328. data/lib/mongoid/validatable/associated.rb +47 -0
  329. data/lib/mongoid/validatable/format.rb +21 -0
  330. data/lib/mongoid/validatable/length.rb +21 -0
  331. data/lib/mongoid/validatable/localizable.rb +29 -0
  332. data/lib/mongoid/validatable/macros.rb +89 -0
  333. data/lib/mongoid/validatable/presence.rb +81 -0
  334. data/lib/mongoid/validatable/queryable.rb +29 -0
  335. data/lib/mongoid/validatable/uniqueness.rb +304 -0
  336. data/lib/mongoid/validatable.rb +160 -0
  337. data/lib/mongoid/version.rb +3 -2
  338. data/lib/mongoid/warnings.rb +28 -0
  339. data/lib/mongoid.rb +68 -109
  340. data/lib/rails/generators/mongoid/config/config_generator.rb +10 -2
  341. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +150 -45
  342. data/lib/rails/generators/mongoid/model/model_generator.rb +3 -3
  343. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -4
  344. data/lib/rails/generators/mongoid_generator.rb +5 -41
  345. data/lib/rails/mongoid.rb +6 -129
  346. data/spec/README.md +33 -0
  347. data/spec/config/mongoid.yml +56 -25
  348. data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
  349. data/spec/integration/app_spec.rb +345 -0
  350. data/spec/integration/associations/belongs_to_spec.rb +33 -0
  351. data/spec/integration/associations/embedded_dirty_spec.rb +57 -0
  352. data/spec/integration/associations/embedded_spec.rb +283 -0
  353. data/spec/integration/associations/embeds_many_spec.rb +219 -0
  354. data/spec/integration/associations/embeds_one_spec.rb +41 -0
  355. data/spec/integration/associations/foreign_key_spec.rb +107 -0
  356. data/spec/integration/associations/foreign_key_spec_models.rb +64 -0
  357. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  358. data/spec/integration/associations/has_many_spec.rb +128 -0
  359. data/spec/integration/associations/has_one_spec.rb +272 -0
  360. data/spec/integration/associations/nested_attributes_assignment_spec.rb +115 -0
  361. data/spec/integration/associations/reverse_population_spec.rb +34 -0
  362. data/spec/integration/associations/reverse_population_spec_models.rb +36 -0
  363. data/spec/integration/associations/scope_option_spec.rb +101 -0
  364. data/spec/integration/atomic/modifiers_spec.rb +116 -0
  365. data/spec/integration/bson_regexp_raw_spec.rb +19 -0
  366. data/spec/integration/callbacks_models.rb +155 -0
  367. data/spec/integration/callbacks_spec.rb +450 -0
  368. data/spec/integration/contextual/empty_spec.rb +141 -0
  369. data/spec/integration/criteria/alias_query_spec.rb +161 -0
  370. data/spec/integration/criteria/date_field_spec.rb +40 -0
  371. data/spec/integration/criteria/default_scope_spec.rb +72 -0
  372. data/spec/integration/criteria/logical_spec.rb +124 -0
  373. data/spec/integration/criteria/range_spec.rb +359 -0
  374. data/spec/integration/criteria/time_with_zone_spec.rb +142 -0
  375. data/spec/integration/discriminator_key_spec.rb +392 -0
  376. data/spec/integration/discriminator_value_spec.rb +206 -0
  377. data/spec/integration/document_spec.rb +51 -0
  378. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  379. data/spec/integration/i18n_fallbacks_spec.rb +89 -0
  380. data/spec/integration/matcher_examples_spec.rb +765 -0
  381. data/spec/integration/matcher_operator_data/all.yml +140 -0
  382. data/spec/integration/matcher_operator_data/and.yml +93 -0
  383. data/spec/integration/matcher_operator_data/bits_all_clear.yml +159 -0
  384. data/spec/integration/matcher_operator_data/bits_all_set.yml +159 -0
  385. data/spec/integration/matcher_operator_data/bits_any_clear.yml +159 -0
  386. data/spec/integration/matcher_operator_data/bits_any_set.yml +159 -0
  387. data/spec/integration/matcher_operator_data/comment.yml +22 -0
  388. data/spec/integration/matcher_operator_data/elem_match.yml +409 -0
  389. data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
  390. data/spec/integration/matcher_operator_data/eq.yml +191 -0
  391. data/spec/integration/matcher_operator_data/exists.yml +213 -0
  392. data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
  393. data/spec/integration/matcher_operator_data/gt.yml +132 -0
  394. data/spec/integration/matcher_operator_data/gt_types.yml +63 -0
  395. data/spec/integration/matcher_operator_data/gte.yml +132 -0
  396. data/spec/integration/matcher_operator_data/gte_types.yml +15 -0
  397. data/spec/integration/matcher_operator_data/implicit.yml +331 -0
  398. data/spec/integration/matcher_operator_data/implicit_traversal.yml +112 -0
  399. data/spec/integration/matcher_operator_data/in.yml +210 -0
  400. data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
  401. data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
  402. data/spec/integration/matcher_operator_data/lt.yml +132 -0
  403. data/spec/integration/matcher_operator_data/lt_types.yml +15 -0
  404. data/spec/integration/matcher_operator_data/lte.yml +132 -0
  405. data/spec/integration/matcher_operator_data/lte_types.yml +15 -0
  406. data/spec/integration/matcher_operator_data/mod.yml +55 -0
  407. data/spec/integration/matcher_operator_data/multiple.yml +29 -0
  408. data/spec/integration/matcher_operator_data/ne.yml +150 -0
  409. data/spec/integration/matcher_operator_data/ne_types.yml +15 -0
  410. data/spec/integration/matcher_operator_data/nin.yml +114 -0
  411. data/spec/integration/matcher_operator_data/nor.yml +126 -0
  412. data/spec/integration/matcher_operator_data/not.yml +196 -0
  413. data/spec/integration/matcher_operator_data/or.yml +137 -0
  414. data/spec/integration/matcher_operator_data/regex.yml +174 -0
  415. data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
  416. data/spec/integration/matcher_operator_data/size.yml +174 -0
  417. data/spec/integration/matcher_operator_data/type.yml +70 -0
  418. data/spec/integration/matcher_operator_data/type_array.yml +16 -0
  419. data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
  420. data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
  421. data/spec/integration/matcher_operator_data/type_code.yml +26 -0
  422. data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
  423. data/spec/integration/matcher_operator_data/type_date.yml +39 -0
  424. data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
  425. data/spec/integration/matcher_operator_data/type_decimal.yml +41 -0
  426. data/spec/integration/matcher_operator_data/type_double.yml +15 -0
  427. data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
  428. data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
  429. data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
  430. data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
  431. data/spec/integration/matcher_operator_data/type_null.yml +23 -0
  432. data/spec/integration/matcher_operator_data/type_object.yml +23 -0
  433. data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
  434. data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
  435. data/spec/integration/matcher_operator_data/type_string.yml +15 -0
  436. data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
  437. data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
  438. data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
  439. data/spec/integration/matcher_operator_spec.rb +122 -0
  440. data/spec/integration/matcher_spec.rb +283 -0
  441. data/spec/integration/persistence/range_field_spec.rb +350 -0
  442. data/spec/integration/server_query_spec.rb +141 -0
  443. data/spec/integration/shardable_spec.rb +148 -0
  444. data/spec/integration/stringified_symbol_field_spec.rb +203 -0
  445. data/spec/lite_spec_helper.rb +83 -0
  446. data/spec/mongoid/association/accessors_spec.rb +1067 -0
  447. data/spec/mongoid/association/auto_save_spec.rb +403 -0
  448. data/spec/mongoid/association/builders_spec.rb +255 -0
  449. data/spec/mongoid/association/constrainable_spec.rb +117 -0
  450. data/spec/mongoid/association/counter_cache_spec.rb +452 -0
  451. data/spec/mongoid/association/depending_spec.rb +959 -0
  452. data/spec/mongoid/association/eager_spec.rb +282 -0
  453. data/spec/mongoid/association/embedded/cyclic_spec.rb +180 -0
  454. data/spec/mongoid/association/embedded/dirty_spec.rb +67 -0
  455. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +174 -0
  456. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +90 -0
  457. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +619 -0
  458. data/spec/mongoid/association/embedded/embedded_in_spec.rb +903 -0
  459. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +56 -0
  460. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +218 -0
  461. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +4863 -0
  462. data/spec/mongoid/association/embedded/embeds_many_models.rb +226 -0
  463. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +63 -0
  464. data/spec/mongoid/association/embedded/embeds_many_spec.rb +932 -0
  465. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +79 -0
  466. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +106 -0
  467. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +1025 -0
  468. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +8 -0
  469. data/spec/mongoid/association/embedded/embeds_one_models.rb +73 -0
  470. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +28 -0
  471. data/spec/mongoid/association/embedded/embeds_one_spec.rb +984 -0
  472. data/spec/mongoid/association/macros_spec.rb +1116 -0
  473. data/spec/mongoid/association/nested/many_spec.rb +232 -0
  474. data/spec/mongoid/association/nested/one_spec.rb +253 -0
  475. data/spec/mongoid/association/options_spec.rb +1323 -0
  476. data/spec/mongoid/association/polymorphic_spec.rb +162 -0
  477. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +244 -0
  478. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +292 -0
  479. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +412 -0
  480. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +1388 -0
  481. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  482. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +57 -0
  483. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2046 -0
  484. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +180 -0
  485. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +148 -0
  486. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +196 -0
  487. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +76 -0
  488. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +3836 -0
  489. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +92 -0
  490. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +39 -0
  491. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +1104 -0
  492. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +155 -0
  493. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +251 -0
  494. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +290 -0
  495. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2232 -0
  496. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +23 -0
  497. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +4161 -0
  498. data/spec/mongoid/association/referenced/has_many_models.rb +97 -0
  499. data/spec/mongoid/association/referenced/has_many_query_spec.rb +37 -0
  500. data/spec/mongoid/association/referenced/has_many_spec.rb +1273 -0
  501. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +133 -0
  502. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +159 -0
  503. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +193 -0
  504. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +1248 -0
  505. data/spec/mongoid/association/referenced/has_one_models.rb +113 -0
  506. data/spec/mongoid/association/referenced/has_one_query_spec.rb +37 -0
  507. data/spec/mongoid/association/referenced/has_one_spec.rb +1383 -0
  508. data/spec/mongoid/association/reflections_spec.rb +92 -0
  509. data/spec/mongoid/association/syncable_spec.rb +513 -0
  510. data/spec/mongoid/association_spec.rb +191 -0
  511. data/spec/mongoid/atomic/modifiers_spec.rb +88 -39
  512. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +10 -49
  513. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +9 -49
  514. data/spec/mongoid/atomic/paths/root_spec.rb +5 -61
  515. data/spec/mongoid/atomic/paths_spec.rb +115 -35
  516. data/spec/mongoid/atomic_spec.rb +89 -42
  517. data/spec/mongoid/attributes/dynamic_spec.rb +152 -0
  518. data/spec/mongoid/attributes/nested_spec.rb +5000 -0
  519. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  520. data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
  521. data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
  522. data/spec/mongoid/attributes/projector_spec.rb +40 -0
  523. data/spec/mongoid/attributes/readonly_spec.rb +166 -64
  524. data/spec/mongoid/attributes_spec.rb +1418 -409
  525. data/spec/mongoid/cacheable_spec.rb +114 -0
  526. data/spec/mongoid/changeable_spec.rb +1914 -0
  527. data/spec/mongoid/clients/factory_spec.rb +426 -0
  528. data/spec/mongoid/clients/options_spec.rb +521 -0
  529. data/spec/mongoid/clients/sessions_spec.rb +297 -0
  530. data/spec/mongoid/clients/transactions_spec.rb +415 -0
  531. data/spec/mongoid/clients_spec.rb +1084 -0
  532. data/spec/mongoid/composable_spec.rb +33 -0
  533. data/spec/mongoid/config/environment_spec.rb +138 -17
  534. data/spec/mongoid/config/options_spec.rb +26 -7
  535. data/spec/mongoid/config_spec.rb +607 -93
  536. data/spec/mongoid/contextual/aggregable/memory_spec.rb +433 -153
  537. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  538. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  539. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +221 -56
  540. data/spec/mongoid/contextual/aggregable/none_spec.rb +60 -0
  541. data/spec/mongoid/contextual/atomic_spec.rb +577 -162
  542. data/spec/mongoid/contextual/geo_near_spec.rb +104 -38
  543. data/spec/mongoid/contextual/map_reduce_spec.rb +137 -142
  544. data/spec/mongoid/contextual/memory_spec.rb +1880 -269
  545. data/spec/mongoid/contextual/mongo_spec.rb +2523 -601
  546. data/spec/mongoid/contextual/none_spec.rb +123 -0
  547. data/spec/mongoid/copyable_spec.rb +833 -76
  548. data/spec/mongoid/copyable_spec_models.rb +47 -0
  549. data/spec/mongoid/criteria/findable_spec.rb +1132 -0
  550. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  551. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  552. data/spec/mongoid/criteria/inspectable_spec.rb +29 -0
  553. data/spec/mongoid/criteria/marshalable_spec.rb +47 -0
  554. data/spec/mongoid/criteria/modifiable_spec.rb +1812 -0
  555. data/spec/mongoid/criteria/options_spec.rb +31 -0
  556. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +372 -0
  557. data/spec/mongoid/criteria/queryable/expandable_spec.rb +61 -0
  558. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +513 -0
  559. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +169 -0
  560. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +60 -0
  561. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +215 -0
  562. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +343 -0
  563. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +434 -0
  564. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +60 -0
  565. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +67 -0
  566. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +314 -0
  567. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +67 -0
  568. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +79 -0
  569. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +119 -0
  570. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +110 -0
  571. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +370 -0
  572. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +91 -0
  573. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +92 -0
  574. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +41 -0
  575. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +347 -0
  576. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +169 -0
  577. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +406 -0
  578. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +387 -0
  579. data/spec/mongoid/criteria/queryable/key_spec.rb +96 -0
  580. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +182 -0
  581. data/spec/mongoid/criteria/queryable/optional_spec.rb +1317 -0
  582. data/spec/mongoid/criteria/queryable/options_spec.rb +362 -0
  583. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +214 -0
  584. data/spec/mongoid/criteria/queryable/queryable_spec.rb +139 -0
  585. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +2119 -0
  586. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +38 -0
  587. data/spec/mongoid/criteria/queryable/selectable_spec.rb +2462 -0
  588. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +589 -0
  589. data/spec/mongoid/criteria/queryable/selector_spec.rb +895 -0
  590. data/spec/mongoid/criteria/queryable/smash_spec.rb +32 -0
  591. data/spec/mongoid/criteria/queryable/storable_spec.rb +226 -0
  592. data/spec/mongoid/criteria/scopable_spec.rb +601 -0
  593. data/spec/mongoid/criteria_projection_spec.rb +410 -0
  594. data/spec/mongoid/criteria_spec.rb +1828 -3572
  595. data/spec/mongoid/document_fields_spec.rb +262 -0
  596. data/spec/mongoid/document_persistence_context_spec.rb +32 -0
  597. data/spec/mongoid/document_query_spec.rb +89 -0
  598. data/spec/mongoid/document_spec.rb +452 -221
  599. data/spec/mongoid/equality_spec.rb +155 -52
  600. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +8 -6
  601. data/spec/mongoid/errors/callback_spec.rb +5 -3
  602. data/spec/mongoid/errors/delete_restriction_spec.rb +7 -5
  603. data/spec/mongoid/errors/document_not_destroyed_spec.rb +35 -0
  604. data/spec/mongoid/errors/document_not_found_spec.rb +89 -11
  605. data/spec/mongoid/errors/invalid_collection_spec.rb +5 -3
  606. data/spec/mongoid/errors/invalid_config_file_spec.rb +31 -0
  607. data/spec/mongoid/errors/invalid_config_option_spec.rb +5 -3
  608. data/spec/mongoid/errors/invalid_field_option_spec.rb +5 -3
  609. data/spec/mongoid/errors/invalid_field_spec.rb +6 -4
  610. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  611. data/spec/mongoid/errors/invalid_find_spec.rb +5 -3
  612. data/spec/mongoid/errors/invalid_includes_spec.rb +5 -3
  613. data/spec/mongoid/errors/invalid_index_spec.rb +5 -3
  614. data/spec/mongoid/errors/invalid_options_spec.rb +7 -5
  615. data/spec/mongoid/errors/invalid_path_spec.rb +5 -3
  616. data/spec/mongoid/errors/invalid_relation_spec.rb +39 -0
  617. data/spec/mongoid/errors/invalid_scope_spec.rb +7 -5
  618. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +5 -3
  619. data/spec/mongoid/errors/invalid_storage_options_spec.rb +5 -3
  620. data/spec/mongoid/errors/invalid_time_spec.rb +5 -3
  621. data/spec/mongoid/errors/inverse_not_found_spec.rb +6 -4
  622. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +31 -0
  623. data/spec/mongoid/errors/mixed_relations_spec.rb +5 -3
  624. data/spec/mongoid/errors/mongoid_error_spec.rb +45 -10
  625. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +8 -6
  626. data/spec/mongoid/errors/no_client_config_spec.rb +31 -0
  627. data/spec/mongoid/errors/no_client_database_spec.rb +31 -0
  628. data/spec/mongoid/errors/no_client_hosts_spec.rb +31 -0
  629. data/spec/mongoid/errors/no_clients_config_spec.rb +31 -0
  630. data/spec/mongoid/errors/no_environment_spec.rb +8 -6
  631. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +5 -3
  632. data/spec/mongoid/errors/no_metadata_spec.rb +5 -3
  633. data/spec/mongoid/errors/no_parent_spec.rb +6 -4
  634. data/spec/mongoid/errors/readonly_attribute_spec.rb +5 -3
  635. data/spec/mongoid/errors/readonly_document_spec.rb +31 -0
  636. data/spec/mongoid/errors/scope_overwrite_spec.rb +5 -3
  637. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +6 -4
  638. data/spec/mongoid/errors/unknown_attribute_spec.rb +7 -5
  639. data/spec/mongoid/errors/unsaved_document_spec.rb +6 -4
  640. data/spec/mongoid/errors/unsupported_javascript_spec.rb +5 -3
  641. data/spec/mongoid/errors/validations_spec.rb +9 -7
  642. data/spec/mongoid/extensions/array_spec.rb +108 -116
  643. data/spec/mongoid/extensions/big_decimal_spec.rb +838 -49
  644. data/spec/mongoid/extensions/binary_spec.rb +55 -18
  645. data/spec/mongoid/extensions/boolean_spec.rb +76 -74
  646. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +339 -0
  647. data/spec/mongoid/extensions/date_spec.rb +59 -145
  648. data/spec/mongoid/extensions/date_time_spec.rb +35 -76
  649. data/spec/mongoid/extensions/decimal128_spec.rb +46 -0
  650. data/spec/mongoid/extensions/false_class_spec.rb +7 -5
  651. data/spec/mongoid/extensions/float_spec.rb +69 -62
  652. data/spec/mongoid/extensions/hash_spec.rb +197 -30
  653. data/spec/mongoid/extensions/integer_spec.rb +63 -65
  654. data/spec/mongoid/extensions/module_spec.rb +4 -2
  655. data/spec/mongoid/extensions/nil_class_spec.rb +3 -1
  656. data/spec/mongoid/extensions/object_id_spec.rb +136 -134
  657. data/spec/mongoid/extensions/object_spec.rb +53 -57
  658. data/spec/mongoid/extensions/range_spec.rb +287 -28
  659. data/spec/mongoid/extensions/regexp_spec.rb +71 -21
  660. data/spec/mongoid/extensions/set_spec.rb +112 -4
  661. data/spec/mongoid/extensions/string_spec.rb +188 -89
  662. data/spec/mongoid/extensions/stringified_symbol_spec.rb +84 -0
  663. data/spec/mongoid/extensions/symbol_spec.rb +25 -30
  664. data/spec/mongoid/extensions/time_spec.rb +703 -110
  665. data/spec/mongoid/extensions/time_with_zone_spec.rb +82 -67
  666. data/spec/mongoid/extensions/true_class_spec.rb +7 -5
  667. data/spec/mongoid/extensions_spec.rb +43 -0
  668. data/spec/mongoid/factory_spec.rb +374 -25
  669. data/spec/mongoid/fields/foreign_key_spec.rb +116 -92
  670. data/spec/mongoid/fields/localized_spec.rb +177 -35
  671. data/spec/mongoid/fields/standard_spec.rb +15 -13
  672. data/spec/mongoid/fields_spec.rb +952 -238
  673. data/spec/mongoid/findable_spec.rb +632 -0
  674. data/spec/mongoid/indexable/specification_spec.rb +129 -0
  675. data/spec/mongoid/indexable_spec.rb +643 -0
  676. data/spec/mongoid/inspectable_spec.rb +86 -0
  677. data/spec/mongoid/interceptable_spec.rb +2373 -0
  678. data/spec/mongoid/interceptable_spec_models.rb +307 -0
  679. data/spec/mongoid/loggable_spec.rb +3 -1
  680. data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
  681. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +239 -0
  682. data/spec/mongoid/matcher/extract_attribute_spec.rb +36 -0
  683. data/spec/mongoid/mongoizable_spec.rb +285 -0
  684. data/spec/mongoid/persistable/creatable_spec.rb +662 -0
  685. data/spec/mongoid/persistable/deletable_spec.rb +514 -0
  686. data/spec/mongoid/persistable/destroyable_spec.rb +455 -0
  687. data/spec/mongoid/persistable/incrementable_spec.rb +241 -0
  688. data/spec/mongoid/persistable/logical_spec.rb +159 -0
  689. data/spec/mongoid/persistable/poppable_spec.rb +131 -0
  690. data/spec/mongoid/persistable/pullable_spec.rb +258 -0
  691. data/spec/mongoid/persistable/pushable_spec.rb +353 -0
  692. data/spec/mongoid/persistable/renamable_spec.rb +151 -0
  693. data/spec/mongoid/persistable/savable_spec.rb +684 -0
  694. data/spec/mongoid/persistable/settable_spec.rb +544 -0
  695. data/spec/mongoid/persistable/unsettable_spec.rb +171 -0
  696. data/spec/mongoid/persistable/updatable_spec.rb +760 -0
  697. data/spec/mongoid/persistable/upsertable_spec.rb +122 -0
  698. data/spec/mongoid/persistable_spec.rb +321 -0
  699. data/spec/mongoid/persistence_context_spec.rb +745 -0
  700. data/spec/mongoid/positional_spec.rb +223 -0
  701. data/spec/mongoid/query_cache_middleware_spec.rb +50 -0
  702. data/spec/mongoid/query_cache_spec.rb +870 -0
  703. data/spec/mongoid/relations/proxy_spec.rb +125 -47
  704. data/spec/mongoid/reloadable_spec.rb +665 -0
  705. data/spec/mongoid/scopable_spec.rb +1234 -0
  706. data/spec/mongoid/selectable_spec.rb +136 -0
  707. data/spec/mongoid/serializable_spec.rb +963 -0
  708. data/spec/mongoid/shardable_models.rb +61 -0
  709. data/spec/mongoid/shardable_spec.rb +204 -0
  710. data/spec/mongoid/stateful_spec.rb +157 -0
  711. data/spec/mongoid/tasks/database_rake_spec.rb +287 -0
  712. data/spec/mongoid/tasks/database_spec.rb +181 -0
  713. data/spec/mongoid/threaded_spec.rb +88 -78
  714. data/spec/mongoid/timestamps/created/short_spec.rb +9 -7
  715. data/spec/mongoid/timestamps/created_spec.rb +8 -6
  716. data/spec/mongoid/timestamps/timeless_spec.rb +29 -10
  717. data/spec/mongoid/timestamps/updated/short_spec.rb +16 -14
  718. data/spec/mongoid/timestamps/updated_spec.rb +14 -16
  719. data/spec/mongoid/timestamps_spec.rb +406 -18
  720. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  721. data/spec/mongoid/touchable_spec.rb +704 -0
  722. data/spec/mongoid/touchable_spec_models.rb +57 -0
  723. data/spec/mongoid/traversable_spec.rb +1410 -0
  724. data/spec/mongoid/validatable/associated_spec.rb +208 -0
  725. data/spec/mongoid/validatable/format_spec.rb +85 -0
  726. data/spec/mongoid/validatable/length_spec.rb +225 -0
  727. data/spec/mongoid/validatable/numericality_spec.rb +32 -0
  728. data/spec/mongoid/validatable/presence_spec.rb +592 -0
  729. data/spec/mongoid/validatable/uniqueness_spec.rb +2504 -0
  730. data/spec/mongoid/validatable_spec.rb +327 -0
  731. data/spec/mongoid/warnings_spec.rb +35 -0
  732. data/spec/mongoid_spec.rb +20 -20
  733. data/spec/rails/controller_extension/controller_runtime_spec.rb +112 -0
  734. data/spec/rails/mongoid_spec.rb +37 -354
  735. data/spec/shared/LICENSE +20 -0
  736. data/spec/shared/bin/get-mongodb-download-url +17 -0
  737. data/spec/shared/bin/s3-copy +45 -0
  738. data/spec/shared/bin/s3-upload +69 -0
  739. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  740. data/spec/shared/lib/mrss/cluster_config.rb +231 -0
  741. data/spec/shared/lib/mrss/constraints.rb +378 -0
  742. data/spec/shared/lib/mrss/docker_runner.rb +291 -0
  743. data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
  744. data/spec/shared/lib/mrss/event_subscriber.rb +200 -0
  745. data/spec/shared/lib/mrss/lite_constraints.rb +230 -0
  746. data/spec/shared/lib/mrss/server_version_registry.rb +120 -0
  747. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  748. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  749. data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
  750. data/spec/shared/lib/mrss/utils.rb +15 -0
  751. data/spec/shared/share/Dockerfile.erb +325 -0
  752. data/spec/shared/share/haproxy-1.conf +16 -0
  753. data/spec/shared/share/haproxy-2.conf +17 -0
  754. data/spec/shared/shlib/config.sh +27 -0
  755. data/spec/shared/shlib/distro.sh +74 -0
  756. data/spec/shared/shlib/server.sh +392 -0
  757. data/spec/shared/shlib/set_env.sh +169 -0
  758. data/spec/spec_helper.rb +163 -42
  759. data/spec/support/authorization.rb +15 -0
  760. data/spec/support/client_registry.rb +9 -0
  761. data/spec/support/constraints.rb +77 -0
  762. data/spec/support/expectations.rb +32 -0
  763. data/spec/support/helpers.rb +11 -0
  764. data/spec/support/macros.rb +81 -0
  765. data/spec/support/models/account.rb +38 -0
  766. data/spec/support/models/acolyte.rb +19 -0
  767. data/spec/support/models/actor.rb +20 -0
  768. data/spec/support/models/actress.rb +4 -0
  769. data/spec/support/models/address.rb +85 -0
  770. data/spec/support/models/address_component.rb +7 -0
  771. data/spec/support/models/address_number.rb +8 -0
  772. data/spec/support/models/agency.rb +7 -0
  773. data/spec/support/models/agent.rb +18 -0
  774. data/spec/support/models/album.rb +20 -0
  775. data/spec/support/models/alert.rb +9 -0
  776. data/spec/support/models/animal.rb +28 -0
  777. data/spec/support/models/answer.rb +8 -0
  778. data/spec/support/models/appointment.rb +9 -0
  779. data/spec/support/models/armrest.rb +9 -0
  780. data/spec/support/models/array_field.rb +7 -0
  781. data/spec/support/models/article.rb +14 -0
  782. data/spec/support/models/artist.rb +91 -0
  783. data/spec/support/models/artwork.rb +6 -0
  784. data/spec/support/models/audible_sound.rb +3 -0
  785. data/spec/support/models/audio.rb +7 -0
  786. data/spec/support/models/augmentation.rb +25 -0
  787. data/spec/support/models/author.rb +8 -0
  788. data/spec/support/models/baby.rb +6 -0
  789. data/spec/support/models/band.rb +40 -0
  790. data/spec/support/models/bar.rb +12 -0
  791. data/spec/support/models/basic.rb +8 -0
  792. data/spec/support/models/bed.rb +3 -0
  793. data/spec/support/models/big_palette.rb +4 -0
  794. data/spec/support/models/birthday.rb +15 -0
  795. data/spec/support/models/bolt.rb +7 -0
  796. data/spec/support/models/bomb.rb +6 -0
  797. data/spec/support/models/book.rb +18 -0
  798. data/spec/support/models/breed.rb +6 -0
  799. data/spec/support/models/browser.rb +8 -0
  800. data/spec/support/models/building.rb +8 -0
  801. data/spec/support/models/building_address.rb +9 -0
  802. data/spec/support/models/bus.rb +9 -0
  803. data/spec/support/models/business.rb +7 -0
  804. data/spec/support/models/callback_test.rb +11 -0
  805. data/spec/support/models/canvas.rb +27 -0
  806. data/spec/support/models/car.rb +3 -0
  807. data/spec/support/models/cat.rb +10 -0
  808. data/spec/support/models/catalog.rb +24 -0
  809. data/spec/support/models/category.rb +10 -0
  810. data/spec/support/models/child.rb +6 -0
  811. data/spec/support/models/child_doc.rb +24 -0
  812. data/spec/support/models/church.rb +8 -0
  813. data/spec/support/models/circle.rb +5 -0
  814. data/spec/support/models/circuit.rb +6 -0
  815. data/spec/support/models/circus.rb +12 -0
  816. data/spec/support/models/code.rb +15 -0
  817. data/spec/support/models/coding/pull_request.rb +11 -0
  818. data/spec/support/models/coding.rb +3 -0
  819. data/spec/support/models/comment.rb +18 -0
  820. data/spec/support/models/company.rb +7 -0
  821. data/spec/support/models/consumption_period.rb +9 -0
  822. data/spec/support/models/contextable_item.rb +7 -0
  823. data/spec/support/models/contractor.rb +7 -0
  824. data/spec/support/models/cookie.rb +8 -0
  825. data/spec/support/models/country_code.rb +12 -0
  826. data/spec/support/models/courier_job.rb +6 -0
  827. data/spec/support/models/crate.rb +12 -0
  828. data/spec/support/models/customer.rb +10 -0
  829. data/spec/support/models/customer_address.rb +11 -0
  830. data/spec/support/models/deed.rb +7 -0
  831. data/spec/support/models/definition.rb +11 -0
  832. data/spec/support/models/delegating_patient.rb +15 -0
  833. data/spec/support/models/description.rb +13 -0
  834. data/spec/support/models/dictionary.rb +18 -0
  835. data/spec/support/models/division.rb +12 -0
  836. data/spec/support/models/doctor.rb +14 -0
  837. data/spec/support/models/dog.rb +9 -0
  838. data/spec/support/models/dokument.rb +8 -0
  839. data/spec/support/models/draft.rb +11 -0
  840. data/spec/support/models/dragon.rb +6 -0
  841. data/spec/support/models/driver.rb +9 -0
  842. data/spec/support/models/drug.rb +8 -0
  843. data/spec/support/models/dungeon.rb +6 -0
  844. data/spec/support/models/edit.rb +7 -0
  845. data/spec/support/models/email.rb +8 -0
  846. data/spec/support/models/employer.rb +7 -0
  847. data/spec/support/models/entry.rb +8 -0
  848. data/spec/support/models/eraser.rb +3 -0
  849. data/spec/support/models/even.rb +9 -0
  850. data/spec/support/models/event.rb +24 -0
  851. data/spec/support/models/exhibition.rb +6 -0
  852. data/spec/support/models/exhibitor.rb +8 -0
  853. data/spec/support/models/explosion.rb +6 -0
  854. data/spec/support/models/eye.rb +11 -0
  855. data/spec/support/models/eye_bowl.rb +11 -0
  856. data/spec/support/models/face.rb +10 -0
  857. data/spec/support/models/fanatic.rb +8 -0
  858. data/spec/support/models/favorite.rb +8 -0
  859. data/spec/support/models/filesystem.rb +7 -0
  860. data/spec/support/models/fire_hydrant.rb +8 -0
  861. data/spec/support/models/firefox.rb +6 -0
  862. data/spec/support/models/fish.rb +9 -0
  863. data/spec/support/models/folder.rb +9 -0
  864. data/spec/support/models/folder_item.rb +11 -0
  865. data/spec/support/models/fruits.rb +36 -0
  866. data/spec/support/models/game.rb +21 -0
  867. data/spec/support/models/ghost.rb +9 -0
  868. data/spec/support/models/guitar.rb +4 -0
  869. data/spec/support/models/hole.rb +12 -0
  870. data/spec/support/models/home.rb +6 -0
  871. data/spec/support/models/house.rb +8 -0
  872. data/spec/support/models/html_writer.rb +5 -0
  873. data/spec/support/models/id_key.rb +8 -0
  874. data/spec/support/models/idnodef.rb +7 -0
  875. data/spec/support/models/image.rb +24 -0
  876. data/spec/support/models/implant.rb +27 -0
  877. data/spec/support/models/instrument.rb +8 -0
  878. data/spec/support/models/item.rb +10 -0
  879. data/spec/support/models/jar.rb +9 -0
  880. data/spec/support/models/kaleidoscope.rb +8 -0
  881. data/spec/support/models/kangaroo.rb +6 -0
  882. data/spec/support/models/label.rb +52 -0
  883. data/spec/support/models/language.rb +7 -0
  884. data/spec/support/models/lat_lng.rb +17 -0
  885. data/spec/support/models/league.rb +13 -0
  886. data/spec/support/models/learner.rb +4 -0
  887. data/spec/support/models/line_item.rb +8 -0
  888. data/spec/support/models/location.rb +10 -0
  889. data/spec/support/models/login.rb +10 -0
  890. data/spec/support/models/manufacturer.rb +9 -0
  891. data/spec/support/models/meat.rb +6 -0
  892. data/spec/support/models/membership.rb +7 -0
  893. data/spec/support/models/message.rb +13 -0
  894. data/spec/support/models/minim.rb +6 -0
  895. data/spec/support/models/mixed_drink.rb +6 -0
  896. data/spec/support/models/mop.rb +24 -0
  897. data/spec/support/models/movie.rb +15 -0
  898. data/spec/support/models/my_hash.rb +4 -0
  899. data/spec/support/models/name.rb +26 -0
  900. data/spec/support/models/name_only.rb +8 -0
  901. data/spec/support/models/node.rb +7 -0
  902. data/spec/support/models/note.rb +19 -0
  903. data/spec/support/models/nut.rb +7 -0
  904. data/spec/support/models/odd.rb +9 -0
  905. data/spec/support/models/order.rb +12 -0
  906. data/spec/support/models/ordered_post.rb +13 -0
  907. data/spec/support/models/ordered_preference.rb +8 -0
  908. data/spec/support/models/oscar.rb +16 -0
  909. data/spec/support/models/other_owner_object.rb +4 -0
  910. data/spec/support/models/override.rb +18 -0
  911. data/spec/support/models/ownable.rb +8 -0
  912. data/spec/support/models/owner.rb +10 -0
  913. data/spec/support/models/pack.rb +5 -0
  914. data/spec/support/models/page.rb +18 -0
  915. data/spec/support/models/page_question.rb +6 -0
  916. data/spec/support/models/palette.rb +9 -0
  917. data/spec/support/models/parent.rb +7 -0
  918. data/spec/support/models/parent_doc.rb +8 -0
  919. data/spec/support/models/passport.rb +22 -0
  920. data/spec/support/models/patient.rb +11 -0
  921. data/spec/support/models/pdf_writer.rb +5 -0
  922. data/spec/support/models/pencil.rb +3 -0
  923. data/spec/support/models/person.rb +231 -0
  924. data/spec/support/models/pet.rb +25 -0
  925. data/spec/support/models/pet_owner.rb +8 -0
  926. data/spec/support/models/phone.rb +13 -0
  927. data/spec/support/models/piano.rb +4 -0
  928. data/spec/support/models/pizza.rb +9 -0
  929. data/spec/support/models/player.rb +39 -0
  930. data/spec/support/models/post.rb +52 -0
  931. data/spec/support/models/post_genre.rb +8 -0
  932. data/spec/support/models/powerup.rb +25 -0
  933. data/spec/support/models/preference.rb +11 -0
  934. data/spec/support/models/princess.rb +12 -0
  935. data/spec/support/models/product.rb +19 -0
  936. data/spec/support/models/profile.rb +17 -0
  937. data/spec/support/models/pronunciation.rb +7 -0
  938. data/spec/support/models/pub.rb +8 -0
  939. data/spec/support/models/publication/encyclopedia.rb +11 -0
  940. data/spec/support/models/publication/review.rb +13 -0
  941. data/spec/support/models/publication.rb +4 -0
  942. data/spec/support/models/purchase.rb +6 -0
  943. data/spec/support/models/purchased_item.rb +10 -0
  944. data/spec/support/models/question.rb +10 -0
  945. data/spec/support/models/quiz.rb +9 -0
  946. data/spec/support/models/rating.rb +10 -0
  947. data/spec/support/models/record.rb +54 -0
  948. data/spec/support/models/registry.rb +7 -0
  949. data/spec/support/models/role.rb +9 -0
  950. data/spec/support/models/root_category.rb +6 -0
  951. data/spec/support/models/sandwich.rb +11 -0
  952. data/spec/support/models/scheduler.rb +9 -0
  953. data/spec/support/models/school.rb +14 -0
  954. data/spec/support/models/scribe.rb +7 -0
  955. data/spec/support/models/sealer.rb +7 -0
  956. data/spec/support/models/seat.rb +24 -0
  957. data/spec/support/models/seo.rb +9 -0
  958. data/spec/support/models/series.rb +7 -0
  959. data/spec/support/models/server.rb +15 -0
  960. data/spec/support/models/service.rb +24 -0
  961. data/spec/support/models/shape.rb +14 -0
  962. data/spec/support/models/shelf.rb +7 -0
  963. data/spec/support/models/shield.rb +18 -0
  964. data/spec/support/models/shipment_address.rb +5 -0
  965. data/spec/support/models/shipping_container.rb +7 -0
  966. data/spec/support/models/shipping_pack.rb +5 -0
  967. data/spec/support/models/shirt.rb +11 -0
  968. data/spec/support/models/shop.rb +8 -0
  969. data/spec/support/models/short_agent.rb +6 -0
  970. data/spec/support/models/short_quiz.rb +7 -0
  971. data/spec/support/models/simple.rb +7 -0
  972. data/spec/support/models/slave.rb +8 -0
  973. data/spec/support/models/song.rb +10 -0
  974. data/spec/support/models/sound.rb +7 -0
  975. data/spec/support/models/spacer.rb +7 -0
  976. data/spec/support/models/square.rb +6 -0
  977. data/spec/support/models/staff.rb +9 -0
  978. data/spec/support/models/store_as_dup_test1.rb +7 -0
  979. data/spec/support/models/store_as_dup_test2.rb +7 -0
  980. data/spec/support/models/store_as_dup_test3.rb +7 -0
  981. data/spec/support/models/store_as_dup_test4.rb +7 -0
  982. data/spec/support/models/strategy.rb +5 -0
  983. data/spec/support/models/student.rb +14 -0
  984. data/spec/support/models/sub_item.rb +5 -0
  985. data/spec/support/models/subscription.rb +7 -0
  986. data/spec/support/models/survey.rb +7 -0
  987. data/spec/support/models/symptom.rb +8 -0
  988. data/spec/support/models/system_role.rb +7 -0
  989. data/spec/support/models/tag.rb +10 -0
  990. data/spec/support/models/target.rb +7 -0
  991. data/spec/support/models/template.rb +7 -0
  992. data/spec/support/models/thing.rb +11 -0
  993. data/spec/support/models/threadlocker.rb +7 -0
  994. data/spec/support/models/title.rb +5 -0
  995. data/spec/support/models/tool.rb +10 -0
  996. data/spec/support/models/topping.rb +7 -0
  997. data/spec/support/models/toy.rb +9 -0
  998. data/spec/support/models/track.rb +40 -0
  999. data/spec/support/models/translation.rb +7 -0
  1000. data/spec/support/models/tree.rb +11 -0
  1001. data/spec/support/models/truck.rb +7 -0
  1002. data/spec/support/models/updatable.rb +7 -0
  1003. data/spec/support/models/user.rb +23 -0
  1004. data/spec/support/models/user_account.rb +12 -0
  1005. data/spec/support/models/validation_callback.rb +12 -0
  1006. data/spec/support/models/vehicle.rb +18 -0
  1007. data/spec/support/models/version.rb +7 -0
  1008. data/spec/support/models/vertex.rb +8 -0
  1009. data/spec/support/models/vet_visit.rb +7 -0
  1010. data/spec/support/models/video.rb +15 -0
  1011. data/spec/support/models/video_game.rb +3 -0
  1012. data/spec/support/models/washer.rb +7 -0
  1013. data/spec/support/models/weapon.rb +25 -0
  1014. data/spec/support/models/wiki_page.rb +17 -0
  1015. data/spec/support/models/word.rb +17 -0
  1016. data/spec/support/models/word_origin.rb +13 -0
  1017. data/spec/support/models/writer.rb +13 -0
  1018. data/spec/support/schema_maps/schema_map_aws.json +17 -0
  1019. data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
  1020. data/spec/support/schema_maps/schema_map_azure.json +17 -0
  1021. data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
  1022. data/spec/support/schema_maps/schema_map_gcp.json +17 -0
  1023. data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
  1024. data/spec/support/schema_maps/schema_map_kmip.json +17 -0
  1025. data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
  1026. data/spec/support/schema_maps/schema_map_local.json +18 -0
  1027. data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
  1028. data/spec/support/shared/time.rb +53 -0
  1029. data/spec/support/spec_config.rb +64 -0
  1030. data.tar.gz.sig +0 -0
  1031. metadata +1582 -912
  1032. metadata.gz.sig +0 -0
  1033. data/lib/mongoid/atomic/positionable.rb +0 -73
  1034. data/lib/mongoid/callbacks.rb +0 -314
  1035. data/lib/mongoid/components.rb +0 -93
  1036. data/lib/mongoid/config/inflections.rb +0 -6
  1037. data/lib/mongoid/config/validators/session.rb +0 -140
  1038. data/lib/mongoid/contextual/eager.rb +0 -158
  1039. data/lib/mongoid/contextual/find_and_modify.rb +0 -69
  1040. data/lib/mongoid/criterion/findable.rb +0 -179
  1041. data/lib/mongoid/criterion/inspection.rb +0 -25
  1042. data/lib/mongoid/criterion/marshalable.rb +0 -48
  1043. data/lib/mongoid/criterion/modifiable.rb +0 -189
  1044. data/lib/mongoid/criterion/scoping.rb +0 -158
  1045. data/lib/mongoid/dirty.rb +0 -376
  1046. data/lib/mongoid/errors/eager_load.rb +0 -22
  1047. data/lib/mongoid/errors/mixed_session_configuration.rb +0 -28
  1048. data/lib/mongoid/errors/no_default_session.rb +0 -23
  1049. data/lib/mongoid/errors/no_session_config.rb +0 -22
  1050. data/lib/mongoid/errors/no_session_database.rb +0 -27
  1051. data/lib/mongoid/errors/no_session_hosts.rb +0 -27
  1052. data/lib/mongoid/errors/no_sessions_config.rb +0 -20
  1053. data/lib/mongoid/errors/versioning_not_on_root.rb +0 -23
  1054. data/lib/mongoid/finders.rb +0 -130
  1055. data/lib/mongoid/hierarchy.rb +0 -188
  1056. data/lib/mongoid/identity_map.rb +0 -163
  1057. data/lib/mongoid/indexes/validators/options.rb +0 -102
  1058. data/lib/mongoid/indexes.rb +0 -154
  1059. data/lib/mongoid/inspection.rb +0 -55
  1060. data/lib/mongoid/json.rb +0 -16
  1061. data/lib/mongoid/matchers/all.rb +0 -27
  1062. data/lib/mongoid/matchers/and.rb +0 -30
  1063. data/lib/mongoid/matchers/default.rb +0 -72
  1064. data/lib/mongoid/matchers/exists.rb +0 -23
  1065. data/lib/mongoid/matchers/gt.rb +0 -21
  1066. data/lib/mongoid/matchers/gte.rb +0 -21
  1067. data/lib/mongoid/matchers/in.rb +0 -24
  1068. data/lib/mongoid/matchers/lt.rb +0 -21
  1069. data/lib/mongoid/matchers/lte.rb +0 -21
  1070. data/lib/mongoid/matchers/ne.rb +0 -21
  1071. data/lib/mongoid/matchers/nin.rb +0 -21
  1072. data/lib/mongoid/matchers/or.rb +0 -33
  1073. data/lib/mongoid/matchers/size.rb +0 -21
  1074. data/lib/mongoid/matchers/strategies.rb +0 -97
  1075. data/lib/mongoid/matchers.rb +0 -32
  1076. data/lib/mongoid/multi_parameter_attributes.rb +0 -105
  1077. data/lib/mongoid/nested_attributes.rb +0 -78
  1078. data/lib/mongoid/observer.rb +0 -192
  1079. data/lib/mongoid/paranoia.rb +0 -137
  1080. data/lib/mongoid/persistence/atomic/add_to_set.rb +0 -47
  1081. data/lib/mongoid/persistence/atomic/bit.rb +0 -35
  1082. data/lib/mongoid/persistence/atomic/inc.rb +0 -45
  1083. data/lib/mongoid/persistence/atomic/operation.rb +0 -154
  1084. data/lib/mongoid/persistence/atomic/pop.rb +0 -32
  1085. data/lib/mongoid/persistence/atomic/pull.rb +0 -32
  1086. data/lib/mongoid/persistence/atomic/pull_all.rb +0 -32
  1087. data/lib/mongoid/persistence/atomic/push.rb +0 -25
  1088. data/lib/mongoid/persistence/atomic/push_all.rb +0 -25
  1089. data/lib/mongoid/persistence/atomic/rename.rb +0 -30
  1090. data/lib/mongoid/persistence/atomic/sets.rb +0 -28
  1091. data/lib/mongoid/persistence/atomic/unset.rb +0 -27
  1092. data/lib/mongoid/persistence/atomic.rb +0 -231
  1093. data/lib/mongoid/persistence/deletion.rb +0 -32
  1094. data/lib/mongoid/persistence/insertion.rb +0 -38
  1095. data/lib/mongoid/persistence/modification.rb +0 -35
  1096. data/lib/mongoid/persistence/operations/embedded/insert.rb +0 -46
  1097. data/lib/mongoid/persistence/operations/embedded/remove.rb +0 -43
  1098. data/lib/mongoid/persistence/operations/insert.rb +0 -34
  1099. data/lib/mongoid/persistence/operations/remove.rb +0 -33
  1100. data/lib/mongoid/persistence/operations/update.rb +0 -59
  1101. data/lib/mongoid/persistence/operations/upsert.rb +0 -28
  1102. data/lib/mongoid/persistence/operations.rb +0 -214
  1103. data/lib/mongoid/persistence/upsertion.rb +0 -31
  1104. data/lib/mongoid/persistence.rb +0 -352
  1105. data/lib/mongoid/railties/document.rb +0 -12
  1106. data/lib/mongoid/relations/accessors.rb +0 -299
  1107. data/lib/mongoid/relations/auto_save.rb +0 -107
  1108. data/lib/mongoid/relations/binding.rb +0 -241
  1109. data/lib/mongoid/relations/bindings/embedded/in.rb +0 -63
  1110. data/lib/mongoid/relations/bindings/embedded/many.rb +0 -52
  1111. data/lib/mongoid/relations/bindings/embedded/one.rb +0 -55
  1112. data/lib/mongoid/relations/bindings/referenced/in.rb +0 -70
  1113. data/lib/mongoid/relations/bindings/referenced/many.rb +0 -42
  1114. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +0 -67
  1115. data/lib/mongoid/relations/bindings/referenced/one.rb +0 -44
  1116. data/lib/mongoid/relations/bindings.rb +0 -9
  1117. data/lib/mongoid/relations/builder.rb +0 -57
  1118. data/lib/mongoid/relations/builders/embedded/in.rb +0 -29
  1119. data/lib/mongoid/relations/builders/embedded/many.rb +0 -36
  1120. data/lib/mongoid/relations/builders/embedded/one.rb +0 -30
  1121. data/lib/mongoid/relations/builders/nested_attributes/many.rb +0 -177
  1122. data/lib/mongoid/relations/builders/nested_attributes/one.rb +0 -127
  1123. data/lib/mongoid/relations/builders/referenced/in.rb +0 -26
  1124. data/lib/mongoid/relations/builders/referenced/many.rb +0 -27
  1125. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +0 -40
  1126. data/lib/mongoid/relations/builders/referenced/one.rb +0 -26
  1127. data/lib/mongoid/relations/builders.rb +0 -104
  1128. data/lib/mongoid/relations/cascading/delete.rb +0 -44
  1129. data/lib/mongoid/relations/cascading/destroy.rb +0 -43
  1130. data/lib/mongoid/relations/cascading/nullify.rb +0 -35
  1131. data/lib/mongoid/relations/cascading/restrict.rb +0 -39
  1132. data/lib/mongoid/relations/cascading.rb +0 -58
  1133. data/lib/mongoid/relations/constraint.rb +0 -49
  1134. data/lib/mongoid/relations/conversions.rb +0 -34
  1135. data/lib/mongoid/relations/counter_cache.rb +0 -107
  1136. data/lib/mongoid/relations/cyclic.rb +0 -107
  1137. data/lib/mongoid/relations/embedded/batchable.rb +0 -356
  1138. data/lib/mongoid/relations/embedded/in.rb +0 -231
  1139. data/lib/mongoid/relations/embedded/many.rb +0 -659
  1140. data/lib/mongoid/relations/embedded/one.rb +0 -223
  1141. data/lib/mongoid/relations/macros.rb +0 -359
  1142. data/lib/mongoid/relations/many.rb +0 -217
  1143. data/lib/mongoid/relations/marshalable.rb +0 -32
  1144. data/lib/mongoid/relations/metadata.rb +0 -1227
  1145. data/lib/mongoid/relations/nested_builder.rb +0 -74
  1146. data/lib/mongoid/relations/one.rb +0 -60
  1147. data/lib/mongoid/relations/options.rb +0 -48
  1148. data/lib/mongoid/relations/polymorphic.rb +0 -40
  1149. data/lib/mongoid/relations/proxy.rb +0 -264
  1150. data/lib/mongoid/relations/referenced/in.rb +0 -314
  1151. data/lib/mongoid/relations/referenced/many.rb +0 -789
  1152. data/lib/mongoid/relations/referenced/many_to_many.rb +0 -495
  1153. data/lib/mongoid/relations/referenced/one.rb +0 -297
  1154. data/lib/mongoid/relations/reflections.rb +0 -62
  1155. data/lib/mongoid/relations/synchronization.rb +0 -169
  1156. data/lib/mongoid/relations/targets/enumerable.rb +0 -473
  1157. data/lib/mongoid/relations/targets.rb +0 -2
  1158. data/lib/mongoid/relations/touchable.rb +0 -61
  1159. data/lib/mongoid/relations.rb +0 -162
  1160. data/lib/mongoid/reloading.rb +0 -92
  1161. data/lib/mongoid/scoping.rb +0 -356
  1162. data/lib/mongoid/serialization.rb +0 -161
  1163. data/lib/mongoid/sessions/factory.rb +0 -129
  1164. data/lib/mongoid/sessions/mongo_uri.rb +0 -93
  1165. data/lib/mongoid/sessions/validators/storage.rb +0 -49
  1166. data/lib/mongoid/sessions/validators.rb +0 -2
  1167. data/lib/mongoid/sessions.rb +0 -433
  1168. data/lib/mongoid/sharding.rb +0 -61
  1169. data/lib/mongoid/state.rb +0 -97
  1170. data/lib/mongoid/unit_of_work.rb +0 -61
  1171. data/lib/mongoid/validations/associated.rb +0 -46
  1172. data/lib/mongoid/validations/format.rb +0 -20
  1173. data/lib/mongoid/validations/length.rb +0 -20
  1174. data/lib/mongoid/validations/localizable.rb +0 -30
  1175. data/lib/mongoid/validations/macros.rb +0 -93
  1176. data/lib/mongoid/validations/presence.rb +0 -86
  1177. data/lib/mongoid/validations/queryable.rb +0 -31
  1178. data/lib/mongoid/validations/uniqueness.rb +0 -330
  1179. data/lib/mongoid/validations.rb +0 -166
  1180. data/lib/mongoid/versioning.rb +0 -217
  1181. data/lib/rack/mongoid/middleware/identity_map.rb +0 -39
  1182. data/lib/rack/mongoid.rb +0 -2
  1183. data/lib/rails/generators/mongoid/observer/observer_generator.rb +0 -17
  1184. data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +0 -4
  1185. data/lib/support/ruby_version.rb +0 -26
  1186. data/spec/app/models/account.rb +0 -32
  1187. data/spec/app/models/acolyte.rb +0 -16
  1188. data/spec/app/models/actor.rb +0 -19
  1189. data/spec/app/models/actor_observer.rb +0 -15
  1190. data/spec/app/models/actress.rb +0 -2
  1191. data/spec/app/models/address.rb +0 -72
  1192. data/spec/app/models/address_component.rb +0 -5
  1193. data/spec/app/models/address_number.rb +0 -6
  1194. data/spec/app/models/agency.rb +0 -5
  1195. data/spec/app/models/agent.rb +0 -12
  1196. data/spec/app/models/album.rb +0 -14
  1197. data/spec/app/models/alert.rb +0 -5
  1198. data/spec/app/models/animal.rb +0 -25
  1199. data/spec/app/models/answer.rb +0 -4
  1200. data/spec/app/models/appointment.rb +0 -7
  1201. data/spec/app/models/article.rb +0 -13
  1202. data/spec/app/models/artist.rb +0 -66
  1203. data/spec/app/models/artwork.rb +0 -4
  1204. data/spec/app/models/augmentation.rb +0 -11
  1205. data/spec/app/models/author.rb +0 -6
  1206. data/spec/app/models/band.rb +0 -25
  1207. data/spec/app/models/bar.rb +0 -9
  1208. data/spec/app/models/basic.rb +0 -6
  1209. data/spec/app/models/bed.rb +0 -1
  1210. data/spec/app/models/big_palette.rb +0 -2
  1211. data/spec/app/models/birthday.rb +0 -13
  1212. data/spec/app/models/book.rb +0 -12
  1213. data/spec/app/models/breed.rb +0 -4
  1214. data/spec/app/models/browser.rb +0 -6
  1215. data/spec/app/models/building.rb +0 -7
  1216. data/spec/app/models/building_address.rb +0 -7
  1217. data/spec/app/models/bus.rb +0 -7
  1218. data/spec/app/models/business.rb +0 -5
  1219. data/spec/app/models/callback_recorder.rb +0 -25
  1220. data/spec/app/models/callback_test.rb +0 -9
  1221. data/spec/app/models/canvas.rb +0 -25
  1222. data/spec/app/models/car.rb +0 -1
  1223. data/spec/app/models/cat.rb +0 -8
  1224. data/spec/app/models/category.rb +0 -8
  1225. data/spec/app/models/child.rb +0 -4
  1226. data/spec/app/models/child_doc.rb +0 -22
  1227. data/spec/app/models/church.rb +0 -4
  1228. data/spec/app/models/circle.rb +0 -3
  1229. data/spec/app/models/circuit.rb +0 -4
  1230. data/spec/app/models/circus.rb +0 -7
  1231. data/spec/app/models/code.rb +0 -5
  1232. data/spec/app/models/comment.rb +0 -16
  1233. data/spec/app/models/contractor.rb +0 -7
  1234. data/spec/app/models/cookie.rb +0 -6
  1235. data/spec/app/models/country_code.rb +0 -8
  1236. data/spec/app/models/definition.rb +0 -8
  1237. data/spec/app/models/description.rb +0 -11
  1238. data/spec/app/models/dictionary.rb +0 -10
  1239. data/spec/app/models/division.rb +0 -10
  1240. data/spec/app/models/doctor.rb +0 -12
  1241. data/spec/app/models/dog.rb +0 -7
  1242. data/spec/app/models/dokument.rb +0 -5
  1243. data/spec/app/models/driver.rb +0 -7
  1244. data/spec/app/models/drug.rb +0 -8
  1245. data/spec/app/models/email.rb +0 -6
  1246. data/spec/app/models/employer.rb +0 -5
  1247. data/spec/app/models/entry.rb +0 -6
  1248. data/spec/app/models/eraser.rb +0 -1
  1249. data/spec/app/models/event.rb +0 -22
  1250. data/spec/app/models/exhibition.rb +0 -4
  1251. data/spec/app/models/exhibitor.rb +0 -5
  1252. data/spec/app/models/eye.rb +0 -9
  1253. data/spec/app/models/eye_bowl.rb +0 -9
  1254. data/spec/app/models/face.rb +0 -8
  1255. data/spec/app/models/favorite.rb +0 -6
  1256. data/spec/app/models/filesystem.rb +0 -4
  1257. data/spec/app/models/fire_hydrant.rb +0 -6
  1258. data/spec/app/models/firefox.rb +0 -4
  1259. data/spec/app/models/fish.rb +0 -8
  1260. data/spec/app/models/folder.rb +0 -7
  1261. data/spec/app/models/folder_item.rb +0 -9
  1262. data/spec/app/models/fruits.rb +0 -28
  1263. data/spec/app/models/game.rb +0 -21
  1264. data/spec/app/models/ghost.rb +0 -7
  1265. data/spec/app/models/home.rb +0 -4
  1266. data/spec/app/models/house.rb +0 -8
  1267. data/spec/app/models/html_writer.rb +0 -3
  1268. data/spec/app/models/image.rb +0 -22
  1269. data/spec/app/models/implant.rb +0 -16
  1270. data/spec/app/models/item.rb +0 -12
  1271. data/spec/app/models/jar.rb +0 -7
  1272. data/spec/app/models/label.rb +0 -40
  1273. data/spec/app/models/language.rb +0 -5
  1274. data/spec/app/models/lat_lng.rb +0 -15
  1275. data/spec/app/models/league.rb +0 -11
  1276. data/spec/app/models/learner.rb +0 -2
  1277. data/spec/app/models/line_item.rb +0 -6
  1278. data/spec/app/models/location.rb +0 -8
  1279. data/spec/app/models/login.rb +0 -8
  1280. data/spec/app/models/manufacturer.rb +0 -7
  1281. data/spec/app/models/meat.rb +0 -4
  1282. data/spec/app/models/membership.rb +0 -4
  1283. data/spec/app/models/mixed_drink.rb +0 -4
  1284. data/spec/app/models/movie.rb +0 -12
  1285. data/spec/app/models/my_hash.rb +0 -2
  1286. data/spec/app/models/name.rb +0 -23
  1287. data/spec/app/models/node.rb +0 -5
  1288. data/spec/app/models/note.rb +0 -12
  1289. data/spec/app/models/ordered_post.rb +0 -6
  1290. data/spec/app/models/ordered_preference.rb +0 -6
  1291. data/spec/app/models/oscar.rb +0 -15
  1292. data/spec/app/models/override.rb +0 -16
  1293. data/spec/app/models/ownable.rb +0 -6
  1294. data/spec/app/models/owner.rb +0 -6
  1295. data/spec/app/models/pack.rb +0 -3
  1296. data/spec/app/models/page.rb +0 -5
  1297. data/spec/app/models/page_question.rb +0 -4
  1298. data/spec/app/models/palette.rb +0 -7
  1299. data/spec/app/models/paranoid_phone.rb +0 -25
  1300. data/spec/app/models/paranoid_post.rb +0 -36
  1301. data/spec/app/models/parent.rb +0 -5
  1302. data/spec/app/models/parent_doc.rb +0 -6
  1303. data/spec/app/models/passport.rb +0 -5
  1304. data/spec/app/models/patient.rb +0 -9
  1305. data/spec/app/models/pdf_writer.rb +0 -3
  1306. data/spec/app/models/pencil.rb +0 -1
  1307. data/spec/app/models/person.rb +0 -201
  1308. data/spec/app/models/pet.rb +0 -23
  1309. data/spec/app/models/pet_owner.rb +0 -6
  1310. data/spec/app/models/phone.rb +0 -11
  1311. data/spec/app/models/phone_observer.rb +0 -6
  1312. data/spec/app/models/pizza.rb +0 -7
  1313. data/spec/app/models/player.rb +0 -35
  1314. data/spec/app/models/post.rb +0 -43
  1315. data/spec/app/models/powerup.rb +0 -11
  1316. data/spec/app/models/preference.rb +0 -9
  1317. data/spec/app/models/princess.rb +0 -8
  1318. data/spec/app/models/product.rb +0 -17
  1319. data/spec/app/models/profile.rb +0 -5
  1320. data/spec/app/models/pronunciation.rb +0 -5
  1321. data/spec/app/models/purchase.rb +0 -4
  1322. data/spec/app/models/question.rb +0 -8
  1323. data/spec/app/models/quiz.rb +0 -10
  1324. data/spec/app/models/rating.rb +0 -8
  1325. data/spec/app/models/record.rb +0 -46
  1326. data/spec/app/models/registry.rb +0 -4
  1327. data/spec/app/models/role.rb +0 -7
  1328. data/spec/app/models/root_category.rb +0 -4
  1329. data/spec/app/models/sandwich.rb +0 -4
  1330. data/spec/app/models/scheduler.rb +0 -7
  1331. data/spec/app/models/seo.rb +0 -7
  1332. data/spec/app/models/series.rb +0 -4
  1333. data/spec/app/models/server.rb +0 -13
  1334. data/spec/app/models/service.rb +0 -22
  1335. data/spec/app/models/shape.rb +0 -12
  1336. data/spec/app/models/shelf.rb +0 -5
  1337. data/spec/app/models/shipping_container.rb +0 -5
  1338. data/spec/app/models/shipping_pack.rb +0 -3
  1339. data/spec/app/models/shop.rb +0 -6
  1340. data/spec/app/models/short_agent.rb +0 -4
  1341. data/spec/app/models/short_quiz.rb +0 -5
  1342. data/spec/app/models/slave.rb +0 -6
  1343. data/spec/app/models/song.rb +0 -8
  1344. data/spec/app/models/square.rb +0 -4
  1345. data/spec/app/models/strategy.rb +0 -3
  1346. data/spec/app/models/sub_item.rb +0 -3
  1347. data/spec/app/models/subscription.rb +0 -4
  1348. data/spec/app/models/survey.rb +0 -5
  1349. data/spec/app/models/symptom.rb +0 -6
  1350. data/spec/app/models/tag.rb +0 -8
  1351. data/spec/app/models/target.rb +0 -5
  1352. data/spec/app/models/template.rb +0 -5
  1353. data/spec/app/models/thing.rb +0 -9
  1354. data/spec/app/models/title.rb +0 -4
  1355. data/spec/app/models/tool.rb +0 -8
  1356. data/spec/app/models/topping.rb +0 -5
  1357. data/spec/app/models/track.rb +0 -38
  1358. data/spec/app/models/translation.rb +0 -5
  1359. data/spec/app/models/tree.rb +0 -9
  1360. data/spec/app/models/truck.rb +0 -3
  1361. data/spec/app/models/user.rb +0 -21
  1362. data/spec/app/models/user_account.rb +0 -10
  1363. data/spec/app/models/validation_callback.rb +0 -10
  1364. data/spec/app/models/vehicle.rb +0 -11
  1365. data/spec/app/models/version.rb +0 -5
  1366. data/spec/app/models/vet_visit.rb +0 -5
  1367. data/spec/app/models/video.rb +0 -17
  1368. data/spec/app/models/video_game.rb +0 -1
  1369. data/spec/app/models/weapon.rb +0 -11
  1370. data/spec/app/models/wiki_page.rb +0 -17
  1371. data/spec/app/models/word.rb +0 -12
  1372. data/spec/app/models/word_origin.rb +0 -11
  1373. data/spec/app/models/writer.rb +0 -11
  1374. data/spec/mongoid/atomic/positionable_spec.rb +0 -227
  1375. data/spec/mongoid/attributes/processing_spec.rb +0 -149
  1376. data/spec/mongoid/callbacks_spec.rb +0 -1564
  1377. data/spec/mongoid/components_spec.rb +0 -24
  1378. data/spec/mongoid/contextual/find_and_modify_spec.rb +0 -220
  1379. data/spec/mongoid/criterion/destructive_spec.rb +0 -101
  1380. data/spec/mongoid/criterion/inspection_spec.rb +0 -27
  1381. data/spec/mongoid/criterion/marshalable_spec.rb +0 -28
  1382. data/spec/mongoid/criterion/modifiable_spec.rb +0 -409
  1383. data/spec/mongoid/criterion/modification_spec.rb +0 -402
  1384. data/spec/mongoid/criterion/scoping_spec.rb +0 -391
  1385. data/spec/mongoid/dirty_spec.rb +0 -1508
  1386. data/spec/mongoid/errors/eager_load_spec.rb +0 -29
  1387. data/spec/mongoid/errors/mixed_session_configuration_spec.rb +0 -29
  1388. data/spec/mongoid/errors/no_session_config_spec.rb +0 -29
  1389. data/spec/mongoid/errors/no_session_database_spec.rb +0 -29
  1390. data/spec/mongoid/errors/no_session_hosts_spec.rb +0 -29
  1391. data/spec/mongoid/errors/no_sessions_config_spec.rb +0 -29
  1392. data/spec/mongoid/errors/versioning_not_on_root_spec.rb +0 -29
  1393. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +0 -184
  1394. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +0 -201
  1395. data/spec/mongoid/finders_spec.rb +0 -321
  1396. data/spec/mongoid/hierarchy_spec.rb +0 -244
  1397. data/spec/mongoid/identity_map_spec.rb +0 -564
  1398. data/spec/mongoid/indexes_spec.rb +0 -404
  1399. data/spec/mongoid/inspection_spec.rb +0 -57
  1400. data/spec/mongoid/json_spec.rb +0 -33
  1401. data/spec/mongoid/matchers/all_spec.rb +0 -31
  1402. data/spec/mongoid/matchers/and_spec.rb +0 -162
  1403. data/spec/mongoid/matchers/default_spec.rb +0 -130
  1404. data/spec/mongoid/matchers/exists_spec.rb +0 -57
  1405. data/spec/mongoid/matchers/gt_spec.rb +0 -74
  1406. data/spec/mongoid/matchers/gte_spec.rb +0 -74
  1407. data/spec/mongoid/matchers/in_spec.rb +0 -25
  1408. data/spec/mongoid/matchers/lt_spec.rb +0 -74
  1409. data/spec/mongoid/matchers/lte_spec.rb +0 -74
  1410. data/spec/mongoid/matchers/ne_spec.rb +0 -25
  1411. data/spec/mongoid/matchers/nin_spec.rb +0 -25
  1412. data/spec/mongoid/matchers/or_spec.rb +0 -106
  1413. data/spec/mongoid/matchers/size_spec.rb +0 -25
  1414. data/spec/mongoid/matchers_spec.rb +0 -532
  1415. data/spec/mongoid/multi_parameter_attributes_spec.rb +0 -128
  1416. data/spec/mongoid/nested_attributes_spec.rb +0 -4945
  1417. data/spec/mongoid/observer_spec.rb +0 -290
  1418. data/spec/mongoid/paranoia_spec.rb +0 -759
  1419. data/spec/mongoid/persistence/atomic/add_to_set_spec.rb +0 -262
  1420. data/spec/mongoid/persistence/atomic/bit_spec.rb +0 -88
  1421. data/spec/mongoid/persistence/atomic/inc_spec.rb +0 -133
  1422. data/spec/mongoid/persistence/atomic/pop_spec.rb +0 -111
  1423. data/spec/mongoid/persistence/atomic/pull_all_spec.rb +0 -77
  1424. data/spec/mongoid/persistence/atomic/pull_spec.rb +0 -80
  1425. data/spec/mongoid/persistence/atomic/push_all_spec.rb +0 -77
  1426. data/spec/mongoid/persistence/atomic/push_spec.rb +0 -77
  1427. data/spec/mongoid/persistence/atomic/rename_spec.rb +0 -42
  1428. data/spec/mongoid/persistence/atomic/sets_spec.rb +0 -154
  1429. data/spec/mongoid/persistence/atomic/unset_spec.rb +0 -65
  1430. data/spec/mongoid/persistence/atomic_spec.rb +0 -216
  1431. data/spec/mongoid/persistence/operations/embedded/insert_spec.rb +0 -191
  1432. data/spec/mongoid/persistence/operations/embedded/remove_spec.rb +0 -8
  1433. data/spec/mongoid/persistence/operations/insert_spec.rb +0 -149
  1434. data/spec/mongoid/persistence/operations/remove_spec.rb +0 -113
  1435. data/spec/mongoid/persistence/operations/update_spec.rb +0 -141
  1436. data/spec/mongoid/persistence/operations/upsert_spec.rb +0 -59
  1437. data/spec/mongoid/persistence/operations_spec.rb +0 -313
  1438. data/spec/mongoid/persistence_spec.rb +0 -2279
  1439. data/spec/mongoid/railties/document_spec.rb +0 -24
  1440. data/spec/mongoid/relations/accessors_spec.rb +0 -844
  1441. data/spec/mongoid/relations/auto_save_spec.rb +0 -261
  1442. data/spec/mongoid/relations/bindings/embedded/in_spec.rb +0 -171
  1443. data/spec/mongoid/relations/bindings/embedded/many_spec.rb +0 -54
  1444. data/spec/mongoid/relations/bindings/embedded/one_spec.rb +0 -77
  1445. data/spec/mongoid/relations/bindings/referenced/in_spec.rb +0 -241
  1446. data/spec/mongoid/relations/bindings/referenced/many_spec.rb +0 -153
  1447. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +0 -178
  1448. data/spec/mongoid/relations/bindings/referenced/one_spec.rb +0 -131
  1449. data/spec/mongoid/relations/builders/embedded/in_spec.rb +0 -34
  1450. data/spec/mongoid/relations/builders/embedded/many_spec.rb +0 -132
  1451. data/spec/mongoid/relations/builders/embedded/one_spec.rb +0 -99
  1452. data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +0 -234
  1453. data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +0 -250
  1454. data/spec/mongoid/relations/builders/referenced/in_spec.rb +0 -241
  1455. data/spec/mongoid/relations/builders/referenced/many_spec.rb +0 -137
  1456. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +0 -178
  1457. data/spec/mongoid/relations/builders/referenced/one_spec.rb +0 -124
  1458. data/spec/mongoid/relations/builders_spec.rb +0 -226
  1459. data/spec/mongoid/relations/cascading/delete_spec.rb +0 -101
  1460. data/spec/mongoid/relations/cascading/destroy_spec.rb +0 -47
  1461. data/spec/mongoid/relations/cascading/nullify_spec.rb +0 -32
  1462. data/spec/mongoid/relations/cascading/restrict_spec.rb +0 -68
  1463. data/spec/mongoid/relations/cascading_spec.rb +0 -355
  1464. data/spec/mongoid/relations/constraint_spec.rb +0 -74
  1465. data/spec/mongoid/relations/conversions_spec.rb +0 -126
  1466. data/spec/mongoid/relations/counter_cache_spec.rb +0 -205
  1467. data/spec/mongoid/relations/cyclic_spec.rb +0 -156
  1468. data/spec/mongoid/relations/embedded/dirty_spec.rb +0 -65
  1469. data/spec/mongoid/relations/embedded/in_spec.rb +0 -580
  1470. data/spec/mongoid/relations/embedded/many_spec.rb +0 -3841
  1471. data/spec/mongoid/relations/embedded/one_spec.rb +0 -1055
  1472. data/spec/mongoid/relations/macros_spec.rb +0 -625
  1473. data/spec/mongoid/relations/metadata_spec.rb +0 -2030
  1474. data/spec/mongoid/relations/options_spec.rb +0 -35
  1475. data/spec/mongoid/relations/polymorphic_spec.rb +0 -132
  1476. data/spec/mongoid/relations/referenced/in_spec.rb +0 -1501
  1477. data/spec/mongoid/relations/referenced/many_spec.rb +0 -3632
  1478. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +0 -3561
  1479. data/spec/mongoid/relations/referenced/one_spec.rb +0 -1331
  1480. data/spec/mongoid/relations/reflections_spec.rb +0 -101
  1481. data/spec/mongoid/relations/synchronization_spec.rb +0 -453
  1482. data/spec/mongoid/relations/targets/enumerable_spec.rb +0 -1710
  1483. data/spec/mongoid/relations_spec.rb +0 -188
  1484. data/spec/mongoid/reloading_spec.rb +0 -305
  1485. data/spec/mongoid/scoping_spec.rb +0 -978
  1486. data/spec/mongoid/serialization_spec.rb +0 -833
  1487. data/spec/mongoid/sessions/factory_spec.rb +0 -312
  1488. data/spec/mongoid/sessions/mongo_uri_spec.rb +0 -103
  1489. data/spec/mongoid/sessions_spec.rb +0 -1111
  1490. data/spec/mongoid/sharding_spec.rb +0 -61
  1491. data/spec/mongoid/state_spec.rb +0 -102
  1492. data/spec/mongoid/unit_of_work_spec.rb +0 -196
  1493. data/spec/mongoid/validations/associated_spec.rb +0 -183
  1494. data/spec/mongoid/validations/format_spec.rb +0 -83
  1495. data/spec/mongoid/validations/length_spec.rb +0 -223
  1496. data/spec/mongoid/validations/numericality_spec.rb +0 -30
  1497. data/spec/mongoid/validations/presence_spec.rb +0 -592
  1498. data/spec/mongoid/validations/uniqueness_spec.rb +0 -2399
  1499. data/spec/mongoid/validations_spec.rb +0 -309
  1500. data/spec/mongoid/versioning_spec.rb +0 -540
  1501. data/spec/rack/mongoid/middleware/identity_map_spec.rb +0 -72
@@ -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 a MissingAttributeError" 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(ActiveModel::MissingAttributeError)
2371
+ end
2372
+ end
2373
+ end