mongoid 7.5.4 → 8.1.3

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 (421) 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/lib/config/locales/en.yml +92 -43
  6. data/lib/mongoid/association/accessors.rb +40 -11
  7. data/lib/mongoid/association/bindable.rb +50 -2
  8. data/lib/mongoid/association/builders.rb +5 -3
  9. data/lib/mongoid/association/constrainable.rb +0 -1
  10. data/lib/mongoid/association/eager_loadable.rb +29 -7
  11. data/lib/mongoid/association/embedded/batchable.rb +34 -11
  12. data/lib/mongoid/association/embedded/cyclic.rb +1 -1
  13. data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
  14. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +2 -2
  15. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +4 -3
  16. data/lib/mongoid/association/embedded/embedded_in.rb +3 -2
  17. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
  18. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +4 -3
  19. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +69 -45
  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 +29 -19
  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 +7 -0
  54. data/lib/mongoid/attributes/dynamic.rb +4 -4
  55. data/lib/mongoid/attributes/nested.rb +6 -6
  56. data/lib/mongoid/attributes/processing.rb +37 -6
  57. data/lib/mongoid/attributes/projector.rb +2 -2
  58. data/lib/mongoid/attributes/readonly.rb +3 -3
  59. data/lib/mongoid/attributes.rb +51 -42
  60. data/lib/mongoid/changeable.rb +147 -14
  61. data/lib/mongoid/clients/options.rb +5 -1
  62. data/lib/mongoid/clients/sessions.rb +2 -14
  63. data/lib/mongoid/clients/storage_options.rb +2 -5
  64. data/lib/mongoid/clients/validators/storage.rb +3 -15
  65. data/lib/mongoid/collection_configurable.rb +58 -0
  66. data/lib/mongoid/composable.rb +2 -0
  67. data/lib/mongoid/config/defaults.rb +60 -0
  68. data/lib/mongoid/config/options.rb +3 -0
  69. data/lib/mongoid/config/validators/async_query_executor.rb +24 -0
  70. data/lib/mongoid/config/validators/client.rb +6 -6
  71. data/lib/mongoid/config/validators.rb +1 -0
  72. data/lib/mongoid/config.rb +153 -18
  73. data/lib/mongoid/contextual/aggregable/memory.rb +24 -16
  74. data/lib/mongoid/contextual/aggregable/mongo.rb +5 -5
  75. data/lib/mongoid/contextual/aggregable/none.rb +1 -1
  76. data/lib/mongoid/contextual/atomic.rb +1 -1
  77. data/lib/mongoid/contextual/geo_near.rb +7 -7
  78. data/lib/mongoid/contextual/map_reduce.rb +2 -2
  79. data/lib/mongoid/contextual/memory.rb +285 -58
  80. data/lib/mongoid/contextual/mongo/documents_loader.rb +177 -0
  81. data/lib/mongoid/contextual/mongo.rb +540 -346
  82. data/lib/mongoid/contextual/none.rb +193 -20
  83. data/lib/mongoid/contextual/queryable.rb +1 -1
  84. data/lib/mongoid/contextual.rb +14 -2
  85. data/lib/mongoid/copyable.rb +32 -8
  86. data/lib/mongoid/criteria/findable.rb +8 -5
  87. data/lib/mongoid/criteria/includable.rb +27 -22
  88. data/lib/mongoid/criteria/marshalable.rb +10 -2
  89. data/lib/mongoid/criteria/permission.rb +1 -1
  90. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -2
  91. data/lib/mongoid/criteria/queryable/extensions/array.rb +3 -16
  92. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
  93. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -2
  94. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
  95. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
  96. data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -17
  97. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -9
  98. data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
  99. data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
  100. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
  101. data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -1
  102. data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -14
  103. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -12
  104. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
  105. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
  106. data/lib/mongoid/criteria/queryable/key.rb +4 -4
  107. data/lib/mongoid/criteria/queryable/mergeable.rb +1 -1
  108. data/lib/mongoid/criteria/queryable/optional.rb +11 -17
  109. data/lib/mongoid/criteria/queryable/options.rb +2 -2
  110. data/lib/mongoid/criteria/queryable/pipeline.rb +1 -1
  111. data/lib/mongoid/criteria/queryable/selectable.rb +47 -38
  112. data/lib/mongoid/criteria/queryable/selector.rb +92 -7
  113. data/lib/mongoid/criteria/queryable/smash.rb +40 -7
  114. data/lib/mongoid/criteria/queryable.rb +12 -7
  115. data/lib/mongoid/criteria/scopable.rb +2 -2
  116. data/lib/mongoid/criteria/translator.rb +45 -0
  117. data/lib/mongoid/criteria.rb +20 -40
  118. data/lib/mongoid/deprecable.rb +37 -0
  119. data/lib/mongoid/deprecation.rb +25 -0
  120. data/lib/mongoid/document.rb +127 -35
  121. data/lib/mongoid/equality.rb +8 -8
  122. data/lib/mongoid/errors/create_collection_failure.rb +33 -0
  123. data/lib/mongoid/errors/document_not_found.rb +10 -6
  124. data/lib/mongoid/errors/drop_collection_failure.rb +27 -0
  125. data/lib/mongoid/errors/immutable_attribute.rb +26 -0
  126. data/lib/mongoid/errors/invalid_async_query_executor.rb +25 -0
  127. data/lib/mongoid/errors/invalid_config_option.rb +1 -1
  128. data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -1
  129. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  130. data/lib/mongoid/errors/invalid_field.rb +6 -2
  131. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  132. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +22 -0
  133. data/lib/mongoid/errors/invalid_relation.rb +1 -1
  134. data/lib/mongoid/errors/invalid_relation_option.rb +1 -1
  135. data/lib/mongoid/errors/invalid_session_use.rb +1 -1
  136. data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
  137. data/lib/mongoid/errors/invalid_storage_parent.rb +2 -0
  138. data/lib/mongoid/errors/mongoid_error.rb +3 -3
  139. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -1
  140. data/lib/mongoid/errors/no_client_database.rb +1 -1
  141. data/lib/mongoid/errors/no_client_hosts.rb +1 -1
  142. data/lib/mongoid/errors/readonly_attribute.rb +1 -1
  143. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  144. data/lib/mongoid/errors/unknown_attribute.rb +1 -1
  145. data/lib/mongoid/errors.rb +6 -3
  146. data/lib/mongoid/extensions/array.rb +9 -7
  147. data/lib/mongoid/extensions/big_decimal.rb +33 -10
  148. data/lib/mongoid/extensions/binary.rb +42 -0
  149. data/lib/mongoid/extensions/boolean.rb +8 -2
  150. data/lib/mongoid/extensions/date.rb +26 -20
  151. data/lib/mongoid/extensions/date_time.rb +1 -1
  152. data/lib/mongoid/extensions/false_class.rb +1 -1
  153. data/lib/mongoid/extensions/float.rb +7 -4
  154. data/lib/mongoid/extensions/hash.rb +37 -8
  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 +129 -20
  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 +188 -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 +33 -13
  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 +10 -6
  197. data/lib/mongoid/stateful.rb +57 -10
  198. data/lib/mongoid/tasks/database.rake +12 -0
  199. data/lib/mongoid/tasks/database.rb +20 -2
  200. data/lib/mongoid/threaded/lifecycle.rb +5 -5
  201. data/lib/mongoid/threaded.rb +42 -12
  202. data/lib/mongoid/timestamps/created.rb +1 -1
  203. data/lib/mongoid/timestamps/updated.rb +2 -2
  204. data/lib/mongoid/touchable.rb +2 -3
  205. data/lib/mongoid/traversable.rb +5 -4
  206. data/lib/mongoid/utils.rb +22 -0
  207. data/lib/mongoid/validatable/localizable.rb +1 -1
  208. data/lib/mongoid/validatable/macros.rb +5 -7
  209. data/lib/mongoid/validatable/presence.rb +2 -2
  210. data/lib/mongoid/validatable/uniqueness.rb +9 -8
  211. data/lib/mongoid/validatable.rb +9 -6
  212. data/lib/mongoid/version.rb +1 -1
  213. data/lib/mongoid/warnings.rb +19 -4
  214. data/lib/mongoid.rb +17 -3
  215. data/spec/config/mongoid.yml +16 -0
  216. data/spec/integration/app_spec.rb +10 -14
  217. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  218. data/spec/integration/associations/embedded_spec.rb +15 -0
  219. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  220. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  221. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  222. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  223. data/spec/integration/associations/has_one_spec.rb +97 -1
  224. data/spec/integration/associations/scope_option_spec.rb +1 -1
  225. data/spec/integration/callbacks_models.rb +132 -1
  226. data/spec/integration/callbacks_spec.rb +381 -4
  227. data/spec/integration/criteria/range_spec.rb +95 -1
  228. data/spec/integration/discriminator_key_spec.rb +118 -80
  229. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  230. data/spec/integration/i18n_fallbacks_spec.rb +3 -32
  231. data/spec/integration/matcher_examples_spec.rb +20 -13
  232. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  233. data/spec/integration/matcher_operator_spec.rb +3 -5
  234. data/spec/integration/persistence/range_field_spec.rb +350 -0
  235. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  236. data/spec/mongoid/association/depending_spec.rb +9 -9
  237. data/spec/mongoid/association/eager_spec.rb +2 -1
  238. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  239. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  240. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +96 -9
  241. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  242. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +255 -65
  243. data/spec/mongoid/association/embedded/embeds_many_models.rb +37 -0
  244. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
  245. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  246. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  247. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +15 -2
  248. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  249. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  250. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  251. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  252. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
  253. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  254. data/spec/mongoid/association/referenced/belongs_to_spec.rb +4 -20
  255. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +186 -229
  256. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  257. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  258. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  259. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
  260. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +173 -177
  261. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  262. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  263. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  264. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  265. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  266. data/spec/mongoid/association/syncable_spec.rb +15 -1
  267. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  268. data/spec/mongoid/attributes/nested_spec.rb +80 -11
  269. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  270. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  271. data/spec/mongoid/attributes_spec.rb +510 -33
  272. data/spec/mongoid/changeable_spec.rb +429 -37
  273. data/spec/mongoid/clients/factory_spec.rb +23 -30
  274. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  275. data/spec/mongoid/clients_spec.rb +149 -15
  276. data/spec/mongoid/collection_configurable_spec.rb +158 -0
  277. data/spec/mongoid/config/defaults_spec.rb +160 -0
  278. data/spec/mongoid/config_spec.rb +214 -31
  279. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  280. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  281. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  282. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  283. data/spec/mongoid/contextual/memory_spec.rb +850 -88
  284. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
  285. data/spec/mongoid/contextual/mongo_spec.rb +2309 -1127
  286. data/spec/mongoid/contextual/none_spec.rb +60 -21
  287. data/spec/mongoid/copyable_spec.rb +453 -11
  288. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  289. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  290. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  291. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  292. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  293. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  294. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  295. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  296. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  297. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  298. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +4 -69
  299. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
  300. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  301. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  302. data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -484
  303. data/spec/mongoid/criteria/queryable/options_spec.rb +1 -1
  304. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +469 -0
  305. data/spec/mongoid/criteria/queryable/selectable_spec.rb +78 -86
  306. data/spec/mongoid/criteria/queryable/selector_spec.rb +15 -3
  307. data/spec/mongoid/criteria/translator_spec.rb +132 -0
  308. data/spec/mongoid/criteria_projection_spec.rb +1 -5
  309. data/spec/mongoid/criteria_spec.rb +469 -1205
  310. data/spec/mongoid/document_fields_spec.rb +173 -24
  311. data/spec/mongoid/document_spec.rb +32 -41
  312. data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
  313. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  314. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  315. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  316. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  317. data/spec/mongoid/errors/readonly_document_spec.rb +2 -2
  318. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  319. data/spec/mongoid/extensions/array_spec.rb +16 -2
  320. data/spec/mongoid/extensions/big_decimal_spec.rb +712 -212
  321. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  322. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  323. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  324. data/spec/mongoid/extensions/date_spec.rb +71 -1
  325. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  326. data/spec/mongoid/extensions/float_spec.rb +53 -74
  327. data/spec/mongoid/extensions/hash_spec.rb +33 -3
  328. data/spec/mongoid/extensions/integer_spec.rb +50 -64
  329. data/spec/mongoid/extensions/range_spec.rb +255 -54
  330. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  331. data/spec/mongoid/extensions/set_spec.rb +106 -0
  332. data/spec/mongoid/extensions/string_spec.rb +53 -25
  333. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  334. data/spec/mongoid/extensions/time_spec.rb +639 -106
  335. data/spec/mongoid/extensions/time_with_zone_spec.rb +24 -83
  336. data/spec/mongoid/factory_spec.rb +61 -1
  337. data/spec/mongoid/fields/localized_spec.rb +80 -37
  338. data/spec/mongoid/fields_spec.rb +500 -84
  339. data/spec/mongoid/findable_spec.rb +450 -58
  340. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  341. data/spec/mongoid/indexable_spec.rb +55 -30
  342. data/spec/mongoid/interceptable_spec.rb +824 -22
  343. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  344. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  345. data/spec/mongoid/mongoizable_spec.rb +285 -0
  346. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  347. data/spec/mongoid/persistable/deletable_spec.rb +28 -8
  348. data/spec/mongoid/persistable/destroyable_spec.rb +28 -8
  349. data/spec/mongoid/persistable/incrementable_spec.rb +37 -0
  350. data/spec/mongoid/persistable/logical_spec.rb +37 -0
  351. data/spec/mongoid/persistable/poppable_spec.rb +36 -0
  352. data/spec/mongoid/persistable/pullable_spec.rb +72 -0
  353. data/spec/mongoid/persistable/pushable_spec.rb +72 -0
  354. data/spec/mongoid/persistable/renamable_spec.rb +36 -0
  355. data/spec/mongoid/persistable/savable_spec.rb +96 -0
  356. data/spec/mongoid/persistable/settable_spec.rb +37 -0
  357. data/spec/mongoid/persistable/unsettable_spec.rb +36 -0
  358. data/spec/mongoid/persistable/updatable_spec.rb +20 -28
  359. data/spec/mongoid/persistable/upsertable_spec.rb +89 -1
  360. data/spec/mongoid/persistence_context_spec.rb +31 -57
  361. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  362. data/spec/mongoid/query_cache_spec.rb +56 -215
  363. data/spec/mongoid/reloadable_spec.rb +83 -6
  364. data/spec/mongoid/scopable_spec.rb +91 -1
  365. data/spec/mongoid/serializable_spec.rb +9 -30
  366. data/spec/mongoid/shardable_spec.rb +4 -4
  367. data/spec/mongoid/stateful_spec.rb +150 -8
  368. data/spec/mongoid/tasks/database_rake_spec.rb +74 -0
  369. data/spec/mongoid/tasks/database_spec.rb +127 -0
  370. data/spec/mongoid/timestamps_spec.rb +392 -4
  371. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  372. data/spec/mongoid/touchable_spec.rb +390 -2
  373. data/spec/mongoid/touchable_spec_models.rb +14 -8
  374. data/spec/mongoid/traversable_spec.rb +13 -35
  375. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  376. data/spec/mongoid/validatable/uniqueness_spec.rb +58 -31
  377. data/spec/mongoid/warnings_spec.rb +35 -0
  378. data/spec/mongoid_spec.rb +34 -16
  379. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  380. data/spec/rails/mongoid_spec.rb +4 -16
  381. data/spec/shared/lib/mrss/docker_runner.rb +8 -0
  382. data/spec/shared/lib/mrss/lite_constraints.rb +2 -2
  383. data/spec/shared/lib/mrss/server_version_registry.rb +16 -23
  384. data/spec/shared/lib/mrss/utils.rb +28 -6
  385. data/spec/shared/share/Dockerfile.erb +36 -40
  386. data/spec/shared/shlib/server.sh +28 -4
  387. data/spec/shared/shlib/set_env.sh +4 -4
  388. data/spec/spec_helper.rb +5 -0
  389. data/spec/support/constraints.rb +24 -0
  390. data/spec/support/immutable_ids.rb +118 -0
  391. data/spec/support/macros.rb +78 -0
  392. data/spec/support/models/artist.rb +0 -1
  393. data/spec/support/models/augmentation.rb +12 -0
  394. data/spec/support/models/band.rb +4 -0
  395. data/spec/support/models/book.rb +1 -0
  396. data/spec/support/models/building.rb +2 -0
  397. data/spec/support/models/catalog.rb +24 -0
  398. data/spec/support/models/circus.rb +3 -0
  399. data/spec/support/models/cover.rb +10 -0
  400. data/spec/support/models/fanatic.rb +8 -0
  401. data/spec/support/models/implant.rb +9 -0
  402. data/spec/support/models/label.rb +2 -0
  403. data/spec/support/models/passport.rb +9 -0
  404. data/spec/support/models/person.rb +2 -0
  405. data/spec/support/models/player.rb +2 -0
  406. data/spec/support/models/powerup.rb +12 -0
  407. data/spec/support/models/product.rb +1 -0
  408. data/spec/support/models/purse.rb +9 -0
  409. data/spec/support/models/registry.rb +1 -0
  410. data/spec/support/models/school.rb +14 -0
  411. data/spec/support/models/shield.rb +18 -0
  412. data/spec/support/models/student.rb +14 -0
  413. data/spec/support/models/weapon.rb +12 -0
  414. data.tar.gz.sig +0 -0
  415. metadata +100 -22
  416. metadata.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
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "spec_helper"
4
+ require_relative './attributes/nested_spec_models'
4
5
 
