mongoid 7.0.0 → 7.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1046) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +30 -30
  4. data/LICENSE +1 -0
  5. data/README.md +34 -20
  6. data/Rakefile +75 -5
  7. data/lib/config/locales/en.yml +129 -70
  8. data/lib/mongoid/association/accessors.rb +143 -80
  9. data/lib/mongoid/association/bindable.rb +7 -26
  10. data/lib/mongoid/association/builders.rb +4 -12
  11. data/lib/mongoid/association/constrainable.rb +5 -6
  12. data/lib/mongoid/association/depending.rb +31 -19
  13. data/lib/mongoid/association/eager_loadable.rb +2 -3
  14. data/lib/mongoid/association/embedded/batchable.rb +19 -45
  15. data/lib/mongoid/association/embedded/cyclic.rb +10 -17
  16. data/lib/mongoid/association/embedded/embedded_in/binding.rb +3 -7
  17. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +7 -4
  18. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +14 -24
  19. data/lib/mongoid/association/embedded/embedded_in.rb +6 -26
  20. data/lib/mongoid/association/embedded/embeds_many/binding.rb +4 -8
  21. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +8 -5
  22. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +113 -93
  23. data/lib/mongoid/association/embedded/embeds_many.rb +8 -35
  24. data/lib/mongoid/association/embedded/embeds_one/binding.rb +4 -8
  25. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +9 -6
  26. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +45 -30
  27. data/lib/mongoid/association/embedded/embeds_one.rb +8 -31
  28. data/lib/mongoid/association/embedded.rb +2 -0
  29. data/lib/mongoid/association/macros.rb +44 -41
  30. data/lib/mongoid/association/many.rb +18 -32
  31. data/lib/mongoid/association/marshalable.rb +3 -6
  32. data/lib/mongoid/association/nested/many.rb +18 -27
  33. data/lib/mongoid/association/nested/nested_buildable.rb +5 -11
  34. data/lib/mongoid/association/nested/one.rb +16 -27
  35. data/lib/mongoid/association/nested.rb +3 -3
  36. data/lib/mongoid/association/one.rb +4 -11
  37. data/lib/mongoid/association/options.rb +8 -38
  38. data/lib/mongoid/association/proxy.rb +37 -36
  39. data/lib/mongoid/association/referenced/auto_save.rb +5 -11
  40. data/lib/mongoid/association/referenced/belongs_to/binding.rb +4 -9
  41. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +11 -9
  42. data/lib/mongoid/association/referenced/belongs_to/eager.rb +40 -3
  43. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +16 -27
  44. data/lib/mongoid/association/referenced/belongs_to.rb +14 -36
  45. data/lib/mongoid/association/referenced/counter_cache.rb +4 -15
  46. data/lib/mongoid/association/referenced/eager.rb +40 -36
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +12 -11
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +5 -5
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +2 -1
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +38 -56
  51. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +23 -43
  52. data/lib/mongoid/association/referenced/has_many/binding.rb +3 -6
  53. data/lib/mongoid/association/referenced/has_many/buildable.rb +5 -5
  54. data/lib/mongoid/association/referenced/has_many/eager.rb +2 -1
  55. data/lib/mongoid/association/referenced/has_many/enumerable.rb +444 -456
  56. data/lib/mongoid/association/referenced/has_many/proxy.rb +78 -111
  57. data/lib/mongoid/association/referenced/has_many.rb +18 -42
  58. data/lib/mongoid/association/referenced/has_one/binding.rb +4 -9
  59. data/lib/mongoid/association/referenced/has_one/buildable.rb +20 -6
  60. data/lib/mongoid/association/referenced/has_one/eager.rb +2 -1
  61. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +13 -26
  62. data/lib/mongoid/association/referenced/has_one/proxy.rb +23 -25
  63. data/lib/mongoid/association/referenced/has_one.rb +13 -33
  64. data/lib/mongoid/association/referenced/syncable.rb +7 -22
  65. data/lib/mongoid/association/referenced.rb +2 -0
  66. data/lib/mongoid/association/reflections.rb +7 -6
  67. data/lib/mongoid/association/relatable.rb +118 -78
  68. data/lib/mongoid/association.rb +8 -23
  69. data/lib/mongoid/atomic/modifiers.rb +27 -51
  70. data/lib/mongoid/atomic/paths/embedded/many.rb +4 -7
  71. data/lib/mongoid/atomic/paths/embedded/one.rb +4 -7
  72. data/lib/mongoid/atomic/paths/embedded.rb +3 -4
  73. data/lib/mongoid/atomic/paths/root.rb +4 -7
  74. data/lib/mongoid/atomic/paths.rb +2 -1
  75. data/lib/mongoid/atomic.rb +42 -47
  76. data/lib/mongoid/attributes/dynamic.rb +18 -32
  77. data/lib/mongoid/attributes/nested.rb +21 -13
  78. data/lib/mongoid/attributes/processing.rb +9 -24
  79. data/lib/mongoid/attributes/projector.rb +119 -0
  80. data/lib/mongoid/attributes/readonly.rb +3 -6
  81. data/lib/mongoid/attributes.rb +75 -81
  82. data/lib/mongoid/cacheable.rb +6 -9
  83. data/lib/mongoid/changeable.rb +6 -60
  84. data/lib/mongoid/clients/factory.rb +42 -17
  85. data/lib/mongoid/clients/options.rb +16 -17
  86. data/lib/mongoid/clients/sessions.rb +24 -12
  87. data/lib/mongoid/clients/storage_options.rb +7 -12
  88. data/lib/mongoid/clients/validators/storage.rb +2 -9
  89. data/lib/mongoid/clients/validators.rb +2 -1
  90. data/lib/mongoid/clients.rb +3 -10
  91. data/lib/mongoid/composable.rb +5 -9
  92. data/lib/mongoid/config/environment.rb +36 -14
  93. data/lib/mongoid/config/options.rb +20 -23
  94. data/lib/mongoid/config/validators/client.rb +2 -17
  95. data/lib/mongoid/config/validators/option.rb +2 -3
  96. data/lib/mongoid/config/validators.rb +2 -1
  97. data/lib/mongoid/config.rb +112 -41
  98. data/lib/mongoid/contextual/aggregable/memory.rb +17 -12
  99. data/lib/mongoid/contextual/aggregable/mongo.rb +26 -27
  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 +29 -31
  103. data/lib/mongoid/contextual/command.rb +2 -5
  104. data/lib/mongoid/contextual/geo_near.rb +6 -37
  105. data/lib/mongoid/contextual/map_reduce.rb +9 -37
  106. data/lib/mongoid/contextual/memory.rb +12 -65
  107. data/lib/mongoid/contextual/mongo.rb +163 -85
  108. data/lib/mongoid/contextual/none.rb +44 -28
  109. data/lib/mongoid/contextual/queryable.rb +2 -3
  110. data/lib/mongoid/contextual.rb +7 -9
  111. data/lib/mongoid/copyable.rb +16 -10
  112. data/lib/mongoid/criteria/findable.rb +12 -15
  113. data/lib/mongoid/criteria/includable.rb +8 -15
  114. data/lib/mongoid/criteria/inspectable.rb +2 -3
  115. data/lib/mongoid/criteria/marshalable.rb +2 -5
  116. data/lib/mongoid/criteria/modifiable.rb +15 -21
  117. data/lib/mongoid/criteria/options.rb +4 -5
  118. data/lib/mongoid/criteria/permission.rb +2 -1
  119. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -13
  120. data/lib/mongoid/criteria/queryable/expandable.rb +68 -0
  121. data/lib/mongoid/criteria/queryable/extensions/array.rb +4 -27
  122. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +3 -4
  123. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +3 -4
  124. data/lib/mongoid/criteria/queryable/extensions/date.rb +3 -8
  125. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +5 -11
  126. data/lib/mongoid/criteria/queryable/extensions/hash.rb +3 -26
  127. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +3 -14
  128. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +4 -13
  129. data/lib/mongoid/criteria/queryable/extensions/object.rb +4 -29
  130. data/lib/mongoid/criteria/queryable/extensions/range.rb +41 -17
  131. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +9 -16
  132. data/lib/mongoid/criteria/queryable/extensions/set.rb +3 -4
  133. data/lib/mongoid/criteria/queryable/extensions/string.rb +3 -18
  134. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +3 -10
  135. data/lib/mongoid/criteria/queryable/extensions/time.rb +4 -9
  136. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +13 -6
  137. data/lib/mongoid/criteria/queryable/extensions.rb +1 -4
  138. data/lib/mongoid/criteria/queryable/key.rb +101 -27
  139. data/lib/mongoid/criteria/queryable/macroable.rb +3 -4
  140. data/lib/mongoid/criteria/queryable/mergeable.rb +184 -44
  141. data/lib/mongoid/criteria/queryable/optional.rb +5 -48
  142. data/lib/mongoid/criteria/queryable/options.rb +2 -19
  143. data/lib/mongoid/criteria/queryable/pipeline.rb +5 -15
  144. data/lib/mongoid/criteria/queryable/selectable.rb +436 -158
  145. data/lib/mongoid/criteria/queryable/selector.rb +45 -55
  146. data/lib/mongoid/criteria/queryable/smash.rb +2 -11
  147. data/lib/mongoid/criteria/queryable/storable.rb +237 -0
  148. data/lib/mongoid/criteria/queryable.rb +7 -9
  149. data/lib/mongoid/criteria/scopable.rb +27 -19
  150. data/lib/mongoid/criteria.rb +86 -73
  151. data/lib/mongoid/document.rb +37 -77
  152. data/lib/mongoid/equality.rb +29 -12
  153. data/lib/mongoid/errors/ambiguous_relationship.rb +4 -5
  154. data/lib/mongoid/errors/callback.rb +2 -3
  155. data/lib/mongoid/errors/criteria_argument_required.rb +18 -0
  156. data/lib/mongoid/errors/delete_restriction.rb +10 -13
  157. data/lib/mongoid/errors/document_not_destroyed.rb +4 -7
  158. data/lib/mongoid/errors/document_not_found.rb +2 -9
  159. data/lib/mongoid/errors/eager_load.rb +6 -5
  160. data/lib/mongoid/errors/empty_config_file.rb +25 -0
  161. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +2 -3
  162. data/lib/mongoid/errors/invalid_collection.rb +2 -1
  163. data/lib/mongoid/errors/invalid_config_file.rb +25 -0
  164. data/lib/mongoid/errors/invalid_config_option.rb +2 -3
  165. data/lib/mongoid/errors/invalid_dependent_strategy.rb +2 -3
  166. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +24 -0
  167. data/lib/mongoid/errors/invalid_elem_match_operator.rb +32 -0
  168. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +25 -0
  169. data/lib/mongoid/errors/invalid_expression_operator.rb +27 -0
  170. data/lib/mongoid/errors/invalid_field.rb +2 -5
  171. data/lib/mongoid/errors/invalid_field_operator.rb +32 -0
  172. data/lib/mongoid/errors/invalid_field_option.rb +2 -3
  173. data/lib/mongoid/errors/invalid_find.rb +2 -3
  174. data/lib/mongoid/errors/invalid_includes.rb +2 -3
  175. data/lib/mongoid/errors/invalid_index.rb +2 -3
  176. data/lib/mongoid/errors/invalid_options.rb +4 -5
  177. data/lib/mongoid/errors/invalid_path.rb +2 -3
  178. data/lib/mongoid/errors/invalid_persistence_option.rb +2 -5
  179. data/lib/mongoid/errors/invalid_query.rb +40 -0
  180. data/lib/mongoid/errors/invalid_relation.rb +4 -9
  181. data/lib/mongoid/errors/invalid_relation_option.rb +4 -5
  182. data/lib/mongoid/errors/invalid_scope.rb +2 -3
  183. data/lib/mongoid/errors/invalid_session_use.rb +3 -6
  184. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +6 -5
  185. data/lib/mongoid/errors/invalid_storage_options.rb +2 -3
  186. data/lib/mongoid/errors/invalid_storage_parent.rb +2 -3
  187. data/lib/mongoid/errors/invalid_time.rb +2 -3
  188. data/lib/mongoid/errors/invalid_value.rb +2 -1
  189. data/lib/mongoid/errors/inverse_not_found.rb +3 -4
  190. data/lib/mongoid/errors/mixed_client_configuration.rb +2 -3
  191. data/lib/mongoid/errors/mixed_relations.rb +2 -3
  192. data/lib/mongoid/errors/mongoid_error.rb +3 -10
  193. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +3 -4
  194. data/lib/mongoid/errors/no_client_config.rb +4 -5
  195. data/lib/mongoid/errors/no_client_database.rb +2 -3
  196. data/lib/mongoid/errors/no_client_hosts.rb +2 -3
  197. data/lib/mongoid/errors/no_clients_config.rb +2 -3
  198. data/lib/mongoid/errors/no_default_client.rb +3 -4
  199. data/lib/mongoid/errors/no_environment.rb +2 -3
  200. data/lib/mongoid/errors/no_map_reduce_output.rb +2 -3
  201. data/lib/mongoid/errors/no_metadata.rb +2 -3
  202. data/lib/mongoid/errors/no_parent.rb +2 -3
  203. data/lib/mongoid/errors/readonly_attribute.rb +2 -3
  204. data/lib/mongoid/errors/readonly_document.rb +3 -6
  205. data/lib/mongoid/errors/scope_overwrite.rb +2 -1
  206. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +2 -0
  207. data/lib/mongoid/errors/unknown_attribute.rb +2 -3
  208. data/lib/mongoid/errors/unknown_model.rb +2 -3
  209. data/lib/mongoid/errors/unsaved_document.rb +3 -2
  210. data/lib/mongoid/errors/unsupported_javascript.rb +2 -3
  211. data/lib/mongoid/errors/validations.rb +2 -1
  212. data/lib/mongoid/errors.rb +12 -1
  213. data/lib/mongoid/evolvable.rb +4 -5
  214. data/lib/mongoid/extensions/array.rb +28 -37
  215. data/lib/mongoid/extensions/big_decimal.rb +3 -12
  216. data/lib/mongoid/extensions/boolean.rb +3 -5
  217. data/lib/mongoid/extensions/date.rb +13 -12
  218. data/lib/mongoid/extensions/date_time.rb +4 -12
  219. data/lib/mongoid/extensions/decimal128.rb +2 -5
  220. data/lib/mongoid/extensions/false_class.rb +4 -7
  221. data/lib/mongoid/extensions/float.rb +5 -10
  222. data/lib/mongoid/extensions/hash.rb +51 -36
  223. data/lib/mongoid/extensions/integer.rb +5 -12
  224. data/lib/mongoid/extensions/module.rb +2 -3
  225. data/lib/mongoid/extensions/nil_class.rb +2 -5
  226. data/lib/mongoid/extensions/object.rb +17 -44
  227. data/lib/mongoid/extensions/object_id.rb +2 -7
  228. data/lib/mongoid/extensions/range.rb +2 -11
  229. data/lib/mongoid/extensions/regexp.rb +4 -4
  230. data/lib/mongoid/extensions/set.rb +2 -7
  231. data/lib/mongoid/extensions/string.rb +24 -42
  232. data/lib/mongoid/extensions/symbol.rb +2 -7
  233. data/lib/mongoid/extensions/time.rb +12 -9
  234. data/lib/mongoid/extensions/time_with_zone.rb +25 -7
  235. data/lib/mongoid/extensions/true_class.rb +4 -7
  236. data/lib/mongoid/extensions.rb +18 -3
  237. data/lib/mongoid/factory.rb +52 -13
  238. data/lib/mongoid/fields/foreign_key.rb +3 -22
  239. data/lib/mongoid/fields/localized.rb +2 -11
  240. data/lib/mongoid/fields/standard.rb +6 -36
  241. data/lib/mongoid/fields/validators/macro.rb +36 -18
  242. data/lib/mongoid/fields/validators.rb +2 -1
  243. data/lib/mongoid/fields.rb +115 -64
  244. data/lib/mongoid/findable.rb +59 -23
  245. data/lib/mongoid/indexable/specification.rb +3 -16
  246. data/lib/mongoid/indexable/validators/options.rb +2 -7
  247. data/lib/mongoid/indexable.rb +10 -25
  248. data/lib/mongoid/inspectable.rb +4 -11
  249. data/lib/mongoid/interceptable.rb +13 -30
  250. data/lib/mongoid/loggable.rb +13 -16
  251. data/lib/mongoid/matchable.rb +3 -150
  252. data/lib/mongoid/matcher/all.rb +22 -0
  253. data/lib/mongoid/matcher/and.rb +21 -0
  254. data/lib/mongoid/matcher/bits.rb +41 -0
  255. data/lib/mongoid/matcher/bits_all_clear.rb +20 -0
  256. data/lib/mongoid/matcher/bits_all_set.rb +20 -0
  257. data/lib/mongoid/matcher/bits_any_clear.rb +20 -0
  258. data/lib/mongoid/matcher/bits_any_set.rb +20 -0
  259. data/lib/mongoid/matcher/elem_match.rb +36 -0
  260. data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
  261. data/lib/mongoid/matcher/eq.rb +11 -0
  262. data/lib/mongoid/matcher/eq_impl.rb +67 -0
  263. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +26 -0
  264. data/lib/mongoid/matcher/exists.rb +15 -0
  265. data/lib/mongoid/matcher/expression.rb +35 -0
  266. data/lib/mongoid/matcher/expression_operator.rb +19 -0
  267. data/lib/mongoid/matcher/field_expression.rb +62 -0
  268. data/lib/mongoid/matcher/field_operator.rb +54 -0
  269. data/lib/mongoid/matcher/gt.rb +17 -0
  270. data/lib/mongoid/matcher/gte.rb +17 -0
  271. data/lib/mongoid/matcher/in.rb +25 -0
  272. data/lib/mongoid/matcher/lt.rb +17 -0
  273. data/lib/mongoid/matcher/lte.rb +17 -0
  274. data/lib/mongoid/matcher/mod.rb +17 -0
  275. data/lib/mongoid/matcher/ne.rb +16 -0
  276. data/lib/mongoid/matcher/nin.rb +11 -0
  277. data/lib/mongoid/matcher/nor.rb +25 -0
  278. data/lib/mongoid/matcher/not.rb +29 -0
  279. data/lib/mongoid/matcher/or.rb +21 -0
  280. data/lib/mongoid/matcher/regex.rb +41 -0
  281. data/lib/mongoid/matcher/size.rb +26 -0
  282. data/lib/mongoid/matcher/type.rb +99 -0
  283. data/lib/mongoid/matcher.rb +110 -0
  284. data/lib/mongoid/persistable/creatable.rb +6 -23
  285. data/lib/mongoid/persistable/deletable.rb +7 -23
  286. data/lib/mongoid/persistable/destroyable.rb +11 -10
  287. data/lib/mongoid/persistable/incrementable.rb +6 -7
  288. data/lib/mongoid/persistable/logical.rb +4 -6
  289. data/lib/mongoid/persistable/poppable.rb +3 -6
  290. data/lib/mongoid/persistable/pullable.rb +3 -8
  291. data/lib/mongoid/persistable/pushable.rb +14 -10
  292. data/lib/mongoid/persistable/renamable.rb +10 -8
  293. data/lib/mongoid/persistable/savable.rb +3 -8
  294. data/lib/mongoid/persistable/settable.rb +61 -19
  295. data/lib/mongoid/persistable/unsettable.rb +8 -8
  296. data/lib/mongoid/persistable/updatable.rb +33 -21
  297. data/lib/mongoid/persistable/upsertable.rb +4 -9
  298. data/lib/mongoid/persistable.rb +134 -39
  299. data/lib/mongoid/persistence_context.rb +51 -45
  300. data/lib/mongoid/positional.rb +3 -6
  301. data/lib/mongoid/query_cache.rb +138 -106
  302. data/lib/mongoid/railtie.rb +20 -16
  303. data/lib/mongoid/railties/controller_runtime.rb +88 -0
  304. data/lib/mongoid/railties/database.rake +9 -0
  305. data/lib/mongoid/reloadable.rb +14 -19
  306. data/lib/mongoid/scopable.rb +11 -38
  307. data/lib/mongoid/selectable.rb +8 -17
  308. data/lib/mongoid/serializable.rb +24 -29
  309. data/lib/mongoid/shardable.rb +80 -17
  310. data/lib/mongoid/stateful.rb +3 -10
  311. data/lib/mongoid/stringified_symbol.rb +52 -0
  312. data/lib/mongoid/tasks/database.rake +12 -5
  313. data/lib/mongoid/tasks/database.rb +87 -7
  314. data/lib/mongoid/threaded/lifecycle.rb +2 -21
  315. data/lib/mongoid/threaded.rb +38 -55
  316. data/lib/mongoid/timestamps/created/short.rb +2 -1
  317. data/lib/mongoid/timestamps/created.rb +3 -2
  318. data/lib/mongoid/timestamps/short.rb +2 -1
  319. data/lib/mongoid/timestamps/timeless.rb +6 -9
  320. data/lib/mongoid/timestamps/updated/short.rb +2 -1
  321. data/lib/mongoid/timestamps/updated.rb +3 -4
  322. data/lib/mongoid/timestamps.rb +3 -2
  323. data/lib/mongoid/touchable.rb +132 -0
  324. data/lib/mongoid/traversable.rb +177 -57
  325. data/lib/mongoid/validatable/associated.rb +5 -6
  326. data/lib/mongoid/validatable/format.rb +2 -1
  327. data/lib/mongoid/validatable/length.rb +2 -1
  328. data/lib/mongoid/validatable/localizable.rb +2 -3
  329. data/lib/mongoid/validatable/macros.rb +3 -8
  330. data/lib/mongoid/validatable/presence.rb +8 -13
  331. data/lib/mongoid/validatable/queryable.rb +2 -3
  332. data/lib/mongoid/validatable/uniqueness.rb +21 -34
  333. data/lib/mongoid/validatable.rb +8 -27
  334. data/lib/mongoid/version.rb +3 -2
  335. data/lib/mongoid.rb +33 -15
  336. data/lib/rails/generators/mongoid/config/config_generator.rb +10 -2
  337. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +45 -30
  338. data/lib/rails/generators/mongoid/model/model_generator.rb +3 -2
  339. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
  340. data/lib/rails/generators/mongoid_generator.rb +2 -1
  341. data/lib/rails/mongoid.rb +4 -5
  342. data/spec/README.md +33 -0
  343. data/spec/config/mongoid.yml +13 -3
  344. data/spec/integration/app_spec.rb +343 -0
  345. data/spec/integration/associations/belongs_to_spec.rb +15 -0
  346. data/spec/integration/associations/embedded_dirty_spec.rb +29 -0
  347. data/spec/integration/associations/embedded_spec.rb +268 -0
  348. data/spec/integration/associations/embeds_many_spec.rb +206 -0
  349. data/spec/integration/associations/embeds_one_spec.rb +23 -0
  350. data/spec/integration/associations/foreign_key_spec.rb +98 -0
  351. data/spec/integration/associations/foreign_key_spec_models.rb +64 -0
  352. data/spec/integration/associations/has_many_spec.rb +128 -0
  353. data/spec/integration/associations/has_one_spec.rb +176 -0
  354. data/spec/integration/associations/nested_attributes_assignment_spec.rb +115 -0
  355. data/spec/integration/associations/reverse_population_spec.rb +34 -0
  356. data/spec/integration/associations/reverse_population_spec_models.rb +36 -0
  357. data/spec/integration/associations/scope_option_spec.rb +101 -0
  358. data/spec/integration/atomic/modifiers_spec.rb +116 -0
  359. data/spec/integration/bson_regexp_raw_spec.rb +19 -0
  360. data/spec/integration/callbacks_models.rb +61 -0
  361. data/spec/integration/callbacks_spec.rb +228 -0
  362. data/spec/integration/contextual/empty_spec.rb +141 -0
  363. data/spec/integration/criteria/alias_query_spec.rb +161 -0
  364. data/spec/integration/criteria/date_field_spec.rb +40 -0
  365. data/spec/integration/criteria/default_scope_spec.rb +72 -0
  366. data/spec/integration/criteria/logical_spec.rb +124 -0
  367. data/spec/integration/criteria/range_spec.rb +265 -0
  368. data/spec/integration/criteria/time_with_zone_spec.rb +142 -0
  369. data/spec/integration/discriminator_key_spec.rb +353 -0
  370. data/spec/integration/discriminator_value_spec.rb +206 -0
  371. data/spec/integration/document_spec.rb +51 -0
  372. data/spec/integration/i18n_fallbacks_spec.rb +89 -0
  373. data/spec/integration/matcher_examples_spec.rb +758 -0
  374. data/spec/integration/matcher_operator_data/all.yml +140 -0
  375. data/spec/integration/matcher_operator_data/and.yml +93 -0
  376. data/spec/integration/matcher_operator_data/bits_all_clear.yml +159 -0
  377. data/spec/integration/matcher_operator_data/bits_all_set.yml +159 -0
  378. data/spec/integration/matcher_operator_data/bits_any_clear.yml +159 -0
  379. data/spec/integration/matcher_operator_data/bits_any_set.yml +159 -0
  380. data/spec/integration/matcher_operator_data/comment.yml +22 -0
  381. data/spec/integration/matcher_operator_data/elem_match.yml +409 -0
  382. data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
  383. data/spec/integration/matcher_operator_data/eq.yml +191 -0
  384. data/spec/integration/matcher_operator_data/exists.yml +213 -0
  385. data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
  386. data/spec/integration/matcher_operator_data/gt.yml +132 -0
  387. data/spec/integration/matcher_operator_data/gt_types.yml +63 -0
  388. data/spec/integration/matcher_operator_data/gte.yml +132 -0
  389. data/spec/integration/matcher_operator_data/gte_types.yml +15 -0
  390. data/spec/integration/matcher_operator_data/implicit.yml +331 -0
  391. data/spec/integration/matcher_operator_data/implicit_traversal.yml +112 -0
  392. data/spec/integration/matcher_operator_data/in.yml +210 -0
  393. data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
  394. data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
  395. data/spec/integration/matcher_operator_data/lt.yml +132 -0
  396. data/spec/integration/matcher_operator_data/lt_types.yml +15 -0
  397. data/spec/integration/matcher_operator_data/lte.yml +132 -0
  398. data/spec/integration/matcher_operator_data/lte_types.yml +15 -0
  399. data/spec/integration/matcher_operator_data/mod.yml +55 -0
  400. data/spec/integration/matcher_operator_data/multiple.yml +29 -0
  401. data/spec/integration/matcher_operator_data/ne.yml +150 -0
  402. data/spec/integration/matcher_operator_data/ne_types.yml +15 -0
  403. data/spec/integration/matcher_operator_data/nin.yml +114 -0
  404. data/spec/integration/matcher_operator_data/nor.yml +126 -0
  405. data/spec/integration/matcher_operator_data/not.yml +196 -0
  406. data/spec/integration/matcher_operator_data/or.yml +137 -0
  407. data/spec/integration/matcher_operator_data/regex.yml +174 -0
  408. data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
  409. data/spec/integration/matcher_operator_data/size.yml +174 -0
  410. data/spec/integration/matcher_operator_data/type.yml +70 -0
  411. data/spec/integration/matcher_operator_data/type_array.yml +16 -0
  412. data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
  413. data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
  414. data/spec/integration/matcher_operator_data/type_code.yml +26 -0
  415. data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
  416. data/spec/integration/matcher_operator_data/type_date.yml +39 -0
  417. data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
  418. data/spec/integration/matcher_operator_data/type_decimal.yml +40 -0
  419. data/spec/integration/matcher_operator_data/type_double.yml +15 -0
  420. data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
  421. data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
  422. data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
  423. data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
  424. data/spec/integration/matcher_operator_data/type_null.yml +23 -0
  425. data/spec/integration/matcher_operator_data/type_object.yml +23 -0
  426. data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
  427. data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
  428. data/spec/integration/matcher_operator_data/type_string.yml +15 -0
  429. data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
  430. data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
  431. data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
  432. data/spec/integration/matcher_operator_spec.rb +124 -0
  433. data/spec/integration/matcher_spec.rb +283 -0
  434. data/spec/integration/server_query_spec.rb +141 -0
  435. data/spec/integration/shardable_spec.rb +148 -0
  436. data/spec/integration/stringified_symbol_field_spec.rb +203 -0
  437. data/spec/lite_spec_helper.rb +83 -0
  438. data/spec/mongoid/association/accessors_spec.rb +323 -77
  439. data/spec/mongoid/association/auto_save_spec.rb +74 -33
  440. data/spec/mongoid/association/builders_spec.rb +3 -1
  441. data/spec/mongoid/association/constrainable_spec.rb +2 -0
  442. data/spec/mongoid/association/counter_cache_spec.rb +34 -32
  443. data/spec/mongoid/association/depending_spec.rb +678 -332
  444. data/spec/mongoid/association/eager_spec.rb +6 -4
  445. data/spec/mongoid/association/embedded/cyclic_spec.rb +4 -2
  446. data/spec/mongoid/association/embedded/dirty_spec.rb +4 -2
  447. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -0
  448. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +2 -0
  449. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +65 -13
  450. data/spec/mongoid/association/embedded/embedded_in_spec.rb +61 -1
  451. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +2 -0
  452. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +2 -0
  453. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +672 -144
  454. data/spec/mongoid/association/embedded/embeds_many_models.rb +69 -0
  455. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +51 -0
  456. data/spec/mongoid/association/embedded/embeds_many_spec.rb +13 -1
  457. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +2 -0
  458. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +2 -0
  459. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +23 -21
  460. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +8 -0
  461. data/spec/mongoid/association/embedded/embeds_one_models.rb +54 -0
  462. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +28 -0
  463. data/spec/mongoid/association/embedded/embeds_one_spec.rb +49 -1
  464. data/spec/mongoid/association/macros_spec.rb +11 -9
  465. data/spec/mongoid/association/nested/many_spec.rb +2 -0
  466. data/spec/mongoid/association/nested/one_spec.rb +18 -12
  467. data/spec/mongoid/association/options_spec.rb +2 -0
  468. data/spec/mongoid/association/polymorphic_spec.rb +61 -0
  469. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -0
  470. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +57 -16
  471. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +266 -17
  472. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +99 -58
  473. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +57 -0
  474. data/spec/mongoid/association/referenced/belongs_to_spec.rb +95 -12
  475. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +3 -1
  476. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +28 -1
  477. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +67 -4
  478. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +76 -0
  479. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +351 -164
  480. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +67 -0
  481. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +39 -0
  482. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +49 -5
  483. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +3 -1
  484. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +23 -0
  485. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +40 -9
  486. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +407 -121
  487. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +23 -0
  488. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +681 -340
  489. data/spec/mongoid/association/referenced/has_many_models.rb +95 -0
  490. data/spec/mongoid/association/referenced/has_many_query_spec.rb +37 -0
  491. data/spec/mongoid/association/referenced/has_many_spec.rb +26 -3
  492. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +2 -0
  493. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +53 -7
  494. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +34 -4
  495. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +28 -26
  496. data/spec/mongoid/association/referenced/has_one_models.rb +97 -0
  497. data/spec/mongoid/association/referenced/has_one_query_spec.rb +37 -0
  498. data/spec/mongoid/association/referenced/has_one_spec.rb +144 -5
  499. data/spec/mongoid/association/reflections_spec.rb +2 -0
  500. data/spec/mongoid/association/syncable_spec.rb +33 -31
  501. data/spec/mongoid/association_spec.rb +2 -0
  502. data/spec/mongoid/atomic/modifiers_spec.rb +49 -0
  503. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +2 -0
  504. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +2 -0
  505. data/spec/mongoid/atomic/paths/root_spec.rb +2 -0
  506. data/spec/mongoid/atomic/paths_spec.rb +107 -12
  507. data/spec/mongoid/atomic_spec.rb +31 -6
  508. data/spec/mongoid/attributes/dynamic_spec.rb +152 -0
  509. data/spec/mongoid/attributes/nested_spec.rb +87 -69
  510. data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
  511. data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
  512. data/spec/mongoid/attributes/projector_spec.rb +44 -0
  513. data/spec/mongoid/attributes/readonly_spec.rb +24 -22
  514. data/spec/mongoid/attributes_spec.rb +382 -35
  515. data/spec/mongoid/cacheable_spec.rb +3 -1
  516. data/spec/mongoid/changeable_spec.rb +60 -35
  517. data/spec/mongoid/clients/factory_spec.rb +148 -34
  518. data/spec/mongoid/clients/options_spec.rb +102 -66
  519. data/spec/mongoid/clients/sessions_spec.rb +39 -29
  520. data/spec/mongoid/clients/transactions_spec.rb +415 -0
  521. data/spec/mongoid/clients_spec.rb +78 -16
  522. data/spec/mongoid/composable_spec.rb +2 -0
  523. data/spec/mongoid/config/environment_spec.rb +88 -8
  524. data/spec/mongoid/config/options_spec.rb +22 -3
  525. data/spec/mongoid/config_spec.rb +280 -2
  526. data/spec/mongoid/contextual/aggregable/memory_spec.rb +53 -11
  527. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +122 -20
  528. data/spec/mongoid/contextual/aggregable/none_spec.rb +60 -0
  529. data/spec/mongoid/contextual/atomic_spec.rb +242 -81
  530. data/spec/mongoid/contextual/geo_near_spec.rb +31 -19
  531. data/spec/mongoid/contextual/map_reduce_spec.rb +24 -7
  532. data/spec/mongoid/contextual/memory_spec.rb +25 -23
  533. data/spec/mongoid/contextual/mongo_spec.rb +491 -144
  534. data/spec/mongoid/contextual/none_spec.rb +9 -81
  535. data/spec/mongoid/copyable_spec.rb +261 -30
  536. data/spec/mongoid/copyable_spec_models.rb +47 -0
  537. data/spec/mongoid/criteria/findable_spec.rb +77 -20
  538. data/spec/mongoid/criteria/inspectable_spec.rb +2 -0
  539. data/spec/mongoid/criteria/marshalable_spec.rb +2 -0
  540. data/spec/mongoid/criteria/modifiable_spec.rb +100 -48
  541. data/spec/mongoid/criteria/options_spec.rb +2 -0
  542. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +3 -1
  543. data/spec/mongoid/criteria/queryable/expandable_spec.rb +61 -0
  544. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +2 -0
  545. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +5 -3
  546. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +2 -0
  547. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +3 -1
  548. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +2 -0
  549. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +35 -17
  550. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +2 -0
  551. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +2 -0
  552. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +2 -0
  553. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +2 -0
  554. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +2 -0
  555. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +53 -0
  556. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +2 -0
  557. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +239 -178
  558. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +3 -1
  559. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +9 -7
  560. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +2 -0
  561. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +3 -1
  562. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +2 -0
  563. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +42 -23
  564. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +30 -1
  565. data/spec/mongoid/criteria/queryable/key_spec.rb +50 -6
  566. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +145 -12
  567. data/spec/mongoid/criteria/queryable/optional_spec.rb +3 -1
  568. data/spec/mongoid/criteria/queryable/options_spec.rb +2 -0
  569. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +2 -0
  570. data/spec/mongoid/criteria/queryable/queryable_spec.rb +3 -1
  571. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +2069 -0
  572. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +38 -0
  573. data/spec/mongoid/criteria/queryable/selectable_spec.rb +994 -2900
  574. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +589 -0
  575. data/spec/mongoid/criteria/queryable/selector_spec.rb +41 -2
  576. data/spec/mongoid/criteria/queryable/smash_spec.rb +2 -0
  577. data/spec/mongoid/criteria/queryable/storable_spec.rb +226 -0
  578. data/spec/mongoid/criteria/scopable_spec.rb +210 -0
  579. data/spec/mongoid/criteria_projection_spec.rb +410 -0
  580. data/spec/mongoid/criteria_spec.rb +807 -464
  581. data/spec/mongoid/document_fields_spec.rb +113 -0
  582. data/spec/mongoid/document_persistence_context_spec.rb +32 -0
  583. data/spec/mongoid/document_query_spec.rb +89 -0
  584. data/spec/mongoid/document_spec.rb +182 -28
  585. data/spec/mongoid/equality_spec.rb +144 -41
  586. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +5 -3
  587. data/spec/mongoid/errors/callback_spec.rb +2 -0
  588. data/spec/mongoid/errors/delete_restriction_spec.rb +4 -2
  589. data/spec/mongoid/errors/document_not_destroyed_spec.rb +2 -0
  590. data/spec/mongoid/errors/document_not_found_spec.rb +2 -0
  591. data/spec/mongoid/errors/eager_load_spec.rb +2 -0
  592. data/spec/mongoid/errors/invalid_collection_spec.rb +2 -0
  593. data/spec/mongoid/errors/invalid_config_file_spec.rb +31 -0
  594. data/spec/mongoid/errors/invalid_config_option_spec.rb +2 -0
  595. data/spec/mongoid/errors/invalid_field_option_spec.rb +2 -0
  596. data/spec/mongoid/errors/invalid_field_spec.rb +2 -0
  597. data/spec/mongoid/errors/invalid_find_spec.rb +2 -0
  598. data/spec/mongoid/errors/invalid_includes_spec.rb +2 -0
  599. data/spec/mongoid/errors/invalid_index_spec.rb +2 -0
  600. data/spec/mongoid/errors/invalid_options_spec.rb +4 -2
  601. data/spec/mongoid/errors/invalid_path_spec.rb +2 -0
  602. data/spec/mongoid/errors/invalid_relation_spec.rb +4 -2
  603. data/spec/mongoid/errors/invalid_scope_spec.rb +3 -1
  604. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +2 -0
  605. data/spec/mongoid/errors/invalid_storage_options_spec.rb +2 -0
  606. data/spec/mongoid/errors/invalid_time_spec.rb +2 -0
  607. data/spec/mongoid/errors/inverse_not_found_spec.rb +3 -1
  608. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +2 -0
  609. data/spec/mongoid/errors/mixed_relations_spec.rb +2 -0
  610. data/spec/mongoid/errors/mongoid_error_spec.rb +22 -8
  611. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +5 -3
  612. data/spec/mongoid/errors/no_client_config_spec.rb +4 -2
  613. data/spec/mongoid/errors/no_client_database_spec.rb +5 -3
  614. data/spec/mongoid/errors/no_client_hosts_spec.rb +5 -3
  615. data/spec/mongoid/errors/no_clients_config_spec.rb +2 -0
  616. data/spec/mongoid/errors/no_environment_spec.rb +2 -0
  617. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +2 -0
  618. data/spec/mongoid/errors/no_metadata_spec.rb +4 -2
  619. data/spec/mongoid/errors/no_parent_spec.rb +3 -1
  620. data/spec/mongoid/errors/readonly_attribute_spec.rb +2 -0
  621. data/spec/mongoid/errors/readonly_document_spec.rb +2 -0
  622. data/spec/mongoid/errors/scope_overwrite_spec.rb +2 -0
  623. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +2 -0
  624. data/spec/mongoid/errors/unknown_attribute_spec.rb +4 -2
  625. data/spec/mongoid/errors/unsaved_document_spec.rb +3 -1
  626. data/spec/mongoid/errors/unsupported_javascript_spec.rb +2 -0
  627. data/spec/mongoid/errors/validations_spec.rb +2 -0
  628. data/spec/mongoid/extensions/array_spec.rb +25 -43
  629. data/spec/mongoid/extensions/big_decimal_spec.rb +11 -9
  630. data/spec/mongoid/extensions/binary_spec.rb +2 -0
  631. data/spec/mongoid/extensions/boolean_spec.rb +2 -0
  632. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +335 -0
  633. data/spec/mongoid/extensions/date_spec.rb +8 -160
  634. data/spec/mongoid/extensions/date_time_spec.rb +17 -60
  635. data/spec/mongoid/extensions/decimal128_spec.rb +2 -0
  636. data/spec/mongoid/extensions/false_class_spec.rb +3 -1
  637. data/spec/mongoid/extensions/float_spec.rb +17 -3
  638. data/spec/mongoid/extensions/hash_spec.rb +105 -0
  639. data/spec/mongoid/extensions/integer_spec.rb +14 -2
  640. data/spec/mongoid/extensions/module_spec.rb +2 -0
  641. data/spec/mongoid/extensions/nil_class_spec.rb +2 -0
  642. data/spec/mongoid/extensions/object_id_spec.rb +2 -0
  643. data/spec/mongoid/extensions/object_spec.rb +13 -24
  644. data/spec/mongoid/extensions/range_spec.rb +2 -0
  645. data/spec/mongoid/extensions/regexp_spec.rb +25 -0
  646. data/spec/mongoid/extensions/set_spec.rb +2 -0
  647. data/spec/mongoid/extensions/string_spec.rb +95 -34
  648. data/spec/mongoid/extensions/stringified_symbol_spec.rb +84 -0
  649. data/spec/mongoid/extensions/symbol_spec.rb +2 -0
  650. data/spec/mongoid/extensions/time_spec.rb +29 -0
  651. data/spec/mongoid/extensions/time_with_zone_spec.rb +33 -0
  652. data/spec/mongoid/extensions/true_class_spec.rb +3 -1
  653. data/spec/mongoid/extensions_spec.rb +16 -2
  654. data/spec/mongoid/factory_spec.rb +287 -27
  655. data/spec/mongoid/fields/foreign_key_spec.rb +2 -0
  656. data/spec/mongoid/fields/localized_spec.rb +6 -4
  657. data/spec/mongoid/fields/standard_spec.rb +2 -0
  658. data/spec/mongoid/fields_spec.rb +419 -37
  659. data/spec/mongoid/findable_spec.rb +54 -20
  660. data/spec/mongoid/indexable/specification_spec.rb +2 -0
  661. data/spec/mongoid/indexable_spec.rb +36 -6
  662. data/spec/mongoid/inspectable_spec.rb +39 -2
  663. data/spec/mongoid/interceptable_spec.rb +168 -96
  664. data/spec/mongoid/interceptable_spec_models.rb +76 -0
  665. data/spec/mongoid/loggable_spec.rb +2 -0
  666. data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
  667. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +239 -0
  668. data/spec/mongoid/matcher/extract_attribute_spec.rb +40 -0
  669. data/spec/mongoid/persistable/creatable_spec.rb +112 -27
  670. data/spec/mongoid/persistable/deletable_spec.rb +273 -11
  671. data/spec/mongoid/persistable/destroyable_spec.rb +201 -11
  672. data/spec/mongoid/persistable/incrementable_spec.rb +29 -13
  673. data/spec/mongoid/persistable/logical_spec.rb +19 -3
  674. data/spec/mongoid/persistable/poppable_spec.rb +19 -3
  675. data/spec/mongoid/persistable/pullable_spec.rb +36 -6
  676. data/spec/mongoid/persistable/pushable_spec.rb +91 -7
  677. data/spec/mongoid/persistable/renamable_spec.rb +18 -2
  678. data/spec/mongoid/persistable/savable_spec.rb +188 -25
  679. data/spec/mongoid/persistable/settable_spec.rb +182 -17
  680. data/spec/mongoid/persistable/unsettable_spec.rb +19 -3
  681. data/spec/mongoid/persistable/updatable_spec.rb +45 -23
  682. data/spec/mongoid/persistable/upsertable_spec.rb +4 -2
  683. data/spec/mongoid/persistable_spec.rb +85 -9
  684. data/spec/mongoid/persistence_context_spec.rb +3 -1
  685. data/spec/mongoid/positional_spec.rb +2 -0
  686. data/spec/mongoid/query_cache_middleware_spec.rb +68 -0
  687. data/spec/mongoid/query_cache_spec.rb +575 -48
  688. data/spec/mongoid/relations/proxy_spec.rb +9 -7
  689. data/spec/mongoid/reloadable_spec.rb +298 -20
  690. data/spec/mongoid/scopable_spec.rb +82 -22
  691. data/spec/mongoid/selectable_spec.rb +8 -6
  692. data/spec/mongoid/serializable_spec.rb +160 -29
  693. data/spec/mongoid/shardable_models.rb +61 -0
  694. data/spec/mongoid/shardable_spec.rb +116 -17
  695. data/spec/mongoid/stateful_spec.rb +3 -1
  696. data/spec/mongoid/tasks/database_rake_spec.rb +15 -13
  697. data/spec/mongoid/tasks/database_spec.rb +3 -1
  698. data/spec/mongoid/threaded_spec.rb +72 -2
  699. data/spec/mongoid/timestamps/created/short_spec.rb +3 -1
  700. data/spec/mongoid/timestamps/created_spec.rb +3 -1
  701. data/spec/mongoid/timestamps/timeless_spec.rb +4 -2
  702. data/spec/mongoid/timestamps/updated/short_spec.rb +5 -3
  703. data/spec/mongoid/timestamps/updated_spec.rb +5 -3
  704. data/spec/mongoid/timestamps_spec.rb +8 -6
  705. data/spec/mongoid/{association/touchable_spec.rb → touchable_spec.rb} +206 -38
  706. data/spec/mongoid/touchable_spec_models.rb +53 -0
  707. data/spec/mongoid/traversable_spec.rb +1167 -1
  708. data/spec/mongoid/validatable/associated_spec.rb +2 -0
  709. data/spec/mongoid/validatable/format_spec.rb +2 -0
  710. data/spec/mongoid/validatable/length_spec.rb +2 -0
  711. data/spec/mongoid/validatable/numericality_spec.rb +2 -0
  712. data/spec/mongoid/validatable/presence_spec.rb +28 -22
  713. data/spec/mongoid/validatable/uniqueness_spec.rb +102 -73
  714. data/spec/mongoid/validatable_spec.rb +5 -3
  715. data/spec/mongoid_spec.rb +2 -0
  716. data/spec/rails/controller_extension/controller_runtime_spec.rb +112 -0
  717. data/spec/rails/mongoid_spec.rb +4 -2
  718. data/spec/shared/LICENSE +20 -0
  719. data/spec/shared/bin/get-mongodb-download-url +17 -0
  720. data/spec/shared/bin/s3-copy +45 -0
  721. data/spec/shared/bin/s3-upload +69 -0
  722. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  723. data/spec/shared/lib/mrss/cluster_config.rb +231 -0
  724. data/spec/shared/lib/mrss/constraints.rb +386 -0
  725. data/spec/shared/lib/mrss/docker_runner.rb +271 -0
  726. data/spec/shared/lib/mrss/event_subscriber.rb +200 -0
  727. data/spec/shared/lib/mrss/lite_constraints.rb +199 -0
  728. data/spec/shared/lib/mrss/server_version_registry.rb +120 -0
  729. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  730. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  731. data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
  732. data/spec/shared/lib/mrss/utils.rb +15 -0
  733. data/spec/shared/share/Dockerfile.erb +339 -0
  734. data/spec/shared/share/haproxy-1.conf +16 -0
  735. data/spec/shared/share/haproxy-2.conf +17 -0
  736. data/spec/shared/shlib/distro.sh +74 -0
  737. data/spec/shared/shlib/server.sh +379 -0
  738. data/spec/shared/shlib/set_env.sh +132 -0
  739. data/spec/spec_helper.rb +69 -80
  740. data/spec/support/authorization.rb +2 -0
  741. data/spec/support/client_registry.rb +9 -0
  742. data/spec/support/constraints.rb +53 -0
  743. data/spec/support/expectations.rb +21 -3
  744. data/spec/support/helpers.rb +11 -0
  745. data/spec/support/macros.rb +42 -0
  746. data/spec/{app → support}/models/account.rb +3 -1
  747. data/spec/{app → support}/models/acolyte.rb +2 -0
  748. data/spec/{app → support}/models/actor.rb +3 -1
  749. data/spec/support/models/actress.rb +4 -0
  750. data/spec/{app → support}/models/address.rb +6 -0
  751. data/spec/{app → support}/models/address_component.rb +2 -0
  752. data/spec/{app → support}/models/address_number.rb +2 -0
  753. data/spec/{app → support}/models/agency.rb +2 -0
  754. data/spec/{app → support}/models/agent.rb +2 -0
  755. data/spec/{app → support}/models/album.rb +2 -0
  756. data/spec/{app → support}/models/alert.rb +2 -0
  757. data/spec/{app → support}/models/animal.rb +2 -0
  758. data/spec/{app → support}/models/answer.rb +2 -0
  759. data/spec/{app → support}/models/appointment.rb +2 -0
  760. data/spec/support/models/armrest.rb +9 -0
  761. data/spec/support/models/array_field.rb +7 -0
  762. data/spec/{app → support}/models/article.rb +2 -0
  763. data/spec/{app → support}/models/artist.rb +4 -0
  764. data/spec/{app → support}/models/artwork.rb +2 -0
  765. data/spec/support/models/audible_sound.rb +3 -0
  766. data/spec/{app → support}/models/audio.rb +2 -0
  767. data/spec/{app → support}/models/augmentation.rb +2 -0
  768. data/spec/{app → support}/models/author.rb +2 -0
  769. data/spec/{app → support}/models/baby.rb +2 -0
  770. data/spec/{app → support}/models/band.rb +6 -0
  771. data/spec/{app → support}/models/bar.rb +2 -0
  772. data/spec/{app → support}/models/basic.rb +2 -0
  773. data/spec/support/models/bed.rb +3 -0
  774. data/spec/{app → support}/models/big_palette.rb +2 -0
  775. data/spec/{app → support}/models/birthday.rb +2 -0
  776. data/spec/support/models/bolt.rb +7 -0
  777. data/spec/{app → support}/models/bomb.rb +2 -0
  778. data/spec/{app → support}/models/book.rb +2 -0
  779. data/spec/{app → support}/models/breed.rb +2 -0
  780. data/spec/{app → support}/models/browser.rb +3 -1
  781. data/spec/{app → support}/models/building.rb +2 -0
  782. data/spec/{app → support}/models/building_address.rb +2 -0
  783. data/spec/{app → support}/models/bus.rb +2 -0
  784. data/spec/{app → support}/models/business.rb +2 -0
  785. data/spec/{app → support}/models/callback_test.rb +2 -0
  786. data/spec/{app → support}/models/canvas.rb +3 -1
  787. data/spec/support/models/car.rb +3 -0
  788. data/spec/{app → support}/models/cat.rb +2 -0
  789. data/spec/{app → support}/models/category.rb +2 -0
  790. data/spec/{app → support}/models/child.rb +2 -0
  791. data/spec/{app → support}/models/child_doc.rb +5 -3
  792. data/spec/{app → support}/models/church.rb +2 -0
  793. data/spec/{app → support}/models/circle.rb +2 -0
  794. data/spec/{app → support}/models/circuit.rb +2 -0
  795. data/spec/{app → support}/models/circus.rb +2 -0
  796. data/spec/{app → support}/models/code.rb +2 -0
  797. data/spec/support/models/coding/pull_request.rb +11 -0
  798. data/spec/support/models/coding.rb +3 -0
  799. data/spec/{app → support}/models/comment.rb +2 -0
  800. data/spec/{app → support}/models/company.rb +2 -0
  801. data/spec/{app → support}/models/consumption_period.rb +2 -0
  802. data/spec/{app → support}/models/contextable_item.rb +2 -0
  803. data/spec/{app → support}/models/contractor.rb +2 -0
  804. data/spec/{app → support}/models/cookie.rb +2 -0
  805. data/spec/{app → support}/models/country_code.rb +4 -0
  806. data/spec/{app → support}/models/courier_job.rb +2 -0
  807. data/spec/support/models/crate.rb +12 -0
  808. data/spec/support/models/customer.rb +10 -0
  809. data/spec/support/models/customer_address.rb +11 -0
  810. data/spec/support/models/deed.rb +7 -0
  811. data/spec/{app → support}/models/definition.rb +2 -0
  812. data/spec/support/models/delegating_patient.rb +15 -0
  813. data/spec/{app → support}/models/description.rb +2 -0
  814. data/spec/{app → support}/models/dictionary.rb +8 -0
  815. data/spec/{app → support}/models/division.rb +2 -0
  816. data/spec/{app → support}/models/doctor.rb +2 -0
  817. data/spec/{app → support}/models/dog.rb +2 -0
  818. data/spec/{app → support}/models/dokument.rb +2 -0
  819. data/spec/{app → support}/models/draft.rb +2 -0
  820. data/spec/{app → support}/models/dragon.rb +2 -0
  821. data/spec/{app → support}/models/driver.rb +3 -1
  822. data/spec/{app → support}/models/drug.rb +2 -0
  823. data/spec/{app → support}/models/dungeon.rb +2 -0
  824. data/spec/{app → support}/models/edit.rb +2 -0
  825. data/spec/{app → support}/models/email.rb +2 -0
  826. data/spec/{app → support}/models/employer.rb +2 -0
  827. data/spec/{app → support}/models/entry.rb +2 -0
  828. data/spec/support/models/eraser.rb +3 -0
  829. data/spec/{app → support}/models/even.rb +2 -0
  830. data/spec/{app → support}/models/event.rb +2 -0
  831. data/spec/{app → support}/models/exhibition.rb +2 -0
  832. data/spec/{app → support}/models/exhibitor.rb +2 -0
  833. data/spec/{app → support}/models/explosion.rb +2 -0
  834. data/spec/{app → support}/models/eye.rb +2 -0
  835. data/spec/{app → support}/models/eye_bowl.rb +2 -0
  836. data/spec/{app → support}/models/face.rb +2 -0
  837. data/spec/{app → support}/models/favorite.rb +2 -0
  838. data/spec/{app → support}/models/filesystem.rb +2 -0
  839. data/spec/{app → support}/models/fire_hydrant.rb +2 -0
  840. data/spec/{app → support}/models/firefox.rb +2 -0
  841. data/spec/{app → support}/models/fish.rb +2 -0
  842. data/spec/{app → support}/models/folder.rb +2 -0
  843. data/spec/{app → support}/models/folder_item.rb +2 -0
  844. data/spec/{app → support}/models/fruits.rb +2 -0
  845. data/spec/{app → support}/models/game.rb +2 -0
  846. data/spec/{app → support}/models/ghost.rb +2 -0
  847. data/spec/support/models/guitar.rb +4 -0
  848. data/spec/support/models/hole.rb +12 -0
  849. data/spec/{app → support}/models/home.rb +2 -0
  850. data/spec/{app → support}/models/house.rb +2 -0
  851. data/spec/{app → support}/models/html_writer.rb +2 -0
  852. data/spec/{app → support}/models/id_key.rb +2 -0
  853. data/spec/support/models/idnodef.rb +7 -0
  854. data/spec/{app → support}/models/image.rb +2 -0
  855. data/spec/{app → support}/models/implant.rb +2 -0
  856. data/spec/support/models/instrument.rb +8 -0
  857. data/spec/{app → support}/models/item.rb +3 -1
  858. data/spec/{app → support}/models/jar.rb +2 -0
  859. data/spec/{app → support}/models/kaleidoscope.rb +2 -0
  860. data/spec/{app → support}/models/kangaroo.rb +3 -1
  861. data/spec/{app → support}/models/label.rb +4 -1
  862. data/spec/{app → support}/models/language.rb +2 -0
  863. data/spec/{app → support}/models/lat_lng.rb +2 -0
  864. data/spec/{app → support}/models/league.rb +2 -0
  865. data/spec/support/models/learner.rb +4 -0
  866. data/spec/{app → support}/models/line_item.rb +2 -0
  867. data/spec/{app → support}/models/location.rb +2 -0
  868. data/spec/{app → support}/models/login.rb +2 -0
  869. data/spec/{app → support}/models/manufacturer.rb +2 -0
  870. data/spec/{app → support}/models/meat.rb +2 -0
  871. data/spec/{app → support}/models/membership.rb +2 -0
  872. data/spec/{app → support}/models/message.rb +2 -0
  873. data/spec/support/models/minim.rb +6 -0
  874. data/spec/{app → support}/models/mixed_drink.rb +2 -0
  875. data/spec/support/models/mop.rb +24 -0
  876. data/spec/{app → support}/models/movie.rb +2 -0
  877. data/spec/support/models/my_hash.rb +4 -0
  878. data/spec/{app → support}/models/name.rb +2 -0
  879. data/spec/support/models/name_only.rb +8 -0
  880. data/spec/{app → support}/models/node.rb +2 -0
  881. data/spec/{app → support}/models/note.rb +2 -0
  882. data/spec/support/models/nut.rb +7 -0
  883. data/spec/{app → support}/models/odd.rb +2 -0
  884. data/spec/support/models/order.rb +12 -0
  885. data/spec/{app → support}/models/ordered_post.rb +3 -1
  886. data/spec/{app → support}/models/ordered_preference.rb +2 -0
  887. data/spec/{app → support}/models/oscar.rb +2 -0
  888. data/spec/support/models/other_owner_object.rb +4 -0
  889. data/spec/{app → support}/models/override.rb +2 -0
  890. data/spec/{app → support}/models/ownable.rb +2 -0
  891. data/spec/{app → support}/models/owner.rb +4 -0
  892. data/spec/{app → support}/models/pack.rb +2 -0
  893. data/spec/{app → support}/models/page.rb +2 -0
  894. data/spec/{app → support}/models/page_question.rb +2 -0
  895. data/spec/{app → support}/models/palette.rb +3 -1
  896. data/spec/{app → support}/models/parent.rb +2 -0
  897. data/spec/{app → support}/models/parent_doc.rb +2 -0
  898. data/spec/support/models/passport.rb +13 -0
  899. data/spec/{app → support}/models/patient.rb +2 -0
  900. data/spec/{app → support}/models/pdf_writer.rb +2 -0
  901. data/spec/support/models/pencil.rb +3 -0
  902. data/spec/{app → support}/models/person.rb +21 -1
  903. data/spec/{app → support}/models/pet.rb +2 -0
  904. data/spec/{app → support}/models/pet_owner.rb +2 -0
  905. data/spec/{app → support}/models/phone.rb +5 -1
  906. data/spec/support/models/piano.rb +4 -0
  907. data/spec/{app → support}/models/pizza.rb +2 -0
  908. data/spec/{app → support}/models/player.rb +2 -0
  909. data/spec/{app → support}/models/post.rb +2 -0
  910. data/spec/{app → support}/models/post_genre.rb +2 -0
  911. data/spec/{app → support}/models/powerup.rb +2 -0
  912. data/spec/{app → support}/models/preference.rb +2 -0
  913. data/spec/{app → support}/models/princess.rb +2 -0
  914. data/spec/{app → support}/models/product.rb +2 -0
  915. data/spec/support/models/profile.rb +17 -0
  916. data/spec/{app → support}/models/pronunciation.rb +2 -0
  917. data/spec/{app → support}/models/pub.rb +2 -0
  918. data/spec/support/models/publication/encyclopedia.rb +11 -0
  919. data/spec/support/models/publication/review.rb +13 -0
  920. data/spec/support/models/publication.rb +4 -0
  921. data/spec/{app → support}/models/purchase.rb +2 -0
  922. data/spec/support/models/purchased_item.rb +10 -0
  923. data/spec/{app → support}/models/question.rb +2 -0
  924. data/spec/{app → support}/models/quiz.rb +2 -0
  925. data/spec/{app → support}/models/rating.rb +2 -0
  926. data/spec/{app → support}/models/record.rb +2 -0
  927. data/spec/{app → support}/models/registry.rb +2 -0
  928. data/spec/{app → support}/models/role.rb +2 -0
  929. data/spec/{app → support}/models/root_category.rb +2 -0
  930. data/spec/{app → support}/models/sandwich.rb +2 -0
  931. data/spec/{app → support}/models/scheduler.rb +2 -0
  932. data/spec/support/models/scribe.rb +7 -0
  933. data/spec/support/models/sealer.rb +7 -0
  934. data/spec/support/models/seat.rb +24 -0
  935. data/spec/{app → support}/models/seo.rb +2 -0
  936. data/spec/support/models/series.rb +7 -0
  937. data/spec/{app → support}/models/server.rb +2 -0
  938. data/spec/{app → support}/models/service.rb +2 -0
  939. data/spec/{app → support}/models/shape.rb +4 -2
  940. data/spec/{app → support}/models/shelf.rb +2 -0
  941. data/spec/{app → support}/models/shipment_address.rb +2 -0
  942. data/spec/{app → support}/models/shipping_container.rb +2 -0
  943. data/spec/{app → support}/models/shipping_pack.rb +2 -0
  944. data/spec/support/models/shirt.rb +11 -0
  945. data/spec/{app → support}/models/shop.rb +2 -0
  946. data/spec/{app → support}/models/short_agent.rb +2 -0
  947. data/spec/{app → support}/models/short_quiz.rb +2 -0
  948. data/spec/{app → support}/models/simple.rb +2 -0
  949. data/spec/{app → support}/models/slave.rb +2 -0
  950. data/spec/{app → support}/models/song.rb +2 -0
  951. data/spec/{app → support}/models/sound.rb +2 -0
  952. data/spec/support/models/spacer.rb +7 -0
  953. data/spec/{app → support}/models/square.rb +2 -0
  954. data/spec/{app → support}/models/staff.rb +2 -0
  955. data/spec/{app → support}/models/store_as_dup_test1.rb +2 -0
  956. data/spec/{app → support}/models/store_as_dup_test2.rb +2 -0
  957. data/spec/support/models/store_as_dup_test3.rb +7 -0
  958. data/spec/support/models/store_as_dup_test4.rb +7 -0
  959. data/spec/{app → support}/models/strategy.rb +2 -0
  960. data/spec/{app → support}/models/sub_item.rb +2 -0
  961. data/spec/{app → support}/models/subscription.rb +2 -0
  962. data/spec/{app → support}/models/survey.rb +2 -0
  963. data/spec/{app → support}/models/symptom.rb +2 -0
  964. data/spec/support/models/system_role.rb +7 -0
  965. data/spec/{app → support}/models/tag.rb +2 -0
  966. data/spec/{app → support}/models/target.rb +2 -0
  967. data/spec/{app → support}/models/template.rb +2 -0
  968. data/spec/{app → support}/models/thing.rb +2 -0
  969. data/spec/support/models/threadlocker.rb +7 -0
  970. data/spec/{app → support}/models/title.rb +2 -0
  971. data/spec/{app → support}/models/tool.rb +4 -2
  972. data/spec/{app → support}/models/topping.rb +2 -0
  973. data/spec/support/models/toy.rb +9 -0
  974. data/spec/{app → support}/models/track.rb +2 -0
  975. data/spec/{app → support}/models/translation.rb +2 -0
  976. data/spec/{app → support}/models/tree.rb +2 -0
  977. data/spec/support/models/truck.rb +7 -0
  978. data/spec/support/models/updatable.rb +7 -0
  979. data/spec/{app → support}/models/user.rb +2 -0
  980. data/spec/{app → support}/models/user_account.rb +2 -0
  981. data/spec/{app → support}/models/validation_callback.rb +2 -0
  982. data/spec/support/models/vehicle.rb +18 -0
  983. data/spec/{app → support}/models/version.rb +2 -0
  984. data/spec/{app → support}/models/vertex.rb +3 -1
  985. data/spec/{app → support}/models/vet_visit.rb +2 -0
  986. data/spec/{app → support}/models/video.rb +2 -0
  987. data/spec/support/models/video_game.rb +3 -0
  988. data/spec/support/models/washer.rb +7 -0
  989. data/spec/{app → support}/models/weapon.rb +2 -0
  990. data/spec/{app → support}/models/wiki_page.rb +3 -0
  991. data/spec/{app → support}/models/word.rb +2 -0
  992. data/spec/{app → support}/models/word_origin.rb +2 -0
  993. data/spec/{app → support}/models/writer.rb +4 -2
  994. data/spec/support/shared/time.rb +53 -0
  995. data/spec/support/spec_config.rb +60 -0
  996. data.tar.gz.sig +0 -0
  997. metadata +1131 -686
  998. metadata.gz.sig +0 -0
  999. data/lib/mongoid/association/touchable.rb +0 -97
  1000. data/lib/mongoid/criteria/queryable/forwardable.rb +0 -65
  1001. data/lib/mongoid/matchable/all.rb +0 -27
  1002. data/lib/mongoid/matchable/and.rb +0 -30
  1003. data/lib/mongoid/matchable/default.rb +0 -72
  1004. data/lib/mongoid/matchable/elem_match.rb +0 -34
  1005. data/lib/mongoid/matchable/exists.rb +0 -23
  1006. data/lib/mongoid/matchable/gt.rb +0 -23
  1007. data/lib/mongoid/matchable/gte.rb +0 -23
  1008. data/lib/mongoid/matchable/in.rb +0 -24
  1009. data/lib/mongoid/matchable/lt.rb +0 -23
  1010. data/lib/mongoid/matchable/lte.rb +0 -23
  1011. data/lib/mongoid/matchable/ne.rb +0 -21
  1012. data/lib/mongoid/matchable/nin.rb +0 -22
  1013. data/lib/mongoid/matchable/or.rb +0 -33
  1014. data/lib/mongoid/matchable/regexp.rb +0 -27
  1015. data/lib/mongoid/matchable/size.rb +0 -21
  1016. data/lib/support/ruby_version.rb +0 -26
  1017. data/spec/app/models/actress.rb +0 -2
  1018. data/spec/app/models/bed.rb +0 -1
  1019. data/spec/app/models/car.rb +0 -1
  1020. data/spec/app/models/eraser.rb +0 -1
  1021. data/spec/app/models/learner.rb +0 -2
  1022. data/spec/app/models/my_hash.rb +0 -2
  1023. data/spec/app/models/passport.rb +0 -5
  1024. data/spec/app/models/pencil.rb +0 -1
  1025. data/spec/app/models/profile.rb +0 -5
  1026. data/spec/app/models/series.rb +0 -4
  1027. data/spec/app/models/truck.rb +0 -3
  1028. data/spec/app/models/vehicle.rb +0 -11
  1029. data/spec/app/models/video_game.rb +0 -1
  1030. data/spec/mongoid/criteria/queryable/forwardable_spec.rb +0 -87
  1031. data/spec/mongoid/matchable/all_spec.rb +0 -31
  1032. data/spec/mongoid/matchable/and_spec.rb +0 -187
  1033. data/spec/mongoid/matchable/default_spec.rb +0 -130
  1034. data/spec/mongoid/matchable/elem_match_spec.rb +0 -106
  1035. data/spec/mongoid/matchable/exists_spec.rb +0 -57
  1036. data/spec/mongoid/matchable/gt_spec.rb +0 -86
  1037. data/spec/mongoid/matchable/gte_spec.rb +0 -84
  1038. data/spec/mongoid/matchable/in_spec.rb +0 -49
  1039. data/spec/mongoid/matchable/lt_spec.rb +0 -85
  1040. data/spec/mongoid/matchable/lte_spec.rb +0 -85
  1041. data/spec/mongoid/matchable/ne_spec.rb +0 -46
  1042. data/spec/mongoid/matchable/nin_spec.rb +0 -48
  1043. data/spec/mongoid/matchable/or_spec.rb +0 -131
  1044. data/spec/mongoid/matchable/regexp_spec.rb +0 -59
  1045. data/spec/mongoid/matchable/size_spec.rb +0 -25
  1046. data/spec/mongoid/matchable_spec.rb +0 -828
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "spec_helper"
2
4
 
