mongoid 7.2.1 → 9.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1082) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +20 -20
  4. data/LICENSE +1 -1
  5. data/README.md +7 -12
  6. data/Rakefile +58 -1
  7. data/lib/config/locales/en.yml +191 -60
  8. data/lib/mongoid/association/accessors.rb +67 -53
  9. data/lib/mongoid/association/bindable.rb +77 -31
  10. data/lib/mongoid/association/builders.rb +8 -14
  11. data/lib/mongoid/association/constrainable.rb +2 -5
  12. data/lib/mongoid/association/depending.rb +20 -12
  13. data/lib/mongoid/association/eager.rb +160 -0
  14. data/lib/mongoid/association/eager_loadable.rb +41 -11
  15. data/lib/mongoid/association/embedded/batchable.rb +63 -52
  16. data/lib/mongoid/association/embedded/cyclic.rb +4 -12
  17. data/lib/mongoid/association/embedded/eager.rb +23 -0
  18. data/lib/mongoid/association/embedded/embedded_in/binding.rb +29 -13
  19. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +3 -5
  20. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +25 -23
  21. data/lib/mongoid/association/embedded/embedded_in.rb +11 -26
  22. data/lib/mongoid/association/embedded/embeds_many/binding.rb +4 -9
  23. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +5 -6
  24. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +226 -203
  25. data/lib/mongoid/association/embedded/embeds_many.rb +3 -33
  26. data/lib/mongoid/association/embedded/embeds_one/binding.rb +3 -9
  27. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +20 -8
  28. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +131 -42
  29. data/lib/mongoid/association/embedded/embeds_one.rb +4 -30
  30. data/lib/mongoid/association/embedded.rb +2 -1
  31. data/lib/mongoid/association/macros.rb +47 -16
  32. data/lib/mongoid/association/many.rb +12 -24
  33. data/lib/mongoid/association/marshalable.rb +4 -5
  34. data/lib/mongoid/association/nested/many.rb +14 -19
  35. data/lib/mongoid/association/nested/nested_buildable.rb +36 -13
  36. data/lib/mongoid/association/nested/one.rb +54 -26
  37. data/lib/mongoid/association/nested.rb +1 -3
  38. data/lib/mongoid/association/one.rb +3 -11
  39. data/lib/mongoid/association/options.rb +18 -44
  40. data/lib/mongoid/association/proxy.rb +49 -42
  41. data/lib/mongoid/association/referenced/auto_save.rb +11 -15
  42. data/lib/mongoid/association/referenced/belongs_to/binding.rb +2 -7
  43. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +6 -6
  44. data/lib/mongoid/association/referenced/belongs_to/eager.rb +2 -2
  45. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +23 -32
  46. data/lib/mongoid/association/referenced/belongs_to.rb +13 -37
  47. data/lib/mongoid/association/referenced/counter_cache.rb +18 -26
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +15 -8
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +1 -3
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +2 -2
  51. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +191 -123
  52. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +23 -42
  53. data/lib/mongoid/association/referenced/has_many/binding.rb +1 -5
  54. data/lib/mongoid/association/referenced/has_many/buildable.rb +1 -3
  55. data/lib/mongoid/association/referenced/has_many/eager.rb +2 -2
  56. data/lib/mongoid/association/referenced/has_many/enumerable.rb +471 -496
  57. data/lib/mongoid/association/referenced/has_many/proxy.rb +182 -179
  58. data/lib/mongoid/association/referenced/has_many.rb +17 -43
  59. data/lib/mongoid/association/referenced/has_one/binding.rb +1 -7
  60. data/lib/mongoid/association/referenced/has_one/buildable.rb +5 -5
  61. data/lib/mongoid/association/referenced/has_one/eager.rb +3 -4
  62. data/lib/mongoid/association/referenced/has_one/proxy.rb +38 -41
  63. data/lib/mongoid/association/referenced/has_one.rb +17 -36
  64. data/lib/mongoid/association/referenced/syncable.rb +11 -27
  65. data/lib/mongoid/association/referenced.rb +1 -1
  66. data/lib/mongoid/association/reflections.rb +9 -9
  67. data/lib/mongoid/association/relatable.rb +55 -74
  68. data/lib/mongoid/association.rb +10 -22
  69. data/lib/mongoid/atomic/modifiers.rb +7 -53
  70. data/lib/mongoid/atomic/paths/embedded/many.rb +20 -5
  71. data/lib/mongoid/atomic/paths/embedded/one.rb +1 -5
  72. data/lib/mongoid/atomic/paths/embedded.rb +1 -3
  73. data/lib/mongoid/atomic/paths/root.rb +1 -5
  74. data/lib/mongoid/atomic/paths.rb +1 -1
  75. data/lib/mongoid/atomic.rb +39 -86
  76. data/lib/mongoid/atomic_update_preparer.rb +88 -0
  77. data/lib/mongoid/attributes/dynamic.rb +5 -21
  78. data/lib/mongoid/attributes/embedded.rb +34 -0
  79. data/lib/mongoid/attributes/nested.rb +9 -13
  80. data/lib/mongoid/attributes/processing.rb +43 -28
  81. data/lib/mongoid/attributes/projector.rb +120 -0
  82. data/lib/mongoid/attributes/readonly.rb +4 -8
  83. data/lib/mongoid/attributes.rb +85 -89
  84. data/lib/mongoid/cacheable.rb +5 -9
  85. data/lib/mongoid/changeable.rb +183 -97
  86. data/lib/mongoid/clients/factory.rb +58 -15
  87. data/lib/mongoid/clients/options.rb +117 -8
  88. data/lib/mongoid/clients/sessions.rb +246 -84
  89. data/lib/mongoid/clients/storage_options.rb +37 -11
  90. data/lib/mongoid/clients/validators/storage.rb +4 -24
  91. data/lib/mongoid/clients/validators.rb +1 -1
  92. data/lib/mongoid/clients.rb +37 -14
  93. data/lib/mongoid/collection_configurable.rb +59 -0
  94. data/lib/mongoid/composable.rb +7 -7
  95. data/lib/mongoid/config/defaults.rb +40 -0
  96. data/lib/mongoid/config/encryption.rb +213 -0
  97. data/lib/mongoid/config/environment.rb +25 -5
  98. data/lib/mongoid/config/introspection.rb +152 -0
  99. data/lib/mongoid/config/options.rb +11 -14
  100. data/lib/mongoid/config/validators/async_query_executor.rb +34 -0
  101. data/lib/mongoid/config/validators/client.rb +7 -23
  102. data/lib/mongoid/config/validators/option.rb +1 -3
  103. data/lib/mongoid/config/validators.rb +2 -1
  104. data/lib/mongoid/config.rb +183 -46
  105. data/lib/mongoid/contextual/aggregable/memory.rb +38 -26
  106. data/lib/mongoid/contextual/aggregable/mongo.rb +26 -32
  107. data/lib/mongoid/contextual/aggregable/none.rb +66 -0
  108. data/lib/mongoid/contextual/aggregable.rb +18 -0
  109. data/lib/mongoid/contextual/atomic.rb +97 -30
  110. data/lib/mongoid/contextual/command.rb +3 -5
  111. data/lib/mongoid/contextual/map_reduce.rb +8 -33
  112. data/lib/mongoid/contextual/memory.rb +396 -89
  113. data/lib/mongoid/contextual/mongo/documents_loader.rb +178 -0
  114. data/lib/mongoid/contextual/mongo.rb +640 -311
  115. data/lib/mongoid/contextual/none.rb +244 -30
  116. data/lib/mongoid/contextual/queryable.rb +5 -4
  117. data/lib/mongoid/contextual.rb +18 -7
  118. data/lib/mongoid/copyable.rb +34 -14
  119. data/lib/mongoid/criteria/findable.rb +52 -22
  120. data/lib/mongoid/criteria/includable.rb +31 -34
  121. data/lib/mongoid/criteria/inspectable.rb +4 -3
  122. data/lib/mongoid/criteria/marshalable.rb +14 -7
  123. data/lib/mongoid/criteria/modifiable.rb +5 -19
  124. data/lib/mongoid/criteria/options.rb +1 -3
  125. data/lib/mongoid/criteria/permission.rb +6 -2
  126. data/lib/mongoid/criteria/queryable/aggregable.rb +3 -15
  127. data/lib/mongoid/criteria/queryable/expandable.rb +1 -25
  128. data/lib/mongoid/criteria/queryable/extensions/array.rb +6 -41
  129. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -9
  130. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +5 -7
  131. data/lib/mongoid/criteria/queryable/extensions/date.rb +10 -11
  132. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +8 -7
  133. data/lib/mongoid/criteria/queryable/extensions/hash.rb +3 -41
  134. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +2 -14
  135. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +3 -21
  136. data/lib/mongoid/criteria/queryable/extensions/object.rb +7 -30
  137. data/lib/mongoid/criteria/queryable/extensions/range.rb +48 -17
  138. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +10 -13
  139. data/lib/mongoid/criteria/queryable/extensions/set.rb +3 -5
  140. data/lib/mongoid/criteria/queryable/extensions/string.rb +19 -34
  141. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +6 -22
  142. data/lib/mongoid/criteria/queryable/extensions/time.rb +8 -9
  143. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +9 -9
  144. data/lib/mongoid/criteria/queryable/extensions.rb +1 -5
  145. data/lib/mongoid/criteria/queryable/key.rb +15 -18
  146. data/lib/mongoid/criteria/queryable/macroable.rb +1 -3
  147. data/lib/mongoid/criteria/queryable/mergeable.rb +69 -50
  148. data/lib/mongoid/criteria/queryable/optional.rb +12 -62
  149. data/lib/mongoid/criteria/queryable/options.rb +3 -21
  150. data/lib/mongoid/criteria/queryable/pipeline.rb +2 -14
  151. data/lib/mongoid/criteria/queryable/selectable.rb +87 -124
  152. data/lib/mongoid/criteria/queryable/selector.rb +96 -25
  153. data/lib/mongoid/criteria/queryable/smash.rb +41 -18
  154. data/lib/mongoid/criteria/queryable/storable.rb +14 -9
  155. data/lib/mongoid/criteria/queryable.rb +12 -13
  156. data/lib/mongoid/criteria/scopable.rb +32 -21
  157. data/lib/mongoid/criteria/translator.rb +46 -0
  158. data/lib/mongoid/criteria.rb +60 -109
  159. data/lib/mongoid/deprecable.rb +38 -0
  160. data/lib/mongoid/deprecation.rb +29 -0
  161. data/lib/mongoid/document.rb +263 -173
  162. data/lib/mongoid/encryptable.rb +53 -0
  163. data/lib/mongoid/equality.rb +22 -25
  164. data/lib/mongoid/errors/ambiguous_relationship.rb +3 -5
  165. data/lib/mongoid/errors/attribute_not_loaded.rb +34 -0
  166. data/lib/mongoid/errors/callback.rb +1 -3
  167. data/lib/mongoid/errors/create_collection_failure.rb +34 -0
  168. data/lib/mongoid/errors/criteria_argument_required.rb +1 -1
  169. data/lib/mongoid/errors/delete_restriction.rb +9 -12
  170. data/lib/mongoid/errors/document_not_destroyed.rb +3 -7
  171. data/lib/mongoid/errors/document_not_found.rb +34 -21
  172. data/lib/mongoid/errors/drop_collection_failure.rb +28 -0
  173. data/lib/mongoid/errors/empty_config_file.rb +26 -0
  174. data/lib/mongoid/errors/immutable_attribute.rb +27 -0
  175. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -3
  176. data/lib/mongoid/errors/invalid_async_query_executor.rb +26 -0
  177. data/lib/mongoid/errors/invalid_auto_encryption_configuration.rb +33 -0
  178. data/lib/mongoid/errors/invalid_collection.rb +1 -1
  179. data/lib/mongoid/errors/invalid_config_file.rb +26 -0
  180. data/lib/mongoid/errors/invalid_config_option.rb +2 -4
  181. data/lib/mongoid/errors/invalid_dependent_strategy.rb +2 -4
  182. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +1 -1
  183. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +24 -0
  184. data/lib/mongoid/errors/invalid_elem_match_operator.rb +1 -1
  185. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +6 -5
  186. data/lib/mongoid/errors/invalid_estimated_count_scoping.rb +27 -0
  187. data/lib/mongoid/errors/invalid_expression_operator.rb +1 -1
  188. data/lib/mongoid/errors/invalid_field.rb +7 -7
  189. data/lib/mongoid/errors/invalid_field_operator.rb +1 -1
  190. data/lib/mongoid/errors/invalid_field_option.rb +1 -3
  191. data/lib/mongoid/errors/invalid_field_type.rb +27 -0
  192. data/lib/mongoid/errors/invalid_find.rb +1 -3
  193. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +23 -0
  194. data/lib/mongoid/errors/invalid_includes.rb +1 -3
  195. data/lib/mongoid/errors/invalid_index.rb +1 -3
  196. data/lib/mongoid/errors/invalid_options.rb +1 -3
  197. data/lib/mongoid/errors/invalid_path.rb +1 -3
  198. data/lib/mongoid/errors/invalid_persistence_option.rb +1 -5
  199. data/lib/mongoid/errors/invalid_query.rb +1 -1
  200. data/lib/mongoid/errors/invalid_relation.rb +2 -8
  201. data/lib/mongoid/errors/invalid_relation_option.rb +2 -4
  202. data/lib/mongoid/errors/invalid_scope.rb +1 -3
  203. data/lib/mongoid/errors/invalid_session_nesting.rb +17 -0
  204. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +1 -2
  205. data/lib/mongoid/errors/invalid_storage_options.rb +2 -4
  206. data/lib/mongoid/errors/invalid_time.rb +1 -3
  207. data/lib/mongoid/errors/invalid_transaction_nesting.rb +17 -0
  208. data/lib/mongoid/errors/inverse_not_found.rb +1 -3
  209. data/lib/mongoid/errors/mixed_client_configuration.rb +1 -3
  210. data/lib/mongoid/errors/mixed_relations.rb +1 -3
  211. data/lib/mongoid/errors/mongoid_error.rb +8 -16
  212. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +2 -4
  213. data/lib/mongoid/errors/no_client_config.rb +1 -3
  214. data/lib/mongoid/errors/no_client_database.rb +2 -4
  215. data/lib/mongoid/errors/no_client_hosts.rb +2 -4
  216. data/lib/mongoid/errors/no_clients_config.rb +1 -3
  217. data/lib/mongoid/errors/no_default_client.rb +1 -3
  218. data/lib/mongoid/errors/no_environment.rb +1 -3
  219. data/lib/mongoid/errors/no_map_reduce_output.rb +1 -3
  220. data/lib/mongoid/errors/no_metadata.rb +1 -3
  221. data/lib/mongoid/errors/no_parent.rb +1 -3
  222. data/lib/mongoid/errors/readonly_attribute.rb +2 -4
  223. data/lib/mongoid/errors/readonly_document.rb +2 -6
  224. data/lib/mongoid/errors/rollback.rb +15 -0
  225. data/lib/mongoid/errors/scope_overwrite.rb +1 -1
  226. data/lib/mongoid/errors/sessions_not_supported.rb +17 -0
  227. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +2 -2
  228. data/lib/mongoid/errors/transaction_error.rb +25 -0
  229. data/lib/mongoid/errors/transactions_not_supported.rb +17 -0
  230. data/lib/mongoid/errors/unknown_attribute.rb +2 -4
  231. data/lib/mongoid/errors/unknown_model.rb +1 -3
  232. data/lib/mongoid/errors/unsaved_document.rb +2 -2
  233. data/lib/mongoid/errors/unsupported_javascript.rb +1 -3
  234. data/lib/mongoid/errors/validations.rb +1 -1
  235. data/lib/mongoid/errors.rb +18 -5
  236. data/lib/mongoid/evolvable.rb +2 -4
  237. data/lib/mongoid/extensions/array.rb +20 -58
  238. data/lib/mongoid/extensions/big_decimal.rb +44 -24
  239. data/lib/mongoid/extensions/binary.rb +45 -0
  240. data/lib/mongoid/extensions/boolean.rb +11 -6
  241. data/lib/mongoid/extensions/date.rb +31 -29
  242. data/lib/mongoid/extensions/date_time.rb +5 -16
  243. data/lib/mongoid/extensions/decimal128.rb +3 -5
  244. data/lib/mongoid/extensions/false_class.rb +8 -10
  245. data/lib/mongoid/extensions/float.rb +11 -12
  246. data/lib/mongoid/extensions/hash.rb +28 -148
  247. data/lib/mongoid/extensions/integer.rb +13 -14
  248. data/lib/mongoid/extensions/module.rb +5 -5
  249. data/lib/mongoid/extensions/nil_class.rb +5 -7
  250. data/lib/mongoid/extensions/object.rb +32 -81
  251. data/lib/mongoid/extensions/object_id.rb +3 -7
  252. data/lib/mongoid/extensions/range.rb +47 -24
  253. data/lib/mongoid/extensions/raw_value.rb +34 -0
  254. data/lib/mongoid/extensions/regexp.rb +14 -7
  255. data/lib/mongoid/extensions/set.rb +24 -13
  256. data/lib/mongoid/extensions/string.rb +30 -62
  257. data/lib/mongoid/extensions/symbol.rb +9 -22
  258. data/lib/mongoid/extensions/time.rb +30 -40
  259. data/lib/mongoid/extensions/time_with_zone.rb +18 -11
  260. data/lib/mongoid/extensions/true_class.rb +8 -10
  261. data/lib/mongoid/extensions.rb +3 -20
  262. data/lib/mongoid/factory.rb +178 -37
  263. data/lib/mongoid/fields/encrypted.rb +48 -0
  264. data/lib/mongoid/fields/foreign_key.rb +39 -27
  265. data/lib/mongoid/fields/localized.rb +25 -15
  266. data/lib/mongoid/fields/standard.rb +22 -40
  267. data/lib/mongoid/fields/validators/macro.rb +6 -19
  268. data/lib/mongoid/fields/validators.rb +1 -1
  269. data/lib/mongoid/fields.rb +354 -76
  270. data/lib/mongoid/findable.rb +62 -22
  271. data/lib/mongoid/indexable/specification.rb +55 -34
  272. data/lib/mongoid/indexable/validators/options.rb +7 -9
  273. data/lib/mongoid/indexable.rb +2 -18
  274. data/lib/mongoid/inspectable.rb +34 -11
  275. data/lib/mongoid/interceptable.rb +197 -41
  276. data/lib/mongoid/loadable.rb +83 -0
  277. data/lib/mongoid/loggable.rb +1 -9
  278. data/lib/mongoid/matchable.rb +2 -6
  279. data/lib/mongoid/matcher/all.rb +15 -0
  280. data/lib/mongoid/matcher/and.rb +14 -0
  281. data/lib/mongoid/matcher/bits.rb +60 -0
  282. data/lib/mongoid/matcher/bits_all_clear.rb +41 -0
  283. data/lib/mongoid/matcher/bits_all_set.rb +41 -0
  284. data/lib/mongoid/matcher/bits_any_clear.rb +41 -0
  285. data/lib/mongoid/matcher/bits_any_set.rb +41 -0
  286. data/lib/mongoid/matcher/elem_match.rb +17 -1
  287. data/lib/mongoid/matcher/elem_match_expression.rb +14 -2
  288. data/lib/mongoid/matcher/eq.rb +15 -0
  289. data/lib/mongoid/matcher/eq_impl.rb +54 -2
  290. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +18 -1
  291. data/lib/mongoid/matcher/exists.rb +15 -0
  292. data/lib/mongoid/matcher/expression.rb +22 -14
  293. data/lib/mongoid/matcher/expression_operator.rb +14 -0
  294. data/lib/mongoid/matcher/field_expression.rb +19 -5
  295. data/lib/mongoid/matcher/field_operator.rb +30 -0
  296. data/lib/mongoid/matcher/gt.rb +15 -0
  297. data/lib/mongoid/matcher/gte.rb +15 -0
  298. data/lib/mongoid/matcher/in.rb +15 -0
  299. data/lib/mongoid/matcher/lt.rb +15 -0
  300. data/lib/mongoid/matcher/lte.rb +15 -0
  301. data/lib/mongoid/matcher/mod.rb +33 -0
  302. data/lib/mongoid/matcher/ne.rb +15 -0
  303. data/lib/mongoid/matcher/nin.rb +15 -0
  304. data/lib/mongoid/matcher/nor.rb +14 -0
  305. data/lib/mongoid/matcher/not.rb +16 -0
  306. data/lib/mongoid/matcher/or.rb +14 -0
  307. data/lib/mongoid/matcher/regex.rb +24 -0
  308. data/lib/mongoid/matcher/size.rb +16 -0
  309. data/lib/mongoid/matcher/type.rb +124 -0
  310. data/lib/mongoid/matcher.rb +59 -52
  311. data/lib/mongoid/persistable/creatable.rb +25 -29
  312. data/lib/mongoid/persistable/deletable.rb +10 -23
  313. data/lib/mongoid/persistable/destroyable.rb +37 -11
  314. data/lib/mongoid/persistable/incrementable.rb +2 -6
  315. data/lib/mongoid/persistable/logical.rb +1 -5
  316. data/lib/mongoid/persistable/maxable.rb +37 -0
  317. data/lib/mongoid/persistable/minable.rb +37 -0
  318. data/lib/mongoid/persistable/multipliable.rb +36 -0
  319. data/lib/mongoid/persistable/poppable.rb +1 -5
  320. data/lib/mongoid/persistable/pullable.rb +1 -7
  321. data/lib/mongoid/persistable/pushable.rb +1 -7
  322. data/lib/mongoid/persistable/renamable.rb +1 -5
  323. data/lib/mongoid/persistable/savable.rb +14 -8
  324. data/lib/mongoid/persistable/settable.rb +1 -5
  325. data/lib/mongoid/persistable/unsettable.rb +3 -7
  326. data/lib/mongoid/persistable/updatable.rb +114 -28
  327. data/lib/mongoid/persistable/upsertable.rb +33 -8
  328. data/lib/mongoid/persistable.rb +17 -27
  329. data/lib/mongoid/persistence_context.rb +111 -43
  330. data/lib/mongoid/positional.rb +1 -5
  331. data/lib/mongoid/railtie.rb +23 -15
  332. data/lib/mongoid/railties/bson_object_id_serializer.rb +39 -0
  333. data/lib/mongoid/railties/console_sandbox.rb +42 -0
  334. data/lib/mongoid/railties/controller_runtime.rb +21 -6
  335. data/lib/mongoid/railties/database.rake +19 -2
  336. data/lib/mongoid/reloadable.rb +45 -42
  337. data/lib/mongoid/scopable.rb +25 -53
  338. data/lib/mongoid/search_indexable.rb +167 -0
  339. data/lib/mongoid/selectable.rb +6 -17
  340. data/lib/mongoid/serializable.rb +11 -21
  341. data/lib/mongoid/shardable.rb +50 -16
  342. data/lib/mongoid/stateful.rb +66 -22
  343. data/lib/mongoid/stringified_symbol.rb +19 -7
  344. data/lib/mongoid/tasks/database.rake +25 -0
  345. data/lib/mongoid/tasks/database.rb +84 -8
  346. data/lib/mongoid/tasks/encryption.rake +59 -0
  347. data/lib/mongoid/tasks/encryption.rb +108 -0
  348. data/lib/mongoid/threaded/lifecycle.rb +6 -26
  349. data/lib/mongoid/threaded.rb +131 -92
  350. data/lib/mongoid/timestamps/created/short.rb +1 -1
  351. data/lib/mongoid/timestamps/created.rb +4 -4
  352. data/lib/mongoid/timestamps/short.rb +1 -1
  353. data/lib/mongoid/timestamps/timeless.rb +29 -7
  354. data/lib/mongoid/timestamps/updated/short.rb +1 -1
  355. data/lib/mongoid/timestamps/updated.rb +3 -5
  356. data/lib/mongoid/timestamps.rb +1 -1
  357. data/lib/mongoid/touchable.rb +155 -29
  358. data/lib/mongoid/traversable.rb +180 -125
  359. data/lib/mongoid/utils.rb +52 -0
  360. data/lib/mongoid/validatable/associated.rb +97 -21
  361. data/lib/mongoid/validatable/format.rb +1 -1
  362. data/lib/mongoid/validatable/length.rb +1 -1
  363. data/lib/mongoid/validatable/localizable.rb +2 -4
  364. data/lib/mongoid/validatable/macros.rb +10 -14
  365. data/lib/mongoid/validatable/presence.rb +7 -13
  366. data/lib/mongoid/validatable/queryable.rb +9 -3
  367. data/lib/mongoid/validatable/uniqueness.rb +26 -39
  368. data/lib/mongoid/validatable.rb +20 -29
  369. data/lib/mongoid/version.rb +2 -2
  370. data/lib/mongoid/warnings.rb +37 -0
  371. data/lib/mongoid.rb +56 -22
  372. data/lib/rails/generators/mongoid/config/config_generator.rb +25 -5
  373. data/lib/rails/generators/mongoid/config/templates/mongoid.rb +25 -0
  374. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +44 -64
  375. data/lib/rails/generators/mongoid/model/model_generator.rb +4 -1
  376. data/lib/rails/generators/mongoid_generator.rb +13 -1
  377. data/lib/rails/mongoid.rb +4 -32
  378. data/spec/config/mongoid.yml +16 -1
  379. data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
  380. data/spec/integration/active_job_spec.rb +32 -0
  381. data/spec/integration/app_spec.rb +180 -89
  382. data/spec/integration/associations/belongs_to_spec.rb +19 -1
  383. data/spec/integration/associations/embedded_dirty_spec.rb +58 -0
  384. data/spec/integration/associations/embedded_spec.rb +90 -7
  385. data/spec/integration/associations/embeds_many_spec.rb +197 -1
  386. data/spec/integration/associations/embeds_one_spec.rb +19 -1
  387. data/spec/integration/associations/foreign_key_spec.rb +10 -1
  388. data/spec/integration/associations/foreign_key_spec_models.rb +1 -1
  389. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +62 -0
  390. data/spec/integration/associations/has_many_spec.rb +1 -1
  391. data/spec/integration/associations/has_one_spec.rb +145 -1
  392. data/spec/integration/associations/nested_attributes_assignment_spec.rb +1 -1
  393. data/spec/integration/associations/reverse_population_spec.rb +1 -1
  394. data/spec/integration/associations/reverse_population_spec_models.rb +1 -1
  395. data/spec/integration/associations/scope_option_spec.rb +102 -0
  396. data/spec/integration/atomic/modifiers_spec.rb +1 -1
  397. data/spec/integration/bson_regexp_raw_spec.rb +1 -1
  398. data/spec/integration/callbacks_models.rb +147 -3
  399. data/spec/integration/callbacks_spec.rb +398 -8
  400. data/spec/integration/contextual/empty_spec.rb +142 -0
  401. data/spec/integration/criteria/alias_query_spec.rb +98 -0
  402. data/spec/integration/criteria/date_field_spec.rb +2 -2
  403. data/spec/integration/criteria/default_scope_spec.rb +52 -0
  404. data/spec/integration/criteria/logical_spec.rb +12 -0
  405. data/spec/integration/criteria/range_spec.rb +358 -0
  406. data/spec/integration/criteria/raw_value_spec.rb +525 -0
  407. data/spec/integration/criteria/time_with_zone_spec.rb +126 -15
  408. data/spec/integration/discriminator_key_spec.rb +119 -81
  409. data/spec/integration/discriminator_value_spec.rb +1 -1
  410. data/spec/integration/document_spec.rb +31 -1
  411. data/spec/integration/dots_and_dollars_spec.rb +278 -0
  412. data/spec/integration/encryption_spec.rb +100 -0
  413. data/spec/integration/i18n_fallbacks_spec.rb +10 -52
  414. data/spec/integration/matcher_examples_spec.rb +21 -14
  415. data/spec/integration/matcher_operator_data/bits_all_clear.yml +144 -0
  416. data/spec/integration/matcher_operator_data/bits_all_set.yml +144 -0
  417. data/spec/integration/matcher_operator_data/bits_any_clear.yml +144 -0
  418. data/spec/integration/matcher_operator_data/bits_any_set.yml +144 -0
  419. data/spec/integration/matcher_operator_data/comment.yml +22 -0
  420. data/spec/integration/matcher_operator_data/elem_match.yml +46 -0
  421. data/spec/integration/matcher_operator_data/implicit_traversal.yml +96 -0
  422. data/spec/integration/matcher_operator_data/in.yml +16 -0
  423. data/spec/integration/matcher_operator_data/mod.yml +55 -0
  424. data/spec/integration/matcher_operator_data/size.yml +0 -3
  425. data/spec/integration/matcher_operator_data/type.yml +64 -0
  426. data/spec/integration/matcher_operator_data/type_array.yml +15 -0
  427. data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
  428. data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
  429. data/spec/integration/matcher_operator_data/type_code.yml +26 -0
  430. data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
  431. data/spec/integration/matcher_operator_data/type_date.yml +39 -0
  432. data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
  433. data/spec/integration/matcher_operator_data/type_decimal.yml +37 -0
  434. data/spec/integration/matcher_operator_data/type_double.yml +15 -0
  435. data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
  436. data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
  437. data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
  438. data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
  439. data/spec/integration/matcher_operator_data/type_null.yml +23 -0
  440. data/spec/integration/matcher_operator_data/type_object.yml +23 -0
  441. data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
  442. data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
  443. data/spec/integration/matcher_operator_data/type_string.yml +15 -0
  444. data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
  445. data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
  446. data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
  447. data/spec/integration/matcher_operator_spec.rb +26 -3
  448. data/spec/integration/matcher_spec.rb +50 -1
  449. data/spec/integration/persistence/range_field_spec.rb +351 -0
  450. data/spec/integration/server_query_spec.rb +1 -1
  451. data/spec/integration/shardable_spec.rb +1 -1
  452. data/spec/integration/stringified_symbol_field_spec.rb +17 -3
  453. data/spec/lite_spec_helper.rb +47 -14
  454. data/spec/mongoid/association/accessors_spec.rb +31 -19
  455. data/spec/mongoid/association/auto_save_spec.rb +73 -34
  456. data/spec/mongoid/association/builders_spec.rb +2 -2
  457. data/spec/mongoid/association/constrainable_spec.rb +1 -1
  458. data/spec/mongoid/association/counter_cache_spec.rb +34 -34
  459. data/spec/mongoid/association/depending_spec.rb +397 -358
  460. data/spec/mongoid/association/eager_spec.rb +56 -6
  461. data/spec/mongoid/association/embedded/cyclic_spec.rb +3 -3
  462. data/spec/mongoid/association/embedded/dirty_spec.rb +3 -3
  463. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +3 -2
  464. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +55 -1
  465. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +110 -23
  466. data/spec/mongoid/association/embedded/embedded_in_spec.rb +19 -8
  467. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +1 -1
  468. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +113 -1
  469. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +712 -203
  470. data/spec/mongoid/association/embedded/embeds_many_models.rb +189 -1
  471. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +14 -2
  472. data/spec/mongoid/association/embedded/embeds_many_spec.rb +69 -1
  473. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +1 -1
  474. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +26 -1
  475. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +37 -24
  476. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +1 -1
  477. data/spec/mongoid/association/embedded/embeds_one_models.rb +25 -2
  478. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +2 -2
  479. data/spec/mongoid/association/embedded/embeds_one_spec.rb +29 -1
  480. data/spec/mongoid/association/macros_spec.rb +10 -10
  481. data/spec/mongoid/association/nested/many_spec.rb +1 -1
  482. data/spec/mongoid/association/nested/one_spec.rb +17 -13
  483. data/spec/mongoid/association/options_spec.rb +1 -1
  484. data/spec/mongoid/association/polymorphic_spec.rb +1 -1
  485. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +3 -2
  486. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +110 -17
  487. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +51 -15
  488. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +113 -59
  489. data/spec/mongoid/association/referenced/belongs_to_models.rb +12 -0
  490. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +22 -2
  491. data/spec/mongoid/association/referenced/belongs_to_spec.rb +27 -22
  492. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +2 -2
  493. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +28 -3
  494. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +32 -3
  495. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +1 -1
  496. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +386 -376
  497. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +44 -1
  498. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +2 -2
  499. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +57 -3
  500. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +2 -2
  501. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +131 -1
  502. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +24 -7
  503. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +313 -134
  504. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +1 -1
  505. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +1313 -2109
  506. data/spec/mongoid/association/referenced/has_many_models.rb +39 -2
  507. data/spec/mongoid/association/referenced/has_many_query_spec.rb +2 -2
  508. data/spec/mongoid/association/referenced/has_many_spec.rb +47 -1
  509. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +1 -1
  510. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +54 -10
  511. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +18 -2
  512. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +134 -28
  513. data/spec/mongoid/association/referenced/has_one_models.rb +43 -1
  514. data/spec/mongoid/association/referenced/has_one_query_spec.rb +2 -2
  515. data/spec/mongoid/association/referenced/has_one_spec.rb +22 -1
  516. data/spec/mongoid/association/reflections_spec.rb +1 -1
  517. data/spec/mongoid/association/syncable_spec.rb +47 -33
  518. data/spec/mongoid/association_spec.rb +1 -1
  519. data/spec/mongoid/atomic/modifiers_spec.rb +1 -1
  520. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +1 -1
  521. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +1 -1
  522. data/spec/mongoid/atomic/paths/root_spec.rb +1 -1
  523. data/spec/mongoid/atomic/paths_spec.rb +65 -27
  524. data/spec/mongoid/atomic_spec.rb +29 -7
  525. data/spec/mongoid/atomic_update_preparer_spec.rb +83 -0
  526. data/spec/mongoid/attributes/dynamic_spec.rb +1 -1
  527. data/spec/mongoid/attributes/embedded_spec.rb +118 -0
  528. data/spec/mongoid/attributes/nested_spec.rb +147 -78
  529. data/spec/mongoid/attributes/nested_spec_models.rb +49 -0
  530. data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
  531. data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
  532. data/spec/mongoid/attributes/projector_spec.rb +41 -0
  533. data/spec/mongoid/attributes/readonly_spec.rb +23 -23
  534. data/spec/mongoid/attributes_spec.rb +921 -69
  535. data/spec/mongoid/cacheable_spec.rb +5 -5
  536. data/spec/mongoid/changeable_spec.rb +468 -76
  537. data/spec/mongoid/clients/factory_spec.rb +152 -30
  538. data/spec/mongoid/clients/options_spec.rb +24 -12
  539. data/spec/mongoid/clients/sessions_spec.rb +49 -71
  540. data/spec/mongoid/clients/transactions_spec.rb +971 -176
  541. data/spec/mongoid/clients/transactions_spec_models.rb +159 -0
  542. data/spec/mongoid/clients_spec.rb +230 -22
  543. data/spec/mongoid/collection_configurable_spec.rb +159 -0
  544. data/spec/mongoid/composable_spec.rb +1 -1
  545. data/spec/mongoid/config/defaults_spec.rb +99 -0
  546. data/spec/mongoid/config/encryption_spec.rb +152 -0
  547. data/spec/mongoid/config/environment_spec.rb +126 -39
  548. data/spec/mongoid/config/introspection_spec.rb +114 -0
  549. data/spec/mongoid/config/options_spec.rb +1 -1
  550. data/spec/mongoid/config_spec.rb +375 -43
  551. data/spec/mongoid/contextual/aggregable/memory_spec.rb +432 -154
  552. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  553. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +63 -0
  554. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +95 -20
  555. data/spec/mongoid/contextual/aggregable/none_spec.rb +49 -0
  556. data/spec/mongoid/contextual/atomic_spec.rb +329 -87
  557. data/spec/mongoid/contextual/map_reduce_spec.rb +5 -19
  558. data/spec/mongoid/contextual/memory_spec.rb +1479 -127
  559. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +194 -0
  560. data/spec/mongoid/contextual/mongo_spec.rb +3374 -1254
  561. data/spec/mongoid/contextual/none_spec.rb +79 -68
  562. data/spec/mongoid/copyable_spec.rb +465 -23
  563. data/spec/mongoid/copyable_spec_models.rb +1 -1
  564. data/spec/mongoid/criteria/findable_spec.rb +295 -229
  565. data/spec/mongoid/criteria/includable_spec.rb +1493 -0
  566. data/spec/mongoid/criteria/includable_spec_models.rb +55 -0
  567. data/spec/mongoid/criteria/inspectable_spec.rb +1 -1
  568. data/spec/mongoid/criteria/marshalable_spec.rb +19 -2
  569. data/spec/mongoid/criteria/modifiable_spec.rb +38 -38
  570. data/spec/mongoid/criteria/options_spec.rb +1 -1
  571. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +2 -2
  572. data/spec/mongoid/criteria/queryable/expandable_spec.rb +1 -74
  573. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +8 -20
  574. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +135 -27
  575. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +2 -2
  576. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +32 -12
  577. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +12 -1
  578. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +1 -1
  579. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +1 -16
  580. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +1 -1
  581. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +1 -1
  582. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +74 -8
  583. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +1 -1
  584. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +238 -179
  585. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +1 -12
  586. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +1 -12
  587. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +1 -1
  588. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +48 -132
  589. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +5 -60
  590. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +12 -1
  591. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +12 -1
  592. data/spec/mongoid/criteria/queryable/key_spec.rb +1 -1
  593. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +106 -8
  594. data/spec/mongoid/criteria/queryable/optional_spec.rb +17 -486
  595. data/spec/mongoid/criteria/queryable/options_spec.rb +2 -2
  596. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +1 -1
  597. data/spec/mongoid/criteria/queryable/queryable_spec.rb +2 -2
  598. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +700 -26
  599. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +39 -0
  600. data/spec/mongoid/criteria/queryable/selectable_spec.rb +149 -683
  601. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +590 -0
  602. data/spec/mongoid/criteria/queryable/selector_spec.rb +186 -6
  603. data/spec/mongoid/criteria/queryable/smash_spec.rb +1 -1
  604. data/spec/mongoid/criteria/queryable/storable_spec.rb +87 -1
  605. data/spec/mongoid/criteria/scopable_spec.rb +128 -1
  606. data/spec/mongoid/criteria/translator_spec.rb +133 -0
  607. data/spec/mongoid/criteria_projection_spec.rb +407 -0
  608. data/spec/mongoid/criteria_spec.rb +1029 -1806
  609. data/spec/mongoid/document_fields_spec.rb +180 -5
  610. data/spec/mongoid/document_persistence_context_spec.rb +77 -1
  611. data/spec/mongoid/document_query_spec.rb +55 -4
  612. data/spec/mongoid/document_spec.rb +43 -172
  613. data/spec/mongoid/equality_spec.rb +7 -8
  614. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +1 -1
  615. data/spec/mongoid/errors/attribute_not_loaded_spec.rb +32 -0
  616. data/spec/mongoid/errors/callback_spec.rb +1 -1
  617. data/spec/mongoid/errors/delete_restriction_spec.rb +2 -2
  618. data/spec/mongoid/errors/document_not_destroyed_spec.rb +1 -1
  619. data/spec/mongoid/errors/document_not_found_spec.rb +77 -1
  620. data/spec/mongoid/errors/invalid_collection_spec.rb +1 -1
  621. data/spec/mongoid/errors/{eager_load_spec.rb → invalid_config_file_spec.rb} +6 -6
  622. data/spec/mongoid/errors/invalid_config_option_spec.rb +1 -1
  623. data/spec/mongoid/errors/invalid_field_option_spec.rb +1 -1
  624. data/spec/mongoid/errors/invalid_field_spec.rb +2 -2
  625. data/spec/mongoid/errors/invalid_field_type_spec.rb +56 -0
  626. data/spec/mongoid/errors/invalid_find_spec.rb +1 -1
  627. data/spec/mongoid/errors/invalid_includes_spec.rb +1 -1
  628. data/spec/mongoid/errors/invalid_index_spec.rb +1 -1
  629. data/spec/mongoid/errors/invalid_options_spec.rb +1 -1
  630. data/spec/mongoid/errors/invalid_path_spec.rb +1 -1
  631. data/spec/mongoid/errors/invalid_relation_spec.rb +1 -1
  632. data/spec/mongoid/errors/invalid_scope_spec.rb +2 -2
  633. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +1 -1
  634. data/spec/mongoid/errors/invalid_storage_options_spec.rb +1 -1
  635. data/spec/mongoid/errors/invalid_time_spec.rb +1 -1
  636. data/spec/mongoid/errors/inverse_not_found_spec.rb +1 -1
  637. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +1 -1
  638. data/spec/mongoid/errors/mixed_relations_spec.rb +1 -1
  639. data/spec/mongoid/errors/mongoid_error_spec.rb +4 -4
  640. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +1 -1
  641. data/spec/mongoid/errors/no_client_config_spec.rb +1 -1
  642. data/spec/mongoid/errors/no_client_database_spec.rb +1 -1
  643. data/spec/mongoid/errors/no_client_hosts_spec.rb +1 -1
  644. data/spec/mongoid/errors/no_clients_config_spec.rb +1 -1
  645. data/spec/mongoid/errors/no_environment_spec.rb +4 -4
  646. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +1 -1
  647. data/spec/mongoid/errors/no_metadata_spec.rb +1 -1
  648. data/spec/mongoid/errors/no_parent_spec.rb +1 -1
  649. data/spec/mongoid/errors/readonly_attribute_spec.rb +1 -1
  650. data/spec/mongoid/errors/readonly_document_spec.rb +3 -3
  651. data/spec/mongoid/errors/scope_overwrite_spec.rb +1 -1
  652. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +2 -2
  653. data/spec/mongoid/errors/unknown_attribute_spec.rb +3 -3
  654. data/spec/mongoid/errors/unsaved_document_spec.rb +1 -1
  655. data/spec/mongoid/errors/unsupported_javascript_spec.rb +1 -1
  656. data/spec/mongoid/errors/validations_spec.rb +1 -1
  657. data/spec/mongoid/extensions/array_spec.rb +19 -265
  658. data/spec/mongoid/extensions/big_decimal_spec.rb +713 -213
  659. data/spec/mongoid/extensions/binary_spec.rb +45 -10
  660. data/spec/mongoid/extensions/boolean_spec.rb +69 -83
  661. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +15 -11
  662. data/spec/mongoid/extensions/date_spec.rb +74 -22
  663. data/spec/mongoid/extensions/date_time_spec.rb +18 -19
  664. data/spec/mongoid/extensions/decimal128_spec.rb +1 -1
  665. data/spec/mongoid/extensions/false_class_spec.rb +2 -9
  666. data/spec/mongoid/extensions/float_spec.rb +56 -84
  667. data/spec/mongoid/extensions/hash_spec.rb +45 -219
  668. data/spec/mongoid/extensions/integer_spec.rb +53 -73
  669. data/spec/mongoid/extensions/module_spec.rb +1 -1
  670. data/spec/mongoid/extensions/nil_class_spec.rb +1 -1
  671. data/spec/mongoid/extensions/object_id_spec.rb +1 -1
  672. data/spec/mongoid/extensions/object_spec.rb +1 -177
  673. data/spec/mongoid/extensions/range_spec.rb +254 -64
  674. data/spec/mongoid/extensions/raw_value_spec.rb +67 -0
  675. data/spec/mongoid/extensions/regexp_spec.rb +59 -34
  676. data/spec/mongoid/extensions/set_spec.rb +105 -1
  677. data/spec/mongoid/extensions/string_spec.rb +21 -104
  678. data/spec/mongoid/extensions/stringified_symbol_spec.rb +1 -1
  679. data/spec/mongoid/extensions/symbol_spec.rb +15 -53
  680. data/spec/mongoid/extensions/time_spec.rb +345 -131
  681. data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -107
  682. data/spec/mongoid/extensions/true_class_spec.rb +2 -9
  683. data/spec/mongoid/factory_spec.rb +63 -2
  684. data/spec/mongoid/fields/foreign_key_spec.rb +282 -120
  685. data/spec/mongoid/fields/localized_spec.rb +85 -42
  686. data/spec/mongoid/fields/standard_spec.rb +1 -1
  687. data/spec/mongoid/fields_spec.rb +826 -121
  688. data/spec/mongoid/findable_spec.rb +442 -80
  689. data/spec/mongoid/indexable/specification_spec.rb +132 -14
  690. data/spec/mongoid/indexable_spec.rb +361 -23
  691. data/spec/mongoid/inspectable_spec.rb +93 -5
  692. data/spec/mongoid/interceptable_spec.rb +926 -116
  693. data/spec/mongoid/interceptable_spec_models.rb +236 -4
  694. data/spec/mongoid/loading_spec.rb +110 -0
  695. data/spec/mongoid/loggable_spec.rb +1 -1
  696. data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
  697. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +68 -88
  698. data/spec/mongoid/matcher/extract_attribute_spec.rb +5 -15
  699. data/spec/mongoid/mongoizable_spec.rb +286 -0
  700. data/spec/mongoid/monkey_patches_spec.rb +211 -0
  701. data/spec/mongoid/persistable/creatable_spec.rb +5 -5
  702. data/spec/mongoid/persistable/deletable_spec.rb +267 -27
  703. data/spec/mongoid/persistable/destroyable_spec.rb +409 -24
  704. data/spec/mongoid/persistable/incrementable_spec.rb +46 -9
  705. data/spec/mongoid/persistable/logical_spec.rb +42 -5
  706. data/spec/mongoid/persistable/maxable_spec.rb +147 -0
  707. data/spec/mongoid/persistable/minable_spec.rb +147 -0
  708. data/spec/mongoid/persistable/multipliable_spec.rb +227 -0
  709. data/spec/mongoid/persistable/poppable_spec.rb +41 -5
  710. data/spec/mongoid/persistable/pullable_spec.rb +81 -9
  711. data/spec/mongoid/persistable/pushable_spec.rb +81 -9
  712. data/spec/mongoid/persistable/renamable_spec.rb +40 -4
  713. data/spec/mongoid/persistable/savable_spec.rb +114 -20
  714. data/spec/mongoid/persistable/settable_spec.rb +77 -10
  715. data/spec/mongoid/persistable/unsettable_spec.rb +41 -5
  716. data/spec/mongoid/persistable/updatable_spec.rb +64 -52
  717. data/spec/mongoid/persistable/upsertable_spec.rb +124 -4
  718. data/spec/mongoid/persistable_spec.rb +4 -4
  719. data/spec/mongoid/persistence_context_spec.rb +58 -59
  720. data/spec/mongoid/positional_spec.rb +1 -1
  721. data/spec/mongoid/railties/bson_object_id_serializer_spec.rb +24 -0
  722. data/spec/mongoid/railties/console_sandbox_spec.rb +44 -0
  723. data/spec/mongoid/relations/proxy_spec.rb +7 -7
  724. data/spec/mongoid/reloadable_spec.rb +255 -30
  725. data/spec/mongoid/scopable_spec.rb +198 -58
  726. data/spec/mongoid/search_indexable_spec.rb +147 -0
  727. data/spec/mongoid/selectable_spec.rb +7 -7
  728. data/spec/mongoid/serializable_spec.rb +19 -40
  729. data/spec/mongoid/shardable_models.rb +15 -0
  730. data/spec/mongoid/shardable_spec.rb +181 -31
  731. data/spec/mongoid/stateful_spec.rb +152 -10
  732. data/spec/mongoid/tasks/database_rake_spec.rb +193 -42
  733. data/spec/mongoid/tasks/database_spec.rb +175 -2
  734. data/spec/mongoid/tasks/encryption_spec.rb +187 -0
  735. data/spec/mongoid/threaded_spec.rb +40 -3
  736. data/spec/mongoid/timestamps/created/short_spec.rb +2 -2
  737. data/spec/mongoid/timestamps/created_spec.rb +2 -2
  738. data/spec/mongoid/timestamps/timeless_spec.rb +3 -3
  739. data/spec/mongoid/timestamps/updated/short_spec.rb +4 -4
  740. data/spec/mongoid/timestamps/updated_spec.rb +4 -4
  741. data/spec/mongoid/timestamps_spec.rb +399 -11
  742. data/spec/mongoid/timestamps_spec_models.rb +68 -0
  743. data/spec/mongoid/touchable_spec.rb +971 -54
  744. data/spec/mongoid/touchable_spec_models.rb +154 -0
  745. data/spec/mongoid/traversable_spec.rb +79 -37
  746. data/spec/mongoid/validatable/associated_spec.rb +14 -31
  747. data/spec/mongoid/validatable/format_spec.rb +1 -1
  748. data/spec/mongoid/validatable/length_spec.rb +1 -1
  749. data/spec/mongoid/validatable/numericality_spec.rb +1 -1
  750. data/spec/mongoid/validatable/presence_spec.rb +27 -23
  751. data/spec/mongoid/validatable/uniqueness_spec.rb +170 -99
  752. data/spec/mongoid/validatable_spec.rb +4 -4
  753. data/spec/mongoid/warnings_spec.rb +36 -0
  754. data/spec/mongoid_spec.rb +61 -11
  755. data/spec/rails/controller_extension/controller_runtime_spec.rb +3 -3
  756. data/spec/rails/mongoid_spec.rb +28 -132
  757. data/spec/shared/bin/get-mongodb-download-url +17 -0
  758. data/spec/shared/bin/s3-copy +45 -0
  759. data/spec/shared/bin/s3-upload +69 -0
  760. data/spec/shared/lib/mrss/cluster_config.rb +24 -4
  761. data/spec/shared/lib/mrss/constraints.rb +77 -29
  762. data/spec/shared/lib/mrss/docker_runner.rb +40 -4
  763. data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
  764. data/spec/shared/lib/mrss/event_subscriber.rb +210 -0
  765. data/spec/shared/lib/mrss/lite_constraints.rb +64 -1
  766. data/spec/shared/lib/mrss/server_version_registry.rb +78 -34
  767. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  768. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  769. data/spec/shared/lib/mrss/spec_organizer.rb +32 -2
  770. data/spec/shared/lib/mrss/utils.rb +37 -0
  771. data/spec/shared/share/Dockerfile.erb +123 -71
  772. data/spec/shared/share/haproxy-1.conf +16 -0
  773. data/spec/shared/share/haproxy-2.conf +17 -0
  774. data/spec/shared/shlib/config.sh +27 -0
  775. data/spec/shared/shlib/distro.sh +2 -1
  776. data/spec/shared/shlib/server.sh +187 -40
  777. data/spec/shared/shlib/set_env.sh +49 -31
  778. data/spec/spec_helper.rb +46 -49
  779. data/spec/support/authorization.rb +1 -1
  780. data/spec/support/client_registry.rb +10 -0
  781. data/spec/support/constraints.rb +25 -1
  782. data/spec/support/crypt/models.rb +50 -0
  783. data/spec/support/crypt.rb +80 -0
  784. data/spec/support/expectations.rb +1 -1
  785. data/spec/support/feature_sandbox.rb +72 -0
  786. data/spec/support/helpers.rb +1 -0
  787. data/spec/support/immutable_ids.rb +119 -0
  788. data/spec/support/macros.rb +107 -1
  789. data/spec/support/models/account.rb +2 -2
  790. data/spec/support/models/acolyte.rb +1 -1
  791. data/spec/support/models/actor.rb +1 -1
  792. data/spec/support/models/actress.rb +1 -1
  793. data/spec/support/models/address.rb +7 -1
  794. data/spec/support/models/address_component.rb +1 -1
  795. data/spec/support/models/address_number.rb +1 -1
  796. data/spec/support/models/agency.rb +1 -1
  797. data/spec/support/models/agent.rb +1 -1
  798. data/spec/support/models/album.rb +1 -1
  799. data/spec/support/models/alert.rb +1 -1
  800. data/spec/support/models/animal.rb +1 -1
  801. data/spec/support/models/answer.rb +1 -1
  802. data/spec/support/models/appointment.rb +1 -1
  803. data/spec/support/models/armrest.rb +1 -1
  804. data/spec/support/models/array_field.rb +1 -1
  805. data/spec/support/models/article.rb +1 -1
  806. data/spec/support/models/artist.rb +3 -2
  807. data/spec/support/models/artwork.rb +1 -1
  808. data/spec/support/models/audible_sound.rb +4 -0
  809. data/spec/support/models/audio.rb +1 -1
  810. data/spec/support/models/augmentation.rb +13 -1
  811. data/spec/support/models/author.rb +1 -1
  812. data/spec/support/models/baby.rb +1 -1
  813. data/spec/support/models/band.rb +13 -1
  814. data/spec/support/models/bar.rb +1 -1
  815. data/spec/support/models/basic.rb +1 -1
  816. data/spec/support/models/bed.rb +1 -1
  817. data/spec/support/models/big_palette.rb +1 -1
  818. data/spec/support/models/birthday.rb +1 -1
  819. data/spec/support/models/bolt.rb +8 -0
  820. data/spec/support/models/bomb.rb +1 -1
  821. data/spec/support/models/book.rb +2 -1
  822. data/spec/support/models/breed.rb +1 -1
  823. data/spec/support/models/browser.rb +1 -1
  824. data/spec/support/models/building.rb +3 -1
  825. data/spec/support/models/building_address.rb +1 -1
  826. data/spec/support/models/bus.rb +1 -1
  827. data/spec/support/models/business.rb +1 -1
  828. data/spec/support/models/callback_test.rb +1 -1
  829. data/spec/support/models/canvas.rb +1 -1
  830. data/spec/support/models/car.rb +1 -1
  831. data/spec/support/models/cat.rb +1 -1
  832. data/spec/support/models/catalog.rb +25 -0
  833. data/spec/support/models/category.rb +1 -1
  834. data/spec/support/models/child.rb +1 -1
  835. data/spec/support/models/child_doc.rb +4 -4
  836. data/spec/support/models/church.rb +1 -1
  837. data/spec/support/models/circle.rb +1 -1
  838. data/spec/support/models/circuit.rb +1 -1
  839. data/spec/support/models/circus.rb +4 -1
  840. data/spec/support/models/code.rb +3 -1
  841. data/spec/support/models/coding/pull_request.rb +1 -1
  842. data/spec/support/models/coding.rb +1 -1
  843. data/spec/support/models/comment.rb +1 -1
  844. data/spec/support/models/company.rb +1 -1
  845. data/spec/support/models/consumption_period.rb +1 -1
  846. data/spec/support/models/contextable_item.rb +1 -1
  847. data/spec/support/models/contractor.rb +1 -1
  848. data/spec/support/models/cookie.rb +1 -1
  849. data/spec/support/models/country_code.rb +3 -1
  850. data/spec/support/models/courier_job.rb +1 -1
  851. data/spec/support/models/cover.rb +11 -0
  852. data/spec/support/models/crate.rb +1 -1
  853. data/spec/support/models/customer.rb +1 -1
  854. data/spec/support/models/customer_address.rb +1 -1
  855. data/spec/support/models/deed.rb +1 -1
  856. data/spec/support/models/definition.rb +1 -1
  857. data/spec/support/models/delegating_patient.rb +1 -1
  858. data/spec/support/models/description.rb +1 -1
  859. data/spec/support/models/dictionary.rb +1 -1
  860. data/spec/support/models/division.rb +1 -1
  861. data/spec/support/models/doctor.rb +1 -1
  862. data/spec/support/models/dog.rb +1 -1
  863. data/spec/support/models/dokument.rb +1 -1
  864. data/spec/support/models/draft.rb +1 -1
  865. data/spec/support/models/dragon.rb +1 -1
  866. data/spec/support/models/driver.rb +1 -1
  867. data/spec/support/models/drug.rb +1 -1
  868. data/spec/support/models/dungeon.rb +1 -1
  869. data/spec/support/models/edit.rb +1 -1
  870. data/spec/support/models/email.rb +1 -1
  871. data/spec/support/models/employer.rb +1 -1
  872. data/spec/support/models/entry.rb +1 -1
  873. data/spec/support/models/eraser.rb +1 -1
  874. data/spec/support/models/even.rb +1 -1
  875. data/spec/support/models/event.rb +1 -1
  876. data/spec/support/models/exhibition.rb +1 -1
  877. data/spec/support/models/exhibitor.rb +1 -1
  878. data/spec/support/models/explosion.rb +1 -1
  879. data/spec/support/models/eye.rb +1 -1
  880. data/spec/support/models/eye_bowl.rb +1 -1
  881. data/spec/support/models/face.rb +1 -1
  882. data/spec/support/models/fanatic.rb +9 -0
  883. data/spec/support/models/favorite.rb +8 -2
  884. data/spec/support/models/filesystem.rb +1 -1
  885. data/spec/support/models/fire_hydrant.rb +1 -1
  886. data/spec/support/models/firefox.rb +1 -1
  887. data/spec/support/models/fish.rb +1 -1
  888. data/spec/support/models/folder.rb +1 -1
  889. data/spec/support/models/folder_item.rb +1 -1
  890. data/spec/support/models/fruits.rb +1 -1
  891. data/spec/support/models/game.rb +1 -1
  892. data/spec/support/models/ghost.rb +1 -1
  893. data/spec/support/models/guitar.rb +1 -1
  894. data/spec/support/models/hole.rb +13 -0
  895. data/spec/support/models/home.rb +1 -1
  896. data/spec/support/models/house.rb +1 -1
  897. data/spec/support/models/html_writer.rb +1 -1
  898. data/spec/support/models/id_key.rb +1 -1
  899. data/spec/support/models/idnodef.rb +1 -1
  900. data/spec/support/models/image.rb +1 -1
  901. data/spec/support/models/implant.rb +10 -1
  902. data/spec/support/models/instrument.rb +1 -1
  903. data/spec/support/models/item.rb +1 -1
  904. data/spec/support/models/jar.rb +1 -1
  905. data/spec/support/models/kaleidoscope.rb +1 -1
  906. data/spec/support/models/kangaroo.rb +1 -1
  907. data/spec/support/models/label.rb +5 -2
  908. data/spec/support/models/language.rb +1 -1
  909. data/spec/support/models/lat_lng.rb +1 -1
  910. data/spec/support/models/league.rb +1 -1
  911. data/spec/support/models/learner.rb +1 -1
  912. data/spec/support/models/line_item.rb +1 -1
  913. data/spec/support/models/location.rb +1 -1
  914. data/spec/support/models/login.rb +1 -1
  915. data/spec/support/models/manufacturer.rb +1 -1
  916. data/spec/support/models/meat.rb +1 -1
  917. data/spec/support/models/membership.rb +2 -1
  918. data/spec/support/models/message.rb +1 -1
  919. data/spec/support/models/minim.rb +1 -1
  920. data/spec/support/models/mixed_drink.rb +1 -1
  921. data/spec/support/models/mop.rb +10 -1
  922. data/spec/support/models/movie.rb +1 -1
  923. data/spec/support/models/my_hash.rb +1 -1
  924. data/spec/support/models/name.rb +11 -1
  925. data/spec/support/models/name_only.rb +1 -1
  926. data/spec/support/models/node.rb +1 -1
  927. data/spec/support/models/note.rb +1 -1
  928. data/spec/support/models/nut.rb +8 -0
  929. data/spec/support/models/odd.rb +1 -1
  930. data/spec/support/models/order.rb +3 -1
  931. data/spec/support/models/ordered_post.rb +2 -2
  932. data/spec/support/models/ordered_preference.rb +1 -1
  933. data/spec/support/models/oscar.rb +1 -1
  934. data/spec/support/models/other_owner_object.rb +1 -1
  935. data/spec/support/models/override.rb +1 -1
  936. data/spec/support/models/ownable.rb +1 -1
  937. data/spec/support/models/owner.rb +1 -1
  938. data/spec/support/models/pack.rb +1 -1
  939. data/spec/support/models/page.rb +1 -1
  940. data/spec/support/models/page_question.rb +1 -1
  941. data/spec/support/models/palette.rb +1 -1
  942. data/spec/support/models/parent.rb +1 -1
  943. data/spec/support/models/parent_doc.rb +1 -1
  944. data/spec/support/models/passport.rb +15 -1
  945. data/spec/support/models/patient.rb +1 -1
  946. data/spec/support/models/pdf_writer.rb +1 -1
  947. data/spec/support/models/pencil.rb +1 -1
  948. data/spec/support/models/person.rb +19 -1
  949. data/spec/support/models/pet.rb +1 -1
  950. data/spec/support/models/pet_owner.rb +1 -1
  951. data/spec/support/models/phone.rb +3 -2
  952. data/spec/support/models/piano.rb +1 -1
  953. data/spec/support/models/pizza.rb +1 -1
  954. data/spec/support/models/player.rb +3 -1
  955. data/spec/support/models/post.rb +1 -1
  956. data/spec/support/models/post_genre.rb +1 -1
  957. data/spec/support/models/powerup.rb +13 -1
  958. data/spec/support/models/preference.rb +1 -1
  959. data/spec/support/models/princess.rb +1 -1
  960. data/spec/support/models/product.rb +2 -1
  961. data/spec/support/models/profile.rb +1 -1
  962. data/spec/support/models/pronunciation.rb +1 -1
  963. data/spec/support/models/pub.rb +1 -1
  964. data/spec/support/models/publication/encyclopedia.rb +1 -1
  965. data/spec/support/models/publication/review.rb +1 -1
  966. data/spec/support/models/publication.rb +1 -1
  967. data/spec/support/models/purchase.rb +1 -1
  968. data/spec/support/models/purchased_item.rb +11 -0
  969. data/spec/support/models/purse.rb +9 -0
  970. data/spec/support/models/question.rb +1 -1
  971. data/spec/support/models/quiz.rb +1 -1
  972. data/spec/support/models/rating.rb +1 -1
  973. data/spec/support/models/record.rb +1 -1
  974. data/spec/support/models/registry.rb +2 -1
  975. data/spec/support/models/role.rb +1 -1
  976. data/spec/support/models/root_category.rb +1 -1
  977. data/spec/support/models/sandbox/app/models/app_models_message.rb +4 -0
  978. data/spec/support/models/sandbox/lib/models/lib_models_message.rb +4 -0
  979. data/spec/support/models/sandbox/sandbox_message.rb +4 -0
  980. data/spec/support/models/sandbox/sandbox_user.rb +4 -0
  981. data/spec/support/models/sandbox/subdir/sandbox_comment.rb +4 -0
  982. data/spec/support/models/sandwich.rb +1 -1
  983. data/spec/support/models/scheduler.rb +1 -1
  984. data/spec/support/models/school.rb +15 -0
  985. data/spec/support/models/scribe.rb +1 -1
  986. data/spec/support/models/sealer.rb +8 -0
  987. data/spec/support/models/seat.rb +1 -1
  988. data/spec/support/models/seo.rb +1 -1
  989. data/spec/support/models/series.rb +1 -1
  990. data/spec/support/models/server.rb +1 -1
  991. data/spec/support/models/service.rb +1 -1
  992. data/spec/support/models/shape.rb +1 -1
  993. data/spec/support/models/shelf.rb +1 -1
  994. data/spec/support/models/shield.rb +19 -0
  995. data/spec/support/models/shipment_address.rb +1 -1
  996. data/spec/support/models/shipping_container.rb +1 -1
  997. data/spec/support/models/shipping_pack.rb +1 -1
  998. data/spec/support/models/shirt.rb +12 -0
  999. data/spec/support/models/shop.rb +1 -1
  1000. data/spec/support/models/short_agent.rb +1 -1
  1001. data/spec/support/models/short_quiz.rb +1 -1
  1002. data/spec/support/models/simple.rb +1 -1
  1003. data/spec/support/models/slave.rb +1 -1
  1004. data/spec/support/models/song.rb +1 -1
  1005. data/spec/support/models/sound.rb +1 -1
  1006. data/spec/support/models/spacer.rb +8 -0
  1007. data/spec/support/models/square.rb +1 -1
  1008. data/spec/support/models/staff.rb +1 -1
  1009. data/spec/support/models/store_as_dup_test1.rb +1 -1
  1010. data/spec/support/models/store_as_dup_test2.rb +1 -1
  1011. data/spec/support/models/store_as_dup_test3.rb +1 -1
  1012. data/spec/support/models/store_as_dup_test4.rb +1 -1
  1013. data/spec/support/models/strategy.rb +1 -1
  1014. data/spec/support/models/student.rb +15 -0
  1015. data/spec/support/models/sub_item.rb +1 -1
  1016. data/spec/support/models/subscription.rb +1 -1
  1017. data/spec/support/models/survey.rb +1 -1
  1018. data/spec/support/models/symptom.rb +1 -1
  1019. data/spec/support/models/system_role.rb +1 -0
  1020. data/spec/support/models/tag.rb +1 -1
  1021. data/spec/support/models/target.rb +1 -1
  1022. data/spec/support/models/template.rb +1 -1
  1023. data/spec/support/models/thing.rb +1 -1
  1024. data/spec/support/models/threadlocker.rb +8 -0
  1025. data/spec/support/models/title.rb +1 -1
  1026. data/spec/support/models/tool.rb +1 -1
  1027. data/spec/support/models/topping.rb +1 -1
  1028. data/spec/support/models/toy.rb +1 -1
  1029. data/spec/support/models/track.rb +1 -1
  1030. data/spec/support/models/translation.rb +1 -1
  1031. data/spec/support/models/tree.rb +1 -1
  1032. data/spec/support/models/truck.rb +1 -1
  1033. data/spec/support/models/updatable.rb +1 -1
  1034. data/spec/support/models/user.rb +1 -1
  1035. data/spec/support/models/user_account.rb +1 -1
  1036. data/spec/support/models/validation_callback.rb +1 -1
  1037. data/spec/support/models/vehicle.rb +1 -1
  1038. data/spec/support/models/version.rb +1 -1
  1039. data/spec/support/models/vertex.rb +1 -1
  1040. data/spec/support/models/vet_visit.rb +1 -1
  1041. data/spec/support/models/video.rb +1 -1
  1042. data/spec/support/models/video_game.rb +1 -1
  1043. data/spec/support/models/washer.rb +8 -0
  1044. data/spec/support/models/weapon.rb +13 -1
  1045. data/spec/support/models/wiki_page.rb +1 -1
  1046. data/spec/support/models/word.rb +1 -1
  1047. data/spec/support/models/word_origin.rb +1 -1
  1048. data/spec/support/models/writer.rb +1 -1
  1049. data/spec/support/rails_mock.rb +32 -0
  1050. data/spec/support/schema_maps/schema_map_aws.json +17 -0
  1051. data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
  1052. data/spec/support/schema_maps/schema_map_azure.json +17 -0
  1053. data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
  1054. data/spec/support/schema_maps/schema_map_gcp.json +17 -0
  1055. data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
  1056. data/spec/support/schema_maps/schema_map_kmip.json +17 -0
  1057. data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
  1058. data/spec/support/schema_maps/schema_map_local.json +18 -0
  1059. data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
  1060. data/spec/support/shared/time.rb +3 -22
  1061. data/spec/support/sinatra_mock.rb +7 -0
  1062. data/spec/support/spec_config.rb +42 -7
  1063. data.tar.gz.sig +0 -0
  1064. metadata +883 -562
  1065. metadata.gz.sig +0 -0
  1066. data/lib/mongoid/association/referenced/eager.rb +0 -184
  1067. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +0 -128
  1068. data/lib/mongoid/contextual/geo_near.rb +0 -269
  1069. data/lib/mongoid/errors/eager_load.rb +0 -26
  1070. data/lib/mongoid/errors/invalid_session_use.rb +0 -26
  1071. data/lib/mongoid/errors/invalid_storage_parent.rb +0 -28
  1072. data/lib/mongoid/errors/invalid_value.rb +0 -18
  1073. data/lib/mongoid/query_cache.rb +0 -333
  1074. data/lib/support/ruby_version.rb +0 -29
  1075. data/spec/mongoid/contextual/geo_near_spec.rb +0 -472
  1076. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -61
  1077. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -61
  1078. data/spec/mongoid/extensions_spec.rb +0 -32
  1079. data/spec/mongoid/query_cache_middleware_spec.rb +0 -61
  1080. data/spec/mongoid/query_cache_spec.rb +0 -978
  1081. data/spec/support/cluster_config.rb +0 -158
  1082. data/spec/support/session_registry.rb +0 -50
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
- # encoding: utf-8
2
+ # rubocop:todo all
3
3
 
