mongoid 7.5.4 → 8.1.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (442) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +3 -3
  3. data/README.md +6 -6
  4. data/Rakefile +44 -46
  5. data/lib/config/locales/en.yml +92 -43
  6. data/lib/mongoid/association/accessors.rb +44 -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 +85 -46
  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 +40 -21
  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 +16 -7
  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 +153 -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 +540 -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 +15 -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 +37 -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 +38 -9
  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 +142 -28
  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 +186 -16
  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 +3 -4
  205. data/lib/mongoid/traversable.rb +5 -4
  206. data/lib/mongoid/utils.rb +22 -0
  207. data/lib/mongoid/validatable/associated.rb +96 -18
  208. data/lib/mongoid/validatable/localizable.rb +1 -1
  209. data/lib/mongoid/validatable/macros.rb +5 -7
  210. data/lib/mongoid/validatable/presence.rb +2 -2
  211. data/lib/mongoid/validatable/uniqueness.rb +9 -8
  212. data/lib/mongoid/validatable.rb +17 -6
  213. data/lib/mongoid/version.rb +1 -1
  214. data/lib/mongoid/warnings.rb +19 -4
  215. data/lib/mongoid.rb +17 -3
  216. data/spec/config/mongoid.yml +16 -0
  217. data/spec/integration/app_spec.rb +13 -16
  218. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  219. data/spec/integration/associations/embedded_spec.rb +15 -0
  220. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  221. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  222. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  223. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +61 -0
  224. data/spec/integration/associations/has_one_spec.rb +97 -1
  225. data/spec/integration/associations/scope_option_spec.rb +1 -1
  226. data/spec/integration/callbacks_models.rb +132 -1
  227. data/spec/integration/callbacks_spec.rb +381 -4
  228. data/spec/integration/criteria/range_spec.rb +95 -1
  229. data/spec/integration/discriminator_key_spec.rb +118 -80
  230. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  231. data/spec/integration/i18n_fallbacks_spec.rb +3 -32
  232. data/spec/integration/matcher_examples_spec.rb +20 -13
  233. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  234. data/spec/integration/matcher_operator_spec.rb +3 -5
  235. data/spec/integration/persistence/range_field_spec.rb +350 -0
  236. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  237. data/spec/mongoid/association/depending_spec.rb +9 -9
  238. data/spec/mongoid/association/eager_spec.rb +2 -1
  239. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  240. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  241. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +96 -9
  242. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  243. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +290 -65
  244. data/spec/mongoid/association/embedded/embeds_many_models.rb +37 -0
  245. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +16 -0
  246. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  247. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  248. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +15 -2
  249. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  250. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  251. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  252. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  253. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
  254. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  255. data/spec/mongoid/association/referenced/belongs_to_spec.rb +4 -20
  256. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +186 -229
  257. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  258. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  259. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  260. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
  261. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +215 -177
  262. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  263. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  264. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  265. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  266. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  267. data/spec/mongoid/association/syncable_spec.rb +15 -1
  268. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  269. data/spec/mongoid/attributes/nested_spec.rb +80 -11
  270. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  271. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  272. data/spec/mongoid/attributes_spec.rb +526 -33
  273. data/spec/mongoid/changeable_spec.rb +429 -37
  274. data/spec/mongoid/clients/factory_spec.rb +23 -30
  275. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  276. data/spec/mongoid/clients_spec.rb +149 -15
  277. data/spec/mongoid/collection_configurable_spec.rb +158 -0
  278. data/spec/mongoid/config/defaults_spec.rb +160 -0
  279. data/spec/mongoid/config_spec.rb +214 -31
  280. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  281. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  282. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  283. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  284. data/spec/mongoid/contextual/memory_spec.rb +850 -88
  285. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
  286. data/spec/mongoid/contextual/mongo_spec.rb +2256 -1005
  287. data/spec/mongoid/contextual/none_spec.rb +60 -21
  288. data/spec/mongoid/copyable_spec.rb +453 -11
  289. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  290. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  291. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  292. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  293. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  294. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  295. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  296. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  297. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  298. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  299. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +4 -69
  300. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
  301. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  302. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  303. data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -484
  304. data/spec/mongoid/criteria/queryable/options_spec.rb +1 -1
  305. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +469 -0
  306. data/spec/mongoid/criteria/queryable/selectable_spec.rb +78 -86
  307. data/spec/mongoid/criteria/queryable/selector_spec.rb +15 -3
  308. data/spec/mongoid/criteria/translator_spec.rb +132 -0
  309. data/spec/mongoid/criteria_projection_spec.rb +1 -5
  310. data/spec/mongoid/criteria_spec.rb +469 -1205
  311. data/spec/mongoid/document_fields_spec.rb +173 -24
  312. data/spec/mongoid/document_spec.rb +32 -41
  313. data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
  314. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  315. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  316. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  317. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  318. data/spec/mongoid/errors/readonly_document_spec.rb +2 -2
  319. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  320. data/spec/mongoid/extensions/array_spec.rb +16 -2
  321. data/spec/mongoid/extensions/big_decimal_spec.rb +712 -212
  322. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  323. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  324. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  325. data/spec/mongoid/extensions/date_spec.rb +71 -1
  326. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  327. data/spec/mongoid/extensions/float_spec.rb +53 -74
  328. data/spec/mongoid/extensions/hash_spec.rb +33 -3
  329. data/spec/mongoid/extensions/integer_spec.rb +50 -64
  330. data/spec/mongoid/extensions/range_spec.rb +255 -54
  331. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  332. data/spec/mongoid/extensions/set_spec.rb +106 -0
  333. data/spec/mongoid/extensions/string_spec.rb +53 -25
  334. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  335. data/spec/mongoid/extensions/time_spec.rb +639 -106
  336. data/spec/mongoid/extensions/time_with_zone_spec.rb +24 -83
  337. data/spec/mongoid/factory_spec.rb +61 -1
  338. data/spec/mongoid/fields/localized_spec.rb +80 -37
  339. data/spec/mongoid/fields_spec.rb +503 -87
  340. data/spec/mongoid/findable_spec.rb +450 -58
  341. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  342. data/spec/mongoid/indexable_spec.rb +55 -30
  343. data/spec/mongoid/interceptable_spec.rb +824 -22
  344. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  345. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  346. data/spec/mongoid/mongoizable_spec.rb +285 -0
  347. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  348. data/spec/mongoid/persistable/deletable_spec.rb +28 -8
  349. data/spec/mongoid/persistable/destroyable_spec.rb +28 -8
  350. data/spec/mongoid/persistable/incrementable_spec.rb +37 -0
  351. data/spec/mongoid/persistable/logical_spec.rb +37 -0
  352. data/spec/mongoid/persistable/poppable_spec.rb +36 -0
  353. data/spec/mongoid/persistable/pullable_spec.rb +72 -0
  354. data/spec/mongoid/persistable/pushable_spec.rb +72 -0
  355. data/spec/mongoid/persistable/renamable_spec.rb +36 -0
  356. data/spec/mongoid/persistable/savable_spec.rb +96 -0
  357. data/spec/mongoid/persistable/settable_spec.rb +37 -0
  358. data/spec/mongoid/persistable/unsettable_spec.rb +36 -0
  359. data/spec/mongoid/persistable/updatable_spec.rb +20 -28
  360. data/spec/mongoid/persistable/upsertable_spec.rb +89 -1
  361. data/spec/mongoid/persistence_context_spec.rb +31 -57
  362. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  363. data/spec/mongoid/query_cache_spec.rb +56 -215
  364. data/spec/mongoid/reloadable_spec.rb +83 -6
  365. data/spec/mongoid/scopable_spec.rb +91 -1
  366. data/spec/mongoid/serializable_spec.rb +25 -39
  367. data/spec/mongoid/shardable_spec.rb +4 -4
  368. data/spec/mongoid/stateful_spec.rb +150 -8
  369. data/spec/mongoid/tasks/database_rake_spec.rb +74 -0
  370. data/spec/mongoid/tasks/database_spec.rb +127 -0
  371. data/spec/mongoid/timestamps_spec.rb +392 -4
  372. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  373. data/spec/mongoid/touchable_spec.rb +390 -2
  374. data/spec/mongoid/touchable_spec_models.rb +14 -8
  375. data/spec/mongoid/traversable_spec.rb +13 -35
  376. data/spec/mongoid/validatable/associated_spec.rb +13 -30
  377. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  378. data/spec/mongoid/validatable/uniqueness_spec.rb +58 -31
  379. data/spec/mongoid/warnings_spec.rb +35 -0
  380. data/spec/mongoid_spec.rb +34 -16
  381. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  382. data/spec/rails/mongoid_spec.rb +4 -16
  383. data/spec/spec_helper.rb +5 -0
  384. data/spec/support/constraints.rb +24 -0
  385. data/spec/support/immutable_ids.rb +118 -0
  386. data/spec/support/macros.rb +78 -0
  387. data/spec/support/models/artist.rb +0 -1
  388. data/spec/support/models/augmentation.rb +12 -0
  389. data/spec/support/models/band.rb +5 -0
  390. data/spec/support/models/book.rb +1 -0
  391. data/spec/support/models/building.rb +2 -0
  392. data/spec/support/models/catalog.rb +24 -0
  393. data/spec/support/models/circus.rb +3 -0
  394. data/spec/support/models/cover.rb +10 -0
  395. data/spec/support/models/fanatic.rb +8 -0
  396. data/spec/support/models/implant.rb +9 -0
  397. data/spec/support/models/label.rb +2 -0
  398. data/spec/support/models/lat_lng.rb +6 -0
  399. data/spec/support/models/name.rb +10 -0
  400. data/spec/support/models/passport.rb +9 -0
  401. data/spec/support/models/person.rb +2 -0
  402. data/spec/support/models/player.rb +2 -0
  403. data/spec/support/models/powerup.rb +12 -0
  404. data/spec/support/models/product.rb +1 -0
  405. data/spec/support/models/purse.rb +9 -0
  406. data/spec/support/models/registry.rb +1 -0
  407. data/spec/support/models/school.rb +14 -0
  408. data/spec/support/models/shield.rb +18 -0
  409. data/spec/support/models/student.rb +14 -0
  410. data/spec/support/models/weapon.rb +12 -0
  411. metadata +101 -96
  412. checksums.yaml.gz.sig +0 -0
  413. data/lib/mongoid/errors/eager_load.rb +0 -23
  414. data/lib/mongoid/errors/invalid_value.rb +0 -17
  415. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -60
  416. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -60
  417. data/spec/mongoid/errors/eager_load_spec.rb +0 -31
  418. data/spec/shared/LICENSE +0 -20
  419. data/spec/shared/bin/get-mongodb-download-url +0 -17
  420. data/spec/shared/bin/s3-copy +0 -45
  421. data/spec/shared/bin/s3-upload +0 -69
  422. data/spec/shared/lib/mrss/child_process_helper.rb +0 -80
  423. data/spec/shared/lib/mrss/cluster_config.rb +0 -231
  424. data/spec/shared/lib/mrss/constraints.rb +0 -378
  425. data/spec/shared/lib/mrss/docker_runner.rb +0 -291
  426. data/spec/shared/lib/mrss/eg_config_utils.rb +0 -51
  427. data/spec/shared/lib/mrss/event_subscriber.rb +0 -210
  428. data/spec/shared/lib/mrss/lite_constraints.rb +0 -238
  429. data/spec/shared/lib/mrss/server_version_registry.rb +0 -120
  430. data/spec/shared/lib/mrss/session_registry.rb +0 -69
  431. data/spec/shared/lib/mrss/session_registry_legacy.rb +0 -60
  432. data/spec/shared/lib/mrss/spec_organizer.rb +0 -179
  433. data/spec/shared/lib/mrss/utils.rb +0 -15
  434. data/spec/shared/share/Dockerfile.erb +0 -325
  435. data/spec/shared/share/haproxy-1.conf +0 -16
  436. data/spec/shared/share/haproxy-2.conf +0 -17
  437. data/spec/shared/shlib/config.sh +0 -27
  438. data/spec/shared/shlib/distro.sh +0 -74
  439. data/spec/shared/shlib/server.sh +0 -392
  440. data/spec/shared/shlib/set_env.sh +0 -169
  441. data.tar.gz.sig +0 -0
  442. metadata.gz.sig +0 -3
