mongoid 7.5.1 → 8.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (429) 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 +54 -14
  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 +85 -46
  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 +40 -21
  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/paths/embedded/many.rb +19 -0
  55. data/lib/mongoid/atomic.rb +7 -0
  56. data/lib/mongoid/attributes/dynamic.rb +4 -4
  57. data/lib/mongoid/attributes/nested.rb +6 -6
  58. data/lib/mongoid/attributes/processing.rb +37 -6
  59. data/lib/mongoid/attributes/projector.rb +2 -2
  60. data/lib/mongoid/attributes/readonly.rb +3 -3
  61. data/lib/mongoid/attributes.rb +51 -42
  62. data/lib/mongoid/cacheable.rb +2 -2
  63. data/lib/mongoid/changeable.rb +147 -14
  64. data/lib/mongoid/clients/options.rb +5 -1
  65. data/lib/mongoid/clients/sessions.rb +2 -14
  66. data/lib/mongoid/clients/storage_options.rb +2 -5
  67. data/lib/mongoid/clients/validators/storage.rb +3 -15
  68. data/lib/mongoid/collection_configurable.rb +58 -0
  69. data/lib/mongoid/composable.rb +2 -0
  70. data/lib/mongoid/config/defaults.rb +60 -0
  71. data/lib/mongoid/config/options.rb +3 -0
  72. data/lib/mongoid/config/validators/async_query_executor.rb +24 -0
  73. data/lib/mongoid/config/validators/client.rb +6 -6
  74. data/lib/mongoid/config/validators.rb +1 -0
  75. data/lib/mongoid/config.rb +158 -17
  76. data/lib/mongoid/contextual/aggregable/memory.rb +24 -16
  77. data/lib/mongoid/contextual/aggregable/mongo.rb +5 -5
  78. data/lib/mongoid/contextual/aggregable/none.rb +1 -1
  79. data/lib/mongoid/contextual/atomic.rb +1 -1
  80. data/lib/mongoid/contextual/geo_near.rb +7 -7
  81. data/lib/mongoid/contextual/map_reduce.rb +2 -2
  82. data/lib/mongoid/contextual/memory.rb +285 -58
  83. data/lib/mongoid/contextual/mongo/documents_loader.rb +177 -0
  84. data/lib/mongoid/contextual/mongo.rb +544 -333
  85. data/lib/mongoid/contextual/none.rb +193 -20
  86. data/lib/mongoid/contextual/queryable.rb +1 -1
  87. data/lib/mongoid/contextual.rb +14 -2
  88. data/lib/mongoid/copyable.rb +32 -8
  89. data/lib/mongoid/criteria/findable.rb +8 -5
  90. data/lib/mongoid/criteria/includable.rb +27 -22
  91. data/lib/mongoid/criteria/marshalable.rb +10 -2
  92. data/lib/mongoid/criteria/permission.rb +1 -1
  93. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -2
  94. data/lib/mongoid/criteria/queryable/extensions/array.rb +3 -16
  95. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
  96. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -2
  97. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
  98. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
  99. data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -17
  100. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -9
  101. data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
  102. data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
  103. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
  104. data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -1
  105. data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -14
  106. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -12
  107. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
  108. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
  109. data/lib/mongoid/criteria/queryable/key.rb +4 -4
  110. data/lib/mongoid/criteria/queryable/mergeable.rb +1 -1
  111. data/lib/mongoid/criteria/queryable/optional.rb +11 -17
  112. data/lib/mongoid/criteria/queryable/options.rb +2 -2
  113. data/lib/mongoid/criteria/queryable/pipeline.rb +1 -1
  114. data/lib/mongoid/criteria/queryable/selectable.rb +47 -38
  115. data/lib/mongoid/criteria/queryable/selector.rb +93 -8
  116. data/lib/mongoid/criteria/queryable/smash.rb +40 -7
  117. data/lib/mongoid/criteria/queryable/storable.rb +1 -1
  118. data/lib/mongoid/criteria/queryable.rb +12 -7
  119. data/lib/mongoid/criteria/scopable.rb +2 -2
  120. data/lib/mongoid/criteria/translator.rb +45 -0
  121. data/lib/mongoid/criteria.rb +20 -40
  122. data/lib/mongoid/deprecable.rb +37 -0
  123. data/lib/mongoid/deprecation.rb +25 -0
  124. data/lib/mongoid/document.rb +135 -36
  125. data/lib/mongoid/equality.rb +8 -8
  126. data/lib/mongoid/errors/create_collection_failure.rb +33 -0
  127. data/lib/mongoid/errors/document_not_found.rb +10 -6
  128. data/lib/mongoid/errors/drop_collection_failure.rb +27 -0
  129. data/lib/mongoid/errors/immutable_attribute.rb +26 -0
  130. data/lib/mongoid/errors/invalid_async_query_executor.rb +25 -0
  131. data/lib/mongoid/errors/invalid_config_option.rb +1 -1
  132. data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -1
  133. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  134. data/lib/mongoid/errors/invalid_field.rb +6 -2
  135. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  136. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +22 -0
  137. data/lib/mongoid/errors/invalid_relation.rb +1 -1
  138. data/lib/mongoid/errors/invalid_relation_option.rb +1 -1
  139. data/lib/mongoid/errors/invalid_session_use.rb +1 -1
  140. data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
  141. data/lib/mongoid/errors/invalid_storage_parent.rb +2 -0
  142. data/lib/mongoid/errors/mongoid_error.rb +3 -3
  143. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -1
  144. data/lib/mongoid/errors/no_client_database.rb +1 -1
  145. data/lib/mongoid/errors/no_client_hosts.rb +1 -1
  146. data/lib/mongoid/errors/readonly_attribute.rb +1 -1
  147. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  148. data/lib/mongoid/errors/unknown_attribute.rb +1 -1
  149. data/lib/mongoid/errors.rb +6 -3
  150. data/lib/mongoid/extensions/array.rb +9 -7
  151. data/lib/mongoid/extensions/big_decimal.rb +33 -10
  152. data/lib/mongoid/extensions/binary.rb +42 -0
  153. data/lib/mongoid/extensions/boolean.rb +8 -2
  154. data/lib/mongoid/extensions/date.rb +26 -20
  155. data/lib/mongoid/extensions/date_time.rb +1 -1
  156. data/lib/mongoid/extensions/false_class.rb +1 -1
  157. data/lib/mongoid/extensions/float.rb +7 -4
  158. data/lib/mongoid/extensions/hash.rb +37 -8
  159. data/lib/mongoid/extensions/integer.rb +7 -4
  160. data/lib/mongoid/extensions/module.rb +1 -1
  161. data/lib/mongoid/extensions/object.rb +10 -8
  162. data/lib/mongoid/extensions/range.rb +41 -10
  163. data/lib/mongoid/extensions/regexp.rb +11 -4
  164. data/lib/mongoid/extensions/set.rb +11 -4
  165. data/lib/mongoid/extensions/string.rb +11 -22
  166. data/lib/mongoid/extensions/symbol.rb +4 -15
  167. data/lib/mongoid/extensions/time.rb +29 -16
  168. data/lib/mongoid/extensions/time_with_zone.rb +1 -2
  169. data/lib/mongoid/extensions/true_class.rb +1 -1
  170. data/lib/mongoid/extensions.rb +1 -0
  171. data/lib/mongoid/factory.rb +55 -7
  172. data/lib/mongoid/fields/foreign_key.rb +11 -4
  173. data/lib/mongoid/fields/localized.rb +19 -4
  174. data/lib/mongoid/fields/standard.rb +17 -7
  175. data/lib/mongoid/fields/validators/macro.rb +3 -9
  176. data/lib/mongoid/fields.rb +129 -20
  177. data/lib/mongoid/findable.rb +54 -24
  178. data/lib/mongoid/indexable/specification.rb +2 -2
  179. data/lib/mongoid/indexable/validators/options.rb +6 -2
  180. data/lib/mongoid/interceptable.rb +186 -16
  181. data/lib/mongoid/matchable.rb +1 -1
  182. data/lib/mongoid/matcher/eq_impl.rb +1 -1
  183. data/lib/mongoid/matcher/type.rb +1 -1
  184. data/lib/mongoid/matcher.rb +33 -13
  185. data/lib/mongoid/persistable/creatable.rb +19 -9
  186. data/lib/mongoid/persistable/deletable.rb +2 -2
  187. data/lib/mongoid/persistable/destroyable.rb +1 -1
  188. data/lib/mongoid/persistable/savable.rb +14 -2
  189. data/lib/mongoid/persistable/unsettable.rb +2 -2
  190. data/lib/mongoid/persistable/updatable.rb +69 -12
  191. data/lib/mongoid/persistable/upsertable.rb +21 -2
  192. data/lib/mongoid/persistable.rb +6 -3
  193. data/lib/mongoid/persistence_context.rb +63 -10
  194. data/lib/mongoid/query_cache.rb +13 -261
  195. data/lib/mongoid/railties/controller_runtime.rb +1 -1
  196. data/lib/mongoid/railties/database.rake +7 -2
  197. data/lib/mongoid/reloadable.rb +10 -8
  198. data/lib/mongoid/scopable.rb +15 -13
  199. data/lib/mongoid/selectable.rb +1 -2
  200. data/lib/mongoid/serializable.rb +10 -6
  201. data/lib/mongoid/shardable.rb +35 -11
  202. data/lib/mongoid/stateful.rb +57 -10
  203. data/lib/mongoid/tasks/database.rake +12 -0
  204. data/lib/mongoid/tasks/database.rb +20 -2
  205. data/lib/mongoid/threaded/lifecycle.rb +5 -5
  206. data/lib/mongoid/threaded.rb +42 -12
  207. data/lib/mongoid/timestamps/created.rb +1 -1
  208. data/lib/mongoid/timestamps/updated.rb +2 -2
  209. data/lib/mongoid/touchable.rb +2 -3
  210. data/lib/mongoid/traversable.rb +5 -4
  211. data/lib/mongoid/utils.rb +22 -0
  212. data/lib/mongoid/validatable/localizable.rb +1 -1
  213. data/lib/mongoid/validatable/macros.rb +5 -7
  214. data/lib/mongoid/validatable/presence.rb +2 -2
  215. data/lib/mongoid/validatable/uniqueness.rb +9 -8
  216. data/lib/mongoid/validatable.rb +9 -6
  217. data/lib/mongoid/version.rb +1 -1
  218. data/lib/mongoid/warnings.rb +19 -4
  219. data/lib/mongoid.rb +17 -3
  220. data/spec/config/mongoid.yml +16 -0
  221. data/spec/integration/app_spec.rb +10 -14
  222. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  223. data/spec/integration/associations/embedded_spec.rb +15 -0
  224. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  225. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  226. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  227. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  228. data/spec/integration/associations/has_one_spec.rb +97 -1
  229. data/spec/integration/associations/scope_option_spec.rb +1 -1
  230. data/spec/integration/callbacks_models.rb +132 -1
  231. data/spec/integration/callbacks_spec.rb +381 -4
  232. data/spec/integration/criteria/range_spec.rb +95 -1
  233. data/spec/integration/discriminator_key_spec.rb +118 -80
  234. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  235. data/spec/integration/i18n_fallbacks_spec.rb +3 -32
  236. data/spec/integration/matcher_examples_spec.rb +20 -13
  237. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  238. data/spec/integration/matcher_operator_spec.rb +3 -5
  239. data/spec/integration/persistence/range_field_spec.rb +350 -0
  240. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  241. data/spec/mongoid/association/depending_spec.rb +9 -9
  242. data/spec/mongoid/association/eager_spec.rb +2 -1
  243. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  244. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  245. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +96 -9
  246. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  247. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +311 -65
  248. data/spec/mongoid/association/embedded/embeds_many_models.rb +158 -0
  249. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
  250. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  251. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  252. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +15 -2
  253. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  254. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  255. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  256. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  257. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
  258. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  259. data/spec/mongoid/association/referenced/belongs_to_spec.rb +4 -20
  260. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +215 -228
  261. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  262. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  263. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  264. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
  265. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +235 -177
  266. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  267. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  268. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  269. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  270. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  271. data/spec/mongoid/association/syncable_spec.rb +15 -1
  272. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  273. data/spec/mongoid/attributes/nested_spec.rb +80 -11
  274. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  275. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  276. data/spec/mongoid/attributes_spec.rb +554 -33
  277. data/spec/mongoid/cacheable_spec.rb +3 -3
  278. data/spec/mongoid/changeable_spec.rb +429 -37
  279. data/spec/mongoid/clients/factory_spec.rb +23 -30
  280. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  281. data/spec/mongoid/clients_spec.rb +179 -15
  282. data/spec/mongoid/collection_configurable_spec.rb +158 -0
  283. data/spec/mongoid/config/defaults_spec.rb +160 -0
  284. data/spec/mongoid/config_spec.rb +220 -30
  285. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  286. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  287. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  288. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  289. data/spec/mongoid/contextual/memory_spec.rb +850 -88
  290. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
  291. data/spec/mongoid/contextual/mongo_spec.rb +2307 -1105
  292. data/spec/mongoid/contextual/none_spec.rb +60 -21
  293. data/spec/mongoid/copyable_spec.rb +453 -11
  294. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  295. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  296. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  297. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  298. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  299. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  300. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  301. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  302. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  303. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  304. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +4 -69
  305. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
  306. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  307. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  308. data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -484
  309. data/spec/mongoid/criteria/queryable/options_spec.rb +1 -1
  310. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +469 -0
  311. data/spec/mongoid/criteria/queryable/selectable_spec.rb +78 -86
  312. data/spec/mongoid/criteria/queryable/selector_spec.rb +90 -5
  313. data/spec/mongoid/criteria/queryable/storable_spec.rb +72 -0
  314. data/spec/mongoid/criteria/translator_spec.rb +132 -0
  315. data/spec/mongoid/criteria_projection_spec.rb +1 -5
  316. data/spec/mongoid/criteria_spec.rb +469 -1205
  317. data/spec/mongoid/document_fields_spec.rb +173 -24
  318. data/spec/mongoid/document_spec.rb +32 -41
  319. data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
  320. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  321. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  322. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  323. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  324. data/spec/mongoid/errors/readonly_document_spec.rb +2 -2
  325. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  326. data/spec/mongoid/extensions/array_spec.rb +16 -2
  327. data/spec/mongoid/extensions/big_decimal_spec.rb +712 -212
  328. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  329. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  330. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  331. data/spec/mongoid/extensions/date_spec.rb +71 -1
  332. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  333. data/spec/mongoid/extensions/float_spec.rb +53 -74
  334. data/spec/mongoid/extensions/hash_spec.rb +33 -3
  335. data/spec/mongoid/extensions/integer_spec.rb +50 -64
  336. data/spec/mongoid/extensions/range_spec.rb +255 -54
  337. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  338. data/spec/mongoid/extensions/set_spec.rb +106 -0
  339. data/spec/mongoid/extensions/string_spec.rb +53 -25
  340. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  341. data/spec/mongoid/extensions/time_spec.rb +639 -106
  342. data/spec/mongoid/extensions/time_with_zone_spec.rb +24 -83
  343. data/spec/mongoid/factory_spec.rb +61 -1
  344. data/spec/mongoid/fields/localized_spec.rb +80 -37
  345. data/spec/mongoid/fields_spec.rb +500 -84
  346. data/spec/mongoid/findable_spec.rb +450 -58
  347. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  348. data/spec/mongoid/indexable_spec.rb +55 -30
  349. data/spec/mongoid/interceptable_spec.rb +824 -22
  350. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  351. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  352. data/spec/mongoid/mongoizable_spec.rb +285 -0
  353. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  354. data/spec/mongoid/persistable/deletable_spec.rb +28 -8
  355. data/spec/mongoid/persistable/destroyable_spec.rb +28 -8
  356. data/spec/mongoid/persistable/incrementable_spec.rb +37 -0
  357. data/spec/mongoid/persistable/logical_spec.rb +37 -0
  358. data/spec/mongoid/persistable/poppable_spec.rb +36 -0
  359. data/spec/mongoid/persistable/pullable_spec.rb +72 -0
  360. data/spec/mongoid/persistable/pushable_spec.rb +72 -0
  361. data/spec/mongoid/persistable/renamable_spec.rb +36 -0
  362. data/spec/mongoid/persistable/savable_spec.rb +96 -0
  363. data/spec/mongoid/persistable/settable_spec.rb +37 -0
  364. data/spec/mongoid/persistable/unsettable_spec.rb +36 -0
  365. data/spec/mongoid/persistable/updatable_spec.rb +20 -28
  366. data/spec/mongoid/persistable/upsertable_spec.rb +89 -1
  367. data/spec/mongoid/persistence_context_spec.rb +57 -58
  368. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  369. data/spec/mongoid/query_cache_spec.rb +56 -215
  370. data/spec/mongoid/reloadable_spec.rb +83 -6
  371. data/spec/mongoid/scopable_spec.rb +91 -1
  372. data/spec/mongoid/serializable_spec.rb +9 -30
  373. data/spec/mongoid/shardable_models.rb +14 -0
  374. data/spec/mongoid/shardable_spec.rb +157 -51
  375. data/spec/mongoid/stateful_spec.rb +150 -8
  376. data/spec/mongoid/tasks/database_rake_spec.rb +74 -0
  377. data/spec/mongoid/tasks/database_spec.rb +127 -0
  378. data/spec/mongoid/timestamps_spec.rb +392 -4
  379. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  380. data/spec/mongoid/touchable_spec.rb +390 -2
  381. data/spec/mongoid/touchable_spec_models.rb +14 -8
  382. data/spec/mongoid/traversable_spec.rb +13 -35
  383. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  384. data/spec/mongoid/validatable/uniqueness_spec.rb +58 -31
  385. data/spec/mongoid/warnings_spec.rb +35 -0
  386. data/spec/mongoid_spec.rb +34 -10
  387. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  388. data/spec/rails/mongoid_spec.rb +4 -16
  389. data/spec/shared/lib/mrss/docker_runner.rb +8 -0
  390. data/spec/shared/lib/mrss/lite_constraints.rb +10 -2
  391. data/spec/shared/lib/mrss/server_version_registry.rb +16 -23
  392. data/spec/shared/lib/mrss/utils.rb +28 -6
  393. data/spec/shared/share/Dockerfile.erb +36 -40
  394. data/spec/shared/shlib/server.sh +32 -8
  395. data/spec/shared/shlib/set_env.sh +4 -4
  396. data/spec/spec_helper.rb +5 -0
  397. data/spec/support/constraints.rb +24 -0
  398. data/spec/support/immutable_ids.rb +118 -0
  399. data/spec/support/macros.rb +78 -0
  400. data/spec/support/models/artist.rb +0 -1
  401. data/spec/support/models/augmentation.rb +12 -0
  402. data/spec/support/models/band.rb +4 -0
  403. data/spec/support/models/book.rb +1 -0
  404. data/spec/support/models/building.rb +2 -0
  405. data/spec/support/models/catalog.rb +24 -0
  406. data/spec/support/models/circus.rb +3 -0
  407. data/spec/support/models/cover.rb +10 -0
  408. data/spec/support/models/fanatic.rb +8 -0
  409. data/spec/support/models/implant.rb +9 -0
  410. data/spec/support/models/label.rb +2 -0
  411. data/spec/support/models/passport.rb +9 -0
  412. data/spec/support/models/person.rb +2 -0
  413. data/spec/support/models/player.rb +2 -0
  414. data/spec/support/models/powerup.rb +12 -0
  415. data/spec/support/models/product.rb +1 -0
  416. data/spec/support/models/purse.rb +9 -0
  417. data/spec/support/models/registry.rb +1 -0
  418. data/spec/support/models/school.rb +14 -0
  419. data/spec/support/models/shield.rb +18 -0
  420. data/spec/support/models/student.rb +14 -0
  421. data/spec/support/models/weapon.rb +12 -0
  422. data.tar.gz.sig +0 -0
  423. metadata +722 -640
  424. metadata.gz.sig +0 -0
  425. data/lib/mongoid/errors/eager_load.rb +0 -23
  426. data/lib/mongoid/errors/invalid_value.rb +0 -17
  427. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -60
  428. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -60
  429. 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
 
