mongoid 7.5.4 → 8.1.9

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 (446) 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 +32 -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 +11 -6
  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 +48 -39
  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 +135 -36
  121. data/lib/mongoid/equality.rb +9 -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 +187 -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 +9 -2
  203. data/lib/mongoid/timestamps/updated.rb +2 -2
  204. data/lib/mongoid/touchable.rb +3 -4
  205. data/lib/mongoid/traversable.rb +41 -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 +26 -3
  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/association_spec.rb +60 -0
  269. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  270. data/spec/mongoid/attributes/nested_spec.rb +80 -11
  271. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  272. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  273. data/spec/mongoid/attributes/readonly_spec.rb +19 -0
  274. data/spec/mongoid/attributes_spec.rb +526 -33
  275. data/spec/mongoid/changeable_spec.rb +429 -37
  276. data/spec/mongoid/clients/factory_spec.rb +23 -30
  277. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  278. data/spec/mongoid/clients_spec.rb +149 -15
  279. data/spec/mongoid/collection_configurable_spec.rb +158 -0
  280. data/spec/mongoid/config/defaults_spec.rb +160 -0
  281. data/spec/mongoid/config_spec.rb +214 -31
  282. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  283. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  284. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  285. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  286. data/spec/mongoid/contextual/memory_spec.rb +850 -88
  287. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
  288. data/spec/mongoid/contextual/mongo_spec.rb +2256 -1005
  289. data/spec/mongoid/contextual/none_spec.rb +60 -21
  290. data/spec/mongoid/copyable_spec.rb +453 -11
  291. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  292. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  293. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  294. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  295. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  296. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  297. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  298. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  299. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  300. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  301. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +4 -69
  302. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
  303. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  304. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  305. data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -484
  306. data/spec/mongoid/criteria/queryable/options_spec.rb +1 -1
  307. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +469 -0
  308. data/spec/mongoid/criteria/queryable/selectable_spec.rb +107 -86
  309. data/spec/mongoid/criteria/queryable/selector_spec.rb +15 -3
  310. data/spec/mongoid/criteria/translator_spec.rb +132 -0
  311. data/spec/mongoid/criteria_projection_spec.rb +1 -5
  312. data/spec/mongoid/criteria_spec.rb +469 -1205
  313. data/spec/mongoid/document_fields_spec.rb +173 -24
  314. data/spec/mongoid/document_spec.rb +59 -41
  315. data/spec/mongoid/equality_spec.rb +6 -0
  316. data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
  317. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  318. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  319. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  320. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  321. data/spec/mongoid/errors/readonly_document_spec.rb +2 -2
  322. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  323. data/spec/mongoid/extensions/array_spec.rb +16 -2
  324. data/spec/mongoid/extensions/big_decimal_spec.rb +712 -212
  325. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  326. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  327. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  328. data/spec/mongoid/extensions/date_spec.rb +71 -1
  329. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  330. data/spec/mongoid/extensions/float_spec.rb +53 -74
  331. data/spec/mongoid/extensions/hash_spec.rb +33 -3
  332. data/spec/mongoid/extensions/integer_spec.rb +50 -64
  333. data/spec/mongoid/extensions/range_spec.rb +255 -54
  334. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  335. data/spec/mongoid/extensions/set_spec.rb +106 -0
  336. data/spec/mongoid/extensions/string_spec.rb +53 -25
  337. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  338. data/spec/mongoid/extensions/time_spec.rb +639 -106
  339. data/spec/mongoid/extensions/time_with_zone_spec.rb +24 -83
  340. data/spec/mongoid/factory_spec.rb +61 -1
  341. data/spec/mongoid/fields/localized_spec.rb +80 -37
  342. data/spec/mongoid/fields_spec.rb +503 -87
  343. data/spec/mongoid/findable_spec.rb +450 -58
  344. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  345. data/spec/mongoid/indexable_spec.rb +55 -30
  346. data/spec/mongoid/interceptable_spec.rb +904 -22
  347. data/spec/mongoid/interceptable_spec_models.rb +189 -22
  348. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  349. data/spec/mongoid/mongoizable_spec.rb +285 -0
  350. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  351. data/spec/mongoid/persistable/deletable_spec.rb +28 -8
  352. data/spec/mongoid/persistable/destroyable_spec.rb +28 -8
  353. data/spec/mongoid/persistable/incrementable_spec.rb +37 -0
  354. data/spec/mongoid/persistable/logical_spec.rb +37 -0
  355. data/spec/mongoid/persistable/poppable_spec.rb +36 -0
  356. data/spec/mongoid/persistable/pullable_spec.rb +72 -0
  357. data/spec/mongoid/persistable/pushable_spec.rb +72 -0
  358. data/spec/mongoid/persistable/renamable_spec.rb +36 -0
  359. data/spec/mongoid/persistable/savable_spec.rb +96 -0
  360. data/spec/mongoid/persistable/settable_spec.rb +37 -0
  361. data/spec/mongoid/persistable/unsettable_spec.rb +36 -0
  362. data/spec/mongoid/persistable/updatable_spec.rb +20 -28
  363. data/spec/mongoid/persistable/upsertable_spec.rb +89 -1
  364. data/spec/mongoid/persistence_context_spec.rb +31 -57
  365. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  366. data/spec/mongoid/query_cache_spec.rb +56 -215
  367. data/spec/mongoid/reloadable_spec.rb +83 -6
  368. data/spec/mongoid/scopable_spec.rb +91 -1
  369. data/spec/mongoid/serializable_spec.rb +25 -39
  370. data/spec/mongoid/shardable_spec.rb +4 -4
  371. data/spec/mongoid/stateful_spec.rb +150 -8
  372. data/spec/mongoid/tasks/database_rake_spec.rb +74 -0
  373. data/spec/mongoid/tasks/database_spec.rb +127 -0
  374. data/spec/mongoid/timestamps/created_spec.rb +23 -0
  375. data/spec/mongoid/timestamps_spec.rb +392 -4
  376. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  377. data/spec/mongoid/touchable_spec.rb +390 -2
  378. data/spec/mongoid/touchable_spec_models.rb +14 -8
  379. data/spec/mongoid/traversable_spec.rb +13 -35
  380. data/spec/mongoid/validatable/associated_spec.rb +27 -34
  381. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  382. data/spec/mongoid/validatable/uniqueness_spec.rb +58 -31
  383. data/spec/mongoid/warnings_spec.rb +35 -0
  384. data/spec/mongoid_spec.rb +34 -16
  385. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  386. data/spec/rails/mongoid_spec.rb +4 -16
  387. data/spec/spec_helper.rb +5 -0
  388. data/spec/support/constraints.rb +24 -0
  389. data/spec/support/immutable_ids.rb +118 -0
  390. data/spec/support/macros.rb +78 -0
  391. data/spec/support/models/artist.rb +0 -1
  392. data/spec/support/models/augmentation.rb +12 -0
  393. data/spec/support/models/band.rb +5 -0
  394. data/spec/support/models/book.rb +1 -0
  395. data/spec/support/models/building.rb +2 -0
  396. data/spec/support/models/catalog.rb +24 -0
  397. data/spec/support/models/circus.rb +3 -0
  398. data/spec/support/models/cover.rb +10 -0
  399. data/spec/support/models/fanatic.rb +8 -0
  400. data/spec/support/models/implant.rb +9 -0
  401. data/spec/support/models/label.rb +2 -0
  402. data/spec/support/models/lat_lng.rb +6 -0
  403. data/spec/support/models/name.rb +10 -0
  404. data/spec/support/models/passport.rb +9 -0
  405. data/spec/support/models/person.rb +2 -0
  406. data/spec/support/models/player.rb +2 -0
  407. data/spec/support/models/powerup.rb +12 -0
  408. data/spec/support/models/product.rb +1 -0
  409. data/spec/support/models/purse.rb +9 -0
  410. data/spec/support/models/registry.rb +1 -0
  411. data/spec/support/models/school.rb +14 -0
  412. data/spec/support/models/shield.rb +18 -0
  413. data/spec/support/models/student.rb +14 -0
  414. data/spec/support/models/weapon.rb +12 -0
  415. metadata +98 -96
  416. checksums.yaml.gz.sig +0 -0
  417. data/lib/mongoid/errors/eager_load.rb +0 -23
  418. data/lib/mongoid/errors/invalid_value.rb +0 -17
  419. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -60
  420. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -60
  421. data/spec/mongoid/errors/eager_load_spec.rb +0 -31
  422. data/spec/shared/LICENSE +0 -20
  423. data/spec/shared/bin/get-mongodb-download-url +0 -17
  424. data/spec/shared/bin/s3-copy +0 -45
  425. data/spec/shared/bin/s3-upload +0 -69
  426. data/spec/shared/lib/mrss/child_process_helper.rb +0 -80
  427. data/spec/shared/lib/mrss/cluster_config.rb +0 -231
  428. data/spec/shared/lib/mrss/constraints.rb +0 -378
  429. data/spec/shared/lib/mrss/docker_runner.rb +0 -291
  430. data/spec/shared/lib/mrss/eg_config_utils.rb +0 -51
  431. data/spec/shared/lib/mrss/event_subscriber.rb +0 -210
  432. data/spec/shared/lib/mrss/lite_constraints.rb +0 -238
  433. data/spec/shared/lib/mrss/server_version_registry.rb +0 -120
  434. data/spec/shared/lib/mrss/session_registry.rb +0 -69
  435. data/spec/shared/lib/mrss/session_registry_legacy.rb +0 -60
  436. data/spec/shared/lib/mrss/spec_organizer.rb +0 -179
  437. data/spec/shared/lib/mrss/utils.rb +0 -15
  438. data/spec/shared/share/Dockerfile.erb +0 -325
  439. data/spec/shared/share/haproxy-1.conf +0 -16
  440. data/spec/shared/share/haproxy-2.conf +0 -17
  441. data/spec/shared/shlib/config.sh +0 -27
  442. data/spec/shared/shlib/distro.sh +0 -74
  443. data/spec/shared/shlib/server.sh +0 -392
  444. data/spec/shared/shlib/set_env.sh +0 -169
  445. data.tar.gz.sig +0 -0
  446. metadata.gz.sig +0 -3
