mongoid 7.5.4 → 8.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (414) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +3 -3
  4. data/README.md +6 -6
  5. data/lib/config/locales/en.yml +92 -43
  6. data/lib/mongoid/association/accessors.rb +40 -11
  7. data/lib/mongoid/association/bindable.rb +50 -2
  8. data/lib/mongoid/association/builders.rb +5 -3
  9. data/lib/mongoid/association/constrainable.rb +0 -1
  10. data/lib/mongoid/association/eager_loadable.rb +29 -7
  11. data/lib/mongoid/association/embedded/batchable.rb +34 -11
  12. data/lib/mongoid/association/embedded/cyclic.rb +1 -1
  13. data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
  14. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +2 -2
  15. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +4 -3
  16. data/lib/mongoid/association/embedded/embedded_in.rb +3 -2
  17. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
  18. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +4 -3
  19. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +69 -45
  20. data/lib/mongoid/association/embedded/embeds_many.rb +2 -2
  21. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +19 -5
  22. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +24 -5
  23. data/lib/mongoid/association/embedded/embeds_one.rb +3 -3
  24. data/lib/mongoid/association/macros.rb +8 -1
  25. data/lib/mongoid/association/many.rb +11 -7
  26. data/lib/mongoid/association/nested/many.rb +5 -4
  27. data/lib/mongoid/association/nested/nested_buildable.rb +4 -4
  28. data/lib/mongoid/association/nested/one.rb +45 -7
  29. data/lib/mongoid/association/one.rb +2 -2
  30. data/lib/mongoid/association/options.rb +9 -9
  31. data/lib/mongoid/association/proxy.rb +15 -4
  32. data/lib/mongoid/association/referenced/auto_save.rb +4 -3
  33. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  34. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  35. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +5 -6
  36. data/lib/mongoid/association/referenced/belongs_to.rb +2 -2
  37. data/lib/mongoid/association/referenced/counter_cache.rb +10 -10
  38. data/lib/mongoid/association/referenced/eager.rb +2 -2
  39. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +70 -13
  40. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +6 -3
  41. data/lib/mongoid/association/referenced/has_many/enumerable.rb +22 -30
  42. data/lib/mongoid/association/referenced/has_many/proxy.rb +29 -19
  43. data/lib/mongoid/association/referenced/has_many.rb +3 -3
  44. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  45. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +5 -5
  46. data/lib/mongoid/association/referenced/has_one/proxy.rb +9 -12
  47. data/lib/mongoid/association/referenced/has_one.rb +3 -3
  48. data/lib/mongoid/association/referenced/syncable.rb +4 -4
  49. data/lib/mongoid/association/reflections.rb +4 -4
  50. data/lib/mongoid/association/relatable.rb +44 -10
  51. data/lib/mongoid/association.rb +5 -5
  52. data/lib/mongoid/atomic/modifiers.rb +2 -2
  53. data/lib/mongoid/atomic.rb +7 -0
  54. data/lib/mongoid/attributes/dynamic.rb +4 -4
  55. data/lib/mongoid/attributes/nested.rb +6 -6
  56. data/lib/mongoid/attributes/processing.rb +37 -6
  57. data/lib/mongoid/attributes/projector.rb +2 -2
  58. data/lib/mongoid/attributes/readonly.rb +3 -3
  59. data/lib/mongoid/attributes.rb +51 -42
  60. data/lib/mongoid/changeable.rb +147 -14
  61. data/lib/mongoid/clients/options.rb +5 -1
  62. data/lib/mongoid/clients/sessions.rb +2 -14
  63. data/lib/mongoid/clients/storage_options.rb +2 -5
  64. data/lib/mongoid/clients/validators/storage.rb +3 -15
  65. data/lib/mongoid/collection_configurable.rb +58 -0
  66. data/lib/mongoid/composable.rb +2 -0
  67. data/lib/mongoid/config/defaults.rb +60 -0
  68. data/lib/mongoid/config/options.rb +3 -0
  69. data/lib/mongoid/config/validators/async_query_executor.rb +24 -0
  70. data/lib/mongoid/config/validators/client.rb +6 -6
  71. data/lib/mongoid/config/validators.rb +1 -0
  72. data/lib/mongoid/config.rb +140 -18
  73. data/lib/mongoid/contextual/aggregable/memory.rb +24 -16
  74. data/lib/mongoid/contextual/aggregable/mongo.rb +5 -5
  75. data/lib/mongoid/contextual/aggregable/none.rb +1 -1
  76. data/lib/mongoid/contextual/atomic.rb +1 -1
  77. data/lib/mongoid/contextual/geo_near.rb +7 -7
  78. data/lib/mongoid/contextual/map_reduce.rb +2 -2
  79. data/lib/mongoid/contextual/memory.rb +285 -58
  80. data/lib/mongoid/contextual/mongo/documents_loader.rb +177 -0
  81. data/lib/mongoid/contextual/mongo.rb +517 -346
  82. data/lib/mongoid/contextual/none.rb +193 -20
  83. data/lib/mongoid/contextual/queryable.rb +1 -1
  84. data/lib/mongoid/contextual.rb +14 -2
  85. data/lib/mongoid/copyable.rb +32 -8
  86. data/lib/mongoid/criteria/findable.rb +8 -5
  87. data/lib/mongoid/criteria/includable.rb +27 -22
  88. data/lib/mongoid/criteria/marshalable.rb +10 -2
  89. data/lib/mongoid/criteria/permission.rb +1 -1
  90. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -2
  91. data/lib/mongoid/criteria/queryable/extensions/array.rb +3 -16
  92. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
  93. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -2
  94. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
  95. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
  96. data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -17
  97. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -9
  98. data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
  99. data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
  100. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
  101. data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -1
  102. data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -14
  103. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -12
  104. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
  105. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
  106. data/lib/mongoid/criteria/queryable/key.rb +4 -4
  107. data/lib/mongoid/criteria/queryable/mergeable.rb +1 -1
  108. data/lib/mongoid/criteria/queryable/optional.rb +11 -17
  109. data/lib/mongoid/criteria/queryable/options.rb +2 -2
  110. data/lib/mongoid/criteria/queryable/pipeline.rb +1 -1
  111. data/lib/mongoid/criteria/queryable/selectable.rb +47 -38
  112. data/lib/mongoid/criteria/queryable/selector.rb +92 -7
  113. data/lib/mongoid/criteria/queryable/smash.rb +40 -7
  114. data/lib/mongoid/criteria/queryable.rb +12 -7
  115. data/lib/mongoid/criteria/scopable.rb +2 -2
  116. data/lib/mongoid/criteria/translator.rb +45 -0
  117. data/lib/mongoid/criteria.rb +20 -40
  118. data/lib/mongoid/deprecable.rb +36 -0
  119. data/lib/mongoid/deprecation.rb +25 -0
  120. data/lib/mongoid/document.rb +127 -35
  121. data/lib/mongoid/equality.rb +8 -8
  122. data/lib/mongoid/errors/create_collection_failure.rb +33 -0
  123. data/lib/mongoid/errors/document_not_found.rb +10 -6
  124. data/lib/mongoid/errors/drop_collection_failure.rb +27 -0
  125. data/lib/mongoid/errors/immutable_attribute.rb +26 -0
  126. data/lib/mongoid/errors/invalid_async_query_executor.rb +25 -0
  127. data/lib/mongoid/errors/invalid_config_option.rb +1 -1
  128. data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -1
  129. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  130. data/lib/mongoid/errors/invalid_field.rb +6 -2
  131. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  132. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +22 -0
  133. data/lib/mongoid/errors/invalid_relation.rb +1 -1
  134. data/lib/mongoid/errors/invalid_relation_option.rb +1 -1
  135. data/lib/mongoid/errors/invalid_session_use.rb +1 -1
  136. data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
  137. data/lib/mongoid/errors/invalid_storage_parent.rb +2 -0
  138. data/lib/mongoid/errors/mongoid_error.rb +3 -3
  139. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -1
  140. data/lib/mongoid/errors/no_client_database.rb +1 -1
  141. data/lib/mongoid/errors/no_client_hosts.rb +1 -1
  142. data/lib/mongoid/errors/readonly_attribute.rb +1 -1
  143. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  144. data/lib/mongoid/errors/unknown_attribute.rb +1 -1
  145. data/lib/mongoid/errors.rb +6 -3
  146. data/lib/mongoid/extensions/array.rb +9 -7
  147. data/lib/mongoid/extensions/big_decimal.rb +33 -10
  148. data/lib/mongoid/extensions/binary.rb +42 -0
  149. data/lib/mongoid/extensions/boolean.rb +8 -2
  150. data/lib/mongoid/extensions/date.rb +26 -20
  151. data/lib/mongoid/extensions/date_time.rb +1 -1
  152. data/lib/mongoid/extensions/false_class.rb +1 -1
  153. data/lib/mongoid/extensions/float.rb +7 -4
  154. data/lib/mongoid/extensions/hash.rb +19 -8
  155. data/lib/mongoid/extensions/integer.rb +7 -4
  156. data/lib/mongoid/extensions/module.rb +1 -1
  157. data/lib/mongoid/extensions/object.rb +10 -8
  158. data/lib/mongoid/extensions/range.rb +41 -10
  159. data/lib/mongoid/extensions/regexp.rb +11 -4
  160. data/lib/mongoid/extensions/set.rb +11 -4
  161. data/lib/mongoid/extensions/string.rb +11 -22
  162. data/lib/mongoid/extensions/symbol.rb +4 -15
  163. data/lib/mongoid/extensions/time.rb +29 -16
  164. data/lib/mongoid/extensions/time_with_zone.rb +1 -2
  165. data/lib/mongoid/extensions/true_class.rb +1 -1
  166. data/lib/mongoid/extensions.rb +1 -0
  167. data/lib/mongoid/factory.rb +55 -7
  168. data/lib/mongoid/fields/foreign_key.rb +11 -4
  169. data/lib/mongoid/fields/localized.rb +19 -4
  170. data/lib/mongoid/fields/standard.rb +17 -7
  171. data/lib/mongoid/fields/validators/macro.rb +3 -9
  172. data/lib/mongoid/fields.rb +129 -20
  173. data/lib/mongoid/findable.rb +54 -24
  174. data/lib/mongoid/indexable/specification.rb +2 -2
  175. data/lib/mongoid/indexable/validators/options.rb +6 -2
  176. data/lib/mongoid/interceptable.rb +76 -15
  177. data/lib/mongoid/matchable.rb +1 -1
  178. data/lib/mongoid/matcher/eq_impl.rb +1 -1
  179. data/lib/mongoid/matcher/type.rb +1 -1
  180. data/lib/mongoid/matcher.rb +33 -13
  181. data/lib/mongoid/persistable/creatable.rb +19 -9
  182. data/lib/mongoid/persistable/deletable.rb +2 -2
  183. data/lib/mongoid/persistable/destroyable.rb +1 -1
  184. data/lib/mongoid/persistable/savable.rb +14 -2
  185. data/lib/mongoid/persistable/unsettable.rb +2 -2
  186. data/lib/mongoid/persistable/updatable.rb +69 -12
  187. data/lib/mongoid/persistable/upsertable.rb +21 -2
  188. data/lib/mongoid/persistable.rb +6 -3
  189. data/lib/mongoid/persistence_context.rb +6 -4
  190. data/lib/mongoid/query_cache.rb +13 -261
  191. data/lib/mongoid/railties/controller_runtime.rb +1 -1
  192. data/lib/mongoid/railties/database.rake +7 -2
  193. data/lib/mongoid/reloadable.rb +10 -8
  194. data/lib/mongoid/scopable.rb +15 -13
  195. data/lib/mongoid/selectable.rb +1 -2
  196. data/lib/mongoid/serializable.rb +10 -6
  197. data/lib/mongoid/stateful.rb +57 -10
  198. data/lib/mongoid/tasks/database.rake +12 -0
  199. data/lib/mongoid/tasks/database.rb +20 -2
  200. data/lib/mongoid/threaded/lifecycle.rb +5 -5
  201. data/lib/mongoid/threaded.rb +42 -12
  202. data/lib/mongoid/timestamps/created.rb +1 -1
  203. data/lib/mongoid/timestamps/updated.rb +2 -2
  204. data/lib/mongoid/touchable.rb +2 -3
  205. data/lib/mongoid/traversable.rb +5 -4
  206. data/lib/mongoid/utils.rb +22 -0
  207. data/lib/mongoid/validatable/localizable.rb +1 -1
  208. data/lib/mongoid/validatable/macros.rb +5 -7
  209. data/lib/mongoid/validatable/presence.rb +2 -2
  210. data/lib/mongoid/validatable/uniqueness.rb +9 -8
  211. data/lib/mongoid/validatable.rb +9 -6
  212. data/lib/mongoid/version.rb +1 -1
  213. data/lib/mongoid/warnings.rb +19 -4
  214. data/lib/mongoid.rb +17 -3
  215. data/spec/config/mongoid.yml +16 -0
  216. data/spec/integration/app_spec.rb +10 -14
  217. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  218. data/spec/integration/associations/embedded_spec.rb +15 -0
  219. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  220. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  221. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  222. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  223. data/spec/integration/associations/has_one_spec.rb +97 -1
  224. data/spec/integration/associations/scope_option_spec.rb +1 -1
  225. data/spec/integration/callbacks_models.rb +132 -1
  226. data/spec/integration/callbacks_spec.rb +360 -4
  227. data/spec/integration/criteria/range_spec.rb +95 -1
  228. data/spec/integration/discriminator_key_spec.rb +118 -80
  229. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  230. data/spec/integration/i18n_fallbacks_spec.rb +3 -32
  231. data/spec/integration/matcher_examples_spec.rb +20 -13
  232. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  233. data/spec/integration/matcher_operator_spec.rb +3 -5
  234. data/spec/integration/persistence/range_field_spec.rb +350 -0
  235. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  236. data/spec/mongoid/association/depending_spec.rb +9 -9
  237. data/spec/mongoid/association/eager_spec.rb +2 -1
  238. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  239. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  240. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +96 -9
  241. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  242. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +255 -65
  243. data/spec/mongoid/association/embedded/embeds_many_models.rb +37 -0
  244. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
  245. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  246. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  247. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +15 -2
  248. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  249. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  250. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  251. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  252. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
  253. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  254. data/spec/mongoid/association/referenced/belongs_to_spec.rb +4 -20
  255. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +186 -229
  256. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  257. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  258. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  259. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
  260. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +173 -177
  261. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  262. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  263. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  264. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  265. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  266. data/spec/mongoid/association/syncable_spec.rb +15 -1
  267. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  268. data/spec/mongoid/attributes/nested_spec.rb +80 -11
  269. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  270. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  271. data/spec/mongoid/attributes_spec.rb +510 -33
  272. data/spec/mongoid/changeable_spec.rb +429 -37
  273. data/spec/mongoid/clients/factory_spec.rb +23 -30
  274. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  275. data/spec/mongoid/clients_spec.rb +149 -15
  276. data/spec/mongoid/collection_configurable_spec.rb +158 -0
  277. data/spec/mongoid/config/defaults_spec.rb +160 -0
  278. data/spec/mongoid/config_spec.rb +214 -31
  279. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  280. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  281. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  282. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  283. data/spec/mongoid/contextual/memory_spec.rb +850 -88
  284. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
  285. data/spec/mongoid/contextual/mongo_spec.rb +1572 -435
  286. data/spec/mongoid/contextual/none_spec.rb +60 -21
  287. data/spec/mongoid/copyable_spec.rb +453 -11
  288. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  289. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  290. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  291. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  292. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  293. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  294. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  295. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  296. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  297. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  298. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +4 -69
  299. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
  300. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  301. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  302. data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -484
  303. data/spec/mongoid/criteria/queryable/options_spec.rb +1 -1
  304. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +469 -0
  305. data/spec/mongoid/criteria/queryable/selectable_spec.rb +78 -86
  306. data/spec/mongoid/criteria/queryable/selector_spec.rb +15 -3
  307. data/spec/mongoid/criteria/translator_spec.rb +132 -0
  308. data/spec/mongoid/criteria_projection_spec.rb +1 -5
  309. data/spec/mongoid/criteria_spec.rb +469 -1205
  310. data/spec/mongoid/document_fields_spec.rb +173 -24
  311. data/spec/mongoid/document_spec.rb +32 -41
  312. data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
  313. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  314. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  315. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  316. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  317. data/spec/mongoid/errors/readonly_document_spec.rb +2 -2
  318. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  319. data/spec/mongoid/extensions/array_spec.rb +16 -2
  320. data/spec/mongoid/extensions/big_decimal_spec.rb +712 -212
  321. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  322. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  323. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  324. data/spec/mongoid/extensions/date_spec.rb +71 -1
  325. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  326. data/spec/mongoid/extensions/float_spec.rb +53 -74
  327. data/spec/mongoid/extensions/hash_spec.rb +33 -3
  328. data/spec/mongoid/extensions/integer_spec.rb +50 -64
  329. data/spec/mongoid/extensions/range_spec.rb +255 -54
  330. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  331. data/spec/mongoid/extensions/set_spec.rb +106 -0
  332. data/spec/mongoid/extensions/string_spec.rb +53 -25
  333. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  334. data/spec/mongoid/extensions/time_spec.rb +639 -106
  335. data/spec/mongoid/extensions/time_with_zone_spec.rb +24 -83
  336. data/spec/mongoid/factory_spec.rb +61 -1
  337. data/spec/mongoid/fields/localized_spec.rb +80 -37
  338. data/spec/mongoid/fields_spec.rb +500 -84
  339. data/spec/mongoid/findable_spec.rb +450 -58
  340. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  341. data/spec/mongoid/indexable_spec.rb +55 -30
  342. data/spec/mongoid/interceptable_spec.rb +599 -8
  343. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  344. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  345. data/spec/mongoid/mongoizable_spec.rb +285 -0
  346. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  347. data/spec/mongoid/persistable/deletable_spec.rb +28 -8
  348. data/spec/mongoid/persistable/destroyable_spec.rb +28 -8
  349. data/spec/mongoid/persistable/incrementable_spec.rb +37 -0
  350. data/spec/mongoid/persistable/logical_spec.rb +37 -0
  351. data/spec/mongoid/persistable/poppable_spec.rb +36 -0
  352. data/spec/mongoid/persistable/pullable_spec.rb +72 -0
  353. data/spec/mongoid/persistable/pushable_spec.rb +72 -0
  354. data/spec/mongoid/persistable/renamable_spec.rb +36 -0
  355. data/spec/mongoid/persistable/savable_spec.rb +96 -0
  356. data/spec/mongoid/persistable/settable_spec.rb +37 -0
  357. data/spec/mongoid/persistable/unsettable_spec.rb +36 -0
  358. data/spec/mongoid/persistable/updatable_spec.rb +20 -28
  359. data/spec/mongoid/persistable/upsertable_spec.rb +89 -1
  360. data/spec/mongoid/persistence_context_spec.rb +31 -57
  361. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  362. data/spec/mongoid/query_cache_spec.rb +56 -215
  363. data/spec/mongoid/reloadable_spec.rb +83 -6
  364. data/spec/mongoid/scopable_spec.rb +91 -1
  365. data/spec/mongoid/serializable_spec.rb +9 -30
  366. data/spec/mongoid/shardable_spec.rb +4 -4
  367. data/spec/mongoid/stateful_spec.rb +150 -8
  368. data/spec/mongoid/tasks/database_rake_spec.rb +74 -0
  369. data/spec/mongoid/tasks/database_spec.rb +127 -0
  370. data/spec/mongoid/timestamps_spec.rb +392 -4
  371. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  372. data/spec/mongoid/touchable_spec.rb +390 -2
  373. data/spec/mongoid/touchable_spec_models.rb +14 -8
  374. data/spec/mongoid/traversable_spec.rb +13 -35
  375. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  376. data/spec/mongoid/validatable/uniqueness_spec.rb +58 -31
  377. data/spec/mongoid/warnings_spec.rb +35 -0
  378. data/spec/mongoid_spec.rb +34 -16
  379. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  380. data/spec/rails/mongoid_spec.rb +4 -16
  381. data/spec/spec_helper.rb +5 -0
  382. data/spec/support/constraints.rb +24 -0
  383. data/spec/support/immutable_ids.rb +118 -0
  384. data/spec/support/macros.rb +78 -0
  385. data/spec/support/models/artist.rb +0 -1
  386. data/spec/support/models/augmentation.rb +12 -0
  387. data/spec/support/models/band.rb +4 -0
  388. data/spec/support/models/book.rb +1 -0
  389. data/spec/support/models/building.rb +2 -0
  390. data/spec/support/models/catalog.rb +24 -0
  391. data/spec/support/models/circus.rb +3 -0
  392. data/spec/support/models/cover.rb +10 -0
  393. data/spec/support/models/fanatic.rb +8 -0
  394. data/spec/support/models/implant.rb +9 -0
  395. data/spec/support/models/label.rb +2 -0
  396. data/spec/support/models/passport.rb +9 -0
  397. data/spec/support/models/person.rb +2 -0
  398. data/spec/support/models/player.rb +2 -0
  399. data/spec/support/models/powerup.rb +12 -0
  400. data/spec/support/models/product.rb +1 -0
  401. data/spec/support/models/purse.rb +9 -0
  402. data/spec/support/models/registry.rb +1 -0
  403. data/spec/support/models/school.rb +14 -0
  404. data/spec/support/models/shield.rb +18 -0
  405. data/spec/support/models/student.rb +14 -0
  406. data/spec/support/models/weapon.rb +12 -0
  407. data.tar.gz.sig +0 -0
  408. metadata +93 -15
  409. metadata.gz.sig +0 -0
  410. data/lib/mongoid/errors/eager_load.rb +0 -23
  411. data/lib/mongoid/errors/invalid_value.rb +0 -17
  412. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -60
  413. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -60
  414. data/spec/mongoid/errors/eager_load_spec.rb +0 -31