4
4
  require "spec_helper"
5
5
 
@@ -9,6 +9,28 @@ describe Mongoid::Validatable::UniquenessValidator do
9
9
 
10
10
  context "when the document is a root document" do
11
11
 
12
+ context "when setting the read preference to non-primary" do
13
+
14
+ before do
15
+ Dictionary.validates_uniqueness_of :name
16
+ end
17
+
18
+ after do
19
+ Dictionary.reset_callbacks(:validate)
20
+ end
21
+
22
+ it "reads from the primary" do
23
+ expect_any_instance_of(Mongoid::Criteria).to receive(:read).once.and_wrap_original do |m, *args, **kwargs|
24
+ crit = m.call(*args, **kwargs)
25
+ expect(crit.view.options["read"]).to eq({ "mode" => :primary })
26
+ crit
27
+ end
28
+ Dictionary.with(read: { mode: :secondary }) do |klass|
29
+ klass.create!(name: "Websters")
30
+ end
31
+ end
32
+ end
33
+
12
34
  context "when adding custom persistence options" do
13
35
 
14
36
  before do
@@ -23,7 +45,7 @@ describe Mongoid::Validatable::UniquenessValidator do
23
45
 
24
46
  before do
25
47
  Dictionary.with(collection: "dicts") do |klass|
