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
@@ -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
 
@@ -287,6 +288,22 @@ describe Mongoid::Attributes do
287
288
  end
288
289
  end
289
290
 
291
+ context "when given nil" do
292
+
293
+ it "returns nil" do
294
+ expect(person[nil]).to be nil
295
+ end
296
+
297
+ end
298
+
299
+ context "when given an empty string" do
300
+
301
+ it "returns nil" do
302
+ expect(person[""]).to be nil
303
+ end
304
+
305
+ end
306
+
290
307
  context "when the field was not explicitly defined" do
291
308
 
292
309
  context "when excluding with only and the field was not excluded" do
@@ -392,11 +409,10 @@ describe Mongoid::Attributes do
392
409
  end
393
410
 
394
411
  context "when reloaded" do
412
+ config_override :raise_not_found_error, false
395
413
 
396
414
  before do
397
- Mongoid.raise_not_found_error = false
398
415
  person.reload
399
- Mongoid.raise_not_found_error = true
400
416
  end
401
417
 
402
418
  it "returns the default value" do
@@ -1029,14 +1045,13 @@ describe Mongoid::Attributes do
1029
1045
  end
1030
1046
 
1031
1047
  context "when the attribute does not exist" do
1048
+ config_override :raise_not_found_error, false
1032
1049
 
1033
1050
  before do
1034
1051
  person.collection
1035
1052
  .find({ _id: person.id })
1036
1053
  .update_one({ "$unset" => { age: 1 }})
1037
- Mongoid.raise_not_found_error = false
1038
1054
  person.reload
1039
- Mongoid.raise_not_found_error = true
1040
1055
  end
1041
1056
 
1042
1057
  it "returns the default value" do
@@ -1077,8 +1092,8 @@ describe Mongoid::Attributes do
1077
1092
  context "after the attribute has been assigned" do
1078
1093
 
1079
1094
  it "returns the default value" do
1080
- person.age = "old"
1081
- expect(person.age_before_type_cast).to eq("old")
1095
+ person.age = "42"
1096
+ expect(person.age_before_type_cast).to eq("42")
1082
1097
  end
1083
1098
  end
1084
1099
 
@@ -1160,14 +1175,13 @@ describe Mongoid::Attributes do
1160
1175
  end
1161
1176
 
1162
1177
  context "when the attribute does not exist" do
1178
+ config_override :raise_not_found_error, false
1163
1179
 
1164
1180
  before do
1165
1181
  person.collection
1166
1182
  .find({ _id: person.id })
1167
1183
  .update_one({ "$unset" => { age: 1 }})
1168
- Mongoid.raise_not_found_error = false
1169
1184
  person.reload
1170
- Mongoid.raise_not_found_error = true
1171
1185
  end
1172
1186
 
1173
1187
  it "returns true" do
@@ -1265,15 +1279,15 @@ describe Mongoid::Attributes do
1265
1279
 
1266
1280
  context "before the attribute has been assigned" do
1267
1281
 
1268
- it "returns false" do
1269
- expect(person.has_attribute_before_type_cast?(:age)).to be false
1282
+ it "returns true" do
1283
+ expect(person.has_attribute_before_type_cast?(:age)).to be true
1270
1284
  end
1271
1285
  end
1272
1286
 
1273
1287
  context "after the attribute has been assigned" do
1274
1288
 
1275
1289
  it "returns true" do
1276
- person.age = 'old'
1290
+ person.age = '42'
1277
1291
  expect(person.has_attribute_before_type_cast?(:age)).to be true
1278
1292
  end
1279
1293
  end
@@ -1528,12 +1542,13 @@ describe Mongoid::Attributes do
1528
1542
  end
1529
1543
 
1530
1544
  context "when setting an attribute that needs type casting" do
1545
+
1531
1546
  let(:person) do
1532
- Person.new(age: "old")
1547
+ Person.new(age: "42")
1533
1548
  end
1534
1549
 
1535
1550
  it "should store the attribute before type cast" do
1536
- expect(person.age_before_type_cast).to eq("old")
1551
+ expect(person.age_before_type_cast).to eq("42")
1537
1552
  end
1538
1553
  end
1539
1554
 