5
6
  describe Mongoid::Attributes do
6
7
 
@@ -392,11 +393,10 @@ describe Mongoid::Attributes do
392
393
  end
393
394
 
394
395
  context "when reloaded" do
396
+ config_override :raise_not_found_error, false
395
397
 
396
398
  before do
397
- Mongoid.raise_not_found_error = false
398
399
  person.reload
399
- Mongoid.raise_not_found_error = true
400
400
  end
401
401
 
402
402
  it "returns the default value" do
@@ -1029,14 +1029,13 @@ describe Mongoid::Attributes do
1029
1029
  end
1030
1030
 
1031
1031
  context "when the attribute does not exist" do
1032
+ config_override :raise_not_found_error, false
1032
1033
 
1033
1034
  before do
1034
1035
  person.collection
1035
1036
  .find({ _id: person.id })
1036
1037
  .update_one({ "$unset" => { age: 1 }})
1037
- Mongoid.raise_not_found_error = false
1038
1038
  person.reload
1039
- Mongoid.raise_not_found_error = true
1040
1039
  end
1041
1040
 
1042
1041
  it "returns the default value" do
@@ -1077,8 +1076,8 @@ describe Mongoid::Attributes do
1077
1076
  context "after the attribute has been assigned" do
1078
1077
 
1079
1078
  it "returns the default value" do
