mongoid 7.5.4 → 8.1.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 (442) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +3 -3
  3. data/README.md +6 -6
  4. data/Rakefile +44 -46
  5. data/lib/config/locales/en.yml +92 -43
  6. data/lib/mongoid/association/accessors.rb +44 -11
  7. data/lib/mongoid/association/bindable.rb +50 -2
  8. data/lib/mongoid/association/builders.rb +5 -3
  9. data/lib/mongoid/association/constrainable.rb +0 -1
  10. data/lib/mongoid/association/eager_loadable.rb +29 -7
  11. data/lib/mongoid/association/embedded/batchable.rb +34 -11
  12. data/lib/mongoid/association/embedded/cyclic.rb +1 -1
  13. data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
  14. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +2 -2
  15. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +4 -3
  16. data/lib/mongoid/association/embedded/embedded_in.rb +3 -2
  17. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
  18. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +4 -3
  19. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +85 -46
  20. data/lib/mongoid/association/embedded/embeds_many.rb +2 -2
  21. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +19 -5
  22. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +24 -5
  23. data/lib/mongoid/association/embedded/embeds_one.rb +3 -3
  24. data/lib/mongoid/association/macros.rb +8 -1
  25. data/lib/mongoid/association/many.rb +11 -7
  26. data/lib/mongoid/association/nested/many.rb +5 -4
  27. data/lib/mongoid/association/nested/nested_buildable.rb +4 -4
  28. data/lib/mongoid/association/nested/one.rb +45 -7
  29. data/lib/mongoid/association/one.rb +2 -2
  30. data/lib/mongoid/association/options.rb +9 -9
  31. data/lib/mongoid/association/proxy.rb +15 -4
  32. data/lib/mongoid/association/referenced/auto_save.rb +4 -3
  33. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  34. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  35. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +5 -6
  36. data/lib/mongoid/association/referenced/belongs_to.rb +2 -2
  37. data/lib/mongoid/association/referenced/counter_cache.rb +10 -10
  38. data/lib/mongoid/association/referenced/eager.rb +2 -2
  39. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +70 -13
  40. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +6 -3
  41. data/lib/mongoid/association/referenced/has_many/enumerable.rb +22 -30
  42. data/lib/mongoid/association/referenced/has_many/proxy.rb +40 -21
  43. data/lib/mongoid/association/referenced/has_many.rb +3 -3
  44. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  45. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +5 -5
  46. data/lib/mongoid/association/referenced/has_one/proxy.rb +9 -12
  47. data/lib/mongoid/association/referenced/has_one.rb +3 -3
  48. data/lib/mongoid/association/referenced/syncable.rb +4 -4
  49. data/lib/mongoid/association/reflections.rb +4 -4
  50. data/lib/mongoid/association/relatable.rb +44 -10
  51. data/lib/mongoid/association.rb +5 -5
  52. data/lib/mongoid/atomic/modifiers.rb +2 -2
  53. data/lib/mongoid/atomic.rb +16 -7
  54. data/lib/mongoid/attributes/dynamic.rb +4 -4
  55. data/lib/mongoid/attributes/nested.rb +6 -6
  56. data/lib/mongoid/attributes/processing.rb +37 -6
  57. data/lib/mongoid/attributes/projector.rb +2 -2
  58. data/lib/mongoid/attributes/readonly.rb +3 -3
  59. data/lib/mongoid/attributes.rb +51 -42
  60. data/lib/mongoid/changeable.rb +147 -14
  61. data/lib/mongoid/clients/options.rb +5 -1
  62. data/lib/mongoid/clients/sessions.rb +2 -14
  63. data/lib/mongoid/clients/storage_options.rb +2 -5
  64. data/lib/mongoid/clients/validators/storage.rb +3 -15
  65. data/lib/mongoid/collection_configurable.rb +58 -0
  66. data/lib/mongoid/composable.rb +2 -0
  67. data/lib/mongoid/config/defaults.rb +60 -0
  68. data/lib/mongoid/config/options.rb +3 -0
  69. data/lib/mongoid/config/validators/async_query_executor.rb +24 -0
  70. data/lib/mongoid/config/validators/client.rb +6 -6
  71. data/lib/mongoid/config/validators.rb +1 -0
  72. data/lib/mongoid/config.rb +153 -18
  73. data/lib/mongoid/contextual/aggregable/memory.rb +24 -16
  74. data/lib/mongoid/contextual/aggregable/mongo.rb +5 -5
  75. data/lib/mongoid/contextual/aggregable/none.rb +1 -1
  76. data/lib/mongoid/contextual/atomic.rb +1 -1
  77. data/lib/mongoid/contextual/geo_near.rb +7 -7
  78. data/lib/mongoid/contextual/map_reduce.rb +2 -2
  79. data/lib/mongoid/contextual/memory.rb +285 -58
  80. data/lib/mongoid/contextual/mongo/documents_loader.rb +177 -0
  81. data/lib/mongoid/contextual/mongo.rb +540 -346
  82. data/lib/mongoid/contextual/none.rb +193 -20
  83. data/lib/mongoid/contextual/queryable.rb +1 -1
  84. data/lib/mongoid/contextual.rb +14 -2
  85. data/lib/mongoid/copyable.rb +32 -8
  86. data/lib/mongoid/criteria/findable.rb +8 -5
  87. data/lib/mongoid/criteria/includable.rb +27 -22
  88. data/lib/mongoid/criteria/marshalable.rb +10 -2
  89. data/lib/mongoid/criteria/permission.rb +1 -1
  90. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -2
  91. data/lib/mongoid/criteria/queryable/extensions/array.rb +3 -16
  92. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
  93. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -2
  94. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
  95. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
  96. data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -17
  97. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +15 -9
  98. data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
  99. data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
  100. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
  101. data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -1
  102. data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -14
  103. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -12
  104. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
  105. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
  106. data/lib/mongoid/criteria/queryable/key.rb +4 -4
  107. data/lib/mongoid/criteria/queryable/mergeable.rb +1 -1
  108. data/lib/mongoid/criteria/queryable/optional.rb +11 -17
  109. data/lib/mongoid/criteria/queryable/options.rb +2 -2
  110. data/lib/mongoid/criteria/queryable/pipeline.rb +1 -1
  111. data/lib/mongoid/criteria/queryable/selectable.rb +47 -38
  112. data/lib/mongoid/criteria/queryable/selector.rb +92 -7
  113. data/lib/mongoid/criteria/queryable/smash.rb +40 -7
  114. data/lib/mongoid/criteria/queryable.rb +12 -7
  115. data/lib/mongoid/criteria/scopable.rb +2 -2
  116. data/lib/mongoid/criteria/translator.rb +45 -0
  117. data/lib/mongoid/criteria.rb +20 -40
  118. data/lib/mongoid/deprecable.rb +37 -0
  119. data/lib/mongoid/deprecation.rb +25 -0
  120. data/lib/mongoid/document.rb +127 -35
  121. data/lib/mongoid/equality.rb +8 -8
  122. data/lib/mongoid/errors/create_collection_failure.rb +33 -0
  123. data/lib/mongoid/errors/document_not_found.rb +10 -6
  124. data/lib/mongoid/errors/drop_collection_failure.rb +27 -0
  125. data/lib/mongoid/errors/immutable_attribute.rb +26 -0
  126. data/lib/mongoid/errors/invalid_async_query_executor.rb +25 -0
  127. data/lib/mongoid/errors/invalid_config_option.rb +1 -1
  128. data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -1
  129. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  130. data/lib/mongoid/errors/invalid_field.rb +6 -2
  131. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  132. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +22 -0
  133. data/lib/mongoid/errors/invalid_relation.rb +1 -1
  134. data/lib/mongoid/errors/invalid_relation_option.rb +1 -1
  135. data/lib/mongoid/errors/invalid_session_use.rb +1 -1
  136. data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
  137. data/lib/mongoid/errors/invalid_storage_parent.rb +2 -0
  138. data/lib/mongoid/errors/mongoid_error.rb +3 -3
  139. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -1
  140. data/lib/mongoid/errors/no_client_database.rb +1 -1
  141. data/lib/mongoid/errors/no_client_hosts.rb +1 -1
  142. data/lib/mongoid/errors/readonly_attribute.rb +1 -1
  143. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  144. data/lib/mongoid/errors/unknown_attribute.rb +1 -1
  145. data/lib/mongoid/errors.rb +6 -3
  146. data/lib/mongoid/extensions/array.rb +9 -7
  147. data/lib/mongoid/extensions/big_decimal.rb +33 -10
  148. data/lib/mongoid/extensions/binary.rb +42 -0
  149. data/lib/mongoid/extensions/boolean.rb +8 -2
  150. data/lib/mongoid/extensions/date.rb +26 -20
  151. data/lib/mongoid/extensions/date_time.rb +1 -1
  152. data/lib/mongoid/extensions/false_class.rb +1 -1
  153. data/lib/mongoid/extensions/float.rb +7 -4
  154. data/lib/mongoid/extensions/hash.rb +38 -9
  155. data/lib/mongoid/extensions/integer.rb +7 -4
  156. data/lib/mongoid/extensions/module.rb +1 -1
  157. data/lib/mongoid/extensions/object.rb +10 -8
  158. data/lib/mongoid/extensions/range.rb +41 -10
  159. data/lib/mongoid/extensions/regexp.rb +11 -4
  160. data/lib/mongoid/extensions/set.rb +11 -4
  161. data/lib/mongoid/extensions/string.rb +11 -22
  162. data/lib/mongoid/extensions/symbol.rb +4 -15
  163. data/lib/mongoid/extensions/time.rb +29 -16
  164. data/lib/mongoid/extensions/time_with_zone.rb +1 -2
  165. data/lib/mongoid/extensions/true_class.rb +1 -1
  166. data/lib/mongoid/extensions.rb +1 -0
  167. data/lib/mongoid/factory.rb +55 -7
  168. data/lib/mongoid/fields/foreign_key.rb +11 -4
  169. data/lib/mongoid/fields/localized.rb +19 -4
  170. data/lib/mongoid/fields/standard.rb +17 -7
  171. data/lib/mongoid/fields/validators/macro.rb +3 -9
  172. data/lib/mongoid/fields.rb +142 -28
  173. data/lib/mongoid/findable.rb +54 -24
  174. data/lib/mongoid/indexable/specification.rb +2 -2
  175. data/lib/mongoid/indexable/validators/options.rb +6 -2
  176. data/lib/mongoid/interceptable.rb +186 -16
  177. data/lib/mongoid/matchable.rb +1 -1
  178. data/lib/mongoid/matcher/eq_impl.rb +1 -1
  179. data/lib/mongoid/matcher/type.rb +1 -1
  180. data/lib/mongoid/matcher.rb +48 -14
  181. data/lib/mongoid/persistable/creatable.rb +19 -9
  182. data/lib/mongoid/persistable/deletable.rb +2 -2
  183. data/lib/mongoid/persistable/destroyable.rb +1 -1
  184. data/lib/mongoid/persistable/savable.rb +14 -2
  185. data/lib/mongoid/persistable/unsettable.rb +2 -2
  186. data/lib/mongoid/persistable/updatable.rb +69 -12
  187. data/lib/mongoid/persistable/upsertable.rb +21 -2
  188. data/lib/mongoid/persistable.rb +6 -3
  189. data/lib/mongoid/persistence_context.rb +6 -4
  190. data/lib/mongoid/query_cache.rb +13 -261
  191. data/lib/mongoid/railties/controller_runtime.rb +1 -1
  192. data/lib/mongoid/railties/database.rake +7 -2
  193. data/lib/mongoid/reloadable.rb +10 -8
  194. data/lib/mongoid/scopable.rb +15 -13
  195. data/lib/mongoid/selectable.rb +1 -2
  196. data/lib/mongoid/serializable.rb +17 -13
  197. data/lib/mongoid/stateful.rb +57 -10
  198. data/lib/mongoid/tasks/database.rake +12 -0
  199. data/lib/mongoid/tasks/database.rb +20 -2
  200. data/lib/mongoid/threaded/lifecycle.rb +5 -5
  201. data/lib/mongoid/threaded.rb +42 -12
  202. data/lib/mongoid/timestamps/created.rb +1 -1
  203. data/lib/mongoid/timestamps/updated.rb +2 -2
  204. data/lib/mongoid/touchable.rb +3 -4
  205. data/lib/mongoid/traversable.rb +10 -5
  206. data/lib/mongoid/utils.rb +22 -0
  207. data/lib/mongoid/validatable/associated.rb +98 -17
  208. data/lib/mongoid/validatable/localizable.rb +1 -1
  209. data/lib/mongoid/validatable/macros.rb +5 -7
  210. data/lib/mongoid/validatable/presence.rb +2 -2
  211. data/lib/mongoid/validatable/uniqueness.rb +9 -8
  212. data/lib/mongoid/validatable.rb +17 -6
  213. data/lib/mongoid/version.rb +1 -1
  214. data/lib/mongoid/warnings.rb +19 -4
  215. data/lib/mongoid.rb +17 -3
  216. data/spec/config/mongoid.yml +16 -0
  217. data/spec/integration/app_spec.rb +24 -19
  218. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  219. data/spec/integration/associations/embedded_spec.rb +15 -0
  220. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  221. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  222. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  223. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +61 -0
  224. data/spec/integration/associations/has_one_spec.rb +97 -1
  225. data/spec/integration/associations/scope_option_spec.rb +1 -1
  226. data/spec/integration/callbacks_models.rb +132 -1
  227. data/spec/integration/callbacks_spec.rb +381 -4
  228. data/spec/integration/criteria/range_spec.rb +95 -1
  229. data/spec/integration/discriminator_key_spec.rb +118 -80
  230. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  231. data/spec/integration/i18n_fallbacks_spec.rb +3 -32
  232. data/spec/integration/matcher_examples_spec.rb +20 -13
  233. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  234. data/spec/integration/matcher_operator_spec.rb +3 -5
  235. data/spec/integration/persistence/range_field_spec.rb +350 -0
  236. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  237. data/spec/mongoid/association/depending_spec.rb +9 -9
  238. data/spec/mongoid/association/eager_spec.rb +2 -1
  239. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  240. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  241. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +96 -9
  242. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  243. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +290 -65
  244. data/spec/mongoid/association/embedded/embeds_many_models.rb +37 -0
  245. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +16 -0
  246. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  247. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  248. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +15 -2
  249. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  250. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  251. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  252. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  253. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +19 -0
  254. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  255. data/spec/mongoid/association/referenced/belongs_to_spec.rb +4 -20
  256. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +186 -229
  257. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  258. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  259. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  260. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
  261. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +215 -177
  262. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  263. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  264. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  265. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  266. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  267. data/spec/mongoid/association/syncable_spec.rb +15 -1
  268. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  269. data/spec/mongoid/attributes/nested_spec.rb +80 -11
  270. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  271. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  272. data/spec/mongoid/attributes_spec.rb +526 -33
  273. data/spec/mongoid/changeable_spec.rb +429 -37
  274. data/spec/mongoid/clients/factory_spec.rb +23 -30
  275. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  276. data/spec/mongoid/clients_spec.rb +149 -15
  277. data/spec/mongoid/collection_configurable_spec.rb +158 -0
  278. data/spec/mongoid/config/defaults_spec.rb +160 -0
  279. data/spec/mongoid/config_spec.rb +214 -31
  280. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  281. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  282. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  283. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  284. data/spec/mongoid/contextual/memory_spec.rb +850 -88
  285. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
  286. data/spec/mongoid/contextual/mongo_spec.rb +2256 -1005
  287. data/spec/mongoid/contextual/none_spec.rb +60 -21
  288. data/spec/mongoid/copyable_spec.rb +453 -11
  289. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  290. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  291. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  292. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  293. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  294. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  295. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  296. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  297. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  298. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  299. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +4 -69
  300. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
  301. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  302. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  303. data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -484
  304. data/spec/mongoid/criteria/queryable/options_spec.rb +1 -1
  305. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +469 -0
  306. data/spec/mongoid/criteria/queryable/selectable_spec.rb +78 -86
  307. data/spec/mongoid/criteria/queryable/selector_spec.rb +15 -3
  308. data/spec/mongoid/criteria/translator_spec.rb +132 -0
  309. data/spec/mongoid/criteria_projection_spec.rb +1 -5
  310. data/spec/mongoid/criteria_spec.rb +469 -1205
  311. data/spec/mongoid/document_fields_spec.rb +173 -24
  312. data/spec/mongoid/document_spec.rb +32 -41
  313. data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
  314. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  315. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  316. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  317. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  318. data/spec/mongoid/errors/readonly_document_spec.rb +2 -2
  319. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  320. data/spec/mongoid/extensions/array_spec.rb +16 -2
  321. data/spec/mongoid/extensions/big_decimal_spec.rb +712 -212
  322. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  323. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  324. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  325. data/spec/mongoid/extensions/date_spec.rb +71 -1
  326. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  327. data/spec/mongoid/extensions/float_spec.rb +53 -74
  328. data/spec/mongoid/extensions/hash_spec.rb +33 -3
  329. data/spec/mongoid/extensions/integer_spec.rb +50 -64
  330. data/spec/mongoid/extensions/range_spec.rb +255 -54
  331. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  332. data/spec/mongoid/extensions/set_spec.rb +106 -0
  333. data/spec/mongoid/extensions/string_spec.rb +53 -25
  334. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  335. data/spec/mongoid/extensions/time_spec.rb +639 -106
  336. data/spec/mongoid/extensions/time_with_zone_spec.rb +24 -83
  337. data/spec/mongoid/factory_spec.rb +61 -1
  338. data/spec/mongoid/fields/localized_spec.rb +80 -37
  339. data/spec/mongoid/fields_spec.rb +503 -87
  340. data/spec/mongoid/findable_spec.rb +450 -58
  341. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  342. data/spec/mongoid/indexable_spec.rb +55 -30
  343. data/spec/mongoid/interceptable_spec.rb +824 -22
  344. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  345. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  346. data/spec/mongoid/mongoizable_spec.rb +285 -0
  347. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  348. data/spec/mongoid/persistable/deletable_spec.rb +28 -8
  349. data/spec/mongoid/persistable/destroyable_spec.rb +28 -8
  350. data/spec/mongoid/persistable/incrementable_spec.rb +37 -0
  351. data/spec/mongoid/persistable/logical_spec.rb +37 -0
  352. data/spec/mongoid/persistable/poppable_spec.rb +36 -0
  353. data/spec/mongoid/persistable/pullable_spec.rb +72 -0
  354. data/spec/mongoid/persistable/pushable_spec.rb +72 -0
  355. data/spec/mongoid/persistable/renamable_spec.rb +36 -0
  356. data/spec/mongoid/persistable/savable_spec.rb +96 -0
  357. data/spec/mongoid/persistable/settable_spec.rb +37 -0
  358. data/spec/mongoid/persistable/unsettable_spec.rb +36 -0
  359. data/spec/mongoid/persistable/updatable_spec.rb +20 -28
  360. data/spec/mongoid/persistable/upsertable_spec.rb +89 -1
  361. data/spec/mongoid/persistence_context_spec.rb +31 -57
  362. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  363. data/spec/mongoid/query_cache_spec.rb +56 -215
  364. data/spec/mongoid/reloadable_spec.rb +83 -6
  365. data/spec/mongoid/scopable_spec.rb +91 -1
  366. data/spec/mongoid/serializable_spec.rb +25 -39
  367. data/spec/mongoid/shardable_spec.rb +4 -4
  368. data/spec/mongoid/stateful_spec.rb +150 -8
  369. data/spec/mongoid/tasks/database_rake_spec.rb +74 -0
  370. data/spec/mongoid/tasks/database_spec.rb +127 -0
  371. data/spec/mongoid/timestamps_spec.rb +392 -4
  372. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  373. data/spec/mongoid/touchable_spec.rb +390 -2
  374. data/spec/mongoid/touchable_spec_models.rb +14 -8
  375. data/spec/mongoid/traversable_spec.rb +13 -35
  376. data/spec/mongoid/validatable/associated_spec.rb +27 -34
  377. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  378. data/spec/mongoid/validatable/uniqueness_spec.rb +58 -31
  379. data/spec/mongoid/warnings_spec.rb +35 -0
  380. data/spec/mongoid_spec.rb +34 -16
  381. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  382. data/spec/rails/mongoid_spec.rb +4 -16
  383. data/spec/spec_helper.rb +5 -0
  384. data/spec/support/constraints.rb +24 -0
  385. data/spec/support/immutable_ids.rb +118 -0
  386. data/spec/support/macros.rb +78 -0
  387. data/spec/support/models/artist.rb +0 -1
  388. data/spec/support/models/augmentation.rb +12 -0
  389. data/spec/support/models/band.rb +5 -0
  390. data/spec/support/models/book.rb +1 -0
  391. data/spec/support/models/building.rb +2 -0
  392. data/spec/support/models/catalog.rb +24 -0
  393. data/spec/support/models/circus.rb +3 -0
  394. data/spec/support/models/cover.rb +10 -0
  395. data/spec/support/models/fanatic.rb +8 -0
  396. data/spec/support/models/implant.rb +9 -0
  397. data/spec/support/models/label.rb +2 -0
  398. data/spec/support/models/lat_lng.rb +6 -0
  399. data/spec/support/models/name.rb +10 -0
  400. data/spec/support/models/passport.rb +9 -0
  401. data/spec/support/models/person.rb +2 -0
  402. data/spec/support/models/player.rb +2 -0
  403. data/spec/support/models/powerup.rb +12 -0
  404. data/spec/support/models/product.rb +1 -0
  405. data/spec/support/models/purse.rb +9 -0
  406. data/spec/support/models/registry.rb +1 -0
  407. data/spec/support/models/school.rb +14 -0
  408. data/spec/support/models/shield.rb +18 -0
  409. data/spec/support/models/student.rb +14 -0
  410. data/spec/support/models/weapon.rb +12 -0
  411. metadata +101 -96
  412. checksums.yaml.gz.sig +0 -0
  413. data/lib/mongoid/errors/eager_load.rb +0 -23
  414. data/lib/mongoid/errors/invalid_value.rb +0 -17
  415. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -60
  416. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -60
  417. data/spec/mongoid/errors/eager_load_spec.rb +0 -31
  418. data/spec/shared/LICENSE +0 -20
  419. data/spec/shared/bin/get-mongodb-download-url +0 -17
  420. data/spec/shared/bin/s3-copy +0 -45
  421. data/spec/shared/bin/s3-upload +0 -69
  422. data/spec/shared/lib/mrss/child_process_helper.rb +0 -80
  423. data/spec/shared/lib/mrss/cluster_config.rb +0 -231
  424. data/spec/shared/lib/mrss/constraints.rb +0 -378
  425. data/spec/shared/lib/mrss/docker_runner.rb +0 -291
  426. data/spec/shared/lib/mrss/eg_config_utils.rb +0 -51
  427. data/spec/shared/lib/mrss/event_subscriber.rb +0 -210
  428. data/spec/shared/lib/mrss/lite_constraints.rb +0 -238
  429. data/spec/shared/lib/mrss/server_version_registry.rb +0 -120
  430. data/spec/shared/lib/mrss/session_registry.rb +0 -69
  431. data/spec/shared/lib/mrss/session_registry_legacy.rb +0 -60
  432. data/spec/shared/lib/mrss/spec_organizer.rb +0 -179
  433. data/spec/shared/lib/mrss/utils.rb +0 -15
  434. data/spec/shared/share/Dockerfile.erb +0 -325
  435. data/spec/shared/share/haproxy-1.conf +0 -16
  436. data/spec/shared/share/haproxy-2.conf +0 -17
  437. data/spec/shared/shlib/config.sh +0 -27
  438. data/spec/shared/shlib/distro.sh +0 -74
  439. data/spec/shared/shlib/server.sh +0 -392
  440. data/spec/shared/shlib/set_env.sh +0 -169
  441. data.tar.gz.sig +0 -0
  442. metadata.gz.sig +0 -3
