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
@@ -33,107 +33,93 @@ describe Mongoid::Extensions::Integer do
33
33
  end
34
34
  end
35
35
 
36
- describe ".demongoize" do
36
+ [ :mongoize, :demongoize ].each do |method|
37
37
 
38
- context "when the value is an integer" do
38
+ describe ".#{method}" do
39
39
 
40
- it "returns a integer" do
41
- expect(Integer.demongoize(number)).to eq(number)
42
- end
43
- end
40
+ context "when the value is a number" do
44
41
 
45
- context "when the value is nil" do
46
-
47
- it "returns nil" do
48
- expect(Integer.demongoize(nil)).to be_nil
49
- end
50
- end
42
+ context "when the value is an integer" do
51
43
 
52
- context "when the value is not an integer" do
44
+ context "when the value is small" do
53
45
 
54
- it "converts the value to an integer" do
55
- expect(Integer.demongoize("1.0")).to eq(1)
56
- end
57
- end
58
- end
59
-
60
- describe ".mongoize" do
61
-
62
- context "when the value is a number" do
63
-
64
- context "when the value is an integer" do
46
+ it "it returns the integer" do
47
+ expect(Integer.send(method, 3)).to eq(3)
48
+ end
49
+ end
65
50
 
66
- context "when the value is small" do
51
+ context "when the value is large" do
67
52
 
68
- it "it returns the integer" do
69
- expect(Integer.mongoize(3)).to eq(3)
53
+ it "returns the integer" do
54
+ expect(Integer.send(method, 1024**2).to_s).to eq("1048576")
55
+ end
70
56
  end
71
57
  end
72
58
 
73
- context "when the value is large" do
59
+ context "when the value is a decimal" do
74
60
 
75
- it "returns the integer" do
76
- expect(Integer.mongoize(1024**2).to_s).to eq("1048576")
61
+ it "casts to integer" do
62
+ expect(Integer.send(method, 2.5)).to eq(2)
77
63
  end
78
64
  end
79
- end
80
65
 
81
- context "when the value is a decimal" do
66
+ context "when the value is floating point zero" do
82
67
 
83
- it "casts to integer" do
84
- expect(Integer.mongoize(2.5)).to eq(2)
68
+ it "returns the integer zero" do
69
+ expect(Integer.send(method, 0.00000)).to eq(0)
70
+ end
85
71
  end
86
- end
87
72
 
88
- context "when the value is floating point zero" do
73
+ context "when the value is a floating point integer" do
89
74
 
90
- it "returns the integer zero" do
91
- expect(Integer.mongoize(0.00000)).to eq(0)
75
+ it "returns the integer number" do
76
+ expect(Integer.send(method, 4.00000)).to eq(4)
77
+ end
92
78
  end
93
- end
94
79
 
95
- context "when the value is a floating point integer" do
80
+ context "when the value has leading zeros" do
96
81
 
97
- it "returns the integer number" do
98
- expect(Integer.mongoize(4.00000)).to eq(4)
82
+ it "returns the stripped integer" do
83
+ expect(Integer.send(method, "000011")).to eq(11)
84
+ end
99
85
  end
100
86
  end
101
87
 
102
- context "when the value has leading zeros" do
88
+ context "when the string is not a number" do
103
89
 
104
- it "returns the stripped integer" do
105
- expect(Integer.mongoize("000011")).to eq(11)
106
- end
107
- end
108
- end
90
+ context "when the string is non numerical" do
109
91
 
110
- context "when the string is not a number" do
92
+ it "returns nil" do
93
+ expect(Integer.send(method, "foo")).to be_nil
94
+ end
95
+ end
111
96
 
112
- context "when the string is non numerical" do
97
+ context "when the string starts with a number" do
113
98
 
114
- it "returns 0" do
115
- expect(Integer.mongoize("foo")).to eq(0)
99
+ it "returns nil" do
100
+ expect(Integer.send(method, "42bogus")).to be_nil
101
+ end
116
102
  end
117
- end
118
103
 
119
- context "when the string is numerical" do
104
+ context "when the string is empty" do
120
105
 
121
- it "returns the integer value for the string" do
122
- expect(Integer.mongoize("3")).to eq(3)
106
+ it "returns nil" do
107
+ expect(Integer.send(method, "")).to be_nil
108
+ end
123
109
  end
124
- end
125
110
 
126
- context "when the string is empty" do
111
+ context "when the string is nil" do
127
112
 
128
- it "returns nil" do
129
- expect(Integer.mongoize("")).to be_nil
113
+ it "returns nil" do
114
+ expect(Integer.send(method, nil)).to be_nil
115
+ end
130
116
  end