3
5
  describe Mongoid::Criteria do
@@ -38,7 +40,7 @@ describe Mongoid::Criteria do
38
40
  context "when the entries are the same" do
39
41
 
40
42
  let!(:band) do
41
- Band.create(name: "Depeche Mode")
43
+ Band.create!(name: "Depeche Mode")
42
44
  end
43
45
 
44
46
  let(:other) do
@@ -53,11 +55,11 @@ describe Mongoid::Criteria do
53
55
  context "when the entries are not the same" do
54
56
 
55
57
  let!(:band) do
56
- Band.create(name: "Depeche Mode")
58
+ Band.create!(name: "Depeche Mode")
57
59
  end
58
60
 
59
61
  let!(:other_band) do
60
- Band.create(name: "Tool")
62
+ Band.create!(name: "Tool")
61
63
  end
62
64
 
63
65
  let(:other) do
@@ -102,21 +104,21 @@ describe Mongoid::Criteria do
102
104
  describe "#asc" do
103
105
 
104
106
  let(:person) do
105
- Person.create
107
+ Person.create!
106
108
  end
107
109
 
108
110
  context "when the documents are embedded" do
109
111
 
110
112
  let!(:hobrecht) do
111
- person.addresses.create(street: "hobrecht", name: "hobrecht")
113
+ person.addresses.create!(street: "hobrecht", name: "hobrecht")
112
114
  end