@@ -1,17 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "spec_helper"
4
- require_relative "../has_and_belongs_to_many_models.rb"
4
+ require_relative "../has_and_belongs_to_many_models"
5
5
 
6
6
  describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
7
+ config_override :raise_not_found_error, true
7
8
 
8
9
  around(:each) do |example|
9
- original_raise_not_found_error = Mongoid.raise_not_found_error
10
10
  original_preferences_association = Person.relations["preferences"]
11
- Mongoid.raise_not_found_error = true
12
11
  Person.has_and_belongs_to_many :preferences, autosave: true
13
12
  example.run
14
- Mongoid.raise_not_found_error = original_raise_not_found_error
15
13
  Person.relations["preferences"] = original_preferences_association
16
14
  end
17
15
 
@@ -2087,283 +2085,229 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2087
2085
  end
2088
2086
  end
2089
2087
 
2090
- describe "#delete" do
2088
+ %i[ delete delete_one ].each do |method|
2089
+ describe "\##{method}" do
2090
+ let(:person) { Person.create! }
2091
+ let(:preference_one) { Preference.create!(name: "Testing") }
2092
+ let(:preference_two) { Preference.create!(name: "Test") }
2091
2093
 
2092
- let(:person) do
2093
- Person.create!
2094
- end
2095
-
2096
- let(:preference_one) do
2097
- Preference.create!(name: "Testing")
2098
- end
2099
-
2100
- let(:preference_two) do
2101
- Preference.create!(name: "Test")
2102
- end
2103
-
2104
- before do
2105
- person.preferences << [ preference_one, preference_two ]
2106
- end
2107
-
2108
- context "when the document exists" do
2109
-
2110
- let!(:deleted) do
2111
- person.preferences.delete(preference_one)
2112
- end
2113
-
2114
- it "removes the document from the relation" do
2115
- expect(person.preferences).to eq([ preference_two ])
2116
- end
2117
-
2118
- it "returns the document" do
2119
- expect(deleted).to eq(preference_one)
2120
- end
2121
-
2122
- it "removes the document key from the foreign key" do
2123
- expect(person.preference_ids).to eq([ preference_two.id ])
2124
- end
2125
-
2126
- it "removes the inverse reference" do
2127
- expect(deleted.reload.people).to be_empty
2128
- end
2129
-
2130
- it "removes the base id from the inverse keys" do
2131
- expect(deleted.reload.person_ids).to be_empty
2094
+ before do
2095
+ person.preferences << [ preference_one, preference_two ]
2132
2096
  end
