mongoid 7.0.10 → 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 (1049) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +30 -30
  4. data/README.md +32 -19
  5. data/Rakefile +51 -7
  6. data/lib/config/locales/en.yml +129 -70
  7. data/lib/mongoid/association/accessors.rb +143 -80
  8. data/lib/mongoid/association/bindable.rb +7 -26
  9. data/lib/mongoid/association/builders.rb +4 -12
  10. data/lib/mongoid/association/constrainable.rb +5 -6
  11. data/lib/mongoid/association/depending.rb +9 -18
  12. data/lib/mongoid/association/eager_loadable.rb +2 -3
  13. data/lib/mongoid/association/embedded/batchable.rb +16 -42
  14. data/lib/mongoid/association/embedded/cyclic.rb +10 -17
  15. data/lib/mongoid/association/embedded/embedded_in/binding.rb +3 -7
  16. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +7 -4
  17. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +14 -24
  18. data/lib/mongoid/association/embedded/embedded_in.rb +6 -26
  19. data/lib/mongoid/association/embedded/embeds_many/binding.rb +4 -8
  20. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +8 -5
  21. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +90 -93
  22. data/lib/mongoid/association/embedded/embeds_many.rb +6 -34
  23. data/lib/mongoid/association/embedded/embeds_one/binding.rb +4 -8
  24. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +9 -6
  25. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +42 -27
  26. data/lib/mongoid/association/embedded/embeds_one.rb +6 -30
  27. data/lib/mongoid/association/embedded.rb +2 -0
  28. data/lib/mongoid/association/macros.rb +44 -41
  29. data/lib/mongoid/association/many.rb +16 -30
  30. data/lib/mongoid/association/marshalable.rb +3 -6
  31. data/lib/mongoid/association/nested/many.rb +18 -27
  32. data/lib/mongoid/association/nested/nested_buildable.rb +5 -11
  33. data/lib/mongoid/association/nested/one.rb +16 -27
  34. data/lib/mongoid/association/nested.rb +3 -3
  35. data/lib/mongoid/association/one.rb +4 -11
  36. data/lib/mongoid/association/options.rb +8 -38
  37. data/lib/mongoid/association/proxy.rb +37 -36
  38. data/lib/mongoid/association/referenced/auto_save.rb +5 -11
  39. data/lib/mongoid/association/referenced/belongs_to/binding.rb +4 -9
  40. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +11 -9
  41. data/lib/mongoid/association/referenced/belongs_to/eager.rb +40 -3
  42. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +16 -27
  43. data/lib/mongoid/association/referenced/belongs_to.rb +14 -36
  44. data/lib/mongoid/association/referenced/counter_cache.rb +4 -15
  45. data/lib/mongoid/association/referenced/eager.rb +39 -38
  46. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +12 -11
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +5 -5
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +2 -1
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +37 -57
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +23 -43
  51. data/lib/mongoid/association/referenced/has_many/binding.rb +3 -6
  52. data/lib/mongoid/association/referenced/has_many/buildable.rb +5 -5
  53. data/lib/mongoid/association/referenced/has_many/eager.rb +2 -1
  54. data/lib/mongoid/association/referenced/has_many/enumerable.rb +444 -456
  55. data/lib/mongoid/association/referenced/has_many/proxy.rb +74 -107
  56. data/lib/mongoid/association/referenced/has_many.rb +18 -42
  57. data/lib/mongoid/association/referenced/has_one/binding.rb +4 -9
  58. data/lib/mongoid/association/referenced/has_one/buildable.rb +20 -6
  59. data/lib/mongoid/association/referenced/has_one/eager.rb +2 -1
  60. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +13 -26
  61. data/lib/mongoid/association/referenced/has_one/proxy.rb +23 -25
  62. data/lib/mongoid/association/referenced/has_one.rb +13 -33
  63. data/lib/mongoid/association/referenced/syncable.rb +7 -22
  64. data/lib/mongoid/association/referenced.rb +2 -0
  65. data/lib/mongoid/association/reflections.rb +7 -6
  66. data/lib/mongoid/association/relatable.rb +18 -74
  67. data/lib/mongoid/association.rb +8 -22
  68. data/lib/mongoid/atomic/modifiers.rb +27 -51
  69. data/lib/mongoid/atomic/paths/embedded/many.rb +4 -7
  70. data/lib/mongoid/atomic/paths/embedded/one.rb +4 -7
  71. data/lib/mongoid/atomic/paths/embedded.rb +2 -3
  72. data/lib/mongoid/atomic/paths/root.rb +4 -7
  73. data/lib/mongoid/atomic/paths.rb +2 -1
  74. data/lib/mongoid/atomic.rb +29 -44
  75. data/lib/mongoid/attributes/dynamic.rb +3 -18
  76. data/lib/mongoid/attributes/nested.rb +7 -10
  77. data/lib/mongoid/attributes/processing.rb +9 -24
  78. data/lib/mongoid/attributes/projector.rb +119 -0
  79. data/lib/mongoid/attributes/readonly.rb +3 -6
  80. data/lib/mongoid/attributes.rb +46 -60
  81. data/lib/mongoid/cacheable.rb +6 -9
  82. data/lib/mongoid/changeable.rb +6 -60
  83. data/lib/mongoid/clients/factory.rb +42 -17
  84. data/lib/mongoid/clients/options.rb +10 -13
  85. data/lib/mongoid/clients/sessions.rb +2 -6
  86. data/lib/mongoid/clients/storage_options.rb +7 -12
  87. data/lib/mongoid/clients/validators/storage.rb +2 -9
  88. data/lib/mongoid/clients/validators.rb +2 -1
  89. data/lib/mongoid/clients.rb +3 -10
  90. data/lib/mongoid/composable.rb +5 -9
  91. data/lib/mongoid/config/environment.rb +15 -6
  92. data/lib/mongoid/config/options.rb +20 -23
  93. data/lib/mongoid/config/validators/client.rb +2 -17
  94. data/lib/mongoid/config/validators/option.rb +2 -3
  95. data/lib/mongoid/config/validators.rb +2 -1
  96. data/lib/mongoid/config.rb +112 -41
  97. data/lib/mongoid/contextual/aggregable/memory.rb +17 -12
  98. data/lib/mongoid/contextual/aggregable/mongo.rb +25 -26
  99. data/lib/mongoid/contextual/aggregable/none.rb +65 -0
  100. data/lib/mongoid/contextual/aggregable.rb +17 -0
  101. data/lib/mongoid/contextual/atomic.rb +29 -31
  102. data/lib/mongoid/contextual/command.rb +2 -5
  103. data/lib/mongoid/contextual/geo_near.rb +6 -37
  104. data/lib/mongoid/contextual/map_reduce.rb +5 -33
  105. data/lib/mongoid/contextual/memory.rb +8 -61
  106. data/lib/mongoid/contextual/mongo.rb +160 -82
  107. data/lib/mongoid/contextual/none.rb +44 -28
  108. data/lib/mongoid/contextual/queryable.rb +2 -3
  109. data/lib/mongoid/contextual.rb +7 -9
  110. data/lib/mongoid/copyable.rb +11 -10
  111. data/lib/mongoid/criteria/findable.rb +12 -15
  112. data/lib/mongoid/criteria/includable.rb +8 -15
  113. data/lib/mongoid/criteria/inspectable.rb +2 -3
  114. data/lib/mongoid/criteria/marshalable.rb +2 -5
  115. data/lib/mongoid/criteria/modifiable.rb +2 -19
  116. data/lib/mongoid/criteria/options.rb +2 -3
  117. data/lib/mongoid/criteria/permission.rb +2 -1
  118. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -13
  119. data/lib/mongoid/criteria/queryable/expandable.rb +68 -0
  120. data/lib/mongoid/criteria/queryable/extensions/array.rb +4 -27
  121. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +3 -4
  122. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +3 -4
  123. data/lib/mongoid/criteria/queryable/extensions/date.rb +3 -8
  124. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +5 -11
  125. data/lib/mongoid/criteria/queryable/extensions/hash.rb +3 -26
  126. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +3 -14
  127. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +3 -12
  128. data/lib/mongoid/criteria/queryable/extensions/object.rb +4 -29
  129. data/lib/mongoid/criteria/queryable/extensions/range.rb +41 -17
  130. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +6 -13
  131. data/lib/mongoid/criteria/queryable/extensions/set.rb +3 -4
  132. data/lib/mongoid/criteria/queryable/extensions/string.rb +3 -18
  133. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +3 -10
  134. data/lib/mongoid/criteria/queryable/extensions/time.rb +3 -8
  135. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +3 -8
  136. data/lib/mongoid/criteria/queryable/extensions.rb +1 -4
  137. data/lib/mongoid/criteria/queryable/key.rb +36 -21
  138. data/lib/mongoid/criteria/queryable/macroable.rb +3 -4
  139. data/lib/mongoid/criteria/queryable/mergeable.rb +179 -40
  140. data/lib/mongoid/criteria/queryable/optional.rb +5 -48
  141. data/lib/mongoid/criteria/queryable/options.rb +2 -19
  142. data/lib/mongoid/criteria/queryable/pipeline.rb +5 -15
  143. data/lib/mongoid/criteria/queryable/selectable.rb +414 -162
  144. data/lib/mongoid/criteria/queryable/selector.rb +36 -24
  145. data/lib/mongoid/criteria/queryable/smash.rb +2 -11
  146. data/lib/mongoid/criteria/queryable/storable.rb +237 -0
  147. data/lib/mongoid/criteria/queryable.rb +7 -9
  148. data/lib/mongoid/criteria/scopable.rb +27 -19
  149. data/lib/mongoid/criteria.rb +79 -72
  150. data/lib/mongoid/document.rb +24 -73
  151. data/lib/mongoid/equality.rb +29 -12
  152. data/lib/mongoid/errors/ambiguous_relationship.rb +4 -5
  153. data/lib/mongoid/errors/callback.rb +2 -3
  154. data/lib/mongoid/errors/criteria_argument_required.rb +18 -0
  155. data/lib/mongoid/errors/delete_restriction.rb +10 -13
  156. data/lib/mongoid/errors/document_not_destroyed.rb +4 -7
  157. data/lib/mongoid/errors/document_not_found.rb +2 -9
  158. data/lib/mongoid/errors/eager_load.rb +6 -5
  159. data/lib/mongoid/errors/empty_config_file.rb +25 -0
  160. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +2 -3
  161. data/lib/mongoid/errors/invalid_collection.rb +2 -1
  162. data/lib/mongoid/errors/invalid_config_file.rb +25 -0
  163. data/lib/mongoid/errors/invalid_config_option.rb +2 -3
  164. data/lib/mongoid/errors/invalid_dependent_strategy.rb +2 -3
  165. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +24 -0
  166. data/lib/mongoid/errors/invalid_elem_match_operator.rb +32 -0
  167. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +25 -0
  168. data/lib/mongoid/errors/invalid_expression_operator.rb +27 -0
  169. data/lib/mongoid/errors/invalid_field.rb +2 -5
  170. data/lib/mongoid/errors/invalid_field_operator.rb +32 -0
  171. data/lib/mongoid/errors/invalid_field_option.rb +2 -3
  172. data/lib/mongoid/errors/invalid_find.rb +2 -3
  173. data/lib/mongoid/errors/invalid_includes.rb +2 -3
  174. data/lib/mongoid/errors/invalid_index.rb +2 -3
  175. data/lib/mongoid/errors/invalid_options.rb +4 -5
  176. data/lib/mongoid/errors/invalid_path.rb +2 -3
  177. data/lib/mongoid/errors/invalid_persistence_option.rb +2 -5
  178. data/lib/mongoid/errors/invalid_query.rb +40 -0
  179. data/lib/mongoid/errors/invalid_relation.rb +4 -9
  180. data/lib/mongoid/errors/invalid_relation_option.rb +4 -5
  181. data/lib/mongoid/errors/invalid_scope.rb +2 -3
  182. data/lib/mongoid/errors/invalid_session_use.rb +3 -6
  183. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +6 -5
  184. data/lib/mongoid/errors/invalid_storage_options.rb +2 -3
  185. data/lib/mongoid/errors/invalid_storage_parent.rb +2 -3
  186. data/lib/mongoid/errors/invalid_time.rb +2 -3
  187. data/lib/mongoid/errors/invalid_value.rb +2 -1
  188. data/lib/mongoid/errors/inverse_not_found.rb +3 -4
  189. data/lib/mongoid/errors/mixed_client_configuration.rb +2 -3
  190. data/lib/mongoid/errors/mixed_relations.rb +2 -3
  191. data/lib/mongoid/errors/mongoid_error.rb +3 -10
  192. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +3 -4
  193. data/lib/mongoid/errors/no_client_config.rb +4 -5
  194. data/lib/mongoid/errors/no_client_database.rb +2 -3
  195. data/lib/mongoid/errors/no_client_hosts.rb +2 -3
  196. data/lib/mongoid/errors/no_clients_config.rb +2 -3
  197. data/lib/mongoid/errors/no_default_client.rb +3 -4
  198. data/lib/mongoid/errors/no_environment.rb +2 -3
  199. data/lib/mongoid/errors/no_map_reduce_output.rb +2 -3
  200. data/lib/mongoid/errors/no_metadata.rb +2 -3
  201. data/lib/mongoid/errors/no_parent.rb +2 -3
  202. data/lib/mongoid/errors/readonly_attribute.rb +2 -3
  203. data/lib/mongoid/errors/readonly_document.rb +3 -6
  204. data/lib/mongoid/errors/scope_overwrite.rb +2 -1
  205. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +2 -0
  206. data/lib/mongoid/errors/unknown_attribute.rb +2 -3
  207. data/lib/mongoid/errors/unknown_model.rb +2 -3
  208. data/lib/mongoid/errors/unsaved_document.rb +3 -2
  209. data/lib/mongoid/errors/unsupported_javascript.rb +2 -3
  210. data/lib/mongoid/errors/validations.rb +2 -1
  211. data/lib/mongoid/errors.rb +12 -1
  212. data/lib/mongoid/evolvable.rb +4 -5
  213. data/lib/mongoid/extensions/array.rb +28 -37
  214. data/lib/mongoid/extensions/big_decimal.rb +2 -11
  215. data/lib/mongoid/extensions/boolean.rb +3 -5
  216. data/lib/mongoid/extensions/date.rb +13 -12
  217. data/lib/mongoid/extensions/date_time.rb +4 -12
  218. data/lib/mongoid/extensions/decimal128.rb +2 -5
  219. data/lib/mongoid/extensions/false_class.rb +4 -7
  220. data/lib/mongoid/extensions/float.rb +5 -10
  221. data/lib/mongoid/extensions/hash.rb +47 -34
  222. data/lib/mongoid/extensions/integer.rb +5 -12
  223. data/lib/mongoid/extensions/module.rb +2 -3
  224. data/lib/mongoid/extensions/nil_class.rb +2 -5
  225. data/lib/mongoid/extensions/object.rb +17 -44
  226. data/lib/mongoid/extensions/object_id.rb +2 -7
  227. data/lib/mongoid/extensions/range.rb +2 -11
  228. data/lib/mongoid/extensions/regexp.rb +2 -3
  229. data/lib/mongoid/extensions/set.rb +2 -7
  230. data/lib/mongoid/extensions/string.rb +19 -39
  231. data/lib/mongoid/extensions/symbol.rb +2 -7
  232. data/lib/mongoid/extensions/time.rb +12 -9
  233. data/lib/mongoid/extensions/time_with_zone.rb +25 -7
  234. data/lib/mongoid/extensions/true_class.rb +4 -7
  235. data/lib/mongoid/extensions.rb +18 -3
  236. data/lib/mongoid/factory.rb +52 -13
  237. data/lib/mongoid/fields/foreign_key.rb +3 -22
  238. data/lib/mongoid/fields/localized.rb +2 -11
  239. data/lib/mongoid/fields/standard.rb +6 -36
  240. data/lib/mongoid/fields/validators/macro.rb +36 -18
  241. data/lib/mongoid/fields/validators.rb +2 -1
  242. data/lib/mongoid/fields.rb +113 -63
  243. data/lib/mongoid/findable.rb +59 -23
  244. data/lib/mongoid/indexable/specification.rb +3 -16
  245. data/lib/mongoid/indexable/validators/options.rb +2 -7
  246. data/lib/mongoid/indexable.rb +6 -21
  247. data/lib/mongoid/inspectable.rb +4 -11
  248. data/lib/mongoid/interceptable.rb +13 -30
  249. data/lib/mongoid/loggable.rb +13 -16
  250. data/lib/mongoid/matchable.rb +2 -153
  251. data/lib/mongoid/matcher/all.rb +22 -0
  252. data/lib/mongoid/matcher/and.rb +21 -0
  253. data/lib/mongoid/matcher/bits.rb +41 -0
  254. data/lib/mongoid/matcher/bits_all_clear.rb +20 -0
  255. data/lib/mongoid/matcher/bits_all_set.rb +20 -0
  256. data/lib/mongoid/matcher/bits_any_clear.rb +20 -0
  257. data/lib/mongoid/matcher/bits_any_set.rb +20 -0
  258. data/lib/mongoid/matcher/elem_match.rb +36 -0
  259. data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
  260. data/lib/mongoid/matcher/eq.rb +11 -0
  261. data/lib/mongoid/matcher/eq_impl.rb +67 -0
  262. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +26 -0
  263. data/lib/mongoid/matcher/exists.rb +15 -0
  264. data/lib/mongoid/matcher/expression.rb +35 -0
  265. data/lib/mongoid/matcher/expression_operator.rb +19 -0
  266. data/lib/mongoid/matcher/field_expression.rb +62 -0
  267. data/lib/mongoid/matcher/field_operator.rb +54 -0
  268. data/lib/mongoid/matcher/gt.rb +17 -0
  269. data/lib/mongoid/matcher/gte.rb +17 -0
  270. data/lib/mongoid/matcher/in.rb +25 -0
  271. data/lib/mongoid/matcher/lt.rb +17 -0
  272. data/lib/mongoid/matcher/lte.rb +17 -0
  273. data/lib/mongoid/matcher/mod.rb +17 -0
  274. data/lib/mongoid/matcher/ne.rb +16 -0
  275. data/lib/mongoid/matcher/nin.rb +11 -0
  276. data/lib/mongoid/matcher/nor.rb +25 -0
  277. data/lib/mongoid/matcher/not.rb +29 -0
  278. data/lib/mongoid/matcher/or.rb +21 -0
  279. data/lib/mongoid/matcher/regex.rb +41 -0
  280. data/lib/mongoid/matcher/size.rb +26 -0
  281. data/lib/mongoid/matcher/type.rb +99 -0
  282. data/lib/mongoid/matcher.rb +110 -0
  283. data/lib/mongoid/persistable/creatable.rb +4 -21
  284. data/lib/mongoid/persistable/deletable.rb +5 -21
  285. data/lib/mongoid/persistable/destroyable.rb +11 -10
  286. data/lib/mongoid/persistable/incrementable.rb +6 -7
  287. data/lib/mongoid/persistable/logical.rb +4 -6
  288. data/lib/mongoid/persistable/poppable.rb +3 -6
  289. data/lib/mongoid/persistable/pullable.rb +3 -8
  290. data/lib/mongoid/persistable/pushable.rb +3 -8
  291. data/lib/mongoid/persistable/renamable.rb +10 -8
  292. data/lib/mongoid/persistable/savable.rb +3 -8
  293. data/lib/mongoid/persistable/settable.rb +3 -6
  294. data/lib/mongoid/persistable/unsettable.rb +8 -8
  295. data/lib/mongoid/persistable/updatable.rb +32 -20
  296. data/lib/mongoid/persistable/upsertable.rb +3 -8
  297. data/lib/mongoid/persistable.rb +133 -38
  298. data/lib/mongoid/persistence_context.rb +23 -36
  299. data/lib/mongoid/positional.rb +2 -5
  300. data/lib/mongoid/query_cache.rb +118 -103
  301. data/lib/mongoid/railtie.rb +3 -16
  302. data/lib/mongoid/railties/controller_runtime.rb +3 -1
  303. data/lib/mongoid/railties/database.rake +9 -0
  304. data/lib/mongoid/reloadable.rb +14 -19
  305. data/lib/mongoid/scopable.rb +8 -35
  306. data/lib/mongoid/selectable.rb +8 -17
  307. data/lib/mongoid/serializable.rb +24 -29
  308. data/lib/mongoid/shardable.rb +80 -17
  309. data/lib/mongoid/stateful.rb +3 -10
  310. data/lib/mongoid/stringified_symbol.rb +52 -0
  311. data/lib/mongoid/tasks/database.rake +12 -5
  312. data/lib/mongoid/tasks/database.rb +85 -5
  313. data/lib/mongoid/threaded/lifecycle.rb +2 -21
  314. data/lib/mongoid/threaded.rb +2 -55
  315. data/lib/mongoid/timestamps/created/short.rb +2 -1
  316. data/lib/mongoid/timestamps/created.rb +3 -2
  317. data/lib/mongoid/timestamps/short.rb +2 -1
  318. data/lib/mongoid/timestamps/timeless.rb +6 -9
  319. data/lib/mongoid/timestamps/updated/short.rb +2 -1
  320. data/lib/mongoid/timestamps/updated.rb +3 -4
  321. data/lib/mongoid/timestamps.rb +3 -2
  322. data/lib/mongoid/touchable.rb +53 -23
  323. data/lib/mongoid/traversable.rb +177 -57
  324. data/lib/mongoid/validatable/associated.rb +5 -6
  325. data/lib/mongoid/validatable/format.rb +2 -1
  326. data/lib/mongoid/validatable/length.rb +2 -1
  327. data/lib/mongoid/validatable/localizable.rb +2 -3
  328. data/lib/mongoid/validatable/macros.rb +2 -7
  329. data/lib/mongoid/validatable/presence.rb +8 -13
  330. data/lib/mongoid/validatable/queryable.rb +2 -3
  331. data/lib/mongoid/validatable/uniqueness.rb +20 -33
  332. data/lib/mongoid/validatable.rb +8 -27
  333. data/lib/mongoid/version.rb +2 -2
  334. data/lib/mongoid.rb +32 -15
  335. data/lib/rails/generators/mongoid/config/config_generator.rb +10 -2
  336. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +45 -30
  337. data/lib/rails/generators/mongoid/model/model_generator.rb +3 -2
  338. data/lib/rails/generators/mongoid_generator.rb +2 -1
  339. data/lib/rails/mongoid.rb +4 -5
  340. data/spec/README.md +19 -4
  341. data/spec/config/mongoid.yml +1 -0
  342. data/spec/integration/app_spec.rb +246 -95
  343. data/spec/integration/associations/belongs_to_spec.rb +2 -0
  344. data/spec/integration/associations/embedded_dirty_spec.rb +29 -0
  345. data/spec/integration/associations/embedded_spec.rb +207 -1
  346. data/spec/integration/associations/embeds_many_spec.rb +206 -0
  347. data/spec/integration/associations/embeds_one_spec.rb +23 -0
  348. data/spec/integration/associations/foreign_key_spec.rb +98 -0
  349. data/spec/integration/associations/foreign_key_spec_models.rb +64 -0
  350. data/spec/integration/associations/has_many_spec.rb +128 -0
  351. data/spec/integration/associations/has_one_spec.rb +176 -0
  352. data/spec/integration/associations/nested_attributes_assignment_spec.rb +115 -0
  353. data/spec/integration/associations/reverse_population_spec.rb +34 -0
  354. data/spec/integration/associations/reverse_population_spec_models.rb +36 -0
  355. data/spec/integration/associations/scope_option_spec.rb +101 -0
  356. data/spec/integration/atomic/modifiers_spec.rb +116 -0
  357. data/spec/integration/bson_regexp_raw_spec.rb +19 -0
  358. data/spec/integration/callbacks_models.rb +61 -0
  359. data/spec/integration/callbacks_spec.rb +228 -0
  360. data/spec/integration/contextual/empty_spec.rb +141 -0
  361. data/spec/integration/criteria/alias_query_spec.rb +161 -0
  362. data/spec/integration/criteria/date_field_spec.rb +1 -2
  363. data/spec/integration/criteria/default_scope_spec.rb +72 -0
  364. data/spec/integration/criteria/logical_spec.rb +124 -0
  365. data/spec/integration/criteria/range_spec.rb +265 -0
  366. data/spec/integration/criteria/time_with_zone_spec.rb +125 -15
  367. data/spec/integration/discriminator_key_spec.rb +353 -0
  368. data/spec/integration/discriminator_value_spec.rb +206 -0
  369. data/spec/integration/document_spec.rb +30 -1
  370. data/spec/integration/i18n_fallbacks_spec.rb +89 -0
  371. data/spec/integration/{matchable_spec.rb → matcher_examples_spec.rb} +120 -42
  372. data/spec/integration/matcher_operator_data/all.yml +140 -0
  373. data/spec/integration/matcher_operator_data/and.yml +93 -0
  374. data/spec/integration/matcher_operator_data/bits_all_clear.yml +159 -0
  375. data/spec/integration/matcher_operator_data/bits_all_set.yml +159 -0
  376. data/spec/integration/matcher_operator_data/bits_any_clear.yml +159 -0
  377. data/spec/integration/matcher_operator_data/bits_any_set.yml +159 -0
  378. data/spec/integration/matcher_operator_data/comment.yml +22 -0
  379. data/spec/integration/matcher_operator_data/elem_match.yml +409 -0
  380. data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
  381. data/spec/integration/matcher_operator_data/eq.yml +191 -0
  382. data/spec/integration/matcher_operator_data/exists.yml +213 -0
  383. data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
  384. data/spec/integration/matcher_operator_data/gt.yml +132 -0
  385. data/spec/integration/matcher_operator_data/gt_types.yml +63 -0
  386. data/spec/integration/matcher_operator_data/gte.yml +132 -0
  387. data/spec/integration/matcher_operator_data/gte_types.yml +15 -0
  388. data/spec/integration/matcher_operator_data/implicit.yml +331 -0
  389. data/spec/integration/matcher_operator_data/implicit_traversal.yml +112 -0
  390. data/spec/integration/matcher_operator_data/in.yml +210 -0
  391. data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
  392. data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
  393. data/spec/integration/matcher_operator_data/lt.yml +132 -0
  394. data/spec/integration/matcher_operator_data/lt_types.yml +15 -0
  395. data/spec/integration/matcher_operator_data/lte.yml +132 -0
  396. data/spec/integration/matcher_operator_data/lte_types.yml +15 -0
  397. data/spec/integration/matcher_operator_data/mod.yml +55 -0
  398. data/spec/integration/matcher_operator_data/multiple.yml +29 -0
  399. data/spec/integration/matcher_operator_data/ne.yml +150 -0
  400. data/spec/integration/matcher_operator_data/ne_types.yml +15 -0
  401. data/spec/integration/matcher_operator_data/nin.yml +114 -0
  402. data/spec/integration/matcher_operator_data/nor.yml +126 -0
  403. data/spec/integration/matcher_operator_data/not.yml +196 -0
  404. data/spec/integration/matcher_operator_data/or.yml +137 -0
  405. data/spec/integration/matcher_operator_data/regex.yml +174 -0
  406. data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
  407. data/spec/integration/matcher_operator_data/size.yml +174 -0
  408. data/spec/integration/matcher_operator_data/type.yml +70 -0
  409. data/spec/integration/matcher_operator_data/type_array.yml +16 -0
  410. data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
  411. data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
  412. data/spec/integration/matcher_operator_data/type_code.yml +26 -0
  413. data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
  414. data/spec/integration/matcher_operator_data/type_date.yml +39 -0
  415. data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
  416. data/spec/integration/matcher_operator_data/type_decimal.yml +40 -0
  417. data/spec/integration/matcher_operator_data/type_double.yml +15 -0
  418. data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
  419. data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
  420. data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
  421. data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
  422. data/spec/integration/matcher_operator_data/type_null.yml +23 -0
  423. data/spec/integration/matcher_operator_data/type_object.yml +23 -0
  424. data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
  425. data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
  426. data/spec/integration/matcher_operator_data/type_string.yml +15 -0
  427. data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
  428. data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
  429. data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
  430. data/spec/integration/matcher_operator_spec.rb +124 -0
  431. data/spec/integration/matcher_spec.rb +283 -0
  432. data/spec/integration/server_query_spec.rb +141 -0
  433. data/spec/integration/shardable_spec.rb +148 -0
  434. data/spec/integration/stringified_symbol_field_spec.rb +203 -0
  435. data/spec/lite_spec_helper.rb +22 -5
  436. data/spec/mongoid/association/accessors_spec.rb +284 -77
  437. data/spec/mongoid/association/auto_save_spec.rb +74 -33
  438. data/spec/mongoid/association/builders_spec.rb +3 -1
  439. data/spec/mongoid/association/constrainable_spec.rb +2 -0
  440. data/spec/mongoid/association/counter_cache_spec.rb +34 -32
  441. data/spec/mongoid/association/depending_spec.rb +426 -333
  442. data/spec/mongoid/association/eager_spec.rb +6 -4
  443. data/spec/mongoid/association/embedded/cyclic_spec.rb +4 -2
  444. data/spec/mongoid/association/embedded/dirty_spec.rb +4 -2
  445. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -0
  446. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +2 -0
  447. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +65 -13
  448. data/spec/mongoid/association/embedded/embedded_in_spec.rb +3 -1
  449. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +2 -0
  450. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +2 -0
  451. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +431 -133
  452. data/spec/mongoid/association/embedded/embeds_many_models.rb +17 -1
  453. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +51 -0
  454. data/spec/mongoid/association/embedded/embeds_many_spec.rb +3 -1
  455. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +2 -0
  456. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +2 -0
  457. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +23 -21
  458. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +2 -0
  459. data/spec/mongoid/association/embedded/embeds_one_models.rb +3 -0
  460. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +28 -0
  461. data/spec/mongoid/association/embedded/embeds_one_spec.rb +3 -1
  462. data/spec/mongoid/association/macros_spec.rb +11 -9
  463. data/spec/mongoid/association/nested/many_spec.rb +2 -0
  464. data/spec/mongoid/association/nested/one_spec.rb +18 -12
  465. data/spec/mongoid/association/options_spec.rb +2 -0
  466. data/spec/mongoid/association/polymorphic_spec.rb +2 -0
  467. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -0
  468. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +57 -16
  469. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +242 -12
  470. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +99 -58
  471. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +57 -0
  472. data/spec/mongoid/association/referenced/belongs_to_spec.rb +24 -1
  473. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +3 -1
  474. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +28 -1
  475. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +46 -2
  476. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +25 -5
  477. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +215 -167
  478. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +43 -2
  479. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +39 -0
  480. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +46 -2
  481. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +3 -1
  482. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +23 -0
  483. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +40 -9
  484. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +306 -125
  485. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +679 -339
  486. data/spec/mongoid/association/referenced/has_many_models.rb +58 -0
  487. data/spec/mongoid/association/referenced/has_many_query_spec.rb +37 -0
  488. data/spec/mongoid/association/referenced/has_many_spec.rb +23 -0
  489. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +2 -0
  490. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +53 -7
  491. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +34 -4
  492. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +28 -26
  493. data/spec/mongoid/association/referenced/has_one_models.rb +49 -0
  494. data/spec/mongoid/association/referenced/has_one_query_spec.rb +37 -0
  495. data/spec/mongoid/association/referenced/has_one_spec.rb +24 -1
  496. data/spec/mongoid/association/reflections_spec.rb +2 -0
  497. data/spec/mongoid/association/syncable_spec.rb +33 -31
  498. data/spec/mongoid/association_spec.rb +2 -0
  499. data/spec/mongoid/atomic/modifiers_spec.rb +49 -0
  500. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +2 -0
  501. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +2 -0
  502. data/spec/mongoid/atomic/paths/root_spec.rb +2 -0
  503. data/spec/mongoid/atomic/paths_spec.rb +107 -12
  504. data/spec/mongoid/atomic_spec.rb +31 -6
  505. data/spec/mongoid/attributes/dynamic_spec.rb +0 -1
  506. data/spec/mongoid/attributes/nested_spec.rb +69 -67
  507. data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
  508. data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
  509. data/spec/mongoid/attributes/projector_spec.rb +44 -0
  510. data/spec/mongoid/attributes/readonly_spec.rb +24 -22
  511. data/spec/mongoid/attributes_spec.rb +363 -28
  512. data/spec/mongoid/cacheable_spec.rb +3 -1
  513. data/spec/mongoid/changeable_spec.rb +60 -35
  514. data/spec/mongoid/clients/factory_spec.rb +136 -28
  515. data/spec/mongoid/clients/options_spec.rb +44 -26
  516. data/spec/mongoid/clients/sessions_spec.rb +25 -28
  517. data/spec/mongoid/clients/transactions_spec.rb +54 -29
  518. data/spec/mongoid/clients_spec.rb +8 -6
  519. data/spec/mongoid/composable_spec.rb +2 -0
  520. data/spec/mongoid/config/environment_spec.rb +88 -8
  521. data/spec/mongoid/config/options_spec.rb +22 -3
  522. data/spec/mongoid/config_spec.rb +277 -1
  523. data/spec/mongoid/contextual/aggregable/memory_spec.rb +53 -11
  524. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +122 -20
  525. data/spec/mongoid/contextual/aggregable/none_spec.rb +60 -0
  526. data/spec/mongoid/contextual/atomic_spec.rb +222 -71
  527. data/spec/mongoid/contextual/geo_near_spec.rb +20 -18
  528. data/spec/mongoid/contextual/map_reduce_spec.rb +4 -2
  529. data/spec/mongoid/contextual/memory_spec.rb +25 -23
  530. data/spec/mongoid/contextual/mongo_spec.rb +413 -92
  531. data/spec/mongoid/contextual/none_spec.rb +9 -81
  532. data/spec/mongoid/copyable_spec.rb +207 -26
  533. data/spec/mongoid/copyable_spec_models.rb +30 -0
  534. data/spec/mongoid/criteria/findable_spec.rb +77 -20
  535. data/spec/mongoid/criteria/inspectable_spec.rb +2 -0
  536. data/spec/mongoid/criteria/marshalable_spec.rb +2 -0
  537. data/spec/mongoid/criteria/modifiable_spec.rb +43 -40
  538. data/spec/mongoid/criteria/options_spec.rb +2 -0
  539. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +3 -1
  540. data/spec/mongoid/criteria/queryable/expandable_spec.rb +61 -0
  541. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +2 -0
  542. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +2 -0
  543. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +2 -0
  544. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +3 -1
  545. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +2 -0
  546. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +35 -17
  547. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +2 -0
  548. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +2 -0
  549. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +2 -0
  550. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +2 -0
  551. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +2 -0
  552. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +0 -1
  553. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +2 -0
  554. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +239 -178
  555. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +3 -1
  556. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +2 -0
  557. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +2 -0
  558. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +2 -0
  559. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +2 -0
  560. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +23 -16
  561. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +2 -0
  562. data/spec/mongoid/criteria/queryable/key_spec.rb +2 -0
  563. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +145 -12
  564. data/spec/mongoid/criteria/queryable/optional_spec.rb +3 -1
  565. data/spec/mongoid/criteria/queryable/options_spec.rb +2 -0
  566. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +2 -0
  567. data/spec/mongoid/criteria/queryable/queryable_spec.rb +3 -1
  568. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +1593 -286
  569. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +38 -0
  570. data/spec/mongoid/criteria/queryable/selectable_spec.rb +1010 -2736
  571. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +589 -0
  572. data/spec/mongoid/criteria/queryable/selector_spec.rb +2 -0
  573. data/spec/mongoid/criteria/queryable/smash_spec.rb +2 -0
  574. data/spec/mongoid/criteria/queryable/storable_spec.rb +226 -0
  575. data/spec/mongoid/criteria/scopable_spec.rb +129 -0
  576. data/spec/mongoid/criteria_projection_spec.rb +410 -0
  577. data/spec/mongoid/criteria_spec.rb +782 -459
  578. data/spec/mongoid/document_fields_spec.rb +26 -1
  579. data/spec/mongoid/document_persistence_context_spec.rb +0 -1
  580. data/spec/mongoid/document_query_spec.rb +89 -0
  581. data/spec/mongoid/document_spec.rb +123 -48
  582. data/spec/mongoid/equality_spec.rb +144 -41
  583. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +5 -3
  584. data/spec/mongoid/errors/callback_spec.rb +2 -0
  585. data/spec/mongoid/errors/delete_restriction_spec.rb +4 -2
  586. data/spec/mongoid/errors/document_not_destroyed_spec.rb +2 -0
  587. data/spec/mongoid/errors/document_not_found_spec.rb +2 -0
  588. data/spec/mongoid/errors/eager_load_spec.rb +2 -0
  589. data/spec/mongoid/errors/invalid_collection_spec.rb +2 -0
  590. data/spec/mongoid/errors/invalid_config_file_spec.rb +31 -0
  591. data/spec/mongoid/errors/invalid_config_option_spec.rb +2 -0
  592. data/spec/mongoid/errors/invalid_field_option_spec.rb +2 -0
  593. data/spec/mongoid/errors/invalid_field_spec.rb +2 -0
  594. data/spec/mongoid/errors/invalid_find_spec.rb +2 -0
  595. data/spec/mongoid/errors/invalid_includes_spec.rb +2 -0
  596. data/spec/mongoid/errors/invalid_index_spec.rb +2 -0
  597. data/spec/mongoid/errors/invalid_options_spec.rb +4 -2
  598. data/spec/mongoid/errors/invalid_path_spec.rb +2 -0
  599. data/spec/mongoid/errors/invalid_relation_spec.rb +4 -2
  600. data/spec/mongoid/errors/invalid_scope_spec.rb +3 -1
  601. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +2 -0
  602. data/spec/mongoid/errors/invalid_storage_options_spec.rb +2 -0
  603. data/spec/mongoid/errors/invalid_time_spec.rb +2 -0
  604. data/spec/mongoid/errors/inverse_not_found_spec.rb +3 -1
  605. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +2 -0
  606. data/spec/mongoid/errors/mixed_relations_spec.rb +2 -0
  607. data/spec/mongoid/errors/mongoid_error_spec.rb +22 -8
  608. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +5 -3
  609. data/spec/mongoid/errors/no_client_config_spec.rb +4 -2
  610. data/spec/mongoid/errors/no_client_database_spec.rb +5 -3
  611. data/spec/mongoid/errors/no_client_hosts_spec.rb +5 -3
  612. data/spec/mongoid/errors/no_clients_config_spec.rb +2 -0
  613. data/spec/mongoid/errors/no_environment_spec.rb +2 -0
  614. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +2 -0
  615. data/spec/mongoid/errors/no_metadata_spec.rb +4 -2
  616. data/spec/mongoid/errors/no_parent_spec.rb +3 -1
  617. data/spec/mongoid/errors/readonly_attribute_spec.rb +2 -0
  618. data/spec/mongoid/errors/readonly_document_spec.rb +2 -0
  619. data/spec/mongoid/errors/scope_overwrite_spec.rb +2 -0
  620. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +2 -0
  621. data/spec/mongoid/errors/unknown_attribute_spec.rb +4 -2
  622. data/spec/mongoid/errors/unsaved_document_spec.rb +3 -1
  623. data/spec/mongoid/errors/unsupported_javascript_spec.rb +2 -0
  624. data/spec/mongoid/errors/validations_spec.rb +2 -0
  625. data/spec/mongoid/extensions/array_spec.rb +25 -43
  626. data/spec/mongoid/extensions/big_decimal_spec.rb +2 -0
  627. data/spec/mongoid/extensions/binary_spec.rb +2 -0
  628. data/spec/mongoid/extensions/boolean_spec.rb +2 -0
  629. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +335 -0
  630. data/spec/mongoid/extensions/date_spec.rb +8 -160
  631. data/spec/mongoid/extensions/date_time_spec.rb +17 -60
  632. data/spec/mongoid/extensions/decimal128_spec.rb +2 -0
  633. data/spec/mongoid/extensions/false_class_spec.rb +3 -1
  634. data/spec/mongoid/extensions/float_spec.rb +17 -3
  635. data/spec/mongoid/extensions/hash_spec.rb +105 -0
  636. data/spec/mongoid/extensions/integer_spec.rb +14 -2
  637. data/spec/mongoid/extensions/module_spec.rb +2 -0
  638. data/spec/mongoid/extensions/nil_class_spec.rb +2 -0
  639. data/spec/mongoid/extensions/object_id_spec.rb +2 -0
  640. data/spec/mongoid/extensions/object_spec.rb +13 -24
  641. data/spec/mongoid/extensions/range_spec.rb +2 -0
  642. data/spec/mongoid/extensions/regexp_spec.rb +2 -0
  643. data/spec/mongoid/extensions/set_spec.rb +2 -0
  644. data/spec/mongoid/extensions/string_spec.rb +60 -27
  645. data/spec/mongoid/extensions/stringified_symbol_spec.rb +84 -0
  646. data/spec/mongoid/extensions/symbol_spec.rb +2 -0
  647. data/spec/mongoid/extensions/time_spec.rb +29 -0
  648. data/spec/mongoid/extensions/time_with_zone_spec.rb +33 -0
  649. data/spec/mongoid/extensions/true_class_spec.rb +3 -1
  650. data/spec/mongoid/extensions_spec.rb +16 -2
  651. data/spec/mongoid/factory_spec.rb +287 -27
  652. data/spec/mongoid/fields/foreign_key_spec.rb +2 -0
  653. data/spec/mongoid/fields/localized_spec.rb +6 -4
  654. data/spec/mongoid/fields/standard_spec.rb +2 -0
  655. data/spec/mongoid/fields_spec.rb +418 -36
  656. data/spec/mongoid/findable_spec.rb +53 -19
  657. data/spec/mongoid/indexable/specification_spec.rb +2 -0
  658. data/spec/mongoid/indexable_spec.rb +30 -2
  659. data/spec/mongoid/inspectable_spec.rb +39 -2
  660. data/spec/mongoid/interceptable_spec.rb +168 -96
  661. data/spec/mongoid/interceptable_spec_models.rb +76 -0
  662. data/spec/mongoid/loggable_spec.rb +2 -0
  663. data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
  664. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +239 -0
  665. data/spec/mongoid/matcher/extract_attribute_spec.rb +40 -0
  666. data/spec/mongoid/persistable/creatable_spec.rb +112 -27
  667. data/spec/mongoid/persistable/deletable_spec.rb +273 -11
  668. data/spec/mongoid/persistable/destroyable_spec.rb +201 -11
  669. data/spec/mongoid/persistable/incrementable_spec.rb +23 -7
  670. data/spec/mongoid/persistable/logical_spec.rb +19 -3
  671. data/spec/mongoid/persistable/poppable_spec.rb +19 -3
  672. data/spec/mongoid/persistable/pullable_spec.rb +36 -6
  673. data/spec/mongoid/persistable/pushable_spec.rb +36 -6
  674. data/spec/mongoid/persistable/renamable_spec.rb +18 -2
  675. data/spec/mongoid/persistable/savable_spec.rb +188 -25
  676. data/spec/mongoid/persistable/settable_spec.rb +54 -8
  677. data/spec/mongoid/persistable/unsettable_spec.rb +19 -3
  678. data/spec/mongoid/persistable/updatable_spec.rb +45 -23
  679. data/spec/mongoid/persistable/upsertable_spec.rb +4 -2
  680. data/spec/mongoid/persistable_spec.rb +85 -9
  681. data/spec/mongoid/persistence_context_spec.rb +2 -0
  682. data/spec/mongoid/positional_spec.rb +2 -0
  683. data/spec/mongoid/query_cache_middleware_spec.rb +68 -0
  684. data/spec/mongoid/query_cache_spec.rb +501 -81
  685. data/spec/mongoid/relations/proxy_spec.rb +8 -6
  686. data/spec/mongoid/reloadable_spec.rb +298 -20
  687. data/spec/mongoid/scopable_spec.rb +67 -21
  688. data/spec/mongoid/selectable_spec.rb +8 -6
  689. data/spec/mongoid/serializable_spec.rb +160 -29
  690. data/spec/mongoid/shardable_models.rb +61 -0
  691. data/spec/mongoid/shardable_spec.rb +116 -17
  692. data/spec/mongoid/stateful_spec.rb +3 -1
  693. data/spec/mongoid/tasks/database_rake_spec.rb +2 -0
  694. data/spec/mongoid/tasks/database_spec.rb +2 -0
  695. data/spec/mongoid/threaded_spec.rb +4 -2
  696. data/spec/mongoid/timestamps/created/short_spec.rb +3 -1
  697. data/spec/mongoid/timestamps/created_spec.rb +3 -1
  698. data/spec/mongoid/timestamps/timeless_spec.rb +4 -2
  699. data/spec/mongoid/timestamps/updated/short_spec.rb +5 -3
  700. data/spec/mongoid/timestamps/updated_spec.rb +5 -3
  701. data/spec/mongoid/timestamps_spec.rb +8 -6
  702. data/spec/mongoid/touchable_spec.rb +180 -33
  703. data/spec/mongoid/touchable_spec_models.rb +53 -0
  704. data/spec/mongoid/traversable_spec.rb +1167 -1
  705. data/spec/mongoid/validatable/associated_spec.rb +2 -0
  706. data/spec/mongoid/validatable/format_spec.rb +2 -0
  707. data/spec/mongoid/validatable/length_spec.rb +2 -0
  708. data/spec/mongoid/validatable/numericality_spec.rb +2 -0
  709. data/spec/mongoid/validatable/presence_spec.rb +28 -22
  710. data/spec/mongoid/validatable/uniqueness_spec.rb +69 -67
  711. data/spec/mongoid/validatable_spec.rb +5 -3
  712. data/spec/mongoid_spec.rb +2 -0
  713. data/spec/rails/controller_extension/controller_runtime_spec.rb +3 -1
  714. data/spec/rails/mongoid_spec.rb +4 -2
  715. data/spec/shared/LICENSE +20 -0
  716. data/spec/shared/bin/get-mongodb-download-url +17 -0
  717. data/spec/shared/bin/s3-copy +45 -0
  718. data/spec/shared/bin/s3-upload +69 -0
  719. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  720. data/spec/shared/lib/mrss/cluster_config.rb +231 -0
  721. data/spec/shared/lib/mrss/constraints.rb +386 -0
  722. data/spec/shared/lib/mrss/docker_runner.rb +271 -0
  723. data/spec/shared/lib/mrss/event_subscriber.rb +200 -0
  724. data/spec/shared/lib/mrss/lite_constraints.rb +199 -0
  725. data/spec/shared/lib/mrss/server_version_registry.rb +120 -0
  726. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  727. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  728. data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
  729. data/spec/shared/lib/mrss/utils.rb +15 -0
  730. data/spec/shared/share/Dockerfile.erb +339 -0
  731. data/spec/shared/share/haproxy-1.conf +16 -0
  732. data/spec/shared/share/haproxy-2.conf +17 -0
  733. data/spec/shared/shlib/distro.sh +74 -0
  734. data/spec/shared/shlib/server.sh +379 -0
  735. data/spec/shared/shlib/set_env.sh +132 -0
  736. data/spec/spec_helper.rb +39 -35
  737. data/spec/support/authorization.rb +2 -0
  738. data/spec/support/client_registry.rb +9 -0
  739. data/spec/support/constraints.rb +15 -234
  740. data/spec/support/expectations.rb +5 -1
  741. data/spec/support/helpers.rb +11 -0
  742. data/spec/support/macros.rb +22 -0
  743. data/spec/{app → support}/models/account.rb +3 -1
  744. data/spec/{app → support}/models/acolyte.rb +2 -0
  745. data/spec/{app → support}/models/actor.rb +3 -1
  746. data/spec/support/models/actress.rb +4 -0
  747. data/spec/{app → support}/models/address.rb +6 -0
  748. data/spec/{app → support}/models/address_component.rb +2 -0
  749. data/spec/{app → support}/models/address_number.rb +2 -0
  750. data/spec/{app → support}/models/agency.rb +2 -0
  751. data/spec/{app → support}/models/agent.rb +2 -0
  752. data/spec/{app → support}/models/album.rb +2 -0
  753. data/spec/{app → support}/models/alert.rb +2 -0
  754. data/spec/{app → support}/models/animal.rb +2 -0
  755. data/spec/{app → support}/models/answer.rb +2 -0
  756. data/spec/{app → support}/models/appointment.rb +2 -0
  757. data/spec/support/models/armrest.rb +9 -0
  758. data/spec/{app → support}/models/article.rb +2 -0
  759. data/spec/{app → support}/models/artist.rb +4 -0
  760. data/spec/{app → support}/models/artwork.rb +2 -0
  761. data/spec/support/models/audible_sound.rb +3 -0
  762. data/spec/{app → support}/models/audio.rb +2 -0
  763. data/spec/{app → support}/models/augmentation.rb +2 -0
  764. data/spec/{app → support}/models/author.rb +2 -0
  765. data/spec/{app → support}/models/baby.rb +2 -0
  766. data/spec/{app → support}/models/band.rb +6 -0
  767. data/spec/{app → support}/models/bar.rb +2 -0
  768. data/spec/{app → support}/models/basic.rb +2 -0
  769. data/spec/support/models/bed.rb +3 -0
  770. data/spec/{app → support}/models/big_palette.rb +2 -0
  771. data/spec/{app → support}/models/birthday.rb +2 -0
  772. data/spec/support/models/bolt.rb +7 -0
  773. data/spec/{app → support}/models/bomb.rb +2 -0
  774. data/spec/{app → support}/models/book.rb +2 -0
  775. data/spec/{app → support}/models/breed.rb +2 -0
  776. data/spec/{app → support}/models/browser.rb +3 -1
  777. data/spec/{app → support}/models/building.rb +2 -0
  778. data/spec/{app → support}/models/building_address.rb +2 -0
  779. data/spec/{app → support}/models/bus.rb +2 -0
  780. data/spec/{app → support}/models/business.rb +2 -0
  781. data/spec/{app → support}/models/callback_test.rb +2 -0
  782. data/spec/{app → support}/models/canvas.rb +3 -1
  783. data/spec/support/models/car.rb +3 -0
  784. data/spec/{app → support}/models/cat.rb +2 -0
  785. data/spec/{app → support}/models/category.rb +2 -0
  786. data/spec/{app → support}/models/child.rb +2 -0
  787. data/spec/{app → support}/models/child_doc.rb +5 -3
  788. data/spec/{app → support}/models/church.rb +2 -0
  789. data/spec/{app → support}/models/circle.rb +2 -0
  790. data/spec/{app → support}/models/circuit.rb +2 -0
  791. data/spec/{app → support}/models/circus.rb +2 -0
  792. data/spec/{app → support}/models/code.rb +2 -0
  793. data/spec/support/models/coding/pull_request.rb +11 -0
  794. data/spec/support/models/coding.rb +3 -0
  795. data/spec/{app → support}/models/comment.rb +2 -0
  796. data/spec/{app → support}/models/company.rb +2 -0
  797. data/spec/{app → support}/models/consumption_period.rb +2 -0
  798. data/spec/{app → support}/models/contextable_item.rb +2 -0
  799. data/spec/{app → support}/models/contractor.rb +2 -0
  800. data/spec/{app → support}/models/cookie.rb +2 -0
  801. data/spec/{app → support}/models/country_code.rb +4 -0
  802. data/spec/{app → support}/models/courier_job.rb +2 -0
  803. data/spec/support/models/crate.rb +12 -0
  804. data/spec/support/models/customer.rb +10 -0
  805. data/spec/support/models/customer_address.rb +11 -0
  806. data/spec/support/models/deed.rb +7 -0
  807. data/spec/{app → support}/models/definition.rb +2 -0
  808. data/spec/{app → support}/models/delegating_patient.rb +0 -1
  809. data/spec/{app → support}/models/description.rb +2 -0
  810. data/spec/{app → support}/models/dictionary.rb +8 -0
  811. data/spec/{app → support}/models/division.rb +2 -0
  812. data/spec/{app → support}/models/doctor.rb +2 -0
  813. data/spec/{app → support}/models/dog.rb +2 -0
  814. data/spec/{app → support}/models/dokument.rb +2 -0
  815. data/spec/{app → support}/models/draft.rb +2 -0
  816. data/spec/{app → support}/models/dragon.rb +2 -0
  817. data/spec/{app → support}/models/driver.rb +3 -1
  818. data/spec/{app → support}/models/drug.rb +2 -0
  819. data/spec/{app → support}/models/dungeon.rb +2 -0
  820. data/spec/{app → support}/models/edit.rb +2 -0
  821. data/spec/{app → support}/models/email.rb +2 -0
  822. data/spec/{app → support}/models/employer.rb +2 -0
  823. data/spec/{app → support}/models/entry.rb +2 -0
  824. data/spec/support/models/eraser.rb +3 -0
  825. data/spec/{app → support}/models/even.rb +2 -0
  826. data/spec/{app → support}/models/event.rb +2 -0
  827. data/spec/{app → support}/models/exhibition.rb +2 -0
  828. data/spec/{app → support}/models/exhibitor.rb +2 -0
  829. data/spec/{app → support}/models/explosion.rb +2 -0
  830. data/spec/{app → support}/models/eye.rb +2 -0
  831. data/spec/{app → support}/models/eye_bowl.rb +2 -0
  832. data/spec/{app → support}/models/face.rb +2 -0
  833. data/spec/{app → support}/models/favorite.rb +2 -0
  834. data/spec/{app → support}/models/filesystem.rb +2 -0
  835. data/spec/{app → support}/models/fire_hydrant.rb +2 -0
  836. data/spec/{app → support}/models/firefox.rb +2 -0
  837. data/spec/{app → support}/models/fish.rb +2 -0
  838. data/spec/{app → support}/models/folder.rb +2 -0
  839. data/spec/{app → support}/models/folder_item.rb +2 -0
  840. data/spec/{app → support}/models/fruits.rb +2 -0
  841. data/spec/{app → support}/models/game.rb +2 -0
  842. data/spec/{app → support}/models/ghost.rb +2 -0
  843. data/spec/support/models/guitar.rb +4 -0
  844. data/spec/support/models/hole.rb +12 -0
  845. data/spec/{app → support}/models/home.rb +2 -0
  846. data/spec/{app → support}/models/house.rb +2 -0
  847. data/spec/{app → support}/models/html_writer.rb +2 -0
  848. data/spec/{app → support}/models/id_key.rb +2 -0
  849. data/spec/support/models/idnodef.rb +7 -0
  850. data/spec/{app → support}/models/image.rb +2 -0
  851. data/spec/{app → support}/models/implant.rb +2 -0
  852. data/spec/support/models/instrument.rb +8 -0
  853. data/spec/{app → support}/models/item.rb +3 -1
  854. data/spec/{app → support}/models/jar.rb +2 -0
  855. data/spec/{app → support}/models/kaleidoscope.rb +2 -0
  856. data/spec/{app → support}/models/kangaroo.rb +3 -1
  857. data/spec/{app → support}/models/label.rb +4 -1
  858. data/spec/{app → support}/models/language.rb +2 -0
  859. data/spec/{app → support}/models/lat_lng.rb +2 -0
  860. data/spec/{app → support}/models/league.rb +2 -0
  861. data/spec/support/models/learner.rb +4 -0
  862. data/spec/{app → support}/models/line_item.rb +2 -0
  863. data/spec/{app → support}/models/location.rb +2 -0
  864. data/spec/{app → support}/models/login.rb +2 -0
  865. data/spec/{app → support}/models/manufacturer.rb +2 -0
  866. data/spec/{app → support}/models/meat.rb +2 -0
  867. data/spec/{app → support}/models/membership.rb +2 -0
  868. data/spec/{app → support}/models/message.rb +2 -0
  869. data/spec/{app → support}/models/minim.rb +0 -1
  870. data/spec/{app → support}/models/mixed_drink.rb +2 -0
  871. data/spec/support/models/mop.rb +24 -0
  872. data/spec/{app → support}/models/movie.rb +2 -0
  873. data/spec/support/models/my_hash.rb +4 -0
  874. data/spec/{app → support}/models/name.rb +2 -0
  875. data/spec/support/models/name_only.rb +8 -0
  876. data/spec/{app → support}/models/node.rb +2 -0
  877. data/spec/{app → support}/models/note.rb +2 -0
  878. data/spec/support/models/nut.rb +7 -0
  879. data/spec/{app → support}/models/odd.rb +2 -0
  880. data/spec/support/models/order.rb +12 -0
  881. data/spec/{app → support}/models/ordered_post.rb +3 -1
  882. data/spec/{app → support}/models/ordered_preference.rb +2 -0
  883. data/spec/{app → support}/models/oscar.rb +2 -0
  884. data/spec/support/models/other_owner_object.rb +4 -0
  885. data/spec/{app → support}/models/override.rb +2 -0
  886. data/spec/{app → support}/models/ownable.rb +2 -0
  887. data/spec/{app → support}/models/owner.rb +4 -0
  888. data/spec/{app → support}/models/pack.rb +2 -0
  889. data/spec/{app → support}/models/page.rb +2 -0
  890. data/spec/{app → support}/models/page_question.rb +2 -0
  891. data/spec/{app → support}/models/palette.rb +3 -1
  892. data/spec/{app → support}/models/parent.rb +2 -0
  893. data/spec/{app → support}/models/parent_doc.rb +2 -0
  894. data/spec/support/models/passport.rb +13 -0
  895. data/spec/{app → support}/models/patient.rb +2 -0
  896. data/spec/{app → support}/models/pdf_writer.rb +2 -0
  897. data/spec/support/models/pencil.rb +3 -0
  898. data/spec/{app → support}/models/person.rb +21 -1
  899. data/spec/{app → support}/models/pet.rb +2 -0
  900. data/spec/{app → support}/models/pet_owner.rb +2 -0
  901. data/spec/{app → support}/models/phone.rb +5 -1
  902. data/spec/support/models/piano.rb +4 -0
  903. data/spec/{app → support}/models/pizza.rb +2 -0
  904. data/spec/{app → support}/models/player.rb +2 -0
  905. data/spec/{app → support}/models/post.rb +2 -0
  906. data/spec/{app → support}/models/post_genre.rb +2 -0
  907. data/spec/{app → support}/models/powerup.rb +2 -0
  908. data/spec/{app → support}/models/preference.rb +2 -0
  909. data/spec/{app → support}/models/princess.rb +2 -0
  910. data/spec/{app → support}/models/product.rb +2 -0
  911. data/spec/support/models/profile.rb +17 -0
  912. data/spec/{app → support}/models/pronunciation.rb +2 -0
  913. data/spec/{app → support}/models/pub.rb +2 -0
  914. data/spec/support/models/publication/encyclopedia.rb +11 -0
  915. data/spec/support/models/publication/review.rb +13 -0
  916. data/spec/support/models/publication.rb +4 -0
  917. data/spec/{app → support}/models/purchase.rb +2 -0
  918. data/spec/support/models/purchased_item.rb +10 -0
  919. data/spec/{app → support}/models/question.rb +2 -0
  920. data/spec/{app → support}/models/quiz.rb +2 -0
  921. data/spec/{app → support}/models/rating.rb +2 -0
  922. data/spec/{app → support}/models/record.rb +2 -0
  923. data/spec/{app → support}/models/registry.rb +2 -0
  924. data/spec/{app → support}/models/role.rb +2 -0
  925. data/spec/{app → support}/models/root_category.rb +2 -0
  926. data/spec/{app → support}/models/sandwich.rb +2 -0
  927. data/spec/{app → support}/models/scheduler.rb +2 -0
  928. data/spec/support/models/scribe.rb +7 -0
  929. data/spec/support/models/sealer.rb +7 -0
  930. data/spec/support/models/seat.rb +24 -0
  931. data/spec/{app → support}/models/seo.rb +2 -0
  932. data/spec/support/models/series.rb +7 -0
  933. data/spec/{app → support}/models/server.rb +2 -0
  934. data/spec/{app → support}/models/service.rb +2 -0
  935. data/spec/{app → support}/models/shape.rb +4 -2
  936. data/spec/{app → support}/models/shelf.rb +2 -0
  937. data/spec/{app → support}/models/shipment_address.rb +2 -0
  938. data/spec/{app → support}/models/shipping_container.rb +2 -0
  939. data/spec/{app → support}/models/shipping_pack.rb +2 -0
  940. data/spec/support/models/shirt.rb +11 -0
  941. data/spec/{app → support}/models/shop.rb +2 -0
  942. data/spec/{app → support}/models/short_agent.rb +2 -0
  943. data/spec/{app → support}/models/short_quiz.rb +2 -0
  944. data/spec/{app → support}/models/simple.rb +2 -0
  945. data/spec/{app → support}/models/slave.rb +2 -0
  946. data/spec/{app → support}/models/song.rb +2 -0
  947. data/spec/{app → support}/models/sound.rb +2 -0
  948. data/spec/support/models/spacer.rb +7 -0
  949. data/spec/{app → support}/models/square.rb +2 -0
  950. data/spec/{app → support}/models/staff.rb +2 -0
  951. data/spec/{app → support}/models/store_as_dup_test1.rb +2 -0
  952. data/spec/{app → support}/models/store_as_dup_test2.rb +2 -0
  953. data/spec/{app → support}/models/strategy.rb +2 -0
  954. data/spec/{app → support}/models/sub_item.rb +2 -0
  955. data/spec/{app → support}/models/subscription.rb +2 -0
  956. data/spec/{app → support}/models/survey.rb +2 -0
  957. data/spec/{app → support}/models/symptom.rb +2 -0
  958. data/spec/support/models/system_role.rb +7 -0
  959. data/spec/{app → support}/models/tag.rb +2 -0
  960. data/spec/{app → support}/models/target.rb +2 -0
  961. data/spec/{app → support}/models/template.rb +2 -0
  962. data/spec/{app → support}/models/thing.rb +2 -0
  963. data/spec/support/models/threadlocker.rb +7 -0
  964. data/spec/{app → support}/models/title.rb +2 -0
  965. data/spec/{app → support}/models/tool.rb +4 -2
  966. data/spec/{app → support}/models/topping.rb +2 -0
  967. data/spec/support/models/toy.rb +9 -0
  968. data/spec/{app → support}/models/track.rb +2 -0
  969. data/spec/{app → support}/models/translation.rb +2 -0
  970. data/spec/{app → support}/models/tree.rb +2 -0
  971. data/spec/support/models/truck.rb +7 -0
  972. data/spec/{app → support}/models/user.rb +2 -0
  973. data/spec/{app → support}/models/user_account.rb +2 -0
  974. data/spec/{app → support}/models/validation_callback.rb +2 -0
  975. data/spec/support/models/vehicle.rb +18 -0
  976. data/spec/{app → support}/models/version.rb +2 -0
  977. data/spec/{app → support}/models/vertex.rb +3 -1
  978. data/spec/{app → support}/models/vet_visit.rb +2 -0
  979. data/spec/{app → support}/models/video.rb +2 -0
  980. data/spec/support/models/video_game.rb +3 -0
  981. data/spec/support/models/washer.rb +7 -0
  982. data/spec/{app → support}/models/weapon.rb +2 -0
  983. data/spec/{app → support}/models/wiki_page.rb +3 -0
  984. data/spec/{app → support}/models/word.rb +2 -0
  985. data/spec/{app → support}/models/word_origin.rb +2 -0
  986. data/spec/{app → support}/models/writer.rb +4 -2
  987. data/spec/support/shared/time.rb +53 -0
  988. data/spec/support/spec_config.rb +16 -3
  989. data.tar.gz.sig +0 -0
  990. metadata +1100 -738
  991. metadata.gz.sig +0 -0
  992. data/lib/mongoid/criteria/queryable/forwardable.rb +0 -65
  993. data/lib/mongoid/matchable/all.rb +0 -28
  994. data/lib/mongoid/matchable/and.rb +0 -30
  995. data/lib/mongoid/matchable/default.rb +0 -119
  996. data/lib/mongoid/matchable/elem_match.rb +0 -34
  997. data/lib/mongoid/matchable/eq.rb +0 -22
  998. data/lib/mongoid/matchable/exists.rb +0 -23
  999. data/lib/mongoid/matchable/gt.rb +0 -23
  1000. data/lib/mongoid/matchable/gte.rb +0 -23
  1001. data/lib/mongoid/matchable/in.rb +0 -24
  1002. data/lib/mongoid/matchable/lt.rb +0 -23
  1003. data/lib/mongoid/matchable/lte.rb +0 -23
  1004. data/lib/mongoid/matchable/ne.rb +0 -21
  1005. data/lib/mongoid/matchable/nin.rb +0 -22
  1006. data/lib/mongoid/matchable/nor.rb +0 -37
  1007. data/lib/mongoid/matchable/or.rb +0 -33
  1008. data/lib/mongoid/matchable/regexp.rb +0 -27
  1009. data/lib/mongoid/matchable/size.rb +0 -21
  1010. data/lib/support/ruby_version.rb +0 -26
  1011. data/spec/app/models/actress.rb +0 -2
  1012. data/spec/app/models/bed.rb +0 -1
  1013. data/spec/app/models/car.rb +0 -1
  1014. data/spec/app/models/eraser.rb +0 -1
  1015. data/spec/app/models/learner.rb +0 -2
  1016. data/spec/app/models/my_hash.rb +0 -2
  1017. data/spec/app/models/other_owner_object.rb +0 -2
  1018. data/spec/app/models/passport.rb +0 -5
  1019. data/spec/app/models/pencil.rb +0 -1
  1020. data/spec/app/models/profile.rb +0 -5
  1021. data/spec/app/models/series.rb +0 -4
  1022. data/spec/app/models/truck.rb +0 -3
  1023. data/spec/app/models/vehicle.rb +0 -11
  1024. data/spec/app/models/video_game.rb +0 -1
  1025. data/spec/mongoid/criteria/queryable/forwardable_spec.rb +0 -87
  1026. data/spec/mongoid/matchable/all_spec.rb +0 -31
  1027. data/spec/mongoid/matchable/and_spec.rb +0 -187
  1028. data/spec/mongoid/matchable/default_spec.rb +0 -137
  1029. data/spec/mongoid/matchable/elem_match_spec.rb +0 -106
  1030. data/spec/mongoid/matchable/eq_spec.rb +0 -48
  1031. data/spec/mongoid/matchable/exists_spec.rb +0 -57
  1032. data/spec/mongoid/matchable/gt_spec.rb +0 -86
  1033. data/spec/mongoid/matchable/gte_spec.rb +0 -84
  1034. data/spec/mongoid/matchable/in_spec.rb +0 -49
  1035. data/spec/mongoid/matchable/lt_spec.rb +0 -85
  1036. data/spec/mongoid/matchable/lte_spec.rb +0 -85
  1037. data/spec/mongoid/matchable/ne_spec.rb +0 -46
  1038. data/spec/mongoid/matchable/nin_spec.rb +0 -48
  1039. data/spec/mongoid/matchable/nor_spec.rb +0 -209
  1040. data/spec/mongoid/matchable/or_spec.rb +0 -131
  1041. data/spec/mongoid/matchable/regexp_spec.rb +0 -59
  1042. data/spec/mongoid/matchable/size_spec.rb +0 -25
  1043. data/spec/mongoid/matchable_spec.rb +0 -853
  1044. data/spec/support/child_process_helper.rb +0 -76
  1045. data/spec/support/cluster_config.rb +0 -158
  1046. /data/spec/{app → support}/models/array_field.rb +0 -0
  1047. /data/spec/{app → support}/models/store_as_dup_test3.rb +0 -0
  1048. /data/spec/{app → support}/models/store_as_dup_test4.rb +0 -0
  1049. /data/spec/{app → support}/models/updatable.rb +0 -0