113
115
 
114
116
  let!(:friedel) do
115
- person.addresses.create(street: "friedel", name: "friedel")
117
+ person.addresses.create!(street: "friedel", name: "friedel")
116
118
  end
117
119
 
118
120
  let!(:pfluger) do
119
- person.addresses.create(street: "pfluger", name: "pfluger")
121
+ person.addresses.create!(street: "pfluger", name: "pfluger")
120
122
  end
121
123
 
122
124
  let(:criteria) do
@@ -132,7 +134,7 @@ describe Mongoid::Criteria do
132
134
  describe "#batch_size" do
133
135
 
134
136
  let(:person) do
135
- Person.create
137
+ Person.create!
136
138
  end
137
139
 
138
140
  let(:criteria) do
@@ -151,7 +153,7 @@ describe Mongoid::Criteria do
151
153
  describe "#read" do
152
154
 
153
155
  let(:person) do
154
- Person.create
156
+ Person.create!
155
157
  end
156
158
 
157
159
  let(:criteria) do
@@ -168,11 +170,11 @@ describe Mongoid::Criteria do
168
170
  context "when provided a single field" do
169
171
 
170
172
  let!(:depeche) do
171
- Band.create(name: "Depeche Mode", likes: 1000)
173
+ Band.create!(name: "Depeche Mode", likes: 1000)
172
174
  end