@@ -237,5 +237,42 @@ describe Mongoid::Persistable::Incrementable do
237
237
  end
238
238
  end
239
239
  end
240
+
241
+ context "when executing on a readonly document" do
242
+
243
+ let(:person) do
244
+ Person.create!(age: 10, score: 100)
245
+ end
246
+
247
+ context "when legacy_readonly is true" do
248
+ config_override :legacy_readonly, true
249
+
250
+ before do
251
+ person.__selected_fields = { "age" => 1, "score" => 1 }
252
+ end
253
+
254
+ it "persists the changes" do
255
+ expect(person).to be_readonly
256
+ person.inc(age: 15, score: 2)
257
+ expect(person.age).to eq(25)
258
+ expect(person.score).to eq(102)
259
+ end
260
+ end
261
+
262
+ context "when legacy_readonly is false" do
263
+ config_override :legacy_readonly, false
264
+
265
+ before do
266
+ person.readonly!
267
+ end
268
+
269
+ it "raises a ReadonlyDocument error" do
270
+ expect(person).to be_readonly
271
+ expect do
272
+ person.inc(age: 15, score: 2)
273
+ end.to raise_error(Mongoid::Errors::ReadonlyDocument)
274
+ end
275
+ end
276
+ end
240
277
  end
241
278
  end