@@ -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,7 +280,7 @@ 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
@@ -308,11 +310,11 @@ describe Mongoid::Criteria do
308
310
  describe "#between" do
309
311
 
310
312
  let!(:match) do
311
- Band.create(member_count: 3)
313
+ Band.create!(member_count: 3)
312
314
  end
313
315
 
314
316
  let!(:non_match) do
315
- Band.create(member_count: 10)
317
+ Band.create!(member_count: 10)
316
318
  end
317
319
 
318
320
  let(:criteria) do
@@ -378,7 +380,7 @@ describe Mongoid::Criteria do
378
380
  describe "#cache" do
379
381
 
380
382
  let!(:person) do
381
- Person.create
383
+ Person.create!
382
384
  end
383
385
 
384
386
  context "when no eager loading is involved" do
@@ -530,11 +532,11 @@ describe Mongoid::Criteria do
530
532
  describe "#delete" do
531
533
 
532
534
  let(:depeche) do
533
- Band.create(name: "Depeche Mode")
535
+ Band.create!(name: "Depeche Mode")
534
536
  end
535
537
 
536
538
  let(:tool) do
537
- Band.create(name: "Tool")
539
+ Band.create!(name: "Tool")
538
540
  end
539
541
 
540
542
  context "when no selector is provided" do