@@ -2,11 +2,30 @@
2
2
 
3
3
  require "spec_helper"
4
4
 
5
+ module RefHasManySpec
6
+ module OverrideInitialize
7
+ class Parent
8
+ include Mongoid::Document
9
+ has_many :children, inverse_of: :parent
10
+ end
11
+
12
+ class Child
13
+ include Mongoid::Document
14
+ belongs_to :parent
15
+ field :name, type: String
16
+
17
+ def initialize(*args)
18
+ super
19
+ self.name ||= "default"
20
+ end
21
+ end
22
+ end
23
+ end
24
+
5
25
  describe Mongoid::Association::Referenced::HasMany::Proxy do
26
+ config_override :raise_not_found_error, true
6
27
 
7
28
  before :all do
8
- Mongoid.raise_not_found_error = true
9
-
10
29
  Drug.belongs_to :person, primary_key: :username
11
30
  Person.has_many :drugs, validate: false, primary_key: :username
12
31
  end
@@ -877,6 +896,14 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
877
896
  [ :build, :new ].each do |method|
878
897
 
879
898
  describe "##{method}" do
899
+ context 'when model has #initialize' do
900
+ let(:parent) { RefHasManySpec::OverrideInitialize::Parent.create }
901
+ let(:child) { parent.children.send(method) }
902
+
903
+ it 'should call #initialize' do
904
+ expect(child.name).to be == "default"
905
+ end
906
+ end
880
907
 