1080
- person.age = "old"
1081
- expect(person.age_before_type_cast).to eq("old")
1079
+ person.age = "42"
1080
+ expect(person.age_before_type_cast).to eq("42")
1082
1081
  end
1083
1082
  end
1084
1083
 
@@ -1160,14 +1159,13 @@ describe Mongoid::Attributes do
1160
1159
  end
1161
1160
 
1162
1161
  context "when the attribute does not exist" do
1162
+ config_override :raise_not_found_error, false
1163
1163
 
1164
1164
  before do
1165
1165
  person.collection
1166
1166
  .find({ _id: person.id })
1167
1167
  .update_one({ "$unset" => { age: 1 }})
1168
- Mongoid.raise_not_found_error = false
1169
1168
  person.reload
1170
- Mongoid.raise_not_found_error = true
1171
1169
  end
1172
1170
 
1173
1171
  it "returns true" do
@@ -1265,15 +1263,15 @@ describe Mongoid::Attributes do
1265
1263
 
1266
1264
  context "before the attribute has been assigned" do
1267
1265
 
1268
- it "returns false" do
1269
- expect(person.has_attribute_before_type_cast?(:age)).to be false
1266
+ it "returns true" do
1267
+ expect(person.has_attribute_before_type_cast?(:age)).to be true
1270
1268
  end