@@ -588,7 +590,7 @@ describe Mongoid::Criteria do
588
590
  describe "#each" do
589
591
 
590
592
  let!(:band) do
591
- Band.create(name: "Depeche Mode")
593
+ Band.create!(name: "Depeche Mode")
592
594
  end
593
595
 
594
596
  context "when provided a block" do
@@ -608,14 +610,14 @@ describe Mongoid::Criteria do
608
610
  describe "#elem_match" do
609
611
 
610
612
  let!(:match) do
611
- Band.create(name: "Depeche Mode").tap do |band|
613
+ Band.create!(name: "Depeche Mode").tap do |band|
612
614
  r = band.records
613
- r.create(name: "101")
615
+ r.create!(name: "101")
614
616
  end
615
617
  end
616
618
 
617
619
  let!(:non_match) do
618
- Band.create(genres: [ "house" ])
620
+ Band.create!(genres: [ "house" ])
619
621
  end
620
622
 
621
623
  let(:criteria) do
@@ -661,7 +663,7 @@ describe Mongoid::Criteria do
661
663
  context "when matching documents exist" do
662
664
 
663
665
  let!(:match) do
664
- Band.create(name: "Depeche Mode")
666
+ Band.create!(name: "Depeche Mode")
665
667
  end
666
668
 
