mongoid 7.0.2 → 8.1.1

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 (1104) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +33 -33
  4. data/LICENSE +1 -0
  5. data/README.md +34 -20
  6. data/Rakefile +100 -5
  7. data/lib/config/locales/en.yml +220 -105
  8. data/lib/mongoid/association/accessors.rb +176 -84
  9. data/lib/mongoid/association/bindable.rb +57 -28
  10. data/lib/mongoid/association/builders.rb +9 -15
  11. data/lib/mongoid/association/constrainable.rb +5 -7
  12. data/lib/mongoid/association/depending.rb +9 -18
  13. data/lib/mongoid/association/eager_loadable.rb +31 -10
  14. data/lib/mongoid/association/embedded/batchable.rb +68 -54
  15. data/lib/mongoid/association/embedded/cyclic.rb +10 -17
  16. data/lib/mongoid/association/embedded/embedded_in/binding.rb +27 -9
  17. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +9 -6
  18. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +16 -25
  19. data/lib/mongoid/association/embedded/embedded_in.rb +9 -28
  20. data/lib/mongoid/association/embedded/embeds_many/binding.rb +5 -8
  21. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +10 -6
  22. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +156 -135
  23. data/lib/mongoid/association/embedded/embeds_many.rb +10 -37
  24. data/lib/mongoid/association/embedded/embeds_one/binding.rb +4 -8
  25. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +27 -10
  26. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +64 -30
  27. data/lib/mongoid/association/embedded/embeds_one.rb +11 -34
  28. data/lib/mongoid/association/embedded.rb +2 -0
  29. data/lib/mongoid/association/macros.rb +65 -41
  30. data/lib/mongoid/association/many.rb +25 -35
  31. data/lib/mongoid/association/marshalable.rb +3 -6
  32. data/lib/mongoid/association/nested/many.rb +22 -30
  33. data/lib/mongoid/association/nested/nested_buildable.rb +9 -15
  34. data/lib/mongoid/association/nested/one.rb +57 -30
  35. data/lib/mongoid/association/nested.rb +3 -3
  36. data/lib/mongoid/association/one.rb +5 -12
  37. data/lib/mongoid/association/options.rb +16 -46
  38. data/lib/mongoid/association/proxy.rb +52 -40
  39. data/lib/mongoid/association/referenced/auto_save.rb +9 -14
  40. data/lib/mongoid/association/referenced/belongs_to/binding.rb +5 -9
  41. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +11 -9
  42. data/lib/mongoid/association/referenced/belongs_to/eager.rb +40 -3
  43. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +19 -31
  44. data/lib/mongoid/association/referenced/belongs_to.rb +16 -38
  45. data/lib/mongoid/association/referenced/counter_cache.rb +14 -25
  46. data/lib/mongoid/association/referenced/eager.rb +42 -38
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +12 -11
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +5 -5
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +2 -1
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +106 -67
  51. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +29 -46
  52. data/lib/mongoid/association/referenced/has_many/binding.rb +3 -6
  53. data/lib/mongoid/association/referenced/has_many/buildable.rb +5 -5
  54. data/lib/mongoid/association/referenced/has_many/eager.rb +2 -1
  55. data/lib/mongoid/association/referenced/has_many/enumerable.rb +440 -456
  56. data/lib/mongoid/association/referenced/has_many/proxy.rb +104 -127
  57. data/lib/mongoid/association/referenced/has_many.rb +21 -45
  58. data/lib/mongoid/association/referenced/has_one/binding.rb +4 -9
  59. data/lib/mongoid/association/referenced/has_one/buildable.rb +20 -6
  60. data/lib/mongoid/association/referenced/has_one/eager.rb +2 -1
  61. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +16 -29
  62. data/lib/mongoid/association/referenced/has_one/proxy.rb +25 -30
  63. data/lib/mongoid/association/referenced/has_one.rb +16 -36
  64. data/lib/mongoid/association/referenced/syncable.rb +11 -26
  65. data/lib/mongoid/association/referenced.rb +2 -0
  66. data/lib/mongoid/association/reflections.rb +7 -6
  67. data/lib/mongoid/association/relatable.rb +149 -89
  68. data/lib/mongoid/association.rb +13 -27
  69. data/lib/mongoid/atomic/modifiers.rb +29 -53
  70. data/lib/mongoid/atomic/paths/embedded/many.rb +23 -7
  71. data/lib/mongoid/atomic/paths/embedded/one.rb +4 -7
  72. data/lib/mongoid/atomic/paths/embedded.rb +3 -4
  73. data/lib/mongoid/atomic/paths/root.rb +4 -7
  74. data/lib/mongoid/atomic/paths.rb +2 -1
  75. data/lib/mongoid/atomic.rb +49 -47
  76. data/lib/mongoid/attributes/dynamic.rb +22 -36
  77. data/lib/mongoid/attributes/nested.rb +12 -15
  78. data/lib/mongoid/attributes/processing.rb +19 -27
  79. data/lib/mongoid/attributes/projector.rb +119 -0
  80. data/lib/mongoid/attributes/readonly.rb +6 -9
  81. data/lib/mongoid/attributes.rb +103 -100
  82. data/lib/mongoid/cacheable.rb +7 -10
  83. data/lib/mongoid/changeable.rb +152 -73
  84. data/lib/mongoid/clients/factory.rb +42 -17
  85. data/lib/mongoid/clients/options.rb +21 -18
  86. data/lib/mongoid/clients/sessions.rb +10 -10
  87. data/lib/mongoid/clients/storage_options.rb +9 -17
  88. data/lib/mongoid/clients/validators/storage.rb +5 -24
  89. data/lib/mongoid/clients/validators.rb +2 -1
  90. data/lib/mongoid/clients.rb +3 -10
  91. data/lib/mongoid/collection_configurable.rb +58 -0
  92. data/lib/mongoid/composable.rb +7 -9
  93. data/lib/mongoid/config/defaults.rb +60 -0
  94. data/lib/mongoid/config/environment.rb +51 -13
  95. data/lib/mongoid/config/options.rb +20 -23
  96. data/lib/mongoid/config/validators/async_query_executor.rb +24 -0
  97. data/lib/mongoid/config/validators/client.rb +8 -23
  98. data/lib/mongoid/config/validators/option.rb +2 -3
  99. data/lib/mongoid/config/validators.rb +3 -1
  100. data/lib/mongoid/config.rb +235 -48
  101. data/lib/mongoid/contextual/aggregable/memory.rb +40 -27
  102. data/lib/mongoid/contextual/aggregable/mongo.rb +32 -33
  103. data/lib/mongoid/contextual/aggregable/none.rb +65 -0
  104. data/lib/mongoid/contextual/aggregable.rb +17 -0
  105. data/lib/mongoid/contextual/atomic.rb +29 -31
  106. data/lib/mongoid/contextual/command.rb +2 -5
  107. data/lib/mongoid/contextual/geo_near.rb +13 -44
  108. data/lib/mongoid/contextual/map_reduce.rb +7 -35
  109. data/lib/mongoid/contextual/memory.rb +387 -81
  110. data/lib/mongoid/contextual/mongo/documents_loader.rb +177 -0
  111. data/lib/mongoid/contextual/mongo.rb +641 -283
  112. data/lib/mongoid/contextual/none.rb +264 -31
  113. data/lib/mongoid/contextual/queryable.rb +3 -4
  114. data/lib/mongoid/contextual.rb +21 -11
  115. data/lib/mongoid/copyable.rb +46 -17
  116. data/lib/mongoid/criteria/findable.rb +20 -20
  117. data/lib/mongoid/criteria/includable.rb +32 -34
  118. data/lib/mongoid/criteria/inspectable.rb +2 -3
  119. data/lib/mongoid/criteria/marshalable.rb +12 -7
  120. data/lib/mongoid/criteria/modifiable.rb +15 -21
  121. data/lib/mongoid/criteria/options.rb +4 -5
  122. data/lib/mongoid/criteria/permission.rb +3 -2
  123. data/lib/mongoid/criteria/queryable/aggregable.rb +4 -15
  124. data/lib/mongoid/criteria/queryable/expandable.rb +68 -0
  125. data/lib/mongoid/criteria/queryable/extensions/array.rb +7 -41
  126. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +28 -8
  127. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +5 -6
  128. data/lib/mongoid/criteria/queryable/extensions/date.rb +9 -9
  129. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +11 -12
  130. data/lib/mongoid/criteria/queryable/extensions/hash.rb +4 -41
  131. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +3 -14
  132. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +4 -21
  133. data/lib/mongoid/criteria/queryable/extensions/object.rb +6 -30
  134. data/lib/mongoid/criteria/queryable/extensions/range.rb +49 -17
  135. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +12 -19
  136. data/lib/mongoid/criteria/queryable/extensions/set.rb +4 -5
  137. data/lib/mongoid/criteria/queryable/extensions/string.rb +7 -32
  138. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +7 -22
  139. data/lib/mongoid/criteria/queryable/extensions/time.rb +10 -10
  140. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +19 -7
  141. data/lib/mongoid/criteria/queryable/extensions.rb +1 -4
  142. data/lib/mongoid/criteria/queryable/key.rb +105 -31
  143. data/lib/mongoid/criteria/queryable/macroable.rb +3 -4
  144. data/lib/mongoid/criteria/queryable/mergeable.rb +205 -44
  145. data/lib/mongoid/criteria/queryable/optional.rb +16 -65
  146. data/lib/mongoid/criteria/queryable/options.rb +4 -21
  147. data/lib/mongoid/criteria/queryable/pipeline.rb +5 -15
  148. data/lib/mongoid/criteria/queryable/selectable.rb +471 -168
  149. data/lib/mongoid/criteria/queryable/selector.rb +133 -58
  150. data/lib/mongoid/criteria/queryable/smash.rb +42 -18
  151. data/lib/mongoid/criteria/queryable/storable.rb +237 -0
  152. data/lib/mongoid/criteria/queryable.rb +18 -15
  153. data/lib/mongoid/criteria/scopable.rb +29 -21
  154. data/lib/mongoid/criteria/translator.rb +45 -0
  155. data/lib/mongoid/criteria.rb +106 -111
  156. data/lib/mongoid/deprecable.rb +36 -0
  157. data/lib/mongoid/deprecation.rb +25 -0
  158. data/lib/mongoid/document.rb +162 -103
  159. data/lib/mongoid/equality.rb +35 -18
  160. data/lib/mongoid/errors/ambiguous_relationship.rb +4 -5
  161. data/lib/mongoid/errors/callback.rb +2 -3
  162. data/lib/mongoid/errors/create_collection_failure.rb +33 -0
  163. data/lib/mongoid/errors/criteria_argument_required.rb +18 -0
  164. data/lib/mongoid/errors/delete_restriction.rb +10 -13
  165. data/lib/mongoid/errors/document_not_destroyed.rb +4 -7
  166. data/lib/mongoid/errors/document_not_found.rb +35 -21
  167. data/lib/mongoid/errors/drop_collection_failure.rb +27 -0
  168. data/lib/mongoid/errors/empty_config_file.rb +25 -0
  169. data/lib/mongoid/errors/immutable_attribute.rb +26 -0
  170. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +2 -3
  171. data/lib/mongoid/errors/invalid_async_query_executor.rb +25 -0
  172. data/lib/mongoid/errors/invalid_collection.rb +2 -1
  173. data/lib/mongoid/errors/invalid_config_file.rb +25 -0
  174. data/lib/mongoid/errors/invalid_config_option.rb +3 -4
  175. data/lib/mongoid/errors/invalid_dependent_strategy.rb +3 -4
  176. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +24 -0
  177. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  178. data/lib/mongoid/errors/invalid_elem_match_operator.rb +32 -0
  179. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +25 -0
  180. data/lib/mongoid/errors/invalid_expression_operator.rb +27 -0
  181. data/lib/mongoid/errors/invalid_field.rb +8 -7
  182. data/lib/mongoid/errors/invalid_field_operator.rb +32 -0
  183. data/lib/mongoid/errors/invalid_field_option.rb +2 -3
  184. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  185. data/lib/mongoid/errors/invalid_find.rb +2 -3
  186. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +22 -0
  187. data/lib/mongoid/errors/invalid_includes.rb +2 -3
  188. data/lib/mongoid/errors/invalid_index.rb +2 -3
  189. data/lib/mongoid/errors/invalid_options.rb +4 -5
  190. data/lib/mongoid/errors/invalid_path.rb +2 -3
  191. data/lib/mongoid/errors/invalid_persistence_option.rb +2 -5
  192. data/lib/mongoid/errors/invalid_query.rb +40 -0
  193. data/lib/mongoid/errors/invalid_relation.rb +5 -10
  194. data/lib/mongoid/errors/invalid_relation_option.rb +4 -5
  195. data/lib/mongoid/errors/invalid_scope.rb +2 -3
  196. data/lib/mongoid/errors/invalid_session_use.rb +3 -6
  197. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +6 -5
  198. data/lib/mongoid/errors/invalid_storage_options.rb +3 -4
  199. data/lib/mongoid/errors/invalid_storage_parent.rb +4 -3
  200. data/lib/mongoid/errors/invalid_time.rb +2 -3
  201. data/lib/mongoid/errors/inverse_not_found.rb +3 -4
  202. data/lib/mongoid/errors/mixed_client_configuration.rb +2 -3
  203. data/lib/mongoid/errors/mixed_relations.rb +2 -3
  204. data/lib/mongoid/errors/mongoid_error.rb +6 -13
  205. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +3 -4
  206. data/lib/mongoid/errors/no_client_config.rb +4 -5
  207. data/lib/mongoid/errors/no_client_database.rb +3 -4
  208. data/lib/mongoid/errors/no_client_hosts.rb +3 -4
  209. data/lib/mongoid/errors/no_clients_config.rb +2 -3
  210. data/lib/mongoid/errors/no_default_client.rb +3 -4
  211. data/lib/mongoid/errors/no_environment.rb +2 -3
  212. data/lib/mongoid/errors/no_map_reduce_output.rb +2 -3
  213. data/lib/mongoid/errors/no_metadata.rb +2 -3
  214. data/lib/mongoid/errors/no_parent.rb +2 -3
  215. data/lib/mongoid/errors/readonly_attribute.rb +3 -4
  216. data/lib/mongoid/errors/readonly_document.rb +3 -6
  217. data/lib/mongoid/errors/scope_overwrite.rb +2 -1
  218. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +3 -1
  219. data/lib/mongoid/errors/unknown_attribute.rb +3 -4
  220. data/lib/mongoid/errors/unknown_model.rb +2 -3
  221. data/lib/mongoid/errors/unsaved_document.rb +3 -2
  222. data/lib/mongoid/errors/unsupported_javascript.rb +2 -3
  223. data/lib/mongoid/errors/validations.rb +2 -1
  224. data/lib/mongoid/errors.rb +18 -4
  225. data/lib/mongoid/evolvable.rb +4 -5
  226. data/lib/mongoid/extensions/array.rb +37 -44
  227. data/lib/mongoid/extensions/big_decimal.rb +35 -21
  228. data/lib/mongoid/extensions/binary.rb +42 -0
  229. data/lib/mongoid/extensions/boolean.rb +10 -6
  230. data/lib/mongoid/extensions/date.rb +32 -25
  231. data/lib/mongoid/extensions/date_time.rb +5 -13
  232. data/lib/mongoid/extensions/decimal128.rb +2 -5
  233. data/lib/mongoid/extensions/false_class.rb +5 -8
  234. data/lib/mongoid/extensions/float.rb +12 -14
  235. data/lib/mongoid/extensions/hash.rb +64 -42
  236. data/lib/mongoid/extensions/integer.rb +12 -16
  237. data/lib/mongoid/extensions/module.rb +3 -4
  238. data/lib/mongoid/extensions/nil_class.rb +2 -5
  239. data/lib/mongoid/extensions/object.rb +27 -52
  240. data/lib/mongoid/extensions/object_id.rb +2 -7
  241. data/lib/mongoid/extensions/range.rb +42 -20
  242. data/lib/mongoid/extensions/regexp.rb +14 -7
  243. data/lib/mongoid/extensions/set.rb +13 -11
  244. data/lib/mongoid/extensions/string.rb +35 -64
  245. data/lib/mongoid/extensions/symbol.rb +6 -22
  246. data/lib/mongoid/extensions/time.rb +38 -22
  247. data/lib/mongoid/extensions/time_with_zone.rb +26 -9
  248. data/lib/mongoid/extensions/true_class.rb +5 -8
  249. data/lib/mongoid/extensions.rb +19 -3
  250. data/lib/mongoid/factory.rb +104 -17
  251. data/lib/mongoid/fields/foreign_key.rb +14 -26
  252. data/lib/mongoid/fields/localized.rb +21 -15
  253. data/lib/mongoid/fields/standard.rb +23 -43
  254. data/lib/mongoid/fields/validators/macro.rb +32 -20
  255. data/lib/mongoid/fields/validators.rb +2 -1
  256. data/lib/mongoid/fields.rb +349 -76
  257. data/lib/mongoid/findable.rb +115 -34
  258. data/lib/mongoid/indexable/specification.rb +5 -18
  259. data/lib/mongoid/indexable/validators/options.rb +8 -9
  260. data/lib/mongoid/indexable.rb +6 -21
  261. data/lib/mongoid/inspectable.rb +4 -11
  262. data/lib/mongoid/interceptable.rb +85 -41
  263. data/lib/mongoid/loggable.rb +13 -16
  264. data/lib/mongoid/matchable.rb +4 -154
  265. data/lib/mongoid/matcher/all.rb +22 -0
  266. data/lib/mongoid/matcher/and.rb +21 -0
  267. data/lib/mongoid/matcher/bits.rb +41 -0
  268. data/lib/mongoid/matcher/bits_all_clear.rb +20 -0
  269. data/lib/mongoid/matcher/bits_all_set.rb +20 -0
  270. data/lib/mongoid/matcher/bits_any_clear.rb +20 -0
  271. data/lib/mongoid/matcher/bits_any_set.rb +20 -0
  272. data/lib/mongoid/matcher/elem_match.rb +36 -0
  273. data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
  274. data/lib/mongoid/matcher/eq.rb +11 -0
  275. data/lib/mongoid/matcher/eq_impl.rb +67 -0
  276. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +26 -0
  277. data/lib/mongoid/matcher/exists.rb +15 -0
  278. data/lib/mongoid/matcher/expression.rb +35 -0
  279. data/lib/mongoid/matcher/expression_operator.rb +19 -0
  280. data/lib/mongoid/matcher/field_expression.rb +62 -0
  281. data/lib/mongoid/matcher/field_operator.rb +54 -0
  282. data/lib/mongoid/matcher/gt.rb +17 -0
  283. data/lib/mongoid/matcher/gte.rb +17 -0
  284. data/lib/mongoid/matcher/in.rb +25 -0
  285. data/lib/mongoid/matcher/lt.rb +17 -0
  286. data/lib/mongoid/matcher/lte.rb +17 -0
  287. data/lib/mongoid/matcher/mod.rb +17 -0
  288. data/lib/mongoid/matcher/ne.rb +16 -0
  289. data/lib/mongoid/matcher/nin.rb +11 -0
  290. data/lib/mongoid/matcher/nor.rb +25 -0
  291. data/lib/mongoid/matcher/not.rb +29 -0
  292. data/lib/mongoid/matcher/or.rb +21 -0
  293. data/lib/mongoid/matcher/regex.rb +41 -0
  294. data/lib/mongoid/matcher/size.rb +26 -0
  295. data/lib/mongoid/matcher/type.rb +99 -0
  296. data/lib/mongoid/matcher.rb +130 -0
  297. data/lib/mongoid/persistable/creatable.rb +23 -30
  298. data/lib/mongoid/persistable/deletable.rb +7 -23
  299. data/lib/mongoid/persistable/destroyable.rb +12 -11
  300. data/lib/mongoid/persistable/incrementable.rb +6 -7
  301. data/lib/mongoid/persistable/logical.rb +4 -6
  302. data/lib/mongoid/persistable/poppable.rb +3 -6
  303. data/lib/mongoid/persistable/pullable.rb +3 -8
  304. data/lib/mongoid/persistable/pushable.rb +14 -10
  305. data/lib/mongoid/persistable/renamable.rb +10 -8
  306. data/lib/mongoid/persistable/savable.rb +16 -9
  307. data/lib/mongoid/persistable/settable.rb +3 -6
  308. data/lib/mongoid/persistable/unsettable.rb +10 -10
  309. data/lib/mongoid/persistable/updatable.rb +99 -30
  310. data/lib/mongoid/persistable/upsertable.rb +23 -9
  311. data/lib/mongoid/persistable.rb +138 -40
  312. data/lib/mongoid/persistence_context.rb +107 -52
  313. data/lib/mongoid/positional.rb +3 -6
  314. data/lib/mongoid/query_cache.rb +18 -234
  315. data/lib/mongoid/railtie.rb +20 -16
  316. data/lib/mongoid/railties/controller_runtime.rb +88 -0
  317. data/lib/mongoid/railties/database.rake +16 -2
  318. data/lib/mongoid/reloadable.rb +19 -22
  319. data/lib/mongoid/scopable.rb +37 -60
  320. data/lib/mongoid/selectable.rb +8 -18
  321. data/lib/mongoid/serializable.rb +33 -34
  322. data/lib/mongoid/shardable.rb +108 -21
  323. data/lib/mongoid/stateful.rb +60 -20
  324. data/lib/mongoid/stringified_symbol.rb +52 -0
  325. data/lib/mongoid/tasks/database.rake +24 -5
  326. data/lib/mongoid/tasks/database.rb +105 -7
  327. data/lib/mongoid/threaded/lifecycle.rb +7 -26
  328. data/lib/mongoid/threaded.rb +80 -67
  329. data/lib/mongoid/timestamps/created/short.rb +2 -1
  330. data/lib/mongoid/timestamps/created.rb +4 -3
  331. data/lib/mongoid/timestamps/short.rb +2 -1
  332. data/lib/mongoid/timestamps/timeless.rb +6 -9
  333. data/lib/mongoid/timestamps/updated/short.rb +2 -1
  334. data/lib/mongoid/timestamps/updated.rb +5 -6
  335. data/lib/mongoid/timestamps.rb +3 -2
  336. data/lib/mongoid/touchable.rb +54 -25
  337. data/lib/mongoid/traversable.rb +185 -61
  338. data/lib/mongoid/utils.rb +22 -0
  339. data/lib/mongoid/validatable/associated.rb +5 -6
  340. data/lib/mongoid/validatable/format.rb +2 -1
  341. data/lib/mongoid/validatable/length.rb +2 -1
  342. data/lib/mongoid/validatable/localizable.rb +3 -4
  343. data/lib/mongoid/validatable/macros.rb +8 -15
  344. data/lib/mongoid/validatable/presence.rb +10 -15
  345. data/lib/mongoid/validatable/queryable.rb +2 -3
  346. data/lib/mongoid/validatable/uniqueness.rb +30 -42
  347. data/lib/mongoid/validatable.rb +16 -32
  348. data/lib/mongoid/version.rb +3 -2
  349. data/lib/mongoid/warnings.rb +44 -0
  350. data/lib/mongoid.rb +50 -17
  351. data/lib/rails/generators/mongoid/config/config_generator.rb +10 -2
  352. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +53 -32
  353. data/lib/rails/generators/mongoid/model/model_generator.rb +3 -2
  354. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
  355. data/lib/rails/generators/mongoid_generator.rb +2 -1
  356. data/lib/rails/mongoid.rb +4 -5
  357. data/spec/README.md +33 -0
  358. data/spec/config/mongoid.yml +29 -3
  359. data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
  360. data/spec/integration/app_spec.rb +345 -0
  361. data/spec/integration/associations/belongs_to_spec.rb +33 -0
  362. data/spec/integration/associations/embedded_dirty_spec.rb +57 -0
  363. data/spec/integration/associations/embedded_spec.rb +283 -0
  364. data/spec/integration/associations/embeds_many_spec.rb +219 -0
  365. data/spec/integration/associations/embeds_one_spec.rb +41 -0
  366. data/spec/integration/associations/foreign_key_spec.rb +107 -0
  367. data/spec/integration/associations/foreign_key_spec_models.rb +64 -0
  368. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  369. data/spec/integration/associations/has_many_spec.rb +128 -0
  370. data/spec/integration/associations/has_one_spec.rb +272 -0
  371. data/spec/integration/associations/nested_attributes_assignment_spec.rb +115 -0
  372. data/spec/integration/associations/reverse_population_spec.rb +34 -0
  373. data/spec/integration/associations/reverse_population_spec_models.rb +36 -0
  374. data/spec/integration/associations/scope_option_spec.rb +101 -0
  375. data/spec/integration/atomic/modifiers_spec.rb +116 -0
  376. data/spec/integration/bson_regexp_raw_spec.rb +19 -0
  377. data/spec/integration/callbacks_models.rb +192 -0
  378. data/spec/integration/callbacks_spec.rb +584 -0
  379. data/spec/integration/contextual/empty_spec.rb +141 -0
  380. data/spec/integration/criteria/alias_query_spec.rb +161 -0
  381. data/spec/integration/criteria/date_field_spec.rb +40 -0
  382. data/spec/integration/criteria/default_scope_spec.rb +72 -0
  383. data/spec/integration/criteria/logical_spec.rb +124 -0
  384. data/spec/integration/criteria/range_spec.rb +359 -0
  385. data/spec/integration/criteria/time_with_zone_spec.rb +142 -0
  386. data/spec/integration/discriminator_key_spec.rb +391 -0
  387. data/spec/integration/discriminator_value_spec.rb +206 -0
  388. data/spec/integration/document_spec.rb +51 -0
  389. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  390. data/spec/integration/i18n_fallbacks_spec.rb +74 -0
  391. data/spec/integration/matcher_examples_spec.rb +765 -0
  392. data/spec/integration/matcher_operator_data/all.yml +140 -0
  393. data/spec/integration/matcher_operator_data/and.yml +93 -0
  394. data/spec/integration/matcher_operator_data/bits_all_clear.yml +159 -0
  395. data/spec/integration/matcher_operator_data/bits_all_set.yml +159 -0
  396. data/spec/integration/matcher_operator_data/bits_any_clear.yml +159 -0
  397. data/spec/integration/matcher_operator_data/bits_any_set.yml +159 -0
  398. data/spec/integration/matcher_operator_data/comment.yml +22 -0
  399. data/spec/integration/matcher_operator_data/elem_match.yml +409 -0
  400. data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
  401. data/spec/integration/matcher_operator_data/eq.yml +191 -0
  402. data/spec/integration/matcher_operator_data/exists.yml +213 -0
  403. data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
  404. data/spec/integration/matcher_operator_data/gt.yml +132 -0
  405. data/spec/integration/matcher_operator_data/gt_types.yml +63 -0
  406. data/spec/integration/matcher_operator_data/gte.yml +132 -0
  407. data/spec/integration/matcher_operator_data/gte_types.yml +15 -0
  408. data/spec/integration/matcher_operator_data/implicit.yml +331 -0
  409. data/spec/integration/matcher_operator_data/implicit_traversal.yml +112 -0
  410. data/spec/integration/matcher_operator_data/in.yml +210 -0
  411. data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
  412. data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
  413. data/spec/integration/matcher_operator_data/lt.yml +132 -0
  414. data/spec/integration/matcher_operator_data/lt_types.yml +15 -0
  415. data/spec/integration/matcher_operator_data/lte.yml +132 -0
  416. data/spec/integration/matcher_operator_data/lte_types.yml +15 -0
  417. data/spec/integration/matcher_operator_data/mod.yml +55 -0
  418. data/spec/integration/matcher_operator_data/multiple.yml +29 -0
  419. data/spec/integration/matcher_operator_data/ne.yml +150 -0
  420. data/spec/integration/matcher_operator_data/ne_types.yml +15 -0
  421. data/spec/integration/matcher_operator_data/nin.yml +114 -0
  422. data/spec/integration/matcher_operator_data/nor.yml +126 -0
  423. data/spec/integration/matcher_operator_data/not.yml +196 -0
  424. data/spec/integration/matcher_operator_data/or.yml +137 -0
  425. data/spec/integration/matcher_operator_data/regex.yml +174 -0
  426. data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
  427. data/spec/integration/matcher_operator_data/size.yml +174 -0
  428. data/spec/integration/matcher_operator_data/type.yml +70 -0
  429. data/spec/integration/matcher_operator_data/type_array.yml +16 -0
  430. data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
  431. data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
  432. data/spec/integration/matcher_operator_data/type_code.yml +26 -0
  433. data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
  434. data/spec/integration/matcher_operator_data/type_date.yml +39 -0
  435. data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
  436. data/spec/integration/matcher_operator_data/type_decimal.yml +41 -0
  437. data/spec/integration/matcher_operator_data/type_double.yml +15 -0
  438. data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
  439. data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
  440. data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
  441. data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
  442. data/spec/integration/matcher_operator_data/type_null.yml +23 -0
  443. data/spec/integration/matcher_operator_data/type_object.yml +23 -0
  444. data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
  445. data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
  446. data/spec/integration/matcher_operator_data/type_string.yml +15 -0
  447. data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
  448. data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
  449. data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
  450. data/spec/integration/matcher_operator_spec.rb +122 -0
  451. data/spec/integration/matcher_spec.rb +283 -0
  452. data/spec/integration/persistence/range_field_spec.rb +350 -0
  453. data/spec/integration/server_query_spec.rb +141 -0
  454. data/spec/integration/shardable_spec.rb +148 -0
  455. data/spec/integration/stringified_symbol_field_spec.rb +203 -0
  456. data/spec/lite_spec_helper.rb +83 -0
  457. data/spec/mongoid/association/accessors_spec.rb +284 -77
  458. data/spec/mongoid/association/auto_save_spec.rb +74 -33
  459. data/spec/mongoid/association/builders_spec.rb +3 -1
  460. data/spec/mongoid/association/constrainable_spec.rb +2 -0
  461. data/spec/mongoid/association/counter_cache_spec.rb +35 -33
  462. data/spec/mongoid/association/depending_spec.rb +431 -338
  463. data/spec/mongoid/association/eager_spec.rb +8 -5
  464. data/spec/mongoid/association/embedded/cyclic_spec.rb +4 -2
  465. data/spec/mongoid/association/embedded/dirty_spec.rb +4 -2
  466. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +4 -1
  467. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +56 -0
  468. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +152 -13
  469. data/spec/mongoid/association/embedded/embedded_in_spec.rb +61 -1
  470. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +2 -0
  471. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +114 -0
  472. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +706 -197
  473. data/spec/mongoid/association/embedded/embeds_many_models.rb +227 -0
  474. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +63 -0
  475. data/spec/mongoid/association/embedded/embeds_many_spec.rb +81 -1
  476. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +2 -0
  477. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +27 -0
  478. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +38 -23
  479. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +8 -0
  480. data/spec/mongoid/association/embedded/embeds_one_models.rb +73 -0
  481. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +28 -0
  482. data/spec/mongoid/association/embedded/embeds_one_spec.rb +77 -1
  483. data/spec/mongoid/association/macros_spec.rb +11 -9
  484. data/spec/mongoid/association/nested/many_spec.rb +2 -0
  485. data/spec/mongoid/association/nested/one_spec.rb +18 -12
  486. data/spec/mongoid/association/options_spec.rb +2 -0
  487. data/spec/mongoid/association/polymorphic_spec.rb +2 -0
  488. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +4 -1
  489. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +111 -16
  490. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +266 -17
  491. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +114 -58
  492. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  493. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +57 -0
  494. data/spec/mongoid/association/referenced/belongs_to_spec.rb +96 -29
  495. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +3 -1
  496. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +28 -1
  497. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +67 -4
  498. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +76 -0
  499. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +559 -385
  500. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +92 -0
  501. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +39 -0
  502. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +84 -7
  503. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +3 -1
  504. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +132 -0
  505. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +40 -9
  506. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +415 -129
  507. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +23 -0
  508. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +859 -502
  509. data/spec/mongoid/association/referenced/has_many_models.rb +97 -0
  510. data/spec/mongoid/association/referenced/has_many_query_spec.rb +37 -0
  511. data/spec/mongoid/association/referenced/has_many_spec.rb +51 -3
  512. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +2 -0
  513. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +55 -9
  514. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +34 -4
  515. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +135 -27
  516. data/spec/mongoid/association/referenced/has_one_models.rb +113 -0
  517. data/spec/mongoid/association/referenced/has_one_query_spec.rb +37 -0
  518. data/spec/mongoid/association/referenced/has_one_spec.rb +87 -7
  519. data/spec/mongoid/association/reflections_spec.rb +2 -0
  520. data/spec/mongoid/association/syncable_spec.rb +48 -32
  521. data/spec/mongoid/association_spec.rb +2 -0
  522. data/spec/mongoid/atomic/modifiers_spec.rb +49 -0
  523. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +2 -0
  524. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +2 -0
  525. data/spec/mongoid/atomic/paths/root_spec.rb +2 -0
  526. data/spec/mongoid/atomic/paths_spec.rb +93 -12
  527. data/spec/mongoid/atomic_spec.rb +53 -6
  528. data/spec/mongoid/attributes/dynamic_spec.rb +152 -0
  529. data/spec/mongoid/attributes/nested_spec.rb +149 -78
  530. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  531. data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
  532. data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
  533. data/spec/mongoid/attributes/projector_spec.rb +40 -0
  534. data/spec/mongoid/attributes/readonly_spec.rb +24 -22
  535. data/spec/mongoid/attributes_spec.rb +895 -54
  536. data/spec/mongoid/cacheable_spec.rb +6 -4
  537. data/spec/mongoid/changeable_spec.rb +484 -67
  538. data/spec/mongoid/clients/factory_spec.rb +139 -33
  539. data/spec/mongoid/clients/options_spec.rb +76 -54
  540. data/spec/mongoid/clients/sessions_spec.rb +35 -63
  541. data/spec/mongoid/clients/transactions_spec.rb +87 -41
  542. data/spec/mongoid/clients_spec.rb +257 -31
  543. data/spec/mongoid/collection_configurable_spec.rb +158 -0
  544. data/spec/mongoid/composable_spec.rb +2 -0
  545. data/spec/mongoid/config/defaults_spec.rb +160 -0
  546. data/spec/mongoid/config/environment_spec.rb +126 -8
  547. data/spec/mongoid/config/options_spec.rb +22 -3
  548. data/spec/mongoid/config_spec.rb +507 -2
  549. data/spec/mongoid/contextual/aggregable/memory_spec.rb +433 -153
  550. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  551. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  552. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +122 -20
  553. data/spec/mongoid/contextual/aggregable/none_spec.rb +60 -0
  554. data/spec/mongoid/contextual/atomic_spec.rb +242 -81
  555. data/spec/mongoid/contextual/geo_near_spec.rb +31 -19
  556. data/spec/mongoid/contextual/map_reduce_spec.rb +22 -19
  557. data/spec/mongoid/contextual/memory_spec.rb +1828 -303
  558. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
  559. data/spec/mongoid/contextual/mongo_spec.rb +3505 -1268
  560. data/spec/mongoid/contextual/none_spec.rb +80 -67
  561. data/spec/mongoid/copyable_spec.rb +697 -40
  562. data/spec/mongoid/copyable_spec_models.rb +47 -0
  563. data/spec/mongoid/criteria/findable_spec.rb +161 -228
  564. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  565. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  566. data/spec/mongoid/criteria/inspectable_spec.rb +2 -0
  567. data/spec/mongoid/criteria/marshalable_spec.rb +20 -1
  568. data/spec/mongoid/criteria/modifiable_spec.rb +100 -48
  569. data/spec/mongoid/criteria/options_spec.rb +2 -0
  570. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +3 -1
  571. data/spec/mongoid/criteria/queryable/expandable_spec.rb +61 -0
  572. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +9 -19
  573. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +136 -26
  574. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +3 -1
  575. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +13 -0
  576. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +46 -17
  577. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +2 -0
  578. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +2 -15
  579. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +2 -0
  580. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +2 -0
  581. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +119 -0
  582. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +2 -0
  583. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +239 -178
  584. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +3 -1
  585. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +9 -7
  586. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +2 -0
  587. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +7 -70
  588. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +2 -59
  589. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +53 -23
  590. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +41 -1
  591. data/spec/mongoid/criteria/queryable/key_spec.rb +50 -6
  592. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +145 -12
  593. data/spec/mongoid/criteria/queryable/optional_spec.rb +18 -485
  594. data/spec/mongoid/criteria/queryable/options_spec.rb +3 -1
  595. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +2 -0
  596. data/spec/mongoid/criteria/queryable/queryable_spec.rb +3 -1
  597. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +2538 -0
  598. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +38 -0
  599. data/spec/mongoid/criteria/queryable/selectable_spec.rb +1193 -2934
  600. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +589 -0
  601. data/spec/mongoid/criteria/queryable/selector_spec.rb +56 -5
  602. data/spec/mongoid/criteria/queryable/smash_spec.rb +2 -0
  603. data/spec/mongoid/criteria/queryable/storable_spec.rb +226 -0
  604. data/spec/mongoid/criteria/scopable_spec.rb +210 -0
  605. data/spec/mongoid/criteria/translator_spec.rb +132 -0
  606. data/spec/mongoid/criteria_projection_spec.rb +406 -0
  607. data/spec/mongoid/criteria_spec.rb +1334 -1719
  608. data/spec/mongoid/document_fields_spec.rb +262 -0
  609. data/spec/mongoid/document_persistence_context_spec.rb +32 -0
  610. data/spec/mongoid/document_query_spec.rb +89 -0
  611. data/spec/mongoid/document_spec.rb +212 -67
  612. data/spec/mongoid/equality_spec.rb +144 -41
  613. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +5 -3
  614. data/spec/mongoid/errors/callback_spec.rb +2 -0
  615. data/spec/mongoid/errors/delete_restriction_spec.rb +4 -2
  616. data/spec/mongoid/errors/document_not_destroyed_spec.rb +2 -0
  617. data/spec/mongoid/errors/document_not_found_spec.rb +78 -0
  618. data/spec/mongoid/errors/invalid_collection_spec.rb +2 -0
  619. data/spec/mongoid/errors/{eager_load_spec.rb → invalid_config_file_spec.rb} +7 -5
  620. data/spec/mongoid/errors/invalid_config_option_spec.rb +2 -0
  621. data/spec/mongoid/errors/invalid_field_option_spec.rb +2 -0
  622. data/spec/mongoid/errors/invalid_field_spec.rb +3 -1
  623. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  624. data/spec/mongoid/errors/invalid_find_spec.rb +2 -0
  625. data/spec/mongoid/errors/invalid_includes_spec.rb +2 -0
  626. data/spec/mongoid/errors/invalid_index_spec.rb +2 -0
  627. data/spec/mongoid/errors/invalid_options_spec.rb +4 -2
  628. data/spec/mongoid/errors/invalid_path_spec.rb +2 -0
  629. data/spec/mongoid/errors/invalid_relation_spec.rb +4 -2
  630. data/spec/mongoid/errors/invalid_scope_spec.rb +3 -1
  631. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +2 -0
  632. data/spec/mongoid/errors/invalid_storage_options_spec.rb +2 -0
  633. data/spec/mongoid/errors/invalid_time_spec.rb +2 -0
  634. data/spec/mongoid/errors/inverse_not_found_spec.rb +3 -1
  635. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +2 -0
  636. data/spec/mongoid/errors/mixed_relations_spec.rb +2 -0
  637. data/spec/mongoid/errors/mongoid_error_spec.rb +24 -8
  638. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +5 -3
  639. data/spec/mongoid/errors/no_client_config_spec.rb +4 -2
  640. data/spec/mongoid/errors/no_client_database_spec.rb +5 -3
  641. data/spec/mongoid/errors/no_client_hosts_spec.rb +5 -3
  642. data/spec/mongoid/errors/no_clients_config_spec.rb +2 -0
  643. data/spec/mongoid/errors/no_environment_spec.rb +5 -3
  644. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +2 -0
  645. data/spec/mongoid/errors/no_metadata_spec.rb +4 -2
  646. data/spec/mongoid/errors/no_parent_spec.rb +3 -1
  647. data/spec/mongoid/errors/readonly_attribute_spec.rb +2 -0
  648. data/spec/mongoid/errors/readonly_document_spec.rb +4 -2
  649. data/spec/mongoid/errors/scope_overwrite_spec.rb +2 -0
  650. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +3 -1
  651. data/spec/mongoid/errors/unknown_attribute_spec.rb +4 -2
  652. data/spec/mongoid/errors/unsaved_document_spec.rb +3 -1
  653. data/spec/mongoid/errors/unsupported_javascript_spec.rb +2 -0
  654. data/spec/mongoid/errors/validations_spec.rb +2 -0
  655. data/spec/mongoid/extensions/array_spec.rb +41 -45
  656. data/spec/mongoid/extensions/big_decimal_spec.rb +715 -213
  657. data/spec/mongoid/extensions/binary_spec.rb +46 -9
  658. data/spec/mongoid/extensions/boolean_spec.rb +70 -82
  659. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +339 -0
  660. data/spec/mongoid/extensions/date_spec.rb +58 -140
  661. data/spec/mongoid/extensions/date_time_spec.rb +32 -69
  662. data/spec/mongoid/extensions/decimal128_spec.rb +2 -0
  663. data/spec/mongoid/extensions/false_class_spec.rb +3 -1
  664. data/spec/mongoid/extensions/float_spec.rb +66 -73
  665. data/spec/mongoid/extensions/hash_spec.rb +135 -0
  666. data/spec/mongoid/extensions/integer_spec.rb +61 -63
  667. data/spec/mongoid/extensions/module_spec.rb +2 -0
  668. data/spec/mongoid/extensions/nil_class_spec.rb +2 -0
  669. data/spec/mongoid/extensions/object_id_spec.rb +2 -0
  670. data/spec/mongoid/extensions/object_spec.rb +13 -24
  671. data/spec/mongoid/extensions/range_spec.rb +257 -54
  672. data/spec/mongoid/extensions/regexp_spec.rb +70 -20
  673. data/spec/mongoid/extensions/set_spec.rb +108 -0
  674. data/spec/mongoid/extensions/string_spec.rb +146 -57
  675. data/spec/mongoid/extensions/stringified_symbol_spec.rb +84 -0
  676. data/spec/mongoid/extensions/symbol_spec.rb +20 -25
  677. data/spec/mongoid/extensions/time_spec.rb +668 -106
  678. data/spec/mongoid/extensions/time_with_zone_spec.rb +57 -83
  679. data/spec/mongoid/extensions/true_class_spec.rb +3 -1
  680. data/spec/mongoid/extensions_spec.rb +16 -2
  681. data/spec/mongoid/factory_spec.rb +347 -27
  682. data/spec/mongoid/fields/foreign_key_spec.rb +2 -0
  683. data/spec/mongoid/fields/localized_spec.rb +86 -41
  684. data/spec/mongoid/fields/standard_spec.rb +2 -0
  685. data/spec/mongoid/fields_spec.rb +869 -114
  686. data/spec/mongoid/findable_spec.rb +521 -65
  687. data/spec/mongoid/indexable/specification_spec.rb +4 -2
  688. data/spec/mongoid/indexable_spec.rb +87 -32
  689. data/spec/mongoid/inspectable_spec.rb +39 -2
  690. data/spec/mongoid/interceptable_spec.rb +761 -98
  691. data/spec/mongoid/interceptable_spec_models.rb +307 -0
  692. data/spec/mongoid/loggable_spec.rb +2 -0
  693. data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
  694. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +239 -0
  695. data/spec/mongoid/matcher/extract_attribute_spec.rb +36 -0
  696. data/spec/mongoid/mongoizable_spec.rb +285 -0
  697. data/spec/mongoid/persistable/creatable_spec.rb +114 -29
  698. data/spec/mongoid/persistable/deletable_spec.rb +300 -18
  699. data/spec/mongoid/persistable/destroyable_spec.rb +228 -18
  700. data/spec/mongoid/persistable/incrementable_spec.rb +66 -13
  701. data/spec/mongoid/persistable/logical_spec.rb +56 -3
  702. data/spec/mongoid/persistable/poppable_spec.rb +55 -3
  703. data/spec/mongoid/persistable/pullable_spec.rb +108 -6
  704. data/spec/mongoid/persistable/pushable_spec.rb +163 -7
  705. data/spec/mongoid/persistable/renamable_spec.rb +54 -2
  706. data/spec/mongoid/persistable/savable_spec.rb +284 -25
  707. data/spec/mongoid/persistable/settable_spec.rb +91 -8
  708. data/spec/mongoid/persistable/unsettable_spec.rb +55 -3
  709. data/spec/mongoid/persistable/updatable_spec.rb +63 -49
  710. data/spec/mongoid/persistable/upsertable_spec.rb +93 -3
  711. data/spec/mongoid/persistable_spec.rb +85 -9
  712. data/spec/mongoid/persistence_context_spec.rb +60 -59
  713. data/spec/mongoid/positional_spec.rb +2 -0
  714. data/spec/mongoid/query_cache_middleware_spec.rb +50 -0
  715. data/spec/mongoid/query_cache_spec.rb +446 -78
  716. data/spec/mongoid/relations/proxy_spec.rb +9 -7
  717. data/spec/mongoid/reloadable_spec.rb +381 -26
  718. data/spec/mongoid/scopable_spec.rb +206 -38
  719. data/spec/mongoid/selectable_spec.rb +8 -6
  720. data/spec/mongoid/serializable_spec.rb +148 -38
  721. data/spec/mongoid/shardable_models.rb +75 -0
  722. data/spec/mongoid/shardable_spec.rb +239 -34
  723. data/spec/mongoid/stateful_spec.rb +153 -9
  724. data/spec/mongoid/tasks/database_rake_spec.rb +89 -13
  725. data/spec/mongoid/tasks/database_spec.rb +130 -1
  726. data/spec/mongoid/threaded_spec.rb +72 -2
  727. data/spec/mongoid/timestamps/created/short_spec.rb +3 -1
  728. data/spec/mongoid/timestamps/created_spec.rb +3 -1
  729. data/spec/mongoid/timestamps/timeless_spec.rb +4 -2
  730. data/spec/mongoid/timestamps/updated/short_spec.rb +5 -3
  731. data/spec/mongoid/timestamps/updated_spec.rb +5 -3
  732. data/spec/mongoid/timestamps_spec.rb +400 -10
  733. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  734. data/spec/mongoid/touchable_spec.rb +568 -33
  735. data/spec/mongoid/touchable_spec_models.rb +59 -0
  736. data/spec/mongoid/traversable_spec.rb +1145 -1
  737. data/spec/mongoid/validatable/associated_spec.rb +2 -0
  738. data/spec/mongoid/validatable/format_spec.rb +2 -0
  739. data/spec/mongoid/validatable/length_spec.rb +2 -0
  740. data/spec/mongoid/validatable/numericality_spec.rb +2 -0
  741. data/spec/mongoid/validatable/presence_spec.rb +28 -22
  742. data/spec/mongoid/validatable/uniqueness_spec.rb +159 -103
  743. data/spec/mongoid/validatable_spec.rb +5 -3
  744. data/spec/mongoid/warnings_spec.rb +35 -0
  745. data/spec/mongoid_spec.rb +36 -10
  746. data/spec/rails/controller_extension/controller_runtime_spec.rb +112 -0
  747. data/spec/rails/mongoid_spec.rb +8 -18
  748. data/spec/shared/LICENSE +20 -0
  749. data/spec/shared/bin/get-mongodb-download-url +17 -0
  750. data/spec/shared/bin/s3-copy +45 -0
  751. data/spec/shared/bin/s3-upload +69 -0
  752. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  753. data/spec/shared/lib/mrss/cluster_config.rb +231 -0
  754. data/spec/shared/lib/mrss/constraints.rb +378 -0
  755. data/spec/shared/lib/mrss/docker_runner.rb +298 -0
  756. data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
  757. data/spec/shared/lib/mrss/event_subscriber.rb +210 -0
  758. data/spec/shared/lib/mrss/lite_constraints.rb +238 -0
  759. data/spec/shared/lib/mrss/server_version_registry.rb +113 -0
  760. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  761. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  762. data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
  763. data/spec/shared/lib/mrss/utils.rb +37 -0
  764. data/spec/shared/share/Dockerfile.erb +321 -0
  765. data/spec/shared/share/haproxy-1.conf +16 -0
  766. data/spec/shared/share/haproxy-2.conf +17 -0
  767. data/spec/shared/shlib/config.sh +27 -0
  768. data/spec/shared/shlib/distro.sh +74 -0
  769. data/spec/shared/shlib/server.sh +416 -0
  770. data/spec/shared/shlib/set_env.sh +169 -0
  771. data/spec/spec_helper.rb +74 -88
  772. data/spec/support/authorization.rb +2 -0
  773. data/spec/support/client_registry.rb +9 -0
  774. data/spec/support/constraints.rb +77 -0
  775. data/spec/support/expectations.rb +21 -3
  776. data/spec/support/helpers.rb +11 -0
  777. data/spec/support/immutable_ids.rb +118 -0
  778. data/spec/support/macros.rb +129 -0
  779. data/spec/{app → support}/models/account.rb +3 -1
  780. data/spec/{app → support}/models/acolyte.rb +2 -0
  781. data/spec/{app → support}/models/actor.rb +3 -1
  782. data/spec/support/models/actress.rb +4 -0
  783. data/spec/{app → support}/models/address.rb +6 -0
  784. data/spec/{app → support}/models/address_component.rb +2 -0
  785. data/spec/{app → support}/models/address_number.rb +2 -0
  786. data/spec/{app → support}/models/agency.rb +2 -0
  787. data/spec/{app → support}/models/agent.rb +2 -0
  788. data/spec/{app → support}/models/album.rb +2 -0
  789. data/spec/{app → support}/models/alert.rb +2 -0
  790. data/spec/{app → support}/models/animal.rb +2 -0
  791. data/spec/{app → support}/models/answer.rb +2 -0
  792. data/spec/{app → support}/models/appointment.rb +2 -0
  793. data/spec/support/models/armrest.rb +9 -0
  794. data/spec/{app → support}/models/article.rb +2 -0
  795. data/spec/{app → support}/models/artist.rb +4 -1
  796. data/spec/{app → support}/models/artwork.rb +2 -0
  797. data/spec/support/models/audible_sound.rb +3 -0
  798. data/spec/{app → support}/models/audio.rb +2 -0
  799. data/spec/support/models/augmentation.rb +25 -0
  800. data/spec/{app → support}/models/author.rb +2 -0
  801. data/spec/{app → support}/models/baby.rb +2 -0
  802. data/spec/{app → support}/models/band.rb +10 -0
  803. data/spec/{app → support}/models/bar.rb +2 -0
  804. data/spec/{app → support}/models/basic.rb +2 -0
  805. data/spec/support/models/bed.rb +3 -0
  806. data/spec/{app → support}/models/big_palette.rb +2 -0
  807. data/spec/{app → support}/models/birthday.rb +2 -0
  808. data/spec/support/models/bolt.rb +7 -0
  809. data/spec/{app → support}/models/bomb.rb +2 -0
  810. data/spec/{app → support}/models/book.rb +3 -0
  811. data/spec/{app → support}/models/breed.rb +2 -0
  812. data/spec/{app → support}/models/browser.rb +3 -1
  813. data/spec/{app → support}/models/building.rb +4 -0
  814. data/spec/{app → support}/models/building_address.rb +2 -0
  815. data/spec/{app → support}/models/bus.rb +2 -0
  816. data/spec/{app → support}/models/business.rb +2 -0
  817. data/spec/{app → support}/models/callback_test.rb +2 -0
  818. data/spec/{app → support}/models/canvas.rb +3 -1
  819. data/spec/support/models/car.rb +3 -0
  820. data/spec/{app → support}/models/cat.rb +2 -0
  821. data/spec/support/models/catalog.rb +24 -0
  822. data/spec/{app → support}/models/category.rb +2 -0
  823. data/spec/{app → support}/models/child.rb +2 -0
  824. data/spec/{app → support}/models/child_doc.rb +5 -3
  825. data/spec/{app → support}/models/church.rb +2 -0
  826. data/spec/{app → support}/models/circle.rb +2 -0
  827. data/spec/{app → support}/models/circuit.rb +2 -0
  828. data/spec/support/models/circus.rb +12 -0
  829. data/spec/{app → support}/models/code.rb +4 -0
  830. data/spec/support/models/coding/pull_request.rb +11 -0
  831. data/spec/support/models/coding.rb +3 -0
  832. data/spec/{app → support}/models/comment.rb +2 -0
  833. data/spec/{app → support}/models/company.rb +2 -0
  834. data/spec/{app → support}/models/consumption_period.rb +2 -0
  835. data/spec/{app → support}/models/contextable_item.rb +2 -0
  836. data/spec/{app → support}/models/contractor.rb +2 -0
  837. data/spec/{app → support}/models/cookie.rb +2 -0
  838. data/spec/{app → support}/models/country_code.rb +4 -0
  839. data/spec/{app → support}/models/courier_job.rb +2 -0
  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 +2 -0
  846. data/spec/support/models/delegating_patient.rb +15 -0
  847. data/spec/{app → support}/models/description.rb +2 -0
  848. data/spec/{app → support}/models/dictionary.rb +8 -0
  849. data/spec/{app → support}/models/division.rb +2 -0
  850. data/spec/{app → support}/models/doctor.rb +2 -0
  851. data/spec/{app → support}/models/dog.rb +2 -0
  852. data/spec/{app → support}/models/dokument.rb +2 -0
  853. data/spec/{app → support}/models/draft.rb +2 -0
  854. data/spec/{app → support}/models/dragon.rb +2 -0
  855. data/spec/{app → support}/models/driver.rb +3 -1
  856. data/spec/{app → support}/models/drug.rb +2 -0
  857. data/spec/{app → support}/models/dungeon.rb +2 -0
  858. data/spec/{app → support}/models/edit.rb +2 -0
  859. data/spec/{app → support}/models/email.rb +2 -0
  860. data/spec/{app → support}/models/employer.rb +2 -0
  861. data/spec/{app → support}/models/entry.rb +2 -0
  862. data/spec/support/models/eraser.rb +3 -0
  863. data/spec/{app → support}/models/even.rb +2 -0
  864. data/spec/{app → support}/models/event.rb +2 -0
  865. data/spec/{app → support}/models/exhibition.rb +2 -0
  866. data/spec/{app → support}/models/exhibitor.rb +2 -0
  867. data/spec/{app → support}/models/explosion.rb +2 -0
  868. data/spec/{app → support}/models/eye.rb +2 -0
  869. data/spec/{app → support}/models/eye_bowl.rb +2 -0
  870. data/spec/{app → support}/models/face.rb +2 -0
  871. data/spec/support/models/fanatic.rb +8 -0
  872. data/spec/{app → support}/models/favorite.rb +2 -0
  873. data/spec/{app → support}/models/filesystem.rb +2 -0
  874. data/spec/{app → support}/models/fire_hydrant.rb +2 -0
  875. data/spec/{app → support}/models/firefox.rb +2 -0
  876. data/spec/{app → support}/models/fish.rb +2 -0
  877. data/spec/{app → support}/models/folder.rb +2 -0
  878. data/spec/{app → support}/models/folder_item.rb +2 -0
  879. data/spec/{app → support}/models/fruits.rb +2 -0
  880. data/spec/{app → support}/models/game.rb +2 -0
  881. data/spec/{app → support}/models/ghost.rb +2 -0
  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 +2 -0
  885. data/spec/{app → support}/models/house.rb +2 -0
  886. data/spec/{app → support}/models/html_writer.rb +2 -0
  887. data/spec/{app → support}/models/id_key.rb +2 -0
  888. data/spec/support/models/idnodef.rb +7 -0
  889. data/spec/{app → support}/models/image.rb +2 -0
  890. data/spec/{app → support}/models/implant.rb +11 -0
  891. data/spec/support/models/instrument.rb +8 -0
  892. data/spec/{app → support}/models/item.rb +3 -1
  893. data/spec/{app → support}/models/jar.rb +2 -0
  894. data/spec/{app → support}/models/kaleidoscope.rb +2 -0
  895. data/spec/{app → support}/models/kangaroo.rb +3 -1
  896. data/spec/{app → support}/models/label.rb +6 -1
  897. data/spec/{app → support}/models/language.rb +2 -0
  898. data/spec/{app → support}/models/lat_lng.rb +2 -0
  899. data/spec/{app → support}/models/league.rb +2 -0
  900. data/spec/support/models/learner.rb +4 -0
  901. data/spec/{app → support}/models/line_item.rb +2 -0
  902. data/spec/{app → support}/models/location.rb +2 -0
  903. data/spec/{app → support}/models/login.rb +2 -0
  904. data/spec/{app → support}/models/manufacturer.rb +2 -0
  905. data/spec/{app → support}/models/meat.rb +2 -0
  906. data/spec/{app → support}/models/membership.rb +3 -0
  907. data/spec/{app → support}/models/message.rb +2 -0
  908. data/spec/support/models/minim.rb +6 -0
  909. data/spec/{app → support}/models/mixed_drink.rb +2 -0
  910. data/spec/support/models/mop.rb +24 -0
  911. data/spec/{app → support}/models/movie.rb +2 -0
  912. data/spec/support/models/my_hash.rb +4 -0
  913. data/spec/{app → support}/models/name.rb +2 -0
  914. data/spec/support/models/name_only.rb +8 -0
  915. data/spec/{app → support}/models/node.rb +2 -0
  916. data/spec/{app → support}/models/note.rb +2 -0
  917. data/spec/support/models/nut.rb +7 -0
  918. data/spec/{app → support}/models/odd.rb +2 -0
  919. data/spec/support/models/order.rb +12 -0
  920. data/spec/{app → support}/models/ordered_post.rb +3 -1
  921. data/spec/{app → support}/models/ordered_preference.rb +2 -0
  922. data/spec/{app → support}/models/oscar.rb +2 -0
  923. data/spec/support/models/other_owner_object.rb +4 -0
  924. data/spec/{app → support}/models/override.rb +2 -0
  925. data/spec/{app → support}/models/ownable.rb +2 -0
  926. data/spec/{app → support}/models/owner.rb +4 -0
  927. data/spec/{app → support}/models/pack.rb +2 -0
  928. data/spec/{app → support}/models/page.rb +2 -0
  929. data/spec/{app → support}/models/page_question.rb +2 -0
  930. data/spec/{app → support}/models/palette.rb +3 -1
  931. data/spec/{app → support}/models/parent.rb +2 -0
  932. data/spec/{app → support}/models/parent_doc.rb +2 -0
  933. data/spec/support/models/passport.rb +22 -0
  934. data/spec/{app → support}/models/patient.rb +2 -0
  935. data/spec/{app → support}/models/pdf_writer.rb +2 -0
  936. data/spec/support/models/pencil.rb +3 -0
  937. data/spec/{app → support}/models/person.rb +22 -1
  938. data/spec/{app → support}/models/pet.rb +2 -0
  939. data/spec/{app → support}/models/pet_owner.rb +2 -0
  940. data/spec/{app → support}/models/phone.rb +5 -1
  941. data/spec/support/models/piano.rb +4 -0
  942. data/spec/{app → support}/models/pizza.rb +2 -0
  943. data/spec/{app → support}/models/player.rb +4 -0
  944. data/spec/{app → support}/models/post.rb +2 -0
  945. data/spec/{app → support}/models/post_genre.rb +2 -0
  946. data/spec/support/models/powerup.rb +25 -0
  947. data/spec/{app → support}/models/preference.rb +2 -0
  948. data/spec/{app → support}/models/princess.rb +2 -0
  949. data/spec/{app → support}/models/product.rb +3 -0
  950. data/spec/support/models/profile.rb +17 -0
  951. data/spec/{app → support}/models/pronunciation.rb +2 -0
  952. data/spec/{app → support}/models/pub.rb +2 -0
  953. data/spec/support/models/publication/encyclopedia.rb +11 -0
  954. data/spec/support/models/publication/review.rb +13 -0
  955. data/spec/support/models/publication.rb +4 -0
  956. data/spec/{app → support}/models/purchase.rb +2 -0
  957. data/spec/support/models/purchased_item.rb +10 -0
  958. data/spec/{app → support}/models/question.rb +2 -0
  959. data/spec/{app → support}/models/quiz.rb +2 -0
  960. data/spec/{app → support}/models/rating.rb +2 -0
  961. data/spec/{app → support}/models/record.rb +2 -0
  962. data/spec/{app → support}/models/registry.rb +3 -0
  963. data/spec/{app → support}/models/role.rb +2 -0
  964. data/spec/{app → support}/models/root_category.rb +2 -0
  965. data/spec/{app → support}/models/sandwich.rb +2 -0
  966. data/spec/{app → support}/models/scheduler.rb +2 -0
  967. data/spec/support/models/school.rb +14 -0
  968. data/spec/support/models/scribe.rb +7 -0
  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 +2 -0
  972. data/spec/support/models/series.rb +7 -0
  973. data/spec/{app → support}/models/server.rb +2 -0
  974. data/spec/{app → support}/models/service.rb +2 -0
  975. data/spec/{app → support}/models/shape.rb +4 -2
  976. data/spec/{app → support}/models/shelf.rb +2 -0
  977. data/spec/support/models/shield.rb +18 -0
  978. data/spec/{app → support}/models/shipment_address.rb +2 -0
  979. data/spec/{app → support}/models/shipping_container.rb +2 -0
  980. data/spec/{app → support}/models/shipping_pack.rb +2 -0
  981. data/spec/support/models/shirt.rb +11 -0
  982. data/spec/{app → support}/models/shop.rb +2 -0
  983. data/spec/{app → support}/models/short_agent.rb +2 -0
  984. data/spec/{app → support}/models/short_quiz.rb +2 -0
  985. data/spec/{app → support}/models/simple.rb +2 -0
  986. data/spec/{app → support}/models/slave.rb +2 -0
  987. data/spec/{app → support}/models/song.rb +2 -0
  988. data/spec/{app → support}/models/sound.rb +2 -0
  989. data/spec/support/models/spacer.rb +7 -0
  990. data/spec/{app → support}/models/square.rb +2 -0
  991. data/spec/{app → support}/models/staff.rb +2 -0
  992. data/spec/{app → support}/models/store_as_dup_test1.rb +2 -0
  993. data/spec/{app → support}/models/store_as_dup_test2.rb +2 -0
  994. data/spec/support/models/store_as_dup_test3.rb +7 -0
  995. data/spec/support/models/store_as_dup_test4.rb +7 -0
  996. data/spec/{app → support}/models/strategy.rb +2 -0
  997. data/spec/support/models/student.rb +14 -0
  998. data/spec/{app → support}/models/sub_item.rb +2 -0
  999. data/spec/{app → support}/models/subscription.rb +2 -0
  1000. data/spec/{app → support}/models/survey.rb +2 -0
  1001. data/spec/{app → support}/models/symptom.rb +2 -0
  1002. data/spec/support/models/system_role.rb +7 -0
  1003. data/spec/{app → support}/models/tag.rb +2 -0
  1004. data/spec/{app → support}/models/target.rb +2 -0
  1005. data/spec/{app → support}/models/template.rb +2 -0
  1006. data/spec/{app → support}/models/thing.rb +2 -0
  1007. data/spec/support/models/threadlocker.rb +7 -0
  1008. data/spec/{app → support}/models/title.rb +2 -0
  1009. data/spec/{app → support}/models/tool.rb +4 -2
  1010. data/spec/{app → support}/models/topping.rb +2 -0
  1011. data/spec/support/models/toy.rb +9 -0
  1012. data/spec/{app → support}/models/track.rb +2 -0
  1013. data/spec/{app → support}/models/translation.rb +2 -0
  1014. data/spec/{app → support}/models/tree.rb +2 -0
  1015. data/spec/support/models/truck.rb +7 -0
  1016. data/spec/{app → support}/models/user.rb +2 -0
  1017. data/spec/{app → support}/models/user_account.rb +2 -0
  1018. data/spec/{app → support}/models/validation_callback.rb +2 -0
  1019. data/spec/support/models/vehicle.rb +18 -0
  1020. data/spec/{app → support}/models/version.rb +2 -0
  1021. data/spec/{app → support}/models/vertex.rb +3 -1
  1022. data/spec/{app → support}/models/vet_visit.rb +2 -0
  1023. data/spec/{app → support}/models/video.rb +2 -0
  1024. data/spec/support/models/video_game.rb +3 -0
  1025. data/spec/support/models/washer.rb +7 -0
  1026. data/spec/support/models/weapon.rb +25 -0
  1027. data/spec/{app → support}/models/wiki_page.rb +3 -0
  1028. data/spec/{app → support}/models/word.rb +2 -0
  1029. data/spec/{app → support}/models/word_origin.rb +2 -0
  1030. data/spec/{app → support}/models/writer.rb +4 -2
  1031. data/spec/support/schema_maps/schema_map_aws.json +17 -0
  1032. data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
  1033. data/spec/support/schema_maps/schema_map_azure.json +17 -0
  1034. data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
  1035. data/spec/support/schema_maps/schema_map_gcp.json +17 -0
  1036. data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
  1037. data/spec/support/schema_maps/schema_map_kmip.json +17 -0
  1038. data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
  1039. data/spec/support/schema_maps/schema_map_local.json +18 -0
  1040. data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
  1041. data/spec/support/shared/time.rb +53 -0
  1042. data/spec/support/spec_config.rb +64 -0
  1043. data.tar.gz.sig +1 -2
  1044. metadata +1158 -615
  1045. metadata.gz.sig +0 -0
  1046. data/lib/mongoid/criteria/queryable/forwardable.rb +0 -65
  1047. data/lib/mongoid/errors/eager_load.rb +0 -22
  1048. data/lib/mongoid/errors/invalid_value.rb +0 -16
  1049. data/lib/mongoid/matchable/all.rb +0 -27
  1050. data/lib/mongoid/matchable/and.rb +0 -30
  1051. data/lib/mongoid/matchable/default.rb +0 -72
  1052. data/lib/mongoid/matchable/elem_match.rb +0 -34
  1053. data/lib/mongoid/matchable/exists.rb +0 -23
  1054. data/lib/mongoid/matchable/gt.rb +0 -23
  1055. data/lib/mongoid/matchable/gte.rb +0 -23
  1056. data/lib/mongoid/matchable/in.rb +0 -24
  1057. data/lib/mongoid/matchable/lt.rb +0 -23
  1058. data/lib/mongoid/matchable/lte.rb +0 -23
  1059. data/lib/mongoid/matchable/ne.rb +0 -21
  1060. data/lib/mongoid/matchable/nin.rb +0 -22
  1061. data/lib/mongoid/matchable/nor.rb +0 -37
  1062. data/lib/mongoid/matchable/or.rb +0 -33
  1063. data/lib/mongoid/matchable/regexp.rb +0 -27
  1064. data/lib/mongoid/matchable/size.rb +0 -21
  1065. data/lib/support/ruby_version.rb +0 -26
  1066. data/spec/app/models/actress.rb +0 -2
  1067. data/spec/app/models/augmentation.rb +0 -11
  1068. data/spec/app/models/bed.rb +0 -1
  1069. data/spec/app/models/car.rb +0 -1
  1070. data/spec/app/models/circus.rb +0 -7
  1071. data/spec/app/models/eraser.rb +0 -1
  1072. data/spec/app/models/learner.rb +0 -2
  1073. data/spec/app/models/my_hash.rb +0 -2
  1074. data/spec/app/models/passport.rb +0 -5
  1075. data/spec/app/models/pencil.rb +0 -1
  1076. data/spec/app/models/powerup.rb +0 -11
  1077. data/spec/app/models/profile.rb +0 -5
  1078. data/spec/app/models/series.rb +0 -4
  1079. data/spec/app/models/truck.rb +0 -3
  1080. data/spec/app/models/vehicle.rb +0 -11
  1081. data/spec/app/models/video_game.rb +0 -1
  1082. data/spec/app/models/weapon.rb +0 -11
  1083. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -58
  1084. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -58
  1085. data/spec/mongoid/criteria/queryable/forwardable_spec.rb +0 -87
  1086. data/spec/mongoid/matchable/all_spec.rb +0 -31
  1087. data/spec/mongoid/matchable/and_spec.rb +0 -187
  1088. data/spec/mongoid/matchable/default_spec.rb +0 -130
  1089. data/spec/mongoid/matchable/elem_match_spec.rb +0 -106
  1090. data/spec/mongoid/matchable/exists_spec.rb +0 -57
  1091. data/spec/mongoid/matchable/gt_spec.rb +0 -86
  1092. data/spec/mongoid/matchable/gte_spec.rb +0 -84
  1093. data/spec/mongoid/matchable/in_spec.rb +0 -49
  1094. data/spec/mongoid/matchable/lt_spec.rb +0 -85
  1095. data/spec/mongoid/matchable/lte_spec.rb +0 -85
  1096. data/spec/mongoid/matchable/ne_spec.rb +0 -46
  1097. data/spec/mongoid/matchable/nin_spec.rb +0 -48
  1098. data/spec/mongoid/matchable/nor_spec.rb +0 -209
  1099. data/spec/mongoid/matchable/or_spec.rb +0 -131
  1100. data/spec/mongoid/matchable/regexp_spec.rb +0 -59
  1101. data/spec/mongoid/matchable/size_spec.rb +0 -25
  1102. data/spec/mongoid/matchable_spec.rb +0 -853
  1103. /data/spec/{app → support}/models/array_field.rb +0 -0
  1104. /data/spec/{app → support}/models/updatable.rb +0 -0
