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
@@ -14,18 +14,15 @@ describe Mongoid::Fields do
14
14
  context "when the field is localized" do
15
15
 
16
16
  context "when translations exist" do
17
+ with_default_i18n_configs
17
18
 
18
19
  before do
20
+ I18n.locale = :en
19
21
  product.description = "test"
20
- I18n.enforce_available_locales = false
21
- ::I18n.locale = :de
22
+ I18n.locale = :de
22
23
  product.description = "The best"
23
24
  end
24
25
 
25
- after do
26
- ::I18n.locale = :en
27
- end
28
-
29
26
  let(:translations) do
30
27
  product.description_translations
31
28
  end
@@ -393,6 +390,22 @@ describe Mongoid::Fields do
393
390
  it "converts :time to Time" do
394
391
  expect(klass.field(:test, type: :time).type).to be(Time)
395
392
  end
393
+
394
+ context 'when using an unknown symbol' do
395
+ it 'raises InvalidFieldType' do
396
+ lambda do
397
+ klass.field(:test, type: :bogus)
398
+ end.should raise_error(Mongoid::Errors::InvalidFieldType, /defines a field 'test' with an unknown type value :bogus/)
399
+ end
400
+ end
401
+
402
+ context 'when using an unknown string' do
403
+ it 'raises InvalidFieldType' do
404
+ lambda do
405
+ klass.field(:test, type: 'bogus')
406
+ end.should raise_error(Mongoid::Errors::InvalidFieldType, /defines a field 'test' with an unknown type value "bogus"/)
407
+ end
408
+ end
396
409
  end
397
410
 
398
411
  context "when the options are valid" do
@@ -427,25 +440,25 @@ describe Mongoid::Fields do
427
440
  context "when the Symbol type is used" do
428
441
 
429
442
  before do
430
- Mongoid::Fields::Validators::Macro.class_eval do
431
- @field_type_is_symbol_warned = false
443
+ Mongoid::Warnings.class_eval do
444
+ @symbol_type_deprecated = false
432
445
  end
433
446
  end
434
447
 
435
448
  after do
436
- Band.fields.delete("should_warn")
449
+ Label.fields.delete("should_warn")
437
450
  end
438
451
 
439
452
  it "warns that the BSON symbol type is deprecated" do
440
453
  expect(Mongoid.logger).to receive(:warn)
441
454
 
442
- Band.field :should_warn, type: Symbol
455
+ Label.field :should_warn, type: Symbol
443
456
  end
444
457
 
445
458
  it "warns on first use of Symbol type only" do
446
459
  expect(Mongoid.logger).to receive(:warn).once
447
460
 
448
- Band.field :should_warn, type: Symbol
461
+ Label.field :should_warn, type: Symbol
449
462
  end
450
463
 
451
464
  context 'when using Symbol field type in multiple classes' do
@@ -456,7 +469,7 @@ describe Mongoid::Fields do
456
469
  it "warns on first use of Symbol type only" do
457
470
  expect(Mongoid.logger).to receive(:warn).once
458
471
 
459
- Band.field :should_warn, type: Symbol
472
+ Label.field :should_warn, type: Symbol
460
473
  Truck.field :should_warn, type: Symbol
461
474
  end
462
475
  end
@@ -466,7 +479,7 @@ describe Mongoid::Fields do
466
479
 
467
480
  it "raises an error" do
468
481
  expect {
469
- Band.field :unacceptable, bad: true
482
+ Label.field :unacceptable, bad: true
470
483
  }.to raise_error(Mongoid::Errors::InvalidFieldOption)
471
484
  end
472
485
  end
@@ -511,16 +524,13 @@ describe Mongoid::Fields do
511
524
  end
512
525
 
513
526
  context "when a single locale is set" do
527
+ with_default_i18n_configs
514
528
 
515
529
  before do
516
- ::I18n.locale = :de
530
+ I18n.locale = :de
517
531
  product.description = "The best"
