mongoid 7.1.1 → 8.1.0

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 (1094) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +20 -20
  4. data/README.md +15 -8
  5. data/Rakefile +61 -5
  6. data/lib/config/locales/en.yml +162 -56
  7. data/lib/mongoid/association/accessors.rb +89 -40
  8. data/lib/mongoid/association/bindable.rb +50 -23
  9. data/lib/mongoid/association/builders.rb +5 -12
  10. data/lib/mongoid/association/constrainable.rb +1 -5
  11. data/lib/mongoid/association/depending.rb +5 -17
  12. data/lib/mongoid/association/eager_loadable.rb +29 -10
  13. data/lib/mongoid/association/embedded/batchable.rb +64 -52
  14. data/lib/mongoid/association/embedded/cyclic.rb +3 -12
  15. data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -9
  16. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +2 -5
  17. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +4 -16
  18. data/lib/mongoid/association/embedded/embedded_in.rb +4 -26
  19. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -7
  20. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +4 -6
  21. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +110 -92
  22. data/lib/mongoid/association/embedded/embeds_many.rb +4 -34
  23. data/lib/mongoid/association/embedded/embeds_one/binding.rb +0 -7
  24. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +19 -8
  25. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +50 -19
  26. data/lib/mongoid/association/embedded/embeds_one.rb +5 -31
  27. data/lib/mongoid/association/embedded.rb +0 -1
  28. data/lib/mongoid/association/macros.rb +27 -5
  29. data/lib/mongoid/association/many.rb +14 -27
  30. data/lib/mongoid/association/marshalable.rb +0 -5
  31. data/lib/mongoid/association/nested/many.rb +6 -16
  32. data/lib/mongoid/association/nested/nested_buildable.rb +4 -13
  33. data/lib/mongoid/association/nested/one.rb +48 -23
  34. data/lib/mongoid/association/nested.rb +0 -3
  35. data/lib/mongoid/association/one.rb +2 -11
  36. data/lib/mongoid/association/options.rb +9 -42
  37. data/lib/mongoid/association/proxy.rb +22 -27
  38. data/lib/mongoid/association/referenced/auto_save.rb +6 -14
  39. data/lib/mongoid/association/referenced/belongs_to/binding.rb +2 -8
  40. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +5 -6
  41. data/lib/mongoid/association/referenced/belongs_to/eager.rb +0 -1
  42. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +5 -19
  43. data/lib/mongoid/association/referenced/belongs_to.rb +11 -36
  44. data/lib/mongoid/association/referenced/counter_cache.rb +12 -25
  45. data/lib/mongoid/association/referenced/eager.rb +5 -26
  46. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +0 -5
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +0 -3
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +0 -1
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +81 -51
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +17 -41
  51. data/lib/mongoid/association/referenced/has_many/binding.rb +0 -5
  52. data/lib/mongoid/association/referenced/has_many/buildable.rb +0 -3
  53. data/lib/mongoid/association/referenced/has_many/eager.rb +0 -1
  54. data/lib/mongoid/association/referenced/has_many/enumerable.rb +438 -461
  55. data/lib/mongoid/association/referenced/has_many/proxy.rb +58 -84
  56. data/lib/mongoid/association/referenced/has_many.rb +15 -42
  57. data/lib/mongoid/association/referenced/has_one/binding.rb +0 -7
  58. data/lib/mongoid/association/referenced/has_one/buildable.rb +12 -5
  59. data/lib/mongoid/association/referenced/has_one/eager.rb +0 -1
  60. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +7 -22
  61. data/lib/mongoid/association/referenced/has_one/proxy.rb +9 -16
  62. data/lib/mongoid/association/referenced/has_one.rb +12 -35
  63. data/lib/mongoid/association/referenced/syncable.rb +4 -21
  64. data/lib/mongoid/association/referenced.rb +0 -1
  65. data/lib/mongoid/association/reflections.rb +4 -5
  66. data/lib/mongoid/association/relatable.rb +46 -71
  67. data/lib/mongoid/association.rb +5 -22
  68. data/lib/mongoid/atomic/modifiers.rb +7 -54
  69. data/lib/mongoid/atomic/paths/embedded/many.rb +19 -5
  70. data/lib/mongoid/atomic/paths/embedded/one.rb +0 -5
  71. data/lib/mongoid/atomic/paths/embedded.rb +0 -3
  72. data/lib/mongoid/atomic/paths/root.rb +0 -5
  73. data/lib/mongoid/atomic/paths.rb +0 -1
  74. data/lib/mongoid/atomic.rb +40 -47
  75. data/lib/mongoid/attributes/dynamic.rb +5 -22
  76. data/lib/mongoid/attributes/nested.rb +6 -11
  77. data/lib/mongoid/attributes/processing.rb +11 -21
  78. data/lib/mongoid/attributes/projector.rb +119 -0
  79. data/lib/mongoid/attributes/readonly.rb +3 -8
  80. data/lib/mongoid/attributes.rb +82 -88
  81. data/lib/mongoid/cacheable.rb +4 -9
  82. data/lib/mongoid/changeable.rb +148 -69
  83. data/lib/mongoid/clients/factory.rb +41 -17
  84. data/lib/mongoid/clients/options.rb +13 -14
  85. data/lib/mongoid/clients/sessions.rb +8 -11
  86. data/lib/mongoid/clients/storage_options.rb +7 -17
  87. data/lib/mongoid/clients/validators/storage.rb +3 -24
  88. data/lib/mongoid/clients/validators.rb +0 -1
  89. data/lib/mongoid/clients.rb +1 -10
  90. data/lib/mongoid/collection_configurable.rb +58 -0
  91. data/lib/mongoid/composable.rb +3 -7
  92. data/lib/mongoid/config/defaults.rb +60 -0
  93. data/lib/mongoid/config/environment.rb +28 -5
  94. data/lib/mongoid/config/options.rb +0 -11
  95. data/lib/mongoid/config/validators/async_query_executor.rb +24 -0
  96. data/lib/mongoid/config/validators/client.rb +6 -23
  97. data/lib/mongoid/config/validators/option.rb +0 -3
  98. data/lib/mongoid/config/validators.rb +1 -1
  99. data/lib/mongoid/config.rb +183 -39
  100. data/lib/mongoid/contextual/aggregable/memory.rb +37 -26
  101. data/lib/mongoid/contextual/aggregable/mongo.rb +29 -32
  102. data/lib/mongoid/contextual/aggregable/none.rb +65 -0
  103. data/lib/mongoid/contextual/aggregable.rb +17 -0
  104. data/lib/mongoid/contextual/atomic.rb +7 -27
  105. data/lib/mongoid/contextual/command.rb +0 -5
  106. data/lib/mongoid/contextual/geo_near.rb +8 -41
  107. data/lib/mongoid/contextual/map_reduce.rb +2 -33
  108. data/lib/mongoid/contextual/memory.rb +383 -79
  109. data/lib/mongoid/contextual/mongo/documents_loader.rb +177 -0
  110. data/lib/mongoid/contextual/mongo.rb +636 -283
  111. data/lib/mongoid/contextual/none.rb +262 -31
  112. data/lib/mongoid/contextual/queryable.rb +1 -4
  113. data/lib/mongoid/contextual.rb +14 -7
  114. data/lib/mongoid/copyable.rb +39 -16
  115. data/lib/mongoid/criteria/findable.rb +9 -19
  116. data/lib/mongoid/criteria/includable.rb +27 -31
  117. data/lib/mongoid/criteria/inspectable.rb +0 -3
  118. data/lib/mongoid/criteria/marshalable.rb +10 -7
  119. data/lib/mongoid/criteria/modifiable.rb +2 -20
  120. data/lib/mongoid/criteria/options.rb +0 -3
  121. data/lib/mongoid/criteria/permission.rb +1 -2
  122. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -15
  123. data/lib/mongoid/criteria/queryable/expandable.rb +0 -25
  124. data/lib/mongoid/criteria/queryable/extensions/array.rb +4 -40
  125. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -7
  126. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +3 -6
  127. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -8
  128. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -6
  129. data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -40
  130. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +0 -13
  131. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -20
  132. data/lib/mongoid/criteria/queryable/extensions/object.rb +3 -29
  133. data/lib/mongoid/criteria/queryable/extensions/range.rb +46 -16
  134. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +9 -18
  135. data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -4
  136. data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -31
  137. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -21
  138. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -8
  139. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +16 -6
  140. data/lib/mongoid/criteria/queryable/extensions.rb +0 -5
  141. data/lib/mongoid/criteria/queryable/key.rb +6 -19
  142. data/lib/mongoid/criteria/queryable/macroable.rb +0 -3
  143. data/lib/mongoid/criteria/queryable/mergeable.rb +123 -38
  144. data/lib/mongoid/criteria/queryable/optional.rb +11 -62
  145. data/lib/mongoid/criteria/queryable/options.rb +2 -21
  146. data/lib/mongoid/criteria/queryable/pipeline.rb +1 -14
  147. data/lib/mongoid/criteria/queryable/selectable.rb +138 -125
  148. data/lib/mongoid/criteria/queryable/selector.rb +94 -30
  149. data/lib/mongoid/criteria/queryable/smash.rb +40 -18
  150. data/lib/mongoid/criteria/queryable/storable.rb +14 -10
  151. data/lib/mongoid/criteria/queryable.rb +11 -13
  152. data/lib/mongoid/criteria/scopable.rb +27 -21
  153. data/lib/mongoid/criteria/translator.rb +45 -0
  154. data/lib/mongoid/criteria.rb +88 -108
  155. data/lib/mongoid/deprecable.rb +36 -0
  156. data/lib/mongoid/deprecation.rb +25 -0
  157. data/lib/mongoid/document.rb +149 -99
  158. data/lib/mongoid/equality.rb +32 -16
  159. data/lib/mongoid/errors/ambiguous_relationship.rb +2 -5
  160. data/lib/mongoid/errors/callback.rb +0 -3
  161. data/lib/mongoid/errors/create_collection_failure.rb +33 -0
  162. data/lib/mongoid/errors/criteria_argument_required.rb +0 -1
  163. data/lib/mongoid/errors/delete_restriction.rb +8 -12
  164. data/lib/mongoid/errors/document_not_destroyed.rb +2 -7
  165. data/lib/mongoid/errors/document_not_found.rb +33 -21
  166. data/lib/mongoid/errors/drop_collection_failure.rb +27 -0
  167. data/lib/mongoid/errors/empty_config_file.rb +25 -0
  168. data/lib/mongoid/errors/immutable_attribute.rb +26 -0
  169. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +0 -3
  170. data/lib/mongoid/errors/invalid_async_query_executor.rb +25 -0
  171. data/lib/mongoid/errors/invalid_collection.rb +0 -1
  172. data/lib/mongoid/errors/invalid_config_file.rb +25 -0
  173. data/lib/mongoid/errors/invalid_config_option.rb +1 -4
  174. data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -4
  175. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +24 -0
  176. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  177. data/lib/mongoid/errors/invalid_elem_match_operator.rb +32 -0
  178. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +25 -0
  179. data/lib/mongoid/errors/invalid_expression_operator.rb +27 -0
  180. data/lib/mongoid/errors/invalid_field.rb +6 -7
  181. data/lib/mongoid/errors/invalid_field_operator.rb +32 -0
  182. data/lib/mongoid/errors/invalid_field_option.rb +0 -3
  183. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  184. data/lib/mongoid/errors/invalid_find.rb +0 -3
  185. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +22 -0
  186. data/lib/mongoid/errors/invalid_includes.rb +0 -3
  187. data/lib/mongoid/errors/invalid_index.rb +0 -3
  188. data/lib/mongoid/errors/invalid_options.rb +0 -3
  189. data/lib/mongoid/errors/invalid_path.rb +0 -3
  190. data/lib/mongoid/errors/invalid_persistence_option.rb +0 -5
  191. data/lib/mongoid/errors/invalid_query.rb +40 -0
  192. data/lib/mongoid/errors/invalid_relation.rb +1 -8
  193. data/lib/mongoid/errors/invalid_relation_option.rb +1 -4
  194. data/lib/mongoid/errors/invalid_scope.rb +0 -3
  195. data/lib/mongoid/errors/invalid_session_use.rb +1 -6
  196. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +0 -1
  197. data/lib/mongoid/errors/invalid_storage_options.rb +1 -4
  198. data/lib/mongoid/errors/invalid_storage_parent.rb +2 -3
  199. data/lib/mongoid/errors/invalid_time.rb +0 -3
  200. data/lib/mongoid/errors/inverse_not_found.rb +0 -3
  201. data/lib/mongoid/errors/mixed_client_configuration.rb +0 -3
  202. data/lib/mongoid/errors/mixed_relations.rb +0 -3
  203. data/lib/mongoid/errors/mongoid_error.rb +4 -13
  204. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -4
  205. data/lib/mongoid/errors/no_client_config.rb +2 -5
  206. data/lib/mongoid/errors/no_client_database.rb +1 -4
  207. data/lib/mongoid/errors/no_client_hosts.rb +1 -4
  208. data/lib/mongoid/errors/no_clients_config.rb +0 -3
  209. data/lib/mongoid/errors/no_default_client.rb +1 -4
  210. data/lib/mongoid/errors/no_environment.rb +0 -3
  211. data/lib/mongoid/errors/no_map_reduce_output.rb +0 -3
  212. data/lib/mongoid/errors/no_metadata.rb +0 -3
  213. data/lib/mongoid/errors/no_parent.rb +0 -3
  214. data/lib/mongoid/errors/readonly_attribute.rb +1 -4
  215. data/lib/mongoid/errors/readonly_document.rb +1 -6
  216. data/lib/mongoid/errors/scope_overwrite.rb +0 -1
  217. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -2
  218. data/lib/mongoid/errors/unknown_attribute.rb +1 -4
  219. data/lib/mongoid/errors/unknown_model.rb +0 -3
  220. data/lib/mongoid/errors/unsaved_document.rb +1 -2
  221. data/lib/mongoid/errors/unsupported_javascript.rb +0 -3
  222. data/lib/mongoid/errors/validations.rb +0 -1
  223. data/lib/mongoid/errors.rb +15 -4
  224. data/lib/mongoid/evolvable.rb +1 -4
  225. data/lib/mongoid/extensions/array.rb +12 -36
  226. data/lib/mongoid/extensions/big_decimal.rb +33 -21
  227. data/lib/mongoid/extensions/binary.rb +42 -0
  228. data/lib/mongoid/extensions/boolean.rb +8 -6
  229. data/lib/mongoid/extensions/date.rb +26 -29
  230. data/lib/mongoid/extensions/date_time.rb +1 -10
  231. data/lib/mongoid/extensions/decimal128.rb +0 -5
  232. data/lib/mongoid/extensions/false_class.rb +3 -8
  233. data/lib/mongoid/extensions/float.rb +7 -11
  234. data/lib/mongoid/extensions/hash.rb +19 -37
  235. data/lib/mongoid/extensions/integer.rb +7 -13
  236. data/lib/mongoid/extensions/module.rb +1 -4
  237. data/lib/mongoid/extensions/nil_class.rb +0 -5
  238. data/lib/mongoid/extensions/object.rb +11 -48
  239. data/lib/mongoid/extensions/object_id.rb +0 -7
  240. data/lib/mongoid/extensions/range.rb +40 -20
  241. data/lib/mongoid/extensions/regexp.rb +12 -8
  242. data/lib/mongoid/extensions/set.rb +11 -11
  243. data/lib/mongoid/extensions/string.rb +12 -52
  244. data/lib/mongoid/extensions/symbol.rb +4 -22
  245. data/lib/mongoid/extensions/time.rb +28 -26
  246. data/lib/mongoid/extensions/time_with_zone.rb +14 -11
  247. data/lib/mongoid/extensions/true_class.rb +3 -8
  248. data/lib/mongoid/extensions.rb +17 -3
  249. data/lib/mongoid/factory.rb +80 -16
  250. data/lib/mongoid/fields/foreign_key.rb +11 -25
  251. data/lib/mongoid/fields/localized.rb +19 -15
  252. data/lib/mongoid/fields/standard.rb +17 -40
  253. data/lib/mongoid/fields/validators/macro.rb +25 -24
  254. data/lib/mongoid/fields/validators.rb +0 -1
  255. data/lib/mongoid/fields.rb +346 -75
  256. data/lib/mongoid/findable.rb +107 -31
  257. data/lib/mongoid/indexable/specification.rb +2 -17
  258. data/lib/mongoid/indexable/validators/options.rb +6 -9
  259. data/lib/mongoid/indexable.rb +3 -20
  260. data/lib/mongoid/inspectable.rb +2 -11
  261. data/lib/mongoid/interceptable.rb +79 -41
  262. data/lib/mongoid/loggable.rb +0 -9
  263. data/lib/mongoid/matchable.rb +2 -155
  264. data/lib/mongoid/matcher/all.rb +22 -0
  265. data/lib/mongoid/matcher/and.rb +21 -0
  266. data/lib/mongoid/matcher/bits.rb +41 -0
  267. data/lib/mongoid/matcher/bits_all_clear.rb +20 -0
  268. data/lib/mongoid/matcher/bits_all_set.rb +20 -0
  269. data/lib/mongoid/matcher/bits_any_clear.rb +20 -0
  270. data/lib/mongoid/matcher/bits_any_set.rb +20 -0
  271. data/lib/mongoid/matcher/elem_match.rb +36 -0
  272. data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
  273. data/lib/mongoid/matcher/eq.rb +11 -0
  274. data/lib/mongoid/matcher/eq_impl.rb +67 -0
  275. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +26 -0
  276. data/lib/mongoid/matcher/exists.rb +15 -0
  277. data/lib/mongoid/matcher/expression.rb +35 -0
  278. data/lib/mongoid/matcher/expression_operator.rb +19 -0
  279. data/lib/mongoid/matcher/field_expression.rb +62 -0
  280. data/lib/mongoid/matcher/field_operator.rb +54 -0
  281. data/lib/mongoid/matcher/gt.rb +17 -0
  282. data/lib/mongoid/matcher/gte.rb +17 -0
  283. data/lib/mongoid/matcher/in.rb +25 -0
  284. data/lib/mongoid/matcher/lt.rb +17 -0
  285. data/lib/mongoid/matcher/lte.rb +17 -0
  286. data/lib/mongoid/matcher/mod.rb +17 -0
  287. data/lib/mongoid/matcher/ne.rb +16 -0
  288. data/lib/mongoid/matcher/nin.rb +11 -0
  289. data/lib/mongoid/matcher/nor.rb +25 -0
  290. data/lib/mongoid/matcher/not.rb +29 -0
  291. data/lib/mongoid/matcher/or.rb +21 -0
  292. data/lib/mongoid/matcher/regex.rb +41 -0
  293. data/lib/mongoid/matcher/size.rb +26 -0
  294. data/lib/mongoid/matcher/type.rb +99 -0
  295. data/lib/mongoid/matcher.rb +130 -0
  296. data/lib/mongoid/persistable/creatable.rb +20 -29
  297. data/lib/mongoid/persistable/deletable.rb +4 -22
  298. data/lib/mongoid/persistable/destroyable.rb +9 -10
  299. data/lib/mongoid/persistable/incrementable.rb +0 -5
  300. data/lib/mongoid/persistable/logical.rb +0 -5
  301. data/lib/mongoid/persistable/poppable.rb +0 -5
  302. data/lib/mongoid/persistable/pullable.rb +0 -7
  303. data/lib/mongoid/persistable/pushable.rb +4 -8
  304. data/lib/mongoid/persistable/renamable.rb +0 -5
  305. data/lib/mongoid/persistable/savable.rb +13 -8
  306. data/lib/mongoid/persistable/settable.rb +0 -5
  307. data/lib/mongoid/persistable/unsettable.rb +2 -7
  308. data/lib/mongoid/persistable/updatable.rb +96 -29
  309. data/lib/mongoid/persistable/upsertable.rb +20 -8
  310. data/lib/mongoid/persistable.rb +6 -26
  311. data/lib/mongoid/persistence_context.rb +71 -43
  312. data/lib/mongoid/positional.rb +0 -5
  313. data/lib/mongoid/query_cache.rb +16 -236
  314. data/lib/mongoid/railtie.rb +0 -15
  315. data/lib/mongoid/railties/controller_runtime.rb +1 -2
  316. data/lib/mongoid/railties/database.rake +7 -2
  317. data/lib/mongoid/reloadable.rb +17 -20
  318. data/lib/mongoid/scopable.rb +32 -56
  319. data/lib/mongoid/selectable.rb +5 -17
  320. data/lib/mongoid/serializable.rb +11 -22
  321. data/lib/mongoid/shardable.rb +49 -16
  322. data/lib/mongoid/stateful.rb +57 -19
  323. data/lib/mongoid/stringified_symbol.rb +52 -0
  324. data/lib/mongoid/tasks/database.rake +12 -0
  325. data/lib/mongoid/tasks/database.rb +59 -11
  326. data/lib/mongoid/threaded/lifecycle.rb +5 -26
  327. data/lib/mongoid/threaded.rb +42 -67
  328. data/lib/mongoid/timestamps/created/short.rb +0 -1
  329. data/lib/mongoid/timestamps/created.rb +1 -2
  330. data/lib/mongoid/timestamps/short.rb +0 -1
  331. data/lib/mongoid/timestamps/timeless.rb +0 -7
  332. data/lib/mongoid/timestamps/updated/short.rb +0 -1
  333. data/lib/mongoid/timestamps/updated.rb +2 -5
  334. data/lib/mongoid/timestamps.rb +0 -1
  335. data/lib/mongoid/touchable.rb +34 -13
  336. data/lib/mongoid/traversable.rb +181 -59
  337. data/lib/mongoid/utils.rb +22 -0
  338. data/lib/mongoid/validatable/associated.rb +1 -4
  339. data/lib/mongoid/validatable/format.rb +0 -1
  340. data/lib/mongoid/validatable/length.rb +0 -1
  341. data/lib/mongoid/validatable/localizable.rb +1 -4
  342. data/lib/mongoid/validatable/macros.rb +5 -14
  343. data/lib/mongoid/validatable/presence.rb +6 -13
  344. data/lib/mongoid/validatable/queryable.rb +0 -3
  345. data/lib/mongoid/validatable/uniqueness.rb +26 -40
  346. data/lib/mongoid/validatable.rb +9 -27
  347. data/lib/mongoid/version.rb +1 -2
  348. data/lib/mongoid/warnings.rb +44 -0
  349. data/lib/mongoid.rb +42 -18
  350. data/lib/rails/generators/mongoid/config/config_generator.rb +8 -2
  351. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +12 -6
  352. data/lib/rails/generators/mongoid/model/model_generator.rb +0 -1
  353. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
  354. data/lib/rails/generators/mongoid_generator.rb +0 -1
  355. data/lib/rails/mongoid.rb +0 -3
  356. data/spec/README.md +19 -4
  357. data/spec/config/mongoid.yml +16 -0
  358. data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
  359. data/spec/integration/app_spec.rb +345 -0
  360. data/spec/integration/associations/belongs_to_spec.rb +18 -1
  361. data/spec/integration/associations/embedded_dirty_spec.rb +57 -0
  362. data/spec/integration/associations/embedded_spec.rb +163 -1
  363. data/spec/integration/associations/embeds_many_spec.rb +219 -0
  364. data/spec/integration/associations/embeds_one_spec.rb +41 -0
  365. data/spec/integration/associations/foreign_key_spec.rb +9 -1
  366. data/spec/integration/associations/foreign_key_spec_models.rb +0 -1
  367. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  368. data/spec/integration/associations/has_many_spec.rb +128 -0
  369. data/spec/integration/associations/has_one_spec.rb +272 -0
  370. data/spec/integration/associations/nested_attributes_assignment_spec.rb +115 -0
  371. data/spec/integration/associations/reverse_population_spec.rb +0 -1
  372. data/spec/integration/associations/reverse_population_spec_models.rb +0 -1
  373. data/spec/integration/associations/scope_option_spec.rb +101 -0
  374. data/spec/integration/atomic/modifiers_spec.rb +116 -0
  375. data/spec/integration/bson_regexp_raw_spec.rb +19 -0
  376. data/spec/integration/callbacks_models.rb +192 -0
  377. data/spec/integration/callbacks_spec.rb +584 -0
  378. data/spec/integration/contextual/empty_spec.rb +141 -0
  379. data/spec/integration/criteria/alias_query_spec.rb +161 -0
  380. data/spec/integration/criteria/date_field_spec.rb +40 -0
  381. data/spec/integration/criteria/default_scope_spec.rb +51 -0
  382. data/spec/integration/criteria/logical_spec.rb +43 -0
  383. data/spec/integration/criteria/range_spec.rb +359 -0
  384. data/spec/integration/criteria/time_with_zone_spec.rb +125 -15
  385. data/spec/integration/discriminator_key_spec.rb +391 -0
  386. data/spec/integration/discriminator_value_spec.rb +206 -0
  387. data/spec/integration/document_spec.rb +30 -1
  388. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  389. data/spec/integration/i18n_fallbacks_spec.rb +3 -19
  390. data/spec/integration/{matchable_spec.rb → matcher_examples_spec.rb} +130 -45
  391. data/spec/integration/matcher_operator_data/all.yml +140 -0
  392. data/spec/integration/matcher_operator_data/and.yml +93 -0
  393. data/spec/integration/matcher_operator_data/bits_all_clear.yml +159 -0
  394. data/spec/integration/matcher_operator_data/bits_all_set.yml +159 -0
  395. data/spec/integration/matcher_operator_data/bits_any_clear.yml +159 -0
  396. data/spec/integration/matcher_operator_data/bits_any_set.yml +159 -0
  397. data/spec/integration/matcher_operator_data/comment.yml +22 -0
  398. data/spec/integration/matcher_operator_data/elem_match.yml +409 -0
  399. data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
  400. data/spec/integration/matcher_operator_data/eq.yml +191 -0
  401. data/spec/integration/matcher_operator_data/exists.yml +213 -0
  402. data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
  403. data/spec/integration/matcher_operator_data/gt.yml +132 -0
  404. data/spec/integration/matcher_operator_data/gt_types.yml +63 -0
  405. data/spec/integration/matcher_operator_data/gte.yml +132 -0
  406. data/spec/integration/matcher_operator_data/gte_types.yml +15 -0
  407. data/spec/integration/matcher_operator_data/implicit.yml +331 -0
  408. data/spec/integration/matcher_operator_data/implicit_traversal.yml +112 -0
  409. data/spec/integration/matcher_operator_data/in.yml +210 -0
  410. data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
  411. data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
  412. data/spec/integration/matcher_operator_data/lt.yml +132 -0
  413. data/spec/integration/matcher_operator_data/lt_types.yml +15 -0
  414. data/spec/integration/matcher_operator_data/lte.yml +132 -0
  415. data/spec/integration/matcher_operator_data/lte_types.yml +15 -0
  416. data/spec/integration/matcher_operator_data/mod.yml +55 -0
  417. data/spec/integration/matcher_operator_data/multiple.yml +29 -0
  418. data/spec/integration/matcher_operator_data/ne.yml +150 -0
  419. data/spec/integration/matcher_operator_data/ne_types.yml +15 -0
  420. data/spec/integration/matcher_operator_data/nin.yml +114 -0
  421. data/spec/integration/matcher_operator_data/nor.yml +126 -0
  422. data/spec/integration/matcher_operator_data/not.yml +196 -0
  423. data/spec/integration/matcher_operator_data/or.yml +137 -0
  424. data/spec/integration/matcher_operator_data/regex.yml +174 -0
  425. data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
  426. data/spec/integration/matcher_operator_data/size.yml +174 -0
  427. data/spec/integration/matcher_operator_data/type.yml +70 -0
  428. data/spec/integration/matcher_operator_data/type_array.yml +16 -0
  429. data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
  430. data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
  431. data/spec/integration/matcher_operator_data/type_code.yml +26 -0
  432. data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
  433. data/spec/integration/matcher_operator_data/type_date.yml +39 -0
  434. data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
  435. data/spec/integration/matcher_operator_data/type_decimal.yml +41 -0
  436. data/spec/integration/matcher_operator_data/type_double.yml +15 -0
  437. data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
  438. data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
  439. data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
  440. data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
  441. data/spec/integration/matcher_operator_data/type_null.yml +23 -0
  442. data/spec/integration/matcher_operator_data/type_object.yml +23 -0
  443. data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
  444. data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
  445. data/spec/integration/matcher_operator_data/type_string.yml +15 -0
  446. data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
  447. data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
  448. data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
  449. data/spec/integration/matcher_operator_spec.rb +122 -0
  450. data/spec/integration/matcher_spec.rb +283 -0
  451. data/spec/integration/persistence/range_field_spec.rb +350 -0
  452. data/spec/integration/server_query_spec.rb +141 -0
  453. data/spec/integration/shardable_spec.rb +20 -5
  454. data/spec/integration/stringified_symbol_field_spec.rb +203 -0
  455. data/spec/lite_spec_helper.rb +25 -9
  456. data/spec/mongoid/association/accessors_spec.rb +282 -78
  457. data/spec/mongoid/association/auto_save_spec.rb +72 -34
  458. data/spec/mongoid/association/builders_spec.rb +1 -2
  459. data/spec/mongoid/association/constrainable_spec.rb +0 -1
  460. data/spec/mongoid/association/counter_cache_spec.rb +33 -34
  461. data/spec/mongoid/association/depending_spec.rb +429 -339
  462. data/spec/mongoid/association/eager_spec.rb +6 -6
  463. data/spec/mongoid/association/embedded/cyclic_spec.rb +2 -3
  464. data/spec/mongoid/association/embedded/dirty_spec.rb +2 -3
  465. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -2
  466. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -1
  467. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +150 -14
  468. data/spec/mongoid/association/embedded/embedded_in_spec.rb +0 -1
  469. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +0 -1
  470. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -1
  471. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +704 -198
  472. data/spec/mongoid/association/embedded/embeds_many_models.rb +194 -1
  473. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -1
  474. data/spec/mongoid/association/embedded/embeds_many_spec.rb +78 -1
  475. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +0 -1
  476. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -1
  477. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +36 -24
  478. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +0 -1
  479. data/spec/mongoid/association/embedded/embeds_one_models.rb +20 -1
  480. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +0 -1
  481. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -3
  482. data/spec/mongoid/association/macros_spec.rb +9 -10
  483. data/spec/mongoid/association/nested/many_spec.rb +0 -1
  484. data/spec/mongoid/association/nested/one_spec.rb +16 -13
  485. data/spec/mongoid/association/options_spec.rb +0 -1
  486. data/spec/mongoid/association/polymorphic_spec.rb +0 -1
  487. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -2
  488. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +109 -17
  489. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +50 -15
  490. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +112 -59
  491. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  492. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +20 -1
  493. data/spec/mongoid/association/referenced/belongs_to_spec.rb +26 -22
  494. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +1 -2
  495. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +26 -2
  496. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +31 -3
  497. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +0 -1
  498. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +523 -372
  499. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +43 -1
  500. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +0 -1
  501. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +56 -3
  502. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +1 -2
  503. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +130 -1
  504. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +23 -7
  505. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +413 -130
  506. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +0 -1
  507. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +857 -503
  508. data/spec/mongoid/association/referenced/has_many_models.rb +59 -2
  509. data/spec/mongoid/association/referenced/has_many_query_spec.rb +0 -1
  510. data/spec/mongoid/association/referenced/has_many_spec.rb +46 -1
  511. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +0 -1
  512. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +53 -10
  513. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +17 -2
  514. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +133 -28
  515. data/spec/mongoid/association/referenced/has_one_models.rb +63 -1
  516. data/spec/mongoid/association/referenced/has_one_query_spec.rb +0 -1
  517. data/spec/mongoid/association/referenced/has_one_spec.rb +22 -2
  518. data/spec/mongoid/association/reflections_spec.rb +0 -1
  519. data/spec/mongoid/association/syncable_spec.rb +46 -33
  520. data/spec/mongoid/association_spec.rb +0 -1
  521. data/spec/mongoid/atomic/modifiers_spec.rb +47 -1
  522. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +0 -1
  523. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +0 -1
  524. data/spec/mongoid/atomic/paths/root_spec.rb +0 -1
  525. data/spec/mongoid/atomic/paths_spec.rb +91 -13
  526. data/spec/mongoid/atomic_spec.rb +51 -7
  527. data/spec/mongoid/attributes/dynamic_spec.rb +0 -1
  528. data/spec/mongoid/attributes/nested_spec.rb +147 -79
  529. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  530. data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
  531. data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
  532. data/spec/mongoid/attributes/projector_spec.rb +40 -0
  533. data/spec/mongoid/attributes/readonly_spec.rb +22 -23
  534. data/spec/mongoid/attributes_spec.rb +888 -62
  535. data/spec/mongoid/cacheable_spec.rb +4 -5
  536. data/spec/mongoid/changeable_spec.rb +464 -73
  537. data/spec/mongoid/clients/factory_spec.rb +91 -9
  538. data/spec/mongoid/clients/options_spec.rb +27 -19
  539. data/spec/mongoid/clients/sessions_spec.rb +27 -67
  540. data/spec/mongoid/clients/transactions_spec.rb +69 -35
  541. data/spec/mongoid/clients_spec.rb +187 -24
  542. data/spec/mongoid/collection_configurable_spec.rb +158 -0
  543. data/spec/mongoid/composable_spec.rb +0 -1
  544. data/spec/mongoid/config/defaults_spec.rb +160 -0
  545. data/spec/mongoid/config/environment_spec.rb +124 -9
  546. data/spec/mongoid/config/options_spec.rb +0 -1
  547. data/spec/mongoid/config_spec.rb +465 -1
  548. data/spec/mongoid/contextual/aggregable/memory_spec.rb +431 -154
  549. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  550. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  551. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +120 -21
  552. data/spec/mongoid/contextual/aggregable/none_spec.rb +60 -0
  553. data/spec/mongoid/contextual/atomic_spec.rb +148 -86
  554. data/spec/mongoid/contextual/geo_near_spec.rb +28 -20
  555. data/spec/mongoid/contextual/map_reduce_spec.rb +20 -20
  556. data/spec/mongoid/contextual/memory_spec.rb +1826 -304
  557. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
  558. data/spec/mongoid/contextual/mongo_spec.rb +3501 -1272
  559. data/spec/mongoid/contextual/none_spec.rb +78 -68
  560. data/spec/mongoid/copyable_spec.rb +657 -37
  561. data/spec/mongoid/copyable_spec_models.rb +28 -1
  562. data/spec/mongoid/criteria/findable_spec.rb +109 -234
  563. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  564. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  565. data/spec/mongoid/criteria/inspectable_spec.rb +0 -1
  566. data/spec/mongoid/criteria/marshalable_spec.rb +18 -2
  567. data/spec/mongoid/criteria/modifiable_spec.rb +37 -38
  568. data/spec/mongoid/criteria/options_spec.rb +0 -1
  569. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +1 -2
  570. data/spec/mongoid/criteria/queryable/expandable_spec.rb +0 -74
  571. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -20
  572. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -27
  573. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +1 -2
  574. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -1
  575. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -1
  576. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +0 -1
  577. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -16
  578. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +0 -1
  579. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +0 -1
  580. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -8
  581. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +0 -1
  582. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +237 -179
  583. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +1 -2
  584. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +7 -8
  585. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +0 -1
  586. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +5 -71
  587. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -60
  588. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +30 -8
  589. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +39 -2
  590. data/spec/mongoid/criteria/queryable/key_spec.rb +0 -1
  591. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +143 -13
  592. data/spec/mongoid/criteria/queryable/optional_spec.rb +16 -486
  593. data/spec/mongoid/criteria/queryable/options_spec.rb +1 -2
  594. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +0 -1
  595. data/spec/mongoid/criteria/queryable/queryable_spec.rb +1 -2
  596. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +1186 -195
  597. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +38 -0
  598. data/spec/mongoid/criteria/queryable/selectable_spec.rb +307 -705
  599. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +589 -0
  600. data/spec/mongoid/criteria/queryable/selector_spec.rb +15 -4
  601. data/spec/mongoid/criteria/queryable/smash_spec.rb +0 -1
  602. data/spec/mongoid/criteria/queryable/storable_spec.rb +37 -1
  603. data/spec/mongoid/criteria/scopable_spec.rb +127 -1
  604. data/spec/mongoid/criteria/translator_spec.rb +132 -0
  605. data/spec/mongoid/criteria_projection_spec.rb +406 -0
  606. data/spec/mongoid/criteria_spec.rb +1267 -1739
  607. data/spec/mongoid/document_fields_spec.rb +179 -5
  608. data/spec/mongoid/document_persistence_context_spec.rb +32 -0
  609. data/spec/mongoid/document_query_spec.rb +51 -1
  610. data/spec/mongoid/document_spec.rb +151 -88
  611. data/spec/mongoid/equality_spec.rb +142 -42
  612. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +0 -1
  613. data/spec/mongoid/errors/callback_spec.rb +0 -1
  614. data/spec/mongoid/errors/delete_restriction_spec.rb +2 -3
  615. data/spec/mongoid/errors/document_not_destroyed_spec.rb +0 -1
  616. data/spec/mongoid/errors/document_not_found_spec.rb +76 -1
  617. data/spec/mongoid/errors/invalid_collection_spec.rb +0 -1
  618. data/spec/mongoid/errors/{eager_load_spec.rb → invalid_config_file_spec.rb} +5 -6
  619. data/spec/mongoid/errors/invalid_config_option_spec.rb +0 -1
  620. data/spec/mongoid/errors/invalid_field_option_spec.rb +0 -1
  621. data/spec/mongoid/errors/invalid_field_spec.rb +1 -2
  622. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  623. data/spec/mongoid/errors/invalid_find_spec.rb +0 -1
  624. data/spec/mongoid/errors/invalid_includes_spec.rb +0 -1
  625. data/spec/mongoid/errors/invalid_index_spec.rb +0 -1
  626. data/spec/mongoid/errors/invalid_options_spec.rb +0 -1
  627. data/spec/mongoid/errors/invalid_path_spec.rb +0 -1
  628. data/spec/mongoid/errors/invalid_relation_spec.rb +0 -1
  629. data/spec/mongoid/errors/invalid_scope_spec.rb +1 -2
  630. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +0 -1
  631. data/spec/mongoid/errors/invalid_storage_options_spec.rb +0 -1
  632. data/spec/mongoid/errors/invalid_time_spec.rb +0 -1
  633. data/spec/mongoid/errors/inverse_not_found_spec.rb +0 -1
  634. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +0 -1
  635. data/spec/mongoid/errors/mixed_relations_spec.rb +0 -1
  636. data/spec/mongoid/errors/mongoid_error_spec.rb +22 -9
  637. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +0 -1
  638. data/spec/mongoid/errors/no_client_config_spec.rb +2 -3
  639. data/spec/mongoid/errors/no_client_database_spec.rb +3 -4
  640. data/spec/mongoid/errors/no_client_hosts_spec.rb +3 -4
  641. data/spec/mongoid/errors/no_clients_config_spec.rb +0 -1
  642. data/spec/mongoid/errors/no_environment_spec.rb +3 -4
  643. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +0 -1
  644. data/spec/mongoid/errors/no_metadata_spec.rb +0 -1
  645. data/spec/mongoid/errors/no_parent_spec.rb +0 -1
  646. data/spec/mongoid/errors/readonly_attribute_spec.rb +0 -1
  647. data/spec/mongoid/errors/readonly_document_spec.rb +2 -3
  648. data/spec/mongoid/errors/scope_overwrite_spec.rb +0 -1
  649. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -2
  650. data/spec/mongoid/errors/unknown_attribute_spec.rb +2 -3
  651. data/spec/mongoid/errors/unsaved_document_spec.rb +0 -1
  652. data/spec/mongoid/errors/unsupported_javascript_spec.rb +0 -1
  653. data/spec/mongoid/errors/validations_spec.rb +0 -1
  654. data/spec/mongoid/extensions/array_spec.rb +16 -3
  655. data/spec/mongoid/extensions/big_decimal_spec.rb +712 -213
  656. data/spec/mongoid/extensions/binary_spec.rb +44 -10
  657. data/spec/mongoid/extensions/boolean_spec.rb +68 -83
  658. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -4
  659. data/spec/mongoid/extensions/date_spec.rb +71 -2
  660. data/spec/mongoid/extensions/date_time_spec.rb +15 -10
  661. data/spec/mongoid/extensions/decimal128_spec.rb +0 -1
  662. data/spec/mongoid/extensions/false_class_spec.rb +1 -2
  663. data/spec/mongoid/extensions/float_spec.rb +53 -75
  664. data/spec/mongoid/extensions/hash_spec.rb +30 -1
  665. data/spec/mongoid/extensions/integer_spec.rb +50 -65
  666. data/spec/mongoid/extensions/module_spec.rb +0 -1
  667. data/spec/mongoid/extensions/nil_class_spec.rb +0 -1
  668. data/spec/mongoid/extensions/object_id_spec.rb +0 -1
  669. data/spec/mongoid/extensions/object_spec.rb +0 -1
  670. data/spec/mongoid/extensions/range_spec.rb +255 -55
  671. data/spec/mongoid/extensions/regexp_spec.rb +58 -34
  672. data/spec/mongoid/extensions/set_spec.rb +106 -1
  673. data/spec/mongoid/extensions/string_spec.rb +58 -31
  674. data/spec/mongoid/extensions/stringified_symbol_spec.rb +84 -0
  675. data/spec/mongoid/extensions/symbol_spec.rb +18 -26
  676. data/spec/mongoid/extensions/time_spec.rb +639 -107
  677. data/spec/mongoid/extensions/time_with_zone_spec.rb +24 -84
  678. data/spec/mongoid/extensions/true_class_spec.rb +1 -2
  679. data/spec/mongoid/extensions_spec.rb +14 -3
  680. data/spec/mongoid/factory_spec.rb +323 -30
  681. data/spec/mongoid/fields/foreign_key_spec.rb +0 -1
  682. data/spec/mongoid/fields/localized_spec.rb +84 -42
  683. data/spec/mongoid/fields/standard_spec.rb +0 -1
  684. data/spec/mongoid/fields_spec.rb +855 -118
  685. data/spec/mongoid/findable_spec.rb +518 -65
  686. data/spec/mongoid/indexable/specification_spec.rb +2 -3
  687. data/spec/mongoid/indexable_spec.rb +85 -33
  688. data/spec/mongoid/inspectable_spec.rb +37 -3
  689. data/spec/mongoid/interceptable_spec.rb +702 -104
  690. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  691. data/spec/mongoid/loggable_spec.rb +0 -1
  692. data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
  693. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +239 -0
  694. data/spec/mongoid/matcher/extract_attribute_spec.rb +36 -0
  695. data/spec/mongoid/mongoizable_spec.rb +285 -0
  696. data/spec/mongoid/persistable/creatable_spec.rb +112 -30
  697. data/spec/mongoid/persistable/deletable_spec.rb +298 -19
  698. data/spec/mongoid/persistable/destroyable_spec.rb +226 -19
  699. data/spec/mongoid/persistable/incrementable_spec.rb +45 -9
  700. data/spec/mongoid/persistable/logical_spec.rb +41 -5
  701. data/spec/mongoid/persistable/poppable_spec.rb +40 -5
  702. data/spec/mongoid/persistable/pullable_spec.rb +80 -9
  703. data/spec/mongoid/persistable/pushable_spec.rb +80 -9
  704. data/spec/mongoid/persistable/renamable_spec.rb +39 -4
  705. data/spec/mongoid/persistable/savable_spec.rb +282 -26
  706. data/spec/mongoid/persistable/settable_spec.rb +76 -10
  707. data/spec/mongoid/persistable/unsettable_spec.rb +40 -5
  708. data/spec/mongoid/persistable/updatable_spec.rb +61 -50
  709. data/spec/mongoid/persistable/upsertable_spec.rb +91 -4
  710. data/spec/mongoid/persistable_spec.rb +3 -4
  711. data/spec/mongoid/persistence_context_spec.rb +57 -59
  712. data/spec/mongoid/positional_spec.rb +0 -1
  713. data/spec/mongoid/query_cache_middleware_spec.rb +7 -5
  714. data/spec/mongoid/query_cache_spec.rb +424 -68
  715. data/spec/mongoid/relations/proxy_spec.rb +7 -8
  716. data/spec/mongoid/reloadable_spec.rb +355 -27
  717. data/spec/mongoid/scopable_spec.rb +191 -39
  718. data/spec/mongoid/selectable_spec.rb +6 -7
  719. data/spec/mongoid/serializable_spec.rb +35 -39
  720. data/spec/mongoid/shardable_models.rb +15 -1
  721. data/spec/mongoid/shardable_spec.rb +181 -32
  722. data/spec/mongoid/stateful_spec.rb +151 -10
  723. data/spec/mongoid/tasks/database_rake_spec.rb +87 -14
  724. data/spec/mongoid/tasks/database_spec.rb +128 -2
  725. data/spec/mongoid/threaded_spec.rb +2 -3
  726. data/spec/mongoid/timestamps/created/short_spec.rb +1 -2
  727. data/spec/mongoid/timestamps/created_spec.rb +1 -2
  728. data/spec/mongoid/timestamps/timeless_spec.rb +2 -3
  729. data/spec/mongoid/timestamps/updated/short_spec.rb +3 -4
  730. data/spec/mongoid/timestamps/updated_spec.rb +3 -4
  731. data/spec/mongoid/timestamps_spec.rb +398 -11
  732. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  733. data/spec/mongoid/touchable_spec.rb +525 -36
  734. data/spec/mongoid/touchable_spec_models.rb +59 -0
  735. data/spec/mongoid/traversable_spec.rb +1143 -2
  736. data/spec/mongoid/validatable/associated_spec.rb +0 -1
  737. data/spec/mongoid/validatable/format_spec.rb +0 -1
  738. data/spec/mongoid/validatable/length_spec.rb +0 -1
  739. data/spec/mongoid/validatable/numericality_spec.rb +0 -1
  740. data/spec/mongoid/validatable/presence_spec.rb +26 -23
  741. data/spec/mongoid/validatable/uniqueness_spec.rb +125 -99
  742. data/spec/mongoid/validatable_spec.rb +3 -4
  743. data/spec/mongoid/warnings_spec.rb +35 -0
  744. data/spec/mongoid_spec.rb +35 -10
  745. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -3
  746. data/spec/rails/mongoid_spec.rb +4 -17
  747. data/spec/shared/LICENSE +20 -0
  748. data/spec/shared/bin/get-mongodb-download-url +17 -0
  749. data/spec/shared/bin/s3-copy +45 -0
  750. data/spec/shared/bin/s3-upload +69 -0
  751. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  752. data/spec/shared/lib/mrss/cluster_config.rb +231 -0
  753. data/spec/shared/lib/mrss/constraints.rb +378 -0
  754. data/spec/shared/lib/mrss/docker_runner.rb +298 -0
  755. data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
  756. data/spec/shared/lib/mrss/event_subscriber.rb +210 -0
  757. data/spec/shared/lib/mrss/lite_constraints.rb +238 -0
  758. data/spec/shared/lib/mrss/server_version_registry.rb +113 -0
  759. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  760. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  761. data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
  762. data/spec/shared/lib/mrss/utils.rb +37 -0
  763. data/spec/shared/share/Dockerfile.erb +321 -0
  764. data/spec/shared/share/haproxy-1.conf +16 -0
  765. data/spec/shared/share/haproxy-2.conf +17 -0
  766. data/spec/shared/shlib/config.sh +27 -0
  767. data/spec/shared/shlib/distro.sh +74 -0
  768. data/spec/shared/shlib/server.sh +416 -0
  769. data/spec/shared/shlib/set_env.sh +169 -0
  770. data/spec/spec_helper.rb +24 -54
  771. data/spec/support/authorization.rb +0 -1
  772. data/spec/support/client_registry.rb +9 -0
  773. data/spec/support/constraints.rb +34 -197
  774. data/spec/support/expectations.rb +0 -1
  775. data/spec/support/helpers.rb +1 -1
  776. data/spec/support/immutable_ids.rb +118 -0
  777. data/spec/support/macros.rb +109 -1
  778. data/spec/{app → support}/models/account.rb +1 -2
  779. data/spec/{app → support}/models/acolyte.rb +0 -1
  780. data/spec/{app → support}/models/actor.rb +1 -2
  781. data/spec/{app → support}/models/actress.rb +0 -1
  782. data/spec/{app → support}/models/address.rb +4 -1
  783. data/spec/{app → support}/models/address_component.rb +0 -1
  784. data/spec/{app → support}/models/address_number.rb +0 -1
  785. data/spec/{app → support}/models/agency.rb +0 -1
  786. data/spec/{app → support}/models/agent.rb +0 -1
  787. data/spec/{app → support}/models/album.rb +0 -1
  788. data/spec/{app → support}/models/alert.rb +0 -1
  789. data/spec/{app → support}/models/animal.rb +0 -1
  790. data/spec/{app → support}/models/answer.rb +0 -1
  791. data/spec/{app → support}/models/appointment.rb +0 -1
  792. data/spec/support/models/armrest.rb +9 -0
  793. data/spec/{app → support}/models/array_field.rb +0 -1
  794. data/spec/{app → support}/models/article.rb +0 -1
  795. data/spec/{app → support}/models/artist.rb +2 -2
  796. data/spec/{app → support}/models/artwork.rb +0 -1
  797. data/spec/support/models/audible_sound.rb +3 -0
  798. data/spec/{app → support}/models/audio.rb +0 -1
  799. data/spec/support/models/augmentation.rb +25 -0
  800. data/spec/{app → support}/models/author.rb +0 -1
  801. data/spec/{app → support}/models/baby.rb +0 -1
  802. data/spec/{app → support}/models/band.rb +8 -1
  803. data/spec/{app → support}/models/bar.rb +0 -1
  804. data/spec/{app → support}/models/basic.rb +0 -1
  805. data/spec/{app → support}/models/bed.rb +0 -1
  806. data/spec/{app → support}/models/big_palette.rb +0 -1
  807. data/spec/{app → support}/models/birthday.rb +0 -1
  808. data/spec/support/models/bolt.rb +7 -0
  809. data/spec/{app → support}/models/bomb.rb +0 -1
  810. data/spec/{app → support}/models/book.rb +1 -1
  811. data/spec/{app → support}/models/breed.rb +0 -1
  812. data/spec/{app → support}/models/browser.rb +1 -2
  813. data/spec/{app → support}/models/building.rb +2 -1
  814. data/spec/{app → support}/models/building_address.rb +0 -1
  815. data/spec/{app → support}/models/bus.rb +0 -1
  816. data/spec/{app → support}/models/business.rb +0 -1
  817. data/spec/{app → support}/models/callback_test.rb +0 -1
  818. data/spec/{app → support}/models/canvas.rb +1 -2
  819. data/spec/{app → support}/models/car.rb +0 -1
  820. data/spec/{app → support}/models/cat.rb +0 -1
  821. data/spec/support/models/catalog.rb +24 -0
  822. data/spec/{app → support}/models/category.rb +0 -1
  823. data/spec/{app → support}/models/child.rb +0 -1
  824. data/spec/{app → support}/models/child_doc.rb +3 -4
  825. data/spec/{app → support}/models/church.rb +0 -1
  826. data/spec/{app → support}/models/circle.rb +0 -1
  827. data/spec/{app → support}/models/circuit.rb +0 -1
  828. data/spec/{app → support}/models/circus.rb +3 -1
  829. data/spec/{app → support}/models/code.rb +2 -1
  830. data/spec/{app → support}/models/coding/pull_request.rb +0 -1
  831. data/spec/support/models/coding.rb +3 -0
  832. data/spec/{app → support}/models/comment.rb +0 -1
  833. data/spec/{app → support}/models/company.rb +0 -1
  834. data/spec/{app → support}/models/consumption_period.rb +0 -1
  835. data/spec/{app → support}/models/contextable_item.rb +0 -1
  836. data/spec/{app → support}/models/contractor.rb +0 -1
  837. data/spec/{app → support}/models/cookie.rb +0 -1
  838. data/spec/{app → support}/models/country_code.rb +2 -1
  839. data/spec/{app → support}/models/courier_job.rb +0 -1
  840. data/spec/support/models/cover.rb +10 -0
  841. data/spec/support/models/crate.rb +12 -0
  842. data/spec/support/models/customer.rb +10 -0
  843. data/spec/support/models/customer_address.rb +11 -0
  844. data/spec/support/models/deed.rb +7 -0
  845. data/spec/{app → support}/models/definition.rb +0 -1
  846. data/spec/{app → support}/models/delegating_patient.rb +0 -1
  847. data/spec/{app → support}/models/description.rb +0 -1
  848. data/spec/{app → support}/models/dictionary.rb +6 -1
  849. data/spec/{app → support}/models/division.rb +0 -1
  850. data/spec/{app → support}/models/doctor.rb +0 -1
  851. data/spec/{app → support}/models/dog.rb +0 -1
  852. data/spec/{app → support}/models/dokument.rb +0 -1
  853. data/spec/{app → support}/models/draft.rb +0 -1
  854. data/spec/{app → support}/models/dragon.rb +0 -1
  855. data/spec/{app → support}/models/driver.rb +1 -2
  856. data/spec/{app → support}/models/drug.rb +0 -1
  857. data/spec/{app → support}/models/dungeon.rb +0 -1
  858. data/spec/{app → support}/models/edit.rb +0 -1
  859. data/spec/{app → support}/models/email.rb +0 -1
  860. data/spec/{app → support}/models/employer.rb +0 -1
  861. data/spec/{app → support}/models/entry.rb +0 -1
  862. data/spec/{app → support}/models/eraser.rb +0 -1
  863. data/spec/{app → support}/models/even.rb +0 -1
  864. data/spec/{app → support}/models/event.rb +0 -1
  865. data/spec/{app → support}/models/exhibition.rb +0 -1
  866. data/spec/{app → support}/models/exhibitor.rb +0 -1
  867. data/spec/{app → support}/models/explosion.rb +0 -1
  868. data/spec/{app → support}/models/eye.rb +0 -1
  869. data/spec/{app → support}/models/eye_bowl.rb +0 -1
  870. data/spec/{app → support}/models/face.rb +0 -1
  871. data/spec/support/models/fanatic.rb +8 -0
  872. data/spec/{app → support}/models/favorite.rb +0 -1
  873. data/spec/{app → support}/models/filesystem.rb +0 -1
  874. data/spec/{app → support}/models/fire_hydrant.rb +0 -1
  875. data/spec/{app → support}/models/firefox.rb +0 -1
  876. data/spec/{app → support}/models/fish.rb +0 -1
  877. data/spec/{app → support}/models/folder.rb +0 -1
  878. data/spec/{app → support}/models/folder_item.rb +0 -1
  879. data/spec/{app → support}/models/fruits.rb +0 -1
  880. data/spec/{app → support}/models/game.rb +0 -1
  881. data/spec/{app → support}/models/ghost.rb +0 -1
  882. data/spec/support/models/guitar.rb +4 -0
  883. data/spec/support/models/hole.rb +12 -0
  884. data/spec/{app → support}/models/home.rb +0 -1
  885. data/spec/{app → support}/models/house.rb +0 -1
  886. data/spec/{app → support}/models/html_writer.rb +0 -1
  887. data/spec/{app → support}/models/id_key.rb +0 -1
  888. data/spec/support/models/idnodef.rb +7 -0
  889. data/spec/{app → support}/models/image.rb +0 -1
  890. data/spec/{app → support}/models/implant.rb +9 -1
  891. data/spec/support/models/instrument.rb +8 -0
  892. data/spec/{app → support}/models/item.rb +1 -2
  893. data/spec/{app → support}/models/jar.rb +0 -1
  894. data/spec/{app → support}/models/kaleidoscope.rb +0 -1
  895. data/spec/{app → support}/models/kangaroo.rb +0 -1
  896. data/spec/{app → support}/models/label.rb +4 -2
  897. data/spec/{app → support}/models/language.rb +0 -1
  898. data/spec/{app → support}/models/lat_lng.rb +0 -1
  899. data/spec/{app → support}/models/league.rb +0 -1
  900. data/spec/{app → support}/models/learner.rb +0 -1
  901. data/spec/{app → support}/models/line_item.rb +0 -1
  902. data/spec/{app → support}/models/location.rb +0 -1
  903. data/spec/{app → support}/models/login.rb +0 -1
  904. data/spec/{app → support}/models/manufacturer.rb +0 -1
  905. data/spec/{app → support}/models/meat.rb +0 -1
  906. data/spec/{app → support}/models/membership.rb +1 -1
  907. data/spec/{app → support}/models/message.rb +0 -1
  908. data/spec/{app → support}/models/minim.rb +0 -1
  909. data/spec/{app → support}/models/mixed_drink.rb +0 -1
  910. data/spec/support/models/mop.rb +24 -0
  911. data/spec/{app → support}/models/movie.rb +0 -1
  912. data/spec/{app → support}/models/my_hash.rb +0 -1
  913. data/spec/{app → support}/models/name.rb +0 -1
  914. data/spec/{app → support}/models/name_only.rb +0 -1
  915. data/spec/{app → support}/models/node.rb +0 -1
  916. data/spec/{app → support}/models/note.rb +0 -1
  917. data/spec/support/models/nut.rb +7 -0
  918. data/spec/{app → support}/models/odd.rb +0 -1
  919. data/spec/support/models/order.rb +12 -0
  920. data/spec/{app → support}/models/ordered_post.rb +1 -2
  921. data/spec/{app → support}/models/ordered_preference.rb +0 -1
  922. data/spec/{app → support}/models/oscar.rb +0 -1
  923. data/spec/{app → support}/models/other_owner_object.rb +0 -1
  924. data/spec/{app → support}/models/override.rb +0 -1
  925. data/spec/{app → support}/models/ownable.rb +0 -1
  926. data/spec/{app → support}/models/owner.rb +2 -1
  927. data/spec/{app → support}/models/pack.rb +0 -1
  928. data/spec/{app → support}/models/page.rb +0 -1
  929. data/spec/{app → support}/models/page_question.rb +0 -1
  930. data/spec/{app → support}/models/palette.rb +1 -2
  931. data/spec/{app → support}/models/parent.rb +0 -1
  932. data/spec/{app → support}/models/parent_doc.rb +0 -1
  933. data/spec/support/models/passport.rb +22 -0
  934. data/spec/{app → support}/models/patient.rb +0 -1
  935. data/spec/{app → support}/models/pdf_writer.rb +0 -1
  936. data/spec/{app → support}/models/pencil.rb +0 -1
  937. data/spec/{app → support}/models/person.rb +20 -2
  938. data/spec/{app → support}/models/pet.rb +0 -1
  939. data/spec/{app → support}/models/pet_owner.rb +0 -1
  940. data/spec/{app → support}/models/phone.rb +3 -2
  941. data/spec/support/models/piano.rb +4 -0
  942. data/spec/{app → support}/models/pizza.rb +0 -1
  943. data/spec/{app → support}/models/player.rb +2 -1
  944. data/spec/{app → support}/models/post.rb +0 -1
  945. data/spec/{app → support}/models/post_genre.rb +0 -1
  946. data/spec/support/models/powerup.rb +25 -0
  947. data/spec/{app → support}/models/preference.rb +0 -1
  948. data/spec/{app → support}/models/princess.rb +0 -1
  949. data/spec/{app → support}/models/product.rb +1 -1
  950. data/spec/support/models/profile.rb +17 -0
  951. data/spec/{app → support}/models/pronunciation.rb +0 -1
  952. data/spec/{app → support}/models/pub.rb +0 -1
  953. data/spec/{app → support}/models/publication/encyclopedia.rb +0 -1
  954. data/spec/{app → support}/models/publication/review.rb +0 -1
  955. data/spec/support/models/publication.rb +4 -0
  956. data/spec/{app → support}/models/purchase.rb +0 -1
  957. data/spec/support/models/purchased_item.rb +10 -0
  958. data/spec/{app → support}/models/question.rb +0 -1
  959. data/spec/{app → support}/models/quiz.rb +0 -1
  960. data/spec/{app → support}/models/rating.rb +0 -1
  961. data/spec/{app → support}/models/record.rb +0 -1
  962. data/spec/{app → support}/models/registry.rb +1 -1
  963. data/spec/{app → support}/models/role.rb +0 -1
  964. data/spec/{app → support}/models/root_category.rb +0 -1
  965. data/spec/{app → support}/models/sandwich.rb +0 -1
  966. data/spec/{app → support}/models/scheduler.rb +0 -1
  967. data/spec/support/models/school.rb +14 -0
  968. data/spec/{app/models/profile.rb → support/models/scribe.rb} +2 -3
  969. data/spec/support/models/sealer.rb +7 -0
  970. data/spec/support/models/seat.rb +24 -0
  971. data/spec/{app → support}/models/seo.rb +0 -1
  972. data/spec/{app → support}/models/series.rb +1 -1
  973. data/spec/{app → support}/models/server.rb +0 -1
  974. data/spec/{app → support}/models/service.rb +0 -1
  975. data/spec/{app → support}/models/shape.rb +2 -3
  976. data/spec/{app → support}/models/shelf.rb +0 -1
  977. data/spec/support/models/shield.rb +18 -0
  978. data/spec/{app → support}/models/shipment_address.rb +0 -1
  979. data/spec/{app → support}/models/shipping_container.rb +0 -1
  980. data/spec/{app → support}/models/shipping_pack.rb +0 -1
  981. data/spec/support/models/shirt.rb +11 -0
  982. data/spec/{app → support}/models/shop.rb +0 -1
  983. data/spec/{app → support}/models/short_agent.rb +0 -1
  984. data/spec/{app → support}/models/short_quiz.rb +0 -1
  985. data/spec/{app → support}/models/simple.rb +0 -1
  986. data/spec/{app → support}/models/slave.rb +0 -1
  987. data/spec/{app → support}/models/song.rb +0 -1
  988. data/spec/{app → support}/models/sound.rb +0 -1
  989. data/spec/support/models/spacer.rb +7 -0
  990. data/spec/{app → support}/models/square.rb +0 -1
  991. data/spec/{app → support}/models/staff.rb +0 -1
  992. data/spec/{app → support}/models/store_as_dup_test1.rb +0 -1
  993. data/spec/{app → support}/models/store_as_dup_test2.rb +0 -1
  994. data/spec/{app → support}/models/store_as_dup_test3.rb +0 -1
  995. data/spec/{app → support}/models/store_as_dup_test4.rb +0 -1
  996. data/spec/{app → support}/models/strategy.rb +0 -1
  997. data/spec/support/models/student.rb +14 -0
  998. data/spec/{app → support}/models/sub_item.rb +0 -1
  999. data/spec/{app → support}/models/subscription.rb +0 -1
  1000. data/spec/{app → support}/models/survey.rb +0 -1
  1001. data/spec/{app → support}/models/symptom.rb +0 -1
  1002. data/spec/support/models/system_role.rb +7 -0
  1003. data/spec/{app → support}/models/tag.rb +0 -1
  1004. data/spec/{app → support}/models/target.rb +0 -1
  1005. data/spec/{app → support}/models/template.rb +0 -1
  1006. data/spec/{app → support}/models/thing.rb +0 -1
  1007. data/spec/support/models/threadlocker.rb +7 -0
  1008. data/spec/{app → support}/models/title.rb +0 -1
  1009. data/spec/{app → support}/models/tool.rb +2 -3
  1010. data/spec/{app → support}/models/topping.rb +0 -1
  1011. data/spec/support/models/toy.rb +9 -0
  1012. data/spec/{app → support}/models/track.rb +0 -1
  1013. data/spec/{app → support}/models/translation.rb +0 -1
  1014. data/spec/{app → support}/models/tree.rb +0 -1
  1015. data/spec/{app → support}/models/truck.rb +2 -1
  1016. data/spec/{app → support}/models/updatable.rb +0 -1
  1017. data/spec/{app → support}/models/user.rb +0 -1
  1018. data/spec/{app → support}/models/user_account.rb +0 -1
  1019. data/spec/{app → support}/models/validation_callback.rb +0 -1
  1020. data/spec/{app → support}/models/vehicle.rb +7 -3
  1021. data/spec/{app → support}/models/version.rb +0 -1
  1022. data/spec/{app → support}/models/vertex.rb +0 -1
  1023. data/spec/{app → support}/models/vet_visit.rb +0 -1
  1024. data/spec/{app → support}/models/video.rb +0 -1
  1025. data/spec/{app → support}/models/video_game.rb +0 -1
  1026. data/spec/support/models/washer.rb +7 -0
  1027. data/spec/support/models/weapon.rb +25 -0
  1028. data/spec/{app → support}/models/wiki_page.rb +1 -1
  1029. data/spec/{app → support}/models/word.rb +0 -1
  1030. data/spec/{app → support}/models/word_origin.rb +0 -1
  1031. data/spec/{app → support}/models/writer.rb +2 -3
  1032. data/spec/support/schema_maps/schema_map_aws.json +17 -0
  1033. data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
  1034. data/spec/support/schema_maps/schema_map_azure.json +17 -0
  1035. data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
  1036. data/spec/support/schema_maps/schema_map_gcp.json +17 -0
  1037. data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
  1038. data/spec/support/schema_maps/schema_map_kmip.json +17 -0
  1039. data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
  1040. data/spec/support/schema_maps/schema_map_local.json +18 -0
  1041. data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
  1042. data/spec/support/shared/time.rb +0 -1
  1043. data/spec/support/spec_config.rb +28 -6
  1044. data.tar.gz.sig +0 -0
  1045. metadata +1216 -799
  1046. metadata.gz.sig +0 -0
  1047. data/lib/mongoid/errors/eager_load.rb +0 -26
  1048. data/lib/mongoid/errors/invalid_value.rb +0 -18
  1049. data/lib/mongoid/matchable/all.rb +0 -30
  1050. data/lib/mongoid/matchable/and.rb +0 -32
  1051. data/lib/mongoid/matchable/default.rb +0 -121
  1052. data/lib/mongoid/matchable/elem_match.rb +0 -36
  1053. data/lib/mongoid/matchable/eq.rb +0 -23
  1054. data/lib/mongoid/matchable/exists.rb +0 -25
  1055. data/lib/mongoid/matchable/gt.rb +0 -25
  1056. data/lib/mongoid/matchable/gte.rb +0 -25
  1057. data/lib/mongoid/matchable/in.rb +0 -26
  1058. data/lib/mongoid/matchable/lt.rb +0 -25
  1059. data/lib/mongoid/matchable/lte.rb +0 -25
  1060. data/lib/mongoid/matchable/ne.rb +0 -23
  1061. data/lib/mongoid/matchable/nin.rb +0 -24
  1062. data/lib/mongoid/matchable/nor.rb +0 -38
  1063. data/lib/mongoid/matchable/or.rb +0 -35
  1064. data/lib/mongoid/matchable/regexp.rb +0 -30
  1065. data/lib/mongoid/matchable/size.rb +0 -23
  1066. data/lib/support/ruby_version.rb +0 -29
  1067. data/spec/app/models/augmentation.rb +0 -14
  1068. data/spec/app/models/coding.rb +0 -4
  1069. data/spec/app/models/passport.rb +0 -8
  1070. data/spec/app/models/powerup.rb +0 -14
  1071. data/spec/app/models/publication.rb +0 -5
  1072. data/spec/app/models/weapon.rb +0 -14
  1073. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -61
  1074. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -61
  1075. data/spec/mongoid/matchable/all_spec.rb +0 -34
  1076. data/spec/mongoid/matchable/and_spec.rb +0 -190
  1077. data/spec/mongoid/matchable/default_spec.rb +0 -140
  1078. data/spec/mongoid/matchable/elem_match_spec.rb +0 -109
  1079. data/spec/mongoid/matchable/eq_spec.rb +0 -49
  1080. data/spec/mongoid/matchable/exists_spec.rb +0 -60
  1081. data/spec/mongoid/matchable/gt_spec.rb +0 -89
  1082. data/spec/mongoid/matchable/gte_spec.rb +0 -87
  1083. data/spec/mongoid/matchable/in_spec.rb +0 -52
  1084. data/spec/mongoid/matchable/lt_spec.rb +0 -88
  1085. data/spec/mongoid/matchable/lte_spec.rb +0 -88
  1086. data/spec/mongoid/matchable/ne_spec.rb +0 -49
  1087. data/spec/mongoid/matchable/nin_spec.rb +0 -51
  1088. data/spec/mongoid/matchable/nor_spec.rb +0 -210
  1089. data/spec/mongoid/matchable/or_spec.rb +0 -134
  1090. data/spec/mongoid/matchable/regexp_spec.rb +0 -62
  1091. data/spec/mongoid/matchable/size_spec.rb +0 -28
  1092. data/spec/mongoid/matchable_spec.rb +0 -856
  1093. data/spec/support/cluster_config.rb +0 -158
  1094. data/spec/support/lite_constraints.rb +0 -22
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
- # encoding: utf-8
3
2
 