2133
2097
 
2134
- context "and person and preferences are reloaded" do
2135
-
2136
- before do
2137
- person.reload
2138
- preference_one.reload
2139
- preference_two.reload
2098
+ context 'when the document exists' do
2099
+ let!(:deleted) do
2100
+ person.preferences.send(method, preference_one)
2140
2101
  end
2141
2102
 
2142
- it "nullifies the deleted preference" do
2103
+ it 'removes the document from the relation' do
2143
2104
  expect(person.preferences).to eq([ preference_two ])
2144
2105
  end
2145
2106
 
2146
- it "retains the ids for one preference" do
2147
- expect(person.preference_ids).to eq([ preference_two.id ])
2107
+ it 'returns the document' do
2108
+ expect(deleted).to eq(preference_one)
2148
2109
  end
2149
- end
2150
- end
2151
-
2152
- context "when the document does not exist" do
2153
-
2154
- let!(:deleted) do
2155
- person.preferences.delete(Preference.new)
2156
- end
2157
-
2158
- it "returns nil" do
2159
- expect(deleted).to be_nil
2160
- end
2161
-
2162
- it "does not modify the relation" do
2163
- expect(person.preferences).to eq([ preference_one, preference_two ])
2164
- end
2165
-
2166
- it "does not modify the keys" do
2167
- expect(person.preference_ids).to eq([ preference_one.id, preference_two.id ])
2168
- end
2169
- end
2170
-
2171
- context "when :dependent => :nullify is set" do
2172
-
2173
- context "when :inverse_of is set" do
2174
2110
 