@@ -1,4 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "spec_helper"
4
+ require_relative './attributes/nested_spec_models'
2
5
 
3
6
  describe Mongoid::Attributes do
4
7
 
@@ -18,7 +21,7 @@ describe Mongoid::Attributes do
18
21
  context "when the attribute was excluded in a criteria" do
19
22
 
20
23
  let!(:person) do
21
- Person.create(title: "sir")
24
+ Person.create!(title: "sir")
22
25
  end
23
26
 
24
27
  context "when the attribute is localized" do
@@ -53,7 +56,7 @@ describe Mongoid::Attributes do
53
56
  let!(:agent) do
54
57
  agent = Agent.new(:title => title)
55
58
  agent.build_address(:city => city)
56
- agent.save()
59
+ agent.save!()
57
60
  agent
58
61
  end
59
62
  let(:from_db) do
@@ -93,6 +96,49 @@ describe Mongoid::Attributes do
93
96
  it "does not raise an error" do
94
97
  expect(from_db.map).to eq(map)
95
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
96
142
  end
97
143
  end
98
144
 
@@ -153,7 +199,7 @@ describe Mongoid::Attributes do
153
199
  context 'when the document has a custom attribute type' do
154
200
 
155
201
  let(:bar) do
156
- Bar.create(lat_lng: LatLng.new(52.30, 13.25))
202
+ Bar.create!(lat_lng: LatLng.new(52.30, 13.25))
157
203
  end