4
3
  require "spec_helper"
4
+ require_relative './attributes/nested_spec_models'
5
5
 
6
6
  describe Mongoid::Attributes do
7
7
 
@@ -21,7 +21,7 @@ describe Mongoid::Attributes do
21
21
  context "when the attribute was excluded in a criteria" do
22
22
 
23
23
  let!(:person) do
24
- Person.create(title: "sir")
24
+ Person.create!(title: "sir")
25
25
  end
26
26
 
27
27
  context "when the attribute is localized" do
@@ -56,7 +56,7 @@ describe Mongoid::Attributes do
56
56
  let!(:agent) do
57
57
  agent = Agent.new(:title => title)
58
58
  agent.build_address(:city => city)
59
- agent.save()
59
+ agent.save!()
60
60
  agent
61
61
  end
62
62
  let(:from_db) do
@@ -96,6 +96,49 @@ describe Mongoid::Attributes do
96
96
  it "does not raise an error" do
97
97
  expect(from_db.map).to eq(map)
98
98
  end
99
+
100
+ context 'when only one of the hash fields is projected' do
101
+
102
+ let(:map) do
103
+ { 'dates' => { 'y' => { '2016' => 'Berlin', '2017' => 'Munich' } } }
104
+ end
105
+
106
+ let(:expected) do
107
+ { 'dates' => { 'y' => {
108
+ '2016' => 'Berlin',
109
+ } } }
110
+ end
111
+
112
+ it 'retrieves only the projected fields' do
113
+ expect(from_db.map).to eq(expected)
114
+ end
115
+ end
116
+
117
+ context 'when several of the hash fields is projected' do
118
+
119
+ let(:map) do
120
+ { 'dates' => { 'y' => {
121
+ '2016' => 'Berlin',
122
+ '2017' => 'Munich',
123
+ '2018' => 'Krakow',
124
+ } } }
125
+ end
126
+
127
+ let(:expected) do
128
+ { 'dates' => { 'y' => {
129
+ '2016' => 'Berlin',
130
+ '2018' => 'Krakow',
131
+ } } }
132
+ end
133
+
134
+ let(:from_db) do
135
+ Person.only('map.dates.y.2016', 'map.dates.y.2018').first
136
+ end
137
+
138
+ it 'retrieves only the projected fields' do
139
+ expect(from_db.map).to eq(expected)
140
+ end
141
+ end
99
142
  end