881
908
  context "when the association is not polymorphic" do
882
909
 
@@ -2077,154 +2104,114 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
2077
2104
  end
2078
2105
  end
2079
2106
 
2080
- describe "#delete" do
2081
-
2082
- let!(:person) do
2083
- Person.create!(username: 'arthurnn')
2084
- end
2107
+ %i[ delete delete_one ].each do |method|
2108
+ describe "##{method}" do
2109
+ let!(:person) { Person.create!(username: 'arthurnn') }
2085
2110
 
2086
- context "when the document is found" do
2111
+ context 'when the document is found' do
2112
+ context 'when no dependent option is set' do
2113
+ context 'when we are assigning attributes' do
2114
+ let!(:drug) { person.drugs.create! }
2115
+ let(:deleted) { person.drugs.send(method, drug) }
2087
2116
 
2088
- context "when no dependent option is set" do
2117
+ before do
2118
+ Mongoid::Threaded.begin_execution(:assign)
2119
+ end
2089
2120
 
2090
- context "when we are assigning attributes" do
2121
+ after do
2122
+ Mongoid::Threaded.exit_execution(:assign)
2123
+ end
2091
2124
 
2092
- let!(:drug) do
2093
- person.drugs.create!
2125
+ it 'does not cascade' do
2126
+ expect(deleted.changes.keys).to eq([ 'person_id' ])
2127
+ end
2094
2128
  end