@@ -3,30 +3,15 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  describe 'i18n fallbacks' do
6
- # These tests modify the environment
7
- before(:all) do
8
- unless %w(yes true 1).include?((ENV['TEST_I18N_FALLBACKS'] || '').downcase)
9
- skip 'Set TEST_I18N_FALLBACKS=1 environment variable to run these tests'
10
- end
11
- end
12
-
13
- before(:all) do
14
- puts "I18n version: #{I18n::VERSION}"
15
-
16
- require "i18n/backend/fallbacks"
17
- I18n::Backend::Simple.send(:include, I18n::Backend::Fallbacks)
18
- end
6
+ require_fallbacks
19
7
 
20
8
  context 'when fallbacks are enabled with a locale list' do
9
+ with_default_i18n_configs
10
+
21
11
  before do
22
- I18n.default_locale = :en
23
12
  I18n.fallbacks[:de] = [ :en ]
24
13
  end
25
14
 
26
- after do
27
- I18n.locale = :en
28
- end
29
-
30
15
  context 'when translation is present in active locale' do
31
16
  it 'uses active locale' do
32
17
  product = Product.new
@@ -40,10 +25,6 @@ describe 'i18n fallbacks' do
40
25
  end
41
26
 
42
27
  context 'when translation is missing in active locale and present in fallback locale' do
