mongoid 7.2.1 → 9.0.0

Sign up to get free protection for your applications and to get access to all the features.
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