mongoid 6.4.2 → 7.0.3

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 (318) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/lib/config/locales/en.yml +17 -0
  4. data/lib/mongoid/association/accessors.rb +339 -0
  5. data/lib/mongoid/{relations/binding.rb → association/bindable.rb} +32 -52
  6. data/lib/mongoid/association/builders.rb +92 -0
  7. data/lib/mongoid/{relations/constraint.rb → association/constrainable.rb} +11 -22
  8. data/lib/mongoid/association/depending.rb +137 -0
  9. data/lib/mongoid/{relations/eager.rb → association/eager_loadable.rb} +11 -11
  10. data/lib/mongoid/{relations → association}/embedded/batchable.rb +19 -19
  11. data/lib/mongoid/association/embedded/cyclic.rb +109 -0
  12. data/lib/mongoid/association/embedded/embedded_in/binding.rb +56 -0
  13. data/lib/mongoid/{relations/builders/embedded/in.rb → association/embedded/embedded_in/buildable.rb} +12 -6
  14. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +121 -0
  15. data/lib/mongoid/association/embedded/embedded_in.rb +154 -0
  16. data/lib/mongoid/{relations/bindings/embedded/many.rb → association/embedded/embeds_many/binding.rb} +11 -9
  17. data/lib/mongoid/{relations/builders/embedded/many.rb → association/embedded/embeds_many/buildable.rb} +13 -7
  18. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +552 -0
  19. data/lib/mongoid/association/embedded/embeds_many.rb +210 -0
  20. data/lib/mongoid/{relations/bindings/embedded/one.rb → association/embedded/embeds_one/binding.rb} +12 -10
  21. data/lib/mongoid/{relations/builders/embedded/one.rb → association/embedded/embeds_one/buildable.rb} +13 -7
  22. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +130 -0
  23. data/lib/mongoid/association/embedded/embeds_one.rb +173 -0
  24. data/lib/mongoid/association/embedded.rb +4 -0
  25. data/lib/mongoid/association/macros.rb +204 -0
  26. data/lib/mongoid/{relations → association}/many.rb +19 -49
  27. data/lib/mongoid/{relations → association}/marshalable.rb +6 -4
  28. data/lib/mongoid/association/nested/many.rb +200 -0
  29. data/lib/mongoid/association/nested/nested_buildable.rb +72 -0
  30. data/lib/mongoid/association/nested/one.rb +127 -0
  31. data/lib/mongoid/association/nested.rb +15 -0
  32. data/lib/mongoid/{relations → association}/one.rb +6 -6
  33. data/lib/mongoid/association/options.rb +152 -0
  34. data/lib/mongoid/{relations → association}/proxy.rb +31 -58
  35. data/lib/mongoid/association/referenced/auto_save.rb +79 -0
  36. data/lib/mongoid/association/referenced/belongs_to/binding.rb +87 -0
  37. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +46 -0
  38. data/lib/mongoid/association/referenced/belongs_to/eager.rb +36 -0
  39. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +136 -0
  40. data/lib/mongoid/association/referenced/belongs_to.rb +248 -0
  41. data/lib/mongoid/association/referenced/counter_cache.rb +163 -0
  42. data/lib/mongoid/association/referenced/eager.rb +162 -0
  43. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +71 -0
  44. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +40 -0
  45. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +52 -0
  46. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +312 -0
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +290 -0
  48. data/lib/mongoid/{relations/bindings/referenced/many.rb → association/referenced/has_many/binding.rb} +6 -5
  49. data/lib/mongoid/association/referenced/has_many/buildable.rb +38 -0
  50. data/lib/mongoid/association/referenced/has_many/eager.rb +43 -0
  51. data/lib/mongoid/association/referenced/has_many/enumerable.rb +510 -0
  52. data/lib/mongoid/association/referenced/has_many/proxy.rb +578 -0
  53. data/lib/mongoid/association/referenced/has_many.rb +275 -0
  54. data/lib/mongoid/{relations/bindings/referenced/one.rb → association/referenced/has_one/binding.rb} +11 -8
  55. data/lib/mongoid/association/referenced/has_one/buildable.rb +60 -0
  56. data/lib/mongoid/association/referenced/has_one/eager.rb +35 -0
  57. data/lib/mongoid/{relations/builders/nested_attributes/one.rb → association/referenced/has_one/nested_builder.rb} +9 -9
  58. data/lib/mongoid/association/referenced/has_one/proxy.rb +113 -0
  59. data/lib/mongoid/association/referenced/has_one.rb +204 -0
  60. data/lib/mongoid/association/referenced/syncable.rb +170 -0
  61. data/lib/mongoid/association/referenced.rb +7 -0
  62. data/lib/mongoid/{relations → association}/reflections.rb +21 -17
  63. data/lib/mongoid/association/relatable.rb +509 -0
  64. data/lib/mongoid/{relations.rb → association.rb} +57 -56
  65. data/lib/mongoid/atomic/paths/embedded/many.rb +1 -1
  66. data/lib/mongoid/atomic/paths/embedded/one.rb +1 -1
  67. data/lib/mongoid/atomic.rb +4 -4
  68. data/lib/mongoid/attributes/dynamic.rb +2 -2
  69. data/lib/mongoid/attributes/nested.rb +22 -11
  70. data/lib/mongoid/attributes/processing.rb +2 -2
  71. data/lib/mongoid/attributes/readonly.rb +2 -4
  72. data/lib/mongoid/attributes.rb +22 -13
  73. data/lib/mongoid/changeable.rb +1 -1
  74. data/lib/mongoid/clients/options.rb +7 -5
  75. data/lib/mongoid/composable.rb +4 -4
  76. data/lib/mongoid/config.rb +1 -0
  77. data/lib/mongoid/contextual/atomic.rb +1 -1
  78. data/lib/mongoid/contextual/geo_near.rb +1 -1
  79. data/lib/mongoid/contextual/memory.rb +21 -3
  80. data/lib/mongoid/contextual/mongo.rb +10 -8
  81. data/lib/mongoid/copyable.rb +7 -6
  82. data/lib/mongoid/criteria/includable.rb +14 -14
  83. data/lib/mongoid/criteria/modifiable.rb +8 -14
  84. data/lib/mongoid/criteria/options.rb +2 -2
  85. data/lib/mongoid/criteria/queryable/extensions/string.rb +1 -1
  86. data/lib/mongoid/criteria/queryable/pipeline.rb +10 -5
  87. data/lib/mongoid/criteria/queryable/selectable.rb +37 -7
  88. data/lib/mongoid/criteria.rb +2 -2
  89. data/lib/mongoid/document.rb +15 -6
  90. data/lib/mongoid/errors/invalid_dependent_strategy.rb +32 -0
  91. data/lib/mongoid/errors/invalid_relation_option.rb +29 -0
  92. data/lib/mongoid/errors/unknown_model.rb +25 -0
  93. data/lib/mongoid/errors.rb +3 -0
  94. data/lib/mongoid/extensions/array.rb +5 -5
  95. data/lib/mongoid/extensions/big_decimal.rb +1 -1
  96. data/lib/mongoid/extensions/hash.rb +5 -2
  97. data/lib/mongoid/extensions/object.rb +4 -4
  98. data/lib/mongoid/extensions/range.rb +1 -0
  99. data/lib/mongoid/extensions/regexp.rb +1 -0
  100. data/lib/mongoid/extensions.rb +0 -4
  101. data/lib/mongoid/factory.rb +13 -3
  102. data/lib/mongoid/fields/foreign_key.rb +5 -5
  103. data/lib/mongoid/fields/standard.rb +2 -14
  104. data/lib/mongoid/fields/validators/macro.rb +1 -1
  105. data/lib/mongoid/fields.rb +3 -3
  106. data/lib/mongoid/indexable.rb +4 -1
  107. data/lib/mongoid/interceptable.rb +5 -5
  108. data/lib/mongoid/matchable/and.rb +1 -1
  109. data/lib/mongoid/matchable/elem_match.rb +9 -3
  110. data/lib/mongoid/matchable/eq.rb +22 -0
  111. data/lib/mongoid/matchable/ne.rb +1 -1
  112. data/lib/mongoid/matchable.rb +3 -1
  113. data/lib/mongoid/persistable/deletable.rb +7 -6
  114. data/lib/mongoid/persistable/incrementable.rb +1 -1
  115. data/lib/mongoid/persistable/logical.rb +1 -1
  116. data/lib/mongoid/persistable/settable.rb +57 -12
  117. data/lib/mongoid/persistable.rb +4 -5
  118. data/lib/mongoid/persistence_context.rb +20 -5
  119. data/lib/mongoid/query_cache.rb +8 -4
  120. data/lib/mongoid/railtie.rb +17 -0
  121. data/lib/mongoid/railties/controller_runtime.rb +86 -0
  122. data/lib/mongoid/scopable.rb +3 -3
  123. data/lib/mongoid/serializable.rb +4 -4
  124. data/lib/mongoid/shardable.rb +1 -1
  125. data/lib/mongoid/threaded.rb +36 -0
  126. data/lib/mongoid/touchable.rb +102 -0
  127. data/lib/mongoid/traversable.rb +3 -3
  128. data/lib/mongoid/validatable/presence.rb +2 -2
  129. data/lib/mongoid/validatable/uniqueness.rb +4 -4
  130. data/lib/mongoid/validatable.rb +8 -8
  131. data/lib/mongoid/version.rb +1 -1
  132. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +3 -0
  133. data/spec/app/models/animal.rb +2 -1
  134. data/spec/app/models/bomb.rb +1 -1
  135. data/spec/app/models/message.rb +1 -1
  136. data/spec/app/models/minim.rb +7 -0
  137. data/spec/app/models/person.rb +5 -2
  138. data/spec/app/models/shipment_address.rb +1 -0
  139. data/spec/app/models/store_as_dup_test3.rb +7 -0
  140. data/spec/app/models/store_as_dup_test4.rb +7 -0
  141. data/spec/app/models/updatable.rb +7 -0
  142. data/spec/app/models/vertex.rb +6 -0
  143. data/spec/app/models/wiki_page.rb +1 -1
  144. data/spec/config/mongoid.yml +13 -3
  145. data/spec/integration/associations/belongs_to_spec.rb +13 -0
  146. data/spec/lite_spec_helper.rb +56 -0
  147. data/spec/mongoid/{relations → association}/accessors_spec.rb +40 -1
  148. data/spec/mongoid/{relations → association}/auto_save_spec.rb +60 -12
  149. data/spec/mongoid/{relations → association}/builders_spec.rb +1 -1
  150. data/spec/mongoid/association/constrainable_spec.rb +115 -0
  151. data/spec/mongoid/{relations → association}/counter_cache_spec.rb +1 -1
  152. data/spec/mongoid/association/depending_spec.rb +866 -0
  153. data/spec/mongoid/{relations → association}/eager_spec.rb +12 -12
  154. data/spec/mongoid/{relations → association/embedded}/cyclic_spec.rb +1 -1
  155. data/spec/mongoid/{relations/bindings/embedded/in_spec.rb → association/embedded/embedded_in/binding_spec.rb} +13 -13
  156. data/spec/mongoid/{relations/builders/embedded/in_spec.rb → association/embedded/embedded_in/buildable_spec.rb} +9 -9
  157. data/spec/mongoid/{relations/embedded/in_spec.rb → association/embedded/embedded_in/proxy_spec.rb} +5 -77
  158. data/spec/mongoid/association/embedded/embedded_in_spec.rb +843 -0
  159. data/spec/mongoid/{relations/bindings/embedded/many_spec.rb → association/embedded/embeds_many/binding_spec.rb} +3 -3
  160. data/spec/mongoid/{relations/builders/embedded/many_spec.rb → association/embedded/embeds_many/buildable_spec.rb} +17 -45
  161. data/spec/mongoid/{relations/embedded/many_spec.rb → association/embedded/embeds_many/proxy_spec.rb} +124 -182
  162. data/spec/mongoid/association/embedded/embeds_many_spec.rb +852 -0
  163. data/spec/mongoid/{relations/bindings/embedded/one_spec.rb → association/embedded/embeds_one/binding_spec.rb} +4 -4
  164. data/spec/mongoid/{relations/builders/embedded/one_spec.rb → association/embedded/embeds_one/buildable_spec.rb} +14 -34
  165. data/spec/mongoid/{relations/embedded/one_spec.rb → association/embedded/embeds_one/proxy_spec.rb} +39 -84
  166. data/spec/mongoid/association/embedded/embeds_one_spec.rb +908 -0
  167. data/spec/mongoid/{relations → association}/macros_spec.rb +148 -73
  168. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/many_spec.rb +16 -19
  169. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/one_spec.rb +17 -20
  170. data/spec/mongoid/association/options_spec.rb +1321 -0
  171. data/spec/mongoid/{relations → association}/polymorphic_spec.rb +66 -34
  172. data/spec/mongoid/{relations/bindings/referenced/in_spec.rb → association/referenced/belongs_to/binding_spec.rb} +7 -7
  173. data/spec/mongoid/{relations/builders/referenced/in_spec.rb → association/referenced/belongs_to/buildable_spec.rb} +46 -79
  174. data/spec/mongoid/{relations/eager/belongs_to_spec.rb → association/referenced/belongs_to/eager_spec.rb} +33 -14
  175. data/spec/mongoid/{relations/referenced/in_spec.rb → association/referenced/belongs_to/proxy_spec.rb} +57 -91
  176. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2006 -0
  177. data/spec/mongoid/{relations/bindings/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/binding_spec.rb} +5 -5
  178. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +121 -0
  179. data/spec/mongoid/{relations/eager/has_and_belongs_to_many_spec.rb → association/referenced/has_and_belongs_to_many/eager_spec.rb} +26 -7
  180. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +56 -0
  181. data/spec/mongoid/{relations/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/proxy_spec.rb} +107 -98
  182. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +26 -0
  183. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +1027 -0
  184. data/spec/mongoid/{relations/bindings/referenced/many_spec.rb → association/referenced/has_many/binding_spec.rb} +5 -5
  185. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +119 -0
  186. data/spec/mongoid/{relations/eager/has_many_spec.rb → association/referenced/has_many/eager_spec.rb} +26 -11
  187. data/spec/mongoid/{relations/targets → association/referenced/has_many}/enumerable_spec.rb +122 -1
  188. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +23 -0
  189. data/spec/mongoid/{relations/referenced/many_spec.rb → association/referenced/has_many/proxy_spec.rb} +28 -93
  190. data/spec/mongoid/association/referenced/has_many_models.rb +37 -0
  191. data/spec/mongoid/association/referenced/has_many_spec.rb +1225 -0
  192. data/spec/mongoid/{relations/bindings/referenced/one_spec.rb → association/referenced/has_one/binding_spec.rb} +4 -4
  193. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +113 -0
  194. data/spec/mongoid/{relations/eager/has_one_spec.rb → association/referenced/has_one/eager_spec.rb} +10 -10
  195. data/spec/mongoid/{relations/referenced/one_spec.rb → association/referenced/has_one/proxy_spec.rb} +9 -109
  196. data/spec/mongoid/association/referenced/has_one_models.rb +48 -0
  197. data/spec/mongoid/association/referenced/has_one_spec.rb +1350 -0
  198. data/spec/mongoid/{relations → association}/reflections_spec.rb +1 -12
  199. data/spec/mongoid/{relations/synchronization_spec.rb → association/syncable_spec.rb} +4 -2
  200. data/spec/mongoid/{relations_spec.rb → association_spec.rb} +1 -1
  201. data/spec/mongoid/atomic/modifiers_spec.rb +2 -2
  202. data/spec/mongoid/atomic_spec.rb +4 -4
  203. data/spec/mongoid/attributes/nested_spec.rb +29 -11
  204. data/spec/mongoid/attributes/readonly_spec.rb +80 -125
  205. data/spec/mongoid/attributes_spec.rb +38 -2
  206. data/spec/mongoid/clients/factory_spec.rb +24 -18
  207. data/spec/mongoid/clients/options_spec.rb +58 -44
  208. data/spec/mongoid/clients/sessions_spec.rb +1 -1
  209. data/spec/mongoid/clients/transactions_spec.rb +369 -0
  210. data/spec/mongoid/clients_spec.rb +68 -8
  211. data/spec/mongoid/config_spec.rb +27 -1
  212. data/spec/mongoid/contextual/memory_spec.rb +19 -0
  213. data/spec/mongoid/contextual/mongo_spec.rb +33 -5
  214. data/spec/mongoid/copyable_spec.rb +90 -6
  215. data/spec/mongoid/copyable_spec_models.rb +17 -0
  216. data/spec/mongoid/criteria/modifiable_spec.rb +183 -60
  217. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +3 -3
  218. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +43 -0
  219. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +12 -0
  220. data/spec/mongoid/criteria/queryable/selectable_spec.rb +42 -3
  221. data/spec/mongoid/criteria/queryable/selector_spec.rb +2 -2
  222. data/spec/mongoid/criteria/scopable_spec.rb +81 -0
  223. data/spec/mongoid/criteria_spec.rb +33 -18
  224. data/spec/mongoid/document_spec.rb +83 -4
  225. data/spec/mongoid/extensions/array_spec.rb +11 -15
  226. data/spec/mongoid/extensions/big_decimal_spec.rb +9 -9
  227. data/spec/mongoid/extensions/hash_spec.rb +18 -1
  228. data/spec/mongoid/extensions/object_spec.rb +7 -11
  229. data/spec/mongoid/extensions/range_spec.rb +7 -0
  230. data/spec/mongoid/extensions/regexp_spec.rb +23 -0
  231. data/spec/mongoid/factory_spec.rb +19 -1
  232. data/spec/mongoid/fields/foreign_key_spec.rb +24 -32
  233. data/spec/mongoid/fields_spec.rb +2 -2
  234. data/spec/mongoid/findable_spec.rb +1 -1
  235. data/spec/mongoid/indexable_spec.rb +18 -8
  236. data/spec/mongoid/interceptable_spec.rb +22 -1
  237. data/spec/mongoid/matchable/elem_match_spec.rb +20 -0
  238. data/spec/mongoid/matchable/eq_spec.rb +48 -0
  239. data/spec/mongoid/persistable/incrementable_spec.rb +6 -6
  240. data/spec/mongoid/persistable/savable_spec.rb +2 -2
  241. data/spec/mongoid/persistable/settable_spec.rb +95 -10
  242. data/spec/mongoid/persistable_spec.rb +21 -6
  243. data/spec/mongoid/persistence_context_spec.rb +1 -1
  244. data/spec/mongoid/query_cache_spec.rb +61 -22
  245. data/spec/mongoid/relations/proxy_spec.rb +124 -124
  246. data/spec/mongoid/scopable_spec.rb +13 -0
  247. data/spec/mongoid/shardable_spec.rb +32 -12
  248. data/spec/mongoid/threaded_spec.rb +68 -0
  249. data/spec/mongoid/{relations/touchable_spec.rb → touchable_spec.rb} +40 -1
  250. data/spec/mongoid/validatable/associated_spec.rb +1 -1
  251. data/spec/mongoid/validatable/presence_spec.rb +7 -6
  252. data/spec/mongoid/validatable_spec.rb +1 -1
  253. data/spec/rails/controller_extension/controller_runtime_spec.rb +110 -0
  254. data/spec/spec_helper.rb +51 -25
  255. data/spec/support/constraints.rb +101 -0
  256. data/spec/support/macros.rb +20 -0
  257. data/spec/support/spec_config.rb +39 -0
  258. metadata +602 -582
  259. checksums.yaml.gz.sig +0 -2
  260. data/lib/mongoid/relations/accessors.rb +0 -267
  261. data/lib/mongoid/relations/auto_save.rb +0 -94
  262. data/lib/mongoid/relations/bindings/embedded/in.rb +0 -59
  263. data/lib/mongoid/relations/bindings/referenced/in.rb +0 -65
  264. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +0 -70
  265. data/lib/mongoid/relations/bindings.rb +0 -9
  266. data/lib/mongoid/relations/builder.rb +0 -57
  267. data/lib/mongoid/relations/builders/nested_attributes/many.rb +0 -199
  268. data/lib/mongoid/relations/builders/referenced/in.rb +0 -26
  269. data/lib/mongoid/relations/builders/referenced/many.rb +0 -26
  270. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +0 -39
  271. data/lib/mongoid/relations/builders/referenced/one.rb +0 -26
  272. data/lib/mongoid/relations/builders.rb +0 -106
  273. data/lib/mongoid/relations/cascading/delete.rb +0 -44
  274. data/lib/mongoid/relations/cascading/destroy.rb +0 -43
  275. data/lib/mongoid/relations/cascading/nullify.rb +0 -35
  276. data/lib/mongoid/relations/cascading/restrict.rb +0 -39
  277. data/lib/mongoid/relations/cascading.rb +0 -56
  278. data/lib/mongoid/relations/conversions.rb +0 -34
  279. data/lib/mongoid/relations/counter_cache.rb +0 -160
  280. data/lib/mongoid/relations/cyclic.rb +0 -107
  281. data/lib/mongoid/relations/eager/base.rb +0 -153
  282. data/lib/mongoid/relations/eager/belongs_to.rb +0 -31
  283. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +0 -47
  284. data/lib/mongoid/relations/eager/has_many.rb +0 -38
  285. data/lib/mongoid/relations/eager/has_one.rb +0 -30
  286. data/lib/mongoid/relations/embedded/in.rb +0 -241
  287. data/lib/mongoid/relations/embedded/many.rb +0 -683
  288. data/lib/mongoid/relations/embedded/one.rb +0 -235
  289. data/lib/mongoid/relations/macros.rb +0 -367
  290. data/lib/mongoid/relations/metadata.rb +0 -1179
  291. data/lib/mongoid/relations/nested_builder.rb +0 -74
  292. data/lib/mongoid/relations/options.rb +0 -49
  293. data/lib/mongoid/relations/polymorphic.rb +0 -39
  294. data/lib/mongoid/relations/referenced/in.rb +0 -304
  295. data/lib/mongoid/relations/referenced/many.rb +0 -812
  296. data/lib/mongoid/relations/referenced/many_to_many.rb +0 -479
  297. data/lib/mongoid/relations/referenced/one.rb +0 -290
  298. data/lib/mongoid/relations/synchronization.rb +0 -169
  299. data/lib/mongoid/relations/targets/enumerable.rb +0 -493
  300. data/lib/mongoid/relations/targets.rb +0 -2
  301. data/lib/mongoid/relations/touchable.rb +0 -97
  302. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +0 -184
  303. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +0 -201
  304. data/spec/mongoid/relations/builders/referenced/many_spec.rb +0 -137
  305. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +0 -178
  306. data/spec/mongoid/relations/builders/referenced/one_spec.rb +0 -111
  307. data/spec/mongoid/relations/cascading/delete_spec.rb +0 -101
  308. data/spec/mongoid/relations/cascading/destroy_spec.rb +0 -47
  309. data/spec/mongoid/relations/cascading/nullify_spec.rb +0 -32
  310. data/spec/mongoid/relations/cascading/restrict_spec.rb +0 -68
  311. data/spec/mongoid/relations/cascading_spec.rb +0 -355
  312. data/spec/mongoid/relations/constraint_spec.rb +0 -75
  313. data/spec/mongoid/relations/conversions_spec.rb +0 -128
  314. data/spec/mongoid/relations/metadata_spec.rb +0 -1985
  315. data/spec/mongoid/relations/options_spec.rb +0 -35
  316. data.tar.gz.sig +0 -0
  317. metadata.gz.sig +0 -0
  318. /data/spec/mongoid/{relations → association}/embedded/dirty_spec.rb +0 -0
