mongoid 7.5.4 → 8.1.7

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 (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 +48 -14
  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 +17 -13
  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 +10 -5
  206. data/lib/mongoid/utils.rb +22 -0
  207. data/lib/mongoid/validatable/associated.rb +98 -17
  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 +24 -19
  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 +19 -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 +27 -34
  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
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TimestampsSpec
4
+ module Touch
5
+ class User
6
+ include Mongoid::Document
7
+ include Mongoid::Timestamps
8
+
9
+ has_and_belongs_to_many :addresses, class_name: "TimestampsSpec::Touch::Address"
10
+ has_many :accounts, class_name: "TimestampsSpec::Touch::Account"
11
+ has_one :pet, class_name: "TimestampsSpec::Touch::Pet"
12
+ end
13
+
14
+ class Address
15
+ include Mongoid::Document
16
+ include Mongoid::Timestamps
17
+
18
+ has_and_belongs_to_many :users, class_name: "TimestampsSpec::Touch::User"
19
+ end
20
+
21
+ class Account
22
+ include Mongoid::Document
23
+ include Mongoid::Timestamps
24
+
25
+ belongs_to :user, required: false, touch: true, class_name: "TimestampsSpec::Touch::User"
26
+ end
27
+
28
+ class Pet
29
+ include Mongoid::Document
30
+ include Mongoid::Timestamps
31
+
32
+ belongs_to :user, required: false, touch: true, class_name: "TimestampsSpec::Touch::User"
33
+ end
34
+ end
35
+
36
+ module NoTouch
37
+ class User
38
+ include Mongoid::Document
39
+ include Mongoid::Timestamps
40
+
41
+ has_and_belongs_to_many :addresses, class_name: "TimestampsSpec::NoTouch::Address"
42
+ has_many :accounts, class_name: "TimestampsSpec::NoTouch::Account"
43
+ has_one :pet, class_name: "TimestampsSpec::NoTouch::Pet"
44
+ end
45
+
46
+ class Address
47
+ include Mongoid::Document
48
+ include Mongoid::Timestamps
49
+
50
+ has_and_belongs_to_many :users, class_name: "TimestampsSpec::NoTouch::User"
51
+ end
52
+
53
+ class Account
54
+ include Mongoid::Document
55
+ include Mongoid::Timestamps
56
+
57
+ belongs_to :user, required: false, touch: false, class_name: "TimestampsSpec::NoTouch::User"
58
+ end
59
+
60
+ class Pet
61
+ include Mongoid::Document
62
+ include Mongoid::Timestamps
63
+
64
+ belongs_to :user, required: false, touch: false, class_name: "TimestampsSpec::NoTouch::User"
65
+ end
66
+ end
67
+ end
@@ -89,7 +89,7 @@ describe Mongoid::Touchable do
89
89
  end
90
90
  end
91
91
 
92
- shared_examples 'updates the parent when :touch is not set' do
92
+ shared_examples 'updates the parent when :touch is false' do
93
93
  it 'does not update updated_at on parent' do
94
94
  entrance
95
95
  update_time
@@ -130,7 +130,7 @@ describe Mongoid::Touchable do
130
130
 
131
131
  include_examples 'updates the child'
132
132
  include_examples 'updates the parent when :touch is true'
133
- include_examples 'updates the parent when :touch is not set'
133
+ include_examples 'updates the parent when :touch is false'
134
134
 
135
135
  context 'when also updating an additional field' do
136
136
  it 'persists the update to the additional field' do
@@ -584,5 +584,393 @@ describe Mongoid::Touchable do
584
584
  end
585
585
  end
586
586
  end
587
+
588
+ context "when the touch option is true" do
589
+
590
+ shared_examples "updates the parent's updated_at" do
591
+
592
+ let!(:start_time) { Timecop.freeze(Time.at(Time.now.to_i)) }
593
+
594
+ let(:update_time) do
595
+ Timecop.freeze(Time.at(Time.now.to_i) + 2)
596
+ end
597
+
598
+ after do
599
+ Timecop.return
600
+ end
601
+
602
+ let(:building) do
603
+ parent_cls.create!
604
+ end
605
+
606
+ let(:floor) do
607
+ building.floors.create!
608
+ end
609
+
610
+ before do
611
+ floor
612
+ update_time
613
+ floor.level = 9
614
+ floor.send(meth)
615
+ end
616
+
617
+ it "the parent is not nil" do
618
+ expect(floor.building).to_not be nil
619
+ end
620
+
621
+ it "updates the parent's timestamp" do
622
+ building.updated_at.should == update_time
623
+ building.reload.updated_at.should == update_time
624
+ end
625
+ end
626
+
627
+ shared_examples "updates the child's updated_at" do
628
+
629
+ let!(:start_time) { Timecop.freeze(Time.at(Time.now.to_i)) }
630
+
631
+ let(:update_time) do
632
+ Timecop.freeze(Time.at(Time.now.to_i) + 2)
633
+ end
634
+
635
+ after do
636
+ Timecop.return
637
+ end
638
+
639
+ let(:building) do
640
+ parent_cls.create!
641
+ end
642
+
643
+ let(:floor) do
644
+ building.floors.create!
645
+ end
646
+
647
+ before do
648
+ floor
649
+ update_time
650
+ floor.level = 9
651
+ floor.send(meth)
652
+ end
653
+
654
+ it "the parent is not nil" do
655
+ expect(floor.building).to_not be nil
656
+ end
657
+
658
+ it "updates the child's timestamp" do
659
+ floor.updated_at.should == update_time
660
+ floor.reload.updated_at.should == update_time
661
+ end
662
+ end
663
+
664
+ [ :save!, :destroy, :touch].each do |meth|
665
+ context "with #{meth} on referenced associations" do
666
+ let(:parent_cls) { TouchableSpec::Referenced::Building }
667
+ let(:meth) { meth }
668
+
669
+ include_examples "updates the child's updated_at" unless meth == :destroy
670
+ include_examples "updates the parent's updated_at"
671
+ end
672
+
673
+ context "with #{meth} on embedded associations" do
674
+ let(:parent_cls) { TouchableSpec::Embedded::Building }
675
+ let(:meth) { meth }
676
+
677
+ include_examples "updates the child's updated_at" unless meth == :destroy
678
+ include_examples "updates the parent's updated_at"
679
+ end
680
+ end
681
+ end
682
+
683
+ context "when the touch option is false" do
684
+
685
+ shared_examples "does not update the parent" do
686
+
687
+ let!(:start_time) { Timecop.freeze(Time.at(Time.now.to_i)) }
688
+
689
+ let(:update_time) do
690
+ Timecop.freeze(Time.at(Time.now.to_i) + 2)
691
+ end
692
+
693
+ after do
694
+ Timecop.return
695
+ end
696
+
697
+ let(:building) do
698
+ parent_cls.create!
699
+ end
700
+
701
+ let(:entrance) do
702
+ building.entrances.create!
703
+ end
704
+
705
+ before do
706
+ entrance
707
+ update_time
708
+ entrance.touch
709
+ end
710
+
711
+ it "updates the child's timestamp" do
712
+ entrance.updated_at.should == update_time
713
+ entrance.reload.updated_at.should == update_time
714
+ end
715
+
716
+ it "does not update the parent's timestamp" do
717
+ building.updated_at.should == start_time
718
+ building.reload.updated_at.should == start_time
719
+ end
720
+ end
721
+
722
+ [ :save!, :destroy, :touch].each do |meth|
723
+ context "with #{meth} on belongs_to" do
724
+ let(:meth) { meth }
725
+ let(:parent_cls) { TouchableSpec::Referenced::Building }
726
+
727
+ include_examples "does not update the parent"
728
+ end
729
+
730
+ context "with #{meth} on embedded_in" do
731
+ let(:meth) { meth }
732
+ let(:parent_cls) { TouchableSpec::Embedded::Building }
733
+
734
+ before do
735
+ skip "MONGOID-5274"
736
+ end
737
+
738
+ include_examples "does not update the parent"
739
+ end
740
+ end
741
+ end
742
+ end
743
+
744
+ describe "when saving a document" do
745
+
746
+ let!(:start_time) { Timecop.freeze(Time.at(Time.now.to_i)) }
747
+
748
+ let(:update_time) do
749
+ Timecop.freeze(Time.at(Time.now.to_i) + 2)
750
+ end
751
+
752
+ after do
753
+ Timecop.return
754
+ end
755
+
756
+ context "when only using the root document" do
757
+
758
+ shared_examples "timeless is cleared" do
759
+ it "clears the timeless option" do
760
+ expect(doc.timeless?).to be false
761
+ end
762
+ end
763
+
764
+ shared_examples "touches the document" do
765
+ it "touches the document" do
766
+ expect(doc.created_at).to eq(start_time)
767
+ expect(doc.updated_at).to eq(start_time)
768
+ end
769
+ end
770
+
771
+ shared_examples "updates the document" do
772
+ it "updates the document" do
773
+ expect(doc.created_at).to eq(start_time)
774
+ expect(doc.updated_at).to eq(update_time)
775
+ end
776
+ end
777
+
778
+ let(:doc) { Dokument.new }
779
+
780
+ context "when saving a new document" do
781
+
782
+ context "when not passing a touch option" do
783
+
784
+ before do
785
+ doc.save!
786
+ end
787
+
788
+ include_examples "touches the document"
789
+ include_examples "timeless is cleared"
790
+ end
791
+
792
+ context "when passing touch: true" do
793
+
794
+ before do
795
+ doc.save!(touch: true)
796
+ end
797
+
798
+ include_examples "touches the document"
799
+ include_examples "timeless is cleared"
800
+ end
801
+
802
+ context "when passing touch: false" do
803
+
804
+ before do
805
+ doc.save!(touch: false)
806
+ end
807
+
808
+ include_examples "touches the document"
809
+ include_examples "timeless is cleared"
810
+ end
811
+ end
812
+
813
+ context "when updating a document" do
814
+ before do
815
+ doc.save!
816
+ doc.title = "title"
817
+ update_time
818
+ end
819
+
820
+ context "when not passing a touch option" do
821
+
822
+ before do
823
+ doc.save!
824
+ end
825
+
826
+ include_examples "updates the document"
827
+ include_examples "timeless is cleared"
828
+ end
829
+
830
+ context "when passing touch: true" do
831
+
832
+ before do
833
+ doc.save!(touch: true)
834
+ end
835
+
836
+ include_examples "updates the document"
837
+ include_examples "timeless is cleared"
838
+ end
839
+
840
+ context "when passing touch: false" do
841
+
842
+ before do
843
+ doc.save!(touch: false)
844
+ end
845
+
846
+ include_examples "touches the document"
847
+ include_examples "timeless is cleared"
848
+ end
849
+ end
850
+ end
851
+
852
+ context "when saving embedded associations with cascadable callbacks" do
853
+
854
+ shared_examples "timeless is cleared" do
855
+ it "clears the timeless option" do
856
+ expect(book.timeless?).to be false
857
+ expect(book.covers.first.timeless?).to be false
858
+ end
859
+ end
860
+
861
+ shared_examples "touches the document" do
862
+ it "touches the document" do
863
+ expect(book.created_at).to eq(start_time)
864
+ expect(book.updated_at).to eq(start_time)
865
+ end
866
+ end
867
+
868
+ shared_examples "updates the document" do
869
+ it "updates the document" do
870
+ expect(book.created_at).to eq(start_time)
871
+ expect(book.updated_at).to eq(update_time)
872
+ end
873
+ end
874
+
875
+ shared_examples "touches the children" do
876
+ it "touches the children" do
877
+ expect(book.covers.first.created_at).to eq(start_time)
878
+ expect(book.covers.first.updated_at).to eq(start_time)
879
+ end
880
+ end
881
+
882
+ shared_examples "updates the children" do
883
+ it "updates the children" do
884
+ expect(book.covers.first.created_at).to eq(start_time)
885
+ expect(book.covers.first.updated_at).to eq(update_time)
886
+ end
887
+ end
888
+
889
+ let(:book) do
890
+ Book.new(covers: [ cover ])
891
+ end
892
+
893
+ let(:cover) do
894
+ Cover.new
895
+ end
896
+
897
+ context "when saving a new document" do
898
+
899
+ context "when not passing a touch option" do
900
+
901
+ before do
902
+ book.save!
903
+ end
904
+
905
+ include_examples "touches the document"
906
+ include_examples "touches the children"
907
+ include_examples "timeless is cleared"
908
+ end
909
+
910
+ context "when passing touch: true" do
911
+
912
+ before do
913
+ book.save!(touch: true)
914
+ end
915
+
916
+ include_examples "touches the document"
917
+ include_examples "touches the children"
918
+ include_examples "timeless is cleared"
919
+ end
920
+
921
+ context "when passing touch: false" do
922
+
923
+ before do
924
+ book.save!(touch: false)
925
+ end
926
+
927
+ include_examples "touches the document"
928
+ include_examples "touches the children"
929
+ include_examples "timeless is cleared"
930
+ end
931
+ end
932
+
933
+ context "when updating a document" do
934
+ before do
935
+ book.save!
936
+ book.title = "title"
937
+ book.covers.first.title = "title"
938
+ update_time
939
+ end
940
+
941
+ context "when not passing a touch option" do
942
+
943
+ before do
944
+ book.save!
945
+ end
946
+
947
+ include_examples "updates the document"
948
+ include_examples "updates the children"
949
+ include_examples "timeless is cleared"
950
+ end
951
+
952
+ context "when passing touch: true" do
953
+
954
+ before do
955
+ book.save!(touch: true)
956
+ end
957
+
958
+ include_examples "updates the document"
959
+ include_examples "updates the children"
960
+ include_examples "timeless is cleared"
961
+ end
962
+
963
+ context "when passing touch: false" do
964
+
965
+ before do
966
+ book.save!(touch: false)
967
+ end
968
+
969
+ include_examples "touches the document"
970
+ include_examples "touches the children"
971
+ include_examples "timeless is cleared"
972
+ end
973
+ end
974
+ end
587
975
  end
588
976
  end
@@ -6,15 +6,17 @@ module TouchableSpec
6
6
  include Mongoid::Document
7
7
  include Mongoid::Timestamps
8
8
 
9
- embeds_many :entrances
10
- embeds_many :floors
9
+ field :title, type: String
10
+
11
+ embeds_many :entrances, class_name: "TouchableSpec::Embedded::Entrance"
12
+ embeds_many :floors, class_name: "TouchableSpec::Embedded::Floor"
11
13
  end
12
14
 
13
15
  class Entrance
14
16
  include Mongoid::Document
15
17
  include Mongoid::Timestamps
16
18
 
17
- embedded_in :building
19
+ embedded_in :building, touch: false, class_name: "TouchableSpec::Embedded::Building"
18
20
 
19
21
  field :last_used_at, type: Time
20
22
  end
@@ -23,7 +25,9 @@ module TouchableSpec
23
25
  include Mongoid::Document
24
26
  include Mongoid::Timestamps
25
27
 
26
- embedded_in :building, touch: true
28
+ field :level, type: Integer
29
+
30
+ embedded_in :building, touch: true, class_name: "TouchableSpec::Embedded::Building"
27
31
  end
28
32
  end
29
33
 
@@ -32,22 +36,24 @@ module TouchableSpec
32
36
  include Mongoid::Document
33
37
  include Mongoid::Timestamps
34
38
 
35
- has_many :entrances, inverse_of: :building
36
- has_many :floors, inverse_of: :building
39
+ has_many :entrances, inverse_of: :building, class_name: "TouchableSpec::Referenced::Entrance"
40
+ has_many :floors, inverse_of: :building, class_name: "TouchableSpec::Referenced::Floor"
37
41
  end
38
42
 
39
43
  class Entrance
40
44
  include Mongoid::Document
41
45
  include Mongoid::Timestamps
42
46
 
43
- belongs_to :building
47
+ belongs_to :building, touch: false, class_name: "TouchableSpec::Referenced::Building"
44
48
  end
45
49
 
46
50
  class Floor
47
51
  include Mongoid::Document
48
52
  include Mongoid::Timestamps
49
53
 
50
- belongs_to :building, touch: true
54
+ field :level, type: Integer
55
+
56
+ belongs_to :building, touch: true, class_name: "TouchableSpec::Referenced::Building"
51
57
  end
52
58
  end
53
59
  end
@@ -336,13 +336,7 @@ describe Mongoid::Traversable do
336
336
  end
337
337
 
338
338
  context "when the discriminator key is changed at the global level" do
339
- before do
340
- Mongoid.discriminator_key = "hello"
341
- end
342
-
343
- after do
344
- Mongoid.discriminator_key = "_type"
345
- end
339
+ config_override :discriminator_key, 'hello'
346
340
 
347
341
  it "sets the correct value globally" do
348
342
  expect(Mongoid.discriminator_key).to eq("hello")
@@ -537,9 +531,9 @@ describe Mongoid::Traversable do
537
531
  end
538
532
 
539
533
  context "before class creation" do
540
- before do
541
- Mongoid.discriminator_key = "test"
534
+ config_override :discriminator_key, "test"
542
535
 
536
+ before do
543
537
  class PreGlobalDiscriminatorParent
544
538
  include Mongoid::Document
545
539
  end
@@ -548,10 +542,6 @@ describe Mongoid::Traversable do
548
542
  end
549
543
  end
550
544
 
551
- after do
552
- Mongoid.discriminator_key = "_type"
553
- end
554
-
555
545
  it "creates a field with new discriminator key in the parent" do
556
546
  expect(PreGlobalDiscriminatorParent.fields.keys).to include("test")
557
547
  end
@@ -683,9 +673,9 @@ describe Mongoid::Traversable do
683
673
  end
684
674
 
685
675
  context "before class creation" do
686
- before do
687
- Mongoid.discriminator_key = :test
676
+ config_override :discriminator_key, :test
688
677
 
678
+ before do
689
679
  class PreGlobalSymDiscriminatorParent
690
680
  include Mongoid::Document
691
681
  end
@@ -694,10 +684,6 @@ describe Mongoid::Traversable do
694
684
  end
695
685
  end
696
686
 
697
- after do
698
- Mongoid.discriminator_key = "_type"
699
- end
700
-
701
687
  it "creates a field with new discriminator key as a string in the parent" do
702
688
  expect(PreGlobalSymDiscriminatorParent.fields.keys).to include("test")
703
689
  end
@@ -835,8 +821,9 @@ describe Mongoid::Traversable do
835
821
  end
836
822
 
837
823
  context "when setting a field equal to discriminator key and duplicate_fields_exception is true" do
824
+ config_override :duplicate_fields_exception, true
825
+
838
826
  before do
839
- Mongoid.duplicate_fields_exception = true
840
827
 
841
828
  class DuplicateDiscriminatorKeyParent
842
829
  include Mongoid::Document
@@ -847,10 +834,6 @@ describe Mongoid::Traversable do
847
834
  end
848
835
  end
849
836
 
850
- after do
851
- Mongoid.duplicate_fields_exception = false
852
- end
853
-
854
837
  it "does not raise an error" do
855
838
  expect do
856
839
  DuplicateDiscriminatorKeyParent.discriminator_key = "dkey"
@@ -877,9 +860,10 @@ describe Mongoid::Traversable do
877
860
  end
878
861
 
879
862
  context "when setting a field equal to global discriminator key and duplicate_fields_exception is true" do
863
+ config_override :duplicate_fields_exception, true
864
+ config_override :discriminator_key, "dkey"
865
+
880
866
  before do
881
- Mongoid.duplicate_fields_exception = true
882
- Mongoid.discriminator_key = "dkey"
883
867
 
884
868
  class GlobalDuplicateDiscriminatorKeyParent
885
869
  include Mongoid::Document
@@ -889,11 +873,6 @@ describe Mongoid::Traversable do
889
873
  end
890
874
  end
891
875
 
892
- after do
893
- Mongoid.duplicate_fields_exception = false
894
- Mongoid.discriminator_key = "_type"
895
- end
896
-
897
876
  it "raises an error" do
898
877
  expect do
899
878
  GlobalDuplicateDiscriminatorKeyParent.class_eval do
@@ -904,10 +883,9 @@ describe Mongoid::Traversable do
904
883
  end
905
884
 
906
885
  context "when the global discriminator key conflicts with mongoid's internals" do
907
-
908
- after do
909
- Mongoid.discriminator_key = "_type"
910
- end
886
+ # This is not an override, it is meant to restore the original value
887
+ # after the test only.
888
+ config_override :discriminator_key, '_type'
911
889
 
912
890
  [:_association, :invalid].each do |meth|
913
891
  context "when the field is named #{meth}" do