131
- end
132
117
 
133
- context "when the string is nil" do
118
+ context "when giving an object that is castable to an Integer" do
134
119
 
135
- it "returns nil" do
136
- expect(Integer.mongoize(nil)).to be_nil
120
+ it "returns the integer value" do
121
+ expect(Integer.send(method, 2.hours)).to eq(7200)
122
+ end
137
123
  end
138
124
  end
139
125
  end
@@ -16,142 +16,343 @@ describe Mongoid::Extensions::Range do
16
16
  end
17
17
 
18
18
  describe ".demongoize" do
19
+ subject { Range.demongoize(hash) }
19
20
 
20
21
  context "when the range is ascending" do
21
-
22
- let(:hash) do
23
- { "min" => 1, "max" => 3 }
24
- end
22
+ let(:hash) { { "min" => 1, "max" => 3 } }
25
23
 
26
24
  it "returns an ascending range" do
27
- expect(Range.demongoize(hash)).to eq(1..3)
25
+ is_expected.to eq(1..3)
28
26
  end
29
27
  end
30
28
 
31
29
  context "when the range is ascending with exclude end" do
32
-
33
- let(:hash) do
34
- { "min" => 1, "max" => 3, "exclude_end" => true }
35
- end
30
+ let(:hash) { { "min" => 1, "max" => 3, "exclude_end" => true } }
36
31
 
37
32
  it "returns an ascending range" do
38
- expect(Range.demongoize(hash)).to eq(1...3)
33
+ is_expected.to eq(1...3)
39
34
  end
40
35
  end
41
36
 
42
37
  context "when the range is descending" do
43
-
44
- let(:hash) do
45
- { "min" => 5, "max" => 1 }
46
- end
38
+ let(:hash) { { "min" => 5, "max" => 1 } }
47
39
 
48
40
  it "returns an descending range" do
49
- expect(Range.demongoize(hash)).to eq(5..1)
41
+ is_expected.to eq(5..1)
50
42
  end
51
43
  end
52
44
 
53
45
  context "when the range is descending with exclude end" do
54
-
55
- let(:hash) do
56
- { "min" => 5, "max" => 1, "exclude_end" => true }
57
- end
46
+ let(:hash) { { "min" => 5, "max" => 1, "exclude_end" => true } }
58
47
 
59
48
  it "returns an descending range" do
60
- expect(Range.demongoize(hash)).to eq(5...1)
49
+ is_expected.to eq(5...1)
61
50
  end
62
51
  end
63
52
 
64
53
  context "when the range is letters" do
54
+ let(:hash) { { "min" => "a", "max" => "z" } }
65
55
 
66
- let(:hash) do
67
- { "min" => "a", "max" => "z" }
56
+ it "returns an alphabetic range" do
57
+ is_expected.to eq("a".."z")
68
58
  end
59
+ end
60
+
61
+ context "when the range is letters with exclude end" do
62
+ let(:hash) { { "min" => "a", "max" => "z", "exclude_end" => true } }
69
63
 
70
64
  it "returns an alphabetic range" do
71
- expect(Range.demongoize(hash)).to eq("a".."z")
65
+ is_expected.to eq("a"..."z")
72
66
  end
73
67
  end
74
68
 
75
- context "when the range is letters with exclude end" do
69
+ context "when the range is endless" do
70
+ let(:hash) { { "min" => 1, "max" => nil } }
71
+
72
+ context 'kernel can support endless range' do
73
+ ruby_version_gte '2.6'
76
74
 
77
- let(:hash) do
78
- { "min" => "a", "max" => "z", "exclude_end" => true }
75
+ it "returns an alphabetic range" do
76
+ is_expected.to eq(eval('1..'))
77
+ end
79
78
  end
80
79
 