158
204
 
159
205
  it 'returns the demongoized version of the attribute' do
@@ -210,7 +256,7 @@ describe Mongoid::Attributes do
210
256
  context "when the document is an existing record" do
211
257
 
212
258
  let!(:person) do
213
- Person.create(title: "sir")
259
+ Person.create!(title: "sir")
214
260
  end
215
261
 
216
262
  context "when the attribute was excluded in a criteria" do
@@ -242,6 +288,91 @@ describe Mongoid::Attributes do
242
288
  end
243
289
  end
244
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
+
245
376
  context "when the attribute does not exist" do
246
377
 
247
378
  before do
@@ -262,11 +393,10 @@ describe Mongoid::Attributes do
262
393
  end
263
394
 
264
395
  context "when reloaded" do
396
+ config_override :raise_not_found_error, false
265
397
 
266
398
  before do
267
- Mongoid.raise_not_found_error = false
268
399
  person.reload
269
- Mongoid.raise_not_found_error = true
270
400
  end
271
401
 
272
402
  it "returns the default value" do
@@ -284,7 +414,7 @@ describe Mongoid::Attributes do
284
414
  let(:bar) do
285
415
  Bar.new.tap do |b|
286
416
  b[:lat_lng] = LatLng.new(52.30, 13.25)
287
- b.save
417
+ b.save!
288
418
  end