173
175
 
174
176
  let!(:tool) do
175
- Band.create(name: "Tool", likes: 500)
177
+ Band.create!(name: "Tool", likes: 500)
176
178
  end
177
179
 
178
180
  let(:criteria) do
@@ -210,11 +212,11 @@ describe Mongoid::Criteria do
210
212
  context "when provided a single field" do
211
213
 
212
214
  let!(:depeche) do
213
- Band.create(name: "Depeche Mode", likes: 1000)
215
+ Band.create!(name: "Depeche Mode", likes: 1000)
214
216
  end
215
217
 
216
218
  let!(:tool) do
217
- Band.create(name: "Tool", likes: 500)
219
+ Band.create!(name: "Tool", likes: 500)
218
220
  end
219
221
 
220
222
  let(:criteria) do
@@ -236,11 +238,11 @@ describe Mongoid::Criteria do
236
238
  describe "\##{method}" do
237
239
 
238
240
  let!(:match) do
239
- Band.create(genres: [ "electro", "dub" ])
241
+ Band.create!(genres: [ "electro", "dub" ])
240
242
  end
241
243
 
242
244
  let!(:non_match) do
243
- Band.create(genres: [ "house" ])
245
+ Band.create!(genres: [ "house" ])
244
246
  end
245
247
 
246
248
  let(:criteria) do
@@ -258,11 +260,11 @@ describe Mongoid::Criteria do
258
260
  describe "\##{method}" do
259
261
 
260
262
  let!(:match) do
261
- Band.create(name: "Depeche Mode", genres: [ "electro" ])
263
+ Band.create!(name: "Depeche Mode", genres: [ "electro" ])
262
264
  end
263
265
 
264
266
  let!(:non_match) do
265
- Band.create(genres: [ "house" ])
267
+ Band.create!(genres: [ "house" ])
266
268
  end
267
269
 
268
270
  let(:criteria) do
@@ -278,26 +280,41 @@ describe Mongoid::Criteria do
278
280
  describe "#as_json" do
279
281
 
280
282
  let!(:band) do
281
- Band.create(name: "Depeche Mode")
283
+ Band.create!(name: "Depeche Mode")
282
284
  end
283
285
 
284
286
  let(:criteria) do
285
287
  Band.where(name: "Depeche Mode")
286
288
  end
287
289
 
288
- it "returns the criteria as a json hash" do
289
- expect(criteria.as_json).to eq([ band.serializable_hash ])
290
+ # as_json changed in rails 6 to call as_json on serializable_hash.
291
+ # https://github.com/rails/rails/commit/2e5cb980a448e7f4ab00df6e9ad4c1cc456616aa
292
+
293
+ context 'rails < 6' do
294
+ max_rails_version '5.2'
295
+
296
+ it "returns the criteria as a json hash" do
297
+ expect(criteria.as_json).to eq([ band.serializable_hash ])
298
+ end
299
+ end
300
+
301
+ context 'rails >= 6' do
302
+ min_rails_version '6.0'
303
+
304
+ it "returns the criteria as a json hash" do
305
+ expect(criteria.as_json).to eq([ band.serializable_hash.as_json ])
306
+ end
290
307
  end
291
308
  end
292
309
 
293
310
  describe "#between" do
294
311
 
295
312
  let!(:match) do
296
- Band.create(member_count: 3)
313
+ Band.create!(member_count: 3)
297
314
  end
298
315
 
299
316
  let!(:non_match) do
300
- Band.create(member_count: 10)
317
+ Band.create!(member_count: 10)
301
318
  end
302
319
 
303
320
  let(:criteria) do
@@ -363,7 +380,7 @@ describe Mongoid::Criteria do
363
380
  describe "#cache" do
364
381
 
365
382
  let!(:person) do
366
- Person.create
383
+ Person.create!
367
384
  end
368
385
 
369
386
  context "when no eager loading is involved" do
@@ -515,11 +532,11 @@ describe Mongoid::Criteria do
515
532
  describe "#delete" do
516
533
 
517
534
  let(:depeche) do