518
532
  end
519
533
 
520
- after do
521
- ::I18n.locale = :en
522
- end
523
-
524
534
  let(:description) do
525
535
  product.description
526
536
  end
@@ -531,17 +541,15 @@ describe Mongoid::Fields do
531
541
  end
532
542
 
533
543
  context "when multiple locales are set" do
544
+ with_default_i18n_configs
534
545
 
535
546
  before do
547
+ I18n.locale = :end
536
548
  product.description = "Cheap drinks"
537
- ::I18n.locale = :de
549
+ I18n.locale = :de
538
550
  product.description = "Cheaper drinks"
539
551
  end
540
552
 
541
- after do
542
- ::I18n.locale = :en
543
- end
544
-
545
553
  let(:description) do
546
554
  product.description
547
555
  end
@@ -551,6 +559,49 @@ describe Mongoid::Fields do
551
559
  end
552
560
  end
553
561
  end
562
+
563
+ context 'when the field is declared as BSON::Decimal128' do
564
+ let(:document) { Mop.create!(decimal128_field: BSON::Decimal128.new(Math::PI.to_s)).reload }
565
+
566
+ shared_context 'BSON::Decimal128 is BigDecimal' do
567
+ it 'should return a BigDecimal' do
568
+ expect(document.decimal128_field).to be_a BigDecimal
569
+ end
570
+ end
571
+
572
+ shared_context 'BSON::Decimal128 is BSON::Decimal128' do
573
+ it 'should return a BSON::Decimal128' do
574
+ expect(document.decimal128_field).to be_a BSON::Decimal128
575
+ end
576
+ end
577
+
578
+ it 'is declared as BSON::Decimal128' do
579
+ expect(Mop.fields['decimal128_field'].type).to be == BSON::Decimal128
580
+ end
581
+
582
+ context 'when BSON version <= 4' do
583
+ max_bson_version '4.99.99'
584
+ it_behaves_like 'BSON::Decimal128 is BSON::Decimal128'
585
+ end
586
+
587
+ context 'when BSON version >= 5' do
588
+ min_bson_version '5.0.0'
589
+
590
+ context 'when allow_bson5_decimal128 is false' do
591
+ config_override :allow_bson5_decimal128, false
592
+ it_behaves_like 'BSON::Decimal128 is BigDecimal'
593
+ end
594
+
595
+ context 'when allow_bson5_decimal128 is true' do
596
+ config_override :allow_bson5_decimal128, true
597
+ it_behaves_like 'BSON::Decimal128 is BSON::Decimal128'
598
+ end
599
+
600
+ context 'when allow_bson5_decimal128 is default' do
601
+ it_behaves_like 'BSON::Decimal128 is BigDecimal'
602
+ end
603
+ end
604
+ end
554
605
  end
555
606
 
556
607
  describe "#getter_before_type_cast" do
@@ -568,8 +619,144 @@ describe Mongoid::Fields do
568
619
  context "when the attribute has been assigned" do
569
620
 
570
621
  it "returns the attribute before type cast" do