2175
- let(:event) do
2176
- Event.create!
2111
+ it 'removes the document key from the foreign key' do
2112
+ expect(person.preference_ids).to eq([ preference_two.id ])
2177
2113
  end
2178
2114
 
2179
- before do
2180
- person.administrated_events << [ event ]
2115
+ it 'removes the inverse reference' do
2116
+ expect(deleted.reload.people).to be_empty
2181
2117
  end
2182
2118
 
2183
- it "deletes the document" do
2184
- expect(event.delete).to be true
2119
+ it 'removes the base id from the inverse keys' do
2120
+ expect(deleted.reload.person_ids).to be_empty
2185
2121
  end
2186
- end
2187
- end
2188
2122
 
2189
- context "when the relationships are self referencing" do
2190
-
2191
- let(:tag_one) do
2192
- Tag.create!(text: "one")
2193
- end
2123
+ context 'and person and preferences are reloaded' do
2124
+ before do
2125
+ person.reload
2126
+ preference_one.reload
2127
+ preference_two.reload
2128
+ end
2194
2129
 
2195
- let(:tag_two) do
2196
- Tag.create!(text: "two")
2197
- end
2130
+ it 'nullifies the deleted preference' do
2131
+ expect(person.preferences).to eq([ preference_two ])
2132
+ end
2198
2133
 