518
- Band.create(name: "Depeche Mode")
535
+ Band.create!(name: "Depeche Mode")
519
536
  end
520
537
 
521
538
  let(:tool) do
522
- Band.create(name: "Tool")
539
+ Band.create!(name: "Tool")
523
540
  end
524
541
 
525
542
  context "when no selector is provided" do
@@ -573,7 +590,7 @@ describe Mongoid::Criteria do
573
590
  describe "#each" do
574
591
 
575
592
  let!(:band) do
576
- Band.create(name: "Depeche Mode")
593
+ Band.create!(name: "Depeche Mode")
577
594
  end
578
595
 
579
596
  context "when provided a block" do
@@ -593,14 +610,14 @@ describe Mongoid::Criteria do
593
610
  describe "#elem_match" do
594
611
 
595
612
  let!(:match) do
596
- Band.create(name: "Depeche Mode").tap do |band|
613
+ Band.create!(name: "Depeche Mode").tap do |band|
597
614
  r = band.records
598
- r.create(name: "101")
615
+ r.create!(name: "101")
599
616
  end
600
617
  end
601
618
 
602
619
  let!(:non_match) do
603
- Band.create(genres: [ "house" ])
620
+ Band.create!(genres: [ "house" ])
604
621
  end
605
622
 
606
623
  let(:criteria) do
@@ -646,7 +663,7 @@ describe Mongoid::Criteria do
646
663
  context "when matching documents exist" do
647
664
 
648
665
  let!(:match) do
649
- Band.create(name: "Depeche Mode")
666
+ Band.create!(name: "Depeche Mode")
650
667
  end
651
668
 
652
669
  let(:criteria) do
@@ -661,7 +678,7 @@ describe Mongoid::Criteria do
661
678
  context "when no matching documents exist" do
662
679
 
663
680
  let!(:nonmatch) do
664
- Band.create(name: "New Order")
681
+ Band.create!(name: "New Order")
665
682
  end
666
683
 
667
684
  let(:criteria) do
@@ -677,11 +694,11 @@ describe Mongoid::Criteria do
677
694
  describe "#exists" do
678
695
 
679
696
  let!(:match) do
680
- Band.create(name: "Depeche Mode")
697
+ Band.create!(name: "Depeche Mode")
681
698
  end
682
699
 
683
700
  let!(:non_match) do
684
- Band.create
701
+ Band.create!
685
702
  end
686
703
 
687
704
  let(:criteria) do
@@ -698,7 +715,7 @@ describe Mongoid::Criteria do
698
715
  context "when matching documents exist" do
699
716
 
700
717
  let!(:match) do
701
- Band.create(name: "Depeche Mode")
718
+ Band.create!(name: "Depeche Mode")
702
719
  end
703
720
 
704
721
  let(:criteria) do
@@ -768,23 +785,83 @@ describe Mongoid::Criteria do
768
785
 
769
786
  describe "#field_list" do
770
787
 
788
+ context "when using the default discriminator key" do
789
+ let(:criteria) do
790
+ Doctor.only(:_id)
791
+ end
792
+
793
+ it "returns the fields with required _id minus type" do
794
+ expect(criteria.field_list).to eq([ "_id" ])
795
+ end
796
+ end
797
+
798
+ context "when using a custom discriminator key" do
799
+ before do
800
+ Person.discriminator_key = "dkey"
801
+ end
802
+
803
+ after do
804
+ Person.discriminator_key = nil
805
+ end
806
+
807
+ let(:criteria) do
808
+ Doctor.only(:_id, :_type)
809
+ end
810
+
811
+ it "returns the fields with type without dkey" do
812
+ expect(criteria.field_list).to eq([ "_id", "_type" ])
813
+ end
814
+ end
815
+ end
816
+
817
+ describe "#find" do
818
+ let!(:depeche) do
819
+ Band.create!(name: "Depeche Mode")
820
+ end
821
+
771
822
  let(:criteria) do
772
- Band.only(:name)
823
+ Band.where(name: "Depeche Mode")
824
+ end
825
+
826
+ context "when given a block" do
827
+ it "behaves as Enumerable" do
828
+ result = criteria.find { |c| c.name == "Depeche Mode" }
829
+ expect(result).to eq(depeche)
830
+ end
831
+ end
832
+
833
+ context "when given a Proc and a block" do
834
+ it "behaves as Enumerable" do
835
+ result = criteria.find(-> {"default"}) { |c| c.name == "Not Depeche Mode" }
836
+ expect(result).to eq("default")
837
+ end
838
+ end
839
+
840
+ context "when given a Proc" do
841
+ it "behaves as Enumerable" do
842
+ lambda do
843
+ criteria.find(-> {"default"})
844
+ # Proc is not serializable to a BSON type
845
+ end.should raise_error(BSON::Error::UnserializableClass)
846
+ end
773
847
  end
774
848
 
775
- it "returns the fields with required _id minus type" do
776
- expect(criteria.field_list).to eq([ "_id", "name" ])
849
+ context "when given an id" do
850
+ it "behaves as Findable" do
851
+ result = criteria.find(depeche.id)
852
+ expect(result).to eq(depeche)
853
+ end
777
854
  end
778
855
  end
779
856
 
780
857
  describe "#find_one_and_update" do
781
858
 
782
859
  let!(:depeche) do
783
- Band.create(name: "Depeche Mode")
860
+ Band.create!(name: "Depeche Mode")
784
861
  end
785
862
 
786
863
  let!(:tool) do
787
- Band.create(name: "Tool")
864
+ Band.create!(name: "Tool")
788
865
  end
789
866
 
790
867
  context "when the selector matches" do
@@ -975,13 +1052,14 @@ describe Mongoid::Criteria do
975
1052
  end
976
1053
 
977
1054
  describe "#geo_near" do
1055
+ max_server_version '4.0'
978
1056
 
979
1057
  before do
980
1058
  Bar.create_indexes
981
1059
  end
982
1060
 
983
1061
  let!(:match) do
984
- Bar.create(location: [ 52.30, 13.25 ])
1062
+ Bar.create!(location: [ 52.30, 13.25 ])
985
1063
  end
986
1064
 
987
1065
  let(:criteria) do
@@ -993,7 +1071,7 @@ describe Mongoid::Criteria do
993
1071
  end
994
1072
  end
995
1073
 
996
- describe "#gt" do
1074
+ describe "#eq" do
997
1075
 
998
1076
  let!(:match) do
999
1077
  Band.create(member_count: 5)
@@ -1003,6 +1081,25 @@ describe Mongoid::Criteria do
1003
1081
  Band.create(member_count: 1)
1004
1082
  end
1005
1083
 
1084
+ let(:criteria) do
1085
+ Band.eq(member_count: 5)
1086
+ end
1087
+
1088
+ it "returns the matching documents" do
1089
+ expect(criteria).to eq([ match ])
1090
+ end
1091
+ end
1092
+
1093
+ describe "#gt" do
1094
+
1095
+ let!(:match) do
1096
+ Band.create!(member_count: 5)
1097
+ end
1098
+
1099
+ let!(:non_match) do
1100
+ Band.create!(member_count: 1)
1101
+ end
1102
+
1006
1103
  let(:criteria) do
1007
1104
  Band.gt(member_count: 4)
1008
1105
  end
@@ -1015,11 +1112,11 @@ describe Mongoid::Criteria do
1015
1112
  describe "#gte" do
1016
1113
 
1017
1114
  let!(:match) do
1018
- Band.create(member_count: 5)
1115
+ Band.create!(member_count: 5)
1019
1116
  end
1020
1117
 
1021
1118
  let!(:non_match) do
1022
- Band.create(member_count: 1)
1119
+ Band.create!(member_count: 1)
1023
1120
  end
1024
1121
 
1025
1122
  let(:criteria) do
@@ -1038,11 +1135,11 @@ describe Mongoid::Criteria do
1038
1135
  context "when querying on a normal field" do
1039
1136
 
1040
1137
  let!(:match) do
1041
- Band.create(genres: [ "electro", "dub" ])
1138
+ Band.create!(genres: [ "electro", "dub" ])
1042
1139
  end
1043
1140
 
1044
1141
  let!(:non_match) do
1045
- Band.create(genres: [ "house" ])
1142
+ Band.create!(genres: [ "house" ])
1046
1143
  end
1047
1144
 
1048
1145
  let(:criteria) do
@@ -1061,7 +1158,7 @@ describe Mongoid::Criteria do
1061
1158
  end
1062
1159
 
1063
1160
  let!(:match_one) do
1064
- Person.create(preference_ids: [ id ])
1161
+ Person.create!(preference_ids: [ id ])
1065
1162
  end
1066
1163
 
1067
1164
  context "when providing valid ids" do
@@ -1102,7 +1199,7 @@ describe Mongoid::Criteria do
1102
1199
  context "when the relation is a one to one" do
1103
1200
 
1104
1201
  let!(:game) do
1105
- Game.create
1202
+ Game.create!
1106
1203
  end
1107
1204
 
1108
1205
  let(:criteria) do
@@ -1140,7 +1237,7 @@ describe Mongoid::Criteria do
1140
1237
  describe "#includes" do
1141
1238
 
1142
1239
  let!(:person) do
1143
- Person.create(age: 1)
1240
+ Person.create!(age: 1)
1144
1241
  end
1145
1242
 
1146
1243
  context "when providing a name that is not a relation" do
@@ -1155,11 +1252,11 @@ describe Mongoid::Criteria do
1155
1252
  context "when providing one association" do
1156
1253
 
1157
1254
  let!(:user) do
1158
- User.create(posts: [ post1 ])
1255
+ User.create!(posts: [ post1 ])
1159
1256
  end
1160
1257
 
1161
1258
  let!(:post1) do
1162
- Post.create
1259
+ Post.create!
1163
1260
  end
1164
1261
 
1165
1262
  let(:result) do
@@ -1178,15 +1275,15 @@ describe Mongoid::Criteria do
1178
1275
  context "when providing a list of associations" do
1179
1276
 
1180
1277
  let!(:user) do
1181
- User.create(posts: [ post1 ], descriptions: [ description1 ])
1278
+ User.create!(posts: [ post1 ], descriptions: [ description1 ])
1182
1279
  end
1183
1280
 
1184
1281
  let!(:post1) do
1185
- Post.create
1282
+ Post.create!
1186
1283
  end
1187
1284
 
1188
1285
  let!(:description1) do
1189
- Description.create(details: 1)
1286
+ Description.create!(details: 1)
1190
1287
  end
1191
1288
 
1192
1289
  let(:result) do
@@ -1206,13 +1303,13 @@ describe Mongoid::Criteria do
1206
1303
  context "when providing a nested association" do
1207
1304
 
1208
1305
  let!(:user) do
1209
- User.create
1306
+ User.create!
1210
1307
  end
1211
1308
 
1212
1309
  before do
1213
- p = Post.create(alerts: [ Alert.create ])
1310
+ p = Post.create!(alerts: [ Alert.create! ])
1214
1311
  user.posts = [ p ]
1215
- user.save
1312
+ user.save!
1216
1313
  end
1217
1314
 
1218
1315
  let(:result) do
@@ -1232,7 +1329,7 @@ describe Mongoid::Criteria do
1232
1329
  context "when providing a deeply nested association" do
1233
1330
 
1234
1331
  let!(:user) do
1235
- User.create
1332
+ User.create!
1236
1333
  end
1237
1334
 
1238
1335
  let(:results) do
@@ -1270,15 +1367,15 @@ describe Mongoid::Criteria do
1270
1367
  context "when the includes is on the subclass" do
1271
1368
 
1272
1369
  let!(:c_one) do
1273
- C.create
1370
+ C.create!
1274
1371
  end
1275
1372
 
1276
1373
  let!(:c_two) do
1277
- C.create
1374
+ C.create!
1278
1375
  end
1279
1376
 
1280
1377
  let!(:b) do
1281
- B.create(c: c_two)
1378
+ B.create!(c: c_two)
1282
1379
  end
1283
1380
 
1284
1381
  let!(:results) do
@@ -1333,19 +1430,19 @@ describe Mongoid::Criteria do
1333
1430
  context "when the includes is on the several relations" do
1334
1431
 
1335
1432
  let!(:d_one) do
1336
- D.create
1433
+ D.create!
1337
1434
  end
1338
1435
 
1339
1436
  let!(:d_two) do
1340
- D.create
1437
+ D.create!
1341
1438
  end
1342
1439
 
1343
1440
  let!(:b) do
1344
- B.create(d: d_two)
1441
+ B.create!(d: d_two)
1345
1442
  end
1346
1443
 
1347
1444
  let!(:c) do
1348
- C.create(d: d_two)
1445
+ C.create!(d: d_two)
1349
1446
  end
1350
1447
 
1351
1448
  let!(:results) do
@@ -1404,19 +1501,19 @@ describe Mongoid::Criteria do
1404
1501
  context "when the includes is on the several relations" do
1405
1502
 
1406
1503
  let!(:d_one) do
1407
- D.create
1504
+ D.create!
1408
1505
  end
1409
1506
 
1410
1507
  let!(:d_two) do
1411
- D.create
1508
+ D.create!
1412
1509
  end
1413
1510
 
1414
1511
  let!(:bs) do
1415
- 2.times.map { B.create(d: d_two) }
1512
+ 2.times.map { B.create!(d: d_two) }
1416
1513
  end
1417
1514
 
1418
1515
  let!(:cs) do
1419
- 2.times.map { C.create(d: d_two) }
1516
+ 2.times.map { C.create!(d: d_two) }
1420
1517
  end
1421
1518
 
1422
1519
  let!(:results) do
@@ -1462,7 +1559,7 @@ describe Mongoid::Criteria do
1462
1559
  context "when mapping the results more than once" do
1463
1560
 
1464
1561
  let!(:post) do
1465
- person.posts.create(title: "one")
1562
+ person.posts.create!(title: "one")
1466
1563
  end
1467
1564
 
1468
1565
  let(:criteria) do
@@ -1484,15 +1581,15 @@ describe Mongoid::Criteria do
1484
1581
  context "when the criteria is from the root" do
1485
1582
 
1486
1583
  let!(:person_two) do
1487
- Person.create(age: 2)
1584
+ Person.create!(age: 2)
1488
1585
  end
1489
1586
 
1490
1587
  let!(:post_one) do
1491
- person.posts.create(title: "one")
1588
+ person.posts.create!(title: "one")
1492
1589
  end
1493
1590
 
1494
1591
  let!(:post_two) do
1495
- person_two.posts.create(title: "two")
1592
+ person_two.posts.create!(title: "two")
1496
1593
  end
1497
1594
 
1498
1595
  context "when calling first" do
@@ -1541,15 +1638,15 @@ describe Mongoid::Criteria do
1541
1638
  context "when the criteria is from an embedded relation" do
1542
1639
 
1543
1640
  let(:peep) do
1544
- Person.create
1641
+ Person.create!
1545
1642
  end
1546
1643
 
1547
1644
  let!(:address_one) do
1548
- peep.addresses.create(street: "rosenthaler")
1645
+ peep.addresses.create!(street: "rosenthaler")
1549
1646
  end
1550
1647
 
1551
1648
  let!(:address_two) do
1552
- peep.addresses.create(street: "weinmeister")
1649
+ peep.addresses.create!(street: "weinmeister")
1553
1650
  end
1554
1651
 
1555
1652
  let!(:depeche) do
@@ -1563,8 +1660,8 @@ describe Mongoid::Criteria do
1563
1660
  before do
1564
1661
  address_one.band = depeche
1565
1662
  address_two.band = tool
1566
- address_one.save
1567
- address_two.save
1663
+ address_one.save!
1664
+ address_two.save!
1568
1665
  end
1569
1666
 
1570
1667
  context "when calling first" do
@@ -1661,11 +1758,11 @@ describe Mongoid::Criteria do
1661
1758
  end
1662
1759
 
1663
1760
  let!(:post_one) do
1664
- person.posts.create(title: "one")
1761
+ person.posts.create!(title: "one")
1665
1762
  end
1666
1763
 
1667
1764
  let!(:post_two) do
1668
- person.posts.create(title: "two")
1765
+ person.posts.create!(title: "two")
1669
1766
  end
1670
1767
 
1671
1768
  context "when the criteria has no options" do
@@ -1783,11 +1880,11 @@ describe Mongoid::Criteria do
1783
1880
  context "when the criteria has limiting options" do
1784
1881
 
1785
1882
  let!(:person_two) do
1786
- Person.create
1883
+ Person.create!
1787
1884
  end
1788
1885
 
1789
1886
  let!(:post_three) do
1790
- person_two.posts.create(title: "three")
1887
+ person_two.posts.create!(title: "three")
1791
1888
  end
1792
1889
 
1793
1890
  let!(:criteria) do
@@ -1819,11 +1916,11 @@ describe Mongoid::Criteria do
1819
1916
  context "when including a has and belongs to many" do
1820
1917
 
1821
1918
  let!(:preference_one) do
1822
- person.preferences.create(name: "one")
1919
+ person.preferences.create!(name: "one")
1823
1920
  end
1824
1921
 
1825
1922
  let!(:preference_two) do
1826
- person.preferences.create(name: "two")
1923
+ person.preferences.create!(name: "two")
1827
1924
  end
1828
1925
 
1829
1926
  context "when one of the related items is deleted" do
@@ -1927,11 +2024,11 @@ describe Mongoid::Criteria do
1927
2024
  context "when including a has many" do
1928
2025
 
1929
2026
  let!(:post_one) do
1930
- person.posts.create(title: "one")
2027
+ person.posts.create!(title: "one")
1931
2028
  end
1932
2029
 
1933
2030
  let!(:post_two) do
1934
- person.posts.create(title: "two")
2031
+ person.posts.create!(title: "two")
1935
2032
  end
1936
2033
 
1937
2034
  context "when the criteria has no options" do
@@ -2016,11 +2113,11 @@ describe Mongoid::Criteria do
2016
2113
  context "when the criteria has limiting options" do
2017
2114
 
2018
2115
  let!(:person_two) do
2019
- Person.create
2116
+ Person.create!
2020
2117
  end
2021
2118
 
2022
2119
  let!(:post_three) do
2023
- person_two.posts.create(title: "three")
2120
+ person_two.posts.create!(title: "three")
2024
2121
  end
2025
2122
 
2026
2123
  let!(:criteria) do
@@ -2081,7 +2178,7 @@ describe Mongoid::Criteria do
2081
2178
  context "when the criteria has limiting options" do
2082
2179
 
2083
2180
  let!(:person_two) do
2084
- Person.create(age: 2)
2181
+ Person.create!(age: 2)
2085
2182
  end