571
- person.age = "old"
572
- expect(person.age_before_type_cast).to eq("old")
622
+ person.age = "42"
623
+ expect(person.age_before_type_cast).to eq("42")
624
+ end
625
+ end
626
+
627
+ context "when reloading" do
628
+
629
+ let(:product) do
630
+ Product.create!(price: '1')
631
+ end
632
+
633
+ before do
634
+ product.reload
635
+ end
636
+
637
+ it "resets the attributes_before_type_cast to the attributes hash" do
638
+ expect(product.attributes_before_type_cast).to eq(product.attributes)
639
+ end
640
+
641
+ it "the *_before_type_cast method returns the demongoized value" do
642
+ expect(product.price_before_type_cast).to eq(1)
643
+ end
644
+ end
645
+
646
+ context "when reloading and writing a demongoizable value" do
647
+
648
+ let(:product) do
649
+ Product.create!.tap do |product|
650
+ Product.collection.update_one({ _id: product.id }, { :$set => { price: '1' }})
651
+ end
652
+ end
653
+
654
+ before do
655
+ product.reload
656
+ end
657
+
658
+ it "resets the attributes_before_type_cast to the attributes hash" do
659
+ expect(product.attributes_before_type_cast).to eq(product.attributes)
660
+ end
661
+
662
+ it "the *_before_type_cast method returns the mongoized value" do
663
+ expect(product.price_before_type_cast).to eq('1')
664
+ end
665
+ end
666
+
667
+ context "when reading from the db" do
668
+
669
+ let(:product) do
670
+ Product.create!(price: '1')
671
+ end
672
+
673
+ let(:from_db) do
674
+ Product.find(product.id)
675
+ end
676
+
677
+ it "resets the attributes_before_type_cast to the attributes hash" do
678
+ expect(from_db.attributes_before_type_cast).to eq(from_db.attributes)
679
+ end
680
+
681
+ it "the *_before_type_cast method returns the demongoized value" do
682
+ expect(from_db.price_before_type_cast).to eq(1)
683
+ end
684
+ end
685
+
686
+ context "when reading from the db after writing a demongoizable value" do
687
+
688
+ let(:product) do
689
+ Product.create!.tap do |product|
690
+ Product.collection.update_one({ _id: product.id }, { :$set => { price: '1' }})
691
+ end
692
+ end
693
+
694
+ let(:from_db) do
695
+ Product.find(product.id)
696
+ end
697
+
698
+ it "resets the attributes_before_type_cast to the attributes hash" do
699
+ expect(from_db.attributes_before_type_cast).to eq(from_db.attributes)
700
+ end
701
+
702
+ it "the *_before_type_cast method returns the mongoized value" do
703
+ expect(from_db.price_before_type_cast).to eq('1')
704
+ end
705
+ end
706
+
707
+ context "when making a new model" do
708
+
709
+ context "when using new with no options" do
710
+ let(:product) { Product.new }
711
+
712
+ it "sets the attributes_before_type_cast to the attributes hash" do
713
+ expect(product.attributes_before_type_cast).to eq(product.attributes)
714
+ end
715
+ end
716
+
717
+ context "when using new with options" do
718
+ let(:product) { Product.new(price: '1') }
719
+
720
+ let(:abtc) do
721
+ product.attributes.merge('price' => '1')
722
+ end
723
+
724
+ it "has the attributes before type cast" do
725
+ expect(product.attributes_before_type_cast).to eq(abtc)
726
+ end
727
+ end
728
+
729
+ context "when persisting the model" do
730
+ let(:product) { Product.new(price: '1') }
731
+
732
+ let(:abtc) do
733
+ product.attributes.merge('price' => '1')
734
+ end
735
+
736
+ before do
737
+ expect(product.attributes_before_type_cast).to eq(abtc)
738
+ product.save!
739
+ end
740
+
741
+ it "resets the attributes_before_type_cast to the attributes" do
742
+ expect(product.attributes_before_type_cast).to eq(product.attributes)
743
+ end
744
+ end
745
+
746
+ context "when using create! without options" do
747
+ let(:product) { Product.create! }
748
+
749
+ it "resets the attributes_before_type_cast to the attributes" do
750
+ expect(product.attributes_before_type_cast).to eq(product.attributes)
751
+ end
752
+ end
753
+
754
+ context "when using create! with options" do
755
+ let(:product) { Product.create!(price: '1') }
756
+
757
+ it "resets the attributes_before_type_cast to the attributes" do
758
+ expect(product.attributes_before_type_cast).to eq(product.attributes)
759
+ end
573
760
  end
574
761
  end
575
762
  end
@@ -683,16 +870,13 @@ describe Mongoid::Fields do
683
870
  end
684
871
 
685
872
  context "when a locale is set" do
873
+ with_default_i18n_configs
686
874
 