100
143
  end
101
144
 
@@ -156,7 +199,7 @@ describe Mongoid::Attributes do
156
199
  context 'when the document has a custom attribute type' do
157
200
 
158
201
  let(:bar) do
159
- Bar.create(lat_lng: LatLng.new(52.30, 13.25))
202
+ Bar.create!(lat_lng: LatLng.new(52.30, 13.25))
160
203
  end
161
204
 
162
205
  it 'returns the demongoized version of the attribute' do
@@ -213,7 +256,7 @@ describe Mongoid::Attributes do
213
256
  context "when the document is an existing record" do
214
257
 
215
258
  let!(:person) do
216
- Person.create(title: "sir")
259
+ Person.create!(title: "sir")
217
260
  end
218
261
 
219
262
  context "when the attribute was excluded in a criteria" do
@@ -245,6 +288,91 @@ describe Mongoid::Attributes do
245
288
  end
246
289
  end
247
290
 
291
+ context "when the field was not explicitly defined" do
292
+
293
+ context "when excluding with only and the field was not excluded" do
294
+
295
+ let(:from_db) do
296
+ Person.only(:_id).first
297
+ end
298
+
299
+ it "raises an error" do
300
+ expect {
301
+ from_db[:undefined_field]
302
+ }.to raise_error(ActiveModel::MissingAttributeError)
303
+ end
304
+ end
305
+
306
+ context "when excluding with without and the field was excluded" do
307
+
308
+ let(:from_db) do
309
+ Person.without(:title).first
310
+ end
311
+
312
+ it "raises an error" do
313
+ expect {
314
+ from_db[:title]
315
+ }.to raise_error(ActiveModel::MissingAttributeError)
316
+ end
317
+ end
318
+
319
+ context "when excluding with without and the field was not excluded" do
320
+
321
+ let(:from_db) do
322
+ Person.without(:title).first
323
+ end
324
+
325
+ it "returns nil" do
326
+ from_db[:undefined_field].should be nil
327
+ end
328
+ end
329
+ end
330
+
331
+ context 'when projecting with #only' do
332
+ let!(:person) do
333
+ Person.create!(title: 'sir', name: { first_name: 'Jose', language: { name: 'es' } })
334
+ end
335
+
336
+ context 'when projecting an embedded association' do
337
+ let(:from_db) do
338
+ Person.only(:name).first
339
+ end
340
+
341
+ context 'when retrieving a field of the association using the dot notation' do
342
+
343
+ it 'retrieves the field' do
344
+ expect(from_db['name.first_name']).to eq 'Jose'
345
+ end
346
+ end
347
+
348
+ context 'when retrieving a field of a nested association using the dot notation' do
349
+ it 'retrieves the field' do
350
+ expect(from_db['name.language.name']).to eq 'es'
351
+ end
352
+ end
353
+ end
354
+
355
+ context 'when projecting a sub-association of an embedded association' do
356
+ let(:from_db) do
357
+ Person.only('name.language').first
358
+ end
359
+
360
+ context 'when retrieving a field under the projected sub-association' do
361
+ it 'retrieves the field' do
362
+ expect(from_db['name.language.name']).to eq 'es'
363
+ end
364
+ end
365
+
366
+ context 'when retrieving a non-projected field' do
367
+ it 'raises MissingAttributeError' do
368
+ expect do
369
+ from_db['name.first_name']
370
+ end.to raise_error(ActiveModel::MissingAttributeError)
371
+ end
372
+ end
373
+ end
374
+ end
375
+
248
376
  context "when the attribute does not exist" do
