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