mongoid 7.4.3 → 8.0.7

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 (383) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +3 -3
  4. data/Rakefile +25 -0
  5. data/lib/config/locales/en.yml +52 -28
  6. data/lib/mongoid/association/accessors.rb +38 -9
  7. data/lib/mongoid/association/bindable.rb +50 -2
  8. data/lib/mongoid/association/builders.rb +4 -2
  9. data/lib/mongoid/association/constrainable.rb +0 -1
  10. data/lib/mongoid/association/eager_loadable.rb +29 -7
  11. data/lib/mongoid/association/embedded/batchable.rb +33 -10
  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/proxy.rb +2 -2
  15. data/lib/mongoid/association/embedded/embedded_in.rb +3 -2
  16. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
  17. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +1 -1
  18. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +65 -41
  19. data/lib/mongoid/association/embedded/embeds_many.rb +2 -2
  20. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +18 -4
  21. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +23 -4
  22. data/lib/mongoid/association/embedded/embeds_one.rb +3 -3
  23. data/lib/mongoid/association/macros.rb +28 -1
  24. data/lib/mongoid/association/many.rb +11 -7
  25. data/lib/mongoid/association/nested/many.rb +5 -4
  26. data/lib/mongoid/association/nested/nested_buildable.rb +4 -4
  27. data/lib/mongoid/association/nested/one.rb +5 -5
  28. data/lib/mongoid/association/one.rb +2 -2
  29. data/lib/mongoid/association/options.rb +9 -9
  30. data/lib/mongoid/association/proxy.rb +14 -3
  31. data/lib/mongoid/association/referenced/auto_save.rb +4 -3
  32. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  33. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  34. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +5 -6
  35. data/lib/mongoid/association/referenced/belongs_to.rb +2 -2
  36. data/lib/mongoid/association/referenced/counter_cache.rb +10 -10
  37. data/lib/mongoid/association/referenced/eager.rb +2 -2
  38. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +70 -13
  39. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +6 -3
  40. data/lib/mongoid/association/referenced/has_many/enumerable.rb +20 -24
  41. data/lib/mongoid/association/referenced/has_many/proxy.rb +26 -16
  42. data/lib/mongoid/association/referenced/has_many.rb +3 -3
  43. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  44. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +5 -5
  45. data/lib/mongoid/association/referenced/has_one/proxy.rb +9 -12
  46. data/lib/mongoid/association/referenced/has_one.rb +3 -3
  47. data/lib/mongoid/association/referenced/syncable.rb +4 -4
  48. data/lib/mongoid/association/reflections.rb +2 -2
  49. data/lib/mongoid/association/relatable.rb +44 -10
  50. data/lib/mongoid/association.rb +5 -5
  51. data/lib/mongoid/atomic/modifiers.rb +2 -2
  52. data/lib/mongoid/atomic.rb +7 -0
  53. data/lib/mongoid/attributes/dynamic.rb +3 -3
  54. data/lib/mongoid/attributes/nested.rb +5 -5
  55. data/lib/mongoid/attributes/processing.rb +37 -6
  56. data/lib/mongoid/attributes/projector.rb +1 -1
  57. data/lib/mongoid/attributes/readonly.rb +2 -2
  58. data/lib/mongoid/attributes.rb +43 -40
  59. data/lib/mongoid/cacheable.rb +2 -2
  60. data/lib/mongoid/changeable.rb +43 -10
  61. data/lib/mongoid/clients/options.rb +5 -1
  62. data/lib/mongoid/clients/sessions.rb +2 -14
  63. data/lib/mongoid/clients/validators/storage.rb +3 -3
  64. data/lib/mongoid/config/options.rb +3 -0
  65. data/lib/mongoid/config/validators/client.rb +6 -6
  66. data/lib/mongoid/config.rb +62 -17
  67. data/lib/mongoid/contextual/aggregable/memory.rb +24 -16
  68. data/lib/mongoid/contextual/aggregable/mongo.rb +5 -5
  69. data/lib/mongoid/contextual/aggregable/none.rb +1 -1
  70. data/lib/mongoid/contextual/atomic.rb +1 -1
  71. data/lib/mongoid/contextual/geo_near.rb +7 -7
  72. data/lib/mongoid/contextual/map_reduce.rb +2 -2
  73. data/lib/mongoid/contextual/memory.rb +180 -21
  74. data/lib/mongoid/contextual/mongo.rb +260 -217
  75. data/lib/mongoid/contextual/none.rb +67 -5
  76. data/lib/mongoid/contextual/queryable.rb +1 -1
  77. data/lib/mongoid/contextual.rb +2 -2
  78. data/lib/mongoid/copyable.rb +32 -8
  79. data/lib/mongoid/criteria/findable.rb +7 -4
  80. data/lib/mongoid/criteria/includable.rb +24 -20
  81. data/lib/mongoid/criteria/marshalable.rb +10 -2
  82. data/lib/mongoid/criteria/permission.rb +1 -1
  83. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -2
  84. data/lib/mongoid/criteria/queryable/extensions/array.rb +3 -14
  85. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
  86. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -2
  87. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
  88. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
  89. data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -15
  90. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -9
  91. data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
  92. data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
  93. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
  94. data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -1
  95. data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -14
  96. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -12
  97. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
  98. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
  99. data/lib/mongoid/criteria/queryable/key.rb +3 -3
  100. data/lib/mongoid/criteria/queryable/mergeable.rb +21 -0
  101. data/lib/mongoid/criteria/queryable/optional.rb +5 -11
  102. data/lib/mongoid/criteria/queryable/options.rb +2 -2
  103. data/lib/mongoid/criteria/queryable/pipeline.rb +1 -1
  104. data/lib/mongoid/criteria/queryable/selectable.rb +31 -37
  105. data/lib/mongoid/criteria/queryable/selector.rb +93 -8
  106. data/lib/mongoid/criteria/queryable/smash.rb +40 -7
  107. data/lib/mongoid/criteria/queryable/storable.rb +1 -1
  108. data/lib/mongoid/criteria/queryable.rb +12 -7
  109. data/lib/mongoid/criteria/scopable.rb +2 -2
  110. data/lib/mongoid/criteria/translator.rb +45 -0
  111. data/lib/mongoid/criteria.rb +16 -35
  112. data/lib/mongoid/deprecable.rb +37 -0
  113. data/lib/mongoid/deprecation.rb +25 -0
  114. data/lib/mongoid/document.rb +135 -34
  115. data/lib/mongoid/equality.rb +8 -8
  116. data/lib/mongoid/errors/document_not_found.rb +33 -12
  117. data/lib/mongoid/errors/invalid_config_option.rb +1 -1
  118. data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -1
  119. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  120. data/lib/mongoid/errors/invalid_field.rb +6 -2
  121. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  122. data/lib/mongoid/errors/invalid_relation.rb +1 -1
  123. data/lib/mongoid/errors/invalid_relation_option.rb +1 -1
  124. data/lib/mongoid/errors/invalid_session_use.rb +1 -1
  125. data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
  126. data/lib/mongoid/errors/mongoid_error.rb +3 -3
  127. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -1
  128. data/lib/mongoid/errors/no_client_database.rb +1 -1
  129. data/lib/mongoid/errors/no_client_hosts.rb +1 -1
  130. data/lib/mongoid/errors/readonly_attribute.rb +1 -1
  131. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  132. data/lib/mongoid/errors/unknown_attribute.rb +1 -1
  133. data/lib/mongoid/errors.rb +2 -2
  134. data/lib/mongoid/extensions/array.rb +9 -7
  135. data/lib/mongoid/extensions/big_decimal.rb +33 -10
  136. data/lib/mongoid/extensions/binary.rb +42 -0
  137. data/lib/mongoid/extensions/boolean.rb +8 -2
  138. data/lib/mongoid/extensions/date.rb +26 -20
  139. data/lib/mongoid/extensions/date_time.rb +1 -1
  140. data/lib/mongoid/extensions/false_class.rb +1 -1
  141. data/lib/mongoid/extensions/float.rb +7 -4
  142. data/lib/mongoid/extensions/hash.rb +37 -8
  143. data/lib/mongoid/extensions/integer.rb +7 -4
  144. data/lib/mongoid/extensions/module.rb +1 -1
  145. data/lib/mongoid/extensions/object.rb +8 -6
  146. data/lib/mongoid/extensions/range.rb +41 -10
  147. data/lib/mongoid/extensions/regexp.rb +11 -4
  148. data/lib/mongoid/extensions/set.rb +11 -4
  149. data/lib/mongoid/extensions/string.rb +11 -22
  150. data/lib/mongoid/extensions/symbol.rb +4 -15
  151. data/lib/mongoid/extensions/time.rb +27 -16
  152. data/lib/mongoid/extensions/time_with_zone.rb +1 -2
  153. data/lib/mongoid/extensions/true_class.rb +1 -1
  154. data/lib/mongoid/extensions.rb +1 -0
  155. data/lib/mongoid/factory.rb +55 -7
  156. data/lib/mongoid/fields/foreign_key.rb +11 -4
  157. data/lib/mongoid/fields/localized.rb +9 -4
  158. data/lib/mongoid/fields/standard.rb +7 -7
  159. data/lib/mongoid/fields/validators/macro.rb +3 -9
  160. data/lib/mongoid/fields.rb +233 -40
  161. data/lib/mongoid/findable.rb +34 -13
  162. data/lib/mongoid/indexable/specification.rb +2 -2
  163. data/lib/mongoid/indexable/validators/options.rb +6 -2
  164. data/lib/mongoid/interceptable.rb +185 -16
  165. data/lib/mongoid/matchable.rb +1 -1
  166. data/lib/mongoid/matcher.rb +33 -13
  167. data/lib/mongoid/persistable/creatable.rb +18 -9
  168. data/lib/mongoid/persistable/deletable.rb +1 -1
  169. data/lib/mongoid/persistable/destroyable.rb +1 -1
  170. data/lib/mongoid/persistable/savable.rb +2 -2
  171. data/lib/mongoid/persistable/unsettable.rb +1 -1
  172. data/lib/mongoid/persistable/updatable.rb +19 -12
  173. data/lib/mongoid/persistable/upsertable.rb +1 -1
  174. data/lib/mongoid/persistable.rb +3 -3
  175. data/lib/mongoid/persistence_context.rb +63 -10
  176. data/lib/mongoid/query_cache.rb +8 -260
  177. data/lib/mongoid/railties/controller_runtime.rb +1 -1
  178. data/lib/mongoid/reloadable.rb +10 -8
  179. data/lib/mongoid/scopable.rb +26 -22
  180. data/lib/mongoid/selectable.rb +1 -2
  181. data/lib/mongoid/serializable.rb +10 -6
  182. data/lib/mongoid/shardable.rb +35 -11
  183. data/lib/mongoid/stateful.rb +35 -9
  184. data/lib/mongoid/tasks/database.rb +0 -2
  185. data/lib/mongoid/threaded/lifecycle.rb +5 -5
  186. data/lib/mongoid/threaded.rb +42 -12
  187. data/lib/mongoid/timestamps/created.rb +1 -1
  188. data/lib/mongoid/timestamps/updated.rb +2 -2
  189. data/lib/mongoid/touchable.rb +2 -3
  190. data/lib/mongoid/traversable.rb +5 -4
  191. data/lib/mongoid/validatable/localizable.rb +1 -1
  192. data/lib/mongoid/validatable/macros.rb +0 -2
  193. data/lib/mongoid/validatable/presence.rb +2 -2
  194. data/lib/mongoid/validatable/uniqueness.rb +9 -8
  195. data/lib/mongoid/validatable.rb +6 -6
  196. data/lib/mongoid/version.rb +1 -1
  197. data/lib/mongoid/warnings.rb +28 -0
  198. data/lib/mongoid.rb +2 -0
  199. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +4 -3
  200. data/spec/config/mongoid.yml +16 -0
  201. data/spec/integration/app_spec.rb +8 -12
  202. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  203. data/spec/integration/associations/embedded_spec.rb +15 -0
  204. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  205. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  206. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  207. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  208. data/spec/integration/associations/has_one_spec.rb +97 -1
  209. data/spec/integration/associations/scope_option_spec.rb +1 -1
  210. data/spec/integration/callbacks_models.rb +95 -1
  211. data/spec/integration/callbacks_spec.rb +246 -4
  212. data/spec/integration/criteria/range_spec.rb +95 -1
  213. data/spec/integration/discriminator_key_spec.rb +115 -76
  214. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  215. data/spec/integration/i18n_fallbacks_spec.rb +1 -17
  216. data/spec/integration/matcher_examples_spec.rb +20 -13
  217. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  218. data/spec/integration/matcher_operator_spec.rb +3 -5
  219. data/spec/integration/persistence/range_field_spec.rb +350 -0
  220. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  221. data/spec/mongoid/association/depending_spec.rb +9 -9
  222. data/spec/mongoid/association/eager_spec.rb +2 -1
  223. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  224. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  225. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +69 -9
  226. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  227. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +235 -40
  228. data/spec/mongoid/association/embedded/embeds_many_models.rb +36 -0
  229. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
  230. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  231. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  232. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  233. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  234. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  235. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  236. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
  237. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  238. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2 -2
  239. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +202 -201
  240. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  241. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  242. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  243. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +8 -8
  244. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +160 -119
  245. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  246. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  247. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  248. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  249. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  250. data/spec/mongoid/association/syncable_spec.rb +14 -0
  251. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  252. data/spec/mongoid/attributes/nested_spec.rb +80 -11
  253. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  254. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  255. data/spec/mongoid/attributes_spec.rb +551 -27
  256. data/spec/mongoid/cacheable_spec.rb +3 -3
  257. data/spec/mongoid/changeable_spec.rb +130 -13
  258. data/spec/mongoid/clients/factory_spec.rb +23 -30
  259. data/spec/mongoid/clients/options_spec.rb +1 -0
  260. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  261. data/spec/mongoid/clients_spec.rb +57 -2
  262. data/spec/mongoid/config_spec.rb +78 -18
  263. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  264. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  265. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  266. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  267. data/spec/mongoid/contextual/memory_spec.rb +1336 -69
  268. data/spec/mongoid/contextual/mongo_spec.rb +1253 -247
  269. data/spec/mongoid/contextual/none_spec.rb +38 -0
  270. data/spec/mongoid/copyable_spec.rb +451 -1
  271. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  272. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  273. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  274. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  275. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  276. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  277. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  278. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  279. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  280. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  281. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +0 -59
  282. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
  283. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  284. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  285. data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -484
  286. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +50 -0
  287. data/spec/mongoid/criteria/queryable/selectable_spec.rb +289 -124
  288. data/spec/mongoid/criteria/queryable/selector_spec.rb +89 -4
  289. data/spec/mongoid/criteria/queryable/storable_spec.rb +72 -0
  290. data/spec/mongoid/criteria/translator_spec.rb +132 -0
  291. data/spec/mongoid/criteria_projection_spec.rb +0 -1
  292. data/spec/mongoid/criteria_spec.rb +475 -1199
  293. data/spec/mongoid/document_fields_spec.rb +173 -24
  294. data/spec/mongoid/document_spec.rb +32 -41
  295. data/spec/mongoid/errors/document_not_found_spec.rb +76 -0
  296. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  297. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  298. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  299. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  300. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  301. data/spec/mongoid/extensions/array_spec.rb +16 -2
  302. data/spec/mongoid/extensions/big_decimal_spec.rb +712 -212
  303. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  304. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  305. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  306. data/spec/mongoid/extensions/date_spec.rb +71 -1
  307. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  308. data/spec/mongoid/extensions/float_spec.rb +53 -74
  309. data/spec/mongoid/extensions/hash_spec.rb +33 -3
  310. data/spec/mongoid/extensions/integer_spec.rb +50 -64
  311. data/spec/mongoid/extensions/range_spec.rb +255 -54
  312. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  313. data/spec/mongoid/extensions/set_spec.rb +106 -0
  314. data/spec/mongoid/extensions/string_spec.rb +53 -25
  315. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  316. data/spec/mongoid/extensions/time_spec.rb +634 -66
  317. data/spec/mongoid/extensions/time_with_zone_spec.rb +17 -31
  318. data/spec/mongoid/factory_spec.rb +61 -1
  319. data/spec/mongoid/fields/localized_spec.rb +37 -12
  320. data/spec/mongoid/fields_spec.rb +364 -50
  321. data/spec/mongoid/findable_spec.rb +80 -15
  322. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  323. data/spec/mongoid/indexable_spec.rb +39 -20
  324. data/spec/mongoid/interceptable_spec.rb +807 -27
  325. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  326. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  327. data/spec/mongoid/mongoizable_spec.rb +285 -0
  328. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  329. data/spec/mongoid/persistable/deletable_spec.rb +2 -2
  330. data/spec/mongoid/persistable/destroyable_spec.rb +2 -2
  331. data/spec/mongoid/persistable/upsertable_spec.rb +14 -0
  332. data/spec/mongoid/persistence_context_spec.rb +50 -1
  333. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  334. data/spec/mongoid/query_cache_spec.rb +0 -154
  335. data/spec/mongoid/reloadable_spec.rb +59 -2
  336. data/spec/mongoid/scopable_spec.rb +54 -16
  337. data/spec/mongoid/shardable_models.rb +14 -0
  338. data/spec/mongoid/shardable_spec.rb +157 -51
  339. data/spec/mongoid/stateful_spec.rb +28 -0
  340. data/spec/mongoid/timestamps_spec.rb +390 -0
  341. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  342. data/spec/mongoid/touchable_spec.rb +116 -0
  343. data/spec/mongoid/touchable_spec_models.rb +12 -8
  344. data/spec/mongoid/traversable_spec.rb +4 -11
  345. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  346. data/spec/mongoid/validatable/uniqueness_spec.rb +59 -31
  347. data/spec/mongoid/warnings_spec.rb +35 -0
  348. data/spec/mongoid_spec.rb +1 -1
  349. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  350. data/spec/rails/mongoid_spec.rb +4 -16
  351. data/spec/shared/lib/mrss/docker_runner.rb +7 -0
  352. data/spec/shared/lib/mrss/lite_constraints.rb +10 -2
  353. data/spec/shared/lib/mrss/server_version_registry.rb +16 -23
  354. data/spec/shared/lib/mrss/utils.rb +28 -6
  355. data/spec/shared/share/Dockerfile.erb +36 -40
  356. data/spec/shared/shlib/server.sh +32 -8
  357. data/spec/shared/shlib/set_env.sh +4 -4
  358. data/spec/support/constraints.rb +24 -0
  359. data/spec/support/macros.rb +46 -0
  360. data/spec/support/models/augmentation.rb +12 -0
  361. data/spec/support/models/band.rb +3 -0
  362. data/spec/support/models/catalog.rb +24 -0
  363. data/spec/support/models/circus.rb +3 -0
  364. data/spec/support/models/code.rb +2 -0
  365. data/spec/support/models/fanatic.rb +8 -0
  366. data/spec/support/models/implant.rb +9 -0
  367. data/spec/support/models/label.rb +2 -0
  368. data/spec/support/models/passport.rb +9 -0
  369. data/spec/support/models/person.rb +2 -0
  370. data/spec/support/models/player.rb +2 -0
  371. data/spec/support/models/powerup.rb +12 -0
  372. data/spec/support/models/purse.rb +9 -0
  373. data/spec/support/models/registry.rb +1 -0
  374. data/spec/support/models/school.rb +14 -0
  375. data/spec/support/models/shield.rb +18 -0
  376. data/spec/support/models/student.rb +14 -0
  377. data/spec/support/models/weapon.rb +12 -0
  378. data.tar.gz.sig +4 -1
  379. metadata +682 -635
  380. metadata.gz.sig +0 -0
  381. data/lib/mongoid/errors/eager_load.rb +0 -23
  382. data/lib/mongoid/errors/invalid_value.rb +0 -17
  383. 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
 