687
875
  before do
688
- ::I18n.locale = :de
876
+ I18n.locale = :de
689
877
  product.description = "Cheaper drinks"
690
878
  end
691
879
 
692
- after do
693
- ::I18n.locale = :en
694
- end
695
-
696
880
  let(:description) do
697
881
  product.attributes["description"]
698
882
  end
@@ -703,17 +887,15 @@ describe Mongoid::Fields do
703
887
  end
704
888
 
705
889
  context "when having multiple locales" do
890
+ with_default_i18n_configs
706
891
 
707
892
  before do
893
+ I18n.locale = :en
708
894
  product.description = "Cheap drinks"
709
- ::I18n.locale = :de
895
+ I18n.locale = :de
710
896
  product.description = "Cheaper drinks"
711
897
  end
712
898
 
713
- after do
714
- ::I18n.locale = :en
715
- end
716
-
717
899
  let(:description) do
718
900
  product.attributes["description"]
719
901
  end
@@ -725,6 +907,22 @@ describe Mongoid::Fields do
725
907
  end
726
908
  end
727
909
  end
910
+
911
+ context "when the field needs to be mongoized" do
912
+
913
+ before do
914
+ product.price = "1"
915
+ product.save!
916
+ end
917
+
918
+ it "mongoizes the value" do
919
+ expect(product.price).to eq(1)
920
+ end
921
+
922
+ it "stores the value in the mongoized form" do
923
+ expect(product.attributes_before_type_cast["price"]).to eq(1)
924
+ end
925
+ end
728
926
  end
729
927
 
730
928
  describe "#defaults" do
@@ -861,7 +1059,7 @@ describe Mongoid::Fields do
861
1059
  it "raises an error" do
862
1060
  expect {
863
1061
  Person.field(meth)
864
- }.to raise_error(Mongoid::Errors::InvalidField)
1062
+ }.to raise_error(Mongoid::Errors::InvalidField, /Defining a field named '#{meth}' is not allowed/)
865
1063
  end
866
1064
  end
867
1065
  end
@@ -899,14 +1097,7 @@ describe Mongoid::Fields do
899
1097
  end
900
1098
 
901
1099
  context "when reading the field" do
902
-
903
- before do
904
- Time.zone = "Berlin"
905
- end
906
-
907
- after do
908
- Time.zone = nil
909
- end
1100
+ time_zone_override "Berlin"
910
1101
 
911
1102
  it "performs the necessary time conversions" do
912
1103
  expect(person.lunch_time.to_s).to eq(time.getlocal.to_s)
@@ -988,7 +1179,7 @@ describe Mongoid::Fields do
988
1179
  end
989
1180
 
990
1181
  it "uses the alias to write the attribute" do
991
- (person.alias = expect(true)).to be true
1182
+ expect(person.alias = true).to be true
992
1183
  end
993
1184
 
994
1185
  it "uses the alias to read the attribute" do
@@ -1000,7 +1191,7 @@ describe Mongoid::Fields do
1000
1191
  end
1001
1192
 
1002
1193
  it "uses the name to write the attribute" do
1003
- (person.aliased = expect(true)).to be true
1194
+ expect(person.aliased = true).to be true
1004
1195
  end
1005
1196
 
1006
1197
  it "uses the name to read the attribute" do
@@ -1229,71 +1420,147 @@ describe Mongoid::Fields do
1229
1420
 
1230
1421
  context "when a field is defined as a big decimal" do
1231
1422
 
1232
- let(:band) do
1233
- Band.new(name: "Tool")
1234
- end
1235
-
1236
- let(:decimal) do
1237
- BigDecimal("1000000.00")
1238
- end
1239
-
1240
- context "when setting to a big decimal" do
1423
+ context 'when Mongoid.map_big_decimal_to_decimal128 is false' do
1424
+ config_override :map_big_decimal_to_decimal128, false
1241
1425
 