81
- it "returns an alphabetic range" do
82
- expect(Range.demongoize(hash)).to eq("a"..."z")
80
+ context 'kernel cannot support endless range' do
81
+ ruby_version_lt '2.6'
82
+
83
+ it "returns nil" do
84
+ is_expected.to be nil
85
+ end
86
+ end
87
+ end
88
+
89
+ context "when the range is endless with exclude end" do
90
+ let(:hash) { { "min" => 1, "max" => nil, "exclude_end" => true } }
91
+
92
+ context 'kernel can support endless range' do
93
+ ruby_version_gte '2.6'
94
+
95
+ it "returns an alphabetic range" do
96
+ is_expected.to eq(eval('1...'))
97
+ end
98
+ end
99
+
100
+ context 'kernel cannot support endless range' do
101
+ ruby_version_lt '2.6'
102
+
103
+ it "returns nil" do
104
+ is_expected.to be nil
105
+ end
106
+ end
107
+ end
108
+
109
+ context "when the range is beginning-less" do
110
+ let(:hash) { { "min" => nil, "max" => 3 } }
111
+
112
+ context 'kernel can support beginning-less range' do
113
+ ruby_version_gte '2.7'
114
+
115
+ it "returns an alphabetic range" do
116
+ is_expected.to eq(nil..3)
117
+ end
118
+ end
119
+
120
+ context 'kernel cannot support beginning-less range' do
121
+ ruby_version_lt '2.7'
122
+
123
+ it "returns nil" do
124
+ is_expected.to be nil
125
+ end
126
+ end
127
+ end
128
+
129
+ context "when the range is beginning-less with exclude end" do
130
+ let(:hash) { { "min" => nil, "max" => 3, "exclude_end" => true } }
131
+
132
+ context 'kernel can support endless range' do
133
+ ruby_version_gte '2.7'
134
+
135
+ it "returns an alphabetic beginning-less" do
136
+ is_expected.to eq(eval('...3'))
137
+ end
138
+ end
139
+
140
+ context 'kernel cannot support beginning-less range' do
141
+ ruby_version_lt '2.7'
142
+
143
+ it "returns nil" do
144
+ is_expected.to be nil
145
+ end
146
+ end
147
+ end
148
+
149
+ context "when the range doesn't have any correct keys" do
150
+ let(:hash) { { "min^" => "a", "max^" => "z", "exclude_end^" => true } }
151
+
152
+ it "returns nil" do
153
+ is_expected.to be nil
154
+ end
155
+ end
156
+
157
+ context "when the range has symbol keys" do
158
+ let(:hash) { { min: 1, max: 3 } }
159
+
160
+ it "returns an ascending range" do
161
+ is_expected.to eq(1..3)
83
162
  end
84
163
  end
85
164
  end
86
165
 
87
- describe ".mongoize" do
166
+ shared_examples_for 'mongoize range' do
167
+
168
+ context 'given a normal range' do
169
+ let(:range) { 1..3 }
170
+
171
+ it "returns the object hash" do
172
+ is_expected.to eq("min" => 1, "max" => 3)
173
+ end
174
+ end
175
+
176
+ context 'given a normal range not inclusive' do
177
+ let(:range) { 1...3 }
178
+
179
+ it "returns the object hash" do
180
+ is_expected.to eq("min" => 1, "max" => 3, "exclude_end" => true)
181
+ end
182
+ end
183
+
184
+ context 'given a descending range' do
185
+ let(:range) { 5..1 }
88
186
 
89
- context "when the value is not nil" do
187
+ it "returns the object hash" do
188
+ is_expected.to eq("min" => 5, "max" => 1)
189
+ end
190
+ end
191
+
192
+ context 'given a descending range not inclusive' do
193
+ let(:range) { 5...1 }
90
194
 
91
195
  it "returns the object hash" do
92
- expect(Range.mongoize(1..3)).to eq({ "min" => 1, "max" => 3 })
196
+ is_expected.to eq("min" => 5, "max" => 1, "exclude_end" => true)
93
197
  end
198
+ end
199
+
200
+ context 'given an endless range' do
201
+ ruby_version_gte '2.6'
94
202
 
95
- it "returns the object hash when passed an inverse range" do
96
- expect(Range.mongoize(5..1)).to eq({ "min" => 5, "max" => 1 })
203
+ let(:range) { eval('5..') }
204
+
205
+ it "returns the object hash" do
206
+ is_expected.to eq("min" => 5)
97
207
  end
208
+ end
209
+
210
+ context 'given an endless range not inclusive' do
211
+ ruby_version_gte '2.6'
98
212
 
99
- it "returns the object hash when passed a letter range" do
100
- expect(Range.mongoize("a".."z")).to eq({ "min" => "a", "max" => "z" })
213
+ let(:range) { eval('5...') }
214
+
215
+ it "returns the object hash" do
216
+ is_expected.to eq("min" => 5, "exclude_end" => true)
101
217
  end
102
218
  end
103
219
 
104
- context "when the value is not nil with exclude end" do
220
+ context 'given a beginning-less range' do
221
+ ruby_version_gte '2.7'
222
+
223
+ let(:range) { eval('..5') }
105
224
 
106
225
  it "returns the object hash" do