@@ -1581,16 +1596,14 @@ describe Mongoid::Attributes do
1581
1596
  context "when attribute is a Hash" do
1582
1597
  let(:person) { Person.new map: { somekey: "somevalue" } }
1583
1598
 
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/)
1599
+ it "writes nil when trying to set a value of invalid type - array" do
1600
+ person.map = []
1601
+ expect(person.map).to be_nil
1588
1602
  end
1589
1603
 
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/)
1604
+ it "writes nil when trying to set a value of invalid type - boolean" do
1605
+ person.map = false
1606
+ expect(person.map).to be_nil
1594
1607
  end
1595
1608
 
1596
1609
  it "can set a Hash value" do
@@ -1605,16 +1618,14 @@ describe Mongoid::Attributes do
1605
1618
  expect(person.aliases).to eq([ :alias_1 ])
1606
1619
  end
1607
1620
 
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/)
1621
+ it "writes nil when trying to set a value of invalid type - hash" do
1622
+ person.aliases = {}
1623
+ expect(person.aliases).to be_nil
1612
1624
  end
1613
1625
 
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/)
1626
+ it "writes nil when trying to set a value of invalid type - boolean" do
1627
+ person.aliases = false
1628
+ expect(person.aliases).to be_nil
1618
1629
  end
1619
1630
  end
1620
1631
 
@@ -1899,11 +1910,11 @@ describe Mongoid::Attributes do
1899
1910
  end
1900
1911
 
1901
1912
  it "has 3 new entries" do
1902
- expect(pet.vet_visits.count).to eq(3)
1913
+ expect(pet.vet_visits.count).to eq 3
1903
1914
  end
1904
1915
 
1905
1916
  it "persists the changes" do
1906
- expect(pet.reload.vet_visits.count).to eq(3)
1917
+ expect(pet.reload.vet_visits.count).to eq 3
1907
1918
  end
1908
1919
  end
1909
1920
 
@@ -2073,8 +2084,8 @@ describe Mongoid::Attributes do
2073
2084
  end
2074
2085
 
2075
2086
  it "aliases *_before_type_cast" do
2076
- product.cost = "expensive"
2077
- expect(product.cost_before_type_cast).to eq("expensive")
2087
+ product.cost = "42"
2088
+ expect(product.cost_before_type_cast).to eq("42")
2078
2089
  end
2079
2090
  end
2080
2091
 
@@ -2258,4 +2269,486 @@ describe Mongoid::Attributes do
2258
2269
  end
2259
2270
  end
2260
2271
  end