@@ -1077,8 +1078,8 @@ describe Mongoid::Attributes do
1077
1078
  context "after the attribute has been assigned" do
1078
1079
 
1079
1080
  it "returns the default value" do
1080
- person.age = "old"
1081
- expect(person.age_before_type_cast).to eq("old")
1081
+ person.age = "42"
1082
+ expect(person.age_before_type_cast).to eq("42")
1082
1083
  end
1083
1084
  end
1084
1085
 
@@ -1265,15 +1266,15 @@ describe Mongoid::Attributes do
1265
1266
 
1266
1267
  context "before the attribute has been assigned" do
1267
1268
 
1268
- it "returns false" do
1269
- expect(person.has_attribute_before_type_cast?(:age)).to be false
1269
+ it "returns true" do
1270
+ expect(person.has_attribute_before_type_cast?(:age)).to be true
1270
1271
  end
1271
1272
  end
1272
1273
 
1273
1274
  context "after the attribute has been assigned" do
1274
1275
 
1275
1276
  it "returns true" do
1276
- person.age = 'old'
1277
+ person.age = '42'
1277
1278
  expect(person.has_attribute_before_type_cast?(:age)).to be true
1278
1279
  end
1279
1280
  end
@@ -1528,12 +1529,13 @@ describe Mongoid::Attributes do
1528
1529
  end