2095
2129
 
2096
- before do
2097
- Mongoid::Threaded.begin_execution(:assign)
2098
- end
2130
+ context 'when the document is loaded' do
2131
+ let!(:drug) { person.drugs.create! }
2132
+ let!(:deleted) { person.drugs.send(method, drug) }
2099
2133
 
2100
- after do
2101
- Mongoid::Threaded.exit_execution(:assign)
2102
- end
2134
+ it 'returns the document' do
2135
+ expect(deleted).to eq(drug)
2136
+ end
2103
2137
 
2104
- let(:deleted) do
2105
- person.drugs.delete(drug)
2106
- end
2138
+ it 'deletes the foreign key' do
2139
+ expect(drug.person_id).to be_nil
2140
+ end
2107
2141
 
2108
- it "does not cascade" do
2109
- expect(deleted.changes.keys).to eq([ "person_id" ])
2142
+ it 'removes the document from the association' do
2143
+ expect(person.drugs).not_to include(drug)
2144
+ end
2110
2145
  end
2111
- end
2112
2146
 
2113
- context "when the document is loaded" do
2147
+ context 'when the document is not loaded' do
2148
+ let!(:drug) { Drug.create!(person_id: person.username) }
2149
+ let!(:deleted) { person.drugs.send(method, drug) }
2114
2150
 
2115
- let!(:drug) do
2116
- person.drugs.create!
2117
- end
2151
+ it 'returns the document' do
2152
+ expect(deleted).to eq(drug)
2153
+ end
2118
2154
 
2119
- let!(:deleted) do
2120
- person.drugs.delete(drug)
2121
- end
2155
+ it 'deletes the foreign key' do
2156
+ expect(drug.person_id).to be_nil
2157
+ end
2122
2158
 
2123
- it "returns the document" do
2124
- expect(deleted).to eq(drug)
2159
+ it 'removes the document from the association' do
2160
+ expect(person.drugs).not_to include(drug)
2161
+ end
2125
2162
  end
2163
+ end
2126
2164
 
2127
- it "deletes the foreign key" do
2128
- expect(drug.person_id).to be_nil
2129
- end
2165
+ context 'when dependent is delete' do
2166
+ context 'when the document is loaded' do
2167
+ let!(:post) { person.posts.create!(title: 'test') }
2168
+ let!(:deleted) { person.posts.send(method, post) }
2130
2169
 