107
- expect(Range.mongoize(1...3)).to eq({ "min" => 1, "max" => 3, "exclude_end" => true })
226
+ is_expected.to eq("max" => 5)
108
227
  end
228
+ end
229
+
230
+ context 'given an endless range not inclusive' do
231
+ ruby_version_gte '2.7'
232
+
233
+ let(:range) { eval('...5') }
234
+
235
+ it "returns the object hash" do
236
+ is_expected.to eq("max" => 5, "exclude_end" => true)
237
+ end
238
+ end
239
+
240
+ context 'given a letter range' do
241
+ let(:range) { 'a'..'z' }
242
+
243
+ it "returns the object hash" do
244
+ is_expected.to eq("min" => "a", "max" => "z")
245
+ end
246
+ end
247
+
248
+ context 'given a letter range not inclusive' do
249
+ let(:range) { 'a'...'z' }
250
+
251
+ it "returns the object hash" do
252
+ is_expected.to eq("min" => "a", "max" => "z", "exclude_end" => true)
253
+ end
254
+ end
255
+
256
+ context 'given a Time range' do
257
+ let(:range) { Time.at(0)..Time.at(1) }
109
258
 
110
- it "returns the object hash when passed an inverse range" do
111
- expect(Range.mongoize(5...1)).to eq({ "min" => 5, "max" => 1, "exclude_end" => true })
259
+ it "returns the object hash" do
260
+ is_expected.to eq("min" => Time.at(0), "max" => Time.at(1))
261
+ expect(subject["min"].utc?).to be(true)
262
+ expect(subject["max"].utc?).to be(true)
112
263
  end
264
+ end
113
265
 
114
- it "returns the object hash when passed a letter range" do
115
- expect(Range.mongoize("a"..."z")).to eq({ "min" => "a", "max" => "z", "exclude_end" => true })
266
+ context 'given an ActiveSupport::TimeWithZone range' do
267
+ let(:range) { Time.at(0)..Time.at(1) }
268
+
269
+ it "returns the object hash" do
270
+ is_expected.to eq("min" => Time.at(0).in_time_zone, "max" => Time.at(1).in_time_zone)
271
+ expect(subject["min"].utc?).to be(true)
272
+ expect(subject["max"].utc?).to be(true)
116
273
  end
274
+ end
275
+
276
+ context 'given a Date range' do
277
+ let(:range) { Date.new(2020, 1, 1)..Date.new(2020, 1, 2) }
117
278
 
279
+ it "returns the object hash" do
280
+ is_expected.to eq("min" => Time.utc(2020, 1, 1), "max" => Time.utc(2020, 1, 2))
281
+ expect(subject["min"].utc?).to be(true)
282
+ expect(subject["max"].utc?).to be(true)
283
+ end
118
284
  end
119
285
 
120
- context "when the value is nil" do
286
+ context "given nil" do
287
+ let(:range) { nil }
121
288
 
122
289
  it "returns nil" do
123
- expect(Range.mongoize(nil)).to be_nil
290
+ is_expected.to be_nil
291
+ end
292
+ end
293
+
294
+ context "given a hash" do
295
+ let(:range) { { 'min' => 1, 'max' => 5, 'exclude_end' => true } }
296
+
297
+ it "returns the hash" do
298
+ is_expected.to eq(range)
299
+ end
300
+ end
301
+
302
+ context "given a hash missing fields" do
303
+ let(:range) { { 'min' => 1 } }
304
+
305
+ it "returns the hash" do
306
+ is_expected.to eq(range)
124
307
  end
125
308
  end
126
309
  end
127
310
 
128
311
  describe "#mongoize" do
312
+ subject { range.mongoize }
129
313
 
130
- context "when the value is not nil" do
314
+ context 'given a String' do
315
+ let(:range) { '3' }
131
316
 
132
- it "returns the object hash" do
133
- expect((1..3).mongoize).to eq({ "min" => 1, "max" => 3 })
317
+ it 'returns a string' do
318
+ is_expected.to eq('3')
134
319
  end
320
+ end
321
+
322
+ it_behaves_like 'mongoize range'
323
+ end
324
+
325
+ describe ".mongoize" do
326
+ subject { Range.mongoize(range) }
327
+
328
+ context 'given a String' do
329
+ let(:range) { '3' }
135
330
 
136
- it "returns the object hash when passed an inverse range" do
137
- expect((5..1).mongoize).to eq({ "min" => 5, "max" => 1 })
331
+ it "returns nil" do
332
+ is_expected.to be_nil
138
333
  end
334
+ end
139
335
 