667
669
  let(:criteria) do
@@ -676,7 +678,7 @@ describe Mongoid::Criteria do
676
678
  context "when no matching documents exist" do
677
679
 
678
680
  let!(:nonmatch) do
679
- Band.create(name: "New Order")
681
+ Band.create!(name: "New Order")
680
682
  end
681
683
 
682
684
  let(:criteria) do
@@ -692,11 +694,11 @@ describe Mongoid::Criteria do
692
694
  describe "#exists" do
693
695
 
694
696
  let!(:match) do
695
- Band.create(name: "Depeche Mode")
697
+ Band.create!(name: "Depeche Mode")
696
698
  end
697
699
 
698
700
  let!(:non_match) do
699
- Band.create
701
+ Band.create!
700
702
  end
701
703
 
702
704
  let(:criteria) do
@@ -713,7 +715,7 @@ describe Mongoid::Criteria do
713
715
  context "when matching documents exist" do
714
716
 
715
717
  let!(:match) do
716
- Band.create(name: "Depeche Mode")
718
+ Band.create!(name: "Depeche Mode")
717
719
  end
718
720
 
719
721
  let(:criteria) do
@@ -783,23 +785,83 @@ describe Mongoid::Criteria do
783
785
 
784
786
  describe "#field_list" do
785
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
+
786
822
  let(:criteria) do