26
- klass.create(name: "websters")
48
+ klass.create!(name: "websters")
27
49
  end
28
50
  end
29
51
 
@@ -81,7 +103,7 @@ describe Mongoid::Validatable::UniquenessValidator do
81
103
  context "when the attribute id is unique" do
82
104
 
83
105
  let(:dictionary) do
84
- Dictionary.create
106
+ Dictionary.create!
85
107
  end
86
108
 
87
109
  let(:word) do
@@ -121,7 +143,7 @@ describe Mongoid::Validatable::UniquenessValidator do
121
143
  it "adds the uniqueness error to the aliased field name" do
122
144
  dictionary.valid?
123
145
  expect(dictionary.errors).to have_key(:language)
124
- expect(dictionary.errors[:language]).to eq([ "is already taken" ])
146
+ expect(dictionary.errors[:language]).to eq([ "has already been taken" ])
125
147
  end
126
148
  end
127
149
 
@@ -138,7 +160,7 @@ describe Mongoid::Validatable::UniquenessValidator do
138
160
  it "adds the uniqueness error to the underlying field name" do
139
161
  dictionary.valid?
140
162
  expect(dictionary.errors).to have_key(:l)
141
- expect(dictionary.errors[:l]).to eq([ "is already taken" ])
163
+ expect(dictionary.errors[:l]).to eq([ "has already been taken" ])
142
164
  end