1242
- before do
1243
- band.sales = decimal
1426
+ let(:band) do
1427
+ Band.new(name: "Tool")
1244
1428
  end
1245
1429
 
1246
- it "properly persists as a string" do
1247
- expect(band.attributes["sales"]).to eq(decimal.to_s)
1430
+ let(:decimal) do
1431
+ BigDecimal("1000000.00")
1248
1432
  end
1249
1433
 
1250
- it "returns the proper big decimal" do
1251
- expect(band.sales).to eq(decimal)
1434
+ context "when setting to a big decimal" do
1435
+
1436
+ before do
1437
+ band.sales = decimal
1438
+ end
1439
+
1440
+ it "properly persists as a string" do
1441
+ expect(band.attributes["sales"]).to eq(decimal.to_s)
1442
+ end
1443
+
1444
+ it "returns the proper big decimal" do
1445
+ expect(band.sales).to eq(decimal)
1446
+ end
1252
1447
  end
1253
- end
1254
1448
 
1255
- context "when setting to a string" do
1449
+ context "when setting to a string" do
1256
1450
 
1257
- before do
1258
- band.sales = decimal.to_s
1451
+ before do
1452
+ band.sales = decimal.to_s
1453
+ end
1454
+
1455
+ it "properly persists as a string" do
1456
+ expect(band.attributes["sales"]).to eq(decimal.to_s)
1457
+ end
1458
+
1459
+ it "returns the proper big decimal" do
1460
+ expect(band.sales).to eq(decimal)
1461
+ end
1259
1462
  end
1260
1463
 
1261
- it "properly persists as a string" do
1262
- expect(band.attributes["sales"]).to eq(decimal.to_s)
1464
+ context "when setting to an integer" do
1465
+
1466
+ before do
1467
+ band.sales = decimal.to_i
1468
+ end
1469
+
1470
+ it "properly persists as a string" do
1471
+ expect(band.attributes["sales"]).to eq("1000000")
1472
+ end
1473
+
1474
+ it "returns the proper big decimal" do
1475
+ expect(band.sales).to eq(decimal)
1476
+ end
1263
1477
  end
1264
1478
 
1265
- it "returns the proper big decimal" do
1266
- expect(band.sales).to eq(decimal)
1479
+ context "when setting to a float" do
1480
+
1481
+ before do
1482
+ band.sales = decimal.to_f
1483
+ end
1484
+
1485
+ it "properly persists as a string" do
1486
+ expect(band.attributes["sales"]).to eq(decimal.to_s)
1487
+ end
1488
+
1489
+ it "returns the proper big decimal" do
1490
+ expect(band.sales).to eq(decimal)
1491
+ end
1267
1492
  end
1268
1493
  end
1269
1494
 
1270
- context "when setting to an integer" do
1495
+ context 'when Mongoid.map_big_decimal_to_decimal128 is true' do
1496
+ config_override :map_big_decimal_to_decimal128, true
1271
1497
 
1272
- before do
1273
- band.sales = decimal.to_i
1498
+ let(:band) do
1499
+ Band.new(name: "Tool")
1274
1500
  end
1275
1501
 
1276
- it "properly persists as a string" do
1277
- expect(band.attributes["sales"]).to eq("1000000")
1502
+ let(:decimal) do
1503
+ BigDecimal("1000000.00")
1278
1504
  end
1279
1505
 
1280
- it "returns the proper big decimal" do
1281
- expect(band.sales).to eq(decimal)
1506
+ context "when setting to a big decimal" do
1507
+
1508
+ before do
1509
+ band.sales = decimal
1510
+ end
1511
+
1512
+ it "properly persists as a BSON::Decimal128" do
1513
+ expect(band.attributes["sales"]).to eq(BSON::Decimal128.new(decimal))
1514
+ end
1515
+
1516
+ it "returns the proper big decimal" do
1517
+ expect(band.sales).to eq(decimal)
1518
+ end
1282
1519
  end