249
377
 
250
378
  before do
@@ -265,11 +393,10 @@ describe Mongoid::Attributes do
265
393
  end
266
394
 
267
395
  context "when reloaded" do
396
+ config_override :raise_not_found_error, false
268
397
 
269
398
  before do
270
- Mongoid.raise_not_found_error = false
271
399
  person.reload
272
- Mongoid.raise_not_found_error = true
273
400
  end
274
401
 
275
402
  it "returns the default value" do
@@ -287,7 +414,7 @@ describe Mongoid::Attributes do
287
414
  let(:bar) do
288
415
  Bar.new.tap do |b|
289
416
  b[:lat_lng] = LatLng.new(52.30, 13.25)
290
- b.save
417
+ b.save!
291
418
  end
292
419
  end
293
420
 
@@ -329,6 +456,67 @@ describe Mongoid::Attributes do
329
456
  expect(terms).to eq(true)
330
457
  end
331
458
  end
459
+
460
+ context 'when the field is not explicitly defined' do
461
+ let(:bar) { Bar.new }
462
+
463
+ before do
464
+ bar['missing_field'] = 42
465
+ end
466
+
467
+ it 'writes the value into attributes' do
468
+ bar.attributes.should == {'_id' => bar.id, 'missing_field' => 42}
469
+ end
470
+
471
+ it 'makes the attribute accessible via []' do
472
+ bar['missing_field'].should == 42
473
+ end
474
+
475
+ context 'when writing fields on a document with projection' do
476
+
477
+ let!(:person) do
478
+ Person.create!(title: "sir")
479
+ end
480
+
481
+ context "when excluding with only and the field was not excluded" do
482
+
483
+ let(:from_db) do
484
+ Person.only(:_id).first
485
+ end
486
+
487
+ it "raises an error" do
488
+ expect {
489
+ from_db[:undefined_field] = 'x'
490
+ }.to raise_error(ActiveModel::MissingAttributeError)
491
+ end
492
+ end
493
+
494
+ context "when excluding with without and the field was excluded" do
495
+
496
+ let(:from_db) do
497
+ Person.without(:title).first
498
+ end
499
+
500
+ it "raises an error" do
501
+ expect {
502
+ from_db[:title] = 'x'
503
+ }.to raise_error(ActiveModel::MissingAttributeError)
504
+ end
505
+ end
506
+
507
+ context "when excluding with without and the field was not excluded" do
508
+
509
+ let(:from_db) do
510
+ Person.without(:title).first
511
+ end
512
+
513
+ it "writes the value" do
514
+ from_db[:undefined_field] = 'x'
515
+ from_db[:undefined_field].should == 'x'
516
+ end
517
+ end
518
+ end
519
+ end
332
520
  end