289
419
  end
290
420
 
@@ -326,6 +456,67 @@ describe Mongoid::Attributes do
326
456
  expect(terms).to eq(true)
327
457
  end
328
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
329
520
  end
330
521
 
331
522
  describe "#_id" do
@@ -796,7 +987,7 @@ describe Mongoid::Attributes do
796
987
  context 'when the document has a custom attribute type' do
797
988
 
798
989
  let(:bar) do
799
- Bar.create(lat_lng: LatLng.new(52.30, 13.25))
990
+ Bar.create!(lat_lng: LatLng.new(52.30, 13.25))
800
991
  end
801
992
 
802
993
  it 'returns the demongoized version of the attribute' do
@@ -834,18 +1025,17 @@ describe Mongoid::Attributes do
834
1025
  context "when the document is an existing record" do
835
1026
 
836
1027
  let(:person) do
837
- Person.create
1028
+ Person.create!
838
1029
  end
839
1030
 
840
1031
  context "when the attribute does not exist" do
1032
+ config_override :raise_not_found_error, false
841
1033
 
842
1034
  before do
843
1035
  person.collection
844
1036
  .find({ _id: person.id })
845
1037
  .update_one({ "$unset" => { age: 1 }})
846
- Mongoid.raise_not_found_error = false
847
1038
  person.reload