787
- Band.only(:name)
823
+ Band.where(name: "Depeche Mode")
788
824
  end
789
825
 
790
- it "returns the fields with required _id minus type" do
791
- expect(criteria.field_list).to eq([ "_id", "name" ])
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
847
+ end
848
+
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
792
854
  end
793
855
  end
794
856
 
795
857
  describe "#find_one_and_update" do
796
858
 
797
859
  let!(:depeche) do
798
- Band.create(name: "Depeche Mode")
860
+ Band.create!(name: "Depeche Mode")
799
861
  end
800
862
 
801
863
  let!(:tool) do
802
- Band.create(name: "Tool")
864
+ Band.create!(name: "Tool")
803
865
  end
804
866
 
805
867
  context "when the selector matches" do
@@ -997,7 +1059,7 @@ describe Mongoid::Criteria do
997
1059
  end
998
1060
 
999
1061
  let!(:match) do
1000
- Bar.create(location: [ 52.30, 13.25 ])
1062
+ Bar.create!(location: [ 52.30, 13.25 ])
1001
1063
  end
1002
1064
 
1003
1065
  let(:criteria) do
@@ -1009,7 +1071,7 @@ describe Mongoid::Criteria do
1009
1071
  end
1010
1072
  end
1011
1073
 
1012
- describe "#gt" do
1074
+ describe "#eq" do
1013
1075
 
1014
1076
  let!(:match) do
1015
1077
  Band.create(member_count: 5)
@@ -1019,6 +1081,25 @@ describe Mongoid::Criteria do
1019
1081
  Band.create(member_count: 1)
1020
1082
  end
1021
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
+
1022
1103
  let(:criteria) do
1023
1104
  Band.gt(member_count: 4)
1024
1105
  end