333
521
 
334
522
  describe "#_id" do
@@ -799,7 +987,7 @@ describe Mongoid::Attributes do
799
987
  context 'when the document has a custom attribute type' do
800
988
 
801
989
  let(:bar) do
802
- Bar.create(lat_lng: LatLng.new(52.30, 13.25))
990
+ Bar.create!(lat_lng: LatLng.new(52.30, 13.25))
803
991
  end
804
992
 
805
993
  it 'returns the demongoized version of the attribute' do
@@ -837,18 +1025,17 @@ describe Mongoid::Attributes do
837
1025
  context "when the document is an existing record" do
838
1026
 
839
1027
  let(:person) do
840
- Person.create
1028
+ Person.create!
841
1029
  end
842
1030
 
843
1031
  context "when the attribute does not exist" do
1032
+ config_override :raise_not_found_error, false
844
1033
 
845
1034
  before do
846
1035
  person.collection
847
1036
  .find({ _id: person.id })
848
1037
  .update_one({ "$unset" => { age: 1 }})
849
- Mongoid.raise_not_found_error = false
850
1038
  person.reload
851
- Mongoid.raise_not_found_error = true
852
1039
  end
853
1040
 
854
1041
  it "returns the default value" do
@@ -876,7 +1063,7 @@ describe Mongoid::Attributes do
876
1063
  describe "#read_attribute_before_type_cast" do