1529
1530
 
1530
1531
  context "when setting an attribute that needs type casting" do
1532
+
1531
1533
  let(:person) do
1532
- Person.new(age: "old")
1534
+ Person.new(age: "42")
1533
1535
  end
1534
1536
 
1535
1537
  it "should store the attribute before type cast" do
1536
- expect(person.age_before_type_cast).to eq("old")
1538
+ expect(person.age_before_type_cast).to eq("42")
1537
1539
  end
1538
1540
  end
1539
1541
 
@@ -1581,16 +1583,14 @@ describe Mongoid::Attributes do
1581
1583
  context "when attribute is a Hash" do
1582
1584
  let(:person) { Person.new map: { somekey: "somevalue" } }
1583
1585
 
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/)
1586
+ it "writes nil when trying to set a value of invalid type - array" do
1587
+ person.map = []
1588
+ expect(person.map).to be_nil
1588
1589
  end
1589
1590
 
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/)
1591
+ it "writes nil when trying to set a value of invalid type - boolean" do
1592
+ person.map = false
1593
+ expect(person.map).to be_nil
1594
1594
  end
1595
1595
 
1596
1596
  it "can set a Hash value" do
@@ -1605,16 +1605,14 @@ describe Mongoid::Attributes do
1605
1605
  expect(person.aliases).to eq([ :alias_1 ])