143
165
  end
144
166
  end
@@ -173,7 +195,7 @@ describe Mongoid::Validatable::UniquenessValidator do
173
195
  context "when a document with no value exists in the database" do
174
196
 
175
197
  before do
176
- Dictionary.create
198
+ Dictionary.create!
177
199
  end
178
200
 
179
201
  let(:dictionary) do
@@ -191,7 +213,7 @@ describe Mongoid::Validatable::UniquenessValidator do
191
213
  context "when single localization" do
192
214
 
193
215
  before do
194
- Dictionary.create(description: "english")
216
+ Dictionary.create!(description: "english")
195
217
  end
196
218
 
197
219
  let(:dictionary) do
@@ -227,7 +249,7 @@ describe Mongoid::Validatable::UniquenessValidator do
227
249
  context "when single localization" do
228
250
 
229
251
  before do
230
- Dictionary.create(description: "english")
252
+ Dictionary.create!(description: "english")
231
253
  end
232
254
 
233
255
  let(:dictionary) do
@@ -240,7 +262,7 @@ describe Mongoid::Validatable::UniquenessValidator do
240
262
 
241
263
  it "adds the uniqueness error" do
242
264
  dictionary.valid?
243
- expect(dictionary.errors[:description]).to eq([ "is already taken" ])
265
+ expect(dictionary.errors[:description]).to eq([ "has already been taken" ])
244
266
  end