877
1064
 
878
1065
  let(:person) do
879
- Person.create
1066
+ Person.create!
880
1067
  end
881
1068
 
882
1069
  context "when the attribute has not yet been assigned" do
@@ -889,8 +1076,52 @@ describe Mongoid::Attributes do
889
1076
  context "after the attribute has been assigned" do
890
1077
 
891
1078
  it "returns the default value" do
892
- person.age = "old"
893
- expect(person.age_before_type_cast).to eq("old")
1079
+ person.age = "42"
1080
+ expect(person.age_before_type_cast).to eq("42")
1081
+ end
1082
+ end
1083
+
1084
+ context 'when reading fields on a document with projection' do
1085
+
1086
+ let!(:person) do
1087
+ Person.create!(title: "sir")
1088
+ end
1089
+
1090
+ context "when excluding with only and the field was not excluded" do
1091
+
1092
+ let(:from_db) do
1093
+ Person.only(:_id).first
1094
+ end
1095
+
1096
+ it "raises an error" do
1097
+ expect {
1098
+ from_db.read_attribute(:undefined_field)
1099
+ }.to raise_error(ActiveModel::MissingAttributeError)
1100
+ end
1101
+ end
1102
+
1103
+ context "when excluding with without and the field was excluded" do
1104
+
1105
+ let(:from_db) do
1106
+ Person.without(:title).first
1107
+ end
1108
+
1109
+ it "raises an error" do
1110
+ expect {
1111
+ from_db.read_attribute(:title)
1112
+ }.to raise_error(ActiveModel::MissingAttributeError)
1113
+ end
1114
+ end
1115
+
1116
+ context "when excluding with without and the field was not excluded" do
1117
+
1118
+ let(:from_db) do
1119
+ Person.without(:title).first
1120
+ end
1121
+
1122
+ it "returns nil" do
1123
+ from_db.read_attribute(:undefined_field).should be nil
1124
+ end
894
1125
  end
895
1126
  end
896
1127
  end
@@ -924,18 +1155,17 @@ describe Mongoid::Attributes do
924
1155
  context "when the document is an existing record" do
925
1156
 
926
1157
  let(:person) do
927
- Person.create
1158
+ Person.create!
928
1159
  end
929
1160
 
930
1161
  context "when the attribute does not exist" do
1162
+ config_override :raise_not_found_error, false
931
1163
 
932
1164
  before do
933
1165
  person.collection
934
1166
  .find({ _id: person.id })
935
1167
  .update_one({ "$unset" => { age: 1 }})
936
- Mongoid.raise_not_found_error = false
937
1168
  person.reload
938
- Mongoid.raise_not_found_error = true
939
1169
  end
940
1170
 
941
1171
  it "returns true" do
@@ -983,7 +1213,7 @@ describe Mongoid::Attributes do
983
1213
 
984
1214
  context "when the attribute is not on only list" do
985
1215
 
986
- before { Person.create }
1216
+ before { Person.create! }
987
1217
  let(:person) do
988
1218
  Person.only(:id).first
989
1219
  end
@@ -1033,15 +1263,15 @@ describe Mongoid::Attributes do
1033
1263
 
1034
1264
  context "before the attribute has been assigned" do
1035
1265
 
1036
- it "returns false" do
1037
- expect(person.has_attribute_before_type_cast?(:age)).to be false
1266
+ it "returns true" do
1267
+ expect(person.has_attribute_before_type_cast?(:age)).to be true
1038
1268
  end
1039
1269
  end
1040
1270
 
1041
1271
  context "after the attribute has been assigned" do
1042
1272
 
1043
1273
  it "returns true" do
1044
- person.age = 'old'
1274
+ person.age = '42'
1045
1275
  expect(person.has_attribute_before_type_cast?(:age)).to be true
1046
1276
  end
1047
1277
  end
@@ -1052,7 +1282,7 @@ describe Mongoid::Attributes do
1052
1282
  context "when the attribute exists" do
1053
1283
 
1054
1284
  let(:person) do
1055
- Person.create(title: "Sir")
1285
+ Person.create!(title: "Sir")
1056
1286
  end
1057
1287
 
1058
1288
  before do
@@ -1070,7 +1300,7 @@ describe Mongoid::Attributes do
1070
1300
  context "when saving after the removal" do
1071
1301
 
1072
1302
  before do
1073
- person.save
1303
+ person.save!
1074
1304
  end
1075
1305
 
1076
1306
  it "persists the removal" do
@@ -1090,7 +1320,7 @@ describe Mongoid::Attributes do
1090
1320
  end
1091
1321
 
1092
1322
  before do
1093
- person.save
1323
+ person.save!
1094
1324
  person.pet.remove_attribute(:name)
1095
1325
  end
1096
1326
 
@@ -1105,7 +1335,7 @@ describe Mongoid::Attributes do
1105
1335
  context "when saving after the removal" do
1106
1336
 
1107
1337
  before do
1108
- person.save
1338
+ person.save!
1109
1339
  end
1110
1340
 
1111
1341
  it "persists the removal" do
@@ -1150,7 +1380,7 @@ describe Mongoid::Attributes do
1150
1380
  context 'when the database name is used' do
1151
1381
 
1152
1382
  let(:person) do
1153
- Person.create(at: Time.now)
1383
+ Person.create!(at: Time.now)
1154
1384
  end