@@ -155,5 +155,42 @@ describe Mongoid::Persistable::Logical do
155
155
  end
156
156
  end
157
157
  end
158
+
159
+ context "when executing on a readonly document" do
160
+
161
+ let(:person) do
162
+ Person.create!(age: 10, score: 100)
163
+ end
164
+
165
+ context "when legacy_readonly is true" do
166
+ config_override :legacy_readonly, true
167
+
168
+ before do
169
+ person.__selected_fields = { "age" => 1, "score" => 1 }
170
+ end
171
+
172
+ it "persists the changes" do
173
+ expect(person).to be_readonly
174
+ person.bit(age: { and: 6 }, score: { or: 122 })
175
+ expect(person.age).to eq(2)
176
+ expect(person.score).to eq(126)
177
+ end
178
+ end
179
+
180
+ context "when legacy_readonly is false" do
181
+ config_override :legacy_readonly, false
182
+
183
+ before do
184
+ person.readonly!
185
+ end
186
+
187
+ it "raises a ReadonlyDocument error" do
188
+ expect(person).to be_readonly
189
+ expect do
190
+ person.bit(age: { and: 6 }, score: { or: 122 })
191
+ end.to raise_error(Mongoid::Errors::ReadonlyDocument)
192
+ end
193
+ end
194
+ end
158
195
  end