2131
- it "removes the document from the association" do
2132
- expect(person.drugs).to_not include(drug)
2133
- end
2134
- end
2170
+ it 'returns the document' do
2171
+ expect(deleted).to eq(post)
2172
+ end
2135
2173
 
2136
- context "when the document is not loaded" do
2174
+ it 'deletes the document' do
2175
+ expect(post).to be_destroyed
2176
+ end
2137
2177
 
2138
- let!(:drug) do
2139
- Drug.create!(person_id: person.username)
2178
+ it 'removes the document from the association' do
2179
+ expect(person.posts).not_to include(post)
2180
+ end
2140
2181
  end
2141
2182
 
2142
- let!(:deleted) do
2143
- person.drugs.delete(drug)
2144
- end
2183
+ context 'when the document is not loaded' do
2184
+ let!(:post) { Post.create!(title: 'foo', person_id: person.id) }
2185
+ let!(:deleted) { person.posts.send(method, post) }
2145
2186
 
2146
- it "returns the document" do
2147
- expect(deleted).to eq(drug)
2148
- end
2187
+ it 'returns the document' do
2188
+ expect(deleted).to eq(post)
2189
+ end
2149
2190
 
2150
- it "deletes the foreign key" do
2151
- expect(drug.person_id).to be_nil
2152
- end
2191
+ it 'deletes the document' do
2192
+ expect(post).to be_destroyed
2193
+ end
2153
2194
 
2154
- it "removes the document from the association" do
2155
- expect(person.drugs).to_not include(drug)
2195
+ it 'removes the document from the association' do
2196
+ expect(person.posts).not_to include(post)
2197
+ end
2156
2198
  end
2157
2199
  end
2158
2200
  end
2159
2201
 
2160
- context "when dependent is delete" do
2161
-
2162
- context "when the document is loaded" do
2163
-
2164
- let!(:post) do
2165
- person.posts.create!(title: "test")
2166
- end
2167
-
2168
- let!(:deleted) do
2169
- person.posts.delete(post)
2170
- end
2171
-
2172
- it "returns the document" do
2173
- expect(deleted).to eq(post)
2174
- end
2175
-
2176
- it "deletes the document" do
2177
- expect(post).to be_destroyed
2178
- end
2202
+ context 'when the document is not found' do
2203
+ let!(:post) { Post.create!(title: 'foo') }
2204
+ let!(:deleted) { person.posts.send(method, post) }
2179
2205
 
2180
- it "removes the document from the association" do
2181
- expect(person.posts).to_not include(post)
2182
- end
2206
+ it 'returns nil' do
2207
+ expect(deleted).to be_nil
2183
2208
  end
2184
2209
 
2185
- context "when the document is not loaded" do
2186
-
2187
- let!(:post) do
2188
- Post.create!(title: "foo", person_id: person.id)
2189
- end
2190
-
2191
- let!(:deleted) do
2192
- person.posts.delete(post)
2193
- end
2194
-
2195
- it "returns the document" do
2196
- expect(deleted).to eq(post)
2197
- end
2198
-
2199
- it "deletes the document" do
2200
- expect(post).to be_destroyed
2201
- end
2202
-
2203
- it "removes the document from the association" do
2204
- expect(person.posts).to_not include(post)
2205
- end
2210
+ it 'does not delete the document' do
2211
+ expect(post).to be_persisted
2206
2212
  end
2207
2213
  end
2208
2214
  end
2209
-
2210
- context "when the document is not found" do
2211
-
2212
- let!(:post) do
2213
- Post.create!(title: "foo")
2214
- end
2215
-
2216
- let!(:deleted) do
2217
- person.posts.delete(post)
2218
- end
2219
-
2220
- it "returns nil" do
2221
- expect(deleted).to be_nil
2222
- end
2223
-
2224
- it "does not delete the document" do
2225
- expect(post).to be_persisted
2226
- end
2227
- end
2228
2215
  end
2229
2216
 
2230
2217
  [ :delete_all, :destroy_all ].each do |method|
@@ -2239,10 +2226,8 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
2239
2226
  Person.create!(username: 'durran')
2240
2227
  end
2241
2228
 
2242
- before do
2243
- person.posts.create!(title: "Testing")
2244
- person.posts.create!(title: "Test")
2245
- end
2229
+ let!(:post1) { person.posts.create!(title: "Testing") }
2230
+ let!(:post2) { person.posts.create!(title: "Test") }
2246
2231
 
2247
2232
  it "removes the correct posts" do
2248
2233
  person.posts.send(method, { title: "Testing" })