2199
- before do
2200
- tag_one.related << tag_two
2134
+ it 'retains the ids for one preference' do
2135
+ expect(person.preference_ids).to eq([ preference_two.id ])
2136
+ end
2137
+ end
2201
2138
  end
2202
2139
 
2203
- context "when deleting without reloading" do
2204
-
2140
+ context 'when the document does not exist' do
2205
2141
  let!(:deleted) do
2206
- tag_one.related.delete(tag_two)
2207
- end
2208
-
2209
- it "deletes the document from the relation" do
2210
- expect(tag_one.related).to be_empty
2142
+ person.preferences.send(method, Preference.new)
2211
2143
  end
2212
2144
 
2213
- it "deletes the foreign key from the relation" do
2214
- expect(tag_one.related_ids).to be_empty
2145
+ it 'returns nil' do
2146
+ expect(deleted).to be_nil
2215
2147
  end
2216
2148
 
2217
- it "removes the reference from the inverse" do
2218
- expect(deleted.related).to be_empty
2149
+ it 'does not modify the relation' do
2150
+ expect(person.preferences).to eq([ preference_one, preference_two ])
2219
2151
  end
2220
2152
 
2221
- it "removes the foreign keys from the inverse" do
2222
- expect(deleted.related_ids).to be_empty
2153
+ it 'does not modify the keys' do
2154
+ expect(person.preference_ids).to eq([ preference_one.id, preference_two.id ])
2223
2155
  end