1271
1269
  end
1272
1270
 
1273
1271
  context "after the attribute has been assigned" do
1274
1272
 
1275
1273
  it "returns true" do
1276
- person.age = 'old'
1274
+ person.age = '42'
1277
1275
  expect(person.has_attribute_before_type_cast?(:age)).to be true
1278
1276
  end
1279
1277
  end
@@ -1528,12 +1526,13 @@ describe Mongoid::Attributes do
1528
1526
  end
1529
1527
 
1530
1528
  context "when setting an attribute that needs type casting" do
1529
+
1531
1530
  let(:person) do
1532
- Person.new(age: "old")
1531
+ Person.new(age: "42")
1533
1532
  end
1534
1533
 
1535
1534
  it "should store the attribute before type cast" do
1536
- expect(person.age_before_type_cast).to eq("old")
1535
+ expect(person.age_before_type_cast).to eq("42")
1537
1536
  end
1538
1537
  end
1539
1538
 
@@ -1581,16 +1580,14 @@ describe Mongoid::Attributes do
1581
1580
  context "when attribute is a Hash" do
1582
1581
  let(:person) { Person.new map: { somekey: "somevalue" } }
1583
1582
 
1584
- it "raises an error when trying to set a value of invalid type - array" do
1585
- expect do
1586
- person.map = []
1587
- end.to raise_error(Mongoid::Errors::InvalidValue, /Value of type Array cannot be written to a field of type Hash/)
1583
+ it "writes nil when trying to set a value of invalid type - array" do
1584
+ person.map = []
1585
+ expect(person.map).to be_nil
1588
1586
  end