848
- Mongoid.raise_not_found_error = true
849
1039
  end
850
1040
 
851
1041
  it "returns the default value" do
@@ -873,7 +1063,7 @@ describe Mongoid::Attributes do
873
1063
  describe "#read_attribute_before_type_cast" do
874
1064
 
875
1065
  let(:person) do
876
- Person.create
1066
+ Person.create!
877
1067
  end
878
1068
 
879
1069
  context "when the attribute has not yet been assigned" do
@@ -886,8 +1076,52 @@ describe Mongoid::Attributes do
886
1076
  context "after the attribute has been assigned" do
887
1077
 
888
1078
  it "returns the default value" do
889
- person.age = "old"
890
- 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
891
1125
  end
892
1126
  end
893
1127
  end
@@ -921,18 +1155,17 @@ describe Mongoid::Attributes do
921
1155
  context "when the document is an existing record" do
922
1156
 
923
1157
  let(:person) do
924
- Person.create
1158
+ Person.create!
925
1159
  end
926
1160
 
927
1161
  context "when the attribute does not exist" do
1162
+ config_override :raise_not_found_error, false
928
1163
 
929
1164
  before do
930
1165
  person.collection
931
1166
  .find({ _id: person.id })
932
1167
  .update_one({ "$unset" => { age: 1 }})