@@ -1031,11 +1112,11 @@ describe Mongoid::Criteria do
1031
1112
  describe "#gte" do
1032
1113
 
1033
1114
  let!(:match) do
1034
- Band.create(member_count: 5)
1115
+ Band.create!(member_count: 5)
1035
1116
  end
1036
1117
 
1037
1118
  let!(:non_match) do
1038
- Band.create(member_count: 1)
1119
+ Band.create!(member_count: 1)
1039
1120
  end
1040
1121
 
1041
1122
  let(:criteria) do
@@ -1054,11 +1135,11 @@ describe Mongoid::Criteria do
1054
1135
  context "when querying on a normal field" do
1055
1136
 
1056
1137
  let!(:match) do
1057
- Band.create(genres: [ "electro", "dub" ])
1138
+ Band.create!(genres: [ "electro", "dub" ])
1058
1139
  end
1059
1140
 
1060
1141
  let!(:non_match) do
1061
- Band.create(genres: [ "house" ])
1142
+ Band.create!(genres: [ "house" ])
1062
1143
  end
1063
1144
 
1064
1145
  let(:criteria) do
@@ -1077,7 +1158,7 @@ describe Mongoid::Criteria do
1077
1158
  end
1078
1159
 
1079
1160
  let!(:match_one) do
1080
- Person.create(preference_ids: [ id ])
1161
+ Person.create!(preference_ids: [ id ])
1081
1162
  end
1082
1163
 
1083
1164
  context "when providing valid ids" do
@@ -1118,7 +1199,7 @@ describe Mongoid::Criteria do
1118
1199
  context "when the relation is a one to one" do
1119
1200
 
1120
1201
  let!(:game) do
1121
- Game.create
1202
+ Game.create!
1122
1203
  end
1123
1204
 
1124
1205
  let(:criteria) do
@@ -1156,7 +1237,7 @@ describe Mongoid::Criteria do
1156
1237
  describe "#includes" do
1157
1238
 
1158
1239
  let!(:person) do
1159
- Person.create(age: 1)
1240
+ Person.create!(age: 1)
1160
1241
  end
1161
1242
 
1162
1243
  context "when providing a name that is not a relation" do
@@ -1171,11 +1252,11 @@ describe Mongoid::Criteria do
1171
1252
  context "when providing one association" do
1172
1253
 
1173
1254
  let!(:user) do
1174
- User.create(posts: [ post1 ])
1255
+ User.create!(posts: [ post1 ])
1175
1256
  end
1176
1257
 
1177
1258
  let!(:post1) do
1178
- Post.create
1259
+ Post.create!
1179
1260
  end
1180
1261
 
1181
1262
  let(:result) do
@@ -1194,15 +1275,15 @@ describe Mongoid::Criteria do
1194
1275
  context "when providing a list of associations" do
1195
1276
 
1196
1277
  let!(:user) do
1197
- User.create(posts: [ post1 ], descriptions: [ description1 ])
1278
+ User.create!(posts: [ post1 ], descriptions: [ description1 ])
1198
1279
  end
1199
1280
 
1200
1281
  let!(:post1) do
1201
- Post.create
1282
+ Post.create!
1202
1283
  end
1203
1284
 
1204
1285
  let!(:description1) do
1205
- Description.create(details: 1)
1286
+ Description.create!(details: 1)
1206
1287
  end
1207
1288
 
1208
1289
  let(:result) do
@@ -1222,13 +1303,13 @@ describe Mongoid::Criteria do
1222
1303
  context "when providing a nested association" do
1223
1304
 
1224
1305
  let!(:user) do
1225
- User.create
1306
+ User.create!
1226
1307
  end
1227
1308
 
1228
1309
  before do
1229
- p = Post.create(alerts: [ Alert.create ])
1310
+ p = Post.create!(alerts: [ Alert.create! ])
1230
1311
  user.posts = [ p ]
1231
- user.save
1312
+ user.save!
1232
1313
  end
1233
1314
 
1234
1315
  let(:result) do
@@ -1248,7 +1329,7 @@ describe Mongoid::Criteria do
1248
1329
  context "when providing a deeply nested association" do
1249
1330
 
1250
1331
  let!(:user) do
1251
- User.create
1332
+ User.create!
1252
1333
  end
1253
1334
 
1254
1335
  let(:results) do
@@ -1286,15 +1367,15 @@ describe Mongoid::Criteria do
1286
1367
  context "when the includes is on the subclass" do
1287
1368
 
1288
1369
  let!(:c_one) do
1289
- C.create
1370
+ C.create!
1290
1371
  end
1291
1372
 
1292
1373
  let!(:c_two) do
1293
- C.create
1374
+ C.create!
1294
1375
  end
1295
1376
 
1296
1377
  let!(:b) do
1297
- B.create(c: c_two)
1378
+ B.create!(c: c_two)
1298
1379
  end
1299
1380
 
1300
1381
  let!(:results) do
@@ -1349,19 +1430,19 @@ describe Mongoid::Criteria do
1349
1430
  context "when the includes is on the several relations" do
1350
1431
 
1351
1432
  let!(:d_one) do
1352
- D.create
1433
+ D.create!
1353
1434
  end
1354
1435
 
1355
1436
  let!(:d_two) do
1356
- D.create
1437
+ D.create!
1357
1438
  end
1358
1439
 
1359
1440
  let!(:b) do
1360
- B.create(d: d_two)
1441
+ B.create!(d: d_two)
1361
1442
  end
1362
1443
 
1363
1444
  let!(:c) do
1364
- C.create(d: d_two)
1445
+ C.create!(d: d_two)
1365
1446
  end
1366
1447
 
1367
1448
  let!(:results) do
@@ -1420,19 +1501,19 @@ describe Mongoid::Criteria do
1420
1501
  context "when the includes is on the several relations" do
1421
1502
 
1422
1503
  let!(:d_one) do
1423
- D.create
1504
+ D.create!
1424
1505
  end
1425
1506
 
1426
1507
  let!(:d_two) do
1427
- D.create
1508
+ D.create!
1428
1509
  end
1429
1510
 
1430
1511
  let!(:bs) do
1431
- 2.times.map { B.create(d: d_two) }
1512
+ 2.times.map { B.create!(d: d_two) }
1432
1513
  end
1433
1514
 
1434
1515
  let!(:cs) do
1435
- 2.times.map { C.create(d: d_two) }
1516
+ 2.times.map { C.create!(d: d_two) }
1436
1517
  end
1437
1518
 
1438
1519
  let!(:results) do
@@ -1478,7 +1559,7 @@ describe Mongoid::Criteria do
1478
1559
  context "when mapping the results more than once" do
1479
1560
 
1480
1561
  let!(:post) do
1481
- person.posts.create(title: "one")
1562
+ person.posts.create!(title: "one")
1482
1563
  end
1483
1564
 
1484
1565
  let(:criteria) do
@@ -1500,15 +1581,15 @@ describe Mongoid::Criteria do
1500
1581
  context "when the criteria is from the root" do
1501
1582
 
1502
1583
  let!(:person_two) do
1503
- Person.create(age: 2)
1584
+ Person.create!(age: 2)
1504
1585
  end
1505
1586
 
1506
1587
  let!(:post_one) do
1507
- person.posts.create(title: "one")
1588
+ person.posts.create!(title: "one")
1508
1589
  end
1509
1590
 
1510
1591
  let!(:post_two) do
1511
- person_two.posts.create(title: "two")
1592
+ person_two.posts.create!(title: "two")
1512
1593
  end
1513
1594
 
1514
1595
  context "when calling first" do
@@ -1557,15 +1638,15 @@ describe Mongoid::Criteria do
1557
1638
  context "when the criteria is from an embedded relation" do
1558
1639
 
1559
1640
  let(:peep) do
1560
- Person.create
1641
+ Person.create!
1561
1642
  end
1562
1643
 
1563
1644
  let!(:address_one) do
1564
- peep.addresses.create(street: "rosenthaler")
1645
+ peep.addresses.create!(street: "rosenthaler")
1565
1646
  end
1566
1647
 
1567
1648
  let!(:address_two) do
1568
- peep.addresses.create(street: "weinmeister")
1649
+ peep.addresses.create!(street: "weinmeister")
1569
1650
  end
1570
1651
 
1571
1652
  let!(:depeche) do
@@ -1579,8 +1660,8 @@ describe Mongoid::Criteria do
1579
1660
  before do
1580
1661
  address_one.band = depeche
1581
1662
  address_two.band = tool
1582
- address_one.save
1583
- address_two.save
1663
+ address_one.save!
1664
+ address_two.save!
1584
1665
  end
1585
1666
 
1586
1667
  context "when calling first" do
@@ -1677,11 +1758,11 @@ describe Mongoid::Criteria do
1677
1758
  end
1678
1759
 
1679
1760
  let!(:post_one) do
1680
- person.posts.create(title: "one")
1761
+ person.posts.create!(title: "one")
1681
1762
  end
1682
1763
 
1683
1764
  let!(:post_two) do
1684
- person.posts.create(title: "two")
1765
+ person.posts.create!(title: "two")
1685
1766
  end
1686
1767
 
1687
1768
  context "when the criteria has no options" do
@@ -1799,11 +1880,11 @@ describe Mongoid::Criteria do
1799
1880
  context "when the criteria has limiting options" do
1800
1881
 
1801
1882
  let!(:person_two) do
1802
- Person.create
1883
+ Person.create!
1803
1884
  end
1804
1885
 
1805
1886
  let!(:post_three) do
1806
- person_two.posts.create(title: "three")
1887
+ person_two.posts.create!(title: "three")
1807
1888
  end
1808
1889
 
1809
1890
  let!(:criteria) do
@@ -1835,11 +1916,11 @@ describe Mongoid::Criteria do
1835
1916
  context "when including a has and belongs to many" do
1836
1917
 
1837
1918
  let!(:preference_one) do
1838
- person.preferences.create(name: "one")
1919
+ person.preferences.create!(name: "one")
1839
1920
  end
1840
1921
 
1841
1922
  let!(:preference_two) do
1842
- person.preferences.create(name: "two")
1923
+ person.preferences.create!(name: "two")
1843
1924
  end
1844
1925
 
1845
1926
  context "when one of the related items is deleted" do
@@ -1943,11 +2024,11 @@ describe Mongoid::Criteria do
1943
2024
  context "when including a has many" do
1944
2025
 
1945
2026
  let!(:post_one) do
1946
- person.posts.create(title: "one")
2027
+ person.posts.create!(title: "one")
1947
2028
  end
1948
2029
 
1949
2030
  let!(:post_two) do
1950
- person.posts.create(title: "two")
2031
+ person.posts.create!(title: "two")
1951
2032
  end
1952
2033
 
1953
2034
  context "when the criteria has no options" do
@@ -2032,11 +2113,11 @@ describe Mongoid::Criteria do
2032
2113
  context "when the criteria has limiting options" do
2033
2114
 
2034
2115
  let!(:person_two) do
2035
- Person.create
2116
+ Person.create!
2036
2117
  end
2037
2118
 
2038
2119
  let!(:post_three) do
2039
- person_two.posts.create(title: "three")
2120
+ person_two.posts.create!(title: "three")
2040
2121
  end
2041
2122
 
2042
2123
  let!(:criteria) do
@@ -2097,7 +2178,7 @@ describe Mongoid::Criteria do
2097
2178
  context "when the criteria has limiting options" do
2098
2179
 
2099
2180
  let!(:person_two) do
2100
- Person.create(age: 2)
2181
+ Person.create!(age: 2)
2101
2182
  end
2102
2183
 
2103
2184
  let!(:game_three) do
@@ -2129,7 +2210,7 @@ describe Mongoid::Criteria do
2129
2210
  context "when including a belongs to" do
2130
2211
 
2131
2212
  let(:person_two) do
2132
- Person.create(age: 2)
2213
+ Person.create!(age: 2)
2133
2214
  end
2134
2215
 
2135
2216
  let!(:game_one) do
@@ -2190,11 +2271,11 @@ describe Mongoid::Criteria do
2190
2271
  context "when including multiples in the same criteria" do
2191
2272
 
2192
2273
  let!(:post_one) do
2193
- person.posts.create(title: "one")
2274
+ person.posts.create!(title: "one")
2194
2275
  end
2195
2276
 
2196
2277
  let!(:post_two) do
2197
- person.posts.create(title: "two")
2278
+ person.posts.create!(title: "two")
2198
2279
  end
2199
2280
 
2200
2281
  let!(:game_one) do
@@ -2264,11 +2345,11 @@ describe Mongoid::Criteria do
2264
2345
  describe "#lt" do
2265
2346
 
2266
2347
  let!(:match) do
2267
- Band.create(member_count: 1)
2348
+ Band.create!(member_count: 1)
2268
2349
  end
2269
2350
 
2270
2351
  let!(:non_match) do
2271
- Band.create(member_count: 5)
2352
+ Band.create!(member_count: 5)
2272
2353
  end
2273
2354
 
2274
2355
  let(:criteria) do
@@ -2283,11 +2364,11 @@ describe Mongoid::Criteria do
2283
2364
  describe "#lte" do
2284
2365
 
2285
2366
  let!(:match) do
2286
- Band.create(member_count: 4)
2367
+ Band.create!(member_count: 4)
2287
2368
  end
2288
2369
 
2289
2370
  let!(:non_match) do
2290
- Band.create(member_count: 5)
2371
+ Band.create!(member_count: 5)
2291
2372
  end
2292
2373
 
2293
2374
  let(:criteria) do
@@ -2320,11 +2401,11 @@ describe Mongoid::Criteria do
2320
2401
  end
2321
2402
 
2322
2403
  let!(:depeche_mode) do
2323
- Band.create(name: "Depeche Mode", likes: 200)
2404
+ Band.create!(name: "Depeche Mode", likes: 200)
2324
2405
  end
2325
2406
 
2326
2407
  let!(:tool) do
2327
- Band.create(name: "Tool", likes: 100)
2408
+ Band.create!(name: "Tool", likes: 100)
2328
2409
  end
2329
2410
 
2330
2411
  context "when no timeout options are provided" do
@@ -2347,11 +2428,11 @@ describe Mongoid::Criteria do
2347
2428
  context "when provided a single field" do
2348
2429
 
2349
2430
  let!(:depeche) do
2350
- Band.create(name: "Depeche Mode", likes: 1000)
2431
+ Band.create!(name: "Depeche Mode", likes: 1000)
2351
2432
  end
2352
2433
 
2353
2434
  let!(:tool) do
2354
- Band.create(name: "Tool", likes: 500)
2435
+ Band.create!(name: "Tool", likes: 500)
2355
2436
  end
2356
2437
 
2357
2438
  let(:criteria) do
@@ -2391,11 +2472,11 @@ describe Mongoid::Criteria do
2391
2472
  end
2392
2473
 
2393
2474
  let!(:match) do