245
267
  end
246
268
 
@@ -261,7 +283,7 @@ describe Mongoid::Validatable::UniquenessValidator do
261
283
 
262
284
  it "adds the uniqueness error" do
263
285
  dictionary.valid?
264
- expect(dictionary.errors[:description]).to eq([ "is already taken" ])
286
+ expect(dictionary.errors[:description]).to eq([ "has already been taken" ])
265
287
  end
266
288
  end
267
289
  end
@@ -283,7 +305,7 @@ describe Mongoid::Validatable::UniquenessValidator do
283
305
  context "when there are no special characters" do
284
306
 
285
307
  before do
286
- Dictionary.create(description: "english")
308
+ Dictionary.create!(description: "english")
287
309
  end
288
310
 
289
311
  let(:dictionary) do
@@ -298,7 +320,7 @@ describe Mongoid::Validatable::UniquenessValidator do
298
320
  context "when special characters exist" do
299
321
 
300
322
  before do
301
- Dictionary.create(description: "english")
323
+ Dictionary.create!(description: "english")
302
324
  end
303
325
 
304
326
  let(:dictionary) do
@@ -318,7 +340,7 @@ describe Mongoid::Validatable::UniquenessValidator do
318
340
  context "when signle localization" do
319
341
 
320
342
  before do