159
196
  end
@@ -127,5 +127,41 @@ describe Mongoid::Persistable::Poppable do
127
127
  end
128
128
  end
129
129
  end
130
+
131
+ context "when executing on a readonly document" do
132
+
133
+ let(:person) do
134
+ Person.create!(test_array: [1, 2, 3])
135
+ end
136
+
137
+ context "when legacy_readonly is true" do
138
+ config_override :legacy_readonly, true
139
+
140
+ before do
141
+ person.__selected_fields = { "test_array" => 1 }
142
+ end
143
+
144
+ it "persists the changes" do
145
+ expect(person).to be_readonly
146
+ person.pop(test_array: 1)
147
+ expect(person.test_array).to eq([ 1, 2 ])
148
+ end
149
+ end
150
+
151
+ context "when legacy_readonly is false" do
152
+ config_override :legacy_readonly, false
153
+
154
+ before do
155
+ person.readonly!
156
+ end
157
+
158
+ it "raises a ReadonlyDocument error" do
159
+ expect(person).to be_readonly
160
+ expect do
161
+ person.pop(test_array: 1)
162
+ end.to raise_error(Mongoid::Errors::ReadonlyDocument)
163
+ end
164
+ end
165
+ end
130
166
  end
131
167
  end
@@ -127,6 +127,42 @@ describe Mongoid::Persistable::Pullable do
127
127
  end
