mongoid 6.4.4 → 7.5.1

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