1283
- end
1284
1520
 
1285
- context "when setting to a float" do
1521
+ context "when setting to a string" do
1286
1522
 
1287
- before do
1288
- band.sales = decimal.to_f
1523
+ before do
1524
+ band.sales = decimal.to_s
1525
+ end
1526
+
1527
+ it "persists as a BSON::Decimal128" do
1528
+ expect(band.attributes["sales"]).to eq(BSON::Decimal128.new(decimal.to_s))
1529
+ end
1530
+
1531
+ it "returns the proper big decimal" do
1532
+ expect(band.sales).to eq(decimal)
1533
+ end
1289
1534
  end
1290
1535
 
1291
- it "properly persists as a string" do
1292
- expect(band.attributes["sales"]).to eq(decimal.to_s)
1536
+ context "when setting to an integer" do
1537
+
1538
+ before do
1539
+ band.sales = decimal.to_i
1540
+ end
1541
+
1542
+ it "persists as a BSON::Decimal128" do
1543
+ expect(band.attributes["sales"]).to eq(BSON::Decimal128.new(decimal.to_i.to_s))
1544
+ end
1545
+
1546
+ it "returns the proper big decimal" do
1547
+ expect(band.sales).to eq(decimal)
1548
+ end
1293
1549
  end
1294
1550
 
1295
- it "returns the proper big decimal" do
1296
- expect(band.sales).to eq(decimal)
1551
+ context "when setting to a float" do
1552
+
1553
+ before do
1554
+ band.sales = decimal.to_f
1555
+ end
1556
+
1557
+ it "properly persists as a BSON::Decimal128" do
1558
+ expect(band.attributes["sales"]).to eq(BSON::Decimal128.new(decimal.to_f.to_s))
1559
+ end
1560
+
1561
+ it "returns the proper big decimal" do
1562
+ expect(band.sales).to eq(decimal)
1563
+ end
1297
1564
  end
1298
1565
  end
1299
1566
  end
@@ -1578,12 +1845,12 @@ describe Mongoid::Fields do
1578
1845
 
1579
1846
  context 'given nil' do
1580
1847
  subject { Person.database_field_name(nil) }
1581
- it { is_expected.to eq nil }
1848
+ it { is_expected.to eq '' }
1582
1849
  end
1583
1850
 
1584
1851
  context 'given an empty String' do
1585
1852
  subject { Person.database_field_name('') }
1586
- it { is_expected.to eq nil }
1853
+ it { is_expected.to eq '' }
1587
1854
  end
1588
1855
 
1589
1856
  context 'given a String' do
@@ -1602,7 +1869,7 @@ describe Mongoid::Fields do
1602
1869
 
1603
1870
  context 'given nil' do
1604
1871
  subject { Person.database_field_name(nil) }
1605
- it { is_expected.to eq nil }
1872
+ it { is_expected.to eq '' }
1606
1873
  end
1607
1874
 
1608
1875
  context 'given an empty String' do
@@ -1620,6 +1887,33 @@ describe Mongoid::Fields do
1620
1887
  it_behaves_like 'pre-fix database_field_name'
1621
1888
  end
1622
1889
  end
1890
+
1891
+ context 'when getting the database field name of a belongs_to associations' do
1892
+ # These tests only apply when the flag is not set
1893
+ config_override :broken_alias_handling, false
1894
+
1895
+ context "when the broken_alias_handling is not set" do
1896
+ context "when the association is the last item" do
1897
+ let(:name) do
1898
+ Game.database_field_name("person")
1899
+ end
1900
+
1901
+ it "gets the alias" do
1902
+ expect(name).to eq("person_id")
1903
+ end
1904
+ end
1905
+
1906
+ context "when the association is not the last item" do
1907
+ let(:name) do
1908
+ Game.database_field_name("person.name")
1909
+ end
1910
+
1911
+ it "gets the alias" do
1912
+ expect(name).to eq("person.name")
1913
+ end
1914
+ end
1915
+ end
1916
+ end
1623
1917
  end