933
- Mongoid.raise_not_found_error = false
934
1168
  person.reload
935
- Mongoid.raise_not_found_error = true
936
1169
  end
937
1170
 
938
1171
  it "returns true" do
@@ -980,7 +1213,7 @@ describe Mongoid::Attributes do
980
1213
 
981
1214
  context "when the attribute is not on only list" do
982
1215
 
983
- before { Person.create }
1216
+ before { Person.create! }
984
1217
  let(:person) do
985
1218
  Person.only(:id).first
986
1219
  end
@@ -1030,15 +1263,15 @@ describe Mongoid::Attributes do
1030
1263
 
1031
1264
  context "before the attribute has been assigned" do
1032
1265
 
1033
- it "returns false" do
1034
- 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
1035
1268
  end
1036
1269
  end
1037
1270
 
1038
1271
  context "after the attribute has been assigned" do
1039
1272
 
1040
1273
  it "returns true" do
1041
- person.age = 'old'
1274
+ person.age = '42'
1042
1275
  expect(person.has_attribute_before_type_cast?(:age)).to be true
1043
1276
  end
1044
1277
  end
@@ -1049,7 +1282,7 @@ describe Mongoid::Attributes do
1049
1282
  context "when the attribute exists" do
1050
1283
 
1051
1284
  let(:person) do