2394
- Bar.create(location: [ 52.30, 13.25 ])
2475
+ Bar.create!(location: [ 52.30, 13.25 ])
2395
2476
  end
2396
2477
 
2397
2478
  let!(:non_match) do
2398
- Bar.create(location: [ 19.26, 99.70 ])
2479
+ Bar.create!(location: [ 19.26, 99.70 ])
2399
2480
  end
2400
2481
 
2401
2482
  let(:criteria) do
@@ -2548,11 +2629,11 @@ describe Mongoid::Criteria do
2548
2629
  context "when provided a single field" do
2549
2630
 
2550
2631
  let!(:depeche) do
2551
- Band.create(name: "Depeche Mode", likes: 1000)
2632
+ Band.create!(name: "Depeche Mode", likes: 1000)
2552
2633
  end
2553
2634
 
2554
2635
  let!(:tool) do
2555
- Band.create(name: "Tool", likes: 500)
2636
+ Band.create!(name: "Tool", likes: 500)
2556
2637
  end
2557
2638
 
2558
2639
  let(:criteria) do
@@ -2588,11 +2669,11 @@ describe Mongoid::Criteria do
2588
2669
  describe "#mod" do
2589
2670
 
2590
2671
  let!(:match) do
2591
- Band.create(member_count: 5)
2672
+ Band.create!(member_count: 5)
2592
2673
  end
2593
2674
 
2594
2675
  let!(:non_match) do
2595
- Band.create(member_count: 2)
2676
+ Band.create!(member_count: 2)
2596
2677
  end
2597
2678
 
2598
2679
  let(:criteria) do
@@ -2607,11 +2688,11 @@ describe Mongoid::Criteria do
2607
2688
  describe "#ne" do
2608
2689
 
2609
2690
  let!(:match) do
2610
- Band.create(name: "Depeche Mode")
2691
+ Band.create!(name: "Depeche Mode")
2611
2692
  end
2612
2693
 
2613
2694
  let!(:non_match) do
2614
- Band.create(name: "Tool")
2695
+ Band.create!(name: "Tool")
2615
2696
  end
2616
2697
 
2617
2698
  let(:criteria) do
@@ -2630,7 +2711,7 @@ describe Mongoid::Criteria do
2630
2711
  end
2631
2712
 
2632
2713
  let!(:match) do
2633
- Bar.create(location: [ 52.30, 13.25 ])
2714
+ Bar.create!(location: [ 52.30, 13.25 ])
2634
2715
  end
2635
2716
 
2636
2717
  let(:criteria) do
@@ -2649,7 +2730,7 @@ describe Mongoid::Criteria do
2649
2730
  end
2650
2731
 
2651
2732
  let!(:match) do
2652
- Bar.create(location: [ 52.30, 13.25 ])
2733
+ Bar.create!(location: [ 52.30, 13.25 ])
2653
2734
  end
2654
2735
 
2655
2736
  let(:criteria) do
@@ -2664,11 +2745,11 @@ describe Mongoid::Criteria do
2664
2745
  describe "#nin" do
2665
2746
 
2666
2747
  let!(:match) do
2667
- Band.create(name: "Depeche Mode")
2748
+ Band.create!(name: "Depeche Mode")
2668
2749
  end
2669
2750
 
2670
2751
  let!(:non_match) do
2671
- Band.create(name: "Tool")
2752
+ Band.create!(name: "Tool")
2672
2753
  end
2673
2754
 
2674
2755
  let(:criteria) do
@@ -2683,11 +2764,11 @@ describe Mongoid::Criteria do
2683
2764
  describe "#nor" do
2684
2765
 
2685
2766
  let!(:match) do
2686
- Band.create(name: "Depeche Mode")
2767
+ Band.create!(name: "Depeche Mode")
2687
2768
  end
2688
2769
 
2689
2770
  let!(:non_match) do
2690
- Band.create(name: "Tool")
2771
+ Band.create!(name: "Tool")
2691
2772
  end
2692
2773
 
2693
2774
  let(:criteria) do
@@ -2699,230 +2780,16 @@ describe Mongoid::Criteria do
2699
2780
  end
2700
2781
  end
2701
2782
 
2702
- describe "#only" do
2703
-
2704
- let!(:band) do
2705
- Band.create(name: "Depeche Mode", likes: 3, views: 10)
2706
- end
2707
-
2708
- context "when not using inheritance" do
2709
-
2710
- context "when passing splat args" do
2711
-
2712
- let(:criteria) do
2713
- Band.only(:_id)
2714
- end
2715
-
2716
- it "limits the returned fields" do
2717
- expect {
2718
- criteria.first.name
2719
- }.to raise_error(ActiveModel::MissingAttributeError)
2720
- end
2721
-
2722
- it "does not add _type to the fields" do
2723
- expect(criteria.options[:fields]["_type"]).to be_nil
2724
- end
2725
- end
2726
-
2727
- context "when not including id" do
2728
-
2729
- let(:criteria) do
2730
- Band.only(:name)
2731
- end
2732
-
2733
- it "responds to id anyway" do
2734
- expect {
2735
- criteria.first.id
2736
- }.to_not raise_error
2737
- end
2738
- end
2739
-
2740
- context "when passing an array" do
2741
-
2742
- let(:criteria) do
2743
- Band.only([ :name, :likes ])
2744
- end
2745
-
2746
- it "includes the limited fields" do
2747
- expect(criteria.first.name).to_not be_nil
2748
- end
2749
-
2750
- it "excludes the non included fields" do
2751
- expect {
2752
- criteria.first.active
2753
- }.to raise_error(ActiveModel::MissingAttributeError)
2754
- end
2755
-
2756
- it "does not add _type to the fields" do
2757
- expect(criteria.options[:fields]["_type"]).to be_nil
2758
- end
2759
- end
2760
-
2761
- context "when instantiating a class of another type inside the iteration" do
2762
-
2763
- let(:criteria) do
2764
- Band.only(:name)
2765
- end
2766
-
2767
- it "only limits the fields on the correct model" do
2768
- criteria.each do |band|
2769
- expect(Person.new.age).to eq(100)
2770
- end
2771
- end
2772
- end
2773
-
2774
- context "when instantiating a document not in the result set" do
2775
-
2776
- let(:criteria) do
2777
- Band.only(:name)
2778
- end
2779
-
2780
- it "only limits the fields on the correct criteria" do
2781
- criteria.each do |band|
2782
- expect(Band.new.active).to be true
2783
- end
2784
- end
2785
- end
2786
-
2787
- context "when nesting a criteria within a criteria" do
2788
-
2789
- let(:criteria) do
2790
- Band.only(:name)
2791
- end
2792
-
2793
- it "only limits the fields on the correct criteria" do
2794
- criteria.each do |band|
2795
- Band.all.each do |b|
2796
- expect(b.active).to be true
2797
- end
2798
- end
2799
- end
2800
- end
2801
- end
2802
-
2803
- context "when using inheritance" do
2804
-
2805
- let(:criteria) do
2806
- Doctor.only(:_id)
2807
- end
2808
-
2809
- it "adds _type to the fields" do
2810
- expect(criteria.options[:fields]["_type"]).to eq(1)
2811
- end
2812
- end
2813
-
2814
- context "when limiting to embedded documents" do
2815
-
2816
- context "when the embedded documents are aliased" do
2817
-
2818
- let(:criteria) do
2819
- Person.only(:phones)
2820
- end
2821
-
2822
- it "properly uses the database field name" do
2823
- expect(criteria.options).to eq(fields: { "_id" => 1, "mobile_phones" => 1 })
2824
- end
2825
- end
2826
- end
2827
-
2828
- context 'when the field is localized' do
2829
-
2830
- before do
2831
- I18n.locale = :en
2832
- d = Dictionary.create(description: 'english-text')
2833
- I18n.locale = :de
2834
- d.description = 'deutsch-text'
2835
- d.save
2836
- end
2837
-
2838
- after do
2839
- I18n.locale = :en
2840
- end
2841
-
2842
- context 'when entire field is included' do
2843
-
2844
- let(:dictionary) do
2845
- Dictionary.only(:description).first
2846
-
2847
- end
2848
-
2849
- it 'loads all translations' do
2850
- expect(dictionary.description_translations.keys).to include('de', 'en')
2851
- end
2852
-
2853
- it 'returns the field value for the current locale' do
2854
- I18n.locale = :en
2855
- expect(dictionary.description).to eq('english-text')
2856
- I18n.locale = :de
2857
- expect(dictionary.description).to eq('deutsch-text')
2858
- end
2859
- end
2860
-
2861
- context 'when a specific locale is included' do
2862
-
2863
- let(:dictionary) do
2864
- Dictionary.only(:'description.de').first
2865
- end
2866
-
2867
- it 'loads translations only for the included locale' do
2868
- expect(dictionary.description_translations.keys).to include('de')
2869
- expect(dictionary.description_translations.keys).to_not include('en')
2870
- end
2871
-
2872
- it 'returns the field value for the included locale' do
2873
- I18n.locale = :en
2874
- expect(dictionary.description).to be_nil
2875
- I18n.locale = :de
2876
- expect(dictionary.description).to eq('deutsch-text')
2877
- end
2878
- end
2879
-
2880
- context 'when entire field is excluded' do
2881
-
2882
- let(:dictionary) do
2883
- Dictionary.without(:description).first
2884
- end
2885
-
2886
- it 'does not load all translations' do
2887
- expect(dictionary.description_translations.keys).to_not include('de', 'en')
2888
- end
2889
-
2890
- it 'raises an ActiveModel::MissingAttributeError when attempting to access the field' do
2891
- expect{dictionary.description}.to raise_error ActiveModel::MissingAttributeError
2892
- end
2893
- end
2894
-
2895
- context 'when a specific locale is excluded' do
2896
-
2897
- let(:dictionary) do
2898
- Dictionary.without(:'description.de').first
2899
- end
2900
-
2901
- it 'does not load excluded translations' do
2902
- expect(dictionary.description_translations.keys).to_not include('de')
2903
- expect(dictionary.description_translations.keys).to include('en')
2904
- end
2905
-
2906
- it 'returns nil for excluded translations' do
2907
- I18n.locale = :en
2908
- expect(dictionary.description).to eq('english-text')
2909
- I18n.locale = :de
2910
- expect(dictionary.description).to be_nil
2911
- end
2912
- end
2913
- end
2914
- end
2915
-
2916
2783
  [ :or, :any_of ].each do |method|
2917
2784
 
2918
2785
  describe "\##{method}" do
2919
2786
 
2920
2787
  let!(:match) do
2921
- Band.create(name: "Depeche Mode")
2788
+ Band.create!(name: "Depeche Mode")
2922
2789
  end
2923
2790
 
2924
2791
  let!(:non_match) do
2925
- Band.create(name: "Tool")
2792
+ Band.create!(name: "Tool")
2926
2793
  end
2927
2794
 
2928
2795
  context "when sending a normal $or criterion" do
@@ -2952,25 +2819,29 @@ describe Mongoid::Criteria do
2952
2819
  describe "#pluck" do
2953
2820
 
2954
2821
  let!(:depeche) do
2955
- Band.create(name: "Depeche Mode", likes: 3)
2822
+ Band.create!(name: "Depeche Mode", likes: 3)
2956
2823
  end
2957
2824
 
2958
2825
  let!(:tool) do
2959
- Band.create(name: "Tool", likes: 3)
2826
+ Band.create!(name: "Tool", likes: 3)
2960
2827
  end
2961
2828
 
2962
2829
  let!(:photek) do
2963
- 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")
2964
2835
  end
2965
2836
 
2966
2837
  context "when the field is aliased" do
2967
2838
 
2968
2839
  let!(:expensive) do
2969
- Product.create(price: 100000)
2840
+ Product.create!(price: 100000)
2970
2841
  end
2971
2842
 
2972
2843
  let!(:cheap) do
2973
- Product.create(price: 1)
2844
+ Product.create!(price: 1)
2974
2845
  end
2975
2846
 
2976
2847
  context "when using alias_attribute" do
@@ -2979,8 +2850,10 @@ describe Mongoid::Criteria do
2979
2850
  Product.pluck(:price)
2980
2851
  end
2981
2852
 
2982
- it "uses the aliases" do
2983
- 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
2984
2857
  end
2985
2858
  end
2986
2859
  end
@@ -2997,14 +2870,18 @@ describe Mongoid::Criteria do
2997
2870
  criteria.pluck(:name)
2998
2871
  end
2999
2872
 
3000
- it "returns the values" do
3001
- 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
3002
2877
  end
3003
2878
 
3004
2879
  context "when subsequently executing the criteria without a pluck" do
3005
2880
 
3006
- it "does not limit the fields" do
3007
- 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
3008
2885
  end
3009
2886
  end
3010
2887
 
@@ -3015,51 +2892,83 @@ describe Mongoid::Criteria do
3015
2892
  end
3016
2893
 
3017
2894
  context 'when a top-level field and a subdocument field are plucked' do
3018
-
3019
2895
  before do
3020
- Band.create(name: 'FKA Twigs')
3021
- 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') ])
3022
2898
  end
3023
2899
 
3024
2900
  let(:embedded_pluck) do
3025
2901
  criteria.pluck(:name, 'records.name')
3026
2902
  end
3027
2903
 
3028
- let(:expected) do
3029
- [
3030
- ["FKA Twigs", nil],
3031
- ['FKA Twigs', [{ "name" => "LP1" }]]
3032
- ]
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
3033
2916
  end
3034
2917
 
3035
- it 'returns the list of top-level field and subdocument values' do
3036
- 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
3037
2930
  end
3038
2931
  end
3039
2932
 
3040
2933
  context 'when only a subdocument field is plucked' do
3041
2934
 
3042
2935
  before do
3043
- Band.create(name: 'FKA Twigs')
3044
- 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') ])
3045
2938
  end
3046
2939
 
3047
2940
  let(:embedded_pluck) do
3048
2941
  criteria.pluck('records.name')
3049
2942
  end
3050
2943
 
3051
- let(:expected) do
3052
- [
3053
- nil,
3054
- [{ "name" => "LP1" }]
3055
- ]
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
3056
2956
  end
3057
2957
 
3058
- it 'returns the list of subdocument values' do
3059
- 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
3060
2970
  end
3061
2971
  end
3062
-
3063
2972
  end
3064
2973
  end
3065
2974
 
@@ -3069,8 +2978,10 @@ describe Mongoid::Criteria do
3069
2978
  Band.where(:name.exists => true).pluck(:name, :likes)
3070
2979
  end
3071
2980
 
3072
- it "returns the values" do
3073
- 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
3074
2985
  end
3075
2986
  end
3076
2987
 
@@ -3080,8 +2991,10 @@ describe Mongoid::Criteria do
3080
2991
  Band.where(:name.exists => true).pluck(:likes)
3081
2992
  end
3082
2993
 