1624
1918
 
1625
1919
  describe "#get_field" do
@@ -1693,4 +1987,126 @@ describe Mongoid::Fields do
1693
1987
  end
1694
1988
  end
1695
1989
  end
1990
+
1991
+ describe "localize: :present" do
1992
+
1993
+ let(:product) do
1994
+ Product.new
1995
+ end
1996
+
1997
+ context "when assigning a non blank value" do
1998
+
1999
+ before do
2000
+ product.title = "hello"
2001
+ end
2002
+
2003
+ it "assigns the value" do
2004
+ expect(product.title).to eq("hello")
2005
+ end
2006
+
2007
+ it "populates the translations hash" do
2008
+ expect(product.title_translations).to eq({ "en" => "hello" })
2009
+ end
2010
+ end
2011
+
2012
+ context "when assigning an empty string" do
2013
+ with_default_i18n_configs
2014
+
2015
+ before do
2016
+ I18n.locale = :en
2017
+ product.title = "hello"
2018
+ I18n.locale = :de
2019
+ product.title = "hello there!"
2020
+ product.title = ""
2021
+ end
2022
+
2023
+ it "assigns the value" do
2024
+ expect(product.title).to eq(nil)
2025
+ end
2026
+
2027
+ it "populates the translations hash" do
2028
+ expect(product.title_translations).to eq({ "en" => "hello" })
2029
+ end
2030
+ end
2031
+
2032
+ context "when assigning nil" do
2033
+ with_default_i18n_configs
2034
+
2035
+ before do
2036
+ I18n.locale = :en
2037
+ product.title = "hello"
2038
+ I18n.locale = :de
2039
+ product.title = "hello there!"
2040
+ product.title = nil
2041
+ end
2042
+
2043
+ it "assigns the value" do
2044
+ expect(product.title).to eq(nil)
2045
+ end
2046
+
2047
+ it "populates the translations hash" do
2048
+ expect(product.title_translations).to eq({ "en" => "hello" })
2049
+ end
2050
+ end
2051
+
2052
+ context "when assigning an empty array" do
2053
+ with_default_i18n_configs
2054
+
2055
+ before do
2056
+ I18n.locale = :en
2057
+ product.title = "hello"
2058
+ I18n.locale = :de
2059
+ product.title = "hello there!"
2060
+ product.title = []
2061
+ end
2062
+
2063
+ it "assigns the value" do
2064
+ expect(product.title).to eq(nil)
2065
+ end
2066
+
2067
+ it "populates the translations hash" do
2068
+ expect(product.title_translations).to eq({ "en" => "hello" })
2069
+ end
2070
+ end
2071
+
2072
+ context "when assigning an empty string first" do
2073
+ with_default_i18n_configs
2074
+
2075
+ before do
2076
+ product.title = ""
2077
+ end
2078
+
2079
+ it "assigns the value" do
2080
+ expect(product.title).to eq(nil)
2081
+ end
2082
+
2083
+ it "populates the translations hash" do
2084
+ expect(product.title_translations).to eq({})
2085
+ end
2086
+ end
2087
+
2088
+ context "when assigning an empty string with only one translation" do
2089
+ with_default_i18n_configs
2090
+
2091
+ before do
2092
+ product.title = "Hello"
2093
+ product.title = ""
2094
+ product.save!
2095
+ end
2096
+
2097
+ let(:from_db) { Product.first }
2098
+
2099
+ it "assigns the value" do
2100
+ expect(product.title).to eq(nil)
2101
+ end
2102
+
2103
+ it "populates the translations hash" do
2104
+ expect(product.title_translations).to eq({})
2105
+ end
2106
+
2107
+ it "round trips an empty hash" do
2108
+ expect(from_db.title_translations).to eq({})
2109
+ end
2110
+ end
2111
+ end
1696
2112
  end