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
@@ -738,19 +738,6 @@ describe Mongoid::Clients do
738
738
  end
739
739
  end
740
740
 
741
- context "when provided a class that extends another document" do
742
-
743
- let(:klass) do
744
- Class.new(Band)
745
- end
746
-
747
- it "raises an error" do
748
- expect {
749
- klass.store_in(database: :artists)
750
- }.to raise_error(Mongoid::Errors::InvalidStorageParent)
751
- end
752
- end
753
-
754
741
  context "when provided a hash" do
755
742
 
756
743
  context "when the hash is not valid" do
@@ -762,6 +749,128 @@ describe Mongoid::Clients do
762
749
  end
763
750
  end
764
751
  end
752
+
753
+ context "when it is called on a subclass" do
754
+
755
+ let(:client) { StoreParent.collection.client }
756
+ let(:parent) { StoreParent.create! }
757
+ let(:child1) { StoreChild1.create! }
758
+ let(:child2) { StoreChild2.create! }
759
+
760
+ before do
761
+ class StoreParent
762
+ include Mongoid::Document
763
+ end
764
+
765
+ class StoreChild1 < StoreParent
766
+ end
767
+
768
+ class StoreChild2 < StoreParent
769
+ end
770
+ end
771
+
772
+ after do
773
+ Object.send(:remove_const, :StoreParent)
774
+ Object.send(:remove_const, :StoreChild1)
775
+ Object.send(:remove_const, :StoreChild2)
776
+ end
777
+
778
+ context "when it is not called on the parent" do
779
+
780
+ context "when it is called on all subclasses" do
781
+
782
+ before do
783
+ StoreChild1.store_in collection: :store_ones
784
+ StoreChild2.store_in collection: :store_twos
785
+ [ parent, child1, child2 ]
786
+ end
787
+
788
+ let(:db_parent) { client['store_parents'].find.first }
789
+ let(:db_child1) { client['store_ones'].find.first }
790
+ let(:db_child2) { client['store_twos'].find.first }
791
+
792
+ it "stores the documents in the correct collections" do
793
+ expect(db_parent).to eq({ "_id" => parent.id, "_type" => "StoreParent" })
794
+ expect(db_child1).to eq({ "_id" => child1.id, "_type" => "StoreChild1" })
795
+ expect(db_child2).to eq({ "_id" => child2.id, "_type" => "StoreChild2" })
796
+ end
797
+
798
+ it "only queries from its own collections" do
799
+ expect(StoreParent.count).to eq(1)
800
+ expect(StoreChild1.count).to eq(1)
801
+ expect(StoreChild2.count).to eq(1)
802
+ end
803
+ end
804
+
805
+ context "when it is called on one of the subclasses" do
806
+
807
+ before do
808
+ StoreChild1.store_in collection: :store_ones
809
+ [ parent, child1, child2 ]
810
+ end
811
+
812
+ let(:db_parent) { client['store_parents'].find.first }
813
+ let(:db_child1) { client['store_ones'].find.first }
814
+ let(:db_child2) { client['store_parents'].find.to_a.last }
815
+
816
+ it "stores the documents in the correct collections" do
817
+ expect(db_parent).to eq({ "_id" => parent.id, "_type" => "StoreParent" })
818
+ expect(db_child1).to eq({ "_id" => child1.id, "_type" => "StoreChild1" })
819
+ expect(db_child2).to eq({ "_id" => child2.id, "_type" => "StoreChild2" })
820
+ end
821
+
822
+ it "queries from its own collections" do
823
+ expect(StoreParent.count).to eq(2)
824
+ expect(StoreChild1.count).to eq(1)
825
+ expect(StoreChild2.count).to eq(1)
826
+ end
827
+ end
828
+ end
829
+
830
+ context "when it is called on the parent" do
831
+
832
+ before do
833
+ StoreParent.store_in collection: :st_parents
834
+ end
835
+
836
+ context "when it is called on all subclasses" do
837
+
838
+ before do
839
+ StoreChild1.store_in collection: :store_ones
840
+ StoreChild2.store_in collection: :store_twos
841
+ [ parent, child1, child2 ]
842
+ end
843
+
844
+ let(:db_parent) { client['st_parents'].find.first }
845
+ let(:db_child1) { client['store_ones'].find.first }
846
+ let(:db_child2) { client['store_twos'].find.first }
847
+
848
+ it "stores the documents in the correct collections" do
849
+ expect(db_parent).to eq({ "_id" => parent.id, "_type" => "StoreParent" })
850
+ expect(db_child1).to eq({ "_id" => child1.id, "_type" => "StoreChild1" })
851
+ expect(db_child2).to eq({ "_id" => child2.id, "_type" => "StoreChild2" })
852
+ end
853
+ end
854
+
855
+ context "when it is called on one of the subclasses" do
856
+
857
+ before do
858
+ StoreChild1.store_in collection: :store_ones
859
+ [ parent, child1, child2 ]
860
+ end
861
+
862
+ let(:db_parent) { client['st_parents'].find.first }
863
+ let(:db_child1) { client['store_ones'].find.first }
864
+ let(:db_child2) { client['st_parents'].find.to_a.last }
865
+
866
+ it "stores the documents in the correct collections" do
867
+ expect(db_parent).to eq({ "_id" => parent.id, "_type" => "StoreParent" })
868
+ expect(db_child1).to eq({ "_id" => child1.id, "_type" => "StoreChild1" })
869
+ expect(db_child2).to eq({ "_id" => child2.id, "_type" => "StoreChild2" })
870
+ end
871
+ end
872
+ end
873
+ end
765
874
  end