43
- after do
44
- I18n.locale = :en
45
- end
46
-
47
28
  it 'falls back on default locale' do
48
29
  product = Product.new
49
30
  I18n.locale = :en
@@ -51,7 +32,6 @@ describe 'i18n fallbacks' do
51
32
  I18n.locale = :de
52
33
  product.description.should == 'Marvelous!'
53
34
  end
54
-
55
35
  end
56
36
 
57
37
  context 'when translation is missing in all locales' do
@@ -64,10 +44,6 @@ describe 'i18n fallbacks' do
64
44
  end
65
45
  end
66
46
 
67
- after do
68
- I18n.locale = :en
69
- end
70
-
71
47
  it 'returns nil' do
72
48
  product = Product.new
73
49
  I18n.locale = :en
@@ -75,7 +51,6 @@ describe 'i18n fallbacks' do
75
51
  I18n.locale = :ru
76
52
  product.description.should be nil
77
53
  end
78
-
79
54
  end
80
55
 
81
56
  context 'i18n 1.0' do
@@ -86,10 +61,6 @@ describe 'i18n fallbacks' do
86
61
  end
87
62
  end
88
63
 
89
- after do
90
- I18n.locale = :en
91
- end
92
-
93
64
  it 'falls back on default locale' do
94
65
  product = Product.new
95
66
  I18n.locale = :en
@@ -652,10 +652,12 @@ describe 'Matcher' do
652
652
 
653
653
  describe 'range match on array element' do
654
654
 
655
+ let(:record) do
656
+ Record.new(producers: [123, 456])
657
+ end
658
+
655
659
  let!(:band) do
656
- Band.create!(records: [
657
- Record.new(producers: [123, 456]),
658
- ])
660
+ Band.create!(records: [ record ])
659
661
  end
660
662
 
661
663
  describe 'MongoDB query' do
@@ -667,14 +669,13 @@ describe 'Matcher' do
667
669
  expect(found_band).to eq(band)
668
670
  end
669
671
 
670
- # https://jira.mongodb.org/browse/MONGOID-4911
671
672
  context 'no match' do
672
673
 
673
- let!(:band) do
674
- Band.create!(records: [
675
- Record.new(producers: [50]),
676
- ])
677
- end
674
+ let!(:band) do
675
+ Band.create!(records: [
676
+ Record.new(producers: [50, 250]),
677
+ ])
678
+ end
678
679
 
679
680
  it 'does not find' do
680
681
  expect(found_band).to be nil