128
128
  end
129
129
  end
130
+
131
+ context "when executing on a readonly document" do
132
+
133
+ let(:person) do
134
+ Person.create!(test_array: [ 1, 1, 2, 3 ])
135
+ end
136
+
137
+ context "when legacy_readonly is true" do
138
+ config_override :legacy_readonly, true
139
+
140
+ before do
141
+ person.__selected_fields = { "test_array" => 1 }
142
+ end
143
+
144
+ it "persists the changes" do
145
+ expect(person).to be_readonly
146
+ person.pull(test_array: 1)
147
+ expect(person.test_array).to eq([ 2, 3 ])
148
+ end
149
+ end
150
+
151
+ context "when legacy_readonly is false" do
152
+ config_override :legacy_readonly, false
153
+
154
+ before do
155
+ person.readonly!
156
+ end
157
+
158
+ it "raises a ReadonlyDocument error" do
159
+ expect(person).to be_readonly
160
+ expect do
161
+ person.pull(test_array: 1)
162
+ end.to raise_error(Mongoid::Errors::ReadonlyDocument)
163
+ end
164
+ end
165
+ end
130
166
  end
131
167
 
132
168
  describe "#pull_all" do
@@ -254,5 +290,41 @@ describe Mongoid::Persistable::Pullable do
254
290
  end