140
- it "returns the object hash when passed a letter range" do
141
- expect(("a".."z").mongoize).to eq({ "min" => "a", "max" => "z" })
336
+ context "given a hash with wrong fields" do
337
+ let(:range) { { 'min' => 1, 'max' => 5, 'exclude_end^' => true} }
338
+
339
+ it "removes the bogus fields" do
340
+ is_expected.to eq({ 'min' => 1, 'max' => 5 })
142
341
  end
143
342
  end
144
343
 
145
- context 'when the value is a string' do
344
+ context "given a hash with no correct fields" do
345
+ let(:range) { { 'min^' => 1, 'max^' => 5, 'exclude_end^' => true} }
146
346
 
147
- it 'returns a string' do
148
- expect(Range.mongoize('3')).to eq('3')
347
+ it "returns nil" do
348
+ is_expected.to be_nil
149
349
  end
150
350
  end
351
+
352
+ it_behaves_like 'mongoize range'
151
353
  end
152
354
 
153
355
  describe "#resizable?" do
154
-
155
356
  let(:range) do
156
357
  1...3
157
358
  end
@@ -4,61 +4,86 @@ require "spec_helper"
4
4
 
5
5
  describe Mongoid::Extensions::Regexp do
6
6
 
7
- describe ".demongoize" do
7
+ [ :mongoize, :demongoize ].each do |method|
8
8
 
9
- let(:value) do
10
- Regexp.demongoize(/[^abc]/)
11
- end
9
+ describe ".#{method}" do
12
10
 
13
- it "returns the provided value" do
14
- expect(value).to eq(/[^abc]/)
15
- end
16
- end
11
+ context "when providing a regex" do
17
12
 
18
- describe ".mongoize" do
19
-
20
- context "when providing a regex" do
13
+ let(:value) do
14
+ Regexp.send(method, /[^abc]/)
15
+ end
21
16
 
22
- let(:value) do
23
- Regexp.mongoize(/[^abc]/)
17
+ it "returns the provided value" do
18
+ expect(value).to eq(/[^abc]/)
19
+ end
24
20
  end
25
21
 
26
- it "returns the provided value" do
27
- expect(value).to eq(/[^abc]/)
28
- end
29
- end
22
+ context "when providing a string" do
30
23
 
31
- context "when providing a string" do
24
+ let(:value) do
25
+ Regexp.send(method, "[^abc]")
26
+ end
32
27
 
33
- let(:value) do
34
- Regexp.mongoize("[^abc]")
35
- end
28
+ it "returns the provided value as a regex" do
29
+ expect(value).to eq(/[^abc]/)
30
+ end
36
31
 
37
- it "returns the provided value as a regex" do
38
- expect(value).to eq(/[^abc]/)
32
+
33
+ context "when the string is empty" do
34
+
35
+ let(:value) do
36
+ Regexp.send(method, "")
37
+ end
38
+
39
+ it "returns an empty regex" do
40
+ expect(value).to eq(//)
41
+ end
42
+ end
39
43
  end
40
44
 
45
+ context "when the value is nil" do
41
46
 
42
- context "when the string is empty" do
47
+ let(:value) do
48
+ Regexp.send(method, nil)
49
+ end
50
+
51
+ it "returns the nil" do
52
+ expect(value).to be_nil
53
+ end
54
+ end
55
+
56
+ context "when providing a BSON::Regexp::Raw" do
43
57
 
44
58
  let(:value) do
45
- Regexp.mongoize("")
59
+ Regexp.send(method, BSON::Regexp::Raw.new("hello"))
46
60
  end
47
61
 
48
- it "returns an empty regex" do
49
- expect(value).to eq(//)
62
+ it "returns a Regexp" do
63
+ expect(value).to eq(/hello/)
50
64
  end
51
65
  end
52
- end
53
66
 
54
- context "when the value is nil" do
67
+ context "when providing an invalid regexp" do
68
+
69
+ let(:value) do
70
+ Regexp.send(method, "[")
71
+ end
55
72
 
56
- let(:value) do
57
- Regexp.mongoize(nil)
73
+ it "returns nil" do
74
+ expect(value).to be_nil
75
+ end
58
76
  end
59
77
 
60
- it "returns the nil" do
61
- expect(value).to be_nil
78
+ context "when providing an invalid Regexp to a BSON::Regexp::Raw" do
79
+
80
+ let(:value) do
81
+ Regexp.send(method, BSON::Regexp::Raw.new("["))
82
+ end
83
+
84
+ it "returns nil" do
85
+ expect(value).to be_nil
86
+ end
62
87
  end
63
88
  end
64
89
  end