@@ -687,10 +688,16 @@ describe 'Matcher' do
687
688
  band.records.where(producers: 100..200).first
688
689
  end
689
690
 
690
- it 'raises InvalidQuery' do
691
- lambda do
692
- found_record
693
- end.should raise_error(Mongoid::Errors::InvalidQuery)
691
+ let(:no_record) do
692
+ band.records.where(producers: 199..200).first
693
+ end
694
+
695
+ it 'finds correctly' do
696
+ expect(found_record).to eq(record)
697
+ end
698
+
699
+ it "correctly does not find" do
700
+ expect(no_record).to eq(nil)
694
701
  end
695
702
  end
696
703
  end
@@ -29,12 +29,13 @@
29
29
  matches: false
30
30
  min_server_version: 3.4
31
31
 
32
- - name: BigDecimal field - does not match
32
+ # Requires :map_big_decimal_to_decimal128 option to be true.
33
+ - name: BigDecimal field - matches
33
34
  document:
34
35
  big_decimal_field: !ruby/object:BigDecimal
35
36
  18:0.42e2
36
37
  query:
37
38
  big_decimal_field:
38
39
  $type: 19
39
- matches: false
40
+ matches: true
40
41
  min_server_version: 3.4
@@ -12,6 +12,8 @@ def mop_error?(spec, kind)
12
12
  end
13
13
 
14
14
  describe 'Matcher operators' do
15
+ config_override :map_big_decimal_to_decimal128, true
16
+
15
17
  Dir[File.join(File.dirname(__FILE__), 'matcher_operator_data', '*.yml')].sort.each do |path|
16
18
  context File.basename(path) do
17
19
  permitted_classes = [ BigDecimal,
@@ -35,11 +37,7 @@ describe 'Matcher operators' do
35
37
  BSON::Timestamp,
36
38
  BSON::Undefined ]
37
39
 
38
- specs = if RUBY_VERSION.start_with?("2.5")
39
- YAML.safe_load(File.read(path), permitted_classes, [], true)
40
- else
41
- YAML.safe_load(File.read(path), permitted_classes: permitted_classes, aliases: true)
42
- end
40
+ specs = YAML.safe_load(File.read(path), permitted_classes: permitted_classes, aliases: true)
43
41
 
44
42
  specs.each do |spec|
45
43
  context spec['name'] do