2086
2183
 
2087
2184
  let!(:game_three) do
@@ -2113,7 +2210,7 @@ describe Mongoid::Criteria do
2113
2210
  context "when including a belongs to" do
2114
2211
 
2115
2212
  let(:person_two) do
2116
- Person.create(age: 2)
2213
+ Person.create!(age: 2)
2117
2214
  end
2118
2215
 
2119
2216
  let!(:game_one) do
@@ -2174,11 +2271,11 @@ describe Mongoid::Criteria do
2174
2271
  context "when including multiples in the same criteria" do
2175
2272
 
2176
2273
  let!(:post_one) do
2177
- person.posts.create(title: "one")
2274
+ person.posts.create!(title: "one")
2178
2275
  end
2179
2276
 
2180
2277
  let!(:post_two) do
2181
- person.posts.create(title: "two")
2278
+ person.posts.create!(title: "two")
2182
2279
  end
2183
2280
 
2184
2281
  let!(:game_one) do
@@ -2248,11 +2345,11 @@ describe Mongoid::Criteria do
2248
2345
  describe "#lt" do
2249
2346
 
2250
2347
  let!(:match) do
2251
- Band.create(member_count: 1)
2348
+ Band.create!(member_count: 1)
2252
2349
  end
2253
2350
 
2254
2351
  let!(:non_match) do
2255
- Band.create(member_count: 5)
2352
+ Band.create!(member_count: 5)
2256
2353
  end
2257
2354
 
2258
2355
  let(:criteria) do
@@ -2267,11 +2364,11 @@ describe Mongoid::Criteria do
2267
2364
  describe "#lte" do
2268
2365
 
2269
2366
  let!(:match) do
2270
- Band.create(member_count: 4)
2367
+ Band.create!(member_count: 4)
2271
2368
  end
2272
2369
 
2273
2370
  let!(:non_match) do
2274
- Band.create(member_count: 5)
2371
+ Band.create!(member_count: 5)
2275
2372
  end
2276
2373
 
2277
2374
  let(:criteria) do
@@ -2304,11 +2401,11 @@ describe Mongoid::Criteria do
2304
2401
  end
2305
2402
 
2306
2403
  let!(:depeche_mode) do
2307
- Band.create(name: "Depeche Mode", likes: 200)
2404
+ Band.create!(name: "Depeche Mode", likes: 200)
2308
2405
  end
2309
2406
 
2310
2407
  let!(:tool) do
2311
- Band.create(name: "Tool", likes: 100)
2408
+ Band.create!(name: "Tool", likes: 100)
2312
2409
  end
2313
2410
 
2314
2411
  context "when no timeout options are provided" do
@@ -2318,7 +2415,7 @@ describe Mongoid::Criteria do
2318
2415
  end
2319
2416
 
2320
2417
  it "returns the map/reduce results" do