@@ -2258,6 +2243,11 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
2258
2243
  it "returns the number of documents deleted" do
2259
2244
  expect(person.posts.send(method, { title: "Testing" })).to eq(1)
2260
2245
  end
2246
+
2247
+ it "sets the association locally" do
2248
+ person.posts.send(method, { title: "Testing" })
2249
+ expect(person.posts).to eq([post2])
2250
+ end
2261
2251
  end
2262
2252
 
2263
2253
  context "when conditions are not provided" do
@@ -2284,6 +2274,11 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
2284
2274
  it "returns the number of documents deleted" do
2285
2275
  expect(person.posts.send(method)).to eq(2)
2286
2276
  end
2277
+
2278
+ it "sets the association locally" do
2279
+ person.posts.send(method)
2280
+ expect(person.posts).to eq([])
2281
+ end
2287
2282
  end
2288
2283
  end
2289
2284
 
@@ -2295,10 +2290,8 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
2295
2290
  Movie.create!(title: "Bladerunner")
2296
2291
  end
2297
2292
 
2298
- before do
2299
- movie.ratings.create!(value: 1)
2300
- movie.ratings.create!(value: 2)
2301
- end
2293
+ let!(:rating1) { movie.ratings.create!(value: 1) }
2294
+ let!(:rating2) { movie.ratings.create!(value: 2) }
2302
2295
 
2303
2296
  it "removes the correct ratings" do
2304
2297
  movie.ratings.send(method, { value: 1 })
@@ -2313,6 +2306,11 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
2313
2306
  it "returns the number of documents deleted" do
2314
2307
  expect(movie.ratings.send(method, { value: 1 })).to eq(1)
2315
2308
  end
2309
+
2310
+ it "sets the association locally" do
2311
+ movie.ratings.send(method, { value: 1 })
2312
+ expect(movie.ratings).to eq([rating2])
2313
+ end
2316
2314
  end
2317
2315
 
2318
2316
  context "when conditions are not provided" do
@@ -2339,6 +2337,11 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
2339
2337
  it "returns the number of documents deleted" do
2340
2338
  expect(movie.ratings.send(method)).to eq(2)
2341
2339
  end
2340
+
2341
+ it "sets the association locally" do
2342
+ movie.ratings.send(method)
2343
+ expect(movie.ratings).to eq([])
2344
+ end
2342
2345
  end
2343
2346
  end
2344
2347
  end
@@ -2392,6 +2395,42 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
2392
2395
  end
2393
2396
  end
2394
2397
  end
2398
+
2399
+ context 'when invoked with specifying conditions' do
2400
+ let(:other_person) { Person.create! }
2401
+ let(:post) { person.posts.first }
2402
+
2403
+ before do
2404
+ person.posts.create title: 'bumfuzzle'
2405
+ other_person.posts.create title: 'bumbershoot'
2406
+ end
2407
+
2408
+ context 'when the conditions match an associated record' do
2409
+ it 'detects its existence by condition' do
2410
+ expect(person.posts.exists?(title: 'bumfuzzle')).to be true
2411
+ expect(other_person.posts.exists?(title: 'bumbershoot')).to be true
2412
+ end
2413
+
2414
+ it 'detects its existence by id' do
2415
+ expect(person.posts.exists?(post._id)).to be true
2416
+ end
2417
+
2418
+ it 'returns false when given false' do
2419
+ expect(person.posts.exists?(false)).to be false
2420
+ end
2421
+
2422
+ it 'returns false when given nil' do
2423
+ expect(person.posts.exists?(nil)).to be false
2424
+ end
2425
+ end
2426
+
2427
+ context 'when the conditions match an unassociated record' do
2428
+ it 'does not detect its existence' do
2429
+ expect(person.posts.exists?(title: 'bumbershoot')).to be false
2430
+ expect(other_person.posts.exists?(title: 'bumfuzzle')).to be false
2431
+ end
2432
+ end
2433
+ end
2395
2434
  end
2396
2435
 
2397
2436
  context "when documents exist in application but not in database" do
@@ -2462,6 +2501,12 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
2462
2501
  end
2463
2502
  end
2464
2503
  end
2504
+
2505
+ context 'when invoked with specifying conditions' do
2506
+ it 'returns false' do
2507
+ expect(person.posts.exists?(title: 'hullaballoo')).to be false
2508
+ end
2509
+ end
2465
2510
  end
2466
2511
  end
2467
2512
 
@@ -2524,39 +2569,29 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
2524
2569
  it "raises an error" do