@@ -0,0 +1,350 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe 'Range field persistence' do
6
+ let!(:person) { Person.create!(field => value).reload }
7
+ subject { person.send(field) }
8
+ let(:now_utc) { Time.now }
9
+ let(:later_utc) { now_utc + 10.minutes }
10
+ let(:now_in_zone) { now_utc.in_time_zone('Asia/Tokyo') }
11
+ let(:later_in_zone) { later_utc.in_time_zone('Asia/Tokyo') }
12
+
13
+ context 'static field' do
14
+ let(:field) { :range }
15
+
16
+ context 'when Integer' do
17
+ let(:value) { 1..3 }
18
+ it do
19
+ expect(subject).to eq(1..3)
20
+ end
21
+ end
22
+
23
+ context 'when Integer exclude_end' do
24
+ let(:value) { 1...3 }
25
+ it { expect(subject).to eq(1...3) }
26
+ end
27
+
28
+ context 'when endless' do
29
+ ruby_version_gte '2.6'
30
+ let(:value) { eval('3..') }
31
+ it { expect(subject).to eq(eval('3..')) }
32
+ end
33
+
34
+ context 'when endless exclude_end' do
35
+ ruby_version_gte '2.6'
36
+ let(:value) { eval('3...') }
37
+ it { expect(subject).to eq(eval('3...')) }
38
+ end
39
+
40
+ context 'when beginning-less' do
41
+ ruby_version_gte '2.7'
42
+ let(:value) { eval('..3') }
43
+ it { expect(subject).to eq(eval('..3')) }
44
+ end
45
+
46
+ context 'when beginning-less exclude_end' do
47
+ ruby_version_gte '2.7'
48
+ let(:value) { eval('...3') }
49
+ it { expect(subject).to eq(eval('...3')) }
50
+ end
51
+
52
+ context 'when Hash<String, Integer>' do
53
+ let(:value) { { 'min' => 1, 'max' => 3 } }
54
+ it { expect(subject).to eq(1..3) }
55
+ end
56
+
57
+ context 'when Hash<String, Integer> exclude_end' do
58
+ let(:value) { { 'min' => 1, 'max' => 3, 'exclude_end' => true } }
59
+ it { expect(subject).to eq(1...3) }
60
+ end
61
+
62
+ context 'when Hash<Symbol, Integer>' do
63
+ let(:value) { { min: 1, max: 3 } }
64
+ it { expect(subject).to eq(1..3) }
65
+ end
66
+
67
+ context 'when Hash<Symbol, Integer> exclude_end' do
68
+ let(:value) { { min: 1, max: 3, exclude_end: true } }
69
+ it { expect(subject).to eq(1...3) }
70
+ end
71
+
72
+ context 'when Time' do
73
+ let(:value) { now_utc..later_utc }
74
+
75
+ it do
76
+ expect(subject).to be_a Range
77
+ expect(subject.exclude_end?).to eq false
78
+ expect(subject.first).to be_within(0.01.second).of(now_utc)
79
+ expect(subject.last).to be_within(0.01.second).of(later_utc)
80
+ expect(subject.first.class).to eq Time
81
+ expect(subject.last.class).to eq Time
82
+ end
83
+ end
84
+
85
+ context 'when Time exclude_end' do
86
+ let(:value) { now_utc...later_utc }
87
+
88
+ it do
89
+ expect(subject).to be_a Range
90
+ expect(subject.exclude_end?).to eq true
91
+ expect(subject.first).to be_within(0.01.second).of(now_utc)
92
+ expect(subject.last).to be_within(0.01.second).of(later_utc)
93
+ expect(subject.first.class).to eq Time
94
+ expect(subject.last.class).to eq Time
95
+ end
96
+ end
97
+
98
+ context 'when Hash<String, Time>' do
99
+ let(:value) { { 'min' => now_utc, 'max' => later_utc } }
100
+
101
+ it do
102
+ expect(subject).to be_a Range
103
+ expect(subject.exclude_end?).to eq false
104
+ expect(subject.first).to be_within(0.01.second).of(now_utc)
105
+ expect(subject.last).to be_within(0.01.second).of(later_utc)
106
+ expect(subject.first.class).to eq Time
107
+ expect(subject.last.class).to eq Time
108
+ end
109
+ end
110
+
111
+ context 'when Hash<String, Time> exclude_end' do
112
+ let(:value) { { 'min' => now_utc, 'max' => later_utc, 'exclude_end' => true } }
113
+
114
+ it do
115
+ expect(subject).to be_a Range
116
+ expect(subject.exclude_end?).to eq true
117
+ expect(subject.first).to be_within(0.01.second).of(now_utc)
118
+ expect(subject.last).to be_within(0.01.second).of(later_utc)
119
+ expect(subject.first.class).to eq Time
120
+ expect(subject.last.class).to eq Time
121
+ end
122
+ end
123
+
124
+ context 'when ActiveSupport::TimeWithZone' do
125
+ let(:value) { now_in_zone..later_in_zone }
126
+
127
+ it do
128
+ expect(subject).to be_a Range
129
+ expect(subject.exclude_end?).to eq false
130
+ expect(subject.first).to be_within(0.01.second).of(now_utc)
131
+ expect(subject.last).to be_within(0.01.second).of(later_utc)
132
+ expect(subject.first.class).to eq Time
133
+ expect(subject.last.class).to eq Time
134
+ end
135
+ end
136
+
137
+ context 'when ActiveSupport::TimeWithZone exclude_end' do
138
+ let(:value) { now_in_zone...later_in_zone }
139
+
140
+ it do
141
+ expect(subject).to be_a Range
142
+ expect(subject.exclude_end?).to eq true
143
+ expect(subject.first).to be_within(0.01.second).of(now_utc)
144
+ expect(subject.last).to be_within(0.01.second).of(later_utc)
145
+ expect(subject.first.class).to eq Time
146
+ expect(subject.last.class).to eq Time
147
+ end
148
+ end
149
+
150
+ context 'when Hash<String, ActiveSupport::TimeWithZone>' do
151
+ let(:value) { { 'min' => now_in_zone, 'max' => later_in_zone } }
152
+
153
+ it do
154
+ expect(subject).to be_a Range
155
+ expect(subject.exclude_end?).to eq false
156
+ expect(subject.first).to be_within(0.01.second).of(now_utc)
157
+ expect(subject.last).to be_within(0.01.second).of(later_utc)
158
+ expect(subject.first.class).to eq Time
159
+ expect(subject.last.class).to eq Time
160
+ end
161
+ end
162
+
163
+ context 'when Hash<String, ActiveSupport::TimeWithZone> exclude_end' do
164
+ let(:value) { { 'min' => now_in_zone, 'max' => later_in_zone, 'exclude_end' => true } }
165
+
166
+ it do
167
+ expect(subject).to be_a Range
168
+ expect(subject.exclude_end?).to eq true
169
+ expect(subject.first).to be_within(0.01.second).of(now_utc)
170
+ expect(subject.last).to be_within(0.01.second).of(later_utc)
171
+ expect(subject.first.class).to eq Time
172
+ expect(subject.last.class).to eq Time
173
+ end
174
+ end
175
+ end
176
+
177
+ context 'dynamic field' do
178
+ let(:field) { :dynamic }
179
+
180
+ context 'when Integer' do
181
+ let(:value) { 1..3 }
182
+ it do
183
+ expect(subject).to eq('max' => 3, 'min' => 1)
184
+ end
185
+ end
186
+
187
+ context 'when Integer exclude_end' do
188
+ let(:value) { 1...3 }
189
+ it { expect(subject).to eq('max' => 3, 'min' => 1, 'exclude_end' => true) }
190
+ end
191
+
192
+ context 'when descending' do
193
+ let(:value) { 3..1 }
194
+ it { expect(subject).to eq('max' => 1, 'min' => 3) }
195
+ end
196
+
197
+ context 'when descending exclude_end' do
198
+ let(:value) { 3...1 }
199
+ it { expect(subject).to eq('max' => 1, 'min' => 3, 'exclude_end' => true) }
200
+ end
201
+
202
+ context 'when endless' do
203
+ ruby_version_gte '2.6'
204
+ let(:value) { eval('3..') }
205
+ it { expect(subject).to eq('min' => 3) }
206
+ end
207
+
208
+ context 'when endless exclude_end' do
209
+ ruby_version_gte '2.6'
210
+ let(:value) { eval('3...') }
211
+ it { expect(subject).to eq('min' => 3, 'exclude_end' => true) }
212
+ end
213
+
214
+ context 'when beginning-less' do
215
+ ruby_version_gte '2.7'
216
+ let(:value) { eval('..3') }
217
+ it { expect(subject).to eq('max' => 3) }
218
+ end
219
+
220
+ context 'when beginning-less exclude_end' do
221
+ ruby_version_gte '2.7'
222
+ let(:value) { eval('...3') }
223
+ it { expect(subject).to eq('max' => 3, 'exclude_end' => true) }
224
+ end
225
+
226
+ context 'when Hash<String, Integer>' do
227
+ let(:value) { { 'min' => 1, 'max' => 3 } }
228
+ it { expect(subject).to eq('max' => 3, 'min' => 1) }
229
+ end
230
+
231
+ context 'when Hash<String, Integer> exclude_end' do
232
+ let(:value) { { 'min' => 1, 'max' => 3, 'exclude_end' => true } }
233
+ it { expect(subject).to eq('max' => 3, 'min' => 1, 'exclude_end' => true) }
234
+ end
235
+
236
+ context 'when Hash<Symbol, Integer>' do
237
+ let(:value) { { min: 1, max: 3 } }
238
+ it { expect(subject).to eq('max' => 3, 'min' => 1) }
239
+ end
240
+
241
+ context 'when Hash<Symbol, Integer> exclude_end' do
242
+ let(:value) { { min: 1, max: 3, exclude_end: true } }
243
+ it { expect(subject).to eq('max' => 3, 'min' => 1, 'exclude_end' => true) }
244
+ end
245
+
246
+ context 'when Time' do
247
+ let(:value) { now_utc..later_utc }
248
+
249
+ it do
250
+ expect(subject).to be_a Hash
251
+ expect(subject['exclude_end']).to eq nil
252
+ expect(subject['min']).to be_within(0.01.second).of(now_utc)
253
+ expect(subject['max']).to be_within(0.01.second).of(later_utc)
254
+ expect(subject['min'].class).to eq Time
255
+ expect(subject['max'].class).to eq Time
256
+ end
257
+ end
258
+
259
+ context 'when Time exclude_end' do
260
+ let(:value) { now_utc...later_utc }
261
+
262
+ it do
263
+ expect(subject).to be_a Hash
264
+ expect(subject['exclude_end']).to eq true
265
+ expect(subject['min']).to be_within(0.01.second).of(now_utc)
266
+ expect(subject['max']).to be_within(0.01.second).of(later_utc)
267
+ expect(subject['min'].class).to eq Time
268
+ expect(subject['max'].class).to eq Time
269
+ end
270
+ end
271
+
272
+ context 'when Hash<String, Time>' do
273
+ let(:value) { { 'min' => now_utc, 'max' => later_utc } }
274
+
275
+ it do
276
+ expect(subject).to be_a Hash
277
+ expect(subject['exclude_end']).to eq nil
278
+ expect(subject['min']).to be_within(0.01.second).of(now_utc)
279
+ expect(subject['max']).to be_within(0.01.second).of(later_utc)
280
+ expect(subject['min'].class).to eq Time
281
+ expect(subject['max'].class).to eq Time
282
+ end
283
+ end
284
+
285
+ context 'when Hash<String, Time> exclude_end' do
286
+ let(:value) { { 'min' => now_utc, 'max' => later_utc, 'exclude_end' => true } }
287
+
288
+ it do
289
+ expect(subject).to be_a Hash
290
+ expect(subject['exclude_end']).to eq true
291
+ expect(subject['min']).to be_within(0.01.second).of(now_utc)
292
+ expect(subject['max']).to be_within(0.01.second).of(later_utc)
293
+ expect(subject['min'].class).to eq Time
294
+ expect(subject['max'].class).to eq Time
295
+ end
296
+ end
297
+
298
+ context 'when ActiveSupport::TimeWithZone' do
299
+ let(:value) { now_in_zone..later_in_zone }
300
+
301
+ it do
302
+ expect(subject).to be_a Hash
303
+ expect(subject['exclude_end']).to eq nil
304
+ expect(subject['min']).to be_within(0.01.second).of(now_utc)
305
+ expect(subject['max']).to be_within(0.01.second).of(later_utc)
306
+ expect(subject['min'].class).to eq Time
307
+ expect(subject['max'].class).to eq Time
308
+ end
309
+ end
310
+
311
+ context 'when ActiveSupport::TimeWithZone exclude_end' do
312
+ let(:value) { now_in_zone...later_in_zone }
313
+
314
+ it do
315
+ expect(subject).to be_a Hash
316
+ expect(subject['exclude_end']).to eq true
317
+ expect(subject['min']).to be_within(0.01.second).of(now_utc)
318
+ expect(subject['max']).to be_within(0.01.second).of(later_utc)
319
+ expect(subject['min'].class).to eq Time
320
+ expect(subject['max'].class).to eq Time
321
+ end
322
+ end
323
+
324
+ context 'when Hash<String, ActiveSupport::TimeWithZone>' do
325
+ let(:value) { { 'min' => now_in_zone, 'max' => later_in_zone } }
326
+
327
+ it do
328
+ expect(subject).to be_a Hash
329
+ expect(subject['exclude_end']).to eq nil
330
+ expect(subject['min']).to be_within(0.01.second).of(now_utc)
331
+ expect(subject['max']).to be_within(0.01.second).of(later_utc)
332
+ expect(subject['min'].class).to eq Time
333
+ expect(subject['max'].class).to eq Time
334
+ end
335
+ end
336
+
337
+ context 'when Hash<String, ActiveSupport::TimeWithZone> exclude_end' do
338
+ let(:value) { { 'min' => now_in_zone, 'max' => later_in_zone, 'exclude_end' => true } }
339
+
340
+ it do
341
+ expect(subject).to be_a Hash
342
+ expect(subject['exclude_end']).to eq true
343
+ expect(subject['min']).to be_within(0.01.second).of(now_utc)
344
+ expect(subject['max']).to be_within(0.01.second).of(later_utc)
345
+ expect(subject['min'].class).to eq Time
346
+ expect(subject['max'].class).to eq Time
347
+ end
348
+ end
349
+ end
350
+ end
@@ -133,7 +133,7 @@ describe Mongoid::Association::Referenced::CounterCache do
133
133
  it "expect to raise an error" do