1052
- Person.create(title: "Sir")
1285
+ Person.create!(title: "Sir")
1053
1286
  end
1054
1287
 
1055
1288
  before do
@@ -1067,7 +1300,7 @@ describe Mongoid::Attributes do
1067
1300
  context "when saving after the removal" do
1068
1301
 
1069
1302
  before do
1070
- person.save
1303
+ person.save!
1071
1304
  end
1072
1305
 
1073
1306
  it "persists the removal" do
@@ -1087,7 +1320,7 @@ describe Mongoid::Attributes do
1087
1320
  end
1088
1321
 
1089
1322
  before do
1090
- person.save
1323
+ person.save!
1091
1324
  person.pet.remove_attribute(:name)
1092
1325
  end
1093
1326
 
@@ -1102,7 +1335,7 @@ describe Mongoid::Attributes do
1102
1335
  context "when saving after the removal" do
1103
1336
 
1104
1337
  before do
1105
- person.save
1338
+ person.save!
1106
1339
  end
1107
1340
 
1108
1341
  it "persists the removal" do
@@ -1147,7 +1380,7 @@ describe Mongoid::Attributes do
1147
1380
  context 'when the database name is used' do
1148
1381
 
1149
1382
  let(:person) do
1150
- Person.create(at: Time.now)
1383
+ Person.create!(at: Time.now)
1151
1384
  end