2525
2570
  expect {
2526
2571
  person.posts.find(post.id)
2527
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
2572
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Post with id\(s\)/)
2528
2573
  end
2529
2574
  end
2530
2575
 
2531
2576
  context "when the id does not match" do
2532
2577
 
2533
2578
  context "when config set to raise error" do
2534
-
2535
- before do
2536
- Mongoid.raise_not_found_error = true
2537
- end
2579
+ config_override :raise_not_found_error, true
2538
2580
 
2539
2581
  it "raises an error" do
2540
2582
  expect {
2541
2583
  person.posts.find(BSON::ObjectId.new)
2542
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
2584
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Post with id\(s\)/)
2543
2585
  end
2544
2586
  end
2545
2587
 
2546
2588
  context "when config set not to raise error" do
2589
+ config_override :raise_not_found_error, false
2547
2590
 
2548
2591
  let(:post) do
2549
2592
  person.posts.find(BSON::ObjectId.new)
2550
2593
  end
2551
2594
 
2552
- before do
2553
- Mongoid.raise_not_found_error = false
2554
- end
2555
-
2556
- after do
2557
- Mongoid.raise_not_found_error = true
2558
- end
2559
-
2560
2595
  it "returns nil" do
2561
2596
  expect(post).to be_nil
2562
2597
  end
@@ -2580,32 +2615,22 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
2580
2615
  context "when the ids do not match" do
2581
2616
 
2582
2617
  context "when config set to raise error" do
2583
-
2584
- before do
2585
- Mongoid.raise_not_found_error = true
2586
- end
2618
+ config_override :raise_not_found_error, true
2587
2619
 
2588
2620
  it "raises an error" do
2589
2621
  expect {
2590
2622
  person.posts.find([ BSON::ObjectId.new ])
2591
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
2623
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Post with id\(s\)/)
2592
2624
  end
2593
2625
  end
2594
2626
 
2595
2627
  context "when config set not to raise error" do
2628
+ config_override :raise_not_found_error, false
2596
2629
 
2597
2630
  let(:posts) do
2598
2631
  person.posts.find([ BSON::ObjectId.new ])
2599
2632
  end
2600
2633
 
2601
- before do
2602
- Mongoid.raise_not_found_error = false
2603
- end
2604
-
2605
- after do
2606
- Mongoid.raise_not_found_error = true
2607
- end
2608
-
2609
2634
  it "returns an empty array" do
2610
2635
  expect(posts).to be_empty
2611
2636
  end
@@ -2644,32 +2669,22 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
2644
2669
  context "when the id does not match" do
2645
2670
 
2646
2671
  context "when config set to raise error" do
2647
-
2648
- before do
2649
- Mongoid.raise_not_found_error = true
2650
- end
2672
+ config_override :raise_not_found_error, true
2651
2673
 
2652
2674
  it "raises an error" do
2653
2675
  expect {
2654
2676
  movie.ratings.find(BSON::ObjectId.new)
2655
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
2677
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Rating with id\(s\)/)
2656
2678
  end
2657
2679
  end
2658
2680
 
2659
2681
  context "when config set not to raise error" do
2682
+ config_override :raise_not_found_error, false
2660
2683
 
2661
2684
  let(:rating) do
2662
2685
  movie.ratings.find(BSON::ObjectId.new)
2663
2686
  end
2664
2687
 
2665
- before do
2666
- Mongoid.raise_not_found_error = false
2667
- end
2668
-
2669
- after do
2670
- Mongoid.raise_not_found_error = true
2671
- end
2672
-
2673
2688
  it "returns nil" do
2674
2689
  expect(rating).to be_nil
2675
2690
  end
@@ -2701,32 +2716,22 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
2701
2716
  context "when the ids do not match" do
2702
2717
 
2703
2718
  context "when config set to raise error" do
2704
-
2705
- before do
2706
- Mongoid.raise_not_found_error = true
2707
- end
2719
+ config_override :raise_not_found_error, true
2708
2720
 
2709
2721
  it "raises an error" do
2710
2722
  expect {
2711
2723
  movie.ratings.find([ BSON::ObjectId.new ])
2712
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
2724
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Rating with id\(s\)/)
2713
2725
  end
2714
2726
  end
2715
2727
 
2716
2728
  context "when config set not to raise error" do
2729
+ config_override :raise_not_found_error, false
2717
2730
 
2718
2731
  let(:ratings) do
2719
2732
  movie.ratings.find([ BSON::ObjectId.new ])