134
134
  expect {
135
135
  Person.reset_counters "1", :drugs
136
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
136
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Person with id\(s\)/)
137
137
  end
138
138
  end
139
139
 
@@ -73,7 +73,7 @@ describe Mongoid::Association::Depending do
73
73
  r = DependentReportCard.create!(dependent_student: s)
74
74
  s.destroy!
75
75
 
76
- expect { DependentReportCard.find(r.id) }.to raise_error(Mongoid::Errors::DocumentNotFound)
76
+ expect { DependentReportCard.find(r.id) }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class DependentReportCard with id\(s\)/)
77
77
  end
78
78
 
79
79
  it 'facilitates proper transitive destroying of the object' do
@@ -84,7 +84,7 @@ describe Mongoid::Association::Depending do
84
84
  r = DependentReportCard.create!(dependent_student: s)
85
85
  s.destroy!
86
86
 
87
- expect { DependentReportCard.find(r.id) }.to raise_error(Mongoid::Errors::DocumentNotFound)
87
+ expect { DependentReportCard.find(r.id) }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class DependentReportCard with id\(s\)/)
88
88
  end
89
89
 
90
90
  it 'adds the dependent to subclasses' do
@@ -105,7 +105,7 @@ describe Mongoid::Association::Depending do
105
105
  r = DependentReportCard.create!(dependent_student: s)