1155
1385
 
1156
1386
  before do
@@ -1168,7 +1398,7 @@ describe Mongoid::Attributes do
1168
1398
  context "when saving after the removal" do
1169
1399
 
1170
1400
  before do
1171
- person.save
1401
+ person.save!
1172
1402
  end
1173
1403
 
1174
1404
  it "persists the removal" do
@@ -1180,7 +1410,7 @@ describe Mongoid::Attributes do
1180
1410
  context 'when the alias is used' do
1181
1411
 
1182
1412
  let(:person) do
1183
- Person.create(aliased_timestamp: Time.now)
1413
+ Person.create!(aliased_timestamp: Time.now)
1184
1414
  end
1185
1415
 
1186
1416
  before do
@@ -1198,7 +1428,7 @@ describe Mongoid::Attributes do
1198
1428
  context "when saving after the removal" do
1199
1429
 
1200
1430
  before do
1201
- person.save
1431
+ person.save!
1202
1432
  end
1203
1433
 
1204
1434
  it "persists the removal" do
@@ -1296,12 +1526,13 @@ describe Mongoid::Attributes do
1296
1526
  end
1297
1527
 
1298
1528
  context "when setting an attribute that needs type casting" do
1529
+
1299
1530
  let(:person) do
1300
- Person.new(age: "old")
1531
+ Person.new(age: "42")
1301
1532
  end
1302
1533
 
1303
1534
  it "should store the attribute before type cast" do
1304
- expect(person.age_before_type_cast).to eq("old")
1535
+ expect(person.age_before_type_cast).to eq("42")
1305
1536
  end
1306
1537
  end
1307
1538
 
@@ -1341,7 +1572,7 @@ describe Mongoid::Attributes do
1341
1572
  person.write_attribute(:test, "aliased field to test")
1342
1573
  end
1343
1574
 
1344
- it "allows the field name to be udpated" do
1575
+ it "allows the field name to be updated" do
1345
1576
  expect(person.t).to eq("aliased field to test")
1346
1577
  end
1347
1578
  end
@@ -1349,16 +1580,14 @@ describe Mongoid::Attributes do
1349
1580
  context "when attribute is a Hash" do
1350
1581
  let(:person) { Person.new map: { somekey: "somevalue" } }
1351
1582
 
1352
- it "raises an error when trying to set a value of invalid type - array" do
1353
- expect do
1354
- person.map = []
1355
- end.to raise_error(Mongoid::Errors::InvalidValue, /Value of type Array cannot be written to a field of type Hash/)
1583
+ it "writes nil when trying to set a value of invalid type - array" do
1584
+ person.map = []
1585
+ expect(person.map).to be_nil
1356
1586
  end
1357
1587
 
1358
- it "raises an error when trying to set a value of invalid type - boolean" do
1359
- expect do
1360
- person.map = false
1361
- end.to raise_error(Mongoid::Errors::InvalidValue, /Value of type FalseClass cannot be written to a field of type Hash/)
1588
+ it "writes nil when trying to set a value of invalid type - boolean" do
1589
+ person.map = false
1590
+ expect(person.map).to be_nil
1362
1591
  end
1363
1592
 
1364
1593
  it "can set a Hash value" do
@@ -1373,16 +1602,14 @@ describe Mongoid::Attributes do
1373
1602
  expect(person.aliases).to eq([ :alias_1 ])
1374
1603
  end
1375
1604
 
1376
- it "raises an error when trying to set a value of invalid type - hash" do
1377
- expect do
1378
- person.aliases = {}
1379
- end.to raise_error(Mongoid::Errors::InvalidValue, /Value of type Hash cannot be written to a field of type Array/)
1605
+ it "writes nil when trying to set a value of invalid type - hash" do
1606
+ person.aliases = {}
1607
+ expect(person.aliases).to be_nil
1380
1608
  end
1381
1609
 
1382
- it "raises an error when trying to set a value of invalid type - boolean" do
1383
- expect do
1384
- person.aliases = false
1385
- end.to raise_error(Mongoid::Errors::InvalidValue, /Value of type FalseClass cannot be written to a field of type Array/)
1610
+ it "writes nil when trying to set a value of invalid type - boolean" do
1611
+ person.aliases = false
1612
+ expect(person.aliases).to be_nil
1386
1613
  end
1387
1614
  end
1388
1615
 
@@ -1398,6 +1625,95 @@ describe Mongoid::Attributes do
1398
1625
  expect(dictionary.description).to eq('foo')
1399
1626
  end
1400
1627
  end
1628
+
1629
+ context 'when writing fields on a document with projection' do
1630
+
1631
+ let!(:person) do
1632
+ Person.create!(title: "sir")
1633
+ end
1634
+
1635
+ context "when excluding with only and the field was not excluded" do
1636
+
1637
+ let(:from_db) do
1638
+ Person.only(:_id).first
1639
+ end
1640
+
1641
+ it "raises an error" do
1642
+ expect {
1643
+ from_db.write_attribute(:undefined_field, 'x')
1644
+ }.to raise_error(ActiveModel::MissingAttributeError)
1645
+ end
1646
+ end
1647
+
1648
+ context "when excluding with without and the field was excluded" do
1649
+
1650
+ let(:from_db) do
1651
+ Person.without(:title).first
1652
+ end
1653
+
1654
+ it "raises an error" do
1655
+ expect {
1656
+ from_db.write_attribute(:title, 'x')
1657
+ }.to raise_error(ActiveModel::MissingAttributeError)
1658
+ end
1659
+ end
1660
+
1661
+ context "when excluding with without and the field was not excluded" do
1662
+
1663
+ let(:from_db) do
1664
+ Person.without(:title).first
1665
+ end
1666
+
1667
+ it "writes the value" do
1668
+ from_db.write_attribute(:undefined_field, 'x')
1669
+ from_db.read_attribute(:undefined_field).should == 'x'
1670
+ end
1671
+ end
1672
+ end
1673
+
1674
+ context "when comparing the object_ids of the written value" do
1675
+ config_override :legacy_attributes, false
1676
+
1677
+ before do
1678
+ Person.create!
1679
+ end
1680
+
1681
+ let(:person) do
1682
+ Person.first
1683
+ end
1684
+
1685
+ context "when the field is not resizable" do
1686
+ let(:test) do
1687
+ person.write_attribute(:test, "aliased field to test")
1688
+ end
1689
+
1690
+ it "has the same object_id as the attributes hash value" do
1691
+ expect(test.object_id).to eq(person.test.object_id)
1692
+ end
1693
+ end
1694
+
1695
+ context "when the field is resizable" do
1696
+
1697
+ let(:arrays) do
1698
+ person.write_attribute(:arrays, [])
1699
+ end
1700
+
1701
+ it "has the same object_id as the attributes hash value" do
1702
+ expect(arrays.object_id).to eq(person.arrays.object_id)
1703
+ end
1704
+ end
1705
+
1706
+ context "when the field is a HABTM foreign key array" do
1707
+
1708
+ let(:preference_ids) do
1709
+ person.write_attribute(:preference_ids, [])
1710
+ end
1711
+
1712
+ it "has the same object_id as the attributes hash value" do
1713
+ expect(preference_ids.object_id).to eq(person.preference_ids.object_id)
1714
+ end
1715
+ end
1716
+ end
1401
1717
  end
1402
1718
 
1403
1719
  describe "#typed_value_for" do
@@ -1578,11 +1894,11 @@ describe Mongoid::Attributes do
1578
1894
  end
1579
1895
 
1580
1896
  it "has 3 new entries" do
1581
- expect(pet.vet_visits.count).to eq(3)
1897
+ expect(pet.vet_visits.count).to eq 3
1582
1898
  end
1583
1899
 
1584
1900
  it "persists the changes" do
1585
- expect(pet.reload.vet_visits.count).to eq(3)
1901
+ expect(pet.reload.vet_visits.count).to eq 3
1586
1902
  end
1587
1903
  end
1588
1904
 
@@ -1651,6 +1967,61 @@ describe Mongoid::Attributes do
1651
1967
  end
1652
1968
  end
1653
1969
 
1970
+ describe '#unalias_attribute' do
1971
+ let(:shirt) { Shirt.new }
1972
+ let(:id) { '1234' }
1973
+
1974
+ context 'when creating object' do
1975
+ let(:shirt) { Shirt.new(id: id) }
1976
+
1977
+ it 'id and _id are not the same' do
1978
+ expect(shirt.id).to eq(id)
1979
+ expect(shirt._id).not_to eq(id)
1980
+ end
1981
+ end
1982
+
1983
+ context 'update' do
1984
+ before do
1985
+ shirt.update(id: id)
1986
+ end
1987
+
1988
+ it 'updates id but not_id' do
1989
+ expect(shirt.id).to eq(id)
1990
+ expect(shirt._id).not_to eq(id)
1991
+ end
1992
+ end
1993
+
1994
+ context 'id=' do
1995
+ before do
1996
+ shirt.id = id
1997
+ end
1998
+
1999
+ it 'sets id and not _id' do
2000
+ expect(shirt.id).to eq(id)
2001
+ expect(shirt._id).not_to eq(id)
2002
+ end
2003
+ end
2004
+
2005
+ context 'id?' do
2006
+ context 'with null id' do
2007
+ it 'returns false' do
2008
+ expect(shirt.id?).to be false
2009
+ expect(shirt._id?).to be true
2010
+ end
2011
+ end
2012
+
2013
+ context 'with id' do
2014
+ before do
2015
+ shirt.id = id
2016
+ end
2017
+
2018
+ it 'returns true' do
2019
+ expect(shirt.id?).to be true
2020
+ end
2021
+ end
2022
+ end
2023
+ end
2024
+
1654
2025
  describe "#alias_attribute" do
1655
2026
 
1656
2027
  let(:product) do
@@ -1697,8 +2068,8 @@ describe Mongoid::Attributes do
1697
2068
  end
1698
2069
 
1699
2070
  it "aliases *_before_type_cast" do
1700
- product.cost = "expensive"
1701
- expect(product.cost_before_type_cast).to eq("expensive")
2071
+ product.cost = "42"
2072
+ expect(product.cost_before_type_cast).to eq("42")
1702
2073
  end
1703
2074
  end
1704
2075
 
@@ -1742,7 +2113,7 @@ describe Mongoid::Attributes do
1742
2113
  context "when persisting nil attributes" do
1743
2114
 
1744
2115
  let!(:person) do
1745
- Person.create(score: nil)
2116
+ Person.create!(score: nil)
1746
2117
  end
1747
2118
 
1748
2119
  it "has an entry in the attributes" do
@@ -1757,7 +2128,7 @@ describe Mongoid::Attributes do
1757
2128
  end
1758
2129
 
1759
2130
  it "saves the default" do
1760
- expect { person.save }.to_not raise_error
2131
+ expect { person.save! }.to_not raise_error
1761
2132
  expect(person.last_drink_taken_at).to eq(1.day.ago.in_time_zone("Alaska").to_date)
1762
2133
  end
1763
2134
  end
@@ -1767,7 +2138,7 @@ describe Mongoid::Attributes do
1767
2138
  context "when no value exists in the database" do
1768
2139
 
1769
2140
  let(:person) do
1770
- Person.create
2141
+ Person.create!
1771
2142
  end
1772
2143
 
1773
2144
  it "applies the default value" do
@@ -1780,7 +2151,7 @@ describe Mongoid::Attributes do
1780
2151
  context "when the value is not nil" do
1781
2152
 
1782
2153
  let!(:person) do
1783
- Person.create(age: 50)
2154
+ Person.create!(age: 50)
1784
2155
  end
1785
2156
 
1786
2157
  let(:from_db) do
@@ -1795,7 +2166,7 @@ describe Mongoid::Attributes do
1795
2166
  context "when the value is explicitly nil" do
1796
2167
 
1797
2168
  let!(:person) do
1798
- Person.create(age: nil)
2169
+ Person.create!(age: nil)
1799
2170
  end
1800
2171
 
1801
2172
  let(:from_db) do
@@ -1810,7 +2181,7 @@ describe Mongoid::Attributes do
1810
2181
  context "when the default is a proc" do
1811
2182
 
1812
2183
  let!(:account) do
1813
- Account.create(name: "savings", balance: "100")
2184
+ Account.create!(name: "savings", balance: 100)
1814
2185
  end
1815
2186
 
1816
2187
  let(:from_db) do
@@ -1828,7 +2199,7 @@ describe Mongoid::Attributes do
1828
2199
 
1829
2200
  context 'when the attribute is blank' do
1830
2201
  let(:person) do
1831
- Person.create(title: '')
2202
+ Person.create!(title: '')
1832
2203
  end
1833
2204
 
1834
2205
  it 'returns false' do
@@ -1838,7 +2209,7 @@ describe Mongoid::Attributes do
1838
2209
 
1839
2210
  context 'when the attribute is localized' do
1840
2211
  let(:person) do
1841
- Person.create
2212
+ Person.create!
1842
2213
  end
1843
2214
 
1844
2215
  context 'after initialization when the field is nil' do
@@ -1870,7 +2241,7 @@ describe Mongoid::Attributes do
1870
2241
 
1871
2242
  context 'when the attribute is not localized' do
1872
2243
  let(:person) do
1873
- Person.create(username: 'localized')
2244
+ Person.create!(username: 'localized')
1874
2245
  end
1875
2246
 
1876
2247
  before do
@@ -1882,4 +2253,459 @@ describe Mongoid::Attributes do
1882
2253
  end
1883
2254
  end
1884
2255
  end