2720
2733
  end
2721
2734
 
2722
- before do
2723
- Mongoid.raise_not_found_error = false
2724
- end
2725
-
2726
- after do
2727
- Mongoid.raise_not_found_error = true
2728
- end
2729
-
2730
2735
  it "returns an empty array" do
2731
2736
  expect(ratings).to be_empty
2732
2737
  end
@@ -4090,6 +4095,39 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
4090
4095
  end
4091
4096
  end
4092
4097
 
4098
+ context "when removing a document with counter_cache on" do
4099
+ let(:post) { Post.create! }
4100
+ let(:person1) { Person.create! }
4101
+ let(:person2) { Person.create! }
4102
+
4103
+ before do
4104
+ post.update_attribute(:person, person1)
4105
+ expect(person1.posts_count).to eq 1
4106
+
4107
+ person2
4108
+ post.update_attribute(:person, person2)
4109
+ person1.reload
4110
+ expect(person1.posts_count).to eq 0
4111
+ expect(person2.posts_count).to eq 1
4112
+
4113
+ post.update_attribute(:person, nil)
4114
+ person1.reload
4115
+ person2.reload
4116
+ end
4117
+
4118
+ it "the count field is updated" do
4119
+ expect(person2.posts_count).to eq 0
4120
+ end
4121
+ end
4122
+
4123
+ context "when there is a foreign key in the aliased associations" do
4124
+ it "has the correct aliases" do
4125
+ expect(Band.aliased_associations["artist_ids"]).to eq("artists")
4126
+ expect(Artist.aliased_associations.key?("band_id")).to be false
4127
+ expect(Artist.aliased_fields["band"]).to eq("band_id")
4128
+ end
4129
+ end
4130
+
4093
4131
  context "when executing concat on foreign key array from the db" do
4094
4132
  config_override :legacy_attributes, false
4095
4133
 
@@ -42,6 +42,7 @@ end
42
42
 
43
43
  class HmmSchool
44
44
  include Mongoid::Document
45
+ include Mongoid::Timestamps
45
46
 
46
47
  has_many :students, class_name: 'HmmStudent'
47
48
 
@@ -51,8 +52,9 @@ end
51
52
 
52
53
  class HmmStudent
53
54
  include Mongoid::Document
55
+ include Mongoid::Timestamps
54
56
 
55
- belongs_to :school, class_name: 'HmmSchool'
57
+ belongs_to :school, class_name: 'HmmSchool', touch: true
56
58
 
57
59
  field :name, type: String
58
60
  field :grade, type: Integer, default: 3
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "spec_helper"
4
+ require_relative './has_many_models'
4
5
 
5
6
  describe Mongoid::Association::Referenced::HasMany do
6
7
 
@@ -1245,4 +1246,28 @@ describe Mongoid::Association::Referenced::HasMany do
1245
1246
  expect(association.create_relation(owner, target)).to be_a(Array)
1246
1247
  end
1247
1248
  end
1249
+
1250
+ context "when adding an object to the association" do
1251
+ let!(:start_time) { Timecop.freeze(Time.at(Time.now.to_i)) }
1252
+
1253
+ let(:update_time) do
1254
+ Timecop.freeze(Time.at(Time.now.to_i) + 2)
1255
+ end
1256
+
1257
+ after do
1258
+ Timecop.return
1259
+ end
1260
+
1261
+ let!(:school) { HmmSchool.create! }
1262
+ let!(:student) { HmmStudent.create! }
1263
+
1264
+ before do
1265
+ update_time
1266
+ student.update(school: school)
1267
+ end
1268
+
1269
+ it "updates the updated_at" do
1270
+ expect(student.updated_at).to eq(update_time)
1271
+ end
1272
+ end
1248
1273
  end
@@ -91,7 +91,7 @@ describe Mongoid::Association::Referenced::HasOne::Buildable do
91
91
  expect(document).to eq(object)
92
92
  end
93
93
 
94
- context 'when the object is already related to another object' do
94
+ context 'when the object is already associated with another object' do
95
95
 
96
96
  let(:original_person) do
97
97
  Person.new
@@ -105,7 +105,7 @@ describe Mongoid::Association::Referenced::HasOne::Buildable do
105
105
  association.build(Person.new, object)
106
106
  end
107
107
 
108
- it 'clears the object of its previous relation' do
108
+ it 'clears the object of its previous association' do
109
109
  expect(original_person.account).to be_nil
110
110
  end
111
111