1589
1587
 
1590
- it "raises an error when trying to set a value of invalid type - boolean" do
1591
- expect do
1592
- person.map = false
1593
- end.to raise_error(Mongoid::Errors::InvalidValue, /Value of type FalseClass cannot be written to a field of type Hash/)
1588
+ it "writes nil when trying to set a value of invalid type - boolean" do
1589
+ person.map = false
1590
+ expect(person.map).to be_nil
1594
1591
  end
1595
1592
 
1596
1593
  it "can set a Hash value" do
@@ -1605,16 +1602,14 @@ describe Mongoid::Attributes do
1605
1602
  expect(person.aliases).to eq([ :alias_1 ])
1606
1603
  end
1607
1604
 
1608
- it "raises an error when trying to set a value of invalid type - hash" do
1609
- expect do
1610
- person.aliases = {}
1611
- end.to raise_error(Mongoid::Errors::InvalidValue, /Value of type Hash cannot be written to a field of type Array/)
1605
+ it "writes nil when trying to set a value of invalid type - hash" do
1606
+ person.aliases = {}
1607
+ expect(person.aliases).to be_nil
1612
1608
  end
1613
1609
 
1614
- it "raises an error when trying to set a value of invalid type - boolean" do
1615
- expect do
1616
- person.aliases = false
1617
- end.to raise_error(Mongoid::Errors::InvalidValue, /Value of type FalseClass cannot be written to a field of type Array/)
1610
+ it "writes nil when trying to set a value of invalid type - boolean" do
1611
+ person.aliases = false
1612
+ expect(person.aliases).to be_nil
1618
1613
  end
1619
1614
  end
1620
1615
 
@@ -1899,11 +1894,11 @@ describe Mongoid::Attributes do
1899
1894
  end
1900
1895
 
1901
1896
  it "has 3 new entries" do
1902
- expect(pet.vet_visits.count).to eq(3)
1897
+ expect(pet.vet_visits.count).to eq 3
1903
1898
  end
1904
1899
 
1905
1900
  it "persists the changes" do
1906
- expect(pet.reload.vet_visits.count).to eq(3)
1901
+ expect(pet.reload.vet_visits.count).to eq 3
1907
1902
  end
1908
1903
  end
1909
1904
 
@@ -2073,8 +2068,8 @@ describe Mongoid::Attributes do
2073
2068
  end
2074
2069
 
2075
2070
  it "aliases *_before_type_cast" do
2076
- product.cost = "expensive"
2077
- expect(product.cost_before_type_cast).to eq("expensive")
2071
+ product.cost = "42"
2072
+ expect(product.cost_before_type_cast).to eq("42")
2078
2073
  end
2079
2074
  end
2080
2075
 
@@ -2258,4 +2253,486 @@ describe Mongoid::Attributes do
2258
2253
  end
2259
2254
  end
2260
2255
  end