321
- Dictionary.create(description: "english")
343
+ Dictionary.create!(description: "english")
322
344
  end
323
345
 
324
346
  let(:dictionary) do
@@ -331,7 +353,7 @@ describe Mongoid::Validatable::UniquenessValidator do
331
353
 
332
354
  it "adds the uniqueness error" do
333
355
  dictionary.valid?
334
- expect(dictionary.errors[:description]).to eq([ "is already taken" ])
356
+ expect(dictionary.errors[:description]).to eq([ "has already been taken" ])
335
357
  end
336
358
  end
337
359
 
@@ -352,7 +374,7 @@ describe Mongoid::Validatable::UniquenessValidator do
352
374
 
353
375
  it "adds the uniqueness error" do
354
376
  dictionary.valid?
355
- expect(dictionary.errors[:description]).to eq([ "is already taken" ])
377
+ expect(dictionary.errors[:description]).to eq([ "has already been taken" ])
356
378
  end
357
379
  end
358
380
  end
@@ -360,7 +382,7 @@ describe Mongoid::Validatable::UniquenessValidator do
360
382
  context "when the document is the match in the database" do
361
383
 
362
384
  let!(:dictionary) do
363
- Dictionary.create(description: "english")
385
+ Dictionary.create!(description: "english")
364
386
  end
365
387
 
366
388
  it "returns true" do
@@ -400,7 +422,7 @@ describe Mongoid::Validatable::UniquenessValidator do
400
422
 
401
423
  it "adds the uniqueness error" do
402
424
  dictionary.valid?
403
- expect(dictionary.errors[:description]).to eq([ "is already taken" ])
425
+ expect(dictionary.errors[:description]).to eq([ "has already been taken" ])
404
426
  end
405
427
  end
406
428
  end
@@ -420,7 +442,7 @@ describe Mongoid::Validatable::UniquenessValidator do
420
442
  context "when the attribute is unique" do
421
443
 
422
444
  let!(:oxford) do
423
- Dictionary.create(name: "Oxford")
445
+ Dictionary.create!(name: "Oxford")
424
446
  end
425
447
 
426
448
  let(:dictionary) do
@@ -448,7 +470,7 @@ describe Mongoid::Validatable::UniquenessValidator do
448
470
  context "when the document is not the match" do
449
471
 
450
472
  before do
451
- Dictionary.create(name: "Oxford")
473
+ Dictionary.create!(name: "Oxford")
452
474
  end
453
475
 
454
476
  let!(:dictionary) do
@@ -461,7 +483,7 @@ describe Mongoid::Validatable::UniquenessValidator do
461
483
 
462
484
  it "adds the uniqueness error" do
463
485
  dictionary.valid?
464
- expect(dictionary.errors[:name]).to eq([ "is already taken" ])
486
+ expect(dictionary.errors[:name]).to eq([ "has already been taken" ])
465
487
  end
466
488
  end
467
489
 
@@ -470,7 +492,7 @@ describe Mongoid::Validatable::UniquenessValidator do
470
492
  context "when the field has changed" do
471
493
 
472
494
  let!(:dictionary) do
473
- Dictionary.create(name: "Oxford")
495
+ Dictionary.create!(name: "Oxford")
474
496
  end
475
497
 
476
498
  it "returns true" do
@@ -522,7 +544,7 @@ describe Mongoid::Validatable::UniquenessValidator do
522
544
  context "when the attribute is not unique" do
523
545
 
524
546
  before do
525
- Dictionary.create(name: "Oxford")
547
+ Dictionary.create!(name: "Oxford")
526
548
  end
527
549
 
528
550
  let(:dictionary) do
@@ -549,7 +571,7 @@ describe Mongoid::Validatable::UniquenessValidator do
549
571
  context "when the attribute is unique" do
550
572
 
551
573
  before do
552
- Dictionary.create(name: "Oxford", language: "English")
574
+ Dictionary.create!(name: "Oxford", language: "English")
553
575
  end
554
576
 
555
577
  let(:dictionary) do
@@ -564,7 +586,7 @@ describe Mongoid::Validatable::UniquenessValidator do
564
586
  context "when the attribute is unique in the scope" do
565
587
 
566
588
  before do
567
- Dictionary.create(name: "Oxford", language: "English")
589
+ Dictionary.create!(name: "Oxford", language: "English")
568
590
  end
569
591
 
570
592
  let(:dictionary) do
@@ -579,7 +601,7 @@ describe Mongoid::Validatable::UniquenessValidator do
579
601
  context "when the attribute is not unique with no scope" do
580
602
 
581
603
  before do
582
- Dictionary.create(name: "Oxford", language: "English")
604
+ Dictionary.create!(name: "Oxford", language: "English")
583
605
  end
584
606
 
585
607
  let(:dictionary) do
@@ -594,7 +616,7 @@ describe Mongoid::Validatable::UniquenessValidator do
594
616
  context "when the attribute is not unique in another scope" do
595
617
 
596
618
  before do
597
- Dictionary.create(name: "Oxford", language: "English")
619
+ Dictionary.create!(name: "Oxford", language: "English")
598
620
  end
599
621
 
600
622
  let(:dictionary) do
@@ -611,7 +633,7 @@ describe Mongoid::Validatable::UniquenessValidator do
611
633
  context "when the document is not the match" do
612
634
 
613
635
  before do
614
- Dictionary.create(name: "Oxford", language: "English")
636
+ Dictionary.create!(name: "Oxford", language: "English")
615
637
  end
616
638
 
617
639
  let(:dictionary) do
@@ -624,14 +646,14 @@ describe Mongoid::Validatable::UniquenessValidator do
624
646
 
625
647
  it "adds the uniqueness errors" do
626
648
  dictionary.valid?
627
- expect(dictionary.errors[:name]).to eq([ "is already taken" ])
649
+ expect(dictionary.errors[:name]).to eq([ "has already been taken" ])
628
650
  end
629
651
  end
630
652
 
631
653
  context "when the document is the match in the database" do
632
654
 
633
655
  let!(:dictionary) do
634
- Dictionary.create(name: "Oxford", language: "English")
656
+ Dictionary.create!(name: "Oxford", language: "English")
635
657
  end
636
658
 
637
659
  it "returns true" do
@@ -654,7 +676,7 @@ describe Mongoid::Validatable::UniquenessValidator do
654
676
  context "when the attribute is unique" do
655
677
 
656
678
  before do
657
- Dictionary.create(name: "Oxford", publisher: "Amazon")
679
+ Dictionary.create!(name: "Oxford", publisher: "Amazon")
658
680
  end