1606
1606
  end
1607
1607
 
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/)
1608
+ it "writes nil when trying to set a value of invalid type - hash" do
1609
+ person.aliases = {}
1610
+ expect(person.aliases).to be_nil
1612
1611
  end
1613
1612
 
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/)
1613
+ it "writes nil when trying to set a value of invalid type - boolean" do
1614
+ person.aliases = false
1615
+ expect(person.aliases).to be_nil
1618
1616
  end
1619
1617
  end
1620
1618
 
@@ -1675,6 +1673,50 @@ describe Mongoid::Attributes do
1675
1673
  end
1676
1674
  end
1677
1675
  end
1676
+
1677
+ context "when comparing the object_ids of the written value" do
1678
+ config_override :legacy_attributes, false
1679
+
1680
+ before do
1681
+ Person.create!
1682
+ end
1683
+
1684
+ let(:person) do
1685
+ Person.first
1686
+ end
1687
+
1688
+ context "when the field is not resizable" do
1689
+ let(:test) do
1690
+ person.write_attribute(:test, "aliased field to test")
1691
+ end
1692
+
1693
+ it "has the same object_id as the attributes hash value" do
1694
+ expect(test.object_id).to eq(person.test.object_id)
1695
+ end
1696
+ end
1697
+
1698
+ context "when the field is resizable" do
1699
+
1700
+ let(:arrays) do
1701
+ person.write_attribute(:arrays, [])
1702
+ end
1703
+
1704
+ it "has the same object_id as the attributes hash value" do
1705
+ expect(arrays.object_id).to eq(person.arrays.object_id)
1706
+ end
1707
+ end
1708
+
1709
+ context "when the field is a HABTM foreign key array" do
1710
+
1711
+ let(:preference_ids) do
1712
+ person.write_attribute(:preference_ids, [])
1713
+ end
1714
+
1715
+ it "has the same object_id as the attributes hash value" do
1716
+ expect(preference_ids.object_id).to eq(person.preference_ids.object_id)
1717
+ end
1718
+ end
1719
+ end
1678
1720
  end