106
106
  s.destroy!
107
107
 
108
- expect { DependentReportCard.find(r.id) }.to raise_error(Mongoid::Errors::DocumentNotFound)
108
+ expect { DependentReportCard.find(r.id) }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class DependentReportCard with id\(s\)/)
109
109
  end
110
110
 
111
111
  it "doesn't add the dependent to sibling classes" do
@@ -177,7 +177,7 @@ describe Mongoid::Association::Depending do
177
177
 
178
178
  expect {
179
179
  DependentOwnedOne.find(owned.id)
180
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
180
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class DependentOwnedOne with id\(s\)/)
181
181
  end
182
182
  end
183
183
 
@@ -250,7 +250,7 @@ describe Mongoid::Association::Depending do
250
250
  dep = Dep.create!(double_assoc: two)
251
251
  two.destroy!
252
252
 
253
- expect { Dep.find(dep.id) }.to raise_error(Mongoid::Errors::DocumentNotFound)
253
+ expect { Dep.find(dep.id) }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Dep with id\(s\)/)
254
254
  end
255
255
  end
256
256
  end
@@ -362,7 +362,7 @@ describe Mongoid::Association::Depending do
362
362
  it "deletes the associated documents" do
363
363
  expect {
364
364
  child.class.find(child.id)
365
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
365
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class #{child.class.to_s} with id\(s\)/)
366
366
  end
367
367
  end
368
368
 
@@ -674,7 +674,7 @@ describe Mongoid::Association::Depending do
674
674
  it "persists the deletion" do
675
675
  expect {
676
676
  home.reload
677
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
677
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Home with id\(s\)/)
678
678
  end
679
679
  end
680
680
 
@@ -733,13 +733,13 @@ describe Mongoid::Association::Depending do
733
733
  it "persists the first deletion" do
734
734
  expect {
735
735
  post_one.reload
736
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
736
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Post with id\(s\)/)
737
737
  end
738
738
 
739
739
  it "persists the second deletion" do
740
740
  expect {
741
741
  post_two.reload
742
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
742
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Post with id\(s\)/)
743
743
  end
744
744
  end
745
745
  end
@@ -14,14 +14,36 @@ describe Mongoid::Association::EagerLoadable do
14
14
  Mongoid::Contextual::Mongo.new(criteria)
15
15
  end
16
16
 
17
+ let(:association_host) { Account }
18
+
17
19
  let(:inclusions) do
18
20
  includes.map do |key|
19
- Account.reflect_on_association(key)
21
+ association_host.reflect_on_association(key)
20
22
  end
21
23
  end
22
24
 
23
25
  let(:doc) { criteria.first }
24
26
 
27
+ context 'when root is an STI subclass' do
28
+ # Driver has_one Vehicle
29
+ # Vehicle belongs_to Driver
30
+ # Truck is a Vehicle
31
+
32
+ before do
33
+ Driver.create!(vehicle: Truck.new)
34
+ end
35
+
36
+ let(:criteria) { Truck.all }
37
+ let(:includes) { %i[ driver ] }
38
+ let(:association_host) { Truck }
39
+
40
+ it 'preloads the driver' do
41
+ expect(doc.ivar(:driver)).to be false
42
+ context.preload(inclusions, [ doc ])
43
+ expect(doc.ivar(:driver)).to be == Driver.first
44
+ end
45
+ end
46
+
25
47
  context "when belongs_to" do
26
48
 
27
49
  let!(:account) do
@@ -42,7 +64,7 @@ describe Mongoid::Association::EagerLoadable do
42
64
  it "preloads the parent" do
43
65
  expect(doc.ivar(:person)).to be false
44
66
  context.preload(inclusions, [doc])
45
- expect(doc.ivar(:person)).to eq(doc.person)
67
+ expect(doc.ivar(:person)).to be == person
46
68
  end
47
69
  end
48
70
 
@@ -244,7 +266,8 @@ describe Mongoid::Association::EagerLoadable do
244
266
  end
245
267
 
246
268
  it "runs the has_one preload" do
247
- expect(Mongoid::Association::Referenced::HasOne::Eager).to receive(:new).with([book_association, cat_association], docs).once.and_call_original
269
+ expect(Mongoid::Association::Referenced::HasOne::Eager).to receive(:new).with([ book_association ], docs).once.and_call_original
270
+ expect(Mongoid::Association::Referenced::HasOne::Eager).to receive(:new).with([ cat_association ], docs).once.and_call_original
248
271
  context.eager_load(docs)
249
272
  end
250
273
  end
@@ -58,7 +58,8 @@ describe Mongoid::Association::Embedded::EmbeddedIn::Binding do
58
58
  end
59
59
 
60
60
  it "does nothing" do
61
- expect(name).to receive(:namable=).never
61
+ expect(name).to receive(:namable=).with(person).never
62
+ expect(name).to receive(:namable=).with(nil).once
62
63
  binding.bind_one
63
64
  end
64
65
  end