659
681
 
660
682
  let(:dictionary) do
@@ -669,7 +691,7 @@ describe Mongoid::Validatable::UniquenessValidator do
669
691
  context "when the attribute is unique in the scope" do
670
692
 
671
693
  before do
672
- Dictionary.create(name: "Oxford", publisher: "Amazon")
694
+ Dictionary.create!(name: "Oxford", publisher: "Amazon")
673
695
  end
674
696
 
675
697
  let(:dictionary) do
@@ -702,14 +724,14 @@ describe Mongoid::Validatable::UniquenessValidator do
702
724
 
703
725
  it "should set an error for associated object not being unique" do
704
726
  item.update_attributes(folder_id: personal_folder.id)
705
- expect(item.errors.messages[:name].first).to eq("is already taken")
727
+ expect(item.errors.messages[:name].first).to eq("has already been taken")
706
728
  end
707
729
  end
708
730
 
709
731
  context "when the attribute is not unique with no scope" do
710
732
 
711
733
  before do
712
- Dictionary.create(name: "Oxford", publisher: "Amazon")
734
+ Dictionary.create!(name: "Oxford", publisher: "Amazon")
713
735
  end
714
736
 
715
737
  let(:dictionary) do
@@ -724,7 +746,7 @@ describe Mongoid::Validatable::UniquenessValidator do
724
746
  context "when the attribute is not unique in another scope" do
725
747
 
726
748
  before do
727
- Dictionary.create(name: "Oxford", publisher: "Amazon")
749
+ Dictionary.create!(name: "Oxford", publisher: "Amazon")
728
750
  end
729
751
 
730
752
  let(:dictionary) do
@@ -741,7 +763,7 @@ describe Mongoid::Validatable::UniquenessValidator do
741
763
  context "when the document is not the match" do
742
764
 
743
765
  before do
744
- Dictionary.create(name: "Oxford", publisher: "Amazon")
766
+ Dictionary.create!(name: "Oxford", publisher: "Amazon")
745
767
  end
746
768
 
747
769
  let(:dictionary) do
@@ -754,14 +776,14 @@ describe Mongoid::Validatable::UniquenessValidator do
754
776
 
755
777
  it "adds the uniqueness errors" do
756
778
  dictionary.valid?
757
- expect(dictionary.errors[:name]).to eq([ "is already taken" ])
779
+ expect(dictionary.errors[:name]).to eq([ "has already been taken" ])
758
780
  end
759
781
  end
760
782
 
761
783
  context "when the document is the match in the database" do
762
784
 
763
785
  let!(:dictionary) do
764
- Dictionary.create(name: "Oxford", publisher: "Amazon")
786
+ Dictionary.create!(name: "Oxford", publisher: "Amazon")
765
787
  end
766
788
 
767
789
  it "returns true" do
@@ -772,7 +794,7 @@ describe Mongoid::Validatable::UniquenessValidator do
772
794
  context "when one of the scopes is a time" do
773
795
 
774
796
  before do