@@ -1675,6 +1670,50 @@ describe Mongoid::Attributes do
1675
1670
  end
1676
1671
  end
1677
1672
  end
1673
+
1674
+ context "when comparing the object_ids of the written value" do
1675
+ config_override :legacy_attributes, false
1676
+
1677
+ before do
1678
+ Person.create!
1679
+ end
1680
+
1681
+ let(:person) do
1682
+ Person.first
1683
+ end
1684
+
1685
+ context "when the field is not resizable" do
1686
+ let(:test) do
1687
+ person.write_attribute(:test, "aliased field to test")
1688
+ end
1689
+
1690
+ it "has the same object_id as the attributes hash value" do
1691
+ expect(test.object_id).to eq(person.test.object_id)
1692
+ end
1693
+ end
1694
+
1695
+ context "when the field is resizable" do
1696
+
1697
+ let(:arrays) do
1698
+ person.write_attribute(:arrays, [])
1699
+ end
1700
+
1701
+ it "has the same object_id as the attributes hash value" do
1702
+ expect(arrays.object_id).to eq(person.arrays.object_id)
1703
+ end
1704
+ end
1705
+
1706
+ context "when the field is a HABTM foreign key array" do
1707
+
1708
+ let(:preference_ids) do
1709
+ person.write_attribute(:preference_ids, [])
1710
+ end
1711
+
1712
+ it "has the same object_id as the attributes hash value" do
1713
+ expect(preference_ids.object_id).to eq(person.preference_ids.object_id)
1714
+ end
1715
+ end
1716
+ end
1678
1717
  end
1679
1718
 
1680
1719
  describe "#typed_value_for" do
@@ -1855,11 +1894,11 @@ describe Mongoid::Attributes do
1855
1894
  end
1856
1895
 
1857
1896
  it "has 3 new entries" do
1858
- expect(pet.vet_visits.count).to eq(3)
1897
+ expect(pet.vet_visits.count).to eq 3
1859
1898
  end
1860
1899
 
1861
1900
  it "persists the changes" do
1862
- expect(pet.reload.vet_visits.count).to eq(3)
1901
+ expect(pet.reload.vet_visits.count).to eq 3
1863
1902
  end
1864
1903
  end
1865
1904
 
@@ -2029,8 +2068,8 @@ describe Mongoid::Attributes do
2029
2068
  end
2030
2069
 
2031
2070
  it "aliases *_before_type_cast" do
2032
- product.cost = "expensive"
2033
- expect(product.cost_before_type_cast).to eq("expensive")
2071
+ product.cost = "42"
2072
+ expect(product.cost_before_type_cast).to eq("42")
2034
2073
  end
2035
2074
  end
2036
2075
 
@@ -2214,4 +2253,486 @@ describe Mongoid::Attributes do
2214
2253
  end
2215
2254
  end
2216
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
2217
2738
  end