3083
- it "returns the duplicates" do
3084
- 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
3085
2998
  end
3086
2999
  end
3087
3000
  end
@@ -3092,8 +3005,10 @@ describe Mongoid::Criteria do
3092
3005
  Band.where(name: "New Order").pluck(:_id)
3093
3006
  end
3094
3007
 
3095
- it "returns an empty array" do
3096
- 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
3097
3012
  end
3098
3013
  end
3099
3014
 
@@ -3103,8 +3018,10 @@ describe Mongoid::Criteria do
3103
3018
  Band.all.pluck(:id)
3104
3019
  end
3105
3020
 
3106
- it "returns the field values" do
3107
- 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
3108
3025
  end
3109
3026
  end
3110
3027
 
@@ -3114,8 +3031,10 @@ describe Mongoid::Criteria do
3114
3031
  Band.all.pluck(:id, :fooz)
3115
3032
  end
3116
3033
 
3117
- it "returns nil for the field that doesnt exist" do
3118
- 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
3119
3038
  end
3120
3039
  end
3121
3040
 
@@ -3127,8 +3046,10 @@ describe Mongoid::Criteria do
3127
3046
  Band.all.pluck(:foo)
3128
3047
  end
3129
3048
 
3130
- it "returns a array with nil values" do
3131
- 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
3132
3053
  end
3133
3054
  end
3134
3055
 
@@ -3138,8 +3059,10 @@ describe Mongoid::Criteria do
3138
3059
  Band.all.pluck(:foo, :bar)
3139
3060
  end
3140
3061
 
3141
- it "returns a nil arrays" do
3142
- 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
3143
3066
  end
3144
3067
  end
3145
3068
  end
@@ -3148,10 +3071,10 @@ describe Mongoid::Criteria do
3148
3071
 
3149
3072
  before do
3150
3073
  I18n.locale = :en
3151
- d = Dictionary.create(description: 'english-text')
3074
+ d = Dictionary.create!(description: 'english-text')
3152
3075
  I18n.locale = :de
3153
3076
  d.description = 'deutsch-text'
3154
- d.save
3077
+ d.save!
3155
3078
  end
3156
3079
 
3157
3080
  after do
@@ -3159,13 +3082,48 @@ describe Mongoid::Criteria do
3159
3082
  end
3160
3083
 
3161
3084
  context 'when plucking the entire field' do
3162
-
3163
3085
  let(:plucked) do
3164
3086
  Dictionary.all.pluck(:description)
3165
3087
  end
3166
3088
 
3167
- it 'returns all translations' do
3168
- 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
3169
3127
  end
3170
3128
  end
3171
3129
 
@@ -3175,8 +3133,227 @@ describe Mongoid::Criteria do
3175
3133
  Dictionary.all.pluck(:'description.de')
3176
3134
  end
3177
3135
 
3178
- it 'returns the specific translations' do
3179
- 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)
3180
3357
  end
3181
3358
  end
3182
3359
  end
@@ -3263,11 +3440,11 @@ describe Mongoid::Criteria do
3263
3440
  describe "#sort" do
3264
3441
 
3265
3442
  let!(:depeche) do
3266
- Band.create(name: "Depeche Mode", likes: 1000)
3443
+ Band.create!(name: "Depeche Mode", likes: 1000)
3267
3444
  end
3268
3445
 
3269
3446
  let!(:tool) do
3270
- Band.create(name: "Tool", likes: 500)
3447
+ Band.create!(name: "Tool", likes: 500)
3271
3448
  end
3272
3449
 
3273
3450
  let(:sorted) do
@@ -3286,11 +3463,11 @@ describe Mongoid::Criteria do
3286
3463
  context "when provided a single field" do
3287
3464
 
3288
3465
  let!(:depeche) do
3289
- Band.create(name: "Depeche Mode", likes: 1000)
3466
+ Band.create!(name: "Depeche Mode", likes: 1000)
3290
3467
  end
3291
3468
 
3292
3469
  let!(:tool) do
3293
- Band.create(name: "Tool", likes: 500)
3470
+ Band.create!(name: "Tool", likes: 500)
3294
3471
  end
3295
3472
 
3296
3473
  let(:criteria) do
@@ -3324,7 +3501,7 @@ describe Mongoid::Criteria do
3324
3501
  describe "#to_ary" do
3325
3502
 
3326
3503
  let!(:band) do
3327
- Band.create(name: "Depeche Mode")
3504
+ Band.create!(name: "Depeche Mode")
3328
3505
  end
3329
3506
 
3330
3507
  let(:criteria) do
@@ -3340,11 +3517,11 @@ describe Mongoid::Criteria do
3340
3517
  max_server_version '4.0'
3341
3518
 
3342
3519
  let!(:band) do
3343
- Band.create(name: "Depeche Mode")
3520
+ Band.create!(name: "Depeche Mode")
3344
3521
  end
3345
3522
 
3346
3523
  let!(:band2) do
3347
- Band.create(name: "Tool")
3524
+ Band.create!(name: "Tool")
3348
3525
  end
3349
3526
 
3350
3527
  let(:criteria) do
@@ -3383,34 +3560,75 @@ describe Mongoid::Criteria do
3383
3560
  end
3384
3561
 
3385
3562
  describe "#type" do
3563
+ context "when using the default discriminator_key" do
3564
+ context "when the type is a string" do
3386
3565
 
3387
- context "when the type is a string" do
3566
+ let!(:browser) do
3567
+ Browser.create!
3568
+ end
3388
3569
 
3389
- let!(:browser) do
3390
- Browser.create
3391
- end
3570
+ let(:criteria) do
3571
+ Canvas.all.type("Browser")
3572
+ end
3392
3573
 
3393
- let(:criteria) do
3394
- Canvas.all.type("Browser")
3574
+ it "returns documents with the provided type" do
3575
+ expect(criteria).to eq([ browser ])
3576
+ end
3395
3577
  end
3396
3578
 
3397
- it "returns documents with the provided type" do
3398
- 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
3399
3592
  end
3400
3593
  end
3401
3594
 
3402
- 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
3403
3599
 
3404
- let!(:browser) do
3405
- Firefox.create
3600
+ after do
3601
+ Canvas.discriminator_key = nil
3406
3602
  end
3407
3603
 
3408
- let(:criteria) do
3409
- 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
3410
3617
  end
3411
3618
 
3412
- it "returns documents with the provided types" do
3413
- 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
3414
3632
  end
3415
3633
  end
3416
3634
  end
@@ -3418,11 +3636,43 @@ describe Mongoid::Criteria do
3418
3636
  describe "#where" do
3419
3637
 
3420
3638
  let!(:match) do
3421
- Band.create(name: "Depeche Mode")
3639
+ Band.create!(name: "Depeche Mode")
3422
3640
  end
3423
3641
 
3424
3642
  let!(:non_match) do
3425
- 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
3426
3676
  end
3427
3677
 
3428
3678
  context "when provided a string" do
@@ -3487,7 +3737,7 @@ describe Mongoid::Criteria do
3487
3737
  end
3488
3738
 
3489
3739
  let!(:band) do
3490
- Band.create(name: "Boards of Canada", sales: sales)
3740
+ Band.create!(name: "Boards of Canada", sales: sales)
3491
3741
  end
3492
3742
 
3493
3743
  let(:from_db) do
@@ -3507,7 +3757,7 @@ describe Mongoid::Criteria do
3507
3757
  end
3508
3758
 
3509
3759
  let!(:band) do
3510
- Band.create(name: "Boards of Canada", decimal: decimal)
3760
+ Band.create!(name: "Boards of Canada", decimal: decimal)
3511
3761
  end
3512
3762
 
3513
3763
  let(:from_db) do
@@ -3522,7 +3772,7 @@ describe Mongoid::Criteria do
3522
3772
  context 'when querying on a polymorphic relation' do
3523
3773
 
3524
3774
  let(:movie) do
3525
- Movie.create
3775
+ Movie.create!
3526
3776
  end
3527
3777
 
3528
3778
  let(:selector) do
@@ -3534,12 +3784,78 @@ describe Mongoid::Criteria do
3534
3784
  end
3535
3785
  end
3536
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
3537
3853
  end
3538
3854
 
3539
3855
  describe "#for_js" do
3540
3856
 
3541
3857
  let!(:match) do
3542
- Band.create(name: "Depeche Mode")
3858
+ Band.create!(name: "Depeche Mode")
3543
3859
  end
3544
3860
 
3545
3861
  context "when the code has no scope" do
@@ -3576,10 +3892,14 @@ describe Mongoid::Criteria do
3576
3892
 
3577
3893
  before do
3578
3894
  expect(Person).to receive(:minor).and_call_original
3895
+ expect(Person).to receive(:older_than).and_call_original
3579
3896
  end
3580
3897
 
3581
3898
  it "calls the method on the class" do
3582
3899
  expect(criteria.minor).to be_empty
3900
+ expect do
3901
+ criteria.older_than(age: 25)
3902
+ end.not_to raise_error
3583
3903
  end
3584
3904
  end
3585
3905
 
@@ -3622,11 +3942,11 @@ describe Mongoid::Criteria do
3622
3942
  describe "#uniq" do
3623
3943
 
3624
3944
  let!(:band_one) do
3625
- Band.create(name: "New Order")
3945
+ Band.create!(name: "New Order")
3626
3946
  end
3627
3947
 
3628
3948
  let!(:band_two) do
3629
- Band.create(name: "New Order")
3949
+ Band.create!(name: "New Order")
3630
3950
  end
3631
3951
 
3632
3952
  let(:criteria) do
@@ -3666,7 +3986,7 @@ describe Mongoid::Criteria do
3666
3986
  end
3667
3987
  end
3668
3988
 
3669
- describe "#geo_spacial" do
3989
+ describe "#geo_spatial" do
3670
3990
 
3671
3991
  context "when checking within a polygon" do
3672
3992
 
@@ -3675,11 +3995,11 @@ describe Mongoid::Criteria do
3675
3995
  end
3676
3996
 
3677
3997
  let!(:match) do
3678
- Bar.create(location: [ 52.30, 13.25 ])
3998
+ Bar.create!(location: [ 52.30, 13.25 ])
3679
3999
  end
3680
4000
 
3681
4001
  let(:criteria) do
3682
- Bar.geo_spacial(
4002
+ Bar.geo_spatial(
3683
4003
  :location.within_polygon => [[[ 50, 10 ], [ 50, 20 ], [ 60, 20 ], [ 60, 10 ], [ 50, 10 ]]]
3684
4004
  )
3685
4005
  end
@@ -3693,11 +4013,11 @@ describe Mongoid::Criteria do
3693
4013
  describe "#with_size" do
3694
4014
 
3695
4015
  let!(:match) do
3696
- Band.create(genres: [ "electro", "dub" ])
4016
+ Band.create!(genres: [ "electro", "dub" ])
3697
4017
  end
3698
4018
 
3699
4019
  let!(:non_match) do
3700
- Band.create(genres: [ "house" ])
4020
+ Band.create!(genres: [ "house" ])
3701
4021
  end
3702
4022
 
3703
4023
  let(:criteria) do
@@ -3712,7 +4032,7 @@ describe Mongoid::Criteria do
3712
4032
  describe "#with_type" do
3713
4033
 
3714
4034
  let!(:match) do
3715
- Band.create(name: "Depeche Mode")
4035
+ Band.create!(name: "Depeche Mode")
3716
4036
  end
3717
4037
 
3718
4038
  let(:criteria) do
@@ -3724,73 +4044,76 @@ describe Mongoid::Criteria do
3724
4044
  end
3725
4045
  end
3726
4046
 
3727
- 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
3728
4050
 
3729
- let!(:person) do
3730
- Person.create!(username: "davinci", age: 50, pets: false)
3731
- end
4051
+ let(:criteria) do
4052
+ described_class.new(Firefox)
4053
+ end
3732
4054
 
3733
- context "when omitting to embedded documents" do
4055
+ let(:selection) do
4056
+ criteria.send(:type_selection)
4057
+ end
3734
4058
 
3735
- context "when the embedded documents are aliased" do
4059
+ it "does not use an $in query" do
4060
+ expect(selection).to eq({ _type: "Firefox" })
4061
+ end
4062
+ end
4063
+
4064
+ context "when more than one subclass exists" do
3736
4065
 
3737
4066
  let(:criteria) do
3738
- Person.without(:phones)
4067
+ described_class.new(Browser)
3739
4068
  end
3740
4069
 
3741
- it "properly uses the database field name" do
3742
- expect(criteria.options).to eq(fields: { "mobile_phones" => 0 })
4070
+ let(:selection) do
4071
+ criteria.send(:type_selection)
3743
4072
  end
3744
- end
3745
- end
3746
-
3747
- context "when excluding id" do
3748
4073
 
3749
- let(:criteria) do
3750
- 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
3751
4077
  end
4078
+ end
3752
4079
 
3753
- it "does not raise error" do
3754
- expect {
3755
- criteria.first.id
3756
- }.to_not raise_error
4080
+ context "when using a custom discriminator_key" do
4081
+ before do
4082
+ Canvas.discriminator_key = "dkey"
3757
4083
  end
3758
4084
 
3759
- it "returns id anyway" do
3760
- expect(criteria.first.id).to_not be_nil
4085
+ after do
4086
+ Canvas.discriminator_key = nil
3761
4087
  end
3762
- end
3763
- end
3764
4088
 
3765
- describe "#type_selection" do
4089
+ context "when only one subclass exists" do
3766
4090
 
3767
- context "when only one subclass exists" do
3768
-
3769
- let(:criteria) do
3770
- described_class.new(Firefox)
3771
- end
4091
+ let(:criteria) do
4092
+ described_class.new(Firefox)
4093
+ end
3772
4094
 
3773
- let(:selection) do
3774
- criteria.send(:type_selection)
3775
- end
4095
+ let(:selection) do
4096
+ criteria.send(:type_selection)
4097
+ end
3776
4098
 
3777
- it "does not use an $in query" do
3778
- expect(selection).to eq({ _type: "Firefox" })
4099
+ it "does not use an $in query" do
4100
+ expect(selection).to eq({ dkey: "Firefox" })
4101
+ end
3779
4102
  end
3780
- end
3781
4103
 
3782
- context "when more than one subclass exists" do
4104
+ context "when more than one subclass exists" do
3783
4105
 
3784
- let(:criteria) do
3785
- described_class.new(Browser)
3786
- end
4106
+ let(:criteria) do
4107
+ described_class.new(Browser)
4108
+ end
3787
4109
 
3788
- let(:selection) do
3789
- criteria.send(:type_selection)
3790
- end
4110
+ let(:selection) do
4111
+ criteria.send(:type_selection)
4112
+ end
3791
4113
 
3792
- it "does not use an $in query" do
3793
- 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
3794
4117
  end
3795
4118
  end
3796
4119
  end