2224
2156
  end
2225
2157
 
2226
- context "when deleting with reloading" do
2158
+ context 'when :dependent => :nullify is set' do
2159
+ context 'when :inverse_of is set' do
2160
+ let(:event) { Event.create! }
2227
2161
 
2228
- context "when deleting from the front side" do
2229
-
2230
- let(:reloaded) do
2231
- tag_one.reload
2232
- end
2233
-
2234
- let!(:deleted) do
2235
- reloaded.related.delete(tag_two)
2236
- end
2237
-
2238
- it "deletes the document from the relation" do
2239
- expect(reloaded.related).to be_empty
2162
+ before do
2163
+ person.administrated_events << [ event ]
2240
2164
  end
2241
2165
 
2242
- it "deletes the foreign key from the relation" do
2243
- expect(reloaded.related_ids).to be_empty
2166
+ it 'deletes the document' do
2167
+ expect(event.delete).to be true
2244
2168
  end
2169
+ end
2170
+ end
2245
2171
 
2246
- it "removes the reference from the inverse" do
2247
- expect(deleted.related).to be_empty
2248
- end
2172
+ context 'when the relationships are self referencing' do
2173
+ let(:tag_one) { Tag.create!(text: "one") }
2174
+ let(:tag_two) { Tag.create!(text: "two") }
2249
2175
 
2250
- it "removes the foreign keys from the inverse" do
2251
- expect(deleted.related_ids).to be_empty
2252
- end
2176
+ before do
2177
+ tag_one.related << tag_two
2253
2178
  end
2254
2179
 
2255
- context "when deleting from the inverse side" do
2256
-
2257
- let(:reloaded) do
2258
- tag_two.reload
2259
- end
2180
+ context 'when deleting without reloading' do
2181
+ let!(:deleted) { tag_one.related.send(method, tag_two) }
2260
2182
 
2261
- let!(:deleted) do
2262
- reloaded.related.delete(tag_one)
2183
+ it 'deletes the document from the relation' do
2184
+ expect(tag_one.related).to be_empty
2263
2185
  end
2264
2186
 
2265
- it "deletes the document from the relation" do
2266
- expect(reloaded.related).to be_empty
2187
+ it 'deletes the foreign key from the relation' do
2188
+ expect(tag_one.related_ids).to be_empty
2267
2189
  end
2268
2190
 
2269
- it "deletes the foreign key from the relation" do
2270
- expect(reloaded.related_ids).to be_empty
2191
+ it 'removes the reference from the inverse' do
2192
+ expect(deleted.related).to be_empty
2271
2193
  end
2272
2194
 
2273
- it "removes the foreign keys from the inverse" do
2195
+ it 'removes the foreign keys from the inverse' do
2274
2196
  expect(deleted.related_ids).to be_empty
2275
2197
  end
2276
2198
  end
2277
- end
2278
- end
2279
2199
 
2280
- context "when the association has callbacks" do
2200
+ context 'when deleting with reloading' do
2201
+ context "when deleting from the front side" do
2202
+ let(:reloaded) { tag_one.reload }
2203
+ let!(:deleted) { reloaded.related.send(method, tag_two) }
2281
2204
 
2282
- let(:post) do
2283
- Post.new
2284
- end
2205
+ it 'deletes the document from the relation' do
2206
+ expect(reloaded.related).to be_empty
2207
+ end
2285
2208
 
2286
- let(:tag) do
2287
- Tag.new
2288
- end
2209
+ it 'deletes the foreign key from the relation' do
2210
+ expect(reloaded.related_ids).to be_empty
2211
+ end
2289
2212
 
2290
- before do
2291
- post.tags << tag
2292
- end
2213
+ it 'removes the reference from the inverse' do
2214
+ expect(deleted.related).to be_empty
2215
+ end
2293
2216
 
2294
- context "when the callback is a before_remove" do
2217
+ it 'removes the foreign keys from the inverse' do
2218
+ expect(deleted.related_ids).to be_empty
2219
+ end
2220
+ end
2295
2221
 