2256
+
2257
+ context "when an attribute is removed then set" do
2258
+ let(:cat) { Cat.create!(name: "Neil") }
2259
+
2260
+ before do
2261
+ cat.remove_attribute("name")
2262
+ cat.name = "Nissim"
2263
+ cat.save!
2264
+ cat.reload
2265
+ end
2266
+
2267
+ it "correctly sets the attribute" do
2268
+ expect(cat.name).to eq("Nissim")
2269
+ end
2270
+ end
2271
+
2272
+ describe "attributes after setting an association without reloading" do
2273
+
2274
+ context "on embeds_many" do
2275
+
2276
+ context "when not setting anything" do
2277
+ let(:doc) { NestedBook.create! }
2278
+
2279
+ it "doesn't add attributes" do
2280
+ expect(doc.attributes).to_not have_key("pages")
2281
+ end
2282
+
2283
+ it "has the same attributes after reloading" do
2284
+ expect(doc.attributes).to eq(doc.reload.attributes)
2285
+ end
2286
+ end
2287
+
2288
+ context "when using nested attributes" do
2289
+ let(:doc) { NestedBook.create! }
2290
+
2291
+ before do
2292
+ doc.update_attributes({ pages_attributes: [ {} ] })
2293
+ end
2294
+
2295
+ it "updates the attributes" do
2296
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2297
+ end
2298
+
2299
+ it "has the same attributes after reloading" do
2300
+ expect(doc.attributes).to eq(doc.reload.attributes)
2301
+ end
2302
+ end
2303
+
2304
+ context "when doing assignments" do
2305
+ let(:doc) { NestedBook.create! }
2306
+ before do
2307
+ doc.pages = [NestedPage.new]
2308
+ end
2309
+
2310
+ it "updates the attributes" do
2311
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2312
+ end
2313
+
2314
+ it "has the same attributes after reloading" do
2315
+ expect(doc.attributes).to eq(doc.reload.attributes)
2316
+ end
2317
+ end
2318
+
2319
+ context "when replacing assignments" do
2320
+ let(:doc) { NestedBook.create! }
2321
+ before do
2322
+ doc.pages = [NestedPage.new(number: 1)]
2323
+ doc.pages = [NestedPage.new(number: 2)]
2324
+ end
2325
+
2326
+ it "updates the attributes" do
2327
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id, "number" => 2 }])
2328
+ end
2329
+
2330
+ it "has the same attributes after reloading" do
2331
+ expect(doc.attributes).to eq(doc.reload.attributes)
2332
+ end
2333
+ end
2334
+
2335
+ context "when setting to nil" do
2336
+ let(:doc) { NestedBook.create! }
2337
+ before do
2338
+ doc.pages = [NestedPage.new(number: 1)]
2339
+ doc.pages = nil
2340
+ end
2341
+
2342
+ it "updates the attributes" do
2343
+ expect(doc.attributes).to_not have_key("pages")
2344
+ end
2345
+
2346
+ it "has the same attributes after reloading" do
2347
+ expect({ "pages" => [] }.merge(doc.attributes)).to eq(doc.reload.attributes)
2348
+ end
2349
+ end
2350
+
2351
+ context "when setting to nil and back" do
2352
+ let(:doc) { NestedBook.create! }
2353
+ let(:page) { NestedPage.new }
2354
+ before do
2355
+ doc.pages = [page]
2356
+ doc.pages = nil
2357
+ doc.pages = [page]
2358
+ end
2359
+
2360
+ it "updates the attributes" do
2361
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2362
+ end
2363
+
2364
+ it "has the same attributes after reloading" do
2365
+ expect(doc.attributes).to eq(doc.reload.attributes)
2366
+ end
2367
+ end
2368
+
2369
+ context "when pushing" do
2370
+ let(:doc) { NestedBook.create! }
2371
+ before do
2372
+ doc.pages << NestedPage.new
2373
+ end
2374
+
2375
+ it "updates the attributes" do
2376
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2377
+ end
2378
+
2379
+ it "has the same attributes after reloading" do
2380
+ expect(doc.attributes).to eq(doc.reload.attributes)
2381
+ end
2382
+ end
2383
+
2384
+ [:shift, :pop].each do |meth|
2385
+ context "when performing #{meth}" do
2386
+ let(:doc) { NestedBook.create! }
2387
+ before do
2388
+ doc.pages << NestedPage.new
2389
+ doc.pages << NestedPage.new
2390
+ doc.pages << NestedPage.new
2391
+
2392
+ doc.pages.send(meth, 2)
2393
+ end
2394
+
2395
+ it "updates the attributes" do
2396
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2397
+ end
2398
+
2399
+ it "has the same attributes after reloading" do
2400
+ expect(doc.attributes).to eq(doc.reload.attributes)
2401
+ end
2402
+ end
2403
+ end
2404
+
2405
+ context "when concatting" do
2406
+ let(:doc) { NestedBook.create! }
2407
+ before do
2408
+ doc.pages << NestedPage.new
2409
+ doc.pages.concat([NestedPage.new, NestedPage.new])
2410
+ end
2411
+
2412
+ it "updates the attributes" do
2413
+ expect(doc.attributes["pages"].count).to eq 3
2414
+ end
2415
+
2416
+ it "has the same attributes after reloading" do
2417
+ expect(doc.attributes).to eq(doc.reload.attributes)
2418
+ end
2419
+ end
2420
+
2421
+ [:build, :create].each do |meth|
2422
+ context "when preforming #{meth}" do
2423
+ let(:doc) { NestedBook.create! }
2424
+ before do
2425
+ doc.pages.send(meth)
2426
+ end
2427
+
2428
+ it "updates the attributes" do
2429
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2430
+ end
2431
+
2432
+ it "has the same attributes after reloading" do
2433
+ doc.pages.first.save
2434
+ expect(doc.attributes).to eq(doc.reload.attributes)
2435
+ end
2436
+ end
2437
+ end
2438
+
2439
+ context "when clearing" do
2440
+ let(:doc) { NestedBook.create! }
2441
+ before do
2442
+ doc.pages << NestedPage.new
2443
+ doc.pages << NestedPage.new
2444
+ doc.pages << NestedPage.new
2445
+
2446
+ doc.pages.clear
2447
+ end
2448
+
2449
+ it "updates the attributes" do
2450
+ expect(doc.attributes).to_not have_key("pages")
2451
+ end
2452
+
2453
+ it "has the same attributes after reloading" do
2454
+ expect(doc.attributes).to eq(doc.reload.attributes)
2455
+ end
2456
+ end
2457
+
2458
+ [:delete_all, :destroy_all, :remove_all].each do |meth|
2459
+ context "when performing: #{meth}" do
2460
+ let(:doc) { NestedBook.create! }
2461
+ before do
2462
+ doc.pages << NestedPage.new
2463
+ doc.pages << NestedPage.new
2464
+ doc.pages << NestedPage.new
2465
+
2466
+ doc.pages.send(meth)
2467
+ end
2468
+
2469
+ it "updates the attributes" do
2470
+ expect(doc.attributes).to_not have_key("pages")
2471
+ end
2472
+
2473
+ it "has the same attributes after reloading" do
2474
+ expect({ "pages" => [] }.merge(doc.attributes)).to eq(doc.reload.attributes)
2475
+ end
2476
+ end
2477
+ end
2478
+
2479
+ context "when deleting" do
2480
+ let(:doc) { NestedBook.create! }
2481
+ let(:page) { NestedPage.new }
2482
+ before do
2483
+ doc.pages << page
2484
+ doc.pages << NestedPage.new
2485
+ doc.pages << NestedPage.new
2486
+
2487
+ doc.pages.delete(page)
2488
+ end
2489
+
2490
+ it "updates the attributes" do
2491
+ expect(doc.attributes["pages"].count).to eq 2
2492
+ end
2493
+
2494
+ it "has the same attributes after reloading" do
2495
+ expect(doc.attributes).to eq(doc.reload.attributes)
2496
+ end
2497
+ end
2498
+
2499
+ context "when doing _remove" do
2500
+ let(:doc) { NestedBook.create! }
2501
+ let(:page) { NestedPage.new }
2502
+ before do
2503
+ doc.pages << page
2504
+ doc.pages << NestedPage.new
2505
+ doc.pages << NestedPage.new
2506
+
2507
+ doc.pages._remove(page)
2508
+ end
2509
+
2510
+ it "updates the attributes" do
2511
+ expect(doc.attributes["pages"].count).to eq 2
2512
+ end
2513
+ end
2514
+
2515
+ context "when assigning an array of hashes" do
2516
+ let(:doc) { NestedBook.create! }
2517
+ before do
2518
+ doc.pages = [{}]
2519
+ end
2520
+
2521
+ it "updates the attributes" do
2522
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2523
+ end
2524
+
2525
+ it "has the same attributes after reloading" do
2526
+ expect(doc.attributes).to eq(doc.reload.attributes)
2527
+ end
2528
+ end
2529
+
2530
+ context "when assigning twice" do
2531
+ let(:doc) { NestedBook.create! }
2532
+ before do
2533
+ doc.pages = [{ number: 1 }]
2534
+ doc.pages = [{}]
2535
+ end
2536
+
2537
+ it "updates the attributes" do
2538
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2539
+ end
2540
+
2541
+ it "has the same attributes after reloading" do
2542
+ expect(doc.attributes).to eq(doc.reload.attributes)
2543
+ end
2544
+ end
2545
+ end
2546
+
2547
+ context "on embeds_one" do
2548
+
2549
+ let(:attrs) { { "title" => "Title" } }
2550
+
2551
+ context "when using nested attributes" do
2552
+ let(:doc) { NestedBook.create! }
2553
+
2554
+ before do
2555
+ doc.update_attributes({ cover_attributes: attrs })
2556
+ end
2557
+
2558
+ it "updates the attributes" do
2559
+ expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
2560
+ end
2561
+
2562
+ it "has the same attributes after reloading" do
2563
+ expect(doc.attributes).to eq(doc.reload.attributes)
2564
+ end
2565
+ end
2566
+
2567
+ context "when doing assignments" do
2568
+ let(:doc) { NestedBook.create! }
2569
+ before do
2570
+ doc.cover = NestedCover.new(attrs)
2571
+ end
2572
+
2573
+ it "updates the attributes" do
2574
+ expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
2575
+ end
2576
+
2577
+ it "has the same attributes after reloading" do
2578
+ expect(doc.attributes).to eq(doc.reload.attributes)
2579
+ end
2580
+ end
2581
+
2582
+ context "when replacing assignments" do
2583
+ let(:doc) { NestedBook.create! }
2584
+ before do
2585
+ doc.cover = NestedCover.new("title" => "Title1")
2586
+ doc.cover = NestedCover.new(attrs)
2587
+ end
2588
+
2589
+ it "updates the attributes" do
2590
+ expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
2591
+ end
2592
+
2593
+ it "has the same attributes after reloading" do
2594
+ expect(doc.attributes).to eq(doc.reload.attributes)
2595
+ end
2596
+ end
2597
+
2598
+ context "when setting to nil" do
2599
+ let(:doc) { NestedBook.create! }
2600
+ before do
2601
+ doc.cover = NestedCover.new(attrs)
2602
+ doc.cover = nil
2603
+ end
2604
+
2605
+ it "updates the attributes" do
2606
+ expect(doc.attributes.key?("cover")).to be false
2607
+ end
2608
+
2609
+ it "has the same attributes after reloading" do
2610
+ expect(doc.attributes).to eq(doc.reload.attributes)
2611
+ end
2612
+ end
2613
+
2614
+ context "when setting to nil and back" do
2615
+ let(:doc) { NestedBook.create! }
2616
+ before do
2617
+ doc.cover = NestedCover.new(attrs)
2618
+ doc.cover = nil
2619
+ doc.cover = NestedCover.new(attrs)
2620
+ end
2621
+
2622
+ it "updates the attributes" do
2623
+ expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
2624
+ end
2625
+
2626
+
2627
+ it "has the same attributes after reloading" do
2628
+ expect(doc.attributes).to eq(doc.reload.attributes)
2629
+ end
2630
+ end
2631
+
2632
+ [:build, :create].each do |meth|
2633
+ context "when preforming #{meth}" do
2634
+ let(:doc) { NestedBook.create! }
2635
+ before do
2636
+ doc.send("#{meth}_cover", attrs)
2637
+ end
2638
+
2639
+ it "updates the attributes" do
2640
+ expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
2641
+ end
2642
+
2643
+ it "has the same attributes after reloading" do
2644
+ doc.cover.save
2645
+ expect(doc.attributes).to eq(doc.reload.attributes)
2646
+ end
2647
+ end
2648
+ end
2649
+
2650
+ context "when assigning a hash" do
2651
+ let(:doc) { NestedBook.create! }
2652
+ before do
2653
+ doc.cover = attrs
2654
+ end
2655
+
2656
+ it "updates the attributes" do
2657
+ expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
2658
+ end
2659
+
2660
+ it "has the same attributes after reloading" do
2661
+ expect(doc.attributes).to eq(doc.reload.attributes)
2662
+ end
2663
+ end
2664
+
2665
+ context "when assigning twice" do
2666
+ let(:doc) { NestedBook.create! }
2667
+ before do
2668
+ doc.cover = { "title" => "1984" }
2669
+ doc.cover = attrs
2670
+ end
2671
+
2672
+ it "updates the attributes" do
2673
+ expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
2674
+ end
2675
+
2676
+ it "has the same attributes after reloading" do
2677
+ expect(doc.attributes).to eq(doc.reload.attributes)
2678
+ end
2679
+ end
2680
+ end
2681
+ end
2682
+
2683
+ context "when modifiying a hash referenced with the [] notation" do
2684
+ let(:church) { Church.create!(location: { x: 1 }) }
2685
+
2686
+ before do
2687
+ church[:location].merge!(y: 2)
2688
+ church.save!
2689
+ church.reload
2690
+ end
2691
+
2692
+ it "persists the updated hash" do
2693
+ church.location.should == { "x" => 1, "y" => 2 }
2694
+ end
2695
+ end
2696
+
2697
+ context "when modifiying a set referenced with the [] notation" do
2698
+ let(:catalog) { Catalog.create!(set_field: [ 1 ].to_set) }
2699
+
2700
+ before do
2701
+ catalog[:set_field] << 2
2702
+ catalog.save!
2703
+ catalog.reload
2704
+ end
2705
+
2706
+ it "persists the updated hash" do
2707
+ pending "MONGOID-2951"
2708
+ catalog.set_field.should == Set.new([ 1, 2 ])
2709
+ end
2710
+ end
2711
+
2712
+ context 'when an embedded field has a capitalized store_as name' do
2713
+ let(:person) { Person.new(Purse: { brand: 'Gucci' }) }
2714
+
2715
+ it 'sets the value' do
2716
+ expect(person.purse.brand).to eq('Gucci')
2717
+ end
2718
+
2719
+ it 'saves successfully' do
2720
+ expect(person.save!).to eq(true)
2721
+ end
2722
+
2723
+ context 'when persisted' do
2724
+ before do
2725
+ person.save!
2726
+ person.reload
2727
+ end
2728
+
2729
+ it 'persists the value' do
2730
+ expect(person.reload.purse.brand).to eq('Gucci')
2731
+ end
2732
+
2733
+ it 'uses the correct key in the database' do
2734
+ expect(person.collection.find(_id: person.id).first['Purse']['_id']).to eq(person.purse.id)
2735
+ end
2736
+ end
2737
+ end
2261
2738
  end