766
875
 
767
876
  describe ".with" do
@@ -802,7 +911,7 @@ describe Mongoid::Clients do
802
911
  it "does not persist to the default database" do
803
912
  expect {
804
913
  Band.find(band.id)
805
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
914
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Band with id\(s\)/)
806
915
  end
807
916
 
808
917
  let(:from_db) do
@@ -840,7 +949,7 @@ describe Mongoid::Clients do
840
949
  it "does not persist to the default database" do
841
950
  expect {
842
951
  Band.find(band.id)
843
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
952
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Band with id\(s\)/)
844
953
  end
845
954
 
846
955
  let(:from_db) do
@@ -1042,6 +1151,31 @@ describe Mongoid::Clients do
1042
1151
  end
1043
1152
  end
1044
1153
  end
1154
+
1155
+ context 'when using on different objects' do
1156
+ require_mri
1157
+
1158
+ let(:first_band) do
1159
+ Band.create!(name: "The Beatles")
1160
+ end
1161
+
1162
+ let(:second_band) do
1163
+ Band.create!(name: 'Led Zeppelin')
1164
+ end
1165
+
1166
+ it 'does not create extra symbols symbols' do
1167
+ first_band.with(write: { w: 0, j: false }) do |band|
1168
+ band.set(active: false)
1169
+ end
1170
+ initial_symbols_count = Symbol.all_symbols.size
1171
+ second_band.with(write: { w: 0, j: false }) do |band|
1172
+ band.set(active: false)
1173
+ end
1174
+ expect(Symbol.all_symbols.size).to eq(initial_symbols_count)
1175
+ end
1176
+
1177
+ end
1178
+
1045
1179
  end
1046
1180
 
1047
1181
  context "when overriding the default database" do