2321
- expect(map_reduce).to eq([
2418
+ expect(map_reduce.sort_by { |doc| doc['_id'] }).to eq([
2322
2419
  { "_id" => "Depeche Mode", "value" => { "likes" => 200 }},
2323
2420
  { "_id" => "Tool", "value" => { "likes" => 100 }}
2324
2421
  ])
@@ -2331,11 +2428,11 @@ describe Mongoid::Criteria do
2331
2428
  context "when provided a single field" do
2332
2429
 
2333
2430
  let!(:depeche) do
2334
- Band.create(name: "Depeche Mode", likes: 1000)
2431
+ Band.create!(name: "Depeche Mode", likes: 1000)
2335
2432
  end
2336
2433
 
2337
2434
  let!(:tool) do
2338
- Band.create(name: "Tool", likes: 500)
2435
+ Band.create!(name: "Tool", likes: 500)
2339
2436
  end
2340
2437
 
2341
2438
  let(:criteria) do
@@ -2375,11 +2472,11 @@ describe Mongoid::Criteria do
2375
2472
  end
2376
2473
 
2377
2474
  let!(:match) do
2378
- Bar.create(location: [ 52.30, 13.25 ])
2475
+ Bar.create!(location: [ 52.30, 13.25 ])
2379
2476
  end
2380
2477
 
2381
2478
  let!(:non_match) do
2382
- Bar.create(location: [ 19.26, 99.70 ])
2479
+ Bar.create!(location: [ 19.26, 99.70 ])
2383
2480
  end
2384
2481
 
2385
2482
  let(:criteria) do
@@ -2532,11 +2629,11 @@ describe Mongoid::Criteria do
2532
2629
  context "when provided a single field" do
2533
2630
 
2534
2631
  let!(:depeche) do
2535
- Band.create(name: "Depeche Mode", likes: 1000)
2632
+ Band.create!(name: "Depeche Mode", likes: 1000)
2536
2633
  end
2537
2634
 
2538
2635
  let!(:tool) do
2539
- Band.create(name: "Tool", likes: 500)
2636
+ Band.create!(name: "Tool", likes: 500)
2540
2637
  end
2541
2638
 
2542
2639
  let(:criteria) do
@@ -2572,11 +2669,11 @@ describe Mongoid::Criteria do
2572
2669
  describe "#mod" do
2573
2670
 
2574
2671
  let!(:match) do
2575
- Band.create(member_count: 5)
2672
+ Band.create!(member_count: 5)
2576
2673
  end
2577
2674
 
2578
2675
  let!(:non_match) do
2579
- Band.create(member_count: 2)
2676
+ Band.create!(member_count: 2)
2580
2677
  end
2581
2678
 
2582
2679
  let(:criteria) do
@@ -2591,11 +2688,11 @@ describe Mongoid::Criteria do
2591
2688
  describe "#ne" do
2592
2689
 
2593
2690
  let!(:match) do
2594
- Band.create(name: "Depeche Mode")
2691
+ Band.create!(name: "Depeche Mode")
2595
2692
  end
2596
2693
 
2597
2694
  let!(:non_match) do
2598
- Band.create(name: "Tool")
2695
+ Band.create!(name: "Tool")
2599
2696
  end
2600
2697
 
2601
2698
  let(:criteria) do
@@ -2614,7 +2711,7 @@ describe Mongoid::Criteria do
2614
2711
  end
2615
2712
 
2616
2713
  let!(:match) do
2617
- Bar.create(location: [ 52.30, 13.25 ])
2714
+ Bar.create!(location: [ 52.30, 13.25 ])
2618
2715
  end
2619
2716
 
2620
2717
  let(:criteria) do
@@ -2633,7 +2730,7 @@ describe Mongoid::Criteria do
2633
2730
  end
2634
2731
 
2635
2732
  let!(:match) do
2636
- Bar.create(location: [ 52.30, 13.25 ])
2733
+ Bar.create!(location: [ 52.30, 13.25 ])
2637
2734
  end
2638
2735
 
2639
2736
  let(:criteria) do
@@ -2648,11 +2745,11 @@ describe Mongoid::Criteria do
2648
2745
  describe "#nin" do
2649
2746
 
2650
2747
  let!(:match) do
2651
- Band.create(name: "Depeche Mode")
2748
+ Band.create!(name: "Depeche Mode")
2652
2749
  end
2653
2750
 
2654
2751
  let!(:non_match) do
2655
- Band.create(name: "Tool")
2752
+ Band.create!(name: "Tool")
2656
2753
  end
2657
2754
 
2658
2755
  let(:criteria) do
@@ -2667,11 +2764,11 @@ describe Mongoid::Criteria do
2667
2764
  describe "#nor" do
2668
2765
 
2669
2766
  let!(:match) do
2670
- Band.create(name: "Depeche Mode")
2767
+ Band.create!(name: "Depeche Mode")
2671
2768
  end
2672
2769
 
2673
2770
  let!(:non_match) do
2674
- Band.create(name: "Tool")
2771
+ Band.create!(name: "Tool")
2675
2772
  end
2676
2773
 
2677
2774
  let(:criteria) do
@@ -2683,230 +2780,16 @@ describe Mongoid::Criteria do
2683
2780
  end
2684
2781
  end
2685
2782
 
2686
- describe "#only" do
2687
-
2688
- let!(:band) do
2689
- Band.create(name: "Depeche Mode", likes: 3, views: 10)
2690
- end
2691
-
2692
- context "when not using inheritance" do
2693
-
2694
- context "when passing splat args" do
2695
-
2696
- let(:criteria) do
2697
- Band.only(:_id)
2698
- end
2699
-
2700
- it "limits the returned fields" do
2701
- expect {
2702
- criteria.first.name
2703
- }.to raise_error(ActiveModel::MissingAttributeError)
2704
- end
2705
-
2706
- it "does not add _type to the fields" do
2707
- expect(criteria.options[:fields]["_type"]).to be_nil
2708
- end
2709
- end
2710
-
2711
- context "when not including id" do
2712
-
2713
- let(:criteria) do
2714
- Band.only(:name)
2715
- end
2716
-
2717
- it "responds to id anyway" do
2718
- expect {
2719
- criteria.first.id
2720
- }.to_not raise_error
2721
- end
2722
- end
2723
-
2724
- context "when passing an array" do
2725
-
2726
- let(:criteria) do
2727
- Band.only([ :name, :likes ])
2728
- end
2729
-
2730
- it "includes the limited fields" do
2731
- expect(criteria.first.name).to_not be_nil
2732
- end
2733
-
2734
- it "excludes the non included fields" do
2735
- expect {
2736
- criteria.first.active
2737
- }.to raise_error(ActiveModel::MissingAttributeError)
2738
- end
2739
-
2740
- it "does not add _type to the fields" do
2741
- expect(criteria.options[:fields]["_type"]).to be_nil
2742
- end
2743
- end
2744
-
2745
- context "when instantiating a class of another type inside the iteration" do
2746
-
2747
- let(:criteria) do
2748
- Band.only(:name)
2749
- end
2750
-
2751
- it "only limits the fields on the correct model" do
2752
- criteria.each do |band|
2753
- expect(Person.new.age).to eq(100)
2754
- end
2755
- end
2756
- end
2757
-
2758
- context "when instantiating a document not in the result set" do
2759
-
2760
- let(:criteria) do
2761
- Band.only(:name)
2762
- end
2763
-
2764
- it "only limits the fields on the correct criteria" do
2765
- criteria.each do |band|
2766
- expect(Band.new.active).to be true
2767
- end
2768
- end
2769
- end
2770
-
2771
- context "when nesting a criteria within a criteria" do
2772
-
2773
- let(:criteria) do
2774
- Band.only(:name)
2775
- end
2776
-
2777
- it "only limits the fields on the correct criteria" do
2778
- criteria.each do |band|
2779
- Band.all.each do |b|
2780
- expect(b.active).to be true
2781
- end
2782
- end
2783
- end
2784
- end
2785
- end
2786
-
2787
- context "when using inheritance" do
2788
-
2789
- let(:criteria) do
2790
- Doctor.only(:_id)
2791
- end
2792
-
2793
- it "adds _type to the fields" do
2794
- expect(criteria.options[:fields]["_type"]).to eq(1)
2795
- end
2796
- end
2797
-
2798
- context "when limiting to embedded documents" do
2799
-
2800
- context "when the embedded documents are aliased" do
2801
-
2802
- let(:criteria) do
2803
- Person.only(:phones)
2804
- end
2805
-
2806
- it "properly uses the database field name" do
2807
- expect(criteria.options).to eq(fields: { "_id" => 1, "mobile_phones" => 1 })
2808
- end
2809
- end
2810
- end
2811
-
2812
- context 'when the field is localized' do
2813
-
2814
- before do
2815
- I18n.locale = :en
2816
- d = Dictionary.create(description: 'english-text')
2817
- I18n.locale = :de
2818
- d.description = 'deutsch-text'
2819
- d.save
2820
- end
2821
-
2822
- after do
2823
- I18n.locale = :en
2824
- end
2825
-
2826
- context 'when entire field is included' do
2827
-
2828
- let(:dictionary) do
2829
- Dictionary.only(:description).first
2830
-
2831
- end
2832
-
2833
- it 'loads all translations' do
2834
- expect(dictionary.description_translations.keys).to include('de', 'en')
2835
- end
2836
-
2837
- it 'returns the field value for the current locale' do
2838
- I18n.locale = :en
2839
- expect(dictionary.description).to eq('english-text')
2840
- I18n.locale = :de
2841
- expect(dictionary.description).to eq('deutsch-text')
2842
- end
2843
- end
2844
-
2845
- context 'when a specific locale is included' do
2846
-
2847
- let(:dictionary) do
2848
- Dictionary.only(:'description.de').first
2849
- end
2850
-
2851
- it 'loads translations only for the included locale' do
2852
- expect(dictionary.description_translations.keys).to include('de')
2853
- expect(dictionary.description_translations.keys).to_not include('en')
2854
- end
2855
-
2856
- it 'returns the field value for the included locale' do
2857
- I18n.locale = :en
2858
- expect(dictionary.description).to be_nil
2859
- I18n.locale = :de
2860
- expect(dictionary.description).to eq('deutsch-text')
2861
- end
2862
- end
2863
-
2864
- context 'when entire field is excluded' do
2865
-
2866
- let(:dictionary) do
2867
- Dictionary.without(:description).first
2868
- end
2869
-
2870
- it 'does not load all translations' do
2871
- expect(dictionary.description_translations.keys).to_not include('de', 'en')
2872
- end
2873
-
2874
- it 'raises an ActiveModel::MissingAttributeError when attempting to access the field' do
2875
- expect{dictionary.description}.to raise_error ActiveModel::MissingAttributeError
2876
- end
2877
- end
2878
-
2879
- context 'when a specific locale is excluded' do
2880
-
2881
- let(:dictionary) do
2882
- Dictionary.without(:'description.de').first
2883
- end
2884
-
2885
- it 'does not load excluded translations' do
2886
- expect(dictionary.description_translations.keys).to_not include('de')
2887
- expect(dictionary.description_translations.keys).to include('en')
2888
- end
2889
-
2890
- it 'returns nil for excluded translations' do
2891
- I18n.locale = :en
2892
- expect(dictionary.description).to eq('english-text')
2893
- I18n.locale = :de
2894
- expect(dictionary.description).to be_nil
2895
- end
2896
- end
2897
- end
2898
- end
2899
-
2900
2783
  [ :or, :any_of ].each do |method|
2901
2784
 
2902
2785
  describe "\##{method}" do
2903
2786
 
2904
2787
  let!(:match) do
2905
- Band.create(name: "Depeche Mode")
2788
+ Band.create!(name: "Depeche Mode")
2906
2789
  end
2907
2790
 
2908
2791
  let!(:non_match) do
2909
- Band.create(name: "Tool")
2792
+ Band.create!(name: "Tool")
2910
2793
  end
2911
2794
 
2912
2795
  context "when sending a normal $or criterion" do
@@ -2936,25 +2819,29 @@ describe Mongoid::Criteria do
2936
2819
  describe "#pluck" do
2937
2820
 
2938
2821
  let!(:depeche) do
2939
- Band.create(name: "Depeche Mode", likes: 3)
2822
+ Band.create!(name: "Depeche Mode", likes: 3)
2940
2823
  end
2941
2824
 
2942
2825
  let!(:tool) do
2943
- Band.create(name: "Tool", likes: 3)
2826
+ Band.create!(name: "Tool", likes: 3)
2944
2827
  end
2945
2828
 
2946
2829
  let!(:photek) do
2947
- Band.create(name: "Photek", likes: 1)
2830
+ Band.create!(name: "Photek", likes: 1)
2831
+ end
2832
+
2833
+ let(:maniacs) do
2834
+ Band.create!(name: "10,000 Maniacs", likes: 1, sales: "1E2")
2948
2835
  end
2949
2836
 
2950
2837
  context "when the field is aliased" do
2951
2838
 
2952
2839
  let!(:expensive) do
2953
- Product.create(price: 100000)
2840
+ Product.create!(price: 100000)
2954
2841
  end
2955
2842
 
2956
2843
  let!(:cheap) do
2957
- Product.create(price: 1)
2844
+ Product.create!(price: 1)
2958
2845
  end
2959
2846
 
2960
2847
  context "when using alias_attribute" do
@@ -2963,8 +2850,10 @@ describe Mongoid::Criteria do
2963
2850
  Product.pluck(:price)
2964
2851
  end
2965
2852
 
2966
- it "uses the aliases" do
2967
- expect(plucked).to eq([ 100000, 1 ])
2853
+ with_config_values :legacy_pluck_distinct, true, false do
2854
+ it "uses the aliases" do
2855
+ expect(plucked).to eq([ 100000, 1 ])
2856
+ end
2968
2857
  end
2969
2858
  end
2970
2859
  end
@@ -2981,14 +2870,18 @@ describe Mongoid::Criteria do
2981
2870
  criteria.pluck(:name)
2982
2871
  end
2983
2872
 
2984
- it "returns the values" do
2985
- expect(plucked).to contain_exactly("Depeche Mode", "Tool", "Photek")
2873
+ with_config_values :legacy_pluck_distinct, true, false do
2874
+ it "returns the values" do
2875
+ expect(plucked).to contain_exactly("Depeche Mode", "Tool", "Photek")
2876
+ end
2986
2877
  end
2987
2878
 
2988
2879
  context "when subsequently executing the criteria without a pluck" do
2989
2880
 
2990
- it "does not limit the fields" do
2991
- expect(criteria.first.likes).to eq(3)
2881
+ with_config_values :legacy_pluck_distinct, true, false do
2882
+ it "does not limit the fields" do
2883
+ expect(criteria.first.likes).to eq(3)
2884
+ end
2992
2885
  end
2993
2886
  end
2994
2887
 
@@ -2999,51 +2892,83 @@ describe Mongoid::Criteria do
2999
2892
  end
3000
2893
 
3001
2894
  context 'when a top-level field and a subdocument field are plucked' do
3002
-
3003
2895
  before do
3004
- Band.create(name: 'FKA Twigs')
3005
- Band.create(name: 'FKA Twigs', records: [ Record.new(name: 'LP1') ])
2896
+ Band.create!(name: 'FKA Twigs')
2897
+ Band.create!(name: 'FKA Twigs', records: [ Record.new(name: 'LP1') ])
3006
2898
  end
3007
2899
 
3008
2900
  let(:embedded_pluck) do
3009
2901
  criteria.pluck(:name, 'records.name')
3010
2902
  end
3011
2903
 
3012
- let(:expected) do
3013
- [
3014
- ["FKA Twigs", nil],
3015
- ['FKA Twigs', [{ "name" => "LP1" }]]
3016
- ]
2904
+ context "when legacy_pluck_distinct is set" do
2905
+ config_override :legacy_pluck_distinct, true
2906
+ let(:expected) do
2907
+ [
2908
+ ["FKA Twigs", nil],
2909
+ ['FKA Twigs', [{ "name" => "LP1" }]]
2910
+ ]
2911
+ end
2912
+
2913
+ it 'returns the list of top-level field and subdocument values' do
2914
+ expect(embedded_pluck).to eq(expected)
2915
+ end
3017
2916
  end
3018
2917
 
3019
- it 'returns the list of top-level field and subdocument values' do
3020
- expect(embedded_pluck). to eq(expected)
2918
+ context "when legacy_pluck_distinct is not set" do
2919
+ config_override :legacy_pluck_distinct, false
2920
+ let(:expected) do
2921
+ [
2922
+ ["FKA Twigs", nil],
2923
+ ['FKA Twigs', ["LP1"]]
2924
+ ]
2925
+ end
2926
+
2927
+ it 'returns the list of top-level field and subdocument values' do
2928
+ expect(embedded_pluck).to eq(expected)
2929
+ end
3021
2930
  end
3022
2931
  end
3023
2932
 
3024
2933
  context 'when only a subdocument field is plucked' do
3025
2934
 
3026
2935
  before do
3027
- Band.create(name: 'FKA Twigs')
3028
- Band.create(name: 'FKA Twigs', records: [ Record.new(name: 'LP1') ])
2936
+ Band.create!(name: 'FKA Twigs')
2937
+ Band.create!(name: 'FKA Twigs', records: [ Record.new(name: 'LP1') ])
3029
2938
  end
3030
2939
 
3031
2940
  let(:embedded_pluck) do
3032
2941
  criteria.pluck('records.name')
3033
2942
  end
3034
2943
 
3035
- let(:expected) do
3036
- [
3037
- nil,
3038
- [{ "name" => "LP1" }]
3039
- ]
2944
+ context "when legacy_pluck_distinct is set" do
2945
+ config_override :legacy_pluck_distinct, true
2946
+ let(:expected) do
2947
+ [
2948
+ nil,
2949
+ [{ "name" => "LP1" }]
2950
+ ]
2951
+ end
2952
+
2953
+ it 'returns the list of subdocument values' do
2954
+ expect(embedded_pluck).to eq(expected)
2955
+ end
3040
2956
  end
3041
2957
 
3042
- it 'returns the list of subdocument values' do
3043
- expect(embedded_pluck). to eq(expected)
2958
+ context "when legacy_pluck_distinct is not set" do
2959
+ config_override :legacy_pluck_distinct, false
2960
+ let(:expected) do
2961
+ [
2962
+ nil,
2963
+ ["LP1"]
2964
+ ]
2965
+ end
2966
+
2967
+ it 'returns the list of subdocument values' do
2968
+ expect(embedded_pluck).to eq(expected)
2969
+ end
3044
2970
  end
3045
2971
  end
3046
-
3047
2972
  end
3048
2973
  end
3049
2974
 
@@ -3053,8 +2978,10 @@ describe Mongoid::Criteria do
3053
2978
  Band.where(:name.exists => true).pluck(:name, :likes)
3054
2979
  end
3055
2980
 
3056
- it "returns the values" do
3057
- expect(plucked).to contain_exactly(["Depeche Mode", 3], ["Tool", 3], ["Photek", 1])
2981
+ with_config_values :legacy_pluck_distinct, true, false do
2982
+ it "returns the values" do
2983
+ expect(plucked).to contain_exactly(["Depeche Mode", 3], ["Tool", 3], ["Photek", 1])
2984
+ end
3058
2985
  end
3059
2986
  end
3060
2987
 
@@ -3064,8 +2991,10 @@ describe Mongoid::Criteria do
3064
2991
  Band.where(:name.exists => true).pluck(:likes)
3065
2992
  end
3066
2993
 
3067
- it "returns the duplicates" do
3068
- expect(plucked).to contain_exactly(3, 3, 1)
2994
+ with_config_values :legacy_pluck_distinct, true, false do
2995
+ it "returns the duplicates" do
2996
+ expect(plucked).to contain_exactly(3, 3, 1)
2997
+ end
3069
2998
  end
3070
2999
  end
3071
3000
  end
@@ -3076,8 +3005,10 @@ describe Mongoid::Criteria do
3076
3005
  Band.where(name: "New Order").pluck(:_id)
3077
3006
  end
3078
3007
 
3079
- it "returns an empty array" do
3080
- expect(plucked).to be_empty
3008
+ with_config_values :legacy_pluck_distinct, true, false do
3009
+ it "returns an empty array" do
3010
+ expect(plucked).to be_empty
3011
+ end
3081
3012
  end
3082
3013
  end
3083
3014
 
@@ -3087,8 +3018,10 @@ describe Mongoid::Criteria do
3087
3018
  Band.all.pluck(:id)
3088
3019
  end
3089
3020
 
3090
- it "returns the field values" do
3091
- expect(plucked).to eq([ depeche.id, tool.id, photek.id ])
3021
+ with_config_values :legacy_pluck_distinct, true, false do
3022
+ it "returns the field values" do
3023
+ expect(plucked).to eq([ depeche.id, tool.id, photek.id ])
3024
+ end
3092
3025
  end
3093
3026
  end
3094
3027
 
@@ -3098,8 +3031,10 @@ describe Mongoid::Criteria do
3098
3031
  Band.all.pluck(:id, :fooz)
3099
3032
  end
3100
3033
 
3101
- it "returns nil for the field that doesnt exist" do
3102
- expect(plucked).to eq([[depeche.id, nil], [tool.id, nil], [photek.id, nil] ])
3034
+ with_config_values :legacy_pluck_distinct, true, false do
3035
+ it "returns nil for the field that doesnt exist" do
3036
+ expect(plucked).to eq([[depeche.id, nil], [tool.id, nil], [photek.id, nil] ])
3037
+ end
3103
3038
  end
3104
3039
  end
3105
3040
 
@@ -3111,8 +3046,10 @@ describe Mongoid::Criteria do
3111
3046
  Band.all.pluck(:foo)
3112
3047
  end
3113
3048
 
3114
- it "returns a array with nil values" do
3115
- expect(plucked).to eq([nil, nil, nil])
3049
+ with_config_values :legacy_pluck_distinct, true, false do
3050
+ it "returns a array with nil values" do
3051
+ expect(plucked).to eq([nil, nil, nil])
3052
+ end
3116
3053
  end
3117
3054
  end
3118
3055
 
@@ -3122,8 +3059,10 @@ describe Mongoid::Criteria do
3122
3059
  Band.all.pluck(:foo, :bar)
3123
3060
  end
3124
3061
 
3125
- it "returns a nil arrays" do
3126
- expect(plucked).to eq([[nil, nil], [nil, nil], [nil, nil]])
3062
+ with_config_values :legacy_pluck_distinct, true, false do
3063
+ it "returns a nil arrays" do
3064
+ expect(plucked).to eq([[nil, nil], [nil, nil], [nil, nil]])
3065
+ end
3127
3066
  end
3128
3067
  end
3129
3068
  end
@@ -3132,10 +3071,10 @@ describe Mongoid::Criteria do
3132
3071
 
3133
3072
  before do
3134
3073
  I18n.locale = :en
3135
- d = Dictionary.create(description: 'english-text')
3074
+ d = Dictionary.create!(description: 'english-text')
3136
3075
  I18n.locale = :de
3137
3076
  d.description = 'deutsch-text'
3138
- d.save
3077
+ d.save!
3139
3078
  end
3140
3079
 
3141
3080
  after do
@@ -3143,13 +3082,48 @@ describe Mongoid::Criteria do
3143
3082
  end
3144
3083
 
3145
3084
  context 'when plucking the entire field' do
3146
-
3147
3085
  let(:plucked) do
3148
3086
  Dictionary.all.pluck(:description)
3149
3087
  end
3150
3088
 
3151
- it 'returns all translations' do
3152
- expect(plucked.first).to eq({'en' => 'english-text', 'de' => 'deutsch-text'})
3089
+ let(:plucked_translations) do
3090
+ Dictionary.all.pluck(:description_translations)
3091
+ end
3092
+
3093
+ let(:plucked_translations_both) do
3094
+ Dictionary.all.pluck(:description_translations, :description)
3095
+ end
3096
+
3097
+ context "when legacy_pluck_distinct is set" do
3098
+ config_override :legacy_pluck_distinct, true
3099
+
3100
+ it 'returns the non-demongoized translations' do
3101
+ expect(plucked.first).to eq({"de"=>"deutsch-text", "en"=>"english-text"})
3102
+ end
3103
+
3104
+ it 'returns nil' do
3105
+ expect(plucked_translations.first).to eq(nil)
3106
+ end
3107
+
3108
+ it 'returns nil for _translations' do
3109
+ expect(plucked_translations_both.first).to eq([nil, {"de"=>"deutsch-text", "en"=>"english-text"}])
3110
+ end
3111
+ end
3112
+
3113
+ context "when legacy_pluck_distinct is not set" do
3114
+ config_override :legacy_pluck_distinct, false
3115
+
3116
+ it 'returns the demongoized translations' do
3117
+ expect(plucked.first).to eq('deutsch-text')
3118
+ end
3119
+
3120
+ it 'returns the full translations hash to _translations' do
3121
+ expect(plucked_translations.first).to eq({"de"=>"deutsch-text", "en"=>"english-text"})
3122
+ end
3123
+
3124
+ it 'returns both' do
3125
+ expect(plucked_translations_both.first).to eq([{"de"=>"deutsch-text", "en"=>"english-text"}, "deutsch-text"])
3126
+ end
3153
3127
  end
3154
3128
  end
3155
3129
 
@@ -3159,8 +3133,227 @@ describe Mongoid::Criteria do
3159
3133
  Dictionary.all.pluck(:'description.de')
3160
3134
  end
3161
3135
 
3162
- it 'returns the specific translations' do
3163
- expect(plucked.first).to eq({'de' => 'deutsch-text'})
3136
+ context "when legacy_pluck_distinct is set" do
3137
+ config_override :legacy_pluck_distinct, true
3138
+
3139
+ it 'returns the specific translations' do
3140
+ expect(plucked.first).to eq({'de' => 'deutsch-text'})
3141
+ end
3142
+ end
3143
+
3144
+ context "when legacy_pluck_distinct is not set" do
3145
+ config_override :legacy_pluck_distinct, false
3146
+
3147
+ it 'returns the specific translations' do
3148
+ expect(plucked.first).to eq('deutsch-text')
3149
+ end
3150
+ end
3151
+ end
3152
+
3153
+ context 'when plucking a specific locale from _translations field' do
3154
+
3155
+ let(:plucked) do
3156
+ Dictionary.all.pluck(:'description_translations.de')
3157
+ end
3158
+
3159
+ context "when legacy_pluck_distinct is set" do
3160
+ config_override :legacy_pluck_distinct, true
3161
+
3162
+ it 'returns the specific translations' do
3163
+ expect(plucked.first).to eq(nil)
3164
+ end
3165
+ end
3166
+
3167
+ context "when legacy_pluck_distinct is not set" do
3168
+ config_override :legacy_pluck_distinct, false
3169
+
3170
+ it 'returns the specific translations' do
3171
+ expect(plucked.first).to eq('deutsch-text')
3172
+ end
3173
+ end
3174
+ end
3175
+
3176
+ context 'when fallbacks are enabled with a locale list' do
3177
+ require_fallbacks
3178
+
3179
+ around(:all) do |example|
3180
+ prev_fallbacks = I18n.fallbacks.dup
3181
+ I18n.fallbacks[:he] = [ :en ]
3182
+ example.run
3183
+ I18n.fallbacks = prev_fallbacks
3184
+ end
3185
+
3186
+ let(:plucked) do
3187
+ Dictionary.all.pluck(:description).first
3188
+ end
3189
+
3190
+ context "when legacy_pluck_distinct is set" do
3191
+ config_override :legacy_pluck_distinct, true
3192
+
3193
+ it "does not correctly use the fallback" do
3194
+ plucked.should == {"de"=>"deutsch-text", "en"=>"english-text"}
3195
+ end
3196
+ end
3197
+
3198
+ context "when legacy_pluck_distinct is not set" do
3199
+ config_override :legacy_pluck_distinct, false
3200
+
3201
+ it "correctly uses the fallback" do
3202
+ I18n.locale = :en
3203
+ d = Dictionary.create!(description: 'english-text')
3204
+ I18n.locale = :he
3205
+ plucked.should == "english-text"
3206
+ end
3207
+ end
3208
+ end
3209
+
3210
+ context "when the localized field is embedded" do
3211
+ before do
3212
+ p = Passport.new
3213
+ I18n.locale = :en
3214
+ p.name = "Neil"
3215
+ I18n.locale = :he
3216
+ p.name = "Nissim"
3217
+
3218
+ Person.create!(passport: p, employer_id: 12345)
3219
+ end
3220
+
3221
+ let(:plucked) do
3222
+ Person.where(employer_id: 12345).pluck("pass.name").first
3223
+ end
3224
+
3225
+ let(:plucked_translations) do
3226
+ Person.where(employer_id: 12345).pluck("pass.name_translations").first
3227
+ end
3228
+
3229
+ let(:plucked_translations_field) do
3230
+ Person.where(employer_id: 12345).pluck("pass.name_translations.en").first
3231
+ end
3232
+
3233
+ context "when legacy_pluck_distinct is set" do
3234
+ config_override :legacy_pluck_distinct, true
3235
+
3236
+ it "returns the full hash embedded" do
3237
+ expect(plucked).to eq({ "name" => { "en" => "Neil", "he" => "Nissim" } })
3238
+ end
3239
+
3240
+ it "returns the empty hash" do
3241
+ expect(plucked_translations).to eq({})
3242
+ end
3243
+
3244
+ it "returns the empty hash" do
3245
+ expect(plucked_translations_field).to eq({})
3246
+ end
3247
+ end
3248
+
3249
+ context "when legacy_pluck_distinct is not set" do
3250
+ config_override :legacy_pluck_distinct, false
3251
+
3252
+ it "returns the translation for the current locale" do
3253
+ expect(plucked).to eq("Nissim")
3254
+ end
3255
+
3256
+ it "returns the full _translation hash" do
3257
+ expect(plucked_translations).to eq({ "en" => "Neil", "he" => "Nissim" })
3258
+ end
3259
+
3260
+ it "returns the translation for the requested locale" do
3261
+ expect(plucked_translations_field).to eq("Neil")
3262
+ end
3263
+ end
3264
+ end
3265
+ end
3266
+
3267
+ context 'when plucking a field to be demongoized' do
3268
+
3269
+ let(:plucked) do
3270
+ Band.where(name: maniacs.name).pluck(:sales)
3271
+ end
3272
+
3273
+ context "when legacy_pluck_distinct is set" do
3274
+ config_override :legacy_pluck_distinct, true
3275
+
3276
+ it "does not demongoize the field" do
3277
+ expect(plucked.first).to be_a(String)
3278
+ expect(plucked.first).to eq("1E2")
3279
+ end
3280
+ end
3281
+
3282
+ context "when legacy_pluck_distinct is not set" do
3283
+ config_override :legacy_pluck_distinct, false
3284
+
3285
+ it "demongoizes the field" do
3286
+ expect(plucked.first).to be_a(BigDecimal)
3287
+ expect(plucked.first).to eq(BigDecimal("1E2"))
3288
+ end
3289
+ end
3290
+ end
3291
+
3292
+ context "when plucking an embedded field" do
3293
+ let(:label) { Label.new(sales: "1E2") }
3294
+ let!(:band) { Band.create!(label: label) }
3295
+
3296
+ let(:plucked) { Band.where(_id: band.id).pluck("label.sales") }
3297
+
3298
+ context "when legacy_pluck_distinct is set" do
3299
+ config_override :legacy_pluck_distinct, true
3300
+
3301
+ it "returns a hash with a non-demongoized field" do
3302
+ expect(plucked.first).to eq({ 'sales' => "1E2" })
3303
+ end
3304
+ end
3305
+
3306
+ context "when legacy_pluck_distinct is not set" do
3307
+ config_override :legacy_pluck_distinct, false
3308
+
3309
+ it "demongoizes the field" do
3310
+ expect(plucked.first).to eq(BigDecimal("1E2"))
3311
+ end
3312
+ end
3313
+ end
3314
+
3315
+ context "when plucking an embeds_many field" do
3316
+ let(:label) { Label.new(sales: "1E2") }
3317
+ let!(:band) { Band.create!(labels: [label]) }
3318
+
3319
+ let(:plucked) { Band.where(_id: band.id).pluck("labels.sales") }
3320
+
3321
+ context "when legacy_pluck_distinct is set" do
3322
+ config_override :legacy_pluck_distinct, true
3323
+
3324
+ it "returns a hash with a non-demongoized field" do
3325
+ expect(plucked.first).to eq([{ 'sales' => "1E2" }])
3326
+ end
3327
+ end
3328
+
3329
+ context "when legacy_pluck_distinct is not set" do
3330
+ config_override :legacy_pluck_distinct, false
3331
+
3332
+ it "demongoizes the field" do
3333
+ expect(plucked.first).to eq([BigDecimal("1E2")])
3334
+ end
3335
+ end
3336
+ end
3337
+
3338
+ context "when plucking a nonexistent embedded field" do
3339
+ let(:label) { Label.new(sales: "1E2") }
3340
+ let!(:band) { Band.create!(label: label) }
3341
+
3342
+ let(:plucked) { Band.where(_id: band.id).pluck("label.qwerty") }
3343
+
3344
+ context "when legacy_pluck_distinct is set" do
3345
+ config_override :legacy_pluck_distinct, true
3346
+
3347
+ it "returns an empty hash" do
3348
+ expect(plucked.first).to eq({})
3349
+ end
3350
+ end
3351
+
3352
+ context "when legacy_pluck_distinct is not set" do
3353
+ config_override :legacy_pluck_distinct, false
3354
+
3355
+ it "returns nil" do
3356
+ expect(plucked.first).to eq(nil)
3164
3357
  end
3165
3358
  end
3166
3359
  end
@@ -3247,11 +3440,11 @@ describe Mongoid::Criteria do
3247
3440
  describe "#sort" do
3248
3441
 
3249
3442
  let!(:depeche) do
3250
- Band.create(name: "Depeche Mode", likes: 1000)
3443
+ Band.create!(name: "Depeche Mode", likes: 1000)
3251
3444
  end
3252
3445
 
3253
3446
  let!(:tool) do
3254
- Band.create(name: "Tool", likes: 500)
3447
+ Band.create!(name: "Tool", likes: 500)
3255
3448
  end
3256
3449
 
3257
3450
  let(:sorted) do
@@ -3270,11 +3463,11 @@ describe Mongoid::Criteria do
3270
3463
  context "when provided a single field" do
3271
3464
 
3272
3465
  let!(:depeche) do
3273
- Band.create(name: "Depeche Mode", likes: 1000)
3466
+ Band.create!(name: "Depeche Mode", likes: 1000)
3274
3467
  end
3275
3468
 
3276
3469
  let!(:tool) do
3277
- Band.create(name: "Tool", likes: 500)
3470
+ Band.create!(name: "Tool", likes: 500)
3278
3471
  end
3279
3472
 
3280
3473
  let(:criteria) do
@@ -3308,7 +3501,7 @@ describe Mongoid::Criteria do
3308
3501
  describe "#to_ary" do
3309
3502
 
3310
3503
  let!(:band) do
3311
- Band.create(name: "Depeche Mode")
3504
+ Band.create!(name: "Depeche Mode")
3312
3505
  end
3313
3506
 
3314
3507
  let(:criteria) do
@@ -3321,12 +3514,14 @@ describe Mongoid::Criteria do
3321
3514
  end
3322
3515
 
3323
3516
  describe "#max_scan" do
3517
+ max_server_version '4.0'
3518
+
3324
3519
  let!(:band) do
3325
- Band.create(name: "Depeche Mode")
3520
+ Band.create!(name: "Depeche Mode")
3326
3521
  end
3327
3522
 
3328
3523
  let!(:band2) do
3329
- Band.create(name: "Tool")
3524
+ Band.create!(name: "Tool")
3330
3525
  end
3331
3526
 
3332
3527
  let(:criteria) do
@@ -3365,34 +3560,75 @@ describe Mongoid::Criteria do
3365
3560
  end
3366
3561
 
3367
3562
  describe "#type" do
3563
+ context "when using the default discriminator_key" do
3564
+ context "when the type is a string" do
3368
3565
 
3369
- context "when the type is a string" do
3566
+ let!(:browser) do
3567
+ Browser.create!
3568
+ end
3370
3569
 
3371
- let!(:browser) do
3372
- Browser.create
3373
- end
3570
+ let(:criteria) do
3571
+ Canvas.all.type("Browser")
3572
+ end
3374
3573
 
3375
- let(:criteria) do
3376
- Canvas.all.type("Browser")
3574
+ it "returns documents with the provided type" do
3575
+ expect(criteria).to eq([ browser ])
3576
+ end
3377
3577
  end
3378
3578
 
3379
- it "returns documents with the provided type" do
3380
- expect(criteria).to eq([ browser ])
3579
+ context "when the type is an Array of type" do
3580
+
3581
+ let!(:browser) do
3582
+ Firefox.create!
3583
+ end
3584
+
3585
+ let(:criteria) do
3586
+ Canvas.all.type([ "Browser", "Firefox" ])
3587
+ end
3588
+
3589
+ it "returns documents with the provided types" do
3590
+ expect(criteria).to eq([ browser ])
3591
+ end
3381
3592
  end
3382
3593
  end
3383
3594
 
3384
- context "when the type is an Array of type" do
3595
+ context "when using a custom discriminator_key" do
3596
+ before do
3597
+ Canvas.discriminator_key = "dkey"
3598
+ end
3385
3599
 
3386
- let!(:browser) do
3387
- Firefox.create
3600
+ after do
3601
+ Canvas.discriminator_key = nil
3388
3602
  end
3389
3603
 
3390
- let(:criteria) do
3391
- Canvas.all.type([ "Browser", "Firefox" ])
3604
+ context "when the type is a string" do
3605
+
3606
+ let!(:browser) do
3607
+ Browser.create!
3608
+ end
3609
+
3610
+ let(:criteria) do
3611
+ Canvas.all.type("Browser")
3612
+ end
3613
+
3614
+ it "returns documents with the provided type" do
3615
+ expect(criteria).to eq([ browser ])
3616
+ end
3392
3617
  end
3393
3618
 
3394
- it "returns documents with the provided types" do
3395
- expect(criteria).to eq([ browser ])
3619
+ context "when the type is an Array of type" do
3620
+
3621
+ let!(:browser) do
3622
+ Firefox.create!
3623
+ end
3624
+
3625
+ let(:criteria) do
3626
+ Canvas.all.type([ "Browser", "Firefox" ])
3627
+ end
3628
+
3629
+ it "returns documents with the provided types" do
3630
+ expect(criteria).to eq([ browser ])
3631
+ end
3396
3632
  end
3397
3633
  end
3398
3634
  end
@@ -3400,11 +3636,43 @@ describe Mongoid::Criteria do
3400
3636
  describe "#where" do
3401
3637
 
3402
3638
  let!(:match) do
3403
- Band.create(name: "Depeche Mode")
3639
+ Band.create!(name: "Depeche Mode")
3404
3640
  end
3405
3641
 
3406
3642
  let!(:non_match) do
3407
- Band.create(name: "Tool")
3643
+ Band.create!(name: "Tool")
3644
+ end
3645
+
3646
+ context 'when provided no arguments' do
3647
+ context 'on a model class' do
3648
+ it 'returns an empty criteria' do
3649
+ Band.where.selector.should == {}
3650
+ end
3651
+ end
3652
+
3653
+ context 'on an association' do
3654
+ it 'returns an empty criteria' do
3655
+ match.records.where.selector.should == {}
3656
+ end
3657
+ end
3658
+ end
3659
+
3660
+ context 'when provided multiple arguments' do
3661
+ context 'on a model class' do
3662
+ it 'raises ArgumentError' do
3663
+ lambda do
3664
+ Band.where({foo: 1}, {bar: 2})
3665
+ end.should raise_error(ArgumentError, /where requires zero or one arguments/)
3666
+ end
3667
+ end
3668
+
3669
+ context 'on an association' do
3670
+ it 'raises ArgumentError' do
3671
+ lambda do
3672
+ match.records.where({foo: 1}, {bar: 2})
3673
+ end.should raise_error(ArgumentError, /where requires zero or one arguments/)
3674
+ end
3675
+ end
3408
3676
  end
3409
3677
 
3410
3678
  context "when provided a string" do
@@ -3465,11 +3733,11 @@ describe Mongoid::Criteria do
3465
3733
  context "when querying on a big decimal" do
3466
3734
 
3467
3735
  let(:sales) do
3468
- BigDecimal.new('0.1')
3736
+ BigDecimal('0.1')
3469
3737
  end
3470
3738
 
3471
3739
  let!(:band) do
3472
- Band.create(name: "Boards of Canada", sales: sales)
3740
+ Band.create!(name: "Boards of Canada", sales: sales)
3473
3741
  end
3474
3742
 
3475
3743
  let(:from_db) do
@@ -3481,14 +3749,15 @@ describe Mongoid::Criteria do
3481
3749
  end
3482
3750
  end
3483
3751
 
3484
- context "when querying on a BSON::Decimal128", if: decimal128_supported? do
3752
+ context "when querying on a BSON::Decimal128" do
3753
+ min_server_version '3.4'
3485
3754
 
3486
3755
  let(:decimal) do
3487
3756
  BSON::Decimal128.new("0.0005")
3488
3757
  end
3489
3758
 
3490
3759
  let!(:band) do
3491
- Band.create(name: "Boards of Canada", decimal: decimal)
3760
+ Band.create!(name: "Boards of Canada", decimal: decimal)
3492
3761
  end
3493
3762
 
3494
3763
  let(:from_db) do
@@ -3503,7 +3772,7 @@ describe Mongoid::Criteria do
3503
3772
  context 'when querying on a polymorphic relation' do
3504
3773
 
3505
3774
  let(:movie) do
3506
- Movie.create
3775
+ Movie.create!
3507
3776
  end
3508
3777
 
3509
3778
  let(:selector) do
@@ -3515,12 +3784,78 @@ describe Mongoid::Criteria do
3515
3784
  end
3516
3785
  end
3517
3786
  end
3787
+
3788
+ context 'when given multiple keys in separate calls' do
3789
+ let(:criteria) { Band.where(foo: 1).where(bar: 2) }
3790
+
3791
+ it 'combines criteria' do
3792
+ expect(criteria.selector).to eq('foo' => 1, 'bar' => 2)
3793
+ end
3794
+ end
3795
+
3796
+ context 'when given same key in separate calls' do
3797
+ let(:criteria) { Band.where(foo: 1).where(foo: 2) }
3798
+
3799
+ it 'combines criteria' do
3800
+ expect(criteria.selector).to eq('foo' => 1, '$and' => [{'foo' => 2}])
3801
+ end
3802
+ end
3803
+
3804
+ context 'when given same key in separate calls and there are other criteria' do
3805
+ let(:criteria) { Band.where(foo: 1, bar: 3).where(foo: 2) }
3806
+
3807
+ it 'combines criteria' do
3808
+ expect(criteria.selector).to eq(
3809
+ 'foo' => 1, '$and' => [{'foo' => 2}], 'bar' => 3)
3810
+ end
3811
+ end
3812
+
3813
+ context 'when given same key in separate calls and other criteria are added later' do
3814
+ let(:criteria) { Band.where(foo: 1).where(foo: 2).where(bar: 3) }
3815
+
3816
+ it 'combines criteria' do
3817
+ expect(criteria.selector).to eq(
3818
+ 'foo' => 1, '$and' => [{'foo' => 2}], 'bar' => 3)
3819
+ end
3820
+ end
3821
+
3822
+ context "when duplicating where conditions" do
3823
+ let(:criteria) { Sound.where(active: true).where(active: true) }
3824
+
3825
+ it 'does not duplicate criteria' do
3826
+ expect(criteria.selector).to eq('active' => true)
3827
+ end
3828
+ end
3829
+
3830
+ context "when duplicating where conditions with different values" do
3831
+ let(:criteria) { Sound.where(active: true).where(active: false).where(active: true).where(active: false) }
3832
+
3833
+ it 'does not duplicate criteria' do
3834
+ expect(criteria.selector).to eq(
3835
+ 'active' => true, '$and' => [{'active' => false}])
3836
+ end
3837
+ end
3838
+
3839
+ # Used to test MONGOID-5251 where the find command was adding unnecessary
3840
+ # and clauses. Since the find command creates the criteria and executes it,
3841
+ # it is difficult to analyze the criteria used. For this reason, I have
3842
+ # extracted the crux of the issue, adding an _id to the the criteria twice,
3843
+ # and used that for the test case.
3844
+ context "when searching by _id twice" do
3845
+ let(:_id) { BSON::ObjectId.new }
3846
+ let(:criteria) { Band.where(_id: _id) }
3847
+ let(:dup_criteria) { criteria.where(_id: _id)}
3848
+
3849
+ it "does not duplicate the criteria" do
3850
+ expect(dup_criteria.selector).to eq({ "_id" => _id })
3851
+ end
3852
+ end
3518
3853
  end
3519
3854
 
3520
3855
  describe "#for_js" do
3521
3856
 
3522
3857
  let!(:match) do
3523
- Band.create(name: "Depeche Mode")
3858
+ Band.create!(name: "Depeche Mode")
3524
3859
  end
3525
3860
 
3526
3861
  context "when the code has no scope" do
@@ -3535,6 +3870,7 @@ describe Mongoid::Criteria do
3535
3870
  end
3536
3871
 
3537
3872
  context "when the code has scope" do
3873
+ max_server_version '4.2'
3538
3874
 
3539
3875
  let(:criteria) do
3540
3876
  Band.for_js("this.name == param", param: "Depeche Mode")
@@ -3556,10 +3892,14 @@ describe Mongoid::Criteria do
3556
3892
 
3557
3893
  before do
3558
3894
  expect(Person).to receive(:minor).and_call_original
3895
+ expect(Person).to receive(:older_than).and_call_original
3559
3896
  end
3560
3897
 
3561
3898
  it "calls the method on the class" do
3562
3899
  expect(criteria.minor).to be_empty
3900
+ expect do
3901
+ criteria.older_than(age: 25)
3902
+ end.not_to raise_error
3563
3903
  end
3564
3904
  end
3565
3905
 
@@ -3602,11 +3942,11 @@ describe Mongoid::Criteria do
3602
3942
  describe "#uniq" do
3603
3943
 
3604
3944
  let!(:band_one) do
3605
- Band.create(name: "New Order")
3945
+ Band.create!(name: "New Order")
3606
3946
  end
3607
3947
 
3608
3948
  let!(:band_two) do
3609
- Band.create(name: "New Order")
3949
+ Band.create!(name: "New Order")
3610
3950
  end
3611
3951
 
3612
3952
  let(:criteria) do
@@ -3646,7 +3986,7 @@ describe Mongoid::Criteria do
3646
3986
  end
3647
3987
  end
3648
3988
 
3649
- describe "#geo_spacial" do
3989
+ describe "#geo_spatial" do
3650
3990
 
3651
3991
  context "when checking within a polygon" do
3652
3992
 
@@ -3655,11 +3995,11 @@ describe Mongoid::Criteria do
3655
3995
  end
3656
3996
 
3657
3997
  let!(:match) do
3658
- Bar.create(location: [ 52.30, 13.25 ])
3998
+ Bar.create!(location: [ 52.30, 13.25 ])
3659
3999
  end
3660
4000
 
3661
4001
  let(:criteria) do
3662
- Bar.geo_spacial(
4002
+ Bar.geo_spatial(
3663
4003
  :location.within_polygon => [[[ 50, 10 ], [ 50, 20 ], [ 60, 20 ], [ 60, 10 ], [ 50, 10 ]]]
3664
4004
  )
3665
4005
  end
@@ -3673,11 +4013,11 @@ describe Mongoid::Criteria do
3673
4013
  describe "#with_size" do
3674
4014
 
3675
4015
  let!(:match) do
3676
- Band.create(genres: [ "electro", "dub" ])
4016
+ Band.create!(genres: [ "electro", "dub" ])
3677
4017
  end
3678
4018
 
3679
4019
  let!(:non_match) do
3680
- Band.create(genres: [ "house" ])
4020
+ Band.create!(genres: [ "house" ])
3681
4021
  end
3682
4022
 
3683
4023
  let(:criteria) do
@@ -3692,7 +4032,7 @@ describe Mongoid::Criteria do
3692
4032
  describe "#with_type" do
3693
4033
 
3694
4034
  let!(:match) do
3695
- Band.create(name: "Depeche Mode")
4035
+ Band.create!(name: "Depeche Mode")
3696
4036
  end
3697
4037
 
3698
4038
  let(:criteria) do
@@ -3704,73 +4044,76 @@ describe Mongoid::Criteria do
3704
4044
  end
3705
4045
  end
3706
4046
 
3707
- describe "#without" do
4047
+ describe "#type_selection" do
4048
+ context "when using the default discriminator_key" do
4049
+ context "when only one subclass exists" do
3708
4050
 
3709
- let!(:person) do
3710
- Person.create!(username: "davinci", age: 50, pets: false)
3711
- end
4051
+ let(:criteria) do
4052
+ described_class.new(Firefox)
4053
+ end
3712
4054
 
3713
- context "when omitting to embedded documents" do
4055
+ let(:selection) do
4056
+ criteria.send(:type_selection)
4057
+ end
4058
+
4059
+ it "does not use an $in query" do
4060
+ expect(selection).to eq({ _type: "Firefox" })
4061
+ end
4062
+ end
3714
4063
 
3715
- context "when the embedded documents are aliased" do
4064
+ context "when more than one subclass exists" do
3716
4065
 
3717
4066
  let(:criteria) do
3718
- Person.without(:phones)
4067
+ described_class.new(Browser)
3719
4068
  end
3720
4069
 
3721
- it "properly uses the database field name" do
3722
- expect(criteria.options).to eq(fields: { "mobile_phones" => 0 })
4070
+ let(:selection) do
4071
+ criteria.send(:type_selection)
3723
4072
  end
3724
- end
3725
- end
3726
4073
 
3727
- context "when excluding id" do
3728
-
3729
- let(:criteria) do
3730
- Person.without(:_id, :id, "_id", "id")
4074
+ it "does not use an $in query" do
4075
+ expect(selection).to eq({ _type: { "$in" => [ "Firefox", "Browser" ]}})
4076
+ end
3731
4077
  end
4078
+ end
3732
4079
 
3733
- it "does not raise error" do
3734
- expect {
3735
- criteria.first.id
3736
- }.to_not raise_error
4080
+ context "when using a custom discriminator_key" do
4081
+ before do
4082
+ Canvas.discriminator_key = "dkey"
3737
4083
  end
3738
4084
 
3739
- it "returns id anyway" do
3740
- expect(criteria.first.id).to_not be_nil
4085
+ after do
4086
+ Canvas.discriminator_key = nil
3741
4087
  end
3742
- end
3743
- end
3744
4088
 
3745
- describe "#type_selection" do
3746
-
3747
- context "when only one subclass exists" do
4089
+ context "when only one subclass exists" do
3748
4090
 
3749
- let(:criteria) do
3750
- described_class.new(Firefox)
3751
- end
4091
+ let(:criteria) do
4092
+ described_class.new(Firefox)
4093
+ end
3752
4094
 
3753
- let(:selection) do
3754
- criteria.send(:type_selection)
3755
- end
4095
+ let(:selection) do
4096
+ criteria.send(:type_selection)
4097
+ end
3756
4098
 
3757
- it "does not use an $in query" do
3758
- expect(selection).to eq({ _type: "Firefox" })
4099
+ it "does not use an $in query" do
4100
+ expect(selection).to eq({ dkey: "Firefox" })
4101
+ end
3759
4102
  end
3760
- end
3761
4103
 
3762
- context "when more than one subclass exists" do
4104
+ context "when more than one subclass exists" do
3763
4105
 
3764
- let(:criteria) do
3765
- described_class.new(Browser)
3766
- end
4106
+ let(:criteria) do
4107
+ described_class.new(Browser)
4108
+ end
3767
4109
 
3768
- let(:selection) do
3769
- criteria.send(:type_selection)
3770
- end
4110
+ let(:selection) do
4111
+ criteria.send(:type_selection)
4112
+ end
3771
4113
 
3772
- it "does not use an $in query" do
3773
- expect(selection).to eq({ _type: { "$in" => [ "Firefox", "Browser" ]}})
4114
+ it "does not use an $in query" do
4115
+ expect(selection).to eq({ dkey: { "$in" => [ "Firefox", "Browser" ]}})
4116
+ end
3774
4117
  end
3775
4118
  end
3776
4119
  end