mongoid 7.2.1 → 9.0.0

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