@@ -0,0 +1,158 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ describe Mongoid::CollectionConfigurable do
6
+
7
+ before(:all) do
8
+ class CollectionConfigurableValidOptions
9
+ include Mongoid::Document
10
+
11
+ store_in collection_options: {
12
+ capped: true,
13
+ size: 2560
14
+ }
15
+ end
16
+
17
+ class CollectionConfigurableUnknownOptions
18
+ include Mongoid::Document
19
+
20
+ store_in collection_options: {
21
+ i_am_not_an_option: true,
22
+ let_me: { fail: true }
23
+ }
24
+ end
25
+
26
+ class CollectionConfigurableInvalidOptions
27
+ include Mongoid::Document
28
+
29
+ store_in collection_options: {
30
+ capped: true
31
+ # Creating a capped collection requires `size` field; therefore,
32
+ # an attempt to create a collection with only `capped : true` option
33
+ # fails.
34
+ }
35
+ end
36
+ end
37
+
38
+ after(:all) do
39
+ Mongoid.deregister_model(CollectionConfigurableValidOptions)
40
+ Object.send(:remove_const, :CollectionConfigurableValidOptions)
41
+ Mongoid.deregister_model(CollectionConfigurableUnknownOptions)
42
+ Object.send(:remove_const, :CollectionConfigurableUnknownOptions)
43
+ Mongoid.deregister_model(CollectionConfigurableInvalidOptions)
44
+ Object.send(:remove_const, :CollectionConfigurableInvalidOptions)
45
+ end
46
+
47
+ after(:each) do
48
+ [
49
+ CollectionConfigurableValidOptions,
50
+ CollectionConfigurableUnknownOptions
51
+ ].each do |klazz|
52
+ klazz.collection.drop
53
+ end
54
+ end
55
+
56
+ context 'when collection does not exist' do
57
+ context 'with valid options' do
58
+ let(:subject) do
59
+ CollectionConfigurableValidOptions
60
+ end
61
+
62
+ before(:each) do
63
+ subject.create_collection
64
+ end
65
+
66
+ let(:coll_options) do
67
+ subject.collection.database.list_collections(filter: { name: subject.collection_name.to_s }).first
68
+ end
69
+
70
+ it 'creates the collection' do
71
+ expect(coll_options).not_to be_nil
72
+ end
73
+
74
+ it 'passes collection options' do
75
+ expect(coll_options.dig('options', 'capped')).to eq(true)
76
+ expect(coll_options.dig('options', 'size')).to eq(2560)
77
+ end
78
+ end
79
+
80
+ context 'with an unknown collection options' do
81
+ let(:subject) do
82
+ CollectionConfigurableUnknownOptions
83
+ end
84
+
85
+ it 'raises an error' do
86
+ expect do
87
+ subject.create_collection
88
+ end.to raise_error(Mongoid::Errors::CreateCollectionFailure)
89
+ end
90
+ end
91
+
92
+ context 'with invalid options' do
93
+ let(:subject) do
94
+ CollectionConfigurableInvalidOptions
95
+ end
96
+
97
+ it 'raises an error' do
98
+ expect do
99
+ subject.create_collection
100
+ end.to raise_error(Mongoid::Errors::CreateCollectionFailure)
101
+ end
102
+ end
103
+ end
104
+
105
+ context 'when collection exists' do
106
+ let(:subject) do
107
+ CollectionConfigurableValidOptions
108
+ end
109
+
110
+ context 'when force is false' do
111
+ let(:logger) do
112
+ double("logger").tap do |log|
113
+ expect(log).to receive(:debug).once.with(/Collection '#{subject.collection_name}' already exist/)
114
+ end
115
+ end
116
+
117
+ before do
118
+ allow(subject).to receive(:logger).and_return(logger)
119
+ subject.collection.create
120
+ end
121
+
122
+ it 'logs a message' do
123
+ subject.create_collection
124
+ end
125
+ end
126
+
127
+ context 'when force is true' do
128
+ let(:logger) do
129
+ double("logger")
130
+ end
131
+
132
+ let(:coll_options) do
133
+ subject.collection.database.list_collections(filter: { name: subject.collection_name.to_s }).first
134
+ end
135
+
136
+ before do
137
+ allow(subject).to receive(:logger).and_return(logger)
138
+ subject.collection.create
139
+ end
140
+
141
+ it 'does not log a message' do
142
+ expect(logger).to receive(:debug).never.with(/Collection '#{subject.collection_name}' already exist/)
143
+ subject.create_collection(force: true)
144
+ end
145
+
146
+ it 'creates the collection' do
147
+ subject.create_collection(force: true)
148
+ expect(coll_options).not_to be_nil
149
+ end
150
+
151
+ it 'passes collection options' do
152
+ subject.create_collection(force: true)
153
+ expect(coll_options.dig('options', 'capped')).to eq(true)
154
+ expect(coll_options.dig('options', 'size')).to eq(2560)
155
+ end
156
+ end
157
+ end
158
+ end
@@ -0,0 +1,160 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ describe Mongoid::Config::Defaults do
6
+
7
+ let(:config) do
8
+ Mongoid::Config
9
+ end
10
+
11
+ describe ".load_defaults" do
12
+
13
+ shared_examples "uses settings for 7.3" do
14
+ it "uses settings for 7.3" do
15
+ expect(Mongoid.broken_aggregables).to be true
16
+ expect(Mongoid.broken_alias_handling).to be true
17
+ expect(Mongoid.broken_and).to be true
18
+ expect(Mongoid.broken_scoping).to be true
19
+ expect(Mongoid.broken_updates).to be true
20
+ expect(Mongoid.compare_time_by_ms).to be false
21
+ expect(Mongoid.legacy_pluck_distinct).to be true
22
+ expect(Mongoid.legacy_triple_equals).to be true
23
+ expect(Mongoid.object_id_as_json_oid).to be true
24
+ end
25
+ end
26
+
27
+ shared_examples "does not use settings for 7.3" do
28
+ it "does not use settings for 7.3" do
29
+ expect(Mongoid.broken_aggregables).to be false
30
+ expect(Mongoid.broken_alias_handling).to be false
31
+ expect(Mongoid.broken_and).to be false
32
+ expect(Mongoid.broken_scoping).to be false
33
+ expect(Mongoid.broken_updates).to be false
34
+ expect(Mongoid.compare_time_by_ms).to be true
35
+ expect(Mongoid.legacy_pluck_distinct).to be false
36
+ expect(Mongoid.legacy_triple_equals).to be false
37
+ end
38
+ end
39
+
40
+ shared_examples "uses settings for 7.4" do
41
+ it "uses settings for 7.4" do
42
+ expect(Mongoid.legacy_attributes).to be true
43
+ expect(Mongoid.overwrite_chained_operators).to be true
44
+ end
45
+ end
46
+
47
+ shared_examples "does not use settings for 7.4" do
48
+ it "does not use settings for 7.4" do
49
+ expect(Mongoid.legacy_attributes).to be false
50
+ expect(Mongoid.overwrite_chained_operators).to be false
51
+ end
52
+ end
53
+
54
+ shared_examples "uses settings for 7.5" do
55
+ it "uses settings for 7.5" do
56
+ expect(Mongoid.map_big_decimal_to_decimal128).to be false
57
+ end
58
+ end
59
+
60
+ shared_examples "does not use settings for 7.5" do
61
+ it "does not use settings for 7.5" do
62
+ expect(Mongoid.map_big_decimal_to_decimal128).to be true
63
+ end
64
+ end
65
+
66
+ shared_examples "uses settings for 8.0" do
67
+ it "uses settings for 8.0" do
68
+ expect(Mongoid.legacy_readonly).to be true
69
+ end
70
+ end
71
+
72
+ shared_examples "does not use settings for 8.0" do
73
+ it "does not use settings for 8.0" do
74
+ expect(Mongoid.legacy_readonly).to be false
75
+ end
76
+ end
77
+
78
+ shared_examples "uses settings for 8.1" do
79
+ it "uses settings for 8.1" do
80
+ expect(Mongoid.immutable_ids).to be false
81
+ end
82
+ end
83
+
84
+ context "when giving a valid version" do
85
+
86
+ before do
87
+ config.load_defaults(version)
88
+ end
89
+
90
+ after do
91
+ Mongoid::Config.reset
92
+ end
93
+
94
+ context "when the given version is 7.3" do
95
+
96
+ let(:version) { 7.3 }
97
+
98
+ it_behaves_like "uses settings for 7.3"
99
+ it_behaves_like "uses settings for 7.4"
100
+ it_behaves_like "uses settings for 7.5"
101
+ it_behaves_like "uses settings for 8.0"
102
+ it_behaves_like "uses settings for 8.1"
103
+ end
104
+
105
+ context "when the given version is 7.4" do
106
+
107
+ let(:version) { 7.4 }
108
+
109
+ it_behaves_like "does not use settings for 7.3"
110
+ it_behaves_like "uses settings for 7.4"
111
+ it_behaves_like "uses settings for 7.5"
112
+ it_behaves_like "uses settings for 8.0"
113
+ it_behaves_like "uses settings for 8.1"
114
+ end
115
+
116
+ context "when the given version is 7.5" do
117
+
118
+ let(:version) { 7.5 }
119
+
120
+ it_behaves_like "does not use settings for 7.3"
121
+ it_behaves_like "does not use settings for 7.4"
122
+ it_behaves_like "uses settings for 7.5"
123
+ it_behaves_like "uses settings for 8.0"
124
+ it_behaves_like "uses settings for 8.1"
125
+ end
126
+
127
+ context "when the given version is 8.0" do
128
+
129
+ let(:version) { 8.0 }
130
+
131
+ it_behaves_like "does not use settings for 7.3"
132
+ it_behaves_like "does not use settings for 7.4"
133
+ it_behaves_like "does not use settings for 7.5"
134
+ it_behaves_like "uses settings for 8.0"
135
+ it_behaves_like "uses settings for 8.1"
136
+ end
137
+
138
+ context "when the given version is 8.1" do
139
+
140
+ let(:version) { 8.1 }
141
+
142
+ it_behaves_like "does not use settings for 7.3"
143
+ it_behaves_like "does not use settings for 7.4"
144
+ it_behaves_like "does not use settings for 7.5"
145
+ it_behaves_like "does not use settings for 8.0"
146
+ it_behaves_like "uses settings for 8.1"
147
+ end
148
+ end
149
+
150
+ context "when given version an invalid version" do
151
+ let(:version) { 4.2 }
152
+
153
+ it "raises an error" do
154
+ expect do
155
+ config.load_defaults(version)
156
+ end.to raise_error(ArgumentError, /Unknown version: 4.2/)
157
+ end
158
+ end
159
+ end
160
+ end