775
- Dictionary.create(
797
+ Dictionary.create!(
776
798
  name: "Oxford",
777
799
  publisher: "Amazon",
778
800
  published: 10.days.ago.to_time
@@ -793,7 +815,7 @@ describe Mongoid::Validatable::UniquenessValidator do
793
815
 
794
816
  it "adds the uniqueness errors" do
795
817
  dictionary.valid?
796
- expect(dictionary.errors[:name]).to eq([ "is already taken" ])
818
+ expect(dictionary.errors[:name]).to eq([ "has already been taken" ])
797
819
  end
798
820
  end
799
821
  end
@@ -816,7 +838,7 @@ describe Mongoid::Validatable::UniquenessValidator do
816
838
 
817
839
  expect do
818
840
  Dictionary.create!(name: "French-English", year: 1960)
819
- end.to raise_error(Mongoid::Errors::Validations, /Name is already taken/)
841
+ end.to raise_error(Mongoid::Errors::Validations, /Name has already been taken/)
820
842
 
821
843
  expect(Dictionary.all.size).to eq(1)
822
844
  end
@@ -856,7 +878,7 @@ describe Mongoid::Validatable::UniquenessValidator do
856
878
  context "when the attribute is unique" do
857
879
 
858
880
  before do
859
- Dictionary.create(name: "Oxford", publisher: "Amazon")
881
+ Dictionary.create!(name: "Oxford", publisher: "Amazon")
860
882
  end
861
883
 
862
884
  let(:dictionary) do
@@ -871,7 +893,7 @@ describe Mongoid::Validatable::UniquenessValidator do
871
893
  context "when the attribute is unique in the scope" do
872
894
 
873
895
  before do
874
- Dictionary.create(
896
+ Dictionary.create!(
875
897
  name: "Oxford",
876
898
  publisher: "Amazon",
877
899
  year: 2011
@@ -894,7 +916,7 @@ describe Mongoid::Validatable::UniquenessValidator do
894
916
  context "when the attribute is not unique with no scope" do
895
917
 
896
918
  before do
897
- Dictionary.create(name: "Oxford", publisher: "Amazon")
919
+ Dictionary.create!(name: "Oxford", publisher: "Amazon")
898
920
  end
899
921
 
900
922
  let(:dictionary) do
@@ -909,7 +931,7 @@ describe Mongoid::Validatable::UniquenessValidator do
909
931
  context "when the attribute is not unique in another scope" do
910
932
 
911
933
  before do
912
- Dictionary.create(
934
+ Dictionary.create!(
913
935
  name: "Oxford",
914
936
  publisher: "Amazon",
915
937
  year: 1995
@@ -934,7 +956,7 @@ describe Mongoid::Validatable::UniquenessValidator do
934
956
  context "when the document is not the match" do
935
957
 
936
958
  before do
937
- Dictionary.create(
959
+ Dictionary.create!(
938
960
  name: "Oxford",
939
961
  publisher: "Amazon",
940
962
  year: 1960
@@ -955,14 +977,14 @@ describe Mongoid::Validatable::UniquenessValidator do
955
977
 
956
978
  it "adds the uniqueness errors" do
957
979
  dictionary.valid?
958
- expect(dictionary.errors[:name]).to eq([ "is already taken" ])
980
+ expect(dictionary.errors[:name]).to eq([ "has already been taken" ])
959
981
  end
960
982
  end
961
983
 
962
984
  context "when the document is the match in the database" do
963
985
 
964
986
  let!(:dictionary) do
965
- Dictionary.create(
987
+ Dictionary.create!(
966
988
  name: "Oxford",
967
989
  publisher: "Amazon",
968
990
  year: 1960
@@ -989,7 +1011,7 @@ describe Mongoid::Validatable::UniquenessValidator do
989
1011
  context "when the attribute is unique" do
990
1012
 
991
1013
  before do
992
- Dictionary.create(name: "Oxford")
1014
+ Dictionary.create!(name: "Oxford")
993
1015
  end
994
1016
 
995
1017
  let(:dictionary) do
@@ -1006,7 +1028,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1006
1028
  context "when the document is not the match" do
1007
1029
 
1008
1030
  before do
1009
- Dictionary.create(name: "Oxford")
1031
+ Dictionary.create!(name: "Oxford")
1010
1032
  end
1011
1033
 
1012
1034
  let(:dictionary) do
@@ -1019,14 +1041,14 @@ describe Mongoid::Validatable::UniquenessValidator do
1019
1041
 
1020
1042
  it "adds the uniqueness error" do
1021
1043
  dictionary.valid?
1022
- expect(dictionary.errors[:name]).to eq([ "is already taken" ])
1044
+ expect(dictionary.errors[:name]).to eq([ "has already been taken" ])
1023
1045
  end
1024
1046
  end
1025
1047
 
1026
1048
  context "when the document is the match in the database" do
1027
1049
 
1028
1050
  let!(:dictionary) do
1029
- Dictionary.create(name: "Oxford")
1051
+ Dictionary.create!(name: "Oxford")
1030
1052
  end
1031
1053
 
1032
1054
  it "returns true" do
@@ -1051,7 +1073,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1051
1073
  context "when there are no special characters" do
1052
1074
 
1053
1075
  before do
1054
- Dictionary.create(name: "Oxford")
1076
+ Dictionary.create!(name: "Oxford")
1055
1077
  end
1056
1078
 
1057
1079
  let(:dictionary) do
@@ -1066,7 +1088,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1066
1088
  context "when special characters exist" do
1067
1089
 
1068
1090
  before do
1069
- Dictionary.create(name: "Oxford")
1091
+ Dictionary.create!(name: "Oxford")
1070
1092
  end
1071
1093
 
1072
1094
  let(:dictionary) do
@@ -1084,7 +1106,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1084
1106
  context "when the document is not the match" do
1085
1107
 
1086
1108
  before do
1087
- Dictionary.create(name: "Oxford")
1109
+ Dictionary.create!(name: "Oxford")
1088
1110
  end
1089
1111
 
1090
1112
  let(:dictionary) do
@@ -1097,14 +1119,14 @@ describe Mongoid::Validatable::UniquenessValidator do
1097
1119
 
1098
1120
  it "adds the uniqueness error" do
1099
1121
  dictionary.valid?
1100
- expect(dictionary.errors[:name]).to eq([ "is already taken" ])
1122
+ expect(dictionary.errors[:name]).to eq([ "has already been taken" ])
1101
1123
  end
1102
1124
  end
1103
1125
 
1104
1126
  context "when the document is the match in the database" do
1105
1127
 
1106
1128
  let!(:dictionary) do
1107
- Dictionary.create(name: "Oxford")
1129
+ Dictionary.create!(name: "Oxford")
1108
1130
  end
1109
1131
 
1110
1132
  it "returns true" do
@@ -1134,7 +1156,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1134
1156
  context "when the attribute is nil" do
1135
1157
 
1136
1158
  before do
1137
- Dictionary.create
1159
+ Dictionary.create!
1138
1160
  end
1139
1161
 
1140
1162
  let(:dictionary) do
@@ -1160,7 +1182,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1160
1182
  context "when the attribute is blank" do
1161
1183
 
1162
1184
  before do
1163
- Dictionary.create(name: "")
1185
+ Dictionary.create!(name: "")
1164
1186
  end
1165
1187
 
1166
1188
  let(:dictionary) do
@@ -1189,7 +1211,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1189
1211
  context "when the attribute is unique" do
1190
1212
 
1191
1213
  before do
1192
- Login.create(username: "Oxford")
1214
+ Login.create!(username: "Oxford")
1193
1215
  end
1194
1216
 
1195
1217
  let(:login) do
@@ -1206,7 +1228,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1206
1228
  context "when the document is not the match" do
1207
1229
 
1208
1230
  before do
1209
- Login.create(username: "Oxford")
1231
+ Login.create!(username: "Oxford")
1210
1232
  end
1211
1233
 
1212
1234
  let(:login) do
@@ -1219,14 +1241,14 @@ describe Mongoid::Validatable::UniquenessValidator do
1219
1241
 
1220
1242
  it "adds the uniqueness error" do
1221
1243
  login.valid?
1222
- expect(login.errors[:username]).to eq([ "is already taken" ])
1244
+ expect(login.errors[:username]).to eq([ "has already been taken" ])
1223
1245
  end
1224
1246
  end
1225
1247
 
1226
1248
  context "when the document is the match in the database" do
1227
1249
 
1228
1250
  let!(:login) do
1229
- Login.create(username: "Oxford")
1251
+ Login.create!(username: "Oxford")
1230
1252
  end
1231
1253
 
1232
1254
  it "returns true" do
@@ -1249,7 +1271,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1249
1271
  context "when the attribute is unique" do
1250
1272
 
1251
1273
  before do
1252
- Login.create(username: "Oxford", application_id: 1)
1274
+ Login.create!(username: "Oxford", application_id: 1)
1253
1275
  end
1254
1276
 
1255
1277
  let(:login) do
@@ -1264,7 +1286,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1264
1286
  context "when the attribute is unique in the scope" do
1265
1287
 
1266
1288
  before do
1267
- Login.create(username: "Oxford", application_id: 1)
1289
+ Login.create!(username: "Oxford", application_id: 1)
1268
1290
  end
1269
1291
 
1270
1292
  let(:login) do
@@ -1279,7 +1301,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1279
1301
  context "when the attribute is not unique with no scope" do
1280
1302
 
1281
1303
  before do
1282
- Login.create(username: "Oxford", application_id: 1)
1304
+ Login.create!(username: "Oxford", application_id: 1)
1283
1305
  end
1284
1306
 
1285
1307
  let(:login) do
@@ -1294,7 +1316,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1294
1316
  context "when the attribute is not unique in another scope" do
1295
1317
 
1296
1318
  before do
1297
- Login.create(username: "Oxford", application_id: 1)
1319
+ Login.create!(username: "Oxford", application_id: 1)
1298
1320
  end
1299
1321
 
1300
1322
  let(:login) do
@@ -1311,7 +1333,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1311
1333
  context "when the document is not the match" do
1312
1334
 
1313
1335
  before do
1314
- Login.create(username: "Oxford", application_id: 1)
1336
+ Login.create!(username: "Oxford", application_id: 1)
1315
1337
  end
1316
1338
 
1317
1339
  let(:login) do
@@ -1324,14 +1346,14 @@ describe Mongoid::Validatable::UniquenessValidator do
1324
1346
 
1325
1347
  it "adds the uniqueness errors" do
1326
1348
  login.valid?
1327
- expect(login.errors[:username]).to eq([ "is already taken" ])
1349
+ expect(login.errors[:username]).to eq([ "has already been taken" ])
1328
1350
  end
1329
1351
  end
1330
1352
 
1331
1353
  context "when the document is the match in the database" do
1332
1354
 
1333
1355
  let!(:login) do
1334
- Login.create(username: "Oxford", application_id: 1)
1356
+ Login.create!(username: "Oxford", application_id: 1)
1335
1357
  end
1336
1358
 
1337
1359
  it "returns true" do
@@ -1354,7 +1376,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1354
1376
  context "when the attribute is unique" do
1355
1377
 
1356
1378
  before do
1357
- Login.create(username: "Oxford")
1379
+ Login.create!(username: "Oxford")
1358
1380
  end
1359
1381
 
1360
1382
  let(:login) do
@@ -1371,7 +1393,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1371
1393
  context "when the document is not the match" do
1372
1394
 
1373
1395
  before do
1374
- Login.create(username: "Oxford")
1396
+ Login.create!(username: "Oxford")
1375
1397
  end
1376
1398
 
1377
1399
  let(:login) do
@@ -1384,14 +1406,14 @@ describe Mongoid::Validatable::UniquenessValidator do
1384
1406
 
1385
1407
  it "adds the uniqueness error" do
1386
1408
  login.valid?
1387
- expect(login.errors[:username]).to eq([ "is already taken" ])
1409
+ expect(login.errors[:username]).to eq([ "has already been taken" ])
1388
1410
  end
1389
1411
  end
1390
1412
 
1391
1413
  context "when the document is the match in the database" do
1392
1414
 
1393
1415
  let!(:login) do
1394
- Login.create(username: "Oxford")
1416
+ Login.create!(username: "Oxford")
1395
1417
  end
1396
1418
 
1397
1419
  it "returns true" do
@@ -1416,7 +1438,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1416
1438
  context "when there are no special characters" do
1417
1439
 
1418
1440
  before do
1419
- Login.create(username: "Oxford")
1441
+ Login.create!(username: "Oxford")
1420
1442
  end
1421
1443
 
1422
1444
  let(:login) do
@@ -1431,7 +1453,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1431
1453
  context "when special characters exist" do
1432
1454
 
1433
1455
  before do
1434
- Login.create(username: "Oxford")
1456
+ Login.create!(username: "Oxford")
1435
1457
  end
1436
1458
 
1437
1459
  let(:login) do
@@ -1449,7 +1471,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1449
1471
  context "when the document is not the match" do
1450
1472
 
1451
1473
  before do
1452
- Login.create(username: "Oxford")
1474
+ Login.create!(username: "Oxford")
1453
1475
  end
1454
1476
 
1455
1477
  let(:login) do
@@ -1462,14 +1484,14 @@ describe Mongoid::Validatable::UniquenessValidator do
1462
1484
 
1463
1485
  it "adds the uniqueness error" do
1464
1486
  login.valid?
1465
- expect(login.errors[:username]).to eq([ "is already taken" ])
1487
+ expect(login.errors[:username]).to eq([ "has already been taken" ])
1466
1488
  end
1467
1489
  end
1468
1490
 
1469
1491
  context "when the document is the match in the database" do
1470
1492
 
1471
1493
  let!(:login) do
1472
- Login.create(username: "Oxford")
1494
+ Login.create!(username: "Oxford")
1473
1495
  end
1474
1496
 
1475
1497
  it "returns true" do
@@ -1492,7 +1514,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1492
1514
  context "when the attribute is nil" do
1493
1515
 
1494
1516
  before do
1495
- Login.create
1517
+ Login.create!
1496
1518
  end
1497
1519
 
1498
1520
  let(:login) do
@@ -1518,7 +1540,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1518
1540
  context "when the attribute is blank" do
1519
1541
 
1520
1542
  before do
1521
- Login.create(username: "")
1543
+ Login.create!(username: "")
1522
1544
  end
1523
1545
 
1524
1546
  let(:login) do
@@ -1545,7 +1567,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1545
1567
  context "when the attribute is unique" do
1546
1568
 
1547
1569
  before do
1548
- Bar.create(lat_lng: LatLng.new(52.30, 13.25))
1570
+ Bar.create!(lat_lng: LatLng.new(52.30, 13.25))
1549
1571
  end
1550
1572
 
1551
1573
  let(:unique_bar) do
@@ -1561,7 +1583,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1561
1583
  context "when the attribute is not unique" do
1562
1584
 
1563
1585
  before do
1564
- Bar.create(lat_lng: LatLng.new(52.30, 13.25))
1586
+ Bar.create!(lat_lng: LatLng.new(52.30, 13.25))
1565
1587
  end
1566
1588
 
1567
1589
  let(:non_unique_bar) do
@@ -1588,7 +1610,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1588
1610
  context "when the attribute is unique" do
1589
1611
 
1590
1612
  before do
1591
- Band.create(name: 'Foo', active: false)
1613
+ Band.create!(name: 'Foo', active: false)
1592
1614
  end
1593
1615
 
1594
1616
  let(:unique_band) do
@@ -1604,7 +1626,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1604
1626
  context "when the attribute is not unique" do
1605
1627
 
1606
1628
  before do
1607
- Band.create(name: 'Foo')
1629
+ Band.create!(name: 'Foo')
1608
1630
  end
1609
1631
 
1610
1632
  let(:non_unique_band) do
@@ -1622,17 +1644,41 @@ describe Mongoid::Validatable::UniquenessValidator do
1622
1644
  context "when the document is embedded" do
1623
1645
 
1624
1646
  let(:word) do
1625
- Word.create(name: "Schadenfreude")
1647
+ Word.create!(name: "Schadenfreude")
1626
1648
  end
1627
1649
 
1628
1650
  context "when in an embeds_many" do
1629
1651
 
1630
1652
  let!(:def_one) do
1631
- word.definitions.create(description: "1")
1653
+ word.definitions.create!(description: "1")
1632
1654
  end
1633
1655
 
1634
1656
  let!(:def_two) do
1635
- word.definitions.create(description: "2")
1657
+ word.definitions.create!(description: "2")
1658
+ end
1659
+
1660
+ context "when setting the read preference to non-primary" do
1661
+
1662
+ before do
1663
+ Definition.validates_uniqueness_of :description
1664
+ end
1665
+
1666
+ after do
1667
+ Definition.reset_callbacks(:validate)
1668
+ end
1669
+
1670
+ let(:word) { Word.create! }
1671
+
1672
+ it "reads from the primary" do
1673
+ expect_any_instance_of(Mongoid::Criteria).to receive(:read).once.and_wrap_original do |m, *args, **kwargs|
1674
+ crit = m.call(*args, **kwargs)
1675
+ expect(crit.options[:read]).to eq({ mode: :primary })
1676
+ crit
1677
+ end
1678
+ Definition.with(read: { mode: :secondary }) do |klass|
1679
+ word.definitions.create!
1680
+ end
1681
+ end
1636
1682
  end
1637
1683
 
1638
1684
  context "when a document is being destroyed" do
@@ -1711,7 +1757,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1711
1757
 
1712
1758
  it "adds the uniqueness error" do
1713
1759
  definition.valid?
1714
- expect(definition.errors[:description]).to eq([ "is already taken" ])
1760
+ expect(definition.errors[:description]).to eq([ "has already been taken" ])
1715
1761
  end
1716
1762
  end
1717
1763
 
@@ -1839,7 +1885,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1839
1885
 
1840
1886
  it "adds the uniqueness errors" do
1841
1887
  definition.valid?
1842
- expect(definition.errors[:description]).to eq([ "is already taken" ])
1888
+ expect(definition.errors[:description]).to eq([ "has already been taken" ])
1843
1889
  end
1844
1890
  end
1845
1891
 
@@ -1977,7 +2023,7 @@ describe Mongoid::Validatable::UniquenessValidator do
1977
2023
 
1978
2024
  it "adds the uniqueness errors" do
1979
2025
  definition.valid?
1980
- expect(definition.errors[:description]).to eq([ "is already taken" ])
2026
+ expect(definition.errors[:description]).to eq([ "has already been taken" ])
1981
2027
  end
1982
2028
  end
1983
2029
 
@@ -2041,7 +2087,7 @@ describe Mongoid::Validatable::UniquenessValidator do
2041
2087
 
2042
2088
  it "adds the uniqueness error" do
2043
2089
  definition.valid?
2044
- expect(definition.errors[:description]).to eq([ "is already taken" ])
2090
+ expect(definition.errors[:description]).to eq([ "has already been taken" ])
2045
2091
  end
2046
2092
  end
2047
2093
 
@@ -2119,7 +2165,7 @@ describe Mongoid::Validatable::UniquenessValidator do
2119
2165
 
2120
2166
  it "adds the uniqueness error" do
2121
2167
  definition.valid?
2122
- expect(definition.errors[:description]).to eq([ "is already taken" ])
2168
+ expect(definition.errors[:description]).to eq([ "has already been taken" ])
2123
2169
  end
2124
2170
  end
2125
2171
 
@@ -2215,7 +2261,7 @@ describe Mongoid::Validatable::UniquenessValidator do
2215
2261
  it "adds the uniqueness error to the aliased field name" do
2216
2262
  definition.valid?
2217
2263
  expect(definition.errors).to have_key(:part)
2218
- expect(definition.errors[:part]).to eq([ "is already taken" ])
2264
+ expect(definition.errors[:part]).to eq([ "has already been taken" ])
2219
2265
  end
2220
2266
  end
2221
2267
 
@@ -2232,7 +2278,7 @@ describe Mongoid::Validatable::UniquenessValidator do
2232
2278
  it "adds the uniqueness error to the underlying field name" do
2233
2279
  definition.valid?
2234
2280
  expect(definition.errors).to have_key(:p)
2235
- expect(definition.errors[:p]).to eq([ "is already taken" ])
2281
+ expect(definition.errors[:p]).to eq([ "has already been taken" ])
2236
2282
  end
2237
2283
  end
2238
2284
 
@@ -2251,7 +2297,7 @@ describe Mongoid::Validatable::UniquenessValidator do
2251
2297
  it "adds the uniqueness error to the aliased field name" do
2252
2298
  definition.valid?
2253
2299
  expect(definition.errors).to have_key(:synonyms)
2254
- expect(definition.errors[:synonyms]).to eq([ "is already taken" ])
2300
+ expect(definition.errors[:synonyms]).to eq([ "has already been taken" ])
2255
2301
  end
2256
2302
  end
2257
2303
 
@@ -2268,7 +2314,7 @@ describe Mongoid::Validatable::UniquenessValidator do
2268
2314
  it "adds the uniqueness error to the aliased field name" do
2269
2315
  definition.valid?
2270
2316
  expect(definition.errors).to have_key(:syn)
2271
- expect(definition.errors[:syn]).to eq([ "is already taken" ])
2317
+ expect(definition.errors[:syn]).to eq([ "has already been taken" ])
2272
2318
  end
2273
2319
  end
2274
2320
  end
@@ -2320,7 +2366,7 @@ describe Mongoid::Validatable::UniquenessValidator do
2320
2366
 
2321
2367
  it "adds the uniqueness error" do
2322
2368
  word_origin.valid?
2323
- expect(word_origin.errors[:origin_id]).to eq([ "is already taken" ])
2369
+ expect(word_origin.errors[:origin_id]).to eq([ "has already been taken" ])
2324
2370
  end
2325
2371
  end
2326
2372
 
@@ -2445,7 +2491,7 @@ describe Mongoid::Validatable::UniquenessValidator do
2445
2491
  it "should be invalid" do
2446
2492
  subclass_document_with_duplicated_name.tap do |d|
2447
2493
  expect(d).to be_invalid
2448
- expect(d.errors[:name]).to eq([ "is already taken" ])
2494
+ expect(d.errors[:name]).to eq([ "has already been taken" ])
2449
2495
  end
2450
2496
  end
2451
2497
  end
@@ -2459,7 +2505,7 @@ describe Mongoid::Validatable::UniquenessValidator do
2459
2505
  end
2460
2506
 
2461
2507
  let!(:person) do
2462
- Person.create(ssn: "132-11-1111", username: "aaasdaffff")
2508
+ Person.create!(ssn: "132-11-1111", username: "aaasdaffff")
2463
2509
  end
2464
2510
 
2465
2511
  after do
@@ -2473,4 +2519,29 @@ describe Mongoid::Validatable::UniquenessValidator do
2473
2519
  }.to raise_error(Mongo::Error::OperationFailure)
2474
2520
  end
2475
2521
  end
2522
+
2523
+ describe "i18n" do
2524
+
2525
+ context 'when using a different locale' do
2526
+ with_default_i18n_configs
2527
+
2528
+ before do
2529
+ I18n.locale = :fr
2530
+ # Translation key location is as per rails-i18n gem.
2531
+ # See: https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/en.yml
2532
+ I18n.backend.store_translations(:fr, { errors: { messages: { taken: 'est déjà utilisé(e)' } } })
2533
+ end
2534
+
2535
+ after do
2536
+ I18n.backend.translations.delete(:fr)
2537
+ end
2538
+
2539
+ it "correctly translates the error message" do
2540
+ Circus.create!(slogan: 'The Greatest Show on Mars')
2541
+ dict = Circus.new(slogan: 'The Greatest Show on Mars')
2542
+ dict.valid?
2543
+ expect(dict.errors.messages[:slogan]).to eq(["est déjà utilisé(e)"])
2544
+ end
2545
+ end
2546
+ end
2476
2547
  end