255
291
  end
256
292
  end
293
+
294
+ context "when executing on a readonly document" do
295
+
296
+ let(:person) do
297
+ Person.create!(test_array: [ 1, 1, 2, 3, 4 ])
298
+ end
299
+
300
+ context "when legacy_readonly is true" do
301
+ config_override :legacy_readonly, true
302
+
303
+ before do
304
+ person.__selected_fields = { "test_array" => 1 }
305
+ end
306
+
307
+ it "persists the changes" do
308
+ expect(person).to be_readonly
309
+ person.pull_all(test_array: [ 1, 2 ])
310
+ expect(person.test_array).to eq([ 3, 4 ])
311
+ end
312
+ end
313
+
314
+ context "when legacy_readonly is false" do
315
+ config_override :legacy_readonly, false
316
+
317
+ before do
318
+ person.readonly!
319
+ end
320
+
321
+ it "raises a ReadonlyDocument error" do
322
+ expect(person).to be_readonly
323
+ expect do
324
+ person.pull_all(test_array: [ 1, 2 ])
325
+ end.to raise_error(Mongoid::Errors::ReadonlyDocument)
326
+ end
327
+ end
328
+ end
257
329
  end
258
330
  end
@@ -204,6 +204,42 @@ describe Mongoid::Persistable::Pushable do
204
204
  end
205
205
  end
206
206
  end
207
+
208
+ context "when executing on a readonly document" do
209
+
210
+ let(:person) do
211
+ Person.create!(test_array: [ 1, 2, 3 ])
212
+ end
213
+
214
+ context "when legacy_readonly is true" do
215
+ config_override :legacy_readonly, true
216
+
217
+ before do
218
+ person.__selected_fields = { "test_array" => 1 }
219
+ end
220
+
221
+ it "persists the changes" do
222
+ expect(person).to be_readonly
223
+ person.add_to_set(test_array: [ 1, 4 ])
224
+ expect(person.test_array).to eq([ 1, 2, 3, 4 ])
225
+ end
226
+ end
227
+
228
+ context "when legacy_readonly is false" do
229
+ config_override :legacy_readonly, false
230
+
231
+ before do
232
+ person.readonly!
233
+ end
234
+
235
+ it "raises a ReadonlyDocument error" do
236
+ expect(person).to be_readonly
237
+ expect do
238
+ person.add_to_set(test_array: [ 1, 4 ])
239
+ end.to raise_error(Mongoid::Errors::ReadonlyDocument)
240
+ end
241
+ end
242
+ end
207
243
  end