2272
+
2273
+ context "when an attribute is removed then set" do
2274
+ let(:cat) { Cat.create!(name: "Neil") }
2275
+
2276
+ before do
2277
+ cat.remove_attribute("name")
2278
+ cat.name = "Nissim"
2279
+ cat.save!
2280
+ cat.reload
2281
+ end
2282
+
2283
+ it "correctly sets the attribute" do
2284
+ expect(cat.name).to eq("Nissim")
2285
+ end
2286
+ end
2287
+
2288
+ describe "attributes after setting an association without reloading" do
2289
+
2290
+ context "on embeds_many" do
2291
+
2292
+ context "when not setting anything" do
2293
+ let(:doc) { NestedBook.create! }
2294
+
2295
+ it "doesn't add attributes" do
2296
+ expect(doc.attributes).to_not have_key("pages")
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 using nested attributes" do
2305
+ let(:doc) { NestedBook.create! }
2306
+
2307
+ before do
2308
+ doc.update_attributes({ pages_attributes: [ {} ] })
2309
+ end
2310
+
2311
+ it "updates the attributes" do
2312
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2313
+ end
2314
+
2315
+ it "has the same attributes after reloading" do
2316
+ expect(doc.attributes).to eq(doc.reload.attributes)
2317
+ end
2318
+ end
2319
+
2320
+ context "when doing assignments" do
2321
+ let(:doc) { NestedBook.create! }
2322
+ before do
2323
+ doc.pages = [NestedPage.new]
2324
+ end
2325
+
2326
+ it "updates the attributes" do
2327
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
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 replacing assignments" do
2336
+ let(:doc) { NestedBook.create! }
2337
+ before do
2338
+ doc.pages = [NestedPage.new(number: 1)]
2339
+ doc.pages = [NestedPage.new(number: 2)]
2340
+ end
2341
+
2342
+ it "updates the attributes" do
2343
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id, "number" => 2 }])
2344
+ end
2345
+
2346
+ it "has the same attributes after reloading" do
2347
+ expect(doc.attributes).to eq(doc.reload.attributes)
2348
+ end
2349
+ end
2350
+
2351
+ context "when setting to nil" do
2352
+ let(:doc) { NestedBook.create! }
2353
+ before do
2354
+ doc.pages = [NestedPage.new(number: 1)]
2355
+ doc.pages = nil
2356
+ end
2357
+
2358
+ it "updates the attributes" do
2359
+ expect(doc.attributes).to_not have_key("pages")
2360
+ end
2361
+
2362
+ it "has the same attributes after reloading" do
2363
+ expect({ "pages" => [] }.merge(doc.attributes)).to eq(doc.reload.attributes)
2364
+ end
2365
+ end
2366
+
2367
+ context "when setting to nil and back" do
2368
+ let(:doc) { NestedBook.create! }
2369
+ let(:page) { NestedPage.new }
2370
+ before do
2371
+ doc.pages = [page]
2372
+ doc.pages = nil
2373
+ doc.pages = [page]
2374
+ end
2375
+
2376
+ it "updates the attributes" do
2377
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2378
+ end
2379
+
2380
+ it "has the same attributes after reloading" do
2381
+ expect(doc.attributes).to eq(doc.reload.attributes)
2382
+ end
2383
+ end
2384
+
2385
+ context "when pushing" do
2386
+ let(:doc) { NestedBook.create! }
2387
+ before do
2388
+ doc.pages << NestedPage.new
2389
+ end
2390
+
2391
+ it "updates the attributes" do
2392
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2393
+ end
2394
+
2395
+ it "has the same attributes after reloading" do
2396
+ expect(doc.attributes).to eq(doc.reload.attributes)
2397
+ end
2398
+ end
2399
+
2400
+ [:shift, :pop].each do |meth|
2401
+ context "when performing #{meth}" do
2402
+ let(:doc) { NestedBook.create! }
2403
+ before do
2404
+ doc.pages << NestedPage.new
2405
+ doc.pages << NestedPage.new
2406
+ doc.pages << NestedPage.new
2407
+
2408
+ doc.pages.send(meth, 2)
2409
+ end
2410
+
2411
+ it "updates the attributes" do
2412
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2413
+ end
2414
+
2415
+ it "has the same attributes after reloading" do
2416
+ expect(doc.attributes).to eq(doc.reload.attributes)
2417
+ end
2418
+ end
2419
+ end
2420
+
2421
+ context "when concatting" do
2422
+ let(:doc) { NestedBook.create! }
2423
+ before do
2424
+ doc.pages << NestedPage.new
2425
+ doc.pages.concat([NestedPage.new, NestedPage.new])
2426
+ end
2427
+
2428
+ it "updates the attributes" do
2429
+ expect(doc.attributes["pages"].count).to eq 3
2430
+ end
2431
+
2432
+ it "has the same attributes after reloading" do
2433
+ expect(doc.attributes).to eq(doc.reload.attributes)
2434
+ end
2435
+ end
2436
+
2437
+ [:build, :create].each do |meth|
2438
+ context "when preforming #{meth}" do
2439
+ let(:doc) { NestedBook.create! }
2440
+ before do
2441
+ doc.pages.send(meth)
2442
+ end
2443
+
2444
+ it "updates the attributes" do
2445
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2446
+ end
2447
+
2448
+ it "has the same attributes after reloading" do
2449
+ doc.pages.first.save
2450
+ expect(doc.attributes).to eq(doc.reload.attributes)
2451
+ end
2452
+ end
2453
+ end
2454
+
2455
+ context "when clearing" do
2456
+ let(:doc) { NestedBook.create! }
2457
+ before do
2458
+ doc.pages << NestedPage.new
2459
+ doc.pages << NestedPage.new
2460
+ doc.pages << NestedPage.new
2461
+
2462
+ doc.pages.clear
2463
+ end
2464
+
2465
+ it "updates the attributes" do
2466
+ expect(doc.attributes).to_not have_key("pages")
2467
+ end
2468
+
2469
+ it "has the same attributes after reloading" do
2470
+ expect(doc.attributes).to eq(doc.reload.attributes)
2471
+ end
2472
+ end
2473
+
2474
+ [:delete_all, :destroy_all, :remove_all].each do |meth|
2475
+ context "when performing: #{meth}" do
2476
+ let(:doc) { NestedBook.create! }
2477
+ before do
2478
+ doc.pages << NestedPage.new
2479
+ doc.pages << NestedPage.new
2480
+ doc.pages << NestedPage.new
2481
+
2482
+ doc.pages.send(meth)
2483
+ end
2484
+
2485
+ it "updates the attributes" do
2486
+ expect(doc.attributes).to_not have_key("pages")
2487
+ end
2488
+
2489
+ it "has the same attributes after reloading" do
2490
+ expect({ "pages" => [] }.merge(doc.attributes)).to eq(doc.reload.attributes)
2491
+ end
2492
+ end
2493
+ end
2494
+
2495
+ context "when deleting" do
2496
+ let(:doc) { NestedBook.create! }
2497
+ let(:page) { NestedPage.new }
2498
+ before do
2499
+ doc.pages << page
2500
+ doc.pages << NestedPage.new
2501
+ doc.pages << NestedPage.new
2502
+
2503
+ doc.pages.delete(page)
2504
+ end
2505
+
2506
+ it "updates the attributes" do
2507
+ expect(doc.attributes["pages"].count).to eq 2
2508
+ end
2509
+
2510
+ it "has the same attributes after reloading" do
2511
+ expect(doc.attributes).to eq(doc.reload.attributes)
2512
+ end
2513
+ end
2514
+
2515
+ context "when doing _remove" do
2516
+ let(:doc) { NestedBook.create! }
2517
+ let(:page) { NestedPage.new }
2518
+ before do
2519
+ doc.pages << page
2520
+ doc.pages << NestedPage.new
2521
+ doc.pages << NestedPage.new
2522
+
2523
+ doc.pages._remove(page)
2524
+ end
2525
+
2526
+ it "updates the attributes" do
2527
+ expect(doc.attributes["pages"].count).to eq 2
2528
+ end
2529
+ end
2530
+
2531
+ context "when assigning an array of hashes" do
2532
+ let(:doc) { NestedBook.create! }
2533
+ before do
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
+
2546
+ context "when assigning twice" do
2547
+ let(:doc) { NestedBook.create! }
2548
+ before do
2549
+ doc.pages = [{ number: 1 }]
2550
+ doc.pages = [{}]
2551
+ end
2552
+
2553
+ it "updates the attributes" do
2554
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2555
+ end
2556
+
2557
+ it "has the same attributes after reloading" do
2558
+ expect(doc.attributes).to eq(doc.reload.attributes)
2559
+ end
2560
+ end
2561
+ end
2562
+
2563
+ context "on embeds_one" do
2564
+
2565
+ let(:attrs) { { "title" => "Title" } }
2566
+
2567
+ context "when using nested attributes" do
2568
+ let(:doc) { NestedBook.create! }
2569
+
2570
+ before do
2571
+ doc.update_attributes({ cover_attributes: attrs })
2572
+ end
2573
+
2574
+ it "updates the attributes" do
2575
+ expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
2576
+ end
2577
+
2578
+ it "has the same attributes after reloading" do
2579
+ expect(doc.attributes).to eq(doc.reload.attributes)
2580
+ end
2581
+ end
2582
+
2583
+ context "when doing assignments" do
2584
+ let(:doc) { NestedBook.create! }
2585
+ before do
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 replacing assignments" do
2599
+ let(:doc) { NestedBook.create! }
2600
+ before do
2601
+ doc.cover = NestedCover.new("title" => "Title1")
2602
+ doc.cover = NestedCover.new(attrs)
2603
+ end
2604
+
2605
+ it "updates the attributes" do
2606
+ expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
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" do
2615
+ let(:doc) { NestedBook.create! }
2616
+ before do
2617
+ doc.cover = NestedCover.new(attrs)
2618
+ doc.cover = nil
2619
+ end
2620
+
2621
+ it "updates the attributes" do
2622
+ expect(doc.attributes.key?("cover")).to be false
2623
+ end
2624
+
2625
+ it "has the same attributes after reloading" do
2626
+ expect(doc.attributes).to eq(doc.reload.attributes)
2627
+ end
2628
+ end
2629
+
2630
+ context "when setting to nil and back" do
2631
+ let(:doc) { NestedBook.create! }
2632
+ before do
2633
+ doc.cover = NestedCover.new(attrs)
2634
+ doc.cover = nil
2635
+ doc.cover = NestedCover.new(attrs)
2636
+ end
2637
+
2638
+ it "updates the attributes" do
2639
+ expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
2640
+ end
2641
+
2642
+
2643
+ it "has the same attributes after reloading" do
2644
+ expect(doc.attributes).to eq(doc.reload.attributes)
2645
+ end
2646
+ end
2647
+
2648
+ [:build, :create].each do |meth|
2649
+ context "when preforming #{meth}" do
2650
+ let(:doc) { NestedBook.create! }
2651
+ before do
2652
+ doc.send("#{meth}_cover", attrs)
2653
+ end
2654
+
2655
+ it "updates the attributes" do
2656
+ expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
2657
+ end
2658
+
2659
+ it "has the same attributes after reloading" do
2660
+ doc.cover.save
2661
+ expect(doc.attributes).to eq(doc.reload.attributes)
2662
+ end
2663
+ end
2664
+ end
2665
+
2666
+ context "when assigning a hash" do
2667
+ let(:doc) { NestedBook.create! }
2668
+ before do
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
+
2681
+ context "when assigning twice" do
2682
+ let(:doc) { NestedBook.create! }
2683
+ before do
2684
+ doc.cover = { "title" => "1984" }
2685
+ doc.cover = attrs
2686
+ end
2687
+
2688
+ it "updates the attributes" do
2689
+ expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
2690
+ end
2691
+
2692
+ it "has the same attributes after reloading" do
2693
+ expect(doc.attributes).to eq(doc.reload.attributes)
2694
+ end
2695
+ end
2696
+ end
2697
+ end
2698
+
2699
+ context "when modifiying a hash referenced with the [] notation" do
2700
+ let(:church) { Church.create!(location: { x: 1 }) }
2701
+
2702
+ before do
2703
+ church[:location].merge!(y: 2)
2704
+ church.save!
2705
+ church.reload
2706
+ end
2707
+
2708
+ it "persists the updated hash" do
2709
+ church.location.should == { "x" => 1, "y" => 2 }
2710
+ end
2711
+ end
2712
+
2713
+ context "when modifiying a set referenced with the [] notation" do
2714
+ let(:catalog) { Catalog.create!(set_field: [ 1 ].to_set) }
2715
+
2716
+ before do
2717
+ catalog[:set_field] << 2
2718
+ catalog.save!
2719
+ catalog.reload
2720
+ end
2721
+
2722
+ it "persists the updated hash" do
2723
+ pending "MONGOID-2951"
2724
+ catalog.set_field.should == Set.new([ 1, 2 ])
2725
+ end
2726
+ end
2727
+
2728
+ context 'when an embedded field has a capitalized store_as name' do
2729
+ let(:person) { Person.new(Purse: { brand: 'Gucci' }) }
2730
+
2731
+ it 'sets the value' do
2732
+ expect(person.purse.brand).to eq('Gucci')
2733
+ end
2734
+
2735
+ it 'saves successfully' do
2736
+ expect(person.save!).to eq(true)
2737
+ end
2738
+
2739
+ context 'when persisted' do
2740
+ before do
2741
+ person.save!
2742
+ person.reload
2743
+ end
2744
+
2745
+ it 'persists the value' do
2746
+ expect(person.reload.purse.brand).to eq('Gucci')
2747
+ end
2748
+
2749
+ it 'uses the correct key in the database' do
2750
+ expect(person.collection.find(_id: person.id).first['Purse']['_id']).to eq(person.purse.id)
2751
+ end
2752
+ end
2753
+ end
2261
2754
  end