mongoid 3.1.5 → 8.0.2

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 (1501) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +636 -33
  4. data/LICENSE +2 -1
  5. data/README.md +32 -24
  6. data/Rakefile +75 -5
  7. data/lib/config/locales/en.yml +301 -132
  8. data/lib/mongoid/association/accessors.rb +431 -0
  9. data/lib/mongoid/association/bindable.rb +227 -0
  10. data/lib/mongoid/association/builders.rb +86 -0
  11. data/lib/mongoid/association/constrainable.rb +42 -0
  12. data/lib/mongoid/association/depending.rb +128 -0
  13. data/lib/mongoid/association/eager_loadable.rb +57 -0
  14. data/lib/mongoid/association/embedded/batchable.rb +398 -0
  15. data/lib/mongoid/association/embedded/cyclic.rb +102 -0
  16. data/lib/mongoid/association/embedded/embedded_in/binding.rb +74 -0
  17. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +38 -0
  18. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +111 -0
  19. data/lib/mongoid/association/embedded/embedded_in.rb +135 -0
  20. data/lib/mongoid/association/embedded/embeds_many/binding.rb +42 -0
  21. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +45 -0
  22. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +571 -0
  23. data/lib/mongoid/association/embedded/embeds_many.rb +183 -0
  24. data/lib/mongoid/association/embedded/embeds_one/binding.rb +43 -0
  25. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +53 -0
  26. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +164 -0
  27. data/lib/mongoid/association/embedded/embeds_one.rb +150 -0
  28. data/lib/mongoid/association/embedded.rb +6 -0
  29. data/lib/mongoid/association/macros.rb +228 -0
  30. data/lib/mongoid/association/many.rb +202 -0
  31. data/lib/mongoid/association/marshalable.rb +31 -0
  32. data/lib/mongoid/association/nested/many.rb +192 -0
  33. data/lib/mongoid/association/nested/nested_buildable.rb +66 -0
  34. data/lib/mongoid/association/nested/one.rb +116 -0
  35. data/lib/mongoid/association/nested.rb +15 -0
  36. data/lib/mongoid/association/one.rb +53 -0
  37. data/lib/mongoid/association/options.rb +122 -0
  38. data/lib/mongoid/association/proxy.rb +200 -0
  39. data/lib/mongoid/association/referenced/auto_save.rb +74 -0
  40. data/lib/mongoid/association/referenced/belongs_to/binding.rb +83 -0
  41. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +48 -0
  42. data/lib/mongoid/association/referenced/belongs_to/eager.rb +73 -0
  43. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +124 -0
  44. data/lib/mongoid/association/referenced/belongs_to.rb +226 -0
  45. data/lib/mongoid/association/referenced/counter_cache.rb +152 -0
  46. data/lib/mongoid/association/referenced/eager.rb +163 -0
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +72 -0
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +40 -0
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +53 -0
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +345 -0
  51. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +273 -0
  52. data/lib/mongoid/association/referenced/has_many/binding.rb +36 -0
  53. data/lib/mongoid/association/referenced/has_many/buildable.rb +38 -0
  54. data/lib/mongoid/association/referenced/has_many/eager.rb +44 -0
  55. data/lib/mongoid/association/referenced/has_many/enumerable.rb +494 -0
  56. data/lib/mongoid/association/referenced/has_many/proxy.rb +551 -0
  57. data/lib/mongoid/association/referenced/has_many.rb +251 -0
  58. data/lib/mongoid/association/referenced/has_one/binding.rb +42 -0
  59. data/lib/mongoid/association/referenced/has_one/buildable.rb +74 -0
  60. data/lib/mongoid/association/referenced/has_one/eager.rb +36 -0
  61. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +113 -0
  62. data/lib/mongoid/association/referenced/has_one/proxy.rb +108 -0
  63. data/lib/mongoid/association/referenced/has_one.rb +184 -0
  64. data/lib/mongoid/association/referenced/syncable.rb +155 -0
  65. data/lib/mongoid/association/referenced.rb +9 -0
  66. data/lib/mongoid/association/reflections.rb +69 -0
  67. data/lib/mongoid/association/relatable.rb +489 -0
  68. data/lib/mongoid/association.rb +135 -0
  69. data/lib/mongoid/atomic/modifiers.rb +41 -61
  70. data/lib/mongoid/atomic/paths/embedded/many.rb +24 -8
  71. data/lib/mongoid/atomic/paths/embedded/one.rb +5 -8
  72. data/lib/mongoid/atomic/paths/embedded.rb +3 -34
  73. data/lib/mongoid/atomic/paths/root.rb +4 -20
  74. data/lib/mongoid/atomic/paths.rb +2 -1
  75. data/lib/mongoid/atomic.rb +52 -69
  76. data/lib/mongoid/attributes/dynamic.rb +141 -0
  77. data/lib/mongoid/attributes/nested.rb +93 -0
  78. data/lib/mongoid/attributes/processing.rb +35 -97
  79. data/lib/mongoid/attributes/projector.rb +119 -0
  80. data/lib/mongoid/attributes/readonly.rb +27 -10
  81. data/lib/mongoid/attributes.rb +159 -181
  82. data/lib/mongoid/cacheable.rb +33 -0
  83. data/lib/mongoid/changeable.rb +420 -0
  84. data/lib/mongoid/clients/factory.rb +105 -0
  85. data/lib/mongoid/clients/options.rb +111 -0
  86. data/lib/mongoid/clients/sessions.rb +113 -0
  87. data/lib/mongoid/clients/storage_options.rb +79 -0
  88. data/lib/mongoid/clients/validators/storage.rb +58 -0
  89. data/lib/mongoid/clients/validators.rb +3 -0
  90. data/lib/mongoid/clients.rb +79 -0
  91. data/lib/mongoid/composable.rb +128 -0
  92. data/lib/mongoid/config/environment.rb +51 -13
  93. data/lib/mongoid/config/options.rb +30 -18
  94. data/lib/mongoid/config/validators/client.rb +128 -0
  95. data/lib/mongoid/config/validators/option.rb +3 -4
  96. data/lib/mongoid/config/validators.rb +3 -2
  97. data/lib/mongoid/config.rb +170 -89
  98. data/lib/mongoid/contextual/aggregable/memory.rb +40 -27
  99. data/lib/mongoid/contextual/aggregable/mongo.rb +33 -36
  100. data/lib/mongoid/contextual/aggregable/none.rb +65 -0
  101. data/lib/mongoid/contextual/aggregable.rb +17 -0
  102. data/lib/mongoid/contextual/atomic.rb +80 -79
  103. data/lib/mongoid/contextual/command.rb +8 -11
  104. data/lib/mongoid/contextual/geo_near.rb +42 -44
  105. data/lib/mongoid/contextual/map_reduce.rb +33 -127
  106. data/lib/mongoid/contextual/memory.rb +226 -88
  107. data/lib/mongoid/contextual/mongo.rb +466 -293
  108. data/lib/mongoid/contextual/none.rb +193 -0
  109. data/lib/mongoid/contextual/queryable.rb +3 -4
  110. data/lib/mongoid/contextual.rb +11 -11
  111. data/lib/mongoid/copyable.rb +68 -20
  112. data/lib/mongoid/criteria/findable.rb +143 -0
  113. data/lib/mongoid/criteria/includable.rb +92 -0
  114. data/lib/mongoid/criteria/inspectable.rb +24 -0
  115. data/lib/mongoid/criteria/marshalable.rb +55 -0
  116. data/lib/mongoid/criteria/modifiable.rb +235 -0
  117. data/lib/mongoid/criteria/options.rb +24 -0
  118. data/lib/mongoid/criteria/permission.rb +71 -0
  119. data/lib/mongoid/criteria/queryable/aggregable.rb +109 -0
  120. data/lib/mongoid/criteria/queryable/expandable.rb +68 -0
  121. data/lib/mongoid/criteria/queryable/extensions/array.rb +151 -0
  122. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +57 -0
  123. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +33 -0
  124. data/lib/mongoid/criteria/queryable/extensions/date.rb +63 -0
  125. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +52 -0
  126. data/lib/mongoid/criteria/queryable/extensions/hash.rb +163 -0
  127. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +75 -0
  128. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +81 -0
  129. data/lib/mongoid/criteria/queryable/extensions/object.rb +182 -0
  130. data/lib/mongoid/criteria/queryable/extensions/range.rb +102 -0
  131. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +72 -0
  132. data/lib/mongoid/criteria/queryable/extensions/set.rb +33 -0
  133. data/lib/mongoid/criteria/queryable/extensions/string.rb +122 -0
  134. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +74 -0
  135. data/lib/mongoid/criteria/queryable/extensions/time.rb +60 -0
  136. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +66 -0
  137. data/lib/mongoid/criteria/queryable/extensions.rb +25 -0
  138. data/lib/mongoid/criteria/queryable/key.rb +177 -0
  139. data/lib/mongoid/criteria/queryable/macroable.rb +26 -0
  140. data/lib/mongoid/criteria/queryable/mergeable.rb +434 -0
  141. data/lib/mongoid/criteria/queryable/optional.rb +380 -0
  142. data/lib/mongoid/criteria/queryable/options.rb +136 -0
  143. data/lib/mongoid/criteria/queryable/pipeline.rb +106 -0
  144. data/lib/mongoid/criteria/queryable/selectable.rb +937 -0
  145. data/lib/mongoid/criteria/queryable/selector.rb +287 -0
  146. data/lib/mongoid/criteria/queryable/smash.rb +128 -0
  147. data/lib/mongoid/criteria/queryable/storable.rb +237 -0
  148. data/lib/mongoid/criteria/queryable.rb +90 -0
  149. data/lib/mongoid/criteria/scopable.rb +166 -0
  150. data/lib/mongoid/criteria.rb +177 -189
  151. data/lib/mongoid/deprecable.rb +36 -0
  152. data/lib/mongoid/deprecation.rb +25 -0
  153. data/lib/mongoid/document.rb +193 -139
  154. data/lib/mongoid/equality.rb +35 -18
  155. data/lib/mongoid/errors/ambiguous_relationship.rb +5 -6
  156. data/lib/mongoid/errors/callback.rb +2 -3
  157. data/lib/mongoid/errors/criteria_argument_required.rb +18 -0
  158. data/lib/mongoid/errors/delete_restriction.rb +10 -13
  159. data/lib/mongoid/errors/document_not_destroyed.rb +22 -0
  160. data/lib/mongoid/errors/document_not_found.rb +36 -21
  161. data/lib/mongoid/errors/empty_config_file.rb +25 -0
  162. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +19 -0
  163. data/lib/mongoid/errors/invalid_collection.rb +2 -1
  164. data/lib/mongoid/errors/invalid_config_file.rb +25 -0
  165. data/lib/mongoid/errors/invalid_config_option.rb +3 -4
  166. data/lib/mongoid/errors/invalid_dependent_strategy.rb +31 -0
  167. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +24 -0
  168. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  169. data/lib/mongoid/errors/invalid_elem_match_operator.rb +32 -0
  170. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +25 -0
  171. data/lib/mongoid/errors/invalid_expression_operator.rb +27 -0
  172. data/lib/mongoid/errors/invalid_field.rb +10 -9
  173. data/lib/mongoid/errors/invalid_field_operator.rb +32 -0
  174. data/lib/mongoid/errors/invalid_field_option.rb +2 -3
  175. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  176. data/lib/mongoid/errors/invalid_find.rb +2 -3
  177. data/lib/mongoid/errors/invalid_includes.rb +2 -3
  178. data/lib/mongoid/errors/invalid_index.rb +2 -3
  179. data/lib/mongoid/errors/invalid_options.rb +4 -5
  180. data/lib/mongoid/errors/invalid_path.rb +2 -3
  181. data/lib/mongoid/errors/invalid_persistence_option.rb +26 -0
  182. data/lib/mongoid/errors/invalid_query.rb +40 -0
  183. data/lib/mongoid/errors/invalid_relation.rb +61 -0
  184. data/lib/mongoid/errors/invalid_relation_option.rb +28 -0
  185. data/lib/mongoid/errors/invalid_scope.rb +2 -3
  186. data/lib/mongoid/errors/invalid_session_use.rb +21 -0
  187. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +6 -5
  188. data/lib/mongoid/errors/invalid_storage_options.rb +4 -5
  189. data/lib/mongoid/errors/invalid_storage_parent.rb +25 -0
  190. data/lib/mongoid/errors/invalid_time.rb +2 -3
  191. data/lib/mongoid/errors/inverse_not_found.rb +4 -5
  192. data/lib/mongoid/errors/mixed_client_configuration.rb +27 -0
  193. data/lib/mongoid/errors/mixed_relations.rb +2 -3
  194. data/lib/mongoid/errors/mongoid_error.rb +22 -23
  195. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +3 -4
  196. data/lib/mongoid/errors/no_client_config.rb +21 -0
  197. data/lib/mongoid/errors/no_client_database.rb +26 -0
  198. data/lib/mongoid/errors/no_client_hosts.rb +26 -0
  199. data/lib/mongoid/errors/no_clients_config.rb +19 -0
  200. data/lib/mongoid/errors/no_default_client.rb +22 -0
  201. data/lib/mongoid/errors/no_environment.rb +2 -3
  202. data/lib/mongoid/errors/no_map_reduce_output.rb +2 -3
  203. data/lib/mongoid/errors/no_metadata.rb +2 -3
  204. data/lib/mongoid/errors/no_parent.rb +2 -3
  205. data/lib/mongoid/errors/readonly_attribute.rb +3 -4
  206. data/lib/mongoid/errors/readonly_document.rb +21 -0
  207. data/lib/mongoid/errors/scope_overwrite.rb +2 -1
  208. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +3 -1
  209. data/lib/mongoid/errors/unknown_attribute.rb +3 -4
  210. data/lib/mongoid/errors/unknown_model.rb +24 -0
  211. data/lib/mongoid/errors/unsaved_document.rb +3 -2
  212. data/lib/mongoid/errors/unsupported_javascript.rb +2 -3
  213. data/lib/mongoid/errors/validations.rb +2 -1
  214. data/lib/mongoid/errors.rb +30 -9
  215. data/lib/mongoid/evolvable.rb +4 -5
  216. data/lib/mongoid/extensions/array.rb +45 -52
  217. data/lib/mongoid/extensions/big_decimal.rb +41 -22
  218. data/lib/mongoid/extensions/binary.rb +42 -0
  219. data/lib/mongoid/extensions/boolean.rb +19 -17
  220. data/lib/mongoid/extensions/date.rb +33 -23
  221. data/lib/mongoid/extensions/date_time.rb +5 -13
  222. data/lib/mongoid/extensions/decimal128.rb +36 -0
  223. data/lib/mongoid/extensions/false_class.rb +5 -8
  224. data/lib/mongoid/extensions/float.rb +11 -16
  225. data/lib/mongoid/extensions/hash.rb +88 -49
  226. data/lib/mongoid/extensions/integer.rb +10 -18
  227. data/lib/mongoid/extensions/module.rb +3 -4
  228. data/lib/mongoid/extensions/nil_class.rb +2 -5
  229. data/lib/mongoid/extensions/object.rb +38 -62
  230. data/lib/mongoid/extensions/object_id.rb +7 -12
  231. data/lib/mongoid/extensions/range.rb +46 -17
  232. data/lib/mongoid/extensions/regexp.rb +15 -8
  233. data/lib/mongoid/extensions/set.rb +17 -15
  234. data/lib/mongoid/extensions/string.rb +40 -80
  235. data/lib/mongoid/extensions/symbol.rb +7 -23
  236. data/lib/mongoid/extensions/time.rb +42 -25
  237. data/lib/mongoid/extensions/time_with_zone.rb +27 -10
  238. data/lib/mongoid/extensions/true_class.rb +5 -8
  239. data/lib/mongoid/extensions.rb +31 -13
  240. data/lib/mongoid/factory.rb +99 -11
  241. data/lib/mongoid/fields/foreign_key.rb +26 -34
  242. data/lib/mongoid/fields/localized.rb +24 -13
  243. data/lib/mongoid/fields/standard.rb +19 -73
  244. data/lib/mongoid/fields/validators/macro.rb +56 -15
  245. data/lib/mongoid/fields/validators.rb +2 -1
  246. data/lib/mongoid/fields.rb +342 -87
  247. data/lib/mongoid/findable.rb +219 -0
  248. data/lib/mongoid/indexable/specification.rb +103 -0
  249. data/lib/mongoid/indexable/validators/options.rb +110 -0
  250. data/lib/mongoid/indexable.rb +148 -0
  251. data/lib/mongoid/inspectable.rb +52 -0
  252. data/lib/mongoid/interceptable.rb +312 -0
  253. data/lib/mongoid/loggable.rb +15 -18
  254. data/lib/mongoid/matchable.rb +23 -0
  255. data/lib/mongoid/matcher/all.rb +22 -0
  256. data/lib/mongoid/matcher/and.rb +21 -0
  257. data/lib/mongoid/matcher/bits.rb +41 -0
  258. data/lib/mongoid/matcher/bits_all_clear.rb +20 -0
  259. data/lib/mongoid/matcher/bits_all_set.rb +20 -0
  260. data/lib/mongoid/matcher/bits_any_clear.rb +20 -0
  261. data/lib/mongoid/matcher/bits_any_set.rb +20 -0
  262. data/lib/mongoid/matcher/elem_match.rb +36 -0
  263. data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
  264. data/lib/mongoid/matcher/eq.rb +11 -0
  265. data/lib/mongoid/matcher/eq_impl.rb +67 -0
  266. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +26 -0
  267. data/lib/mongoid/matcher/exists.rb +15 -0
  268. data/lib/mongoid/matcher/expression.rb +35 -0
  269. data/lib/mongoid/matcher/expression_operator.rb +19 -0
  270. data/lib/mongoid/matcher/field_expression.rb +62 -0
  271. data/lib/mongoid/matcher/field_operator.rb +54 -0
  272. data/lib/mongoid/matcher/gt.rb +17 -0
  273. data/lib/mongoid/matcher/gte.rb +17 -0
  274. data/lib/mongoid/matcher/in.rb +25 -0
  275. data/lib/mongoid/matcher/lt.rb +17 -0
  276. data/lib/mongoid/matcher/lte.rb +17 -0
  277. data/lib/mongoid/matcher/mod.rb +17 -0
  278. data/lib/mongoid/matcher/ne.rb +16 -0
  279. data/lib/mongoid/matcher/nin.rb +11 -0
  280. data/lib/mongoid/matcher/nor.rb +25 -0
  281. data/lib/mongoid/matcher/not.rb +29 -0
  282. data/lib/mongoid/matcher/or.rb +21 -0
  283. data/lib/mongoid/matcher/regex.rb +41 -0
  284. data/lib/mongoid/matcher/size.rb +26 -0
  285. data/lib/mongoid/matcher/type.rb +99 -0
  286. data/lib/mongoid/matcher.rb +115 -0
  287. data/lib/mongoid/persistable/creatable.rb +181 -0
  288. data/lib/mongoid/persistable/deletable.rb +132 -0
  289. data/lib/mongoid/persistable/destroyable.rb +57 -0
  290. data/lib/mongoid/persistable/incrementable.rb +35 -0
  291. data/lib/mongoid/persistable/logical.rb +36 -0
  292. data/lib/mongoid/persistable/poppable.rb +36 -0
  293. data/lib/mongoid/persistable/pullable.rb +50 -0
  294. data/lib/mongoid/persistable/pushable.rb +66 -0
  295. data/lib/mongoid/persistable/renamable.rb +37 -0
  296. data/lib/mongoid/persistable/savable.rb +47 -0
  297. data/lib/mongoid/persistable/settable.rb +93 -0
  298. data/lib/mongoid/persistable/unsettable.rb +36 -0
  299. data/lib/mongoid/persistable/updatable.rb +165 -0
  300. data/lib/mongoid/persistable/upsertable.rb +51 -0
  301. data/lib/mongoid/persistable.rb +305 -0
  302. data/lib/mongoid/persistence_context.rb +239 -0
  303. data/lib/mongoid/positional.rb +72 -0
  304. data/lib/mongoid/query_cache.rb +64 -0
  305. data/lib/mongoid/railtie.rb +35 -78
  306. data/lib/mongoid/railties/controller_runtime.rb +88 -0
  307. data/lib/mongoid/railties/database.rake +18 -25
  308. data/lib/mongoid/reloadable.rb +94 -0
  309. data/lib/mongoid/scopable.rb +324 -0
  310. data/lib/mongoid/selectable.rb +49 -0
  311. data/lib/mongoid/serializable.rb +170 -0
  312. data/lib/mongoid/shardable.rb +130 -0
  313. data/lib/mongoid/stateful.rb +134 -0
  314. data/lib/mongoid/stringified_symbol.rb +52 -0
  315. data/lib/mongoid/tasks/database.rake +38 -0
  316. data/lib/mongoid/tasks/database.rb +194 -0
  317. data/lib/mongoid/threaded/lifecycle.rb +28 -70
  318. data/lib/mongoid/threaded.rb +142 -219
  319. data/lib/mongoid/timestamps/created/short.rb +2 -1
  320. data/lib/mongoid/timestamps/created.rb +9 -5
  321. data/lib/mongoid/timestamps/short.rb +2 -1
  322. data/lib/mongoid/timestamps/timeless.rb +52 -16
  323. data/lib/mongoid/timestamps/updated/short.rb +4 -3
  324. data/lib/mongoid/timestamps/updated.rb +14 -9
  325. data/lib/mongoid/timestamps.rb +4 -3
  326. data/lib/mongoid/touchable.rb +131 -0
  327. data/lib/mongoid/traversable.rb +337 -0
  328. data/lib/mongoid/validatable/associated.rb +47 -0
  329. data/lib/mongoid/validatable/format.rb +21 -0
  330. data/lib/mongoid/validatable/length.rb +21 -0
  331. data/lib/mongoid/validatable/localizable.rb +29 -0
  332. data/lib/mongoid/validatable/macros.rb +89 -0
  333. data/lib/mongoid/validatable/presence.rb +81 -0
  334. data/lib/mongoid/validatable/queryable.rb +29 -0
  335. data/lib/mongoid/validatable/uniqueness.rb +304 -0
  336. data/lib/mongoid/validatable.rb +160 -0
  337. data/lib/mongoid/version.rb +3 -2
  338. data/lib/mongoid/warnings.rb +28 -0
  339. data/lib/mongoid.rb +68 -109
  340. data/lib/rails/generators/mongoid/config/config_generator.rb +10 -2
  341. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +150 -45
  342. data/lib/rails/generators/mongoid/model/model_generator.rb +3 -3
  343. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -4
  344. data/lib/rails/generators/mongoid_generator.rb +5 -41
  345. data/lib/rails/mongoid.rb +6 -129
  346. data/spec/README.md +33 -0
  347. data/spec/config/mongoid.yml +56 -25
  348. data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
  349. data/spec/integration/app_spec.rb +345 -0
  350. data/spec/integration/associations/belongs_to_spec.rb +33 -0
  351. data/spec/integration/associations/embedded_dirty_spec.rb +57 -0
  352. data/spec/integration/associations/embedded_spec.rb +283 -0
  353. data/spec/integration/associations/embeds_many_spec.rb +219 -0
  354. data/spec/integration/associations/embeds_one_spec.rb +41 -0
  355. data/spec/integration/associations/foreign_key_spec.rb +107 -0
  356. data/spec/integration/associations/foreign_key_spec_models.rb +64 -0
  357. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  358. data/spec/integration/associations/has_many_spec.rb +128 -0
  359. data/spec/integration/associations/has_one_spec.rb +272 -0
  360. data/spec/integration/associations/nested_attributes_assignment_spec.rb +115 -0
  361. data/spec/integration/associations/reverse_population_spec.rb +34 -0
  362. data/spec/integration/associations/reverse_population_spec_models.rb +36 -0
  363. data/spec/integration/associations/scope_option_spec.rb +101 -0
  364. data/spec/integration/atomic/modifiers_spec.rb +116 -0
  365. data/spec/integration/bson_regexp_raw_spec.rb +19 -0
  366. data/spec/integration/callbacks_models.rb +155 -0
  367. data/spec/integration/callbacks_spec.rb +450 -0
  368. data/spec/integration/contextual/empty_spec.rb +141 -0
  369. data/spec/integration/criteria/alias_query_spec.rb +161 -0
  370. data/spec/integration/criteria/date_field_spec.rb +40 -0
  371. data/spec/integration/criteria/default_scope_spec.rb +72 -0
  372. data/spec/integration/criteria/logical_spec.rb +124 -0
  373. data/spec/integration/criteria/range_spec.rb +359 -0
  374. data/spec/integration/criteria/time_with_zone_spec.rb +142 -0
  375. data/spec/integration/discriminator_key_spec.rb +392 -0
  376. data/spec/integration/discriminator_value_spec.rb +206 -0
  377. data/spec/integration/document_spec.rb +51 -0
  378. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  379. data/spec/integration/i18n_fallbacks_spec.rb +89 -0
  380. data/spec/integration/matcher_examples_spec.rb +765 -0
  381. data/spec/integration/matcher_operator_data/all.yml +140 -0
  382. data/spec/integration/matcher_operator_data/and.yml +93 -0
  383. data/spec/integration/matcher_operator_data/bits_all_clear.yml +159 -0
  384. data/spec/integration/matcher_operator_data/bits_all_set.yml +159 -0
  385. data/spec/integration/matcher_operator_data/bits_any_clear.yml +159 -0
  386. data/spec/integration/matcher_operator_data/bits_any_set.yml +159 -0
  387. data/spec/integration/matcher_operator_data/comment.yml +22 -0
  388. data/spec/integration/matcher_operator_data/elem_match.yml +409 -0
  389. data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
  390. data/spec/integration/matcher_operator_data/eq.yml +191 -0
  391. data/spec/integration/matcher_operator_data/exists.yml +213 -0
  392. data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
  393. data/spec/integration/matcher_operator_data/gt.yml +132 -0
  394. data/spec/integration/matcher_operator_data/gt_types.yml +63 -0
  395. data/spec/integration/matcher_operator_data/gte.yml +132 -0
  396. data/spec/integration/matcher_operator_data/gte_types.yml +15 -0
  397. data/spec/integration/matcher_operator_data/implicit.yml +331 -0
  398. data/spec/integration/matcher_operator_data/implicit_traversal.yml +112 -0
  399. data/spec/integration/matcher_operator_data/in.yml +210 -0
  400. data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
  401. data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
  402. data/spec/integration/matcher_operator_data/lt.yml +132 -0
  403. data/spec/integration/matcher_operator_data/lt_types.yml +15 -0
  404. data/spec/integration/matcher_operator_data/lte.yml +132 -0
  405. data/spec/integration/matcher_operator_data/lte_types.yml +15 -0
  406. data/spec/integration/matcher_operator_data/mod.yml +55 -0
  407. data/spec/integration/matcher_operator_data/multiple.yml +29 -0
  408. data/spec/integration/matcher_operator_data/ne.yml +150 -0
  409. data/spec/integration/matcher_operator_data/ne_types.yml +15 -0
  410. data/spec/integration/matcher_operator_data/nin.yml +114 -0
  411. data/spec/integration/matcher_operator_data/nor.yml +126 -0
  412. data/spec/integration/matcher_operator_data/not.yml +196 -0
  413. data/spec/integration/matcher_operator_data/or.yml +137 -0
  414. data/spec/integration/matcher_operator_data/regex.yml +174 -0
  415. data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
  416. data/spec/integration/matcher_operator_data/size.yml +174 -0
  417. data/spec/integration/matcher_operator_data/type.yml +70 -0
  418. data/spec/integration/matcher_operator_data/type_array.yml +16 -0
  419. data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
  420. data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
  421. data/spec/integration/matcher_operator_data/type_code.yml +26 -0
  422. data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
  423. data/spec/integration/matcher_operator_data/type_date.yml +39 -0
  424. data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
  425. data/spec/integration/matcher_operator_data/type_decimal.yml +41 -0
  426. data/spec/integration/matcher_operator_data/type_double.yml +15 -0
  427. data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
  428. data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
  429. data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
  430. data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
  431. data/spec/integration/matcher_operator_data/type_null.yml +23 -0
  432. data/spec/integration/matcher_operator_data/type_object.yml +23 -0
  433. data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
  434. data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
  435. data/spec/integration/matcher_operator_data/type_string.yml +15 -0
  436. data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
  437. data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
  438. data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
  439. data/spec/integration/matcher_operator_spec.rb +122 -0
  440. data/spec/integration/matcher_spec.rb +283 -0
  441. data/spec/integration/persistence/range_field_spec.rb +350 -0
  442. data/spec/integration/server_query_spec.rb +141 -0
  443. data/spec/integration/shardable_spec.rb +148 -0
  444. data/spec/integration/stringified_symbol_field_spec.rb +203 -0
  445. data/spec/lite_spec_helper.rb +83 -0
  446. data/spec/mongoid/association/accessors_spec.rb +1067 -0
  447. data/spec/mongoid/association/auto_save_spec.rb +403 -0
  448. data/spec/mongoid/association/builders_spec.rb +255 -0
  449. data/spec/mongoid/association/constrainable_spec.rb +117 -0
  450. data/spec/mongoid/association/counter_cache_spec.rb +452 -0
  451. data/spec/mongoid/association/depending_spec.rb +959 -0
  452. data/spec/mongoid/association/eager_spec.rb +282 -0
  453. data/spec/mongoid/association/embedded/cyclic_spec.rb +180 -0
  454. data/spec/mongoid/association/embedded/dirty_spec.rb +67 -0
  455. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +174 -0
  456. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +90 -0
  457. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +619 -0
  458. data/spec/mongoid/association/embedded/embedded_in_spec.rb +903 -0
  459. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +56 -0
  460. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +218 -0
  461. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +4863 -0
  462. data/spec/mongoid/association/embedded/embeds_many_models.rb +226 -0
  463. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +63 -0
  464. data/spec/mongoid/association/embedded/embeds_many_spec.rb +932 -0
  465. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +79 -0
  466. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +106 -0
  467. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +1025 -0
  468. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +8 -0
  469. data/spec/mongoid/association/embedded/embeds_one_models.rb +73 -0
  470. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +28 -0
  471. data/spec/mongoid/association/embedded/embeds_one_spec.rb +984 -0
  472. data/spec/mongoid/association/macros_spec.rb +1116 -0
  473. data/spec/mongoid/association/nested/many_spec.rb +232 -0
  474. data/spec/mongoid/association/nested/one_spec.rb +253 -0
  475. data/spec/mongoid/association/options_spec.rb +1323 -0
  476. data/spec/mongoid/association/polymorphic_spec.rb +162 -0
  477. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +244 -0
  478. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +292 -0
  479. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +412 -0
  480. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +1388 -0
  481. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  482. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +57 -0
  483. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2046 -0
  484. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +180 -0
  485. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +148 -0
  486. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +196 -0
  487. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +76 -0
  488. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +3836 -0
  489. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +92 -0
  490. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +39 -0
  491. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +1104 -0
  492. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +155 -0
  493. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +251 -0
  494. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +290 -0
  495. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2232 -0
  496. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +23 -0
  497. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +4161 -0
  498. data/spec/mongoid/association/referenced/has_many_models.rb +97 -0
  499. data/spec/mongoid/association/referenced/has_many_query_spec.rb +37 -0
  500. data/spec/mongoid/association/referenced/has_many_spec.rb +1273 -0
  501. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +133 -0
  502. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +159 -0
  503. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +193 -0
  504. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +1248 -0
  505. data/spec/mongoid/association/referenced/has_one_models.rb +113 -0
  506. data/spec/mongoid/association/referenced/has_one_query_spec.rb +37 -0
  507. data/spec/mongoid/association/referenced/has_one_spec.rb +1383 -0
  508. data/spec/mongoid/association/reflections_spec.rb +92 -0
  509. data/spec/mongoid/association/syncable_spec.rb +513 -0
  510. data/spec/mongoid/association_spec.rb +191 -0
  511. data/spec/mongoid/atomic/modifiers_spec.rb +88 -39
  512. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +10 -49
  513. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +9 -49
  514. data/spec/mongoid/atomic/paths/root_spec.rb +5 -61
  515. data/spec/mongoid/atomic/paths_spec.rb +115 -35
  516. data/spec/mongoid/atomic_spec.rb +89 -42
  517. data/spec/mongoid/attributes/dynamic_spec.rb +152 -0
  518. data/spec/mongoid/attributes/nested_spec.rb +5000 -0
  519. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  520. data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
  521. data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
  522. data/spec/mongoid/attributes/projector_spec.rb +40 -0
  523. data/spec/mongoid/attributes/readonly_spec.rb +166 -64
  524. data/spec/mongoid/attributes_spec.rb +1418 -409
  525. data/spec/mongoid/cacheable_spec.rb +114 -0
  526. data/spec/mongoid/changeable_spec.rb +1914 -0
  527. data/spec/mongoid/clients/factory_spec.rb +426 -0
  528. data/spec/mongoid/clients/options_spec.rb +521 -0
  529. data/spec/mongoid/clients/sessions_spec.rb +297 -0
  530. data/spec/mongoid/clients/transactions_spec.rb +415 -0
  531. data/spec/mongoid/clients_spec.rb +1084 -0
  532. data/spec/mongoid/composable_spec.rb +33 -0
  533. data/spec/mongoid/config/environment_spec.rb +138 -17
  534. data/spec/mongoid/config/options_spec.rb +26 -7
  535. data/spec/mongoid/config_spec.rb +607 -93
  536. data/spec/mongoid/contextual/aggregable/memory_spec.rb +433 -153
  537. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  538. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  539. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +221 -56
  540. data/spec/mongoid/contextual/aggregable/none_spec.rb +60 -0
  541. data/spec/mongoid/contextual/atomic_spec.rb +577 -162
  542. data/spec/mongoid/contextual/geo_near_spec.rb +104 -38
  543. data/spec/mongoid/contextual/map_reduce_spec.rb +137 -142
  544. data/spec/mongoid/contextual/memory_spec.rb +1880 -269
  545. data/spec/mongoid/contextual/mongo_spec.rb +2523 -601
  546. data/spec/mongoid/contextual/none_spec.rb +123 -0
  547. data/spec/mongoid/copyable_spec.rb +833 -76
  548. data/spec/mongoid/copyable_spec_models.rb +47 -0
  549. data/spec/mongoid/criteria/findable_spec.rb +1132 -0
  550. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  551. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  552. data/spec/mongoid/criteria/inspectable_spec.rb +29 -0
  553. data/spec/mongoid/criteria/marshalable_spec.rb +47 -0
  554. data/spec/mongoid/criteria/modifiable_spec.rb +1812 -0
  555. data/spec/mongoid/criteria/options_spec.rb +31 -0
  556. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +372 -0
  557. data/spec/mongoid/criteria/queryable/expandable_spec.rb +61 -0
  558. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +513 -0
  559. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +169 -0
  560. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +60 -0
  561. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +215 -0
  562. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +343 -0
  563. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +434 -0
  564. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +60 -0
  565. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +67 -0
  566. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +314 -0
  567. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +67 -0
  568. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +79 -0
  569. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +119 -0
  570. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +110 -0
  571. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +370 -0
  572. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +91 -0
  573. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +92 -0
  574. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +41 -0
  575. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +347 -0
  576. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +169 -0
  577. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +406 -0
  578. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +387 -0
  579. data/spec/mongoid/criteria/queryable/key_spec.rb +96 -0
  580. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +182 -0
  581. data/spec/mongoid/criteria/queryable/optional_spec.rb +1317 -0
  582. data/spec/mongoid/criteria/queryable/options_spec.rb +362 -0
  583. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +214 -0
  584. data/spec/mongoid/criteria/queryable/queryable_spec.rb +139 -0
  585. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +2119 -0
  586. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +38 -0
  587. data/spec/mongoid/criteria/queryable/selectable_spec.rb +2462 -0
  588. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +589 -0
  589. data/spec/mongoid/criteria/queryable/selector_spec.rb +895 -0
  590. data/spec/mongoid/criteria/queryable/smash_spec.rb +32 -0
  591. data/spec/mongoid/criteria/queryable/storable_spec.rb +226 -0
  592. data/spec/mongoid/criteria/scopable_spec.rb +601 -0
  593. data/spec/mongoid/criteria_projection_spec.rb +410 -0
  594. data/spec/mongoid/criteria_spec.rb +1828 -3572
  595. data/spec/mongoid/document_fields_spec.rb +262 -0
  596. data/spec/mongoid/document_persistence_context_spec.rb +32 -0
  597. data/spec/mongoid/document_query_spec.rb +89 -0
  598. data/spec/mongoid/document_spec.rb +452 -221
  599. data/spec/mongoid/equality_spec.rb +155 -52
  600. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +8 -6
  601. data/spec/mongoid/errors/callback_spec.rb +5 -3
  602. data/spec/mongoid/errors/delete_restriction_spec.rb +7 -5
  603. data/spec/mongoid/errors/document_not_destroyed_spec.rb +35 -0
  604. data/spec/mongoid/errors/document_not_found_spec.rb +89 -11
  605. data/spec/mongoid/errors/invalid_collection_spec.rb +5 -3
  606. data/spec/mongoid/errors/invalid_config_file_spec.rb +31 -0
  607. data/spec/mongoid/errors/invalid_config_option_spec.rb +5 -3
  608. data/spec/mongoid/errors/invalid_field_option_spec.rb +5 -3
  609. data/spec/mongoid/errors/invalid_field_spec.rb +6 -4
  610. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  611. data/spec/mongoid/errors/invalid_find_spec.rb +5 -3
  612. data/spec/mongoid/errors/invalid_includes_spec.rb +5 -3
  613. data/spec/mongoid/errors/invalid_index_spec.rb +5 -3
  614. data/spec/mongoid/errors/invalid_options_spec.rb +7 -5
  615. data/spec/mongoid/errors/invalid_path_spec.rb +5 -3
  616. data/spec/mongoid/errors/invalid_relation_spec.rb +39 -0
  617. data/spec/mongoid/errors/invalid_scope_spec.rb +7 -5
  618. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +5 -3
  619. data/spec/mongoid/errors/invalid_storage_options_spec.rb +5 -3
  620. data/spec/mongoid/errors/invalid_time_spec.rb +5 -3
  621. data/spec/mongoid/errors/inverse_not_found_spec.rb +6 -4
  622. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +31 -0
  623. data/spec/mongoid/errors/mixed_relations_spec.rb +5 -3
  624. data/spec/mongoid/errors/mongoid_error_spec.rb +45 -10
  625. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +8 -6
  626. data/spec/mongoid/errors/no_client_config_spec.rb +31 -0
  627. data/spec/mongoid/errors/no_client_database_spec.rb +31 -0
  628. data/spec/mongoid/errors/no_client_hosts_spec.rb +31 -0
  629. data/spec/mongoid/errors/no_clients_config_spec.rb +31 -0
  630. data/spec/mongoid/errors/no_environment_spec.rb +8 -6
  631. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +5 -3
  632. data/spec/mongoid/errors/no_metadata_spec.rb +5 -3
  633. data/spec/mongoid/errors/no_parent_spec.rb +6 -4
  634. data/spec/mongoid/errors/readonly_attribute_spec.rb +5 -3
  635. data/spec/mongoid/errors/readonly_document_spec.rb +31 -0
  636. data/spec/mongoid/errors/scope_overwrite_spec.rb +5 -3
  637. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +6 -4
  638. data/spec/mongoid/errors/unknown_attribute_spec.rb +7 -5
  639. data/spec/mongoid/errors/unsaved_document_spec.rb +6 -4
  640. data/spec/mongoid/errors/unsupported_javascript_spec.rb +5 -3
  641. data/spec/mongoid/errors/validations_spec.rb +9 -7
  642. data/spec/mongoid/extensions/array_spec.rb +108 -116
  643. data/spec/mongoid/extensions/big_decimal_spec.rb +838 -49
  644. data/spec/mongoid/extensions/binary_spec.rb +55 -18
  645. data/spec/mongoid/extensions/boolean_spec.rb +76 -74
  646. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +339 -0
  647. data/spec/mongoid/extensions/date_spec.rb +59 -145
  648. data/spec/mongoid/extensions/date_time_spec.rb +35 -76
  649. data/spec/mongoid/extensions/decimal128_spec.rb +46 -0
  650. data/spec/mongoid/extensions/false_class_spec.rb +7 -5
  651. data/spec/mongoid/extensions/float_spec.rb +69 -62
  652. data/spec/mongoid/extensions/hash_spec.rb +197 -30
  653. data/spec/mongoid/extensions/integer_spec.rb +63 -65
  654. data/spec/mongoid/extensions/module_spec.rb +4 -2
  655. data/spec/mongoid/extensions/nil_class_spec.rb +3 -1
  656. data/spec/mongoid/extensions/object_id_spec.rb +136 -134
  657. data/spec/mongoid/extensions/object_spec.rb +53 -57
  658. data/spec/mongoid/extensions/range_spec.rb +287 -28
  659. data/spec/mongoid/extensions/regexp_spec.rb +71 -21
  660. data/spec/mongoid/extensions/set_spec.rb +112 -4
  661. data/spec/mongoid/extensions/string_spec.rb +188 -89
  662. data/spec/mongoid/extensions/stringified_symbol_spec.rb +84 -0
  663. data/spec/mongoid/extensions/symbol_spec.rb +25 -30
  664. data/spec/mongoid/extensions/time_spec.rb +703 -110
  665. data/spec/mongoid/extensions/time_with_zone_spec.rb +82 -67
  666. data/spec/mongoid/extensions/true_class_spec.rb +7 -5
  667. data/spec/mongoid/extensions_spec.rb +43 -0
  668. data/spec/mongoid/factory_spec.rb +374 -25
  669. data/spec/mongoid/fields/foreign_key_spec.rb +116 -92
  670. data/spec/mongoid/fields/localized_spec.rb +177 -35
  671. data/spec/mongoid/fields/standard_spec.rb +15 -13
  672. data/spec/mongoid/fields_spec.rb +952 -238
  673. data/spec/mongoid/findable_spec.rb +632 -0
  674. data/spec/mongoid/indexable/specification_spec.rb +129 -0
  675. data/spec/mongoid/indexable_spec.rb +643 -0
  676. data/spec/mongoid/inspectable_spec.rb +86 -0
  677. data/spec/mongoid/interceptable_spec.rb +2373 -0
  678. data/spec/mongoid/interceptable_spec_models.rb +307 -0
  679. data/spec/mongoid/loggable_spec.rb +3 -1
  680. data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
  681. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +239 -0
  682. data/spec/mongoid/matcher/extract_attribute_spec.rb +36 -0
  683. data/spec/mongoid/mongoizable_spec.rb +285 -0
  684. data/spec/mongoid/persistable/creatable_spec.rb +662 -0
  685. data/spec/mongoid/persistable/deletable_spec.rb +514 -0
  686. data/spec/mongoid/persistable/destroyable_spec.rb +455 -0
  687. data/spec/mongoid/persistable/incrementable_spec.rb +241 -0
  688. data/spec/mongoid/persistable/logical_spec.rb +159 -0
  689. data/spec/mongoid/persistable/poppable_spec.rb +131 -0
  690. data/spec/mongoid/persistable/pullable_spec.rb +258 -0
  691. data/spec/mongoid/persistable/pushable_spec.rb +353 -0
  692. data/spec/mongoid/persistable/renamable_spec.rb +151 -0
  693. data/spec/mongoid/persistable/savable_spec.rb +684 -0
  694. data/spec/mongoid/persistable/settable_spec.rb +544 -0
  695. data/spec/mongoid/persistable/unsettable_spec.rb +171 -0
  696. data/spec/mongoid/persistable/updatable_spec.rb +760 -0
  697. data/spec/mongoid/persistable/upsertable_spec.rb +122 -0
  698. data/spec/mongoid/persistable_spec.rb +321 -0
  699. data/spec/mongoid/persistence_context_spec.rb +745 -0
  700. data/spec/mongoid/positional_spec.rb +223 -0
  701. data/spec/mongoid/query_cache_middleware_spec.rb +50 -0
  702. data/spec/mongoid/query_cache_spec.rb +870 -0
  703. data/spec/mongoid/relations/proxy_spec.rb +125 -47
  704. data/spec/mongoid/reloadable_spec.rb +665 -0
  705. data/spec/mongoid/scopable_spec.rb +1234 -0
  706. data/spec/mongoid/selectable_spec.rb +136 -0
  707. data/spec/mongoid/serializable_spec.rb +963 -0
  708. data/spec/mongoid/shardable_models.rb +61 -0
  709. data/spec/mongoid/shardable_spec.rb +204 -0
  710. data/spec/mongoid/stateful_spec.rb +157 -0
  711. data/spec/mongoid/tasks/database_rake_spec.rb +287 -0
  712. data/spec/mongoid/tasks/database_spec.rb +181 -0
  713. data/spec/mongoid/threaded_spec.rb +88 -78
  714. data/spec/mongoid/timestamps/created/short_spec.rb +9 -7
  715. data/spec/mongoid/timestamps/created_spec.rb +8 -6
  716. data/spec/mongoid/timestamps/timeless_spec.rb +29 -10
  717. data/spec/mongoid/timestamps/updated/short_spec.rb +16 -14
  718. data/spec/mongoid/timestamps/updated_spec.rb +14 -16
  719. data/spec/mongoid/timestamps_spec.rb +406 -18
  720. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  721. data/spec/mongoid/touchable_spec.rb +704 -0
  722. data/spec/mongoid/touchable_spec_models.rb +57 -0
  723. data/spec/mongoid/traversable_spec.rb +1410 -0
  724. data/spec/mongoid/validatable/associated_spec.rb +208 -0
  725. data/spec/mongoid/validatable/format_spec.rb +85 -0
  726. data/spec/mongoid/validatable/length_spec.rb +225 -0
  727. data/spec/mongoid/validatable/numericality_spec.rb +32 -0
  728. data/spec/mongoid/validatable/presence_spec.rb +592 -0
  729. data/spec/mongoid/validatable/uniqueness_spec.rb +2504 -0
  730. data/spec/mongoid/validatable_spec.rb +327 -0
  731. data/spec/mongoid/warnings_spec.rb +35 -0
  732. data/spec/mongoid_spec.rb +20 -20
  733. data/spec/rails/controller_extension/controller_runtime_spec.rb +112 -0
  734. data/spec/rails/mongoid_spec.rb +37 -354
  735. data/spec/shared/LICENSE +20 -0
  736. data/spec/shared/bin/get-mongodb-download-url +17 -0
  737. data/spec/shared/bin/s3-copy +45 -0
  738. data/spec/shared/bin/s3-upload +69 -0
  739. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  740. data/spec/shared/lib/mrss/cluster_config.rb +231 -0
  741. data/spec/shared/lib/mrss/constraints.rb +378 -0
  742. data/spec/shared/lib/mrss/docker_runner.rb +291 -0
  743. data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
  744. data/spec/shared/lib/mrss/event_subscriber.rb +200 -0
  745. data/spec/shared/lib/mrss/lite_constraints.rb +230 -0
  746. data/spec/shared/lib/mrss/server_version_registry.rb +120 -0
  747. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  748. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  749. data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
  750. data/spec/shared/lib/mrss/utils.rb +15 -0
  751. data/spec/shared/share/Dockerfile.erb +325 -0
  752. data/spec/shared/share/haproxy-1.conf +16 -0
  753. data/spec/shared/share/haproxy-2.conf +17 -0
  754. data/spec/shared/shlib/config.sh +27 -0
  755. data/spec/shared/shlib/distro.sh +74 -0
  756. data/spec/shared/shlib/server.sh +392 -0
  757. data/spec/shared/shlib/set_env.sh +169 -0
  758. data/spec/spec_helper.rb +163 -42
  759. data/spec/support/authorization.rb +15 -0
  760. data/spec/support/client_registry.rb +9 -0
  761. data/spec/support/constraints.rb +77 -0
  762. data/spec/support/expectations.rb +32 -0
  763. data/spec/support/helpers.rb +11 -0
  764. data/spec/support/macros.rb +81 -0
  765. data/spec/support/models/account.rb +38 -0
  766. data/spec/support/models/acolyte.rb +19 -0
  767. data/spec/support/models/actor.rb +20 -0
  768. data/spec/support/models/actress.rb +4 -0
  769. data/spec/support/models/address.rb +85 -0
  770. data/spec/support/models/address_component.rb +7 -0
  771. data/spec/support/models/address_number.rb +8 -0
  772. data/spec/support/models/agency.rb +7 -0
  773. data/spec/support/models/agent.rb +18 -0
  774. data/spec/support/models/album.rb +20 -0
  775. data/spec/support/models/alert.rb +9 -0
  776. data/spec/support/models/animal.rb +28 -0
  777. data/spec/support/models/answer.rb +8 -0
  778. data/spec/support/models/appointment.rb +9 -0
  779. data/spec/support/models/armrest.rb +9 -0
  780. data/spec/support/models/array_field.rb +7 -0
  781. data/spec/support/models/article.rb +14 -0
  782. data/spec/support/models/artist.rb +91 -0
  783. data/spec/support/models/artwork.rb +6 -0
  784. data/spec/support/models/audible_sound.rb +3 -0
  785. data/spec/support/models/audio.rb +7 -0
  786. data/spec/support/models/augmentation.rb +25 -0
  787. data/spec/support/models/author.rb +8 -0
  788. data/spec/support/models/baby.rb +6 -0
  789. data/spec/support/models/band.rb +40 -0
  790. data/spec/support/models/bar.rb +12 -0
  791. data/spec/support/models/basic.rb +8 -0
  792. data/spec/support/models/bed.rb +3 -0
  793. data/spec/support/models/big_palette.rb +4 -0
  794. data/spec/support/models/birthday.rb +15 -0
  795. data/spec/support/models/bolt.rb +7 -0
  796. data/spec/support/models/bomb.rb +6 -0
  797. data/spec/support/models/book.rb +18 -0
  798. data/spec/support/models/breed.rb +6 -0
  799. data/spec/support/models/browser.rb +8 -0
  800. data/spec/support/models/building.rb +8 -0
  801. data/spec/support/models/building_address.rb +9 -0
  802. data/spec/support/models/bus.rb +9 -0
  803. data/spec/support/models/business.rb +7 -0
  804. data/spec/support/models/callback_test.rb +11 -0
  805. data/spec/support/models/canvas.rb +27 -0
  806. data/spec/support/models/car.rb +3 -0
  807. data/spec/support/models/cat.rb +10 -0
  808. data/spec/support/models/catalog.rb +24 -0
  809. data/spec/support/models/category.rb +10 -0
  810. data/spec/support/models/child.rb +6 -0
  811. data/spec/support/models/child_doc.rb +24 -0
  812. data/spec/support/models/church.rb +8 -0
  813. data/spec/support/models/circle.rb +5 -0
  814. data/spec/support/models/circuit.rb +6 -0
  815. data/spec/support/models/circus.rb +12 -0
  816. data/spec/support/models/code.rb +15 -0
  817. data/spec/support/models/coding/pull_request.rb +11 -0
  818. data/spec/support/models/coding.rb +3 -0
  819. data/spec/support/models/comment.rb +18 -0
  820. data/spec/support/models/company.rb +7 -0
  821. data/spec/support/models/consumption_period.rb +9 -0
  822. data/spec/support/models/contextable_item.rb +7 -0
  823. data/spec/support/models/contractor.rb +7 -0
  824. data/spec/support/models/cookie.rb +8 -0
  825. data/spec/support/models/country_code.rb +12 -0
  826. data/spec/support/models/courier_job.rb +6 -0
  827. data/spec/support/models/crate.rb +12 -0
  828. data/spec/support/models/customer.rb +10 -0
  829. data/spec/support/models/customer_address.rb +11 -0
  830. data/spec/support/models/deed.rb +7 -0
  831. data/spec/support/models/definition.rb +11 -0
  832. data/spec/support/models/delegating_patient.rb +15 -0
  833. data/spec/support/models/description.rb +13 -0
  834. data/spec/support/models/dictionary.rb +18 -0
  835. data/spec/support/models/division.rb +12 -0
  836. data/spec/support/models/doctor.rb +14 -0
  837. data/spec/support/models/dog.rb +9 -0
  838. data/spec/support/models/dokument.rb +8 -0
  839. data/spec/support/models/draft.rb +11 -0
  840. data/spec/support/models/dragon.rb +6 -0
  841. data/spec/support/models/driver.rb +9 -0
  842. data/spec/support/models/drug.rb +8 -0
  843. data/spec/support/models/dungeon.rb +6 -0
  844. data/spec/support/models/edit.rb +7 -0
  845. data/spec/support/models/email.rb +8 -0
  846. data/spec/support/models/employer.rb +7 -0
  847. data/spec/support/models/entry.rb +8 -0
  848. data/spec/support/models/eraser.rb +3 -0
  849. data/spec/support/models/even.rb +9 -0
  850. data/spec/support/models/event.rb +24 -0
  851. data/spec/support/models/exhibition.rb +6 -0
  852. data/spec/support/models/exhibitor.rb +8 -0
  853. data/spec/support/models/explosion.rb +6 -0
  854. data/spec/support/models/eye.rb +11 -0
  855. data/spec/support/models/eye_bowl.rb +11 -0
  856. data/spec/support/models/face.rb +10 -0
  857. data/spec/support/models/fanatic.rb +8 -0
  858. data/spec/support/models/favorite.rb +8 -0
  859. data/spec/support/models/filesystem.rb +7 -0
  860. data/spec/support/models/fire_hydrant.rb +8 -0
  861. data/spec/support/models/firefox.rb +6 -0
  862. data/spec/support/models/fish.rb +9 -0
  863. data/spec/support/models/folder.rb +9 -0
  864. data/spec/support/models/folder_item.rb +11 -0
  865. data/spec/support/models/fruits.rb +36 -0
  866. data/spec/support/models/game.rb +21 -0
  867. data/spec/support/models/ghost.rb +9 -0
  868. data/spec/support/models/guitar.rb +4 -0
  869. data/spec/support/models/hole.rb +12 -0
  870. data/spec/support/models/home.rb +6 -0
  871. data/spec/support/models/house.rb +8 -0
  872. data/spec/support/models/html_writer.rb +5 -0
  873. data/spec/support/models/id_key.rb +8 -0
  874. data/spec/support/models/idnodef.rb +7 -0
  875. data/spec/support/models/image.rb +24 -0
  876. data/spec/support/models/implant.rb +27 -0
  877. data/spec/support/models/instrument.rb +8 -0
  878. data/spec/support/models/item.rb +10 -0
  879. data/spec/support/models/jar.rb +9 -0
  880. data/spec/support/models/kaleidoscope.rb +8 -0
  881. data/spec/support/models/kangaroo.rb +6 -0
  882. data/spec/support/models/label.rb +52 -0
  883. data/spec/support/models/language.rb +7 -0
  884. data/spec/support/models/lat_lng.rb +17 -0
  885. data/spec/support/models/league.rb +13 -0
  886. data/spec/support/models/learner.rb +4 -0
  887. data/spec/support/models/line_item.rb +8 -0
  888. data/spec/support/models/location.rb +10 -0
  889. data/spec/support/models/login.rb +10 -0
  890. data/spec/support/models/manufacturer.rb +9 -0
  891. data/spec/support/models/meat.rb +6 -0
  892. data/spec/support/models/membership.rb +7 -0
  893. data/spec/support/models/message.rb +13 -0
  894. data/spec/support/models/minim.rb +6 -0
  895. data/spec/support/models/mixed_drink.rb +6 -0
  896. data/spec/support/models/mop.rb +24 -0
  897. data/spec/support/models/movie.rb +15 -0
  898. data/spec/support/models/my_hash.rb +4 -0
  899. data/spec/support/models/name.rb +26 -0
  900. data/spec/support/models/name_only.rb +8 -0
  901. data/spec/support/models/node.rb +7 -0
  902. data/spec/support/models/note.rb +19 -0
  903. data/spec/support/models/nut.rb +7 -0
  904. data/spec/support/models/odd.rb +9 -0
  905. data/spec/support/models/order.rb +12 -0
  906. data/spec/support/models/ordered_post.rb +13 -0
  907. data/spec/support/models/ordered_preference.rb +8 -0
  908. data/spec/support/models/oscar.rb +16 -0
  909. data/spec/support/models/other_owner_object.rb +4 -0
  910. data/spec/support/models/override.rb +18 -0
  911. data/spec/support/models/ownable.rb +8 -0
  912. data/spec/support/models/owner.rb +10 -0
  913. data/spec/support/models/pack.rb +5 -0
  914. data/spec/support/models/page.rb +18 -0
  915. data/spec/support/models/page_question.rb +6 -0
  916. data/spec/support/models/palette.rb +9 -0
  917. data/spec/support/models/parent.rb +7 -0
  918. data/spec/support/models/parent_doc.rb +8 -0
  919. data/spec/support/models/passport.rb +22 -0
  920. data/spec/support/models/patient.rb +11 -0
  921. data/spec/support/models/pdf_writer.rb +5 -0
  922. data/spec/support/models/pencil.rb +3 -0
  923. data/spec/support/models/person.rb +231 -0
  924. data/spec/support/models/pet.rb +25 -0
  925. data/spec/support/models/pet_owner.rb +8 -0
  926. data/spec/support/models/phone.rb +13 -0
  927. data/spec/support/models/piano.rb +4 -0
  928. data/spec/support/models/pizza.rb +9 -0
  929. data/spec/support/models/player.rb +39 -0
  930. data/spec/support/models/post.rb +52 -0
  931. data/spec/support/models/post_genre.rb +8 -0
  932. data/spec/support/models/powerup.rb +25 -0
  933. data/spec/support/models/preference.rb +11 -0
  934. data/spec/support/models/princess.rb +12 -0
  935. data/spec/support/models/product.rb +19 -0
  936. data/spec/support/models/profile.rb +17 -0
  937. data/spec/support/models/pronunciation.rb +7 -0
  938. data/spec/support/models/pub.rb +8 -0
  939. data/spec/support/models/publication/encyclopedia.rb +11 -0
  940. data/spec/support/models/publication/review.rb +13 -0
  941. data/spec/support/models/publication.rb +4 -0
  942. data/spec/support/models/purchase.rb +6 -0
  943. data/spec/support/models/purchased_item.rb +10 -0
  944. data/spec/support/models/question.rb +10 -0
  945. data/spec/support/models/quiz.rb +9 -0
  946. data/spec/support/models/rating.rb +10 -0
  947. data/spec/support/models/record.rb +54 -0
  948. data/spec/support/models/registry.rb +7 -0
  949. data/spec/support/models/role.rb +9 -0
  950. data/spec/support/models/root_category.rb +6 -0
  951. data/spec/support/models/sandwich.rb +11 -0
  952. data/spec/support/models/scheduler.rb +9 -0
  953. data/spec/support/models/school.rb +14 -0
  954. data/spec/support/models/scribe.rb +7 -0
  955. data/spec/support/models/sealer.rb +7 -0
  956. data/spec/support/models/seat.rb +24 -0
  957. data/spec/support/models/seo.rb +9 -0
  958. data/spec/support/models/series.rb +7 -0
  959. data/spec/support/models/server.rb +15 -0
  960. data/spec/support/models/service.rb +24 -0
  961. data/spec/support/models/shape.rb +14 -0
  962. data/spec/support/models/shelf.rb +7 -0
  963. data/spec/support/models/shield.rb +18 -0
  964. data/spec/support/models/shipment_address.rb +5 -0
  965. data/spec/support/models/shipping_container.rb +7 -0
  966. data/spec/support/models/shipping_pack.rb +5 -0
  967. data/spec/support/models/shirt.rb +11 -0
  968. data/spec/support/models/shop.rb +8 -0
  969. data/spec/support/models/short_agent.rb +6 -0
  970. data/spec/support/models/short_quiz.rb +7 -0
  971. data/spec/support/models/simple.rb +7 -0
  972. data/spec/support/models/slave.rb +8 -0
  973. data/spec/support/models/song.rb +10 -0
  974. data/spec/support/models/sound.rb +7 -0
  975. data/spec/support/models/spacer.rb +7 -0
  976. data/spec/support/models/square.rb +6 -0
  977. data/spec/support/models/staff.rb +9 -0
  978. data/spec/support/models/store_as_dup_test1.rb +7 -0
  979. data/spec/support/models/store_as_dup_test2.rb +7 -0
  980. data/spec/support/models/store_as_dup_test3.rb +7 -0
  981. data/spec/support/models/store_as_dup_test4.rb +7 -0
  982. data/spec/support/models/strategy.rb +5 -0
  983. data/spec/support/models/student.rb +14 -0
  984. data/spec/support/models/sub_item.rb +5 -0
  985. data/spec/support/models/subscription.rb +7 -0
  986. data/spec/support/models/survey.rb +7 -0
  987. data/spec/support/models/symptom.rb +8 -0
  988. data/spec/support/models/system_role.rb +7 -0
  989. data/spec/support/models/tag.rb +10 -0
  990. data/spec/support/models/target.rb +7 -0
  991. data/spec/support/models/template.rb +7 -0
  992. data/spec/support/models/thing.rb +11 -0
  993. data/spec/support/models/threadlocker.rb +7 -0
  994. data/spec/support/models/title.rb +5 -0
  995. data/spec/support/models/tool.rb +10 -0
  996. data/spec/support/models/topping.rb +7 -0
  997. data/spec/support/models/toy.rb +9 -0
  998. data/spec/support/models/track.rb +40 -0
  999. data/spec/support/models/translation.rb +7 -0
  1000. data/spec/support/models/tree.rb +11 -0
  1001. data/spec/support/models/truck.rb +7 -0
  1002. data/spec/support/models/updatable.rb +7 -0
  1003. data/spec/support/models/user.rb +23 -0
  1004. data/spec/support/models/user_account.rb +12 -0
  1005. data/spec/support/models/validation_callback.rb +12 -0
  1006. data/spec/support/models/vehicle.rb +18 -0
  1007. data/spec/support/models/version.rb +7 -0
  1008. data/spec/support/models/vertex.rb +8 -0
  1009. data/spec/support/models/vet_visit.rb +7 -0
  1010. data/spec/support/models/video.rb +15 -0
  1011. data/spec/support/models/video_game.rb +3 -0
  1012. data/spec/support/models/washer.rb +7 -0
  1013. data/spec/support/models/weapon.rb +25 -0
  1014. data/spec/support/models/wiki_page.rb +17 -0
  1015. data/spec/support/models/word.rb +17 -0
  1016. data/spec/support/models/word_origin.rb +13 -0
  1017. data/spec/support/models/writer.rb +13 -0
  1018. data/spec/support/schema_maps/schema_map_aws.json +17 -0
  1019. data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
  1020. data/spec/support/schema_maps/schema_map_azure.json +17 -0
  1021. data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
  1022. data/spec/support/schema_maps/schema_map_gcp.json +17 -0
  1023. data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
  1024. data/spec/support/schema_maps/schema_map_kmip.json +17 -0
  1025. data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
  1026. data/spec/support/schema_maps/schema_map_local.json +18 -0
  1027. data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
  1028. data/spec/support/shared/time.rb +53 -0
  1029. data/spec/support/spec_config.rb +64 -0
  1030. data.tar.gz.sig +0 -0
  1031. metadata +1582 -912
  1032. metadata.gz.sig +0 -0
  1033. data/lib/mongoid/atomic/positionable.rb +0 -73
  1034. data/lib/mongoid/callbacks.rb +0 -314
  1035. data/lib/mongoid/components.rb +0 -93
  1036. data/lib/mongoid/config/inflections.rb +0 -6
  1037. data/lib/mongoid/config/validators/session.rb +0 -140
  1038. data/lib/mongoid/contextual/eager.rb +0 -158
  1039. data/lib/mongoid/contextual/find_and_modify.rb +0 -69
  1040. data/lib/mongoid/criterion/findable.rb +0 -179
  1041. data/lib/mongoid/criterion/inspection.rb +0 -25
  1042. data/lib/mongoid/criterion/marshalable.rb +0 -48
  1043. data/lib/mongoid/criterion/modifiable.rb +0 -189
  1044. data/lib/mongoid/criterion/scoping.rb +0 -158
  1045. data/lib/mongoid/dirty.rb +0 -376
  1046. data/lib/mongoid/errors/eager_load.rb +0 -22
  1047. data/lib/mongoid/errors/mixed_session_configuration.rb +0 -28
  1048. data/lib/mongoid/errors/no_default_session.rb +0 -23
  1049. data/lib/mongoid/errors/no_session_config.rb +0 -22
  1050. data/lib/mongoid/errors/no_session_database.rb +0 -27
  1051. data/lib/mongoid/errors/no_session_hosts.rb +0 -27
  1052. data/lib/mongoid/errors/no_sessions_config.rb +0 -20
  1053. data/lib/mongoid/errors/versioning_not_on_root.rb +0 -23
  1054. data/lib/mongoid/finders.rb +0 -130
  1055. data/lib/mongoid/hierarchy.rb +0 -188
  1056. data/lib/mongoid/identity_map.rb +0 -163
  1057. data/lib/mongoid/indexes/validators/options.rb +0 -102
  1058. data/lib/mongoid/indexes.rb +0 -154
  1059. data/lib/mongoid/inspection.rb +0 -55
  1060. data/lib/mongoid/json.rb +0 -16
  1061. data/lib/mongoid/matchers/all.rb +0 -27
  1062. data/lib/mongoid/matchers/and.rb +0 -30
  1063. data/lib/mongoid/matchers/default.rb +0 -72
  1064. data/lib/mongoid/matchers/exists.rb +0 -23
  1065. data/lib/mongoid/matchers/gt.rb +0 -21
  1066. data/lib/mongoid/matchers/gte.rb +0 -21
  1067. data/lib/mongoid/matchers/in.rb +0 -24
  1068. data/lib/mongoid/matchers/lt.rb +0 -21
  1069. data/lib/mongoid/matchers/lte.rb +0 -21
  1070. data/lib/mongoid/matchers/ne.rb +0 -21
  1071. data/lib/mongoid/matchers/nin.rb +0 -21
  1072. data/lib/mongoid/matchers/or.rb +0 -33
  1073. data/lib/mongoid/matchers/size.rb +0 -21
  1074. data/lib/mongoid/matchers/strategies.rb +0 -97
  1075. data/lib/mongoid/matchers.rb +0 -32
  1076. data/lib/mongoid/multi_parameter_attributes.rb +0 -105
  1077. data/lib/mongoid/nested_attributes.rb +0 -78
  1078. data/lib/mongoid/observer.rb +0 -192
  1079. data/lib/mongoid/paranoia.rb +0 -137
  1080. data/lib/mongoid/persistence/atomic/add_to_set.rb +0 -47
  1081. data/lib/mongoid/persistence/atomic/bit.rb +0 -35
  1082. data/lib/mongoid/persistence/atomic/inc.rb +0 -45
  1083. data/lib/mongoid/persistence/atomic/operation.rb +0 -154
  1084. data/lib/mongoid/persistence/atomic/pop.rb +0 -32
  1085. data/lib/mongoid/persistence/atomic/pull.rb +0 -32
  1086. data/lib/mongoid/persistence/atomic/pull_all.rb +0 -32
  1087. data/lib/mongoid/persistence/atomic/push.rb +0 -25
  1088. data/lib/mongoid/persistence/atomic/push_all.rb +0 -25
  1089. data/lib/mongoid/persistence/atomic/rename.rb +0 -30
  1090. data/lib/mongoid/persistence/atomic/sets.rb +0 -28
  1091. data/lib/mongoid/persistence/atomic/unset.rb +0 -27
  1092. data/lib/mongoid/persistence/atomic.rb +0 -231
  1093. data/lib/mongoid/persistence/deletion.rb +0 -32
  1094. data/lib/mongoid/persistence/insertion.rb +0 -38
  1095. data/lib/mongoid/persistence/modification.rb +0 -35
  1096. data/lib/mongoid/persistence/operations/embedded/insert.rb +0 -46
  1097. data/lib/mongoid/persistence/operations/embedded/remove.rb +0 -43
  1098. data/lib/mongoid/persistence/operations/insert.rb +0 -34
  1099. data/lib/mongoid/persistence/operations/remove.rb +0 -33
  1100. data/lib/mongoid/persistence/operations/update.rb +0 -59
  1101. data/lib/mongoid/persistence/operations/upsert.rb +0 -28
  1102. data/lib/mongoid/persistence/operations.rb +0 -214
  1103. data/lib/mongoid/persistence/upsertion.rb +0 -31
  1104. data/lib/mongoid/persistence.rb +0 -352
  1105. data/lib/mongoid/railties/document.rb +0 -12
  1106. data/lib/mongoid/relations/accessors.rb +0 -299
  1107. data/lib/mongoid/relations/auto_save.rb +0 -107
  1108. data/lib/mongoid/relations/binding.rb +0 -241
  1109. data/lib/mongoid/relations/bindings/embedded/in.rb +0 -63
  1110. data/lib/mongoid/relations/bindings/embedded/many.rb +0 -52
  1111. data/lib/mongoid/relations/bindings/embedded/one.rb +0 -55
  1112. data/lib/mongoid/relations/bindings/referenced/in.rb +0 -70
  1113. data/lib/mongoid/relations/bindings/referenced/many.rb +0 -42
  1114. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +0 -67
  1115. data/lib/mongoid/relations/bindings/referenced/one.rb +0 -44
  1116. data/lib/mongoid/relations/bindings.rb +0 -9
  1117. data/lib/mongoid/relations/builder.rb +0 -57
  1118. data/lib/mongoid/relations/builders/embedded/in.rb +0 -29
  1119. data/lib/mongoid/relations/builders/embedded/many.rb +0 -36
  1120. data/lib/mongoid/relations/builders/embedded/one.rb +0 -30
  1121. data/lib/mongoid/relations/builders/nested_attributes/many.rb +0 -177
  1122. data/lib/mongoid/relations/builders/nested_attributes/one.rb +0 -127
  1123. data/lib/mongoid/relations/builders/referenced/in.rb +0 -26
  1124. data/lib/mongoid/relations/builders/referenced/many.rb +0 -27
  1125. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +0 -40
  1126. data/lib/mongoid/relations/builders/referenced/one.rb +0 -26
  1127. data/lib/mongoid/relations/builders.rb +0 -104
  1128. data/lib/mongoid/relations/cascading/delete.rb +0 -44
  1129. data/lib/mongoid/relations/cascading/destroy.rb +0 -43
  1130. data/lib/mongoid/relations/cascading/nullify.rb +0 -35
  1131. data/lib/mongoid/relations/cascading/restrict.rb +0 -39
  1132. data/lib/mongoid/relations/cascading.rb +0 -58
  1133. data/lib/mongoid/relations/constraint.rb +0 -49
  1134. data/lib/mongoid/relations/conversions.rb +0 -34
  1135. data/lib/mongoid/relations/counter_cache.rb +0 -107
  1136. data/lib/mongoid/relations/cyclic.rb +0 -107
  1137. data/lib/mongoid/relations/embedded/batchable.rb +0 -356
  1138. data/lib/mongoid/relations/embedded/in.rb +0 -231
  1139. data/lib/mongoid/relations/embedded/many.rb +0 -659
  1140. data/lib/mongoid/relations/embedded/one.rb +0 -223
  1141. data/lib/mongoid/relations/macros.rb +0 -359
  1142. data/lib/mongoid/relations/many.rb +0 -217
  1143. data/lib/mongoid/relations/marshalable.rb +0 -32
  1144. data/lib/mongoid/relations/metadata.rb +0 -1227
  1145. data/lib/mongoid/relations/nested_builder.rb +0 -74
  1146. data/lib/mongoid/relations/one.rb +0 -60
  1147. data/lib/mongoid/relations/options.rb +0 -48
  1148. data/lib/mongoid/relations/polymorphic.rb +0 -40
  1149. data/lib/mongoid/relations/proxy.rb +0 -264
  1150. data/lib/mongoid/relations/referenced/in.rb +0 -314
  1151. data/lib/mongoid/relations/referenced/many.rb +0 -789
  1152. data/lib/mongoid/relations/referenced/many_to_many.rb +0 -495
  1153. data/lib/mongoid/relations/referenced/one.rb +0 -297
  1154. data/lib/mongoid/relations/reflections.rb +0 -62
  1155. data/lib/mongoid/relations/synchronization.rb +0 -169
  1156. data/lib/mongoid/relations/targets/enumerable.rb +0 -473
  1157. data/lib/mongoid/relations/targets.rb +0 -2
  1158. data/lib/mongoid/relations/touchable.rb +0 -61
  1159. data/lib/mongoid/relations.rb +0 -162
  1160. data/lib/mongoid/reloading.rb +0 -92
  1161. data/lib/mongoid/scoping.rb +0 -356
  1162. data/lib/mongoid/serialization.rb +0 -161
  1163. data/lib/mongoid/sessions/factory.rb +0 -129
  1164. data/lib/mongoid/sessions/mongo_uri.rb +0 -93
  1165. data/lib/mongoid/sessions/validators/storage.rb +0 -49
  1166. data/lib/mongoid/sessions/validators.rb +0 -2
  1167. data/lib/mongoid/sessions.rb +0 -433
  1168. data/lib/mongoid/sharding.rb +0 -61
  1169. data/lib/mongoid/state.rb +0 -97
  1170. data/lib/mongoid/unit_of_work.rb +0 -61
  1171. data/lib/mongoid/validations/associated.rb +0 -46
  1172. data/lib/mongoid/validations/format.rb +0 -20
  1173. data/lib/mongoid/validations/length.rb +0 -20
  1174. data/lib/mongoid/validations/localizable.rb +0 -30
  1175. data/lib/mongoid/validations/macros.rb +0 -93
  1176. data/lib/mongoid/validations/presence.rb +0 -86
  1177. data/lib/mongoid/validations/queryable.rb +0 -31
  1178. data/lib/mongoid/validations/uniqueness.rb +0 -330
  1179. data/lib/mongoid/validations.rb +0 -166
  1180. data/lib/mongoid/versioning.rb +0 -217
  1181. data/lib/rack/mongoid/middleware/identity_map.rb +0 -39
  1182. data/lib/rack/mongoid.rb +0 -2
  1183. data/lib/rails/generators/mongoid/observer/observer_generator.rb +0 -17
  1184. data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +0 -4
  1185. data/lib/support/ruby_version.rb +0 -26
  1186. data/spec/app/models/account.rb +0 -32
  1187. data/spec/app/models/acolyte.rb +0 -16
  1188. data/spec/app/models/actor.rb +0 -19
  1189. data/spec/app/models/actor_observer.rb +0 -15
  1190. data/spec/app/models/actress.rb +0 -2
  1191. data/spec/app/models/address.rb +0 -72
  1192. data/spec/app/models/address_component.rb +0 -5
  1193. data/spec/app/models/address_number.rb +0 -6
  1194. data/spec/app/models/agency.rb +0 -5
  1195. data/spec/app/models/agent.rb +0 -12
  1196. data/spec/app/models/album.rb +0 -14
  1197. data/spec/app/models/alert.rb +0 -5
  1198. data/spec/app/models/animal.rb +0 -25
  1199. data/spec/app/models/answer.rb +0 -4
  1200. data/spec/app/models/appointment.rb +0 -7
  1201. data/spec/app/models/article.rb +0 -13
  1202. data/spec/app/models/artist.rb +0 -66
  1203. data/spec/app/models/artwork.rb +0 -4
  1204. data/spec/app/models/augmentation.rb +0 -11
  1205. data/spec/app/models/author.rb +0 -6
  1206. data/spec/app/models/band.rb +0 -25
  1207. data/spec/app/models/bar.rb +0 -9
  1208. data/spec/app/models/basic.rb +0 -6
  1209. data/spec/app/models/bed.rb +0 -1
  1210. data/spec/app/models/big_palette.rb +0 -2
  1211. data/spec/app/models/birthday.rb +0 -13
  1212. data/spec/app/models/book.rb +0 -12
  1213. data/spec/app/models/breed.rb +0 -4
  1214. data/spec/app/models/browser.rb +0 -6
  1215. data/spec/app/models/building.rb +0 -7
  1216. data/spec/app/models/building_address.rb +0 -7
  1217. data/spec/app/models/bus.rb +0 -7
  1218. data/spec/app/models/business.rb +0 -5
  1219. data/spec/app/models/callback_recorder.rb +0 -25
  1220. data/spec/app/models/callback_test.rb +0 -9
  1221. data/spec/app/models/canvas.rb +0 -25
  1222. data/spec/app/models/car.rb +0 -1
  1223. data/spec/app/models/cat.rb +0 -8
  1224. data/spec/app/models/category.rb +0 -8
  1225. data/spec/app/models/child.rb +0 -4
  1226. data/spec/app/models/child_doc.rb +0 -22
  1227. data/spec/app/models/church.rb +0 -4
  1228. data/spec/app/models/circle.rb +0 -3
  1229. data/spec/app/models/circuit.rb +0 -4
  1230. data/spec/app/models/circus.rb +0 -7
  1231. data/spec/app/models/code.rb +0 -5
  1232. data/spec/app/models/comment.rb +0 -16
  1233. data/spec/app/models/contractor.rb +0 -7
  1234. data/spec/app/models/cookie.rb +0 -6
  1235. data/spec/app/models/country_code.rb +0 -8
  1236. data/spec/app/models/definition.rb +0 -8
  1237. data/spec/app/models/description.rb +0 -11
  1238. data/spec/app/models/dictionary.rb +0 -10
  1239. data/spec/app/models/division.rb +0 -10
  1240. data/spec/app/models/doctor.rb +0 -12
  1241. data/spec/app/models/dog.rb +0 -7
  1242. data/spec/app/models/dokument.rb +0 -5
  1243. data/spec/app/models/driver.rb +0 -7
  1244. data/spec/app/models/drug.rb +0 -8
  1245. data/spec/app/models/email.rb +0 -6
  1246. data/spec/app/models/employer.rb +0 -5
  1247. data/spec/app/models/entry.rb +0 -6
  1248. data/spec/app/models/eraser.rb +0 -1
  1249. data/spec/app/models/event.rb +0 -22
  1250. data/spec/app/models/exhibition.rb +0 -4
  1251. data/spec/app/models/exhibitor.rb +0 -5
  1252. data/spec/app/models/eye.rb +0 -9
  1253. data/spec/app/models/eye_bowl.rb +0 -9
  1254. data/spec/app/models/face.rb +0 -8
  1255. data/spec/app/models/favorite.rb +0 -6
  1256. data/spec/app/models/filesystem.rb +0 -4
  1257. data/spec/app/models/fire_hydrant.rb +0 -6
  1258. data/spec/app/models/firefox.rb +0 -4
  1259. data/spec/app/models/fish.rb +0 -8
  1260. data/spec/app/models/folder.rb +0 -7
  1261. data/spec/app/models/folder_item.rb +0 -9
  1262. data/spec/app/models/fruits.rb +0 -28
  1263. data/spec/app/models/game.rb +0 -21
  1264. data/spec/app/models/ghost.rb +0 -7
  1265. data/spec/app/models/home.rb +0 -4
  1266. data/spec/app/models/house.rb +0 -8
  1267. data/spec/app/models/html_writer.rb +0 -3
  1268. data/spec/app/models/image.rb +0 -22
  1269. data/spec/app/models/implant.rb +0 -16
  1270. data/spec/app/models/item.rb +0 -12
  1271. data/spec/app/models/jar.rb +0 -7
  1272. data/spec/app/models/label.rb +0 -40
  1273. data/spec/app/models/language.rb +0 -5
  1274. data/spec/app/models/lat_lng.rb +0 -15
  1275. data/spec/app/models/league.rb +0 -11
  1276. data/spec/app/models/learner.rb +0 -2
  1277. data/spec/app/models/line_item.rb +0 -6
  1278. data/spec/app/models/location.rb +0 -8
  1279. data/spec/app/models/login.rb +0 -8
  1280. data/spec/app/models/manufacturer.rb +0 -7
  1281. data/spec/app/models/meat.rb +0 -4
  1282. data/spec/app/models/membership.rb +0 -4
  1283. data/spec/app/models/mixed_drink.rb +0 -4
  1284. data/spec/app/models/movie.rb +0 -12
  1285. data/spec/app/models/my_hash.rb +0 -2
  1286. data/spec/app/models/name.rb +0 -23
  1287. data/spec/app/models/node.rb +0 -5
  1288. data/spec/app/models/note.rb +0 -12
  1289. data/spec/app/models/ordered_post.rb +0 -6
  1290. data/spec/app/models/ordered_preference.rb +0 -6
  1291. data/spec/app/models/oscar.rb +0 -15
  1292. data/spec/app/models/override.rb +0 -16
  1293. data/spec/app/models/ownable.rb +0 -6
  1294. data/spec/app/models/owner.rb +0 -6
  1295. data/spec/app/models/pack.rb +0 -3
  1296. data/spec/app/models/page.rb +0 -5
  1297. data/spec/app/models/page_question.rb +0 -4
  1298. data/spec/app/models/palette.rb +0 -7
  1299. data/spec/app/models/paranoid_phone.rb +0 -25
  1300. data/spec/app/models/paranoid_post.rb +0 -36
  1301. data/spec/app/models/parent.rb +0 -5
  1302. data/spec/app/models/parent_doc.rb +0 -6
  1303. data/spec/app/models/passport.rb +0 -5
  1304. data/spec/app/models/patient.rb +0 -9
  1305. data/spec/app/models/pdf_writer.rb +0 -3
  1306. data/spec/app/models/pencil.rb +0 -1
  1307. data/spec/app/models/person.rb +0 -201
  1308. data/spec/app/models/pet.rb +0 -23
  1309. data/spec/app/models/pet_owner.rb +0 -6
  1310. data/spec/app/models/phone.rb +0 -11
  1311. data/spec/app/models/phone_observer.rb +0 -6
  1312. data/spec/app/models/pizza.rb +0 -7
  1313. data/spec/app/models/player.rb +0 -35
  1314. data/spec/app/models/post.rb +0 -43
  1315. data/spec/app/models/powerup.rb +0 -11
  1316. data/spec/app/models/preference.rb +0 -9
  1317. data/spec/app/models/princess.rb +0 -8
  1318. data/spec/app/models/product.rb +0 -17
  1319. data/spec/app/models/profile.rb +0 -5
  1320. data/spec/app/models/pronunciation.rb +0 -5
  1321. data/spec/app/models/purchase.rb +0 -4
  1322. data/spec/app/models/question.rb +0 -8
  1323. data/spec/app/models/quiz.rb +0 -10
  1324. data/spec/app/models/rating.rb +0 -8
  1325. data/spec/app/models/record.rb +0 -46
  1326. data/spec/app/models/registry.rb +0 -4
  1327. data/spec/app/models/role.rb +0 -7
  1328. data/spec/app/models/root_category.rb +0 -4
  1329. data/spec/app/models/sandwich.rb +0 -4
  1330. data/spec/app/models/scheduler.rb +0 -7
  1331. data/spec/app/models/seo.rb +0 -7
  1332. data/spec/app/models/series.rb +0 -4
  1333. data/spec/app/models/server.rb +0 -13
  1334. data/spec/app/models/service.rb +0 -22
  1335. data/spec/app/models/shape.rb +0 -12
  1336. data/spec/app/models/shelf.rb +0 -5
  1337. data/spec/app/models/shipping_container.rb +0 -5
  1338. data/spec/app/models/shipping_pack.rb +0 -3
  1339. data/spec/app/models/shop.rb +0 -6
  1340. data/spec/app/models/short_agent.rb +0 -4
  1341. data/spec/app/models/short_quiz.rb +0 -5
  1342. data/spec/app/models/slave.rb +0 -6
  1343. data/spec/app/models/song.rb +0 -8
  1344. data/spec/app/models/square.rb +0 -4
  1345. data/spec/app/models/strategy.rb +0 -3
  1346. data/spec/app/models/sub_item.rb +0 -3
  1347. data/spec/app/models/subscription.rb +0 -4
  1348. data/spec/app/models/survey.rb +0 -5
  1349. data/spec/app/models/symptom.rb +0 -6
  1350. data/spec/app/models/tag.rb +0 -8
  1351. data/spec/app/models/target.rb +0 -5
  1352. data/spec/app/models/template.rb +0 -5
  1353. data/spec/app/models/thing.rb +0 -9
  1354. data/spec/app/models/title.rb +0 -4
  1355. data/spec/app/models/tool.rb +0 -8
  1356. data/spec/app/models/topping.rb +0 -5
  1357. data/spec/app/models/track.rb +0 -38
  1358. data/spec/app/models/translation.rb +0 -5
  1359. data/spec/app/models/tree.rb +0 -9
  1360. data/spec/app/models/truck.rb +0 -3
  1361. data/spec/app/models/user.rb +0 -21
  1362. data/spec/app/models/user_account.rb +0 -10
  1363. data/spec/app/models/validation_callback.rb +0 -10
  1364. data/spec/app/models/vehicle.rb +0 -11
  1365. data/spec/app/models/version.rb +0 -5
  1366. data/spec/app/models/vet_visit.rb +0 -5
  1367. data/spec/app/models/video.rb +0 -17
  1368. data/spec/app/models/video_game.rb +0 -1
  1369. data/spec/app/models/weapon.rb +0 -11
  1370. data/spec/app/models/wiki_page.rb +0 -17
  1371. data/spec/app/models/word.rb +0 -12
  1372. data/spec/app/models/word_origin.rb +0 -11
  1373. data/spec/app/models/writer.rb +0 -11
  1374. data/spec/mongoid/atomic/positionable_spec.rb +0 -227
  1375. data/spec/mongoid/attributes/processing_spec.rb +0 -149
  1376. data/spec/mongoid/callbacks_spec.rb +0 -1564
  1377. data/spec/mongoid/components_spec.rb +0 -24
  1378. data/spec/mongoid/contextual/find_and_modify_spec.rb +0 -220
  1379. data/spec/mongoid/criterion/destructive_spec.rb +0 -101
  1380. data/spec/mongoid/criterion/inspection_spec.rb +0 -27
  1381. data/spec/mongoid/criterion/marshalable_spec.rb +0 -28
  1382. data/spec/mongoid/criterion/modifiable_spec.rb +0 -409
  1383. data/spec/mongoid/criterion/modification_spec.rb +0 -402
  1384. data/spec/mongoid/criterion/scoping_spec.rb +0 -391
  1385. data/spec/mongoid/dirty_spec.rb +0 -1508
  1386. data/spec/mongoid/errors/eager_load_spec.rb +0 -29
  1387. data/spec/mongoid/errors/mixed_session_configuration_spec.rb +0 -29
  1388. data/spec/mongoid/errors/no_session_config_spec.rb +0 -29
  1389. data/spec/mongoid/errors/no_session_database_spec.rb +0 -29
  1390. data/spec/mongoid/errors/no_session_hosts_spec.rb +0 -29
  1391. data/spec/mongoid/errors/no_sessions_config_spec.rb +0 -29
  1392. data/spec/mongoid/errors/versioning_not_on_root_spec.rb +0 -29
  1393. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +0 -184
  1394. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +0 -201
  1395. data/spec/mongoid/finders_spec.rb +0 -321
  1396. data/spec/mongoid/hierarchy_spec.rb +0 -244
  1397. data/spec/mongoid/identity_map_spec.rb +0 -564
  1398. data/spec/mongoid/indexes_spec.rb +0 -404
  1399. data/spec/mongoid/inspection_spec.rb +0 -57
  1400. data/spec/mongoid/json_spec.rb +0 -33
  1401. data/spec/mongoid/matchers/all_spec.rb +0 -31
  1402. data/spec/mongoid/matchers/and_spec.rb +0 -162
  1403. data/spec/mongoid/matchers/default_spec.rb +0 -130
  1404. data/spec/mongoid/matchers/exists_spec.rb +0 -57
  1405. data/spec/mongoid/matchers/gt_spec.rb +0 -74
  1406. data/spec/mongoid/matchers/gte_spec.rb +0 -74
  1407. data/spec/mongoid/matchers/in_spec.rb +0 -25
  1408. data/spec/mongoid/matchers/lt_spec.rb +0 -74
  1409. data/spec/mongoid/matchers/lte_spec.rb +0 -74
  1410. data/spec/mongoid/matchers/ne_spec.rb +0 -25
  1411. data/spec/mongoid/matchers/nin_spec.rb +0 -25
  1412. data/spec/mongoid/matchers/or_spec.rb +0 -106
  1413. data/spec/mongoid/matchers/size_spec.rb +0 -25
  1414. data/spec/mongoid/matchers_spec.rb +0 -532
  1415. data/spec/mongoid/multi_parameter_attributes_spec.rb +0 -128
  1416. data/spec/mongoid/nested_attributes_spec.rb +0 -4945
  1417. data/spec/mongoid/observer_spec.rb +0 -290
  1418. data/spec/mongoid/paranoia_spec.rb +0 -759
  1419. data/spec/mongoid/persistence/atomic/add_to_set_spec.rb +0 -262
  1420. data/spec/mongoid/persistence/atomic/bit_spec.rb +0 -88
  1421. data/spec/mongoid/persistence/atomic/inc_spec.rb +0 -133
  1422. data/spec/mongoid/persistence/atomic/pop_spec.rb +0 -111
  1423. data/spec/mongoid/persistence/atomic/pull_all_spec.rb +0 -77
  1424. data/spec/mongoid/persistence/atomic/pull_spec.rb +0 -80
  1425. data/spec/mongoid/persistence/atomic/push_all_spec.rb +0 -77
  1426. data/spec/mongoid/persistence/atomic/push_spec.rb +0 -77
  1427. data/spec/mongoid/persistence/atomic/rename_spec.rb +0 -42
  1428. data/spec/mongoid/persistence/atomic/sets_spec.rb +0 -154
  1429. data/spec/mongoid/persistence/atomic/unset_spec.rb +0 -65
  1430. data/spec/mongoid/persistence/atomic_spec.rb +0 -216
  1431. data/spec/mongoid/persistence/operations/embedded/insert_spec.rb +0 -191
  1432. data/spec/mongoid/persistence/operations/embedded/remove_spec.rb +0 -8
  1433. data/spec/mongoid/persistence/operations/insert_spec.rb +0 -149
  1434. data/spec/mongoid/persistence/operations/remove_spec.rb +0 -113
  1435. data/spec/mongoid/persistence/operations/update_spec.rb +0 -141
  1436. data/spec/mongoid/persistence/operations/upsert_spec.rb +0 -59
  1437. data/spec/mongoid/persistence/operations_spec.rb +0 -313
  1438. data/spec/mongoid/persistence_spec.rb +0 -2279
  1439. data/spec/mongoid/railties/document_spec.rb +0 -24
  1440. data/spec/mongoid/relations/accessors_spec.rb +0 -844
  1441. data/spec/mongoid/relations/auto_save_spec.rb +0 -261
  1442. data/spec/mongoid/relations/bindings/embedded/in_spec.rb +0 -171
  1443. data/spec/mongoid/relations/bindings/embedded/many_spec.rb +0 -54
  1444. data/spec/mongoid/relations/bindings/embedded/one_spec.rb +0 -77
  1445. data/spec/mongoid/relations/bindings/referenced/in_spec.rb +0 -241
  1446. data/spec/mongoid/relations/bindings/referenced/many_spec.rb +0 -153
  1447. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +0 -178
  1448. data/spec/mongoid/relations/bindings/referenced/one_spec.rb +0 -131
  1449. data/spec/mongoid/relations/builders/embedded/in_spec.rb +0 -34
  1450. data/spec/mongoid/relations/builders/embedded/many_spec.rb +0 -132
  1451. data/spec/mongoid/relations/builders/embedded/one_spec.rb +0 -99
  1452. data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +0 -234
  1453. data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +0 -250
  1454. data/spec/mongoid/relations/builders/referenced/in_spec.rb +0 -241
  1455. data/spec/mongoid/relations/builders/referenced/many_spec.rb +0 -137
  1456. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +0 -178
  1457. data/spec/mongoid/relations/builders/referenced/one_spec.rb +0 -124
  1458. data/spec/mongoid/relations/builders_spec.rb +0 -226
  1459. data/spec/mongoid/relations/cascading/delete_spec.rb +0 -101
  1460. data/spec/mongoid/relations/cascading/destroy_spec.rb +0 -47
  1461. data/spec/mongoid/relations/cascading/nullify_spec.rb +0 -32
  1462. data/spec/mongoid/relations/cascading/restrict_spec.rb +0 -68
  1463. data/spec/mongoid/relations/cascading_spec.rb +0 -355
  1464. data/spec/mongoid/relations/constraint_spec.rb +0 -74
  1465. data/spec/mongoid/relations/conversions_spec.rb +0 -126
  1466. data/spec/mongoid/relations/counter_cache_spec.rb +0 -205
  1467. data/spec/mongoid/relations/cyclic_spec.rb +0 -156
  1468. data/spec/mongoid/relations/embedded/dirty_spec.rb +0 -65
  1469. data/spec/mongoid/relations/embedded/in_spec.rb +0 -580
  1470. data/spec/mongoid/relations/embedded/many_spec.rb +0 -3841
  1471. data/spec/mongoid/relations/embedded/one_spec.rb +0 -1055
  1472. data/spec/mongoid/relations/macros_spec.rb +0 -625
  1473. data/spec/mongoid/relations/metadata_spec.rb +0 -2030
  1474. data/spec/mongoid/relations/options_spec.rb +0 -35
  1475. data/spec/mongoid/relations/polymorphic_spec.rb +0 -132
  1476. data/spec/mongoid/relations/referenced/in_spec.rb +0 -1501
  1477. data/spec/mongoid/relations/referenced/many_spec.rb +0 -3632
  1478. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +0 -3561
  1479. data/spec/mongoid/relations/referenced/one_spec.rb +0 -1331
  1480. data/spec/mongoid/relations/reflections_spec.rb +0 -101
  1481. data/spec/mongoid/relations/synchronization_spec.rb +0 -453
  1482. data/spec/mongoid/relations/targets/enumerable_spec.rb +0 -1710
  1483. data/spec/mongoid/relations_spec.rb +0 -188
  1484. data/spec/mongoid/reloading_spec.rb +0 -305
  1485. data/spec/mongoid/scoping_spec.rb +0 -978
  1486. data/spec/mongoid/serialization_spec.rb +0 -833
  1487. data/spec/mongoid/sessions/factory_spec.rb +0 -312
  1488. data/spec/mongoid/sessions/mongo_uri_spec.rb +0 -103
  1489. data/spec/mongoid/sessions_spec.rb +0 -1111
  1490. data/spec/mongoid/sharding_spec.rb +0 -61
  1491. data/spec/mongoid/state_spec.rb +0 -102
  1492. data/spec/mongoid/unit_of_work_spec.rb +0 -196
  1493. data/spec/mongoid/validations/associated_spec.rb +0 -183
  1494. data/spec/mongoid/validations/format_spec.rb +0 -83
  1495. data/spec/mongoid/validations/length_spec.rb +0 -223
  1496. data/spec/mongoid/validations/numericality_spec.rb +0 -30
  1497. data/spec/mongoid/validations/presence_spec.rb +0 -592
  1498. data/spec/mongoid/validations/uniqueness_spec.rb +0 -2399
  1499. data/spec/mongoid/validations_spec.rb +0 -309
  1500. data/spec/mongoid/versioning_spec.rb +0 -540
  1501. data/spec/rack/mongoid/middleware/identity_map_spec.rb +0 -72