208
244
 
209
245
  describe "#push" do
@@ -349,5 +385,41 @@ describe Mongoid::Persistable::Pushable do
349
385
  end
350
386
  end
351
387
  end
388
+
389
+ context "when executing on a readonly document" do
390
+
391
+ let(:person) do
392
+ Person.create!(test_array: [ 1, 2, 3 ])
393
+ end
394
+
395
+ context "when legacy_readonly is true" do
396
+ config_override :legacy_readonly, true
397
+
398
+ before do
399
+ person.__selected_fields = { "test_array" => 1 }
400
+ end
401
+
402
+ it "persists the changes" do
403
+ expect(person).to be_readonly
404
+ person.push(test_array: [ 1, 4 ])
405
+ expect(person.test_array).to eq([ 1, 2, 3, 1, 4 ])
406
+ end
407
+ end
408
+
409
+ context "when legacy_readonly is false" do
410
+ config_override :legacy_readonly, false
411
+
412
+ before do
413
+ person.readonly!
414
+ end
415
+
416
+ it "raises a ReadonlyDocument error" do
417
+ expect(person).to be_readonly
418
+ expect do
419
+ person.push(test_array: [ 1, 4 ])
420
+ end.to raise_error(Mongoid::Errors::ReadonlyDocument)
421
+ end
422
+ end
423
+ end
352
424
  end
353
425
  end
@@ -147,5 +147,41 @@ describe Mongoid::Persistable::Renamable do
147
147
  end
148
148
  end
149
149
  end
150
+
151
+ context "when executing on a readonly document" do
152
+
153
+ let(:person) do
154
+ Person.create!(title: "sir")
155
+ end
156
+
157
+ context "when legacy_readonly is true" do
158
+ config_override :legacy_readonly, true
159
+
160
+ before do
161
+ person.__selected_fields = { "test_array" => 1 }
162
+ end
163
+
164
+ it "persists the changes" do
165
+ expect(person).to be_readonly
166
+ person.rename title: :salutation
167
+ expect(person.reload.salutation).to eq("sir")
168
+ end
169
+ end
170
+
171
+ context "when legacy_readonly is false" do
172
+ config_override :legacy_readonly, false
173
+
174
+ before do
175
+ person.readonly!
176
+ end
177
+
178
+ it "raises a ReadonlyDocument error" do
179
+ expect(person).to be_readonly
180
+ expect do
181
+ person.rename(title: :salutation)
182
+ end.to raise_error(Mongoid::Errors::ReadonlyDocument)
183
+ end
184
+ end
185
+ end
150
186
  end
151
187
  end
@@ -1,8 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "spec_helper"
4
+ require "support/immutable_ids"
4
5
 
5
6
  describe Mongoid::Persistable::Savable do
7
+ extend Mongoid::ImmutableIds
8
+ immutable_id_examples_as "persisted _ids are immutable"
6
9
 
7
10
  describe "#save" do
8
11
 
@@ -520,6 +523,99 @@ describe Mongoid::Persistable::Savable do
520
523
  end
521
524
  end
522
525
  end
526
+
527
+ context "when saving a readonly document" do
528
+
529
+ context "when legacy_readonly is true" do
530
+ config_override :legacy_readonly, true
531
+
532
+ context "when its a new document" do
533
+
534
+ let(:document) do
535
+ Band.new
536
+ end
537
+
538
+ before do
539
+ document.__selected_fields = { 'test' => 1 }
540
+ expect(document).to be_readonly
541
+ end
542
+
543
+ it "persists the document" do
544
+ expect(Band.count).to eq(0)
545
+ document.save!
546
+ expect(Band.count).to eq(1)
547
+ end
548
+ end
549
+
550
+ context "when its an old document" do
551
+
552
+ let(:document) do
553
+ Band.only(:name).first
554
+ end
555
+
556
+ before do
557
+ Band.create!
558
+ expect(document).to be_readonly
559
+ end
560
+
561
+ it "updates the document" do
562
+ document.name = "The Rolling Stones"
563
+ document.save!
564
+ expect(Band.first.name).to eq("The Rolling Stones")
565
+ end
566
+ end
567
+ end
568
+
569
+ context "when legacy_readonly is false" do
570
+ config_override :legacy_readonly, false
571
+
572
+ context "when its a new document" do
573
+
574
+ let(:document) do
575
+ Band.new
576
+ end
577
+
578
+ before do
579
+ document.readonly!
580
+ expect(document).to be_readonly
581
+ end
582
+
583
+ it "raises a readonly error" do
584
+ expect do
585
+ document.save!
586
+ end.to raise_error(Mongoid::Errors::ReadonlyDocument)
587
+ end
588
+ end
589
+
590
+ context "when its an old document" do
591
+
592
+ let(:document) do
593
+ Band.first.tap(&:readonly!)
594
+ end
595
+
596
+ before do
597
+ Band.create!
598
+ expect(document).to be_readonly
599
+ end
600
+
601
+ it "raises a readonly error" do
602
+ document.name = "The Rolling Stones"
603
+ expect do
604
+ document.save!
605
+ end.to raise_error(Mongoid::Errors::ReadonlyDocument)
606
+ end
607
+ end
608
+ end
609
+ end
610
+
611
+ context "when the _id has been modified" do
612
+ def invoke_operation!
613
+ object._id = new_id_value
614
+ object.save
615
+ end
616
+
617
+ it_behaves_like "persisted _ids are immutable"
618
+ end
523
619
  end