2256
+
2257
+ context "when an attribute is removed then set" do
2258
+ let(:cat) { Cat.create!(name: "Neil") }
2259
+
2260
+ before do
2261
+ cat.remove_attribute("name")
2262
+ cat.name = "Nissim"
2263
+ cat.save!
2264
+ cat.reload
2265
+ end
2266
+
2267
+ it "correctly sets the attribute" do
2268
+ expect(cat.name).to eq("Nissim")
2269
+ end
2270
+ end
2271
+
2272
+ describe "attributes after setting an association without reloading" do
2273
+
2274
+ context "on embeds_many" do
2275
+
2276
+ context "when not setting anything" do
2277
+ let(:doc) { NestedBook.create! }
2278
+
2279
+ it "doesn't add attributes" do
2280
+ expect(doc.attributes).to_not have_key("pages")
2281
+ end
2282
+
2283
+ it "has the same attributes after reloading" do
2284
+ expect(doc.attributes).to eq(doc.reload.attributes)
2285
+ end
2286
+ end
2287
+
2288
+ context "when using nested attributes" do
2289
+ let(:doc) { NestedBook.create! }
2290
+
2291
+ before do
2292
+ doc.update_attributes({ pages_attributes: [ {} ] })
2293
+ end
2294
+
2295
+ it "updates the attributes" do
2296
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2297
+ end
2298
+
2299
+ it "has the same attributes after reloading" do
2300
+ expect(doc.attributes).to eq(doc.reload.attributes)
2301
+ end
2302
+ end
2303
+
2304
+ context "when doing assignments" do
2305
+ let(:doc) { NestedBook.create! }
2306
+ before do
2307
+ doc.pages = [NestedPage.new]
2308
+ end
2309
+
2310
+ it "updates the attributes" do
2311
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2312
+ end
2313
+
2314
+ it "has the same attributes after reloading" do
2315
+ expect(doc.attributes).to eq(doc.reload.attributes)
2316
+ end
2317
+ end
2318
+
2319
+ context "when replacing assignments" do
2320
+ let(:doc) { NestedBook.create! }
2321
+ before do
2322
+ doc.pages = [NestedPage.new(number: 1)]
2323
+ doc.pages = [NestedPage.new(number: 2)]
2324
+ end
2325
+
2326
+ it "updates the attributes" do
2327
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id, "number" => 2 }])
2328
+ end
2329
+
2330
+ it "has the same attributes after reloading" do
2331
+ expect(doc.attributes).to eq(doc.reload.attributes)
2332
+ end
2333
+ end
2334
+
2335
+ context "when setting to nil" do
2336
+ let(:doc) { NestedBook.create! }
2337
+ before do
2338
+ doc.pages = [NestedPage.new(number: 1)]
2339
+ doc.pages = nil
2340
+ end
2341
+
2342
+ it "updates the attributes" do
2343
+ expect(doc.attributes).to_not have_key("pages")
2344
+ end
2345
+
2346
+ it "has the same attributes after reloading" do
2347
+ expect({ "pages" => [] }.merge(doc.attributes)).to eq(doc.reload.attributes)
2348
+ end
2349
+ end
2350
+
2351
+ context "when setting to nil and back" do
2352
+ let(:doc) { NestedBook.create! }
2353
+ let(:page) { NestedPage.new }
2354
+ before do
2355
+ doc.pages = [page]
2356
+ doc.pages = nil
2357
+ doc.pages = [page]
2358
+ end
2359
+
2360
+ it "updates the attributes" do
2361
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2362
+ end
2363
+
2364
+ it "has the same attributes after reloading" do
2365
+ expect(doc.attributes).to eq(doc.reload.attributes)
2366
+ end
2367
+ end
2368
+
2369
+ context "when pushing" do
2370
+ let(:doc) { NestedBook.create! }
2371
+ before do
2372
+ doc.pages << NestedPage.new
2373
+ end
2374
+
2375
+ it "updates the attributes" do
2376
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2377
+ end
2378
+
2379
+ it "has the same attributes after reloading" do
2380
+ expect(doc.attributes).to eq(doc.reload.attributes)
2381
+ end
2382
+ end
2383
+
2384
+ [:shift, :pop].each do |meth|
2385
+ context "when performing #{meth}" do
2386
+ let(:doc) { NestedBook.create! }
2387
+ before do
2388
+ doc.pages << NestedPage.new
2389
+ doc.pages << NestedPage.new
2390
+ doc.pages << NestedPage.new
2391
+
2392
+ doc.pages.send(meth, 2)
2393
+ end
2394
+
2395
+ it "updates the attributes" do
2396
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2397
+ end
2398
+
2399
+ it "has the same attributes after reloading" do
2400
+ expect(doc.attributes).to eq(doc.reload.attributes)
2401
+ end
2402
+ end
2403
+ end
2404
+
2405
+ context "when concatting" do
2406
+ let(:doc) { NestedBook.create! }
2407
+ before do
2408
+ doc.pages << NestedPage.new
2409
+ doc.pages.concat([NestedPage.new, NestedPage.new])
2410
+ end
2411
+
2412
+ it "updates the attributes" do
2413
+ expect(doc.attributes["pages"].count).to eq 3
2414
+ end
2415
+
2416
+ it "has the same attributes after reloading" do
2417
+ expect(doc.attributes).to eq(doc.reload.attributes)
2418
+ end
2419
+ end
2420
+
2421
+ [:build, :create].each do |meth|
2422
+ context "when preforming #{meth}" do
2423
+ let(:doc) { NestedBook.create! }
2424
+ before do
2425
+ doc.pages.send(meth)
2426
+ end
2427
+
2428
+ it "updates the attributes" do
2429
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2430
+ end
2431
+
2432
+ it "has the same attributes after reloading" do
2433
+ doc.pages.first.save
2434
+ expect(doc.attributes).to eq(doc.reload.attributes)
2435
+ end
2436
+ end
2437
+ end
2438
+
2439
+ context "when clearing" do
2440
+ let(:doc) { NestedBook.create! }
2441
+ before do
2442
+ doc.pages << NestedPage.new
2443
+ doc.pages << NestedPage.new
2444
+ doc.pages << NestedPage.new
2445
+
2446
+ doc.pages.clear
2447
+ end
2448
+
2449
+ it "updates the attributes" do
2450
+ expect(doc.attributes).to_not have_key("pages")
2451
+ end
2452
+
2453
+ it "has the same attributes after reloading" do
2454
+ expect(doc.attributes).to eq(doc.reload.attributes)
2455
+ end
2456
+ end
2457
+
2458
+ [:delete_all, :destroy_all, :remove_all].each do |meth|
2459
+ context "when performing: #{meth}" do
2460
+ let(:doc) { NestedBook.create! }
2461
+ before do
2462
+ doc.pages << NestedPage.new
2463
+ doc.pages << NestedPage.new
2464
+ doc.pages << NestedPage.new
2465
+
2466
+ doc.pages.send(meth)
2467
+ end
2468
+
2469
+ it "updates the attributes" do
2470
+ expect(doc.attributes).to_not have_key("pages")
2471
+ end
2472
+
2473
+ it "has the same attributes after reloading" do
2474
+ expect({ "pages" => [] }.merge(doc.attributes)).to eq(doc.reload.attributes)
2475
+ end
2476
+ end
2477
+ end
2478
+
2479
+ context "when deleting" do
2480
+ let(:doc) { NestedBook.create! }
2481
+ let(:page) { NestedPage.new }
2482
+ before do
2483
+ doc.pages << page
2484
+ doc.pages << NestedPage.new
2485
+ doc.pages << NestedPage.new
2486
+
2487
+ doc.pages.delete(page)
2488
+ end
2489
+
2490
+ it "updates the attributes" do
2491
+ expect(doc.attributes["pages"].count).to eq 2
2492
+ end
2493
+
2494
+ it "has the same attributes after reloading" do
2495
+ expect(doc.attributes).to eq(doc.reload.attributes)
2496
+ end
2497
+ end
2498
+
2499
+ context "when doing _remove" do
2500
+ let(:doc) { NestedBook.create! }
2501
+ let(:page) { NestedPage.new }
2502
+ before do
2503
+ doc.pages << page
2504
+ doc.pages << NestedPage.new
2505
+ doc.pages << NestedPage.new
2506
+
2507
+ doc.pages._remove(page)
2508
+ end
2509
+
2510
+ it "updates the attributes" do
2511
+ expect(doc.attributes["pages"].count).to eq 2
2512
+ end
2513
+ end
2514
+
2515
+ context "when assigning an array of hashes" do
2516
+ let(:doc) { NestedBook.create! }
2517
+ before do
2518
+ doc.pages = [{}]
2519
+ end
2520
+
2521
+ it "updates the attributes" do
2522
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2523
+ end
2524
+
2525
+ it "has the same attributes after reloading" do
2526
+ expect(doc.attributes).to eq(doc.reload.attributes)
2527
+ end
2528
+ end
2529
+
2530
+ context "when assigning twice" do
2531
+ let(:doc) { NestedBook.create! }
2532
+ before do
2533
+ doc.pages = [{ number: 1 }]
2534
+ doc.pages = [{}]
2535
+ end
2536
+
2537
+ it "updates the attributes" do
2538
+ expect(doc.attributes["pages"]).to eq([{ "_id" => doc.pages.first.id }])
2539
+ end
2540
+
2541
+ it "has the same attributes after reloading" do
2542
+ expect(doc.attributes).to eq(doc.reload.attributes)
2543
+ end
2544
+ end
2545
+ end
2546
+
2547
+ context "on embeds_one" do
2548
+
2549
+ let(:attrs) { { "title" => "Title" } }
2550
+
2551
+ context "when using nested attributes" do
2552
+ let(:doc) { NestedBook.create! }
2553
+
2554
+ before do
2555
+ doc.update_attributes({ cover_attributes: attrs })
2556
+ end
2557
+
2558
+ it "updates the attributes" do
2559
+ expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
2560
+ end
2561
+
2562
+ it "has the same attributes after reloading" do
2563
+ expect(doc.attributes).to eq(doc.reload.attributes)
2564
+ end
2565
+ end
2566
+
2567
+ context "when doing assignments" do
2568
+ let(:doc) { NestedBook.create! }
2569
+ before do
2570
+ doc.cover = NestedCover.new(attrs)
2571
+ end
2572
+
2573
+ it "updates the attributes" do
2574
+ expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
2575
+ end
2576
+
2577
+ it "has the same attributes after reloading" do
2578
+ expect(doc.attributes).to eq(doc.reload.attributes)
2579
+ end
2580
+ end
2581
+
2582
+ context "when replacing assignments" do
2583
+ let(:doc) { NestedBook.create! }
2584
+ before do
2585
+ doc.cover = NestedCover.new("title" => "Title1")
2586
+ doc.cover = NestedCover.new(attrs)
2587
+ end
2588
+
2589
+ it "updates the attributes" do
2590
+ expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
2591
+ end
2592
+
2593
+ it "has the same attributes after reloading" do
2594
+ expect(doc.attributes).to eq(doc.reload.attributes)
2595
+ end
2596
+ end
2597
+
2598
+ context "when setting to nil" do
2599
+ let(:doc) { NestedBook.create! }
2600
+ before do
2601
+ doc.cover = NestedCover.new(attrs)
2602
+ doc.cover = nil
2603
+ end
2604
+
2605
+ it "updates the attributes" do
2606
+ expect(doc.attributes.key?("cover")).to be false
2607
+ end
2608
+
2609
+ it "has the same attributes after reloading" do
2610
+ expect(doc.attributes).to eq(doc.reload.attributes)
2611
+ end
2612
+ end
2613
+
2614
+ context "when setting to nil and back" do
2615
+ let(:doc) { NestedBook.create! }
2616
+ before do
2617
+ doc.cover = NestedCover.new(attrs)
2618
+ doc.cover = nil
2619
+ doc.cover = NestedCover.new(attrs)
2620
+ end
2621
+
2622
+ it "updates the attributes" do
2623
+ expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
2624
+ end
2625
+
2626
+
2627
+ it "has the same attributes after reloading" do
2628
+ expect(doc.attributes).to eq(doc.reload.attributes)
2629
+ end
2630
+ end
2631
+
2632
+ [:build, :create].each do |meth|
2633
+ context "when preforming #{meth}" do
2634
+ let(:doc) { NestedBook.create! }
2635
+ before do
2636
+ doc.send("#{meth}_cover", attrs)
2637
+ end
2638
+
2639
+ it "updates the attributes" do
2640
+ expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
2641
+ end
2642
+
2643
+ it "has the same attributes after reloading" do
2644
+ doc.cover.save
2645
+ expect(doc.attributes).to eq(doc.reload.attributes)
2646
+ end
2647
+ end
2648
+ end
2649
+
2650
+ context "when assigning a hash" do
2651
+ let(:doc) { NestedBook.create! }
2652
+ before do
2653
+ doc.cover = attrs
2654
+ end
2655
+
2656
+ it "updates the attributes" do
2657
+ expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
2658
+ end
2659
+
2660
+ it "has the same attributes after reloading" do
2661
+ expect(doc.attributes).to eq(doc.reload.attributes)
2662
+ end
2663
+ end
2664
+
2665
+ context "when assigning twice" do
2666
+ let(:doc) { NestedBook.create! }
2667
+ before do
2668
+ doc.cover = { "title" => "1984" }
2669
+ doc.cover = attrs
2670
+ end
2671
+
2672
+ it "updates the attributes" do
2673
+ expect(doc.attributes["cover"]).to eq(attrs.merge("_id" => doc.cover.id))
2674
+ end
2675
+
2676
+ it "has the same attributes after reloading" do
2677
+ expect(doc.attributes).to eq(doc.reload.attributes)
2678
+ end
2679
+ end
2680
+ end
2681
+ end
2682
+
2683
+ context "when modifiying a hash referenced with the [] notation" do
2684
+ let(:church) { Church.create!(location: { x: 1 }) }
2685
+
2686
+ before do
2687
+ church[:location].merge!(y: 2)
2688
+ church.save!
2689
+ church.reload
2690
+ end
2691
+
2692
+ it "persists the updated hash" do
2693
+ church.location.should == { "x" => 1, "y" => 2 }
2694
+ end
2695
+ end
2696
+
2697
+ context "when modifiying a set referenced with the [] notation" do
2698
+ let(:catalog) { Catalog.create!(set_field: [ 1 ].to_set) }
2699
+
2700
+ before do
2701
+ catalog[:set_field] << 2
2702
+ catalog.save!
2703
+ catalog.reload
2704
+ end
2705
+
2706
+ it "persists the updated hash" do
2707
+ pending "MONGOID-2951"
2708
+ catalog.set_field.should == Set.new([ 1, 2 ])
2709
+ end
2710
+ end
1885
2711
  end