mongoid 7.4.0 → 8.0.3

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