1152
1385
 
1153
1386
  before do
@@ -1165,7 +1398,7 @@ describe Mongoid::Attributes do
1165
1398
  context "when saving after the removal" do
1166
1399
 
1167
1400
  before do
1168
- person.save
1401
+ person.save!
1169
1402
  end
1170
1403
 
1171
1404
  it "persists the removal" do
@@ -1177,7 +1410,7 @@ describe Mongoid::Attributes do
1177
1410
  context 'when the alias is used' do
1178
1411
 
1179
1412
  let(:person) do
1180
- Person.create(aliased_timestamp: Time.now)
1413
+ Person.create!(aliased_timestamp: Time.now)
1181
1414
  end
1182
1415
 
1183
1416
  before do
@@ -1195,7 +1428,7 @@ describe Mongoid::Attributes do
1195
1428
  context "when saving after the removal" do
1196
1429
 
1197
1430
  before do
1198
- person.save
1431
+ person.save!
1199
1432
  end
1200
1433
 
1201
1434
  it "persists the removal" do
@@ -1293,12 +1526,13 @@ describe Mongoid::Attributes do
1293
1526
  end
1294
1527
 
1295
1528
  context "when setting an attribute that needs type casting" do
1529
+
1296
1530
  let(:person) do
1297
- Person.new(age: "old")
1531
+ Person.new(age: "42")
1298
1532
  end
1299
1533
 
1300
1534
  it "should store the attribute before type cast" do
1301
- expect(person.age_before_type_cast).to eq("old")
1535
+ expect(person.age_before_type_cast).to eq("42")
1302
1536
  end
1303
1537
  end
1304
1538
 
@@ -1338,7 +1572,7 @@ describe Mongoid::Attributes do
1338
1572
  person.write_attribute(:test, "aliased field to test")
1339
1573
  end
1340
1574
 
1341
- it "allows the field name to be udpated" do
1575
+ it "allows the field name to be updated" do
1342
1576
  expect(person.t).to eq("aliased field to test")
1343
1577
  end
1344
1578
  end
@@ -1346,10 +1580,14 @@ describe Mongoid::Attributes do
1346
1580
  context "when attribute is a Hash" do
1347
1581
  let(:person) { Person.new map: { somekey: "somevalue" } }
1348
1582
 
1349
- it "raises an error when try to set an invalid value" do
1350
- expect {
1351
- person.map = []
1352
- }.to raise_error(Mongoid::Errors::InvalidValue)
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
1586
+ end
1587
+
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
1353
1591
  end
1354
1592
 
1355
1593
  it "can set a Hash value" do
@@ -1364,10 +1602,14 @@ describe Mongoid::Attributes do
1364
1602
  expect(person.aliases).to eq([ :alias_1 ])
1365
1603
  end
1366
1604
 
1367
- it "raises an error when try to set an invalid value" do
1368
- expect {
1369
- person.aliases = {}
1370
- }.to raise_error(Mongoid::Errors::InvalidValue)
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
1608
+ end
1609
+
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
1371
1613
  end
1372
1614
  end
1373
1615
 
@@ -1383,6 +1625,95 @@ describe Mongoid::Attributes do
1383
1625
  expect(dictionary.description).to eq('foo')
1384
1626
  end
1385
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
1386
1717
  end
1387
1718
 
1388
1719
  describe "#typed_value_for" do
@@ -1422,7 +1753,7 @@ describe Mongoid::Attributes do
1422
1753
  end
1423
1754
 
1424
1755
  describe "#typed_attributes" do
1425
-
1756
+
1426
1757
  let(:date_time) do
1427
1758
  DateTime.current
1428
1759
  end
@@ -1563,11 +1894,11 @@ describe Mongoid::Attributes do
1563
1894
  end
1564
1895
 
1565
1896
  it "has 3 new entries" do
1566
- expect(pet.vet_visits.count).to eq(3)
1897
+ expect(pet.vet_visits.count).to eq 3
1567
1898
  end
1568
1899
 
1569
1900
  it "persists the changes" do
1570
- expect(pet.reload.vet_visits.count).to eq(3)
1901
+ expect(pet.reload.vet_visits.count).to eq 3
1571
1902
  end
1572
1903
  end
1573
1904
 
@@ -1636,6 +1967,61 @@ describe Mongoid::Attributes do
1636
1967
  end
1637
1968
  end
1638
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
+
1639
2025
  describe "#alias_attribute" do
1640
2026
 
1641
2027
  let(:product) do
@@ -1682,8 +2068,8 @@ describe Mongoid::Attributes do
1682
2068
  end
1683
2069
 
1684
2070
  it "aliases *_before_type_cast" do
1685
- product.cost = "expensive"
1686
- expect(product.cost_before_type_cast).to eq("expensive")
2071
+ product.cost = "42"
2072
+ expect(product.cost_before_type_cast).to eq("42")
1687
2073
  end
1688
2074
  end
1689
2075
 
@@ -1727,7 +2113,7 @@ describe Mongoid::Attributes do
1727
2113
  context "when persisting nil attributes" do
1728
2114
 
1729
2115
  let!(:person) do
1730
- Person.create(score: nil)
2116
+ Person.create!(score: nil)
1731
2117
  end
1732
2118
 
1733
2119
  it "has an entry in the attributes" do
@@ -1742,7 +2128,7 @@ describe Mongoid::Attributes do
1742
2128
  end
1743
2129
 
1744
2130
  it "saves the default" do
1745
- expect { person.save }.to_not raise_error
2131
+ expect { person.save! }.to_not raise_error
1746
2132
  expect(person.last_drink_taken_at).to eq(1.day.ago.in_time_zone("Alaska").to_date)
1747
2133
  end
1748
2134
  end
@@ -1752,7 +2138,7 @@ describe Mongoid::Attributes do
1752
2138
  context "when no value exists in the database" do
1753
2139
 
1754
2140
  let(:person) do
1755
- Person.create
2141
+ Person.create!
1756
2142
  end
1757
2143
 
1758
2144
  it "applies the default value" do
@@ -1765,7 +2151,7 @@ describe Mongoid::Attributes do
1765
2151
  context "when the value is not nil" do
1766
2152
 
1767
2153
  let!(:person) do
1768
- Person.create(age: 50)
2154
+ Person.create!(age: 50)
1769
2155
  end
1770
2156
 
1771
2157
  let(:from_db) do
@@ -1780,7 +2166,7 @@ describe Mongoid::Attributes do
1780
2166
  context "when the value is explicitly nil" do
1781
2167
 
1782
2168
  let!(:person) do
1783
- Person.create(age: nil)
2169
+ Person.create!(age: nil)
1784
2170
  end
1785
2171
 
1786
2172
  let(:from_db) do
@@ -1795,7 +2181,7 @@ describe Mongoid::Attributes do
1795
2181
  context "when the default is a proc" do
1796
2182
 
1797
2183
  let!(:account) do
1798
- Account.create(name: "savings", balance: "100")
2184
+ Account.create!(name: "savings", balance: 100)
1799
2185
  end
1800
2186
 
1801
2187
  let(:from_db) do
@@ -1813,7 +2199,7 @@ describe Mongoid::Attributes do
1813
2199
 
1814
2200
  context 'when the attribute is blank' do
1815
2201
  let(:person) do
1816
- Person.create(title: '')
2202
+ Person.create!(title: '')
1817
2203
  end
1818
2204
 
1819
2205
  it 'returns false' do
@@ -1823,7 +2209,7 @@ describe Mongoid::Attributes do
1823
2209
 
1824
2210
  context 'when the attribute is localized' do
1825
2211
  let(:person) do
1826
- Person.create
2212
+ Person.create!
1827
2213
  end
1828
2214
 
1829
2215
  context 'after initialization when the field is nil' do
@@ -1855,7 +2241,7 @@ describe Mongoid::Attributes do
1855
2241
 
1856
2242
  context 'when the attribute is not localized' do
1857
2243
  let(:person) do
1858
- Person.create(username: 'localized')
2244
+ Person.create!(username: 'localized')
1859
2245
  end
1860
2246
 
1861
2247
  before do
@@ -1867,4 +2253,459 @@ describe Mongoid::Attributes do
1867
2253
  end
1868
2254
  end
1869
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
1870
2711
  end