@@ -0,0 +1,866 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Association::Depending do
4
+
5
+ describe '#self.included' do
6
+
7
+ context 'when a destroy dependent is defined' do
8
+
9
+ context 'when the model is a subclass' do
10
+
11
+ context 'when transitive dependents are defined' do
12
+
13
+ let(:define_classes) do
14
+ class DependentReportCard
15
+ include Mongoid::Document
16
+
17
+ belongs_to :dependent_student
18
+ end
19
+
20
+ class DependentUser
21
+ include Mongoid::Document
22
+ end
23
+
24
+ class DependentStudent < DependentUser
25
+ belongs_to :dependent_teacher
26
+ has_many :dependent_report_cards, dependent: :destroy
27
+ end
28
+
29
+ class DependentDerivedStudent < DependentStudent; end
30
+
31
+ class DependentTeacher
32
+ include Mongoid::Document
33
+
34
+ has_many :dependent_students, dependent: :destroy
35
+ end
36
+
37
+ class DependentCollegeUser < DependentUser; end
38
+ end
39
+
40
+ it "does not add the dependent to superclass" do
41
+ define_classes
42
+
43
+ expect(DependentUser.dependents).to be_empty
44
+
45
+ u = DependentUser.create!
46
+ expect(u.dependents).to be_empty
47
+ end
48
+
49
+ it 'does not impede destroying the superclass' do
50
+ define_classes
51
+
52
+ u = DependentUser.create!
53
+ expect { u.destroy! }.not_to raise_error
54
+ end
55
+
56
+ it 'adds the dependent' do
57
+ define_classes
58
+
59
+ expect(DependentStudent.dependents.length).to be(1)
60
+ expect(DependentStudent.dependents.first.name).to be(:dependent_report_cards)
61
+
62
+ s = DependentStudent.create!
63
+ expect(s.dependents.length).to be(1)
64
+ expect(s.dependents.first.name).to be(:dependent_report_cards)
65
+ end
66
+
67
+ it 'facilitates proper destroying of the object' do
68
+ define_classes
69
+
70
+ s = DependentStudent.create!
71
+ r = DependentReportCard.create!(dependent_student: s)
72
+ s.destroy!
73
+
74
+ expect { DependentReportCard.find(r.id) }.to raise_error(Mongoid::Errors::DocumentNotFound)
75
+ end
76
+
77
+ it 'facilitates proper transitive destroying of the object' do
78
+ define_classes
79
+
80
+ t = DependentTeacher.create!
81
+ s = DependentStudent.create!(dependent_teacher: t)
82
+ r = DependentReportCard.create!(dependent_student: s)
83
+ s.destroy!
84
+
85
+ expect { DependentReportCard.find(r.id) }.to raise_error(Mongoid::Errors::DocumentNotFound)
86
+ end
87
+
88
+ it 'adds the dependent to subclasses' do
89
+ define_classes
90
+
91
+ expect(DependentDerivedStudent.dependents.length).to be(1)
92
+ expect(DependentDerivedStudent.dependents.first.name).to be(:dependent_report_cards)
93
+
94
+ s = DependentDerivedStudent.create!
95
+ expect(s.dependents.length).to be(1)
96
+ expect(s.dependents.first.name).to be(:dependent_report_cards)
97
+ end
98
+
99
+ it 'facilitates proper destroying of the object from subclasses' do
100
+ define_classes
101
+
102
+ s = DependentDerivedStudent.create!
103
+ r = DependentReportCard.create!(dependent_student: s)
104
+ s.destroy!
105
+
106
+ expect { DependentReportCard.find(r.id) }.to raise_error(Mongoid::Errors::DocumentNotFound)
107
+ end
108
+
109
+ it "doesn't add the dependent to sibling classes" do
110
+ define_classes
111
+
112
+ expect(DependentCollegeUser.dependents).to be_empty
113
+
114
+ c = DependentCollegeUser.create!
115
+ expect(c.dependents).to be_empty
116
+ end
117
+
118
+ it 'does not impede destroying the sibling class' do
119
+ define_classes
120
+
121
+ c = DependentCollegeUser.create!
122
+ expect { c.destroy! }.not_to raise_error
123
+ end
124
+ end
125
+
126
+ context 'when a superclass is reopened and a new dependent is added' do
127
+ let(:define_classes) do
128
+ class DependentOwnedOne
129
+ include Mongoid::Document
130
+
131
+ belongs_to :dependent_superclass
132
+ end
133
+
134
+ class DependentOwnedTwo
135
+ include Mongoid::Document
136
+
137
+ belongs_to :dependent_superclass
138
+ end
139
+
140
+ class DependentSuperclass
141
+ include Mongoid::Document
142
+ has_one :dependent_owned_one
143
+ has_one :dependent_owned_two
144
+ end
145
+
146
+ class DependentSubclass < DependentSuperclass
147
+ has_one :dependent_owned_two, dependent: :nullify
148
+ end
149
+
150
+ class DependentSuperclass
151
+ has_one :dependent_owned_one, dependent: :destroy
152
+ end
153
+ end
154
+
155
+ it 'defines the dependent from the reopened superclass on the subclass' do
156
+ define_classes
157
+
158
+ DependentSubclass.create!.destroy!
159
+
160
+ expect(DependentSubclass.dependents.length).to be(1)
161
+ expect(DependentSubclass.dependents.last.name).to be(:dependent_owned_two)
162
+ expect(DependentSubclass.dependents.last.options[:dependent]).to be(:nullify)
163
+
164
+ subclass = DependentSubclass.create!
165
+ expect(subclass.dependents.last.name).to be(:dependent_owned_two)
166
+ expect(subclass.dependents.last.options[:dependent]).to be(:nullify)
167
+ end
168
+
169
+ it 'causes the destruction of the inherited destroy dependent' do
170
+ define_classes
171
+
172
+ subclass = DependentSubclass.create!
173
+ owned = DependentOwnedOne.create!(dependent_superclass: subclass)
174
+ subclass.destroy!
175
+
176
+ expect {
177
+ DependentOwnedOne.find(owned.id)
178
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
179
+ end
180
+ end
181
+
182
+ context 'when a separate subclass overrides the destroy dependent' do
183
+ let(:define_classes) do
184
+ class Dep
185
+ include Mongoid::Document
186
+
187
+ belongs_to :double_assoc
188
+ end
189
+
190
+ class DoubleAssoc
191
+ include Mongoid::Document
192
+
193
+ has_many :deps, dependent: :destroy
194
+ end
195
+
196
+ class DoubleAssocOne < DoubleAssoc
197
+ has_many :deps, dependent: :nullify, inverse_of: :double_assoc
198
+ end
199
+
200
+ class DoubleAssocTwo < DoubleAssocOne
201
+ has_many :deps, dependent: :destroy, inverse_of: :double_assoc
202
+ end
203
+
204
+ class DoubleAssocThree < DoubleAssoc; end
205
+ end
206
+
207
+ it 'adds the non-destroy dependent correctly to the subclass with the override' do
208
+ define_classes
209
+
210
+ expect(DoubleAssocOne.dependents.length).to be(1)
211
+ expect(DoubleAssocOne.dependents.first.name).to be(:deps)
212
+ expect(DoubleAssocOne.dependents.first.options[:dependent]).to be(:nullify)
213
+
214
+ one = DoubleAssocOne.create!
215
+ expect(one.dependents.length).to be(1)
216
+ expect(one.dependents.first.name).to be(:deps)
217
+ expect(one.dependents.first.options[:dependent]).to be(:nullify)
218
+ end
219
+
220
+ it 'does not cause the destruction of the non-destroy dependent' do
221
+ define_classes
222
+
223
+ one = DoubleAssocOne.create!
224
+ dep = Dep.create!(double_assoc: one)
225
+ one.destroy!
226
+
227
+ expect { Dep.find(dep.id) }.not_to raise_error
228
+ expect(dep.double_assoc).to be_nil
229
+ end
230
+
231
+ it 'adds the destroy dependent correctly to the subclass without the override' do
232
+ define_classes
233
+
234
+ expect(DoubleAssocTwo.dependents.length).to be(1)
235
+ expect(DoubleAssocTwo.dependents.first.name).to be(:deps)
236
+ expect(DoubleAssocTwo.dependents.first.options[:dependent]).to be(:destroy)
237
+
238
+ two = DoubleAssocTwo.create!
239
+ expect(two.dependents.length).to be(1)
240
+ expect(two.dependents.first.name).to be(:deps)
241
+ expect(two.dependents.first.options[:dependent]).to be(:destroy)
242
+ end
243
+
244
+ it 'causes the destruction of the destroy dependent' do
245
+ define_classes
246
+
247
+ two = DoubleAssocTwo.create!
248
+ dep = Dep.create!(double_assoc: two)
249
+ two.destroy!
250
+
251
+ expect { Dep.find(dep.id) }.to raise_error(Mongoid::Errors::DocumentNotFound)
252
+ end
253
+ end
254
+ end
255
+ end
256
+ end
257
+
258
+ around(:each) do |example|
259
+ relations_before = Person.relations
260
+ example.run
261
+ Person.relations = relations_before
262
+ end
263
+
264
+ describe "#apply_delete_dependencies!" do
265
+
266
+ let(:band) do
267
+ Band.new
268
+ end
269
+
270
+ context "when the association exists in the list of dependencies" do
271
+
272
+ context "when the association has no dependent strategy" do
273
+
274
+ before do
275
+ band.dependents.push(Band.relations["records"])
276
+ end
277
+
278
+ after do
279
+ band.dependents.delete(Band.relations["records"])
280
+ end
281
+
282
+ it "ignores the dependency" do
283
+ expect(band.apply_delete_dependencies!).to eq([Band.relations["records"]])
284
+ end
285
+ end
286
+ end
287
+ end
288
+
289
+ describe ".define_dependency!" do
290
+
291
+ let(:klass) do
292
+ Class.new.tap { |c| c.send(:include, Mongoid::Document) }
293
+ end
294
+
295
+ context "when the association metadata doesnt exist" do
296
+
297
+ before do
298
+ klass.dependents.push("nothing")
299
+ end
300
+
301
+ it "does not raise an error" do
302
+ expect {
303
+ klass.new.apply_delete_dependencies!
304
+ }.not_to raise_error
305
+ end
306
+ end
307
+
308
+ context "when a dependent option is provided" do
309
+
310
+ let!(:association) do
311
+ klass.has_many :posts, dependent: :destroy
312
+ end
313
+
314
+ after do
315
+ klass.relations.delete(association.name.to_s)
316
+ end
317
+
318
+ it "adds the relation to the dependents" do
319
+ expect(klass.dependents).to include(klass.relations["posts"])
320
+ end
321
+ end
322
+
323
+ context "when no dependent option is provided" do
324
+
325
+ let!(:association) do
326
+ klass.has_many :posts
327
+ end
328
+
329
+ after do
330
+ klass.relations.delete(association.name.to_s)
331
+ end
332
+
333
+ it "does not add a relation to the dependents" do
334
+ expect(klass.dependents).to_not include(association)
335
+ end
336
+ end
337
+
338
+ context 'when the class is defined more than once' do
339
+
340
+ let!(:association) do
341
+ klass.has_many :posts, dependent: :destroy
342
+ klass.has_many :posts, dependent: :destroy
343
+ end
344
+
345
+ it 'only creates the dependency once' do
346
+ expect(klass.dependents.size).to eq(1)
347
+ end
348
+ end
349
+ end
350
+
351
+ [:delete, :destroy].each do |method|
352
+
353
+ describe "##{method}" do
354
+
355
+ context "when cascading removals" do
356
+
357
+ context "when strategy is delete" do
358
+
359
+ let(:person) do
360
+ Person.create
361
+ end
362
+
363
+ let!(:post) do
364
+ person.posts.create(title: "Testing")
365
+ end
366
+
367
+ before do
368
+ person.send(method)
369
+ end
370
+
371
+ it "deletes the associated documents" do
372
+ expect {
373
+ Post.find(post.id)
374
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
375
+ end
376
+ end
377
+
378
+ context "when strategy is destroy" do
379
+
380
+ let(:person) do
381
+ Person.create
382
+ end
383
+
384
+ let!(:game) do
385
+ person.create_game(name: "Pong")
386
+ end
387
+
388
+ before do
389
+ person.send(method)
390
+ end
391
+
392
+ it "destroys the associated documents" do
393
+ expect {
394
+ Game.find(game.id)
395
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
396
+ end
397
+ end
398
+
399
+ context "when strategy is nullify" do
400
+
401
+ context "when nullifying a references many" do
402
+
403
+ let(:movie) do
404
+ Movie.create(title: "Bladerunner")
405
+ end
406
+
407
+ let!(:rating) do
408
+ movie.ratings.create(value: 10)
409
+ end
410
+
411
+ let(:from_db) do
412
+ Rating.find(rating.id)
413
+ end
414
+
415
+ before do
416
+ movie.send(method)
417
+ end
418
+
419
+ it "removes the references to the removed document" do
420
+ expect(from_db.ratable_id).to be_nil
421
+ end
422
+ end
423
+
424
+ context "when nullifying a references one" do
425
+
426
+ context "when the relation exists" do
427
+
428
+ let(:book) do
429
+ Book.create(title: "Neuromancer")
430
+ end
431
+
432
+ let!(:rating) do
433
+ book.create_rating(value: 10)
434
+ end
435
+
436
+ let(:from_db) do
437
+ Rating.find(rating.id)
438
+ end
439
+
440
+ before do
441
+ book.send(method)
442
+ end
443
+
444
+ it "removes the references to the removed document" do
445
+ expect(from_db.ratable_id).to be_nil
446
+ end
447
+ end
448
+
449
+ context "when the relation is nil" do
450
+
451
+ let(:book) do
452
+ Book.create(title: "Neuromancer")
453
+ end
454
+
455
+ it "returns nil" do
456
+ expect(book.send(method)).to be true
457
+ end
458
+ end
459
+ end
460
+
461
+ context "when nullifying a many to many" do
462
+
463
+ let(:person) do
464
+ Person.create
465
+ end
466
+
467
+ let!(:preference) do
468
+ person.preferences.create(name: "Setting")
469
+ end
470
+
471
+ let(:from_db) do
472
+ Preference.find(preference.id)
473
+ end
474
+
475
+ before do
476
+ person.send(method)
477
+ end
478
+
479
+ it "removes the references from the removed document" do
480
+ expect(person.preference_ids).to_not include(preference.id)
481
+ end
482
+
483
+ it "removes the references to the removed document" do
484
+ expect(from_db.person_ids).to_not include(person.id)
485
+ end
486
+ end
487
+ end
488
+
489
+ context "when dependent is restrict_with_error" do
490
+
491
+ context "when restricting a references many" do
492
+
493
+ let!(:association) do
494
+ Person.has_many :drugs, dependent: :restrict_with_exception
495
+ end
496
+
497
+ after do
498
+ Person.dependents.delete(association)
499
+ Person.has_many :drugs, validate: false
500
+ end
501
+
502
+ context "when the relation is empty" do
503
+
504
+ let(:person) do
505
+ Person.new drugs: []
506
+ end
507
+
508
+ it "raises no error" do
509
+ expect { person.send(method) }.to_not raise_error
510
+ end
511
+
512
+ it "deletes the parent" do
513
+ person.send(method)
514
+ expect(person).to be_destroyed
515
+ end
516
+ end
517
+
518
+ context "when the relation is not empty" do
519
+
520
+ let(:person) do
521
+ Person.new drugs: [Drug.new]
522
+ end
523
+
524
+ it "raises DeleteRestriction error" do
525
+ expect { person.send(method) }.to raise_error(Mongoid::Errors::DeleteRestriction)
526
+ end
527
+ end
528
+ end
529
+
530
+ context "when restricting a references one" do
531
+
532
+ let!(:association) do
533
+ Person.has_one :account, dependent: :restrict_with_exception
534
+ end
535
+
536
+ after do
537
+ Person.dependents.delete(association)
538
+ Person.has_one :account, validate: false
539
+ end
540
+
541
+ context "when the relation is empty" do
542
+
543
+ let(:person) do
544
+ Person.new account: nil
545
+ end
546
+
547
+ it "raises no error" do
548
+ expect { person.send(method) }.to_not raise_error
549
+ end
550
+
551
+ it "deletes the parent" do
552
+ person.send(method)
553
+ expect(person).to be_destroyed
554
+ end
555
+ end
556
+
557
+ context "when the relation is not empty" do
558
+
559
+ let(:person) do
560
+ Person.new account: Account.new(name: 'test')
561
+ end
562
+
563
+ it "raises DeleteRestriction error" do
564
+ expect { person.send(method) }.to raise_error(Mongoid::Errors::DeleteRestriction)
565
+ end
566
+ end
567
+ end
568
+
569
+ context "when restricting a many to many" do
570
+
571
+ let!(:association) do
572
+ Person.has_and_belongs_to_many :houses, dependent: :restrict_with_exception
573
+ end
574
+
575
+ after do
576
+ Person.dependents.delete(association)
577
+ Person.has_and_belongs_to_many :houses, validate: false
578
+ end
579
+
580
+ context "when the relation is empty" do
581
+
582
+ let(:person) do
583
+ Person.new houses: []
584
+ end
585
+
586
+ it "raises no error" do
587
+ expect { person.send(method) }.to_not raise_error
588
+ end
589
+
590
+ it "deletes the parent" do
591
+ person.send(method)
592
+ expect(person).to be_destroyed
593
+ end
594
+ end
595
+
596
+ context "when the relation is not empty" do
597
+
598
+ let(:person) do
599
+ Person.new houses: [House.new]
600
+ end
601
+
602
+ it "raises DeleteRestriction error" do
603
+ expect { person.send(method) }.to raise_error(Mongoid::Errors::DeleteRestriction)
604
+ end
605
+ end
606
+ end
607
+ end
608
+ end
609
+ end
610
+ end
611
+
612
+ context 'when the strategy is :delete_all' do
613
+
614
+ let(:person) do
615
+ Person.create
616
+ end
617
+
618
+ context "when cascading a has one" do
619
+
620
+ context "when the relation exists" do
621
+
622
+ let!(:home) do
623
+ person.create_home
624
+ end
625
+
626
+ before do
627
+ person.delete
628
+ end
629
+
630
+ it "deletes the relation" do
631
+ expect(home).to be_destroyed
632
+ end
633
+
634
+ it "persists the deletion" do
635
+ expect {
636
+ home.reload
637
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
638
+ end
639
+ end
640
+
641
+ context "when the relation does not exist" do
642
+
643
+ before do
644
+ person.delete
645
+ end
646
+
647
+ it "deletes the base document" do
648
+ expect(person).to be_destroyed
649
+ end
650
+ end
651
+ end
652
+
653
+ context "when cascading a has many" do
654
+
655
+ context "when the relation has documents" do
656
+
657
+ let!(:post_one) do
658
+ person.posts.create(title: "one")
659
+ end
660
+
661
+ let!(:post_two) do
662
+ person.posts.create(title: "two")
663
+ end
664
+
665
+ context "when the documents are in memory" do
666
+
667
+ before do
668
+ expect(post_one).to receive(:delete).never
669
+ expect(post_two).to receive(:delete).never
670
+ person.delete
671
+ end
672
+
673
+ it "deletes the first document" do
674
+ expect(post_one).to be_destroyed
675
+ end
676
+
677
+ it "deletes the second document" do
678
+ expect(post_two).to be_destroyed
679
+ end
680
+
681
+ it "unbinds the first document" do
682
+ expect(post_one.person).to be_nil
683
+ end
684
+
685
+ it "unbinds the second document" do
686
+ expect(post_two.person).to be_nil
687
+ end
688
+
689
+ it "removes the documents from the relation" do
690
+ expect(person.posts).to be_empty
691
+ end
692
+
693
+ it "persists the first deletion" do
694
+ expect {
695
+ post_one.reload
696
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
697
+ end
698
+
699
+ it "persists the second deletion" do
700
+ expect {
701
+ post_two.reload
702
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
703
+ end
704
+ end
705
+ end
706
+ end
707
+ end
708
+
709
+ context 'when the strategy is :destroy' do
710
+
711
+ let!(:association) do
712
+ Person.has_many :destroyable_posts, class_name: "Post", dependent: :destroy
713
+ end
714
+
715
+ after do
716
+ Person.dependents.delete(association)
717
+ end
718
+
719
+ let(:person) do
720
+ Person.new
721
+ end
722
+
723
+ let(:post) do
724
+ Post.new
725
+ end
726
+
727
+ context "when the documents exist" do
728
+
729
+ before do
730
+ expect(post).to receive(:destroy)
731
+ person.destroyable_posts << post
732
+ end
733
+
734
+ it "destroys all documents in the relation" do
735
+ person.delete
736
+ end
737
+ end
738
+
739
+ context "when no documents exist" do
740
+
741
+ before do
742
+ expect(post).to receive(:destroy).never
743
+ end
744
+
745
+ it "it does not destroy the relation" do
746
+ person.delete
747
+ end
748
+ end
749
+ end
750
+
751
+ context 'when the strategy is :nullify' do
752
+
753
+ let!(:association) do
754
+ Person.has_many :nullifyable_posts, class_name: "Post", dependent: :nullify
755
+ end
756
+
757
+ after do
758
+ Person.dependents.delete(association)
759
+ end
760
+
761
+ let(:person) do
762
+ Person.new
763
+ end
764
+
765
+ let(:posts_relation) do
766
+ person.posts
767
+ end
768
+
769
+ before do
770
+ allow(person).to receive(:nullifyable_posts).and_return(posts_relation)
771
+ expect(posts_relation).to receive(:nullify)
772
+ end
773
+
774
+ it "nullifies the relation" do
775
+ person.delete
776
+ end
777
+ end
778
+
779
+ context 'when the strategy is :restrict_with_exception' do
780
+
781
+ let(:person) do
782
+ Person.new
783
+ end
784
+
785
+ let(:post) do
786
+ Post.new
787
+ end
788
+
789
+ let!(:association) do
790
+ Person.has_many :restrictable_posts, class_name: "Post", dependent: :restrict_with_exception
791
+ end
792
+
793
+ after do
794
+ Person.dependents.delete(association)
795
+ end
796
+
797
+ context 'when there are related objects' do
798
+
799
+ before do
800
+ person.restrictable_posts << post
801
+ expect(post).to receive(:delete).never
802
+ expect(post).to receive(:destroy).never
803
+ end
804
+
805
+ it 'raises an exception and leaves the related one intact' do
806
+ expect { person.delete }.to raise_exception(Mongoid::Errors::DeleteRestriction)
807
+ end
808
+ end
809
+
810
+ context 'when there are no related objects' do
811
+
812
+ before do
813
+ expect(post).to receive(:delete).never
814
+ expect(post).to receive(:destroy).never
815
+ end
816
+
817
+ it 'deletes the object and leaves the other one intact' do
818
+ expect(person.delete).to be(true)
819
+ end
820
+ end
821
+ end
822
+
823
+ context 'when the strategy is :restrict_with_error' do
824
+
825
+ let(:person) do
826
+ Person.new
827
+ end
828
+
829
+ let(:post) do
830
+ Post.new
831
+ end
832
+
833
+ let!(:association) do
834
+ Person.has_many :restrictable_posts, class_name: "Post", dependent: :restrict_with_error
835
+ end
836
+
837
+ after do
838
+ Person.dependents.delete(association)
839
+ end
840
+
841
+ context 'when there are related objects' do
842
+
843
+ before do
844
+ person.restrictable_posts << post
845
+ end
846
+
847
+ it 'adds an error to the parent object' do
848
+ expect(person.delete).to be(false)
849
+ expect(person.errors[:restrictable_posts].first).to be(
850
+ Mongoid::Association::Depending::RESTRICT_ERROR_MSG)
851
+ end
852
+ end
853
+
854
+ context 'when there are no related objects' do
855
+
856
+ before do
857
+ expect(post).to receive(:delete).never
858
+ expect(post).to receive(:destroy).never
859
+ end
860
+
861
+ it 'deletes the object and leaves the other one intact' do
862
+ expect(person.delete).to be(true)
863
+ end
864
+ end
865
+ end
866
+ end