1679
1721
 
1680
1722
  describe "#typed_value_for" do
@@ -1855,11 +1897,11 @@ describe Mongoid::Attributes do
1855
1897
  end
1856
1898
 
1857
1899
  it "has 3 new entries" do
1858
- expect(pet.vet_visits.count).to eq(3)
1900
+ expect(pet.vet_visits.count).to eq 3
1859
1901
  end
1860
1902
 
1861
1903
  it "persists the changes" do
1862
- expect(pet.reload.vet_visits.count).to eq(3)
1904
+ expect(pet.reload.vet_visits.count).to eq 3
1863
1905
  end
1864
1906
  end
1865
1907
 
@@ -2029,8 +2071,8 @@ describe Mongoid::Attributes do
2029
2071
  end
2030
2072
 
2031
2073
  it "aliases *_before_type_cast" do
2032
- product.cost = "expensive"
2033
- expect(product.cost_before_type_cast).to eq("expensive")
2074
+ product.cost = "42"
2075
+ expect(product.cost_before_type_cast).to eq("42")
2034
2076
  end
2035
2077
  end
2036
2078
 
@@ -2214,4 +2256,486 @@ describe Mongoid::Attributes do
2214
2256
  end
2215
2257
  end
2216
2258
  end
2259
+
2260
+ context "when an attribute is removed then set" do
2261
+ let(:cat) { Cat.create!(name: "Neil") }
2262
+
2263
+ before do
2264
+ cat.remove_attribute("name")
2265
+ cat.name = "Nissim"
2266
+ cat.save!
2267
+ cat.reload
2268
+ end
2269
+
2270
+ it "correctly sets the attribute" do
2271
+ expect(cat.name).to eq("Nissim")
2272
+ end
2273
+ end
2274
+
2275
+ describe "attributes after setting an association without reloading" do
2276
+
2277
+ context "on embeds_many" do
2278
+
2279
+ context "when not setting anything" do
2280
+ let(:doc) { NestedBook.create! }
2281
+
2282
+ it "doesn't add attributes" do
2283
+ expect(doc.attributes).to_not have_key("pages")
2284
+ end
2285
+
2286
+ it "has the same attributes after reloading" do
2287
+ expect(doc.attributes).to eq(doc.reload.attributes)
2288
+ end
2289
+ end
2290
+
2291
+ context "when using nested attributes" do
2292
+ let(:doc) { NestedBook.create! }
2293
+
2294
+ before do
2295
+ doc.update_attributes({ pages_attributes: [ {} ] })
2296
+ end
2297
+
2298
+ it "updates the attributes" do
2299
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2300
+ end
2301
+
2302
+ it "has the same attributes after reloading" do
2303
+ expect(doc.attributes).to eq(doc.reload.attributes)
2304
+ end
2305
+ end
2306
+
2307
+ context "when doing assignments" do
2308
+ let(:doc) { NestedBook.create! }
2309
+ before do
2310
+ doc.pages = [NestedPage.new]
2311
+ end
2312
+
2313
+ it "updates the attributes" do
2314
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2315
+ end
2316
+
2317
+ it "has the same attributes after reloading" do
2318
+ expect(doc.attributes).to eq(doc.reload.attributes)
2319
+ end
2320
+ end
2321
+
2322
+ context "when replacing assignments" do
2323
+ let(:doc) { NestedBook.create! }
2324
+ before do
2325
+ doc.pages = [NestedPage.new(number: 1)]
2326
+ doc.pages = [NestedPage.new(number: 2)]
2327
+ end
2328
+
2329
+ it "updates the attributes" do
2330
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id, "number" => 2 }])
2331
+ end
2332
+
2333
+ it "has the same attributes after reloading" do
2334
+ expect(doc.attributes).to eq(doc.reload.attributes)
2335
+ end
2336
+ end
2337
+
2338
+ context "when setting to nil" do
2339
+ let(:doc) { NestedBook.create! }
2340
+ before do
2341
+ doc.pages = [NestedPage.new(number: 1)]
2342
+ doc.pages = nil
2343
+ end
2344
+
2345
+ it "updates the attributes" do
2346
+ expect(doc.attributes).to_not have_key("pages")
2347
+ end
2348
+
2349
+ it "has the same attributes after reloading" do
2350
+ expect({ "pages" => [] }.merge(doc.attributes)).to eq(doc.reload.attributes)
2351
+ end
2352
+ end
2353
+
2354
+ context "when setting to nil and back" do
2355
+ let(:doc) { NestedBook.create! }
2356
+ let(:page) { NestedPage.new }
2357
+ before do
2358
+ doc.pages = [page]
2359
+ doc.pages = nil
2360
+ doc.pages = [page]
2361
+ end
2362
+
2363
+ it "updates the attributes" do
2364
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2365
+ end
2366
+
2367
+ it "has the same attributes after reloading" do
2368
+ expect(doc.attributes).to eq(doc.reload.attributes)
2369
+ end
2370
+ end
2371
+
2372
+ context "when pushing" do
2373
+ let(:doc) { NestedBook.create! }
2374
+ before do
2375
+ doc.pages << NestedPage.new
2376
+ end
2377
+
2378
+ it "updates the attributes" do
2379
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2380
+ end
2381
+
2382
+ it "has the same attributes after reloading" do
2383
+ expect(doc.attributes).to eq(doc.reload.attributes)
2384
+ end
2385
+ end
2386
+
2387
+ [:shift, :pop].each do |meth|
2388
+ context "when performing #{meth}" do
2389
+ let(:doc) { NestedBook.create! }
2390
+ before do
2391
+ doc.pages << NestedPage.new
2392
+ doc.pages << NestedPage.new
2393
+ doc.pages << NestedPage.new
2394
+
2395
+ doc.pages.send(meth, 2)
2396
+ end
2397
+
2398
+ it "updates the attributes" do
2399
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2400
+ end
2401
+
2402
+ it "has the same attributes after reloading" do
2403
+ expect(doc.attributes).to eq(doc.reload.attributes)
2404
+ end
2405
+ end
2406
+ end
2407
+
2408
+ context "when concatting" do
2409
+ let(:doc) { NestedBook.create! }
2410
+ before do
2411
+ doc.pages << NestedPage.new
2412
+ doc.pages.concat([NestedPage.new, NestedPage.new])
2413
+ end
2414
+
2415
+ it "updates the attributes" do
2416
+ expect(doc.attributes["pages"].count).to eq 3
2417
+ end
2418
+
2419
+ it "has the same attributes after reloading" do
2420
+ expect(doc.attributes).to eq(doc.reload.attributes)
2421
+ end
2422
+ end
2423
+
2424
+ [:build, :create].each do |meth|
2425
+ context "when preforming #{meth}" do
2426
+ let(:doc) { NestedBook.create! }
2427
+ before do
2428
+ doc.pages.send(meth)
2429
+ end
2430
+
2431
+ it "updates the attributes" do
2432
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2433
+ end
2434
+
2435
+ it "has the same attributes after reloading" do
2436
+ doc.pages.first.save
2437
+ expect(doc.attributes).to eq(doc.reload.attributes)
2438
+ end
2439
+ end
2440
+ end
2441
+
2442
+ context "when clearing" do
2443
+ let(:doc) { NestedBook.create! }
2444
+ before do
2445
+ doc.pages << NestedPage.new
2446
+ doc.pages << NestedPage.new
2447
+ doc.pages << NestedPage.new
2448
+
2449
+ doc.pages.clear
2450
+ end
2451
+
2452
+ it "updates the attributes" do
2453
+ expect(doc.attributes).to_not have_key("pages")
2454
+ end
2455
+
2456
+ it "has the same attributes after reloading" do
2457
+ expect(doc.attributes).to eq(doc.reload.attributes)
2458
+ end
2459
+ end
2460
+
2461
+ [:delete_all, :destroy_all, :remove_all].each do |meth|
2462
+ context "when performing: #{meth}" do
2463
+ let(:doc) { NestedBook.create! }
2464
+ before do
2465
+ doc.pages << NestedPage.new
2466
+ doc.pages << NestedPage.new
2467
+ doc.pages << NestedPage.new
2468
+
2469
+ doc.pages.send(meth)
2470
+ end
2471
+
2472
+ it "updates the attributes" do
2473
+ expect(doc.attributes).to_not have_key("pages")
2474
+ end
2475
+
2476
+ it "has the same attributes after reloading" do
2477
+ expect({ "pages" => [] }.merge(doc.attributes)).to eq(doc.reload.attributes)
2478
+ end
2479
+ end
2480
+ end
2481
+
2482
+ context "when deleting" do
2483
+ let(:doc) { NestedBook.create! }
2484
+ let(:page) { NestedPage.new }
2485
+ before do
2486
+ doc.pages << page
2487
+ doc.pages << NestedPage.new
2488
+ doc.pages << NestedPage.new
2489
+
2490
+ doc.pages.delete(page)
2491
+ end
2492
+
2493
+ it "updates the attributes" do
2494
+ expect(doc.attributes["pages"].count).to eq 2
2495
+ end
2496
+
2497
+ it "has the same attributes after reloading" do
2498
+ expect(doc.attributes).to eq(doc.reload.attributes)
2499
+ end
2500
+ end
2501
+
2502
+ context "when doing _remove" do
2503
+ let(:doc) { NestedBook.create! }
2504
+ let(:page) { NestedPage.new }
2505
+ before do
2506
+ doc.pages << page
2507
+ doc.pages << NestedPage.new
2508
+ doc.pages << NestedPage.new
2509
+
2510
+ doc.pages._remove(page)
2511
+ end
2512
+
2513
+ it "updates the attributes" do
2514
+ expect(doc.attributes["pages"].count).to eq 2
2515
+ end
2516
+ end
2517
+
2518
+ context "when assigning an array of hashes" do
2519
+ let(:doc) { NestedBook.create! }
2520
+ before do
2521
+ doc.pages = [{}]
2522
+ end
2523
+
2524
+ it "updates the attributes" do
2525
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2526
+ end
2527
+
2528
+ it "has the same attributes after reloading" do
2529
+ expect(doc.attributes).to eq(doc.reload.attributes)
2530
+ end
2531
+ end
2532
+
2533
+ context "when assigning twice" do
2534
+ let(:doc) { NestedBook.create! }
2535
+ before do
2536
+ doc.pages = [{ number: 1 }]
2537
+ doc.pages = [{}]
2538
+ end
2539
+
2540
+ it "updates the attributes" do
2541
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2542
+ end
2543
+
2544
+ it "has the same attributes after reloading" do
2545
+ expect(doc.attributes).to eq(doc.reload.attributes)
2546
+ end
2547
+ end
2548
+ end
2549
+
2550
+ context "on embeds_one" do
2551
+
2552
+ let(:attrs) { { "title" => "Title" } }
2553
+
2554
+ context "when using nested attributes" do
2555
+ let(:doc) { NestedBook.create! }
2556
+
2557
+ before do
2558
+ doc.update_attributes({ cover_attributes: attrs })
2559
+ end
2560
+
2561
+ it "updates the attributes" do
2562
+ expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
2563
+ end
2564
+
2565
+ it "has the same attributes after reloading" do
2566
+ expect(doc.attributes).to eq(doc.reload.attributes)
2567
+ end
2568
+ end
2569
+
2570
+ context "when doing assignments" do
2571
+ let(:doc) { NestedBook.create! }
2572
+ before do
2573
+ doc.cover = NestedCover.new(attrs)
2574
+ end
2575
+
2576
+ it "updates the attributes" do
2577
+ expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
2578
+ end
2579
+
2580
+ it "has the same attributes after reloading" do
2581
+ expect(doc.attributes).to eq(doc.reload.attributes)
2582
+ end
2583
+ end
2584
+
2585
+ context "when replacing assignments" do
2586
+ let(:doc) { NestedBook.create! }
2587
+ before do
2588
+ doc.cover = NestedCover.new("title" => "Title1")
2589
+ doc.cover = NestedCover.new(attrs)
2590
+ end
2591
+
2592
+ it "updates the attributes" do
2593
+ expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
2594
+ end
2595
+
2596
+ it "has the same attributes after reloading" do
2597
+ expect(doc.attributes).to eq(doc.reload.attributes)
2598
+ end
2599
+ end
2600
+
2601
+ context "when setting to nil" do
2602
+ let(:doc) { NestedBook.create! }
2603
+ before do
2604
+ doc.cover = NestedCover.new(attrs)
2605
+ doc.cover = nil
2606
+ end
2607
+
2608
+ it "updates the attributes" do
2609
+ expect(doc.attributes.key?("cover")).to be false
2610
+ end
2611
+
2612
+ it "has the same attributes after reloading" do
2613
+ expect(doc.attributes).to eq(doc.reload.attributes)
2614
+ end
2615
+ end
2616
+
2617
+ context "when setting to nil and back" do
2618
+ let(:doc) { NestedBook.create! }
2619
+ before do
2620
+ doc.cover = NestedCover.new(attrs)
2621
+ doc.cover = nil
2622
+ doc.cover = NestedCover.new(attrs)
2623
+ end
2624
+
2625
+ it "updates the attributes" do
2626
+ expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
2627
+ end
2628
+
2629
+
2630
+ it "has the same attributes after reloading" do
2631
+ expect(doc.attributes).to eq(doc.reload.attributes)
2632
+ end
2633
+ end
2634
+
2635
+ [:build, :create].each do |meth|
2636
+ context "when preforming #{meth}" do
2637
+ let(:doc) { NestedBook.create! }
2638
+ before do
2639
+ doc.send("#{meth}_cover", attrs)
2640
+ end
2641
+
2642
+ it "updates the attributes" do
2643
+ expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
2644
+ end
2645
+
2646
+ it "has the same attributes after reloading" do
2647
+ doc.cover.save
2648
+ expect(doc.attributes).to eq(doc.reload.attributes)
2649
+ end
2650
+ end
2651
+ end
2652
+
2653
+ context "when assigning a hash" do
2654
+ let(:doc) { NestedBook.create! }
2655
+ before do
2656
+ doc.cover = attrs
2657
+ end
2658
+
2659
+ it "updates the attributes" do
2660
+ expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
2661
+ end
2662
+
2663
+ it "has the same attributes after reloading" do
2664
+ expect(doc.attributes).to eq(doc.reload.attributes)
2665
+ end
2666
+ end
2667
+
2668
+ context "when assigning twice" do
2669
+ let(:doc) { NestedBook.create! }
2670
+ before do
2671
+ doc.cover = { "title" => "1984" }
2672
+ doc.cover = attrs
2673
+ end
2674
+
2675
+ it "updates the attributes" do
2676
+ expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
2677
+ end
2678
+
2679
+ it "has the same attributes after reloading" do
2680
+ expect(doc.attributes).to eq(doc.reload.attributes)
2681
+ end
2682
+ end
2683
+ end
2684
+ end
2685
+
2686
+ context "when modifiying a hash referenced with the [] notation" do
2687
+ let(:church) { Church.create!(location: { x: 1 }) }
2688
+
2689
+ before do
2690
+ church[:location].merge!(y: 2)
2691
+ church.save!
2692
+ church.reload
2693
+ end
2694
+
2695
+ it "persists the updated hash" do
2696
+ church.location.should == { "x" => 1, "y" => 2 }
2697
+ end
2698
+ end
2699
+
2700
+ context "when modifiying a set referenced with the [] notation" do
2701
+ let(:catalog) { Catalog.create!(set_field: [ 1 ].to_set) }
2702
+
2703
+ before do
2704
+ catalog[:set_field] << 2
2705
+ catalog.save!
2706
+ catalog.reload
2707
+ end
2708
+
2709
+ it "persists the updated hash" do
2710
+ pending "MONGOID-2951"
2711
+ catalog.set_field.should == Set.new([ 1, 2 ])
2712
+ end
2713
+ end
2714
+
2715
+ context 'when an embedded field has a capitalized store_as name' do
2716
+ let(:person) { Person.new(Purse: { brand: 'Gucci' }) }
2717
+
2718
+ it 'sets the value' do
2719
+ expect(person.purse.brand).to eq('Gucci')
2720
+ end
2721
+
2722
+ it 'saves successfully' do
2723
+ expect(person.save!).to eq(true)
2724
+ end
2725
+
2726
+ context 'when persisted' do
2727
+ before do
2728
+ person.save!
2729
+ person.reload
2730
+ end
2731
+
2732
+ it 'persists the value' do
2733
+ expect(person.reload.purse.brand).to eq('Gucci')
2734
+ end
2735
+
2736
+ it 'uses the correct key in the database' do
2737
+ expect(person.collection.find(_id: person.id).first['Purse']['_id']).to eq(person.purse.id)
2738
+ end
2739
+ end
2740
+ end
2217
2741
  end
@@ -45,7 +45,7 @@ describe Mongoid::Cacheable do
45
45
  context "with the default cache_timestamp_format" do
46
46
 
47
47
  let!(:updated_at) do
48
- document.updated_at.utc.to_s(:nsec)
48
+ document.updated_at.utc.to_formatted_s(:nsec)
49
49
  end
50
50
 
51
51
  it "has the id and updated_at key name" do
@@ -64,7 +64,7 @@ describe Mongoid::Cacheable do
64
64
  end
65
65
 
66
66
  let!(:updated_at) do
67
- document.updated_at.utc.to_s(:number)
67
+ document.updated_at.utc.to_formatted_s(:number)
68
68
  end
69
69
 
70
70
  it "has the id and updated_at key name" do
@@ -103,7 +103,7 @@ describe Mongoid::Cacheable do
103
103
  end
104
104
 
105
105
  let!(:updated_at) do
106
- agent.updated_at.utc.to_s(:nsec)
106
+ agent.updated_at.utc.to_formatted_s(:nsec)
107
107
  end
108
108
 
109
109
  it "has the id and updated_at key name" do