mongoid 7.5.3 → 8.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (417) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +3 -3
  4. data/README.md +6 -6
  5. data/Rakefile +25 -0
  6. data/lib/config/locales/en.yml +92 -43
  7. data/lib/mongoid/association/accessors.rb +40 -11
  8. data/lib/mongoid/association/bindable.rb +50 -2
  9. data/lib/mongoid/association/builders.rb +5 -3
  10. data/lib/mongoid/association/constrainable.rb +0 -1
  11. data/lib/mongoid/association/eager_loadable.rb +29 -7
  12. data/lib/mongoid/association/embedded/batchable.rb +34 -11
  13. data/lib/mongoid/association/embedded/cyclic.rb +1 -1
  14. data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
  15. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +2 -2
  16. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +4 -3
  17. data/lib/mongoid/association/embedded/embedded_in.rb +3 -2
  18. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
  19. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +4 -3
  20. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +69 -45
  21. data/lib/mongoid/association/embedded/embeds_many.rb +2 -2
  22. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +19 -5
  23. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +24 -5
  24. data/lib/mongoid/association/embedded/embeds_one.rb +3 -3
  25. data/lib/mongoid/association/macros.rb +8 -1
  26. data/lib/mongoid/association/many.rb +11 -7
  27. data/lib/mongoid/association/nested/many.rb +5 -4
  28. data/lib/mongoid/association/nested/nested_buildable.rb +4 -4
  29. data/lib/mongoid/association/nested/one.rb +45 -7
  30. data/lib/mongoid/association/one.rb +2 -2
  31. data/lib/mongoid/association/options.rb +9 -9
  32. data/lib/mongoid/association/proxy.rb +15 -4
  33. data/lib/mongoid/association/referenced/auto_save.rb +4 -3
  34. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  35. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  36. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +5 -6
  37. data/lib/mongoid/association/referenced/belongs_to.rb +2 -2
  38. data/lib/mongoid/association/referenced/counter_cache.rb +10 -10
  39. data/lib/mongoid/association/referenced/eager.rb +2 -2
  40. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +70 -13
  41. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +6 -3
  42. data/lib/mongoid/association/referenced/has_many/enumerable.rb +22 -30
  43. data/lib/mongoid/association/referenced/has_many/proxy.rb +29 -19
  44. data/lib/mongoid/association/referenced/has_many.rb +3 -3
  45. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  46. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +5 -5
  47. data/lib/mongoid/association/referenced/has_one/proxy.rb +9 -12
  48. data/lib/mongoid/association/referenced/has_one.rb +3 -3
  49. data/lib/mongoid/association/referenced/syncable.rb +4 -4
  50. data/lib/mongoid/association/reflections.rb +4 -4
  51. data/lib/mongoid/association/relatable.rb +44 -10
  52. data/lib/mongoid/association.rb +5 -5
  53. data/lib/mongoid/atomic/modifiers.rb +2 -2
  54. data/lib/mongoid/atomic.rb +7 -0
  55. data/lib/mongoid/attributes/dynamic.rb +4 -4
  56. data/lib/mongoid/attributes/nested.rb +6 -6
  57. data/lib/mongoid/attributes/processing.rb +37 -6
  58. data/lib/mongoid/attributes/projector.rb +2 -2
  59. data/lib/mongoid/attributes/readonly.rb +3 -3
  60. data/lib/mongoid/attributes.rb +51 -42
  61. data/lib/mongoid/changeable.rb +147 -14
  62. data/lib/mongoid/clients/options.rb +5 -1
  63. data/lib/mongoid/clients/sessions.rb +2 -14
  64. data/lib/mongoid/clients/storage_options.rb +2 -5
  65. data/lib/mongoid/clients/validators/storage.rb +3 -15
  66. data/lib/mongoid/collection_configurable.rb +58 -0
  67. data/lib/mongoid/composable.rb +2 -0
  68. data/lib/mongoid/config/defaults.rb +60 -0
  69. data/lib/mongoid/config/options.rb +3 -0
  70. data/lib/mongoid/config/validators/async_query_executor.rb +24 -0
  71. data/lib/mongoid/config/validators/client.rb +6 -6
  72. data/lib/mongoid/config/validators.rb +1 -0
  73. data/lib/mongoid/config.rb +140 -18
  74. data/lib/mongoid/contextual/aggregable/memory.rb +24 -16
  75. data/lib/mongoid/contextual/aggregable/mongo.rb +5 -5
  76. data/lib/mongoid/contextual/aggregable/none.rb +1 -1
  77. data/lib/mongoid/contextual/atomic.rb +1 -1
  78. data/lib/mongoid/contextual/geo_near.rb +7 -7
  79. data/lib/mongoid/contextual/map_reduce.rb +2 -2
  80. data/lib/mongoid/contextual/memory.rb +285 -58
  81. data/lib/mongoid/contextual/mongo/documents_loader.rb +177 -0
  82. data/lib/mongoid/contextual/mongo.rb +517 -346
  83. data/lib/mongoid/contextual/none.rb +193 -20
  84. data/lib/mongoid/contextual/queryable.rb +1 -1
  85. data/lib/mongoid/contextual.rb +14 -2
  86. data/lib/mongoid/copyable.rb +32 -8
  87. data/lib/mongoid/criteria/findable.rb +8 -5
  88. data/lib/mongoid/criteria/includable.rb +27 -22
  89. data/lib/mongoid/criteria/marshalable.rb +10 -2
  90. data/lib/mongoid/criteria/permission.rb +1 -1
  91. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -2
  92. data/lib/mongoid/criteria/queryable/extensions/array.rb +3 -16
  93. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
  94. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -2
  95. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
  96. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
  97. data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -17
  98. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -9
  99. data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
  100. data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
  101. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
  102. data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -1
  103. data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -14
  104. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -12
  105. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
  106. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
  107. data/lib/mongoid/criteria/queryable/key.rb +4 -4
  108. data/lib/mongoid/criteria/queryable/mergeable.rb +1 -1
  109. data/lib/mongoid/criteria/queryable/optional.rb +11 -17
  110. data/lib/mongoid/criteria/queryable/options.rb +2 -2
  111. data/lib/mongoid/criteria/queryable/pipeline.rb +1 -1
  112. data/lib/mongoid/criteria/queryable/selectable.rb +47 -38
  113. data/lib/mongoid/criteria/queryable/selector.rb +93 -8
  114. data/lib/mongoid/criteria/queryable/smash.rb +40 -7
  115. data/lib/mongoid/criteria/queryable/storable.rb +1 -1
  116. data/lib/mongoid/criteria/queryable.rb +12 -7
  117. data/lib/mongoid/criteria/scopable.rb +2 -2
  118. data/lib/mongoid/criteria/translator.rb +45 -0
  119. data/lib/mongoid/criteria.rb +20 -40
  120. data/lib/mongoid/deprecable.rb +36 -0
  121. data/lib/mongoid/deprecation.rb +25 -0
  122. data/lib/mongoid/document.rb +127 -35
  123. data/lib/mongoid/equality.rb +8 -8
  124. data/lib/mongoid/errors/create_collection_failure.rb +33 -0
  125. data/lib/mongoid/errors/document_not_found.rb +10 -6
  126. data/lib/mongoid/errors/drop_collection_failure.rb +27 -0
  127. data/lib/mongoid/errors/immutable_attribute.rb +26 -0
  128. data/lib/mongoid/errors/invalid_async_query_executor.rb +25 -0
  129. data/lib/mongoid/errors/invalid_config_option.rb +1 -1
  130. data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -1
  131. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  132. data/lib/mongoid/errors/invalid_field.rb +6 -2
  133. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  134. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +22 -0
  135. data/lib/mongoid/errors/invalid_relation.rb +1 -1
  136. data/lib/mongoid/errors/invalid_relation_option.rb +1 -1
  137. data/lib/mongoid/errors/invalid_session_use.rb +1 -1
  138. data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
  139. data/lib/mongoid/errors/invalid_storage_parent.rb +2 -0
  140. data/lib/mongoid/errors/mongoid_error.rb +3 -3
  141. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -1
  142. data/lib/mongoid/errors/no_client_database.rb +1 -1
  143. data/lib/mongoid/errors/no_client_hosts.rb +1 -1
  144. data/lib/mongoid/errors/readonly_attribute.rb +1 -1
  145. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  146. data/lib/mongoid/errors/unknown_attribute.rb +1 -1
  147. data/lib/mongoid/errors.rb +6 -3
  148. data/lib/mongoid/extensions/array.rb +9 -7
  149. data/lib/mongoid/extensions/big_decimal.rb +33 -10
  150. data/lib/mongoid/extensions/binary.rb +42 -0
  151. data/lib/mongoid/extensions/boolean.rb +8 -2
  152. data/lib/mongoid/extensions/date.rb +26 -20
  153. data/lib/mongoid/extensions/date_time.rb +1 -1
  154. data/lib/mongoid/extensions/false_class.rb +1 -1
  155. data/lib/mongoid/extensions/float.rb +7 -4
  156. data/lib/mongoid/extensions/hash.rb +19 -8
  157. data/lib/mongoid/extensions/integer.rb +7 -4
  158. data/lib/mongoid/extensions/module.rb +1 -1
  159. data/lib/mongoid/extensions/object.rb +10 -8
  160. data/lib/mongoid/extensions/range.rb +41 -10
  161. data/lib/mongoid/extensions/regexp.rb +11 -4
  162. data/lib/mongoid/extensions/set.rb +11 -4
  163. data/lib/mongoid/extensions/string.rb +11 -22
  164. data/lib/mongoid/extensions/symbol.rb +4 -15
  165. data/lib/mongoid/extensions/time.rb +29 -16
  166. data/lib/mongoid/extensions/time_with_zone.rb +1 -2
  167. data/lib/mongoid/extensions/true_class.rb +1 -1
  168. data/lib/mongoid/extensions.rb +1 -0
  169. data/lib/mongoid/factory.rb +55 -7
  170. data/lib/mongoid/fields/foreign_key.rb +11 -4
  171. data/lib/mongoid/fields/localized.rb +19 -4
  172. data/lib/mongoid/fields/standard.rb +17 -7
  173. data/lib/mongoid/fields/validators/macro.rb +3 -9
  174. data/lib/mongoid/fields.rb +129 -20
  175. data/lib/mongoid/findable.rb +54 -24
  176. data/lib/mongoid/indexable/specification.rb +2 -2
  177. data/lib/mongoid/indexable/validators/options.rb +6 -2
  178. data/lib/mongoid/interceptable.rb +76 -15
  179. data/lib/mongoid/matchable.rb +1 -1
  180. data/lib/mongoid/matcher/eq_impl.rb +1 -1
  181. data/lib/mongoid/matcher/type.rb +1 -1
  182. data/lib/mongoid/matcher.rb +33 -13
  183. data/lib/mongoid/persistable/creatable.rb +19 -9
  184. data/lib/mongoid/persistable/deletable.rb +2 -2
  185. data/lib/mongoid/persistable/destroyable.rb +1 -1
  186. data/lib/mongoid/persistable/savable.rb +14 -2
  187. data/lib/mongoid/persistable/unsettable.rb +2 -2
  188. data/lib/mongoid/persistable/updatable.rb +69 -12
  189. data/lib/mongoid/persistable/upsertable.rb +21 -2
  190. data/lib/mongoid/persistable.rb +6 -3
  191. data/lib/mongoid/persistence_context.rb +6 -4
  192. data/lib/mongoid/query_cache.rb +13 -261
  193. data/lib/mongoid/railties/controller_runtime.rb +1 -1
  194. data/lib/mongoid/railties/database.rake +7 -2
  195. data/lib/mongoid/reloadable.rb +10 -8
  196. data/lib/mongoid/scopable.rb +15 -13
  197. data/lib/mongoid/selectable.rb +1 -2
  198. data/lib/mongoid/serializable.rb +10 -6
  199. data/lib/mongoid/stateful.rb +57 -10
  200. data/lib/mongoid/tasks/database.rake +12 -0
  201. data/lib/mongoid/tasks/database.rb +20 -2
  202. data/lib/mongoid/threaded/lifecycle.rb +5 -5
  203. data/lib/mongoid/threaded.rb +42 -12
  204. data/lib/mongoid/timestamps/created.rb +1 -1
  205. data/lib/mongoid/timestamps/updated.rb +2 -2
  206. data/lib/mongoid/touchable.rb +2 -3
  207. data/lib/mongoid/traversable.rb +5 -4
  208. data/lib/mongoid/utils.rb +22 -0
  209. data/lib/mongoid/validatable/localizable.rb +1 -1
  210. data/lib/mongoid/validatable/macros.rb +5 -7
  211. data/lib/mongoid/validatable/presence.rb +2 -2
  212. data/lib/mongoid/validatable/uniqueness.rb +9 -8
  213. data/lib/mongoid/validatable.rb +9 -6
  214. data/lib/mongoid/version.rb +1 -1
  215. data/lib/mongoid/warnings.rb +19 -4
  216. data/lib/mongoid.rb +17 -3
  217. data/spec/config/mongoid.yml +16 -0
  218. data/spec/integration/app_spec.rb +10 -14
  219. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  220. data/spec/integration/associations/embedded_spec.rb +15 -0
  221. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  222. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  223. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  224. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  225. data/spec/integration/associations/has_one_spec.rb +97 -1
  226. data/spec/integration/associations/scope_option_spec.rb +1 -1
  227. data/spec/integration/callbacks_models.rb +132 -1
  228. data/spec/integration/callbacks_spec.rb +360 -4
  229. data/spec/integration/criteria/range_spec.rb +95 -1
  230. data/spec/integration/discriminator_key_spec.rb +118 -80
  231. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  232. data/spec/integration/i18n_fallbacks_spec.rb +3 -32
  233. data/spec/integration/matcher_examples_spec.rb +20 -13
  234. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  235. data/spec/integration/matcher_operator_spec.rb +3 -5
  236. data/spec/integration/persistence/range_field_spec.rb +350 -0
  237. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  238. data/spec/mongoid/association/depending_spec.rb +9 -9
  239. data/spec/mongoid/association/eager_spec.rb +2 -1
  240. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  241. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  242. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +96 -9
  243. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  244. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +255 -65
  245. data/spec/mongoid/association/embedded/embeds_many_models.rb +37 -0
  246. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
  247. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  248. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  249. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +15 -2
  250. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  251. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  252. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  253. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  254. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
  255. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  256. data/spec/mongoid/association/referenced/belongs_to_spec.rb +4 -20
  257. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +186 -229
  258. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  259. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  260. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  261. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
  262. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +173 -177
  263. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  264. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  265. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  266. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  267. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  268. data/spec/mongoid/association/syncable_spec.rb +15 -1
  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_spec.rb +510 -33
  274. data/spec/mongoid/changeable_spec.rb +429 -37
  275. data/spec/mongoid/clients/factory_spec.rb +23 -30
  276. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  277. data/spec/mongoid/clients_spec.rb +149 -15
  278. data/spec/mongoid/collection_configurable_spec.rb +158 -0
  279. data/spec/mongoid/config/defaults_spec.rb +160 -0
  280. data/spec/mongoid/config_spec.rb +214 -31
  281. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  282. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  283. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  284. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  285. data/spec/mongoid/contextual/memory_spec.rb +850 -88
  286. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
  287. data/spec/mongoid/contextual/mongo_spec.rb +1572 -435
  288. data/spec/mongoid/contextual/none_spec.rb +60 -21
  289. data/spec/mongoid/copyable_spec.rb +453 -11
  290. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  291. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  292. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  293. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  294. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  295. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  296. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  297. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  298. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  299. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  300. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +4 -69
  301. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
  302. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  303. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  304. data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -484
  305. data/spec/mongoid/criteria/queryable/options_spec.rb +1 -1
  306. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +469 -0
  307. data/spec/mongoid/criteria/queryable/selectable_spec.rb +78 -86
  308. data/spec/mongoid/criteria/queryable/selector_spec.rb +90 -5
  309. data/spec/mongoid/criteria/queryable/storable_spec.rb +72 -0
  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 +32 -41
  315. data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
  316. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  317. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  318. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  319. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  320. data/spec/mongoid/errors/readonly_document_spec.rb +2 -2
  321. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  322. data/spec/mongoid/extensions/array_spec.rb +16 -2
  323. data/spec/mongoid/extensions/big_decimal_spec.rb +712 -212
  324. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  325. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  326. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  327. data/spec/mongoid/extensions/date_spec.rb +71 -1
  328. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  329. data/spec/mongoid/extensions/float_spec.rb +53 -74
  330. data/spec/mongoid/extensions/hash_spec.rb +33 -3
  331. data/spec/mongoid/extensions/integer_spec.rb +50 -64
  332. data/spec/mongoid/extensions/range_spec.rb +255 -54
  333. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  334. data/spec/mongoid/extensions/set_spec.rb +106 -0
  335. data/spec/mongoid/extensions/string_spec.rb +53 -25
  336. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  337. data/spec/mongoid/extensions/time_spec.rb +639 -106
  338. data/spec/mongoid/extensions/time_with_zone_spec.rb +24 -83
  339. data/spec/mongoid/factory_spec.rb +61 -1
  340. data/spec/mongoid/fields/localized_spec.rb +80 -37
  341. data/spec/mongoid/fields_spec.rb +500 -84
  342. data/spec/mongoid/findable_spec.rb +450 -58
  343. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  344. data/spec/mongoid/indexable_spec.rb +55 -30
  345. data/spec/mongoid/interceptable_spec.rb +599 -8
  346. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  347. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  348. data/spec/mongoid/mongoizable_spec.rb +285 -0
  349. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  350. data/spec/mongoid/persistable/deletable_spec.rb +28 -8
  351. data/spec/mongoid/persistable/destroyable_spec.rb +28 -8
  352. data/spec/mongoid/persistable/incrementable_spec.rb +37 -0
  353. data/spec/mongoid/persistable/logical_spec.rb +37 -0
  354. data/spec/mongoid/persistable/poppable_spec.rb +36 -0
  355. data/spec/mongoid/persistable/pullable_spec.rb +72 -0
  356. data/spec/mongoid/persistable/pushable_spec.rb +72 -0
  357. data/spec/mongoid/persistable/renamable_spec.rb +36 -0
  358. data/spec/mongoid/persistable/savable_spec.rb +96 -0
  359. data/spec/mongoid/persistable/settable_spec.rb +37 -0
  360. data/spec/mongoid/persistable/unsettable_spec.rb +36 -0
  361. data/spec/mongoid/persistable/updatable_spec.rb +20 -28
  362. data/spec/mongoid/persistable/upsertable_spec.rb +89 -1
  363. data/spec/mongoid/persistence_context_spec.rb +31 -57
  364. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  365. data/spec/mongoid/query_cache_spec.rb +56 -215
  366. data/spec/mongoid/reloadable_spec.rb +83 -6
  367. data/spec/mongoid/scopable_spec.rb +91 -1
  368. data/spec/mongoid/serializable_spec.rb +9 -30
  369. data/spec/mongoid/shardable_spec.rb +4 -4
  370. data/spec/mongoid/stateful_spec.rb +150 -8
  371. data/spec/mongoid/tasks/database_rake_spec.rb +74 -0
  372. data/spec/mongoid/tasks/database_spec.rb +127 -0
  373. data/spec/mongoid/timestamps_spec.rb +392 -4
  374. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  375. data/spec/mongoid/touchable_spec.rb +390 -2
  376. data/spec/mongoid/touchable_spec_models.rb +14 -8
  377. data/spec/mongoid/traversable_spec.rb +13 -35
  378. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  379. data/spec/mongoid/validatable/uniqueness_spec.rb +58 -31
  380. data/spec/mongoid/warnings_spec.rb +35 -0
  381. data/spec/mongoid_spec.rb +34 -16
  382. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  383. data/spec/rails/mongoid_spec.rb +4 -16
  384. data/spec/spec_helper.rb +5 -0
  385. data/spec/support/constraints.rb +24 -0
  386. data/spec/support/immutable_ids.rb +118 -0
  387. data/spec/support/macros.rb +78 -0
  388. data/spec/support/models/artist.rb +0 -1
  389. data/spec/support/models/augmentation.rb +12 -0
  390. data/spec/support/models/band.rb +4 -0
  391. data/spec/support/models/book.rb +1 -0
  392. data/spec/support/models/building.rb +2 -0
  393. data/spec/support/models/catalog.rb +24 -0
  394. data/spec/support/models/circus.rb +3 -0
  395. data/spec/support/models/cover.rb +10 -0
  396. data/spec/support/models/fanatic.rb +8 -0
  397. data/spec/support/models/implant.rb +9 -0
  398. data/spec/support/models/label.rb +2 -0
  399. data/spec/support/models/passport.rb +9 -0
  400. data/spec/support/models/person.rb +2 -0
  401. data/spec/support/models/player.rb +2 -0
  402. data/spec/support/models/powerup.rb +12 -0
  403. data/spec/support/models/product.rb +1 -0
  404. data/spec/support/models/purse.rb +9 -0
  405. data/spec/support/models/registry.rb +1 -0
  406. data/spec/support/models/school.rb +14 -0
  407. data/spec/support/models/shield.rb +18 -0
  408. data/spec/support/models/student.rb +14 -0
  409. data/spec/support/models/weapon.rb +12 -0
  410. data.tar.gz.sig +0 -0
  411. metadata +718 -641
  412. metadata.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
@@ -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
@@ -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