524
620
 
525
621
  describe "save!" do
@@ -180,6 +180,43 @@ describe Mongoid::Persistable::Settable do
180
180
  end
181
181
  end
182
182
  end
183
+
184
+ context "when executing on a readonly document" do
185
+
186
+ let(:person) do
187
+ Person.create!(title: "sir", age: 30)
188
+ end
189
+
190
+ context "when legacy_readonly is true" do
191
+ config_override :legacy_readonly, true
192
+
193
+ before do
194
+ person.__selected_fields = { "title" => 1, "age" => 1 }
195
+ end
196
+
197
+ it "persists the changes" do
198
+ expect(person).to be_readonly
199
+ person.set(title: "miss", age: 21)
200
+ expect(person.title).to eq("miss")
201
+ expect(person.age).to eq(21)
202
+ end
203
+ end
204
+
205
+ context "when legacy_readonly is false" do
206
+ config_override :legacy_readonly, false
207
+
208
+ before do
209
+ person.readonly!
210
+ end
211
+
212
+ it "raises a ReadonlyDocument error" do
213
+ expect(person).to be_readonly
214
+ expect do
215
+ person.set(title: "miss", age: 21)
216
+ end.to raise_error(Mongoid::Errors::ReadonlyDocument)
217
+ end
218
+ end
219
+ end
183
220
  end
184
221
 
185
222
  context "when dynamic attributes are not enabled" do
@@ -167,5 +167,41 @@ describe Mongoid::Persistable::Unsettable do
167
167
  end
168
168
  end
169
169
  end
170
+
171
+ context "when executing on a readonly document" do
172
+
173
+ let(:person) do
174
+ Person.create!(title: "sir", age: 30)
175
+ end
176
+
177
+ context "when legacy_readonly is true" do
178
+ config_override :legacy_readonly, true
179
+
180
+ before do
181
+ person.__selected_fields = { "title" => 1, "age" => 1 }
182
+ end
183
+
184
+ it "persists the changes" do
185
+ expect(person).to be_readonly
186
+ person.unset(:title)
187
+ expect(person.title).to be nil
188
+ end
189
+ end
190
+
191
+ context "when legacy_readonly is false" do
192
+ config_override :legacy_readonly, false
193
+
194
+ before do
195
+ person.readonly!
196
+ end
197
+
198
+ it "raises a ReadonlyDocument error" do
199
+ expect(person).to be_readonly
200
+ expect do
201
+ person.unset(:title)
202
+ end.to raise_error(Mongoid::Errors::ReadonlyDocument)
203
+ end
204
+ end
205
+ end
170
206
  end
171
207
  end
@@ -1,8 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "spec_helper"
4
+ require "support/immutable_ids"
4
5
 
5
6
  describe Mongoid::Persistable::Updatable do
7
+ extend Mongoid::ImmutableIds
8
+ immutable_id_examples_as "persisted _ids are immutable"
6
9
 
7
10
  describe "#update_attribute" do
8
11
 
@@ -231,21 +234,17 @@ describe Mongoid::Persistable::Updatable do
231
234
  end
232
235
 
233
236
  context "when persisting a localized field" do
237
+ with_default_i18n_configs
234
238
 
235
239
  let!(:product) do
236
240
  Product.create!(description: "The bomb")
237
241
  end
238
242
 
239
243
  before do
240
- I18n.enforce_available_locales = false
241
244
  ::I18n.locale = :de
242
245
  product.update_attribute(:description, "Die Bombe")
243
246
  end
244
247
 
245
- after do
246
- ::I18n.locale = :en
247
- end
248
-
249
248
  let(:attributes) do
250
249
  product.attributes["description"]
251
250
  end
@@ -450,6 +449,14 @@ describe Mongoid::Persistable::Updatable do
450
449
  end
451
450
  end
452
451
  end
452
+
453
+ context 'when the field is _id' do
454
+ def invoke_operation!
455
+ object.update_attribute "_id", new_id_value
456
+ end
457
+
458
+ it_behaves_like "persisted _ids are immutable"
459
+ end
453
460
  end
454
461
 
455
462
  [:update_attributes, :update].each do |method|
@@ -470,29 +477,6 @@ describe Mongoid::Persistable::Updatable do
470
477
  end
471
478
  end
472
479
 
473
- context "when validation passes" do
474
-
475
- let(:person) do
476
- Person.create!
477
- end
478
-
479
- let!(:saved) do
480
- person.update_attributes!(pets: false)
481
- end
482
-
483
- let(:from_db) do
484
- Person.find(person.id)
485
- end
486
-
487
- it "returns true" do
488
- expect(saved).to be true
489
- end
490
-
491
- it "saves the attributes" do
492
- expect(from_db.pets).to be false
493
- end
494
- end
495
-
496
480
  context "when the document has been destroyed" do
497
481
  max_server_version '4.9'
498
482
 
@@ -721,6 +705,14 @@ describe Mongoid::Persistable::Updatable do
721
705
  end
722
706
  end
723
707
  end
708
+
709
+ context 'when the _id is one of the fields' do
710
+ def invoke_operation!
711
+ object.update_attributes _id: new_id_value
712
+ end
713
+
714
+ it_behaves_like "persisted _ids are immutable"
715
+ end
724
716
  end
725
717
  end
726
718