@@ -0,0 +1,2504 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ describe Mongoid::Validatable::UniquenessValidator do
6
+
7
+ describe "#valid?" do
8
+
9
+ context "when the document is a root document" do
10
+
11
+ context "when adding custom persistence options" do
12
+
13
+ before do
14
+ Dictionary.validates_uniqueness_of :name
15
+ end
16
+
17
+ after do
18
+ Dictionary.reset_callbacks(:validate)
19
+ end
20
+
21
+ context "when persisting to another collection" do
22
+
23
+ before do
24
+ Dictionary.with(collection: "dicts") do |klass|
25
+ klass.create!(name: "websters")
26
+ end
27
+ end
28
+
29
+ context "when the document is not valid" do
30
+
31
+ let(:websters) do
32
+ object = nil
33
+ valid = Dictionary.with(collection: "dicts") do |klass|
34
+ object = klass.new(name: "websters")
35
+ object.valid?
36
+ end
37
+ { :valid => valid, :object => object }
38
+ end
39
+
40
+ it "performs the validation on the correct collection" do
41
+ expect(websters[:valid]).to be(false)
42
+ end
43
+
44
+ it "adds the uniqueness error" do
45
+ expect(websters[:object].errors[:name]).to_not be_nil
46
+ end
47
+
48
+ it "clears the persistence options in the thread local" do
49
+ expect(Dictionary.persistence_context).to eq(Mongoid::PersistenceContext.new(Dictionary))
50
+ end
51
+ end
52
+
53
+ context "when the document is valid" do
54
+
55
+ let(:oxford) do
56
+ Dictionary.with(collection: "dicts") do |klass|
57
+ klass.new(name: "oxford")
58
+ end
59
+ end
60
+
61
+ it "performs the validation on the correct collection" do
62
+ expect(oxford).to be_valid
63
+ end
64
+ end
65
+ end
66
+ end
67
+
68
+ context "when the document contains no compound key" do
69
+
70
+ context "when validating a relation" do
71
+
72
+ before do
73
+ Word.validates_uniqueness_of :dictionary
74
+ end
75
+
76
+ after do
77
+ Word.reset_callbacks(:validate)
78
+ end
79
+
80
+ context "when the attribute id is unique" do
81
+
82
+ let(:dictionary) do
83
+ Dictionary.create!
84
+ end
85
+
86
+ let(:word) do
87
+ Word.new(dictionary: dictionary)
88
+ end
89
+
90
+ it "returns true" do
91
+ expect(word).to be_valid
92
+ end
93
+ end
94
+ end
95
+
96
+ context "when the field name is aliased" do
97
+
98
+ before do
99
+ Dictionary.create!(language: "en")
100
+ end
101
+
102
+ let(:dictionary) do
103
+ Dictionary.new(language: "en")
104
+ end
105
+
106
+ after do
107
+ Dictionary.reset_callbacks(:validate)
108
+ end
109
+
110
+ context "when the validation uses the aliased name" do
111
+
112
+ before do
113
+ Dictionary.validates_uniqueness_of :language
114
+ end
115
+
116
+ it "correctly detects a uniqueness conflict" do
117
+ expect(dictionary).to_not be_valid
118
+ end
119
+
120
+ it "adds the uniqueness error to the aliased field name" do
121
+ dictionary.valid?
122
+ expect(dictionary.errors).to have_key(:language)
123
+ expect(dictionary.errors[:language]).to eq([ "has already been taken" ])
124
+ end
125
+ end
126
+
127
+ context "when the validation uses the underlying field name" do
128
+
129
+ before do
130
+ Dictionary.validates_uniqueness_of :l
131
+ end
132
+
133
+ it "correctly detects a uniqueness conflict" do
134
+ expect(dictionary).to_not be_valid
135
+ end
136
+
137
+ it "adds the uniqueness error to the underlying field name" do
138
+ dictionary.valid?
139
+ expect(dictionary.errors).to have_key(:l)
140
+ expect(dictionary.errors[:l]).to eq([ "has already been taken" ])
141
+ end
142
+ end
143
+ end
144
+
145
+ context "when the field is localized" do
146
+
147
+ context "when no scope is provided" do
148
+
149
+ context "when case sensitive is true" do
150
+
151
+ before do
152
+ Dictionary.validates_uniqueness_of :description
153
+ end
154
+
155
+ after do
156
+ Dictionary.reset_callbacks(:validate)
157
+ end
158
+
159
+ context "when no attribute is set" do
160
+
161
+ context "when no document with no value exists in the database" do
162
+
163
+ let(:dictionary) do
164
+ Dictionary.new
165
+ end
166
+
167
+ it "returns true" do
168
+ expect(dictionary).to be_valid
169
+ end
170
+ end
171
+
172
+ context "when a document with no value exists in the database" do
173
+
174
+ before do
175
+ Dictionary.create!
176
+ end
177
+
178
+ let(:dictionary) do
179
+ Dictionary.new
180
+ end
181
+
182
+ it "returns false" do
183
+ expect(dictionary).to_not be_valid
184
+ end
185
+ end
186
+ end
187
+
188
+ context "when the attribute is unique" do
189
+
190
+ context "when single localization" do
191
+
192
+ before do
193
+ Dictionary.create!(description: "english")
194
+ end
195
+
196
+ let(:dictionary) do
197
+ Dictionary.new(description: "English")
198
+ end
199
+
200
+ it "returns true" do
201
+ expect(dictionary).to be_valid
202
+ end
203
+ end
204
+
205
+ context "when multiple localizations" do
206
+
207
+ before do
208
+ Dictionary.
209
+ create(description_translations: { "en" => "english", "de" => "german" })
210
+ end
211
+
212
+ let(:dictionary) do
213
+ Dictionary.new(description_translations: { "en" => "English", "de" => "German" })
214
+ end
215
+
216
+ it "returns true" do
217
+ expect(dictionary).to be_valid
218
+ end
219
+ end
220
+ end
221
+
222
+ context "when the attribute is not unique" do
223
+
224
+ context "when the document is not the match" do
225
+
226
+ context "when single localization" do
227
+
228
+ before do
229
+ Dictionary.create!(description: "english")
230
+ end
231
+
232
+ let(:dictionary) do
233
+ Dictionary.new(description: "english")
234
+ end
235
+
236
+ it "returns false" do
237
+ expect(dictionary).to_not be_valid
238
+ end
239
+
240
+ it "adds the uniqueness error" do
241
+ dictionary.valid?
242
+ expect(dictionary.errors[:description]).to eq([ "has already been taken" ])
243
+ end
244
+ end
245
+
246
+ context "when multiple localizations" do
247
+
248
+ before do
249
+ Dictionary.
250
+ create(description_translations: { "en" => "english", "de" => "german" })
251
+ end
252
+
253
+ let(:dictionary) do
254
+ Dictionary.new(description_translations: { "en" => "english", "de" => "German" })
255
+ end
256
+
257
+ it "returns false" do
258
+ expect(dictionary).to_not be_valid
259
+ end
260
+
261
+ it "adds the uniqueness error" do
262
+ dictionary.valid?
263
+ expect(dictionary.errors[:description]).to eq([ "has already been taken" ])
264
+ end
265
+ end
266
+ end
267
+ end
268
+ end
269
+
270
+ context "when case sensitive is false" do
271
+
272
+ before do
273
+ Dictionary.validates_uniqueness_of :description, case_sensitive: false
274
+ end
275
+
276
+ after do
277
+ Dictionary.reset_callbacks(:validate)
278
+ end
279
+
280
+ context "when the attribute is unique" do
281
+
282
+ context "when there are no special characters" do
283
+
284
+ before do
285
+ Dictionary.create!(description: "english")
286
+ end
287
+
288
+ let(:dictionary) do
289
+ Dictionary.new(description: "german")
290
+ end
291
+
292
+ it "returns true" do
293
+ expect(dictionary).to be_valid
294
+ end
295
+ end
296
+
297
+ context "when special characters exist" do
298
+
299
+ before do
300
+ Dictionary.create!(description: "english")
301
+ end
302
+
303
+ let(:dictionary) do
304
+ Dictionary.new(description: "en@gl.ish")
305
+ end
306
+
307
+ it "returns true" do
308
+ expect(dictionary).to be_valid
309
+ end
310
+ end
311
+ end
312
+
313
+ context "when the attribute is not unique" do
314
+
315
+ context "when the document is not the match" do
316
+
317
+ context "when signle localization" do
318
+
319
+ before do
320
+ Dictionary.create!(description: "english")
321
+ end
322
+
323
+ let(:dictionary) do
324
+ Dictionary.new(description: "English")
325
+ end
326
+
327
+ it "returns false" do
328
+ expect(dictionary).to_not be_valid
329
+ end
330
+
331
+ it "adds the uniqueness error" do
332
+ dictionary.valid?
333
+ expect(dictionary.errors[:description]).to eq([ "has already been taken" ])
334
+ end
335
+ end
336
+
337
+ context "when multiple localizations" do
338
+
339
+ before do
340
+ Dictionary.
341
+ create(description_translations: { "en" => "english", "de" => "german" })
342
+ end
343
+
344
+ let(:dictionary) do
345
+ Dictionary.new(description_translations: { "en" => "English", "de" => "German" })
346
+ end
347
+
348
+ it "returns false" do
349
+ expect(dictionary).to_not be_valid
350
+ end
351
+
352
+ it "adds the uniqueness error" do
353
+ dictionary.valid?
354
+ expect(dictionary.errors[:description]).to eq([ "has already been taken" ])
355
+ end
356
+ end
357
+ end
358
+
359
+ context "when the document is the match in the database" do
360
+
361
+ let!(:dictionary) do
362
+ Dictionary.create!(description: "english")
363
+ end
364
+
365
+ it "returns true" do
366
+ expect(dictionary).to be_valid
367
+ end
368
+ end
369
+ end
370
+ end
371
+ end
372
+
373
+ context "when a scope is provided" do
374
+
375
+ before do
376
+ Dictionary.validates_uniqueness_of :description, scope: :name
377
+ end
378
+
379
+ after do
380
+ Dictionary.reset_callbacks(:validate)
381
+ end
382
+
383
+ context "when the attribute is not unique in the scope" do
384
+
385
+ context "when the document is not the match" do
386
+
387
+ before do
388
+ Dictionary.
389
+ create(description: "english", name: "test")
390
+ end
391
+
392
+ let(:dictionary) do
393
+ Dictionary.new(description: "english", name: "test")
394
+ end
395
+
396
+ it "returns false" do
397
+ expect(dictionary).to_not be_valid
398
+ end
399
+
400
+ it "adds the uniqueness error" do
401
+ dictionary.valid?
402
+ expect(dictionary.errors[:description]).to eq([ "has already been taken" ])
403
+ end
404
+ end
405
+ end
406
+ end
407
+ end
408
+
409
+ context "when no scope is provided" do
410
+
411
+ before do
412
+ Dictionary.validates_uniqueness_of :name
413
+ end
414
+
415
+ after do
416
+ Dictionary.reset_callbacks(:validate)
417
+ end
418
+
419
+ context "when the attribute is unique" do
420
+
421
+ let!(:oxford) do
422
+ Dictionary.create!(name: "Oxford")
423
+ end
424
+
425
+ let(:dictionary) do
426
+ Dictionary.new(name: "Webster")
427
+ end
428
+
429
+ it "returns true" do
430
+ expect(dictionary).to be_valid
431
+ end
432
+
433
+ context "when subsequently cloning the document" do
434
+
435
+ let(:clone) do
436
+ oxford.clone
437
+ end
438
+
439
+ it "returns false for the clone" do
440
+ expect(clone).to_not be_valid
441
+ end
442
+ end
443
+ end
444
+
445
+ context "when the attribute is not unique" do
446
+
447
+ context "when the document is not the match" do
448
+
449
+ before do
450
+ Dictionary.create!(name: "Oxford")
451
+ end
452
+
453
+ let!(:dictionary) do
454
+ Dictionary.new(name: "Oxford")
455
+ end
456
+
457
+ it "returns false" do
458
+ expect(dictionary).to_not be_valid
459
+ end
460
+
461
+ it "adds the uniqueness error" do
462
+ dictionary.valid?
463
+ expect(dictionary.errors[:name]).to eq([ "has already been taken" ])
464
+ end
465
+ end
466
+
467
+ context "when the document is the match in the database" do
468
+
469
+ context "when the field has changed" do
470
+
471
+ let!(:dictionary) do
472
+ Dictionary.create!(name: "Oxford")
473
+ end
474
+
475
+ it "returns true" do
476
+ expect(dictionary).to be_valid
477
+ end
478
+ end
479
+
480
+ context "when the field has not changed" do
481
+
482
+ before do
483
+ Dictionary.default_scoping = nil
484
+ end
485
+
486
+ let!(:dictionary) do
487
+ Dictionary.create!(name: "Oxford")
488
+ end
489
+
490
+ let!(:from_db) do
491
+ Dictionary.find(dictionary.id)
492
+ end
493
+
494
+ it "returns true" do
495
+ expect(from_db).to be_valid
496
+ end
497
+
498
+ it "does not touch the database" do
499
+ expect(Dictionary).to receive(:where).never
500
+ from_db.valid?
501
+ end
502
+ end
503
+ end
504
+ end
505
+ end
506
+
507
+ context "when a default scope is on the model" do
508
+
509
+ before do
510
+ Dictionary.validates_uniqueness_of :name
511
+ Dictionary.default_scope(->{ Dictionary.where(year: 1990) })
512
+ end
513
+
514
+ after do
515
+ Dictionary.default_scoping = nil
516
+ Dictionary.reset_callbacks(:validate)
517
+ end
518
+
519
+ context "when the document with the unqiue attribute is not in default scope" do
520
+
521
+ context "when the attribute is not unique" do
522
+
523
+ before do
524
+ Dictionary.create!(name: "Oxford")
525
+ end
526
+
527
+ let(:dictionary) do
528
+ Dictionary.new(name: "Oxford")
529
+ end
530
+
531
+ it "returns false" do
532
+ expect(dictionary).to_not be_valid
533
+ end
534
+ end
535
+ end
536
+ end
537
+
538
+ context "when an aliased scope is provided" do
539
+
540
+ before do
541
+ Dictionary.validates_uniqueness_of :name, scope: :language
542
+ end
543
+
544
+ after do
545
+ Dictionary.reset_callbacks(:validate)
546
+ end
547
+
548
+ context "when the attribute is unique" do
549
+
550
+ before do
551
+ Dictionary.create!(name: "Oxford", language: "English")
552
+ end
553
+
554
+ let(:dictionary) do
555
+ Dictionary.new(name: "Webster")
556
+ end
557
+
558
+ it "returns true" do
559
+ expect(dictionary).to be_valid
560
+ end
561
+ end
562
+
563
+ context "when the attribute is unique in the scope" do
564
+
565
+ before do
566
+ Dictionary.create!(name: "Oxford", language: "English")
567
+ end
568
+
569
+ let(:dictionary) do
570
+ Dictionary.new(name: "Webster", language: "English")
571
+ end
572
+
573
+ it "returns true" do
574
+ expect(dictionary).to be_valid
575
+ end
576
+ end
577
+
578
+ context "when the attribute is not unique with no scope" do
579
+
580
+ before do
581
+ Dictionary.create!(name: "Oxford", language: "English")
582
+ end
583
+
584
+ let(:dictionary) do
585
+ Dictionary.new(name: "Oxford")
586
+ end
587
+
588
+ it "returns true" do
589
+ expect(dictionary).to be_valid
590
+ end
591
+ end
592
+
593
+ context "when the attribute is not unique in another scope" do
594
+
595
+ before do
596
+ Dictionary.create!(name: "Oxford", language: "English")
597
+ end
598
+
599
+ let(:dictionary) do
600
+ Dictionary.new(name: "Oxford", language: "Deutsch")
601
+ end
602
+
603
+ it "returns true" do
604
+ expect(dictionary).to be_valid
605
+ end
606
+ end
607
+
608
+ context "when the attribute is not unique in the same scope" do
609
+
610
+ context "when the document is not the match" do
611
+
612
+ before do
613
+ Dictionary.create!(name: "Oxford", language: "English")
614
+ end
615
+
616
+ let(:dictionary) do
617
+ Dictionary.new(name: "Oxford", language: "English")
618
+ end
619
+
620
+ it "returns false" do
621
+ expect(dictionary).to_not be_valid
622
+ end
623
+
624
+ it "adds the uniqueness errors" do
625
+ dictionary.valid?
626
+ expect(dictionary.errors[:name]).to eq([ "has already been taken" ])
627
+ end
628
+ end
629
+
630
+ context "when the document is the match in the database" do
631
+
632
+ let!(:dictionary) do
633
+ Dictionary.create!(name: "Oxford", language: "English")
634
+ end
635
+
636
+ it "returns true" do
637
+ expect(dictionary).to be_valid
638
+ end
639
+ end
640
+ end
641
+ end
642
+
643
+ context "when a single scope is provided" do
644
+
645
+ before do
646
+ Dictionary.validates_uniqueness_of :name, scope: :publisher
647
+ end
648
+
649
+ after do
650
+ Dictionary.reset_callbacks(:validate)
651
+ end
652
+
653
+ context "when the attribute is unique" do
654
+
655
+ before do
656
+ Dictionary.create!(name: "Oxford", publisher: "Amazon")
657
+ end
658
+
659
+ let(:dictionary) do
660
+ Dictionary.new(name: "Webster")
661
+ end
662
+
663
+ it "returns true" do
664
+ expect(dictionary).to be_valid
665
+ end
666
+ end
667
+
668
+ context "when the attribute is unique in the scope" do
669
+
670
+ before do
671
+ Dictionary.create!(name: "Oxford", publisher: "Amazon")
672
+ end
673
+
674
+ let(:dictionary) do
675
+ Dictionary.new(name: "Webster", publisher: "Amazon")
676
+ end
677
+
678
+ it "returns true" do
679
+ expect(dictionary).to be_valid
680
+ end
681
+ end
682
+
683
+ context "when uniqueness is violated due to scope change" do
684
+
685
+ let(:personal_folder) do
686
+ Folder.create!(name: "Personal")
687
+ end
688
+
689
+ let(:public_folder) do
690
+ Folder.create!(name: "Public")
691
+ end
692
+
693
+ before do
694
+ personal_folder.folder_items << FolderItem.new(name: "non-unique")
695
+ public_folder.folder_items << FolderItem.new(name: "non-unique")
696
+ end
697
+
698
+ let(:item) do
699
+ public_folder.folder_items.last
700
+ end
701
+
702
+ it "should set an error for associated object not being unique" do
703
+ item.update_attributes(folder_id: personal_folder.id)
704
+ expect(item.errors.messages[:name].first).to eq("has already been taken")
705
+ end
706
+ end
707
+
708
+ context "when the attribute is not unique with no scope" do
709
+
710
+ before do
711
+ Dictionary.create!(name: "Oxford", publisher: "Amazon")
712
+ end
713
+
714
+ let(:dictionary) do
715
+ Dictionary.new(name: "Oxford")
716
+ end
717
+
718
+ it "returns true" do
719
+ expect(dictionary).to be_valid
720
+ end
721
+ end
722
+
723
+ context "when the attribute is not unique in another scope" do
724
+
725
+ before do
726
+ Dictionary.create!(name: "Oxford", publisher: "Amazon")
727
+ end
728
+
729
+ let(:dictionary) do
730
+ Dictionary.new(name: "Oxford", publisher: "Addison")
731
+ end
732
+
733
+ it "returns true" do
734
+ expect(dictionary).to be_valid
735
+ end
736
+ end
737
+
738
+ context "when the attribute is not unique in the same scope" do
739
+
740
+ context "when the document is not the match" do
741
+
742
+ before do
743
+ Dictionary.create!(name: "Oxford", publisher: "Amazon")
744
+ end
745
+
746
+ let(:dictionary) do
747
+ Dictionary.new(name: "Oxford", publisher: "Amazon")
748
+ end
749
+
750
+ it "returns false" do
751
+ expect(dictionary).to_not be_valid
752
+ end
753
+
754
+ it "adds the uniqueness errors" do
755
+ dictionary.valid?
756
+ expect(dictionary.errors[:name]).to eq([ "has already been taken" ])
757
+ end
758
+ end
759
+
760
+ context "when the document is the match in the database" do
761
+
762
+ let!(:dictionary) do
763
+ Dictionary.create!(name: "Oxford", publisher: "Amazon")
764
+ end
765
+
766
+ it "returns true" do
767
+ expect(dictionary).to be_valid
768
+ end
769
+ end
770
+
771
+ context "when one of the scopes is a time" do
772
+
773
+ before do
774
+ Dictionary.create!(
775
+ name: "Oxford",
776
+ publisher: "Amazon",
777
+ published: 10.days.ago.to_time
778
+ )
779
+ end
780
+
781
+ let(:dictionary) do
782
+ Dictionary.new(
783
+ name: "Oxford",
784
+ publisher: "Amazon",
785
+ published: 10.days.ago.to_time
786
+ )
787
+ end
788
+
789
+ it "returns false" do
790
+ expect(dictionary).to_not be_valid
791
+ end
792
+
793
+ it "adds the uniqueness errors" do
794
+ dictionary.valid?
795
+ expect(dictionary.errors[:name]).to eq([ "has already been taken" ])
796
+ end
797
+ end
798
+ end
799
+ end
800
+
801
+ context "when a range condition is provided" do
802
+
803
+ before do
804
+ Dictionary.validates_uniqueness_of(:name,
805
+ conditions: -> { Dictionary.where(:year.gte => 1900, :year.lt => 2000) })
806
+ end
807
+
808
+ after do
809
+ Dictionary.reset_callbacks(:validate)
810
+ end
811
+
812
+ context 'when multiple documents would match the condition' do
813
+ it "prevents creation of new document" do
814
+ Dictionary.create!(name: "French-English", year: 1950)
815
+
816
+ expect do
817
+ Dictionary.create!(name: "French-English", year: 1960)
818
+ end.to raise_error(Mongoid::Errors::Validations, /Name has already been taken/)
819
+
820
+ expect(Dictionary.all.size).to eq(1)
821
+ end
822
+ end
823
+
824
+ context 'when only new document would match the condition' do
825
+ it 'creates the new document' do
826
+ Dictionary.create!(name: "French-English", year: 950)
827
+ expect do
828
+ Dictionary.create!(name: "French-English", year: 1950)
829
+ end.not_to raise_error
830
+ end
831
+ end
832
+
833
+ context 'when only existing document matches the condition' do
834
+ it 'creates the new document' do
835
+ pending 'https://jira.mongodb.org/browse/MONGOID-4815'
836
+
837
+ Dictionary.create!(name: "French-English", year: 1950)
838
+ expect do
839
+ Dictionary.create!(name: "French-English", year: 950)
840
+ end.not_to raise_error
841
+ end
842
+ end
843
+ end
844
+
845
+ context "when multiple scopes are provided" do
846
+
847
+ before do
848
+ Dictionary.validates_uniqueness_of :name, scope: [ :publisher, :year ]
849
+ end
850
+
851
+ after do
852
+ Dictionary.reset_callbacks(:validate)
853
+ end
854
+
855
+ context "when the attribute is unique" do
856
+
857
+ before do
858
+ Dictionary.create!(name: "Oxford", publisher: "Amazon")
859
+ end
860
+
861
+ let(:dictionary) do
862
+ Dictionary.new(name: "Webster")
863
+ end
864
+
865
+ it "returns true" do
866
+ expect(dictionary).to be_valid
867
+ end
868
+ end
869
+
870
+ context "when the attribute is unique in the scope" do
871
+
872
+ before do
873
+ Dictionary.create!(
874
+ name: "Oxford",
875
+ publisher: "Amazon",
876
+ year: 2011
877
+ )
878
+ end
879
+
880
+ let(:dictionary) do
881
+ Dictionary.new(
882
+ name: "Webster",
883
+ publisher: "Amazon",
884
+ year: 2011
885
+ )
886
+ end
887
+
888
+ it "returns true" do
889
+ expect(dictionary).to be_valid
890
+ end
891
+ end
892
+
893
+ context "when the attribute is not unique with no scope" do
894
+
895
+ before do
896
+ Dictionary.create!(name: "Oxford", publisher: "Amazon")
897
+ end
898
+
899
+ let(:dictionary) do
900
+ Dictionary.new(name: "Oxford")
901
+ end
902
+
903
+ it "returns true" do
904
+ expect(dictionary).to be_valid
905
+ end
906
+ end
907
+
908
+ context "when the attribute is not unique in another scope" do
909
+
910
+ before do
911
+ Dictionary.create!(
912
+ name: "Oxford",
913
+ publisher: "Amazon",
914
+ year: 1995
915
+ )
916
+ end
917
+
918
+ let(:dictionary) do
919
+ Dictionary.new(
920
+ name: "Oxford",
921
+ publisher: "Addison",
922
+ year: 2011
923
+ )
924
+ end
925
+
926
+ it "returns true" do
927
+ expect(dictionary).to be_valid
928
+ end
929
+ end
930
+
931
+ context "when the attribute is not unique in the same scope" do
932
+
933
+ context "when the document is not the match" do
934
+
935
+ before do
936
+ Dictionary.create!(
937
+ name: "Oxford",
938
+ publisher: "Amazon",
939
+ year: 1960
940
+ )
941
+ end
942
+
943
+ let(:dictionary) do
944
+ Dictionary.new(
945
+ name: "Oxford",
946
+ publisher: "Amazon",
947
+ year: 1960
948
+ )
949
+ end
950
+
951
+ it "returns false" do
952
+ expect(dictionary).to_not be_valid
953
+ end
954
+
955
+ it "adds the uniqueness errors" do
956
+ dictionary.valid?
957
+ expect(dictionary.errors[:name]).to eq([ "has already been taken" ])
958
+ end
959
+ end
960
+
961
+ context "when the document is the match in the database" do
962
+
963
+ let!(:dictionary) do
964
+ Dictionary.create!(
965
+ name: "Oxford",
966
+ publisher: "Amazon",
967
+ year: 1960
968
+ )
969
+ end
970
+
971
+ it "returns true" do
972
+ expect(dictionary).to be_valid
973
+ end
974
+ end
975
+ end
976
+ end
977
+
978
+ context "when case sensitive is true" do
979
+
980
+ before do
981
+ Dictionary.validates_uniqueness_of :name
982
+ end
983
+
984
+ after do
985
+ Dictionary.reset_callbacks(:validate)
986
+ end
987
+
988
+ context "when the attribute is unique" do
989
+
990
+ before do
991
+ Dictionary.create!(name: "Oxford")
992
+ end
993
+
994
+ let(:dictionary) do
995
+ Dictionary.new(name: "Webster")
996
+ end
997
+
998
+ it "returns true" do
999
+ expect(dictionary).to be_valid
1000
+ end
1001
+ end
1002
+
1003
+ context "when the attribute is not unique" do
1004
+
1005
+ context "when the document is not the match" do
1006
+
1007
+ before do
1008
+ Dictionary.create!(name: "Oxford")
1009
+ end
1010
+
1011
+ let(:dictionary) do
1012
+ Dictionary.new(name: "Oxford")
1013
+ end
1014
+
1015
+ it "returns false" do
1016
+ expect(dictionary).to_not be_valid
1017
+ end
1018
+
1019
+ it "adds the uniqueness error" do
1020
+ dictionary.valid?
1021
+ expect(dictionary.errors[:name]).to eq([ "has already been taken" ])
1022
+ end
1023
+ end
1024
+
1025
+ context "when the document is the match in the database" do
1026
+
1027
+ let!(:dictionary) do
1028
+ Dictionary.create!(name: "Oxford")
1029
+ end
1030
+
1031
+ it "returns true" do
1032
+ expect(dictionary).to be_valid
1033
+ end
1034
+ end
1035
+ end
1036
+ end
1037
+
1038
+ context "when case sensitive is false" do
1039
+
1040
+ before do
1041
+ Dictionary.validates_uniqueness_of :name, case_sensitive: false
1042
+ end
1043
+
1044
+ after do
1045
+ Dictionary.reset_callbacks(:validate)
1046
+ end
1047
+
1048
+ context "when the attribute is unique" do
1049
+
1050
+ context "when there are no special characters" do
1051
+
1052
+ before do
1053
+ Dictionary.create!(name: "Oxford")
1054
+ end
1055
+
1056
+ let(:dictionary) do
1057
+ Dictionary.new(name: "Webster")
1058
+ end
1059
+
1060
+ it "returns true" do
1061
+ expect(dictionary).to be_valid
1062
+ end
1063
+ end
1064
+
1065
+ context "when special characters exist" do
1066
+
1067
+ before do
1068
+ Dictionary.create!(name: "Oxford")
1069
+ end
1070
+
1071
+ let(:dictionary) do
1072
+ Dictionary.new(name: "Web@st.er")
1073
+ end
1074
+
1075
+ it "returns true" do
1076
+ expect(dictionary).to be_valid
1077
+ end
1078
+ end
1079
+ end
1080
+
1081
+ context "when the attribute is not unique" do
1082
+
1083
+ context "when the document is not the match" do
1084
+
1085
+ before do
1086
+ Dictionary.create!(name: "Oxford")
1087
+ end
1088
+
1089
+ let(:dictionary) do
1090
+ Dictionary.new(name: "oxford")
1091
+ end
1092
+
1093
+ it "returns false" do
1094
+ expect(dictionary).to_not be_valid
1095
+ end
1096
+
1097
+ it "adds the uniqueness error" do
1098
+ dictionary.valid?
1099
+ expect(dictionary.errors[:name]).to eq([ "has already been taken" ])
1100
+ end
1101
+ end
1102
+
1103
+ context "when the document is the match in the database" do
1104
+
1105
+ let!(:dictionary) do
1106
+ Dictionary.create!(name: "Oxford")
1107
+ end
1108
+
1109
+ it "returns true" do
1110
+ expect(dictionary).to be_valid
1111
+ end
1112
+ end
1113
+ end
1114
+ end
1115
+
1116
+ context "when not allowing nil" do
1117
+
1118
+ it "raises a validation error" do
1119
+ expect { LineItem.create! }.to raise_error Mongoid::Errors::Validations
1120
+ end
1121
+ end
1122
+
1123
+ context "when allowing nil" do
1124
+
1125
+ before do
1126
+ Dictionary.validates_uniqueness_of :name, allow_nil: true
1127
+ end
1128
+
1129
+ after do
1130
+ Dictionary.reset_callbacks(:validate)
1131
+ end
1132
+
1133
+ context "when the attribute is nil" do
1134
+
1135
+ before do
1136
+ Dictionary.create!
1137
+ end
1138
+
1139
+ let(:dictionary) do
1140
+ Dictionary.new
1141
+ end
1142
+
1143
+ it "returns true" do
1144
+ expect(dictionary).to be_valid
1145
+ end
1146
+ end
1147
+ end
1148
+
1149
+ context "when allowing blank" do
1150
+
1151
+ before do
1152
+ Dictionary.validates_uniqueness_of :name, allow_blank: true
1153
+ end
1154
+
1155
+ after do
1156
+ Dictionary.reset_callbacks(:validate)
1157
+ end
1158
+
1159
+ context "when the attribute is blank" do
1160
+
1161
+ before do
1162
+ Dictionary.create!(name: "")
1163
+ end
1164
+
1165
+ let(:dictionary) do
1166
+ Dictionary.new(name: "")
1167
+ end
1168
+
1169
+ it "returns true" do
1170
+ expect(dictionary).to be_valid
1171
+ end
1172
+ end
1173
+ end
1174
+ end
1175
+
1176
+ context "when the document contains a compound key" do
1177
+
1178
+ context "when no scope is provided" do
1179
+
1180
+ before do
1181
+ Login.validates_uniqueness_of :username
1182
+ end
1183
+
1184
+ after do
1185
+ Login.reset_callbacks(:validate)
1186
+ end
1187
+
1188
+ context "when the attribute is unique" do
1189
+
1190
+ before do
1191
+ Login.create!(username: "Oxford")
1192
+ end
1193
+
1194
+ let(:login) do
1195
+ Login.new(username: "Webster")
1196
+ end
1197
+
1198
+ it "returns true" do
1199
+ expect(login).to be_valid
1200
+ end
1201
+ end
1202
+
1203
+ context "when the attribute is not unique" do
1204
+
1205
+ context "when the document is not the match" do
1206
+
1207
+ before do
1208
+ Login.create!(username: "Oxford")
1209
+ end
1210
+
1211
+ let(:login) do
1212
+ Login.new(username: "Oxford")
1213
+ end
1214
+
1215
+ it "returns false" do
1216
+ expect(login).to_not be_valid
1217
+ end
1218
+
1219
+ it "adds the uniqueness error" do
1220
+ login.valid?
1221
+ expect(login.errors[:username]).to eq([ "has already been taken" ])
1222
+ end
1223
+ end
1224
+
1225
+ context "when the document is the match in the database" do
1226
+
1227
+ let!(:login) do
1228
+ Login.create!(username: "Oxford")
1229
+ end
1230
+
1231
+ it "returns true" do
1232
+ expect(login).to be_valid
1233
+ end
1234
+ end
1235
+ end
1236
+ end
1237
+
1238
+ context "when a single scope is provided" do
1239
+
1240
+ before do
1241
+ Login.validates_uniqueness_of :username, scope: :application_id
1242
+ end
1243
+
1244
+ after do
1245
+ Login.reset_callbacks(:validate)
1246
+ end
1247
+
1248
+ context "when the attribute is unique" do
1249
+
1250
+ before do
1251
+ Login.create!(username: "Oxford", application_id: 1)
1252
+ end
1253
+
1254
+ let(:login) do
1255
+ Login.new(username: "Webster")
1256
+ end
1257
+
1258
+ it "returns true" do
1259
+ expect(login).to be_valid
1260
+ end
1261
+ end
1262
+
1263
+ context "when the attribute is unique in the scope" do
1264
+
1265
+ before do
1266
+ Login.create!(username: "Oxford", application_id: 1)
1267
+ end
1268
+
1269
+ let(:login) do
1270
+ Login.new(username: "Webster", application_id: 1)
1271
+ end
1272
+
1273
+ it "returns true" do
1274
+ expect(login).to be_valid
1275
+ end
1276
+ end
1277
+
1278
+ context "when the attribute is not unique with no scope" do
1279
+
1280
+ before do
1281
+ Login.create!(username: "Oxford", application_id: 1)
1282
+ end
1283
+
1284
+ let(:login) do
1285
+ Login.new(username: "Oxford")
1286
+ end
1287
+
1288
+ it "returns true" do
1289
+ expect(login).to be_valid
1290
+ end
1291
+ end
1292
+
1293
+ context "when the attribute is not unique in another scope" do
1294
+
1295
+ before do
1296
+ Login.create!(username: "Oxford", application_id: 1)
1297
+ end
1298
+
1299
+ let(:login) do
1300
+ Login.new(username: "Oxford", application_id: 2)
1301
+ end
1302
+
1303
+ it "returns true" do
1304
+ expect(login).to be_valid
1305
+ end
1306
+ end
1307
+
1308
+ context "when the attribute is not unique in the same scope" do
1309
+
1310
+ context "when the document is not the match" do
1311
+
1312
+ before do
1313
+ Login.create!(username: "Oxford", application_id: 1)
1314
+ end
1315
+
1316
+ let(:login) do
1317
+ Login.new(username: "Oxford", application_id: 1)
1318
+ end
1319
+
1320
+ it "returns false" do
1321
+ expect(login).to_not be_valid
1322
+ end
1323
+
1324
+ it "adds the uniqueness errors" do
1325
+ login.valid?
1326
+ expect(login.errors[:username]).to eq([ "has already been taken" ])
1327
+ end
1328
+ end
1329
+
1330
+ context "when the document is the match in the database" do
1331
+
1332
+ let!(:login) do
1333
+ Login.create!(username: "Oxford", application_id: 1)
1334
+ end
1335
+
1336
+ it "returns true" do
1337
+ expect(login).to be_valid
1338
+ end
1339
+ end
1340
+ end
1341
+ end
1342
+
1343
+ context "when case sensitive is true" do
1344
+
1345
+ before do
1346
+ Login.validates_uniqueness_of :username
1347
+ end
1348
+
1349
+ after do
1350
+ Login.reset_callbacks(:validate)
1351
+ end
1352
+
1353
+ context "when the attribute is unique" do
1354
+
1355
+ before do
1356
+ Login.create!(username: "Oxford")
1357
+ end
1358
+
1359
+ let(:login) do
1360
+ Login.new(username: "Webster")
1361
+ end
1362
+
1363
+ it "returns true" do
1364
+ expect(login).to be_valid
1365
+ end
1366
+ end
1367
+
1368
+ context "when the attribute is not unique" do
1369
+
1370
+ context "when the document is not the match" do
1371
+
1372
+ before do
1373
+ Login.create!(username: "Oxford")
1374
+ end
1375
+
1376
+ let(:login) do
1377
+ Login.new(username: "Oxford")
1378
+ end
1379
+
1380
+ it "returns false" do
1381
+ expect(login).to_not be_valid
1382
+ end
1383
+
1384
+ it "adds the uniqueness error" do
1385
+ login.valid?
1386
+ expect(login.errors[:username]).to eq([ "has already been taken" ])
1387
+ end
1388
+ end
1389
+
1390
+ context "when the document is the match in the database" do
1391
+
1392
+ let!(:login) do
1393
+ Login.create!(username: "Oxford")
1394
+ end
1395
+
1396
+ it "returns true" do
1397
+ expect(login).to be_valid
1398
+ end
1399
+ end
1400
+ end
1401
+ end
1402
+
1403
+ context "when case sensitive is false" do
1404
+
1405
+ before do
1406
+ Login.validates_uniqueness_of :username, case_sensitive: false
1407
+ end
1408
+
1409
+ after do
1410
+ Login.reset_callbacks(:validate)
1411
+ end
1412
+
1413
+ context "when the attribute is unique" do
1414
+
1415
+ context "when there are no special characters" do
1416
+
1417
+ before do
1418
+ Login.create!(username: "Oxford")
1419
+ end
1420
+
1421
+ let(:login) do
1422
+ Login.new(username: "Webster")
1423
+ end
1424
+
1425
+ it "returns true" do
1426
+ expect(login).to be_valid
1427
+ end
1428
+ end
1429
+
1430
+ context "when special characters exist" do
1431
+
1432
+ before do
1433
+ Login.create!(username: "Oxford")
1434
+ end
1435
+
1436
+ let(:login) do
1437
+ Login.new(username: "Web@st.er")
1438
+ end
1439
+
1440
+ it "returns true" do
1441
+ expect(login).to be_valid
1442
+ end
1443
+ end
1444
+ end
1445
+
1446
+ context "when the attribute is not unique" do
1447
+
1448
+ context "when the document is not the match" do
1449
+
1450
+ before do
1451
+ Login.create!(username: "Oxford")
1452
+ end
1453
+
1454
+ let(:login) do
1455
+ Login.new(username: "oxford")
1456
+ end
1457
+
1458
+ it "returns false" do
1459
+ expect(login).to_not be_valid
1460
+ end
1461
+
1462
+ it "adds the uniqueness error" do
1463
+ login.valid?
1464
+ expect(login.errors[:username]).to eq([ "has already been taken" ])
1465
+ end
1466
+ end
1467
+
1468
+ context "when the document is the match in the database" do
1469
+
1470
+ let!(:login) do
1471
+ Login.create!(username: "Oxford")
1472
+ end
1473
+
1474
+ it "returns true" do
1475
+ expect(login).to be_valid
1476
+ end
1477
+ end
1478
+ end
1479
+ end
1480
+
1481
+ context "when allowing nil" do
1482
+
1483
+ before do
1484
+ Login.validates_uniqueness_of :username, allow_nil: true
1485
+ end
1486
+
1487
+ after do
1488
+ Login.reset_callbacks(:validate)
1489
+ end
1490
+
1491
+ context "when the attribute is nil" do
1492
+
1493
+ before do
1494
+ Login.create!
1495
+ end
1496
+
1497
+ let(:login) do
1498
+ Login.new
1499
+ end
1500
+
1501
+ it "returns true" do
1502
+ expect(login).to be_valid
1503
+ end
1504
+ end
1505
+ end
1506
+
1507
+ context "when allowing blank" do
1508
+
1509
+ before do
1510
+ Login.validates_uniqueness_of :username, allow_blank: true
1511
+ end
1512
+
1513
+ after do
1514
+ Login.reset_callbacks(:validate)
1515
+ end
1516
+
1517
+ context "when the attribute is blank" do
1518
+
1519
+ before do
1520
+ Login.create!(username: "")
1521
+ end
1522
+
1523
+ let(:login) do
1524
+ Login.new(username: "")
1525
+ end
1526
+
1527
+ it "returns true" do
1528
+ expect(login).to be_valid
1529
+ end
1530
+ end
1531
+ end
1532
+ end
1533
+
1534
+ context "when the attribute is a custom type" do
1535
+
1536
+ before do
1537
+ Bar.validates_uniqueness_of :lat_lng
1538
+ end
1539
+
1540
+ after do
1541
+ Bar.reset_callbacks(:validate)
1542
+ end
1543
+
1544
+ context "when the attribute is unique" do
1545
+
1546
+ before do
1547
+ Bar.create!(lat_lng: LatLng.new(52.30, 13.25))
1548
+ end
1549
+
1550
+ let(:unique_bar) do
1551
+ Bar.new(lat_lng: LatLng.new(54.30, 14.25))
1552
+ end
1553
+
1554
+ it "returns true" do
1555
+ expect(unique_bar).to be_valid
1556
+ end
1557
+
1558
+ end
1559
+
1560
+ context "when the attribute is not unique" do
1561
+
1562
+ before do
1563
+ Bar.create!(lat_lng: LatLng.new(52.30, 13.25))
1564
+ end
1565
+
1566
+ let(:non_unique_bar) do
1567
+ Bar.new(lat_lng: LatLng.new(52.30, 13.25))
1568
+ end
1569
+
1570
+ it "returns false" do
1571
+ expect(non_unique_bar).to_not be_valid
1572
+ end
1573
+
1574
+ end
1575
+ end
1576
+
1577
+ context "when conditions is set" do
1578
+
1579
+ before do
1580
+ Band.validates_uniqueness_of :name, conditions: ->{ Band.where(active: true) }
1581
+ end
1582
+
1583
+ after do
1584
+ Band.reset_callbacks(:validate)
1585
+ end
1586
+
1587
+ context "when the attribute is unique" do
1588
+
1589
+ before do
1590
+ Band.create!(name: 'Foo', active: false)
1591
+ end
1592
+
1593
+ let(:unique_band) do
1594
+ Band.new(name: 'Foo')
1595
+ end
1596
+
1597
+ it "returns true" do
1598
+ expect(unique_band).to be_valid
1599
+ end
1600
+
1601
+ end
1602
+
1603
+ context "when the attribute is not unique" do
1604
+
1605
+ before do
1606
+ Band.create!(name: 'Foo')
1607
+ end
1608
+
1609
+ let(:non_unique_band) do
1610
+ Band.new(name: 'Foo')
1611
+ end
1612
+
1613
+ it "returns false" do
1614
+ expect(non_unique_band).to_not be_valid
1615
+ end
1616
+ end
1617
+ end
1618
+ end
1619
+ end
1620
+
1621
+ context "when the document is embedded" do
1622
+
1623
+ let(:word) do
1624
+ Word.create!(name: "Schadenfreude")
1625
+ end
1626
+
1627
+ context "when in an embeds_many" do
1628
+
1629
+ let!(:def_one) do
1630
+ word.definitions.create!(description: "1")
1631
+ end
1632
+
1633
+ let!(:def_two) do
1634
+ word.definitions.create!(description: "2")
1635
+ end
1636
+
1637
+ context "when a document is being destroyed" do
1638
+
1639
+ before do
1640
+ Definition.validates_uniqueness_of :description
1641
+ end
1642
+
1643
+ after do
1644
+ Definition.reset_callbacks(:validate)
1645
+ end
1646
+
1647
+ context "when changing a document to the destroyed property" do
1648
+
1649
+ let(:attributes) do
1650
+ {
1651
+ definitions_attributes: {
1652
+ "0" => { id: def_one.id, description: "0", "_destroy" => 1 },
1653
+ "1" => { id: def_two.id, description: "1" }
1654
+ }
1655
+ }
1656
+ end
1657
+
1658
+ before do
1659
+ word.attributes = attributes
1660
+ end
1661
+
1662
+ it "returns true" do
1663
+ expect(def_two).to be_valid
1664
+ end
1665
+ end
1666
+ end
1667
+
1668
+ context "when the document does not use composite keys" do
1669
+
1670
+ context "when no scope is provided" do
1671
+
1672
+ before do
1673
+ Definition.validates_uniqueness_of :description
1674
+ end
1675
+
1676
+ after do
1677
+ Definition.reset_callbacks(:validate)
1678
+ end
1679
+
1680
+ context "when the attribute is unique" do
1681
+
1682
+ before do
1683
+ word.definitions.build(description: "Malicious joy")
1684
+ end
1685
+
1686
+ let(:definition) do
1687
+ word.definitions.build(description: "Gloating")
1688
+ end
1689
+
1690
+ it "returns true" do
1691
+ expect(definition).to be_valid
1692
+ end
1693
+ end
1694
+
1695
+ context "when the attribute is not unique" do
1696
+
1697
+ context "when the document is not the match" do
1698
+
1699
+ before do
1700
+ word.definitions.build(description: "Malicious joy")
1701
+ end
1702
+
1703
+ let(:definition) do
1704
+ word.definitions.build(description: "Malicious joy")
1705
+ end
1706
+
1707
+ it "returns false" do
1708
+ expect(definition).to_not be_valid
1709
+ end
1710
+
1711
+ it "adds the uniqueness error" do
1712
+ definition.valid?
1713
+ expect(definition.errors[:description]).to eq([ "has already been taken" ])
1714
+ end
1715
+ end
1716
+
1717
+ context "when the document is the match in the database" do
1718
+
1719
+ let!(:definition) do
1720
+ word.definitions.build(description: "Malicious joy")
1721
+ end
1722
+
1723
+ it "returns true" do
1724
+ expect(definition).to be_valid
1725
+ end
1726
+ end
1727
+ end
1728
+ end
1729
+
1730
+ context "when a single scope is provided" do
1731
+
1732
+ before do
1733
+ Definition.validates_uniqueness_of :description, scope: :part
1734
+ end
1735
+
1736
+ after do
1737
+ Definition.reset_callbacks(:validate)
1738
+ end
1739
+
1740
+ context "when the attribute is unique" do
1741
+
1742
+ before do
1743
+ word.definitions.build(
1744
+ description: "Malicious joy", part: "Noun"
1745
+ )
1746
+ end
1747
+
1748
+ let(:definition) do
1749
+ word.definitions.build(description: "Gloating")
1750
+ end
1751
+
1752
+ it "returns true" do
1753
+ expect(definition).to be_valid
1754
+ end
1755
+ end
1756
+
1757
+ context "when the attribute is unique in the scope" do
1758
+
1759
+ before do
1760
+ word.definitions.build(
1761
+ description: "Malicious joy",
1762
+ part: "Noun"
1763
+ )
1764
+ end
1765
+
1766
+ let(:definition) do
1767
+ word.definitions.build(
1768
+ description: "Gloating",
1769
+ part: "Noun"
1770
+ )
1771
+ end
1772
+
1773
+ it "returns true" do
1774
+ expect(definition).to be_valid
1775
+ end
1776
+ end
1777
+
1778
+ context "when the attribute is not unique with no scope" do
1779
+
1780
+ before do
1781
+ word.definitions.build(
1782
+ description: "Malicious joy",
1783
+ part: "Noun"
1784
+ )
1785
+ end
1786
+
1787
+ let(:definition) do
1788
+ word.definitions.build(description: "Malicious joy")
1789
+ end
1790
+
1791
+ it "returns true" do
1792
+ expect(definition).to be_valid
1793
+ end
1794
+ end
1795
+
1796
+ context "when the attribute is not unique in another scope" do
1797
+
1798
+ before do
1799
+ word.definitions.build(
1800
+ description: "Malicious joy",
1801
+ part: "Noun"
1802
+ )
1803
+ end
1804
+
1805
+ let(:definition) do
1806
+ word.definitions.build(
1807
+ description: "Malicious joy",
1808
+ part: "Adj"
1809
+ )
1810
+ end
1811
+
1812
+ it "returns true" do
1813
+ expect(definition).to be_valid
1814
+ end
1815
+ end
1816
+
1817
+ context "when the attribute is not unique in the same scope" do
1818
+
1819
+ context "when the document is not the match" do
1820
+
1821
+ before do
1822
+ word.definitions.build(
1823
+ description: "Malicious joy",
1824
+ part: "Noun"
1825
+ )
1826
+ end
1827
+
1828
+ let(:definition) do
1829
+ word.definitions.build(
1830
+ description: "Malicious joy",
1831
+ part: "Noun"
1832
+ )
1833
+ end
1834
+
1835
+ it "returns false" do
1836
+ expect(definition).to_not be_valid
1837
+ end
1838
+
1839
+ it "adds the uniqueness errors" do
1840
+ definition.valid?
1841
+ expect(definition.errors[:description]).to eq([ "has already been taken" ])
1842
+ end
1843
+ end
1844
+
1845
+ context "when the document is the match in the database" do
1846
+
1847
+ let!(:definition) do
1848
+ word.definitions.build(
1849
+ description: "Malicious joy",
1850
+ part: "Noun"
1851
+ )
1852
+ end
1853
+
1854
+ it "returns true" do
1855
+ expect(definition).to be_valid
1856
+ end
1857
+ end
1858
+ end
1859
+ end
1860
+
1861
+ context "when multiple scopes are provided" do
1862
+
1863
+ before do
1864
+ Definition.validates_uniqueness_of :description, scope: [ :part, :regular ]
1865
+ end
1866
+
1867
+ after do
1868
+ Definition.reset_callbacks(:validate)
1869
+ end
1870
+
1871
+ context "when the attribute is unique" do
1872
+
1873
+ before do
1874
+ word.definitions.build(
1875
+ description: "Malicious joy",
1876
+ part: "Noun"
1877
+ )
1878
+ end
1879
+
1880
+ let(:definition) do
1881
+ word.definitions.build(description: "Gloating")
1882
+ end
1883
+
1884
+ it "returns true" do
1885
+ expect(definition).to be_valid
1886
+ end
1887
+ end
1888
+
1889
+ context "when the attribute is unique in the scope" do
1890
+
1891
+ before do
1892
+ word.definitions.build(
1893
+ description: "Malicious joy",
1894
+ part: "Noun",
1895
+ regular: true
1896
+ )
1897
+ end
1898
+
1899
+ let(:definition) do
1900
+ word.definitions.build(
1901
+ description: "Gloating",
1902
+ part: "Noun",
1903
+ regular: true
1904
+ )
1905
+ end
1906
+
1907
+ it "returns true" do
1908
+ expect(definition).to be_valid
1909
+ end
1910
+ end
1911
+
1912
+ context "when the attribute is not unique with no scope" do
1913
+
1914
+ before do
1915
+ word.definitions.build(
1916
+ description: "Malicious joy",
1917
+ part: "Noun"
1918
+ )
1919
+ end
1920
+
1921
+ let(:definition) do
1922
+ word.definitions.build(description: "Malicious scope")
1923
+ end
1924
+
1925
+ it "returns true" do
1926
+ expect(definition).to be_valid
1927
+ end
1928
+ end
1929
+
1930
+ context "when the attribute is not unique in another scope" do
1931
+
1932
+ before do
1933
+ word.definitions.build(
1934
+ description: "Malicious joy",
1935
+ part: "Noun",
1936
+ regular: true
1937
+ )
1938
+ end
1939
+
1940
+ let(:definition) do
1941
+ word.definitions.build(
1942
+ description: "Malicious joy",
1943
+ part: "Adj",
1944
+ regular: true
1945
+ )
1946
+ end
1947
+
1948
+ it "returns true" do
1949
+ expect(definition).to be_valid
1950
+ end
1951
+ end
1952
+
1953
+ context "when the attribute is not unique in the same scope" do
1954
+
1955
+ context "when the document is not the match" do
1956
+
1957
+ before do
1958
+ word.definitions.build(
1959
+ description: "Malicious joy",
1960
+ part: "Noun",
1961
+ regular: true
1962
+ )
1963
+ end
1964
+
1965
+ let(:definition) do
1966
+ word.definitions.build(
1967
+ description: "Malicious joy",
1968
+ part: "Noun",
1969
+ regular: true
1970
+ )
1971
+ end
1972
+
1973
+ it "returns false" do
1974
+ expect(definition).to_not be_valid
1975
+ end
1976
+
1977
+ it "adds the uniqueness errors" do
1978
+ definition.valid?
1979
+ expect(definition.errors[:description]).to eq([ "has already been taken" ])
1980
+ end
1981
+ end
1982
+
1983
+ context "when the document is the match in the database" do
1984
+
1985
+ let!(:definition) do
1986
+ word.definitions.build(
1987
+ description: "Malicious joy",
1988
+ part: "Noun",
1989
+ regular: false
1990
+ )
1991
+ end
1992
+
1993
+ it "returns true" do
1994
+ expect(definition).to be_valid
1995
+ end
1996
+ end
1997
+ end
1998
+ end
1999
+
2000
+ context "when case sensitive is true" do
2001
+
2002
+ before do
2003
+ Definition.validates_uniqueness_of :description
2004
+ end
2005
+
2006
+ after do
2007
+ Definition.reset_callbacks(:validate)
2008
+ end
2009
+
2010
+ context "when the attribute is unique" do
2011
+
2012
+ before do
2013
+ word.definitions.build(description: "Malicious jo")
2014
+ end
2015
+
2016
+ let(:definition) do
2017
+ word.definitions.build(description: "Gloating")
2018
+ end
2019
+
2020
+ it "returns true" do
2021
+ expect(definition).to be_valid
2022
+ end
2023
+ end
2024
+
2025
+ context "when the attribute is not unique" do
2026
+
2027
+ context "when the document is not the match" do
2028
+
2029
+ before do
2030
+ word.definitions.build(description: "Malicious joy")
2031
+ end
2032
+
2033
+ let(:definition) do
2034
+ word.definitions.build(description: "Malicious joy")
2035
+ end
2036
+
2037
+ it "returns false" do
2038
+ expect(definition).to_not be_valid
2039
+ end
2040
+
2041
+ it "adds the uniqueness error" do
2042
+ definition.valid?
2043
+ expect(definition.errors[:description]).to eq([ "has already been taken" ])
2044
+ end
2045
+ end
2046
+
2047
+ context "when the document is the match in the database" do
2048
+
2049
+ let!(:definition) do
2050
+ word.definitions.build(description: "Malicious joy")
2051
+ end
2052
+
2053
+ it "returns true" do
2054
+ expect(definition).to be_valid
2055
+ end
2056
+ end
2057
+ end
2058
+ end
2059
+
2060
+ context "when case sensitive is false" do
2061
+
2062
+ before do
2063
+ Definition.validates_uniqueness_of :description, case_sensitive: false
2064
+ end
2065
+
2066
+ after do
2067
+ Definition.reset_callbacks(:validate)
2068
+ end
2069
+
2070
+ context "when the attribute is unique" do
2071
+
2072
+ context "when there are no special characters" do
2073
+
2074
+ before do
2075
+ word.definitions.build(description: "Malicious joy")
2076
+ end
2077
+
2078
+ let(:definition) do
2079
+ word.definitions.build(description: "Gloating")
2080
+ end
2081
+
2082
+ it "returns true" do
2083
+ expect(definition).to be_valid
2084
+ end
2085
+ end
2086
+
2087
+ context "when special characters exist" do
2088
+
2089
+ before do
2090
+ word.definitions.build(description: "Malicious joy")
2091
+ end
2092
+
2093
+ let(:definition) do
2094
+ word.definitions.build(description: "M@licious.joy")
2095
+ end
2096
+
2097
+ it "returns true" do
2098
+ expect(definition).to be_valid
2099
+ end
2100
+ end
2101
+ end
2102
+
2103
+ context "when the attribute is not unique" do
2104
+
2105
+ context "when the document is not the match" do
2106
+
2107
+ before do
2108
+ word.definitions.build(description: "Malicious joy")
2109
+ end
2110
+
2111
+ let(:definition) do
2112
+ word.definitions.build(description: "Malicious JOY")
2113
+ end
2114
+
2115
+ it "returns false" do
2116
+ expect(definition).to_not be_valid
2117
+ end
2118
+
2119
+ it "adds the uniqueness error" do
2120
+ definition.valid?
2121
+ expect(definition.errors[:description]).to eq([ "has already been taken" ])
2122
+ end
2123
+ end
2124
+
2125
+ context "when the document is the match in the database" do
2126
+
2127
+ let!(:definition) do
2128
+ word.definitions.build(description: "Malicious joy")
2129
+ end
2130
+
2131
+ it "returns true" do
2132
+ expect(definition).to be_valid
2133
+ end
2134
+ end
2135
+ end
2136
+ end
2137
+
2138
+ context "when allowing nil" do
2139
+
2140
+ before do
2141
+ Definition.validates_uniqueness_of :description, allow_nil: true
2142
+ end
2143
+
2144
+ after do
2145
+ Definition.reset_callbacks(:validate)
2146
+ end
2147
+
2148
+ context "when the attribute is nil" do
2149
+
2150
+ before do
2151
+ word.definitions.build
2152
+ end
2153
+
2154
+ let(:definition) do
2155
+ word.definitions.build
2156
+ end
2157
+
2158
+ it "returns true" do
2159
+ expect(definition).to be_valid
2160
+ end
2161
+ end
2162
+ end
2163
+
2164
+ context "when allowing blank" do
2165
+
2166
+ before do
2167
+ Definition.validates_uniqueness_of :description, allow_blank: true
2168
+ end
2169
+
2170
+ after do
2171
+ Definition.reset_callbacks(:validate)
2172
+ end
2173
+
2174
+ context "when the attribute is blank" do
2175
+
2176
+ before do
2177
+ word.definitions.build(description: "")
2178
+ end
2179
+
2180
+ let(:definition) do
2181
+ word.definitions.build(description: "")
2182
+ end
2183
+
2184
+ it "returns true" do
2185
+ expect(definition).to be_valid
2186
+ end
2187
+ end
2188
+ end
2189
+
2190
+ context "when the field name is aliased" do
2191
+
2192
+ before do
2193
+ word.definitions.build(part: "noun", synonyms: "foo")
2194
+ end
2195
+
2196
+ let(:definition) do
2197
+ word.definitions.build(part: "noun", synonyms: "foo")
2198
+ end
2199
+
2200
+ after do
2201
+ Definition.reset_callbacks(:validate)
2202
+ end
2203
+
2204
+ context "when the validation uses the aliased name" do
2205
+
2206
+ before do
2207
+ Definition.validates_uniqueness_of :part, case_sensitive: false
2208
+ end
2209
+
2210
+ it "correctly detects a uniqueness conflict" do
2211
+ expect(definition).to_not be_valid
2212
+ end
2213
+
2214
+ it "adds the uniqueness error to the aliased field name" do
2215
+ definition.valid?
2216
+ expect(definition.errors).to have_key(:part)
2217
+ expect(definition.errors[:part]).to eq([ "has already been taken" ])
2218
+ end
2219
+ end
2220
+
2221
+ context "when the validation uses the underlying field name" do
2222
+
2223
+ before do
2224
+ Definition.validates_uniqueness_of :p, case_sensitive: false
2225
+ end
2226
+
2227
+ it "correctly detects a uniqueness conflict" do
2228
+ expect(definition).to_not be_valid
2229
+ end
2230
+
2231
+ it "adds the uniqueness error to the underlying field name" do
2232
+ definition.valid?
2233
+ expect(definition.errors).to have_key(:p)
2234
+ expect(definition.errors[:p]).to eq([ "has already been taken" ])
2235
+ end
2236
+ end
2237
+
2238
+ context "when the field is localized" do
2239
+
2240
+ context "when the validation uses the aliased name" do
2241
+
2242
+ before do
2243
+ Definition.validates_uniqueness_of :synonyms, case_sensitive: false
2244
+ end
2245
+
2246
+ it "correctly detects a uniqueness conflict" do
2247
+ expect(definition).to_not be_valid
2248
+ end
2249
+
2250
+ it "adds the uniqueness error to the aliased field name" do
2251
+ definition.valid?
2252
+ expect(definition.errors).to have_key(:synonyms)
2253
+ expect(definition.errors[:synonyms]).to eq([ "has already been taken" ])
2254
+ end
2255
+ end
2256
+
2257
+ context "when the validation uses the underlying field name" do
2258
+
2259
+ before do
2260
+ Definition.validates_uniqueness_of :syn, case_sensitive: false
2261
+ end
2262
+
2263
+ it "correctly detects a uniqueness conflict" do
2264
+ expect(definition).to_not be_valid
2265
+ end
2266
+
2267
+ it "adds the uniqueness error to the aliased field name" do
2268
+ definition.valid?
2269
+ expect(definition.errors).to have_key(:syn)
2270
+ expect(definition.errors[:syn]).to eq([ "has already been taken" ])
2271
+ end
2272
+ end
2273
+ end
2274
+ end
2275
+ end
2276
+
2277
+ context "when the document uses composite keys" do
2278
+
2279
+ context "when no scope is provided" do
2280
+
2281
+ before do
2282
+ WordOrigin.validates_uniqueness_of :origin_id
2283
+ end
2284
+
2285
+ after do
2286
+ WordOrigin.reset_callbacks(:validate)
2287
+ end
2288
+
2289
+ context "when the attribute is unique" do
2290
+
2291
+ before do
2292
+ word.word_origins.build(origin_id: 1)
2293
+ end
2294
+
2295
+ let(:word_origin) do
2296
+ word.word_origins.build(origin_id: 2)
2297
+ end
2298
+
2299
+ it "returns true" do
2300
+ expect(word_origin).to be_valid
2301
+ end
2302
+ end
2303
+
2304
+ context "when the attribute is not unique" do
2305
+
2306
+ context "when the document is not the match" do
2307
+
2308
+ before do
2309
+ word.word_origins.build(origin_id: 1)
2310
+ end
2311
+
2312
+ let(:word_origin) do
2313
+ word.word_origins.build(origin_id: 1)
2314
+ end
2315
+
2316
+ it "returns false" do
2317
+ expect(word_origin).to_not be_valid
2318
+ end
2319
+
2320
+ it "adds the uniqueness error" do
2321
+ word_origin.valid?
2322
+ expect(word_origin.errors[:origin_id]).to eq([ "has already been taken" ])
2323
+ end
2324
+ end
2325
+
2326
+ context "when the document is the match in the database" do
2327
+
2328
+ let!(:word_origin) do
2329
+ word.word_origins.build(origin_id: 1)
2330
+ end
2331
+
2332
+ it "returns true" do
2333
+ expect(word_origin).to be_valid
2334
+ end
2335
+ end
2336
+ end
2337
+ end
2338
+
2339
+ context "when allowing nil" do
2340
+
2341
+ before do
2342
+ WordOrigin.validates_uniqueness_of :origin_id, allow_nil: true
2343
+ end
2344
+
2345
+ after do
2346
+ WordOrigin.reset_callbacks(:validate)
2347
+ end
2348
+
2349
+ context "when the attribute is nil" do
2350
+
2351
+ before do
2352
+ word.word_origins.build
2353
+ end
2354
+
2355
+ let(:word_origin) do
2356
+ word.word_origins.build
2357
+ end
2358
+
2359
+ it "returns true" do
2360
+ expect(word_origin).to be_valid
2361
+ end
2362
+ end
2363
+ end
2364
+
2365
+ context "when allowing blank" do
2366
+
2367
+ before do
2368
+ WordOrigin.validates_uniqueness_of :origin_id, allow_blank: true
2369
+ end
2370
+
2371
+ after do
2372
+ WordOrigin.reset_callbacks(:validate)
2373
+ end
2374
+
2375
+ context "when the attribute is blank" do
2376
+
2377
+ before do
2378
+ word.word_origins.build(origin_id: "")
2379
+ end
2380
+
2381
+ let(:word_origin) do
2382
+ word.word_origins.build(origin_id: "")
2383
+ end
2384
+
2385
+ it "returns true" do
2386
+ expect(word_origin).to be_valid
2387
+ end
2388
+ end
2389
+ end
2390
+ end
2391
+ end
2392
+
2393
+ context "when in an embeds_one" do
2394
+
2395
+ before do
2396
+ Pronunciation.validates_uniqueness_of :sound
2397
+ end
2398
+
2399
+ after do
2400
+ Pronunciation.reset_callbacks(:validate)
2401
+ end
2402
+
2403
+ let(:pronunciation) do
2404
+ word.build_pronunciation(sound: "Schwa")
2405
+ end
2406
+
2407
+ it "always returns true" do
2408
+ expect(pronunciation).to be_valid
2409
+ end
2410
+ end
2411
+ end
2412
+
2413
+ context "when describing validation on the instance level" do
2414
+
2415
+ let!(:dictionary) do
2416
+ Dictionary.create!(name: "en")
2417
+ end
2418
+
2419
+ let(:validators) do
2420
+ dictionary.validates_uniqueness_of :name
2421
+ end
2422
+
2423
+ it "adds the validation only to the instance" do
2424
+ expect(validators).to eq([ described_class ])
2425
+ end
2426
+ end
2427
+
2428
+ context "when validation works with inheritance" do
2429
+ class EuropeanActor < Actor
2430
+ validates_uniqueness_of :name
2431
+ end
2432
+
2433
+ class SpanishActor < EuropeanActor
2434
+ end
2435
+
2436
+ before do
2437
+ EuropeanActor.create!(name: "Antonio Banderas")
2438
+ end
2439
+
2440
+ let!(:subclass_document_with_duplicated_name) do
2441
+ SpanishActor.new(name: "Antonio Banderas")
2442
+ end
2443
+
2444
+ it "should be invalid" do
2445
+ subclass_document_with_duplicated_name.tap do |d|
2446
+ expect(d).to be_invalid
2447
+ expect(d.errors[:name]).to eq([ "has already been taken" ])
2448
+ end
2449
+ end
2450
+ end
2451
+
2452
+ context "when persisting with safe options" do
2453
+
2454
+ before do
2455
+ Person.validates_uniqueness_of(:username)
2456
+ Person.index({ ssn: 1 }, { unique: true })
2457
+ Person.create_indexes
2458
+ end
2459
+
2460
+ let!(:person) do
2461
+ Person.create!(ssn: "132-11-1111", username: "aaasdaffff")
2462
+ end
2463
+
2464
+ after do
2465
+ Person.reset_callbacks(:validate)
2466
+ Person.collection.drop
2467
+ end
2468
+
2469
+ it "transfers the options to the cloned client" do
2470
+ expect {
2471
+ Person.create!(ssn: "132-11-1111", username: "asdfsdfA")
2472
+ }.to raise_error(Mongo::Error::OperationFailure)
2473
+ end
2474
+ end
2475
+
2476
+ describe "i18n" do
2477
+
2478
+ context 'when using a different locale' do
2479
+
2480
+ around do |example|
2481
+ I18n.with_locale(:fr) { example.run }
2482
+ end
2483
+
2484
+ before do
2485
+ # Translation key location is as per rails-i18n gem.
2486
+ # See: https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/en.yml
2487
+ I18n.backend.store_translations(:fr, { errors: { messages: { taken: 'est déjà utilisé(e)' } } })
2488
+ end
2489
+
2490
+ after do
2491
+ # i18n 1.0 requires +send+ because +translations+ aren't public.
2492
+ # Newer i18n versions have it as public.
2493
+ I18n.backend.send(:translations).delete(:fr)
2494
+ end
2495
+
2496
+ it "correctly translates the error message" do
2497
+ Circus.create!(slogan: 'The Greatest Show on Mars')
2498
+ dict = Circus.new(slogan: 'The Greatest Show on Mars')
2499
+ dict.valid?
2500
+ expect(dict.errors.messages[:slogan]).to eq(["est déjà utilisé(e)"])
2501
+ end
2502
+ end
2503
+ end
2504
+ end