2296
- context "when there are no errors" do
2222
+ context 'when deleting from the inverse side' do
2223
+ let(:reloaded) { tag_two.reload }
2224
+ let!(:deleted) { reloaded.related.send(method, tag_one) }
2297
2225
 
2298
- before do
2299
- post.tags.delete tag
2300
- end
2226
+ it 'deletes the document from the relation' do
2227
+ expect(reloaded.related).to be_empty
2228
+ end
2301
2229
 
2302
- it "executes the callback" do
2303
- expect(post.before_remove_called).to be true
2304
- end
2230
+ it 'deletes the foreign key from the relation' do
2231
+ expect(reloaded.related_ids).to be_empty
2232
+ end
2305
2233
 
2306
- it "removes the document from the relation" do
2307
- expect(post.tags).to be_empty
2234
+ it 'removes the foreign keys from the inverse' do
2235
+ expect(deleted.related_ids).to be_empty
2236
+ end
2308
2237
  end
2309
2238
  end
2239
+ end
2310
2240
 
2311
- context "when errors are raised" do
2241
+ context 'when the association has callbacks' do
2242
+ let(:post) { Post.new }
2243
+ let(:tag) { Tag.new }
2312
2244
 
2313
- before do
2314
- expect(post).to receive(:before_remove_tag).and_raise
2315
- begin; post.tags.delete(tag); rescue; end
2316
- end
2317
-
2318
- it "does not remove the document from the relation" do
2319
- expect(post.tags).to eq([ tag ])
2320
- end
2245
+ before do
2246
+ post.tags << tag
2321
2247
  end
2322
- end
2323
2248
 
2324
- context "when the callback is an after_remove" do
2249
+ context 'when the callback is a before_remove' do
2250
+ context 'when there are no errors' do
2251
+ before do
2252
+ post.tags.send(method, tag)
2253
+ end
2325
2254
 
2326
- context "when no errors are raised" do
2255
+ it 'executes the callback' do
2256
+ expect(post.before_remove_called).to be true
2257
+ end
2327
2258
 
2328
- before do
2329
- post.tags.delete(tag)
2259
+ it 'removes the document from the relation' do
2260
+ expect(post.tags).to be_empty
2261
+ end
2330
2262
  end
2331
2263
 
2332
- it "executes the callback" do
2333
- expect(post.after_remove_called).to be true
2334
- end
2264
+ context "when errors are raised" do
2265
+ before do
2266
+ expect(post).to receive(:before_remove_tag).and_raise
2267
+ begin; post.tags.send(method, tag); rescue; end
2268
+ end
2335
2269
 
2336
- it "removes the document from the relation" do
2337
- expect(post.tags).to be_empty
2270
+ it 'does not remove the document from the relation' do
2271
+ expect(post.tags).to eq([ tag ])
2272
+ end
2338
2273
  end
2339
2274
  end
2340
2275
 
2341
- context "when errors are raised" do
2276
+ context 'when the callback is an after_remove' do
2277
+ context 'when no errors are raised' do
2278
+ before do
2279
+ post.tags.send(method, tag)
2280
+ end
2342
2281
 
2343
- before do
2344
- expect(post).to receive(:after_remove_tag).and_raise
2345
- begin; post.tags.delete(tag); rescue; end
2282
+ it 'executes the callback' do
2283
+ expect(post.after_remove_called).to be true
2284
+ end
2285
+
2286
+ it 'removes the document from the relation' do
2287
+ expect(post.tags).to be_empty
2288
+ end
2346
2289
  end
2347
2290
 
2348
- it "removes the document from the relation" do
2349
- expect(post.tags).to be_empty
2291
+ context 'when errors are raised' do
2292
+ before do
2293
+ expect(post).to receive(:after_remove_tag).and_raise
2294
+ begin; post.tags.send(method, tag); rescue; end
2295
+ end
2296
+
2297
+ it 'removes the document from the relation' do
2298
+ expect(post.tags).to be_empty
2299
+ end
2350
2300
  end
2351
2301
  end
2352
2302
  end
2353
2303
  end
2354
2304
  end
2355
2305
 
2356
- [ :delete_all, :destroy_all ].each do |method|
2357
-
2358
- describe "##{method}" do
2359
-
2360
- context "when the relation is not polymorphic" do
2361
-
2362
- context "when conditions are provided" do
2363
-
2364
- let(:person) do
2365
- Person.create!
2366
- end
2306
+ %i[ delete_all destroy_all ].each do |method|
2307
+ describe "\##{method}" do
2308
+ context 'when the relation is not polymorphic' do
2309
+ context 'when conditions are provided' do
2310
+ let(:person) { Person.create! }
2367
2311
 
2368
2312
  let!(:preference_one) do
2369
2313
  person.preferences.create!(name: "Testing")
@@ -2395,6 +2339,10 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2395
2339
  it "removes the ids from the foreign key" do
2396
2340
  expect(person.preference_ids).to eq([ preference_two.id ])
2397
2341
  end
2342
+
2343
+ it "sets the association locally" do
2344
+ expect(person.preferences).to eq([preference_two])
2345
+ end
2398
2346
  end
2399
2347
 
2400
2348
  context "when conditions are not provided" do
@@ -2421,6 +2369,10 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2421
2369
  it "returns the number of documents deleted" do
2422
2370
  expect(deleted).to eq(2)
2423
2371
  end
2372
+
2373
+ it "sets the association locally" do
2374
+ expect(person.preferences).to eq([])
2375
+ end
2424
2376
  end
2425
2377
  end
2426
2378
  end
@@ -2508,39 +2460,29 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2508
2460
  it "raises an error" do
2509
2461
  expect {
2510
2462
  preference
2511
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
2463
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Preference with id\(s\)/)
2512
2464
  end
2513
2465
  end
2514
2466
 
2515
2467
  context "when the id does not match" do
2516
2468
 
2517
2469
  context "when config set to raise error" do
2518
-
2519
- before do
2520
- Mongoid.raise_not_found_error = true
2521
- end
2470
+ config_override :raise_not_found_error, true
2522
2471
 
2523
2472
  it "raises an error" do
2524
2473
  expect {
2525
2474
  person.preferences.find(BSON::ObjectId.new)
2526
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
2475
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Preference with id\(s\)/)
2527
2476
  end
2528
2477
  end
2529
2478
 
2530
2479
  context "when config set not to raise error" do
2480
+ config_override :raise_not_found_error, false
2531
2481
 
2532
2482
  let(:preference) do
2533
2483
  person.preferences.find(BSON::ObjectId.new)
2534
2484
  end
2535
2485
 
2536
- before do
2537
- Mongoid.raise_not_found_error = false
2538
- end
2539
-
2540
- after do
2541
- Mongoid.raise_not_found_error = true
2542
- end
2543
-
2544
2486
  it "returns nil" do
2545
2487
  expect(preference).to be_nil
2546
2488
  end
@@ -2572,39 +2514,29 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2572
2514
  it "raises an error" do
2573
2515
  expect {
2574
2516
  preferences
2575
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
2517
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Preference with id\(s\)/)
2576
2518
  end
2577
2519
  end
2578
2520
 
2579
2521
  context "when the ids do not match" do
2580
2522
 
2581
2523
  context "when config set to raise error" do
2582
-
2583
- before do
2584
- Mongoid.raise_not_found_error = true
2585
- end
2524
+ config_override :raise_not_found_error, true
2586
2525
 
2587
2526
  it "raises an error" do
2588
2527
  expect {
2589
2528
  person.preferences.find([ BSON::ObjectId.new ])
2590
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
2529
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Preference with id\(s\)/)
2591
2530
  end
2592
2531
  end
2593
2532
 
2594
2533
  context "when config set not to raise error" do
2534
+ config_override :raise_not_found_error, false
2595
2535
 
2596
2536
  let(:preferences) do
2597
2537
  person.preferences.find([ BSON::ObjectId.new ])
2598
2538
  end
2599
2539
 
2600
- before do
2601
- Mongoid.raise_not_found_error = false
2602
- end
2603
-
2604
- after do
2605
- Mongoid.raise_not_found_error = true
2606
- end
2607
-
2608
2540
  it "returns an empty array" do
2609
2541
  expect(preferences).to be_empty
2610
2542
  end
@@ -3772,6 +3704,31 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3772
3704
  end
3773
3705
  end
3774
3706
 
3707
+ context "when accesing own _id from parent's foreign key in default" do
3708
+ let!(:contract) { HabtmmContract.create! }
3709
+ let!(:signature) { contract.signatures.create! }
3710
+
3711
+ it "is nil" do
3712
+ expect(signature.favorite_signature).to be nil
3713
+ end
3714
+ end
3715
+
3716
+ context "when setting an association on a model that uses the class_name option" do
3717
+ let!(:contract) { HabtmmContract.create! }
3718
+ let!(:signature) { HabtmmSignature.create!(contracts: [contract]) }
3719
+
3720
+ it "populates the inverse foreign key" do
3721
+ expect(signature.contracts.first.signature_ids).to eq([signature.id])
3722
+ end
3723
+ end
3724
+
3725
+ context "when there is a foreign key in the aliased associations" do
3726
+ it "has the correct aliases" do
3727
+ expect(Dog.aliased_associations["breed_ids"]).to eq("breeds")
3728
+ expect(Breed.aliased_associations["dog_ids"]).to eq("dogs")
3729
+ end
3730
+ end
3731
+
3775
3732
  # This test is for MONGOID-5344 which tests that the initial call to
3776
3733
  # signature_ids refers to the same array as subsequent calls to signature_ids.
3777
3734
  # Prior to the change in that ticket, this test broke because the array
@@ -32,6 +32,8 @@ end
32
32
  class HabtmmSignature
33
33
  include Mongoid::Document
34
34
 
35
+ field :favorite_signature, default: ->{ contracts.first.signature_ids.first if contracts.first }
36
+
35
37
  has_and_belongs_to_many :contracts, class_name: 'HabtmmContract'
36
38
 
37
39
  field :name, type: String
@@ -65,3 +67,26 @@ class HabtmmAnimal
65
67
 
66
68
  has_and_belongs_to_many :trainers, inverse_of: :animals, class_name: 'HabtmmTrainer', scope: -> { where(name: 'Dave') }
67
69
  end
70
+
71
+ class HabtmmSchool
72
+ include Mongoid::Document
73
+ include Mongoid::Timestamps
74
+
75
+ has_and_belongs_to_many :students, class_name: 'HabtmmStudent'
76
+
77
+ field :after_destroy_triggered, default: false
78
+
79
+ accepts_nested_attributes_for :students, allow_destroy: true
80
+ end
81
+
82
+ class HabtmmStudent
83
+ include Mongoid::Document
84
+ include Mongoid::Timestamps
85
+
86
+ has_and_belongs_to_many :schools, class_name: 'HabtmmSchool'
87
+
88
+ after_destroy do |doc|
89
+ schools.first.update_attributes!(after_destroy_triggered: true) unless schools.empty?
90
+ end
91
+ end
92
+