mongoid 6.4.8 → 7.5.4

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 (1372) 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 -6
  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 +375 -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 +24 -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 +7 -10
  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 +123 -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 +295 -106
  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 +43 -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 +21 -41
  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 +101 -48
  300. data/lib/mongoid/positional.rb +3 -6
  301. data/lib/mongoid/query_cache.rb +117 -130
  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 +108 -21
  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 +30 -1
  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 +4673 -0
  456. data/spec/mongoid/association/embedded/embeds_many_models.rb +190 -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 +3803 -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 +4112 -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 +461 -34
  517. data/spec/mongoid/cacheable_spec.rb +6 -4
  518. data/spec/mongoid/changeable_spec.rb +60 -35
  519. data/spec/mongoid/clients/factory_spec.rb +98 -9
  520. data/spec/mongoid/clients/options_spec.rb +93 -60
  521. data/spec/mongoid/clients/sessions_spec.rb +34 -33
  522. data/spec/mongoid/clients/transactions_spec.rb +415 -0
  523. data/spec/mongoid/clients_spec.rb +108 -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 +357 -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 +30 -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 +1339 -184
  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 +114 -2
  578. data/spec/mongoid/criteria/queryable/smash_spec.rb +2 -0
  579. data/spec/mongoid/criteria/queryable/storable_spec.rb +298 -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 +826 -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 +60 -27
  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 +83 -19
  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 +29 -2
  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 +529 -85
  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 +75 -0
  696. data/spec/mongoid/shardable_spec.rb +251 -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 +9 -1
  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 +238 -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 +70 -83
  744. data/spec/support/authorization.rb +2 -0
  745. data/spec/support/client_registry.rb +9 -0
  746. data/spec/support/constraints.rb +27 -75
  747. data/spec/support/expectations.rb +21 -3
  748. data/spec/support/helpers.rb +11 -0
  749. data/spec/support/macros.rb +31 -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/support/models/article.rb +14 -0
  766. data/spec/support/models/artist.rb +91 -0
  767. data/spec/support/models/artwork.rb +6 -0
  768. data/spec/support/models/audible_sound.rb +3 -0
  769. data/spec/support/models/audio.rb +7 -0
  770. data/spec/support/models/augmentation.rb +13 -0
  771. data/spec/support/models/author.rb +8 -0
  772. data/spec/support/models/baby.rb +6 -0
  773. data/spec/support/models/band.rb +37 -0
  774. data/spec/support/models/bar.rb +12 -0
  775. data/spec/support/models/basic.rb +8 -0
  776. data/spec/support/models/bed.rb +3 -0
  777. data/spec/support/models/big_palette.rb +4 -0
  778. data/spec/support/models/birthday.rb +15 -0
  779. data/spec/support/models/bolt.rb +7 -0
  780. data/spec/support/models/bomb.rb +6 -0
  781. data/spec/support/models/book.rb +18 -0
  782. data/spec/support/models/breed.rb +6 -0
  783. data/spec/support/models/browser.rb +8 -0
  784. data/spec/support/models/building.rb +8 -0
  785. data/spec/support/models/building_address.rb +9 -0
  786. data/spec/support/models/bus.rb +9 -0
  787. data/spec/support/models/business.rb +7 -0
  788. data/spec/support/models/callback_test.rb +11 -0
  789. data/spec/support/models/canvas.rb +27 -0
  790. data/spec/support/models/car.rb +3 -0
  791. data/spec/support/models/cat.rb +10 -0
  792. data/spec/support/models/category.rb +10 -0
  793. data/spec/support/models/child.rb +6 -0
  794. data/spec/support/models/child_doc.rb +24 -0
  795. data/spec/support/models/church.rb +8 -0
  796. data/spec/support/models/circle.rb +5 -0
  797. data/spec/support/models/circuit.rb +6 -0
  798. data/spec/support/models/circus.rb +9 -0
  799. data/spec/support/models/code.rb +15 -0
  800. data/spec/support/models/coding/pull_request.rb +11 -0
  801. data/spec/support/models/coding.rb +3 -0
  802. data/spec/support/models/comment.rb +18 -0
  803. data/spec/support/models/company.rb +7 -0
  804. data/spec/support/models/consumption_period.rb +9 -0
  805. data/spec/support/models/contextable_item.rb +7 -0
  806. data/spec/support/models/contractor.rb +7 -0
  807. data/spec/support/models/cookie.rb +8 -0
  808. data/spec/support/models/country_code.rb +12 -0
  809. data/spec/support/models/courier_job.rb +6 -0
  810. data/spec/support/models/crate.rb +12 -0
  811. data/spec/support/models/customer.rb +10 -0
  812. data/spec/support/models/customer_address.rb +11 -0
  813. data/spec/support/models/deed.rb +7 -0
  814. data/spec/support/models/definition.rb +11 -0
  815. data/spec/support/models/delegating_patient.rb +15 -0
  816. data/spec/support/models/description.rb +13 -0
  817. data/spec/support/models/dictionary.rb +18 -0
  818. data/spec/support/models/division.rb +12 -0
  819. data/spec/support/models/doctor.rb +14 -0
  820. data/spec/support/models/dog.rb +9 -0
  821. data/spec/support/models/dokument.rb +8 -0
  822. data/spec/support/models/draft.rb +11 -0
  823. data/spec/support/models/dragon.rb +6 -0
  824. data/spec/support/models/driver.rb +9 -0
  825. data/spec/support/models/drug.rb +8 -0
  826. data/spec/support/models/dungeon.rb +6 -0
  827. data/spec/support/models/edit.rb +7 -0
  828. data/spec/support/models/email.rb +8 -0
  829. data/spec/support/models/employer.rb +7 -0
  830. data/spec/support/models/entry.rb +8 -0
  831. data/spec/support/models/eraser.rb +3 -0
  832. data/spec/support/models/even.rb +9 -0
  833. data/spec/support/models/event.rb +24 -0
  834. data/spec/support/models/exhibition.rb +6 -0
  835. data/spec/support/models/exhibitor.rb +8 -0
  836. data/spec/support/models/explosion.rb +6 -0
  837. data/spec/support/models/eye.rb +11 -0
  838. data/spec/support/models/eye_bowl.rb +11 -0
  839. data/spec/support/models/face.rb +10 -0
  840. data/spec/support/models/favorite.rb +8 -0
  841. data/spec/support/models/filesystem.rb +7 -0
  842. data/spec/support/models/fire_hydrant.rb +8 -0
  843. data/spec/support/models/firefox.rb +6 -0
  844. data/spec/support/models/fish.rb +9 -0
  845. data/spec/support/models/folder.rb +9 -0
  846. data/spec/support/models/folder_item.rb +11 -0
  847. data/spec/support/models/fruits.rb +36 -0
  848. data/spec/support/models/game.rb +21 -0
  849. data/spec/support/models/ghost.rb +9 -0
  850. data/spec/support/models/guitar.rb +4 -0
  851. data/spec/support/models/hole.rb +12 -0
  852. data/spec/support/models/home.rb +6 -0
  853. data/spec/support/models/house.rb +8 -0
  854. data/spec/support/models/html_writer.rb +5 -0
  855. data/spec/support/models/id_key.rb +8 -0
  856. data/spec/support/models/idnodef.rb +7 -0
  857. data/spec/support/models/image.rb +24 -0
  858. data/spec/support/models/implant.rb +18 -0
  859. data/spec/support/models/instrument.rb +8 -0
  860. data/spec/support/models/item.rb +10 -0
  861. data/spec/support/models/jar.rb +9 -0
  862. data/spec/support/models/kaleidoscope.rb +8 -0
  863. data/spec/support/models/kangaroo.rb +6 -0
  864. data/spec/support/models/label.rb +50 -0
  865. data/spec/support/models/language.rb +7 -0
  866. data/spec/support/models/lat_lng.rb +17 -0
  867. data/spec/support/models/league.rb +13 -0
  868. data/spec/support/models/learner.rb +4 -0
  869. data/spec/support/models/line_item.rb +8 -0
  870. data/spec/support/models/location.rb +10 -0
  871. data/spec/support/models/login.rb +10 -0
  872. data/spec/support/models/manufacturer.rb +9 -0
  873. data/spec/support/models/meat.rb +6 -0
  874. data/spec/support/models/membership.rb +7 -0
  875. data/spec/support/models/message.rb +13 -0
  876. data/spec/support/models/minim.rb +6 -0
  877. data/spec/support/models/mixed_drink.rb +6 -0
  878. data/spec/support/models/mop.rb +24 -0
  879. data/spec/support/models/movie.rb +15 -0
  880. data/spec/support/models/my_hash.rb +4 -0
  881. data/spec/support/models/name.rb +26 -0
  882. data/spec/support/models/name_only.rb +8 -0
  883. data/spec/support/models/node.rb +7 -0
  884. data/spec/support/models/note.rb +19 -0
  885. data/spec/support/models/nut.rb +7 -0
  886. data/spec/support/models/odd.rb +9 -0
  887. data/spec/support/models/order.rb +12 -0
  888. data/spec/support/models/ordered_post.rb +13 -0
  889. data/spec/support/models/ordered_preference.rb +8 -0
  890. data/spec/support/models/oscar.rb +16 -0
  891. data/spec/support/models/other_owner_object.rb +4 -0
  892. data/spec/support/models/override.rb +18 -0
  893. data/spec/support/models/ownable.rb +8 -0
  894. data/spec/support/models/owner.rb +10 -0
  895. data/spec/support/models/pack.rb +5 -0
  896. data/spec/support/models/page.rb +18 -0
  897. data/spec/support/models/page_question.rb +6 -0
  898. data/spec/support/models/palette.rb +9 -0
  899. data/spec/support/models/parent.rb +7 -0
  900. data/spec/support/models/parent_doc.rb +8 -0
  901. data/spec/support/models/passport.rb +13 -0
  902. data/spec/support/models/patient.rb +11 -0
  903. data/spec/support/models/pdf_writer.rb +5 -0
  904. data/spec/support/models/pencil.rb +3 -0
  905. data/spec/support/models/person.rb +230 -0
  906. data/spec/support/models/pet.rb +25 -0
  907. data/spec/support/models/pet_owner.rb +8 -0
  908. data/spec/support/models/phone.rb +13 -0
  909. data/spec/support/models/piano.rb +4 -0
  910. data/spec/support/models/pizza.rb +9 -0
  911. data/spec/support/models/player.rb +37 -0
  912. data/spec/support/models/post.rb +52 -0
  913. data/spec/support/models/post_genre.rb +8 -0
  914. data/spec/support/models/powerup.rb +13 -0
  915. data/spec/support/models/preference.rb +11 -0
  916. data/spec/support/models/princess.rb +12 -0
  917. data/spec/support/models/product.rb +19 -0
  918. data/spec/support/models/profile.rb +17 -0
  919. data/spec/support/models/pronunciation.rb +7 -0
  920. data/spec/support/models/pub.rb +8 -0
  921. data/spec/support/models/publication/encyclopedia.rb +11 -0
  922. data/spec/support/models/publication/review.rb +13 -0
  923. data/spec/support/models/publication.rb +4 -0
  924. data/spec/support/models/purchase.rb +6 -0
  925. data/spec/support/models/purchased_item.rb +10 -0
  926. data/spec/support/models/question.rb +10 -0
  927. data/spec/support/models/quiz.rb +9 -0
  928. data/spec/support/models/rating.rb +10 -0
  929. data/spec/support/models/record.rb +54 -0
  930. data/spec/support/models/registry.rb +6 -0
  931. data/spec/support/models/role.rb +9 -0
  932. data/spec/support/models/root_category.rb +6 -0
  933. data/spec/support/models/sandwich.rb +11 -0
  934. data/spec/support/models/scheduler.rb +9 -0
  935. data/spec/support/models/scribe.rb +7 -0
  936. data/spec/support/models/sealer.rb +7 -0
  937. data/spec/support/models/seat.rb +24 -0
  938. data/spec/support/models/seo.rb +9 -0
  939. data/spec/support/models/series.rb +7 -0
  940. data/spec/support/models/server.rb +15 -0
  941. data/spec/support/models/service.rb +24 -0
  942. data/spec/support/models/shape.rb +14 -0
  943. data/spec/support/models/shelf.rb +7 -0
  944. data/spec/support/models/shipment_address.rb +5 -0
  945. data/spec/support/models/shipping_container.rb +7 -0
  946. data/spec/support/models/shipping_pack.rb +5 -0
  947. data/spec/support/models/shirt.rb +11 -0
  948. data/spec/support/models/shop.rb +8 -0
  949. data/spec/support/models/short_agent.rb +6 -0
  950. data/spec/support/models/short_quiz.rb +7 -0
  951. data/spec/support/models/simple.rb +7 -0
  952. data/spec/support/models/slave.rb +8 -0
  953. data/spec/support/models/song.rb +10 -0
  954. data/spec/support/models/sound.rb +7 -0
  955. data/spec/support/models/spacer.rb +7 -0
  956. data/spec/support/models/square.rb +6 -0
  957. data/spec/support/models/staff.rb +9 -0
  958. data/spec/support/models/store_as_dup_test1.rb +7 -0
  959. data/spec/support/models/store_as_dup_test2.rb +7 -0
  960. data/spec/support/models/store_as_dup_test3.rb +7 -0
  961. data/spec/support/models/store_as_dup_test4.rb +7 -0
  962. data/spec/support/models/strategy.rb +5 -0
  963. data/spec/support/models/sub_item.rb +5 -0
  964. data/spec/support/models/subscription.rb +7 -0
  965. data/spec/support/models/survey.rb +7 -0
  966. data/spec/support/models/symptom.rb +8 -0
  967. data/spec/support/models/system_role.rb +7 -0
  968. data/spec/support/models/tag.rb +10 -0
  969. data/spec/support/models/target.rb +7 -0
  970. data/spec/support/models/template.rb +7 -0
  971. data/spec/support/models/thing.rb +11 -0
  972. data/spec/support/models/threadlocker.rb +7 -0
  973. data/spec/support/models/title.rb +5 -0
  974. data/spec/support/models/tool.rb +10 -0
  975. data/spec/support/models/topping.rb +7 -0
  976. data/spec/support/models/toy.rb +9 -0
  977. data/spec/support/models/track.rb +40 -0
  978. data/spec/support/models/translation.rb +7 -0
  979. data/spec/support/models/tree.rb +11 -0
  980. data/spec/support/models/truck.rb +7 -0
  981. data/spec/support/models/updatable.rb +7 -0
  982. data/spec/support/models/user.rb +23 -0
  983. data/spec/support/models/user_account.rb +12 -0
  984. data/spec/support/models/validation_callback.rb +12 -0
  985. data/spec/support/models/vehicle.rb +18 -0
  986. data/spec/support/models/version.rb +7 -0
  987. data/spec/support/models/vertex.rb +8 -0
  988. data/spec/support/models/vet_visit.rb +7 -0
  989. data/spec/support/models/video.rb +15 -0
  990. data/spec/support/models/video_game.rb +3 -0
  991. data/spec/support/models/washer.rb +7 -0
  992. data/spec/support/models/weapon.rb +13 -0
  993. data/spec/support/models/wiki_page.rb +17 -0
  994. data/spec/support/models/word.rb +17 -0
  995. data/spec/support/models/word_origin.rb +13 -0
  996. data/spec/support/models/writer.rb +13 -0
  997. data/spec/support/schema_maps/schema_map_aws.json +17 -0
  998. data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
  999. data/spec/support/schema_maps/schema_map_azure.json +17 -0
  1000. data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
  1001. data/spec/support/schema_maps/schema_map_gcp.json +17 -0
  1002. data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
  1003. data/spec/support/schema_maps/schema_map_kmip.json +17 -0
  1004. data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
  1005. data/spec/support/schema_maps/schema_map_local.json +18 -0
  1006. data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
  1007. data/spec/support/shared/time.rb +53 -0
  1008. data/spec/support/spec_config.rb +28 -6
  1009. data.tar.gz.sig +0 -0
  1010. metadata +1304 -843
  1011. metadata.gz.sig +3 -5
  1012. data/lib/mongoid/criteria/queryable/forwardable.rb +0 -65
  1013. data/lib/mongoid/matchable/all.rb +0 -27
  1014. data/lib/mongoid/matchable/and.rb +0 -30
  1015. data/lib/mongoid/matchable/default.rb +0 -72
  1016. data/lib/mongoid/matchable/elem_match.rb +0 -28
  1017. data/lib/mongoid/matchable/exists.rb +0 -23
  1018. data/lib/mongoid/matchable/gt.rb +0 -23
  1019. data/lib/mongoid/matchable/gte.rb +0 -23
  1020. data/lib/mongoid/matchable/in.rb +0 -24
  1021. data/lib/mongoid/matchable/lt.rb +0 -23
  1022. data/lib/mongoid/matchable/lte.rb +0 -23
  1023. data/lib/mongoid/matchable/ne.rb +0 -21
  1024. data/lib/mongoid/matchable/nin.rb +0 -22
  1025. data/lib/mongoid/matchable/nor.rb +0 -37
  1026. data/lib/mongoid/matchable/or.rb +0 -33
  1027. data/lib/mongoid/matchable/regexp.rb +0 -27
  1028. data/lib/mongoid/matchable/size.rb +0 -21
  1029. data/lib/mongoid/relations/accessors.rb +0 -267
  1030. data/lib/mongoid/relations/auto_save.rb +0 -94
  1031. data/lib/mongoid/relations/binding.rb +0 -218
  1032. data/lib/mongoid/relations/bindings/embedded/in.rb +0 -59
  1033. data/lib/mongoid/relations/bindings/embedded/many.rb +0 -43
  1034. data/lib/mongoid/relations/bindings/embedded/one.rb +0 -45
  1035. data/lib/mongoid/relations/bindings/referenced/in.rb +0 -65
  1036. data/lib/mongoid/relations/bindings/referenced/many.rb +0 -38
  1037. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +0 -70
  1038. data/lib/mongoid/relations/bindings/referenced/one.rb +0 -44
  1039. data/lib/mongoid/relations/bindings.rb +0 -9
  1040. data/lib/mongoid/relations/builder.rb +0 -57
  1041. data/lib/mongoid/relations/builders/embedded/in.rb +0 -29
  1042. data/lib/mongoid/relations/builders/embedded/many.rb +0 -36
  1043. data/lib/mongoid/relations/builders/embedded/one.rb +0 -30
  1044. data/lib/mongoid/relations/builders/nested_attributes/many.rb +0 -199
  1045. data/lib/mongoid/relations/builders/nested_attributes/one.rb +0 -126
  1046. data/lib/mongoid/relations/builders/referenced/in.rb +0 -26
  1047. data/lib/mongoid/relations/builders/referenced/many.rb +0 -26
  1048. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +0 -39
  1049. data/lib/mongoid/relations/builders/referenced/one.rb +0 -26
  1050. data/lib/mongoid/relations/builders.rb +0 -106
  1051. data/lib/mongoid/relations/cascading/delete.rb +0 -44
  1052. data/lib/mongoid/relations/cascading/destroy.rb +0 -43
  1053. data/lib/mongoid/relations/cascading/nullify.rb +0 -35
  1054. data/lib/mongoid/relations/cascading/restrict.rb +0 -39
  1055. data/lib/mongoid/relations/cascading.rb +0 -56
  1056. data/lib/mongoid/relations/constraint.rb +0 -55
  1057. data/lib/mongoid/relations/conversions.rb +0 -34
  1058. data/lib/mongoid/relations/counter_cache.rb +0 -160
  1059. data/lib/mongoid/relations/cyclic.rb +0 -107
  1060. data/lib/mongoid/relations/eager/base.rb +0 -153
  1061. data/lib/mongoid/relations/eager/belongs_to.rb +0 -31
  1062. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +0 -47
  1063. data/lib/mongoid/relations/eager/has_many.rb +0 -38
  1064. data/lib/mongoid/relations/eager/has_one.rb +0 -30
  1065. data/lib/mongoid/relations/eager.rb +0 -36
  1066. data/lib/mongoid/relations/embedded/batchable.rb +0 -384
  1067. data/lib/mongoid/relations/embedded/in.rb +0 -241
  1068. data/lib/mongoid/relations/embedded/many.rb +0 -683
  1069. data/lib/mongoid/relations/embedded/one.rb +0 -235
  1070. data/lib/mongoid/relations/macros.rb +0 -367
  1071. data/lib/mongoid/relations/many.rb +0 -242
  1072. data/lib/mongoid/relations/marshalable.rb +0 -32
  1073. data/lib/mongoid/relations/metadata.rb +0 -1179
  1074. data/lib/mongoid/relations/nested_builder.rb +0 -74
  1075. data/lib/mongoid/relations/one.rb +0 -60
  1076. data/lib/mongoid/relations/options.rb +0 -49
  1077. data/lib/mongoid/relations/polymorphic.rb +0 -39
  1078. data/lib/mongoid/relations/proxy.rb +0 -215
  1079. data/lib/mongoid/relations/referenced/in.rb +0 -304
  1080. data/lib/mongoid/relations/referenced/many.rb +0 -812
  1081. data/lib/mongoid/relations/referenced/many_to_many.rb +0 -479
  1082. data/lib/mongoid/relations/referenced/one.rb +0 -290
  1083. data/lib/mongoid/relations/reflections.rb +0 -64
  1084. data/lib/mongoid/relations/synchronization.rb +0 -169
  1085. data/lib/mongoid/relations/targets/enumerable.rb +0 -493
  1086. data/lib/mongoid/relations/targets.rb +0 -2
  1087. data/lib/mongoid/relations/touchable.rb +0 -97
  1088. data/lib/mongoid/relations.rb +0 -148
  1089. data/lib/support/ruby_version.rb +0 -26
  1090. data/spec/app/models/account.rb +0 -36
  1091. data/spec/app/models/acolyte.rb +0 -17
  1092. data/spec/app/models/actor.rb +0 -18
  1093. data/spec/app/models/actress.rb +0 -2
  1094. data/spec/app/models/address.rb +0 -79
  1095. data/spec/app/models/address_component.rb +0 -5
  1096. data/spec/app/models/address_number.rb +0 -6
  1097. data/spec/app/models/agency.rb +0 -5
  1098. data/spec/app/models/agent.rb +0 -16
  1099. data/spec/app/models/album.rb +0 -18
  1100. data/spec/app/models/alert.rb +0 -7
  1101. data/spec/app/models/animal.rb +0 -25
  1102. data/spec/app/models/answer.rb +0 -6
  1103. data/spec/app/models/appointment.rb +0 -7
  1104. data/spec/app/models/article.rb +0 -12
  1105. data/spec/app/models/artist.rb +0 -87
  1106. data/spec/app/models/artwork.rb +0 -4
  1107. data/spec/app/models/audio.rb +0 -5
  1108. data/spec/app/models/augmentation.rb +0 -11
  1109. data/spec/app/models/author.rb +0 -6
  1110. data/spec/app/models/baby.rb +0 -4
  1111. data/spec/app/models/band.rb +0 -31
  1112. data/spec/app/models/bar.rb +0 -10
  1113. data/spec/app/models/basic.rb +0 -6
  1114. data/spec/app/models/bed.rb +0 -1
  1115. data/spec/app/models/big_palette.rb +0 -2
  1116. data/spec/app/models/birthday.rb +0 -13
  1117. data/spec/app/models/bomb.rb +0 -4
  1118. data/spec/app/models/book.rb +0 -16
  1119. data/spec/app/models/breed.rb +0 -4
  1120. data/spec/app/models/browser.rb +0 -6
  1121. data/spec/app/models/building.rb +0 -6
  1122. data/spec/app/models/building_address.rb +0 -7
  1123. data/spec/app/models/bus.rb +0 -7
  1124. data/spec/app/models/business.rb +0 -5
  1125. data/spec/app/models/callback_test.rb +0 -9
  1126. data/spec/app/models/canvas.rb +0 -25
  1127. data/spec/app/models/car.rb +0 -1
  1128. data/spec/app/models/cat.rb +0 -8
  1129. data/spec/app/models/category.rb +0 -8
  1130. data/spec/app/models/child.rb +0 -4
  1131. data/spec/app/models/child_doc.rb +0 -22
  1132. data/spec/app/models/church.rb +0 -6
  1133. data/spec/app/models/circle.rb +0 -3
  1134. data/spec/app/models/circuit.rb +0 -4
  1135. data/spec/app/models/circus.rb +0 -7
  1136. data/spec/app/models/code.rb +0 -11
  1137. data/spec/app/models/comment.rb +0 -16
  1138. data/spec/app/models/company.rb +0 -5
  1139. data/spec/app/models/consumption_period.rb +0 -7
  1140. data/spec/app/models/contextable_item.rb +0 -5
  1141. data/spec/app/models/contractor.rb +0 -5
  1142. data/spec/app/models/cookie.rb +0 -6
  1143. data/spec/app/models/country_code.rb +0 -8
  1144. data/spec/app/models/courier_job.rb +0 -4
  1145. data/spec/app/models/definition.rb +0 -9
  1146. data/spec/app/models/delegating_patient.rb +0 -16
  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
  1370. data/spec/support/cluster_config.rb +0 -158
  1371. data/spec/support/session_registry.rb +0 -50
  1372. /data/spec/{app → support}/models/array_field.rb +0 -0
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "spec_helper"
2
4
 
3
5
  describe Mongoid::Criteria do
@@ -38,7 +40,7 @@ describe Mongoid::Criteria do
38
40
  context "when the entries are the same" do
39
41
 
40
42
  let!(:band) do
41
- Band.create(name: "Depeche Mode")
43
+ Band.create!(name: "Depeche Mode")
42
44
  end
43
45
 
44
46
  let(:other) do
@@ -53,11 +55,11 @@ describe Mongoid::Criteria do
53
55
  context "when the entries are not the same" do
54
56
 
55
57
  let!(:band) do
56
- Band.create(name: "Depeche Mode")
58
+ Band.create!(name: "Depeche Mode")
57
59
  end
58
60
 
59
61
  let!(:other_band) do
60
- Band.create(name: "Tool")
62
+ Band.create!(name: "Tool")
61
63
  end
62
64
 
63
65
  let(:other) do
@@ -102,21 +104,21 @@ describe Mongoid::Criteria do
102
104
  describe "#asc" do
103
105
 
104
106
  let(:person) do
105
- Person.create
107
+ Person.create!
106
108
  end
107
109
 
108
110
  context "when the documents are embedded" do
109
111
 
110
112
  let!(:hobrecht) do
111
- person.addresses.create(street: "hobrecht", name: "hobrecht")
113
+ person.addresses.create!(street: "hobrecht", name: "hobrecht")
112
114
  end
113
115
 
114
116
  let!(:friedel) do
115
- person.addresses.create(street: "friedel", name: "friedel")
117
+ person.addresses.create!(street: "friedel", name: "friedel")
116
118
  end
117
119
 
118
120
  let!(:pfluger) do
119
- person.addresses.create(street: "pfluger", name: "pfluger")
121
+ person.addresses.create!(street: "pfluger", name: "pfluger")
120
122
  end
121
123
 
122
124
  let(:criteria) do
@@ -132,7 +134,7 @@ describe Mongoid::Criteria do
132
134
  describe "#batch_size" do
133
135
 
134
136
  let(:person) do
135
- Person.create
137
+ Person.create!
136
138
  end
137
139
 
138
140
  let(:criteria) do
@@ -151,7 +153,7 @@ describe Mongoid::Criteria do
151
153
  describe "#read" do
152
154
 
153
155
  let(:person) do
154
- Person.create
156
+ Person.create!
155
157
  end
156
158
 
157
159
  let(:criteria) do
@@ -168,11 +170,11 @@ describe Mongoid::Criteria do
168
170
  context "when provided a single field" do
169
171
 
170
172
  let!(:depeche) do
171
- Band.create(name: "Depeche Mode", likes: 1000)
173
+ Band.create!(name: "Depeche Mode", likes: 1000)
172
174
  end
173
175
 
174
176
  let!(:tool) do
175
- Band.create(name: "Tool", likes: 500)
177
+ Band.create!(name: "Tool", likes: 500)
176
178
  end
177
179
 
178
180
  let(:criteria) do
@@ -210,11 +212,11 @@ describe Mongoid::Criteria do
210
212
  context "when provided a single field" do
211
213
 
212
214
  let!(:depeche) do
213
- Band.create(name: "Depeche Mode", likes: 1000)
215
+ Band.create!(name: "Depeche Mode", likes: 1000)
214
216
  end
215
217
 
216
218
  let!(:tool) do
217
- Band.create(name: "Tool", likes: 500)
219
+ Band.create!(name: "Tool", likes: 500)
218
220
  end
219
221
 
220
222
  let(:criteria) do
@@ -236,11 +238,11 @@ describe Mongoid::Criteria do
236
238
  describe "\##{method}" do
237
239
 
238
240
  let!(:match) do
239
- Band.create(genres: [ "electro", "dub" ])
241
+ Band.create!(genres: [ "electro", "dub" ])
240
242
  end
241
243
 
242
244
  let!(:non_match) do
243
- Band.create(genres: [ "house" ])
245
+ Band.create!(genres: [ "house" ])
244
246
  end
245
247
 
246
248
  let(:criteria) do
@@ -258,11 +260,11 @@ describe Mongoid::Criteria do
258
260
  describe "\##{method}" do
259
261
 
260
262
  let!(:match) do
261
- Band.create(name: "Depeche Mode", genres: [ "electro" ])
263
+ Band.create!(name: "Depeche Mode", genres: [ "electro" ])
262
264
  end
263
265
 
264
266
  let!(:non_match) do
265
- Band.create(genres: [ "house" ])
267
+ Band.create!(genres: [ "house" ])
266
268
  end
267
269
 
268
270
  let(:criteria) do
@@ -278,26 +280,41 @@ describe Mongoid::Criteria do
278
280
  describe "#as_json" do
279
281
 
280
282
  let!(:band) do
281
- Band.create(name: "Depeche Mode")
283
+ Band.create!(name: "Depeche Mode")
282
284
  end
283
285
 
284
286
  let(:criteria) do
285
287
  Band.where(name: "Depeche Mode")
286
288
  end
287
289
 
288
- it "returns the criteria as a json hash" do
289
- expect(criteria.as_json).to eq([ band.serializable_hash ])
290
+ # as_json changed in rails 6 to call as_json on serializable_hash.
291
+ # https://github.com/rails/rails/commit/2e5cb980a448e7f4ab00df6e9ad4c1cc456616aa
292
+
293
+ context 'rails < 6' do
294
+ max_rails_version '5.2'
295
+
296
+ it "returns the criteria as a json hash" do
297
+ expect(criteria.as_json).to eq([ band.serializable_hash ])
298
+ end
299
+ end
300
+
301
+ context 'rails >= 6' do
302
+ min_rails_version '6.0'
303
+
304
+ it "returns the criteria as a json hash" do
305
+ expect(criteria.as_json).to eq([ band.serializable_hash.as_json ])
306
+ end
290
307
  end
291
308
  end
292
309
 
293
310
  describe "#between" do
294
311
 
295
312
  let!(:match) do
296
- Band.create(member_count: 3)
313
+ Band.create!(member_count: 3)
297
314
  end
298
315
 
299
316
  let!(:non_match) do
300
- Band.create(member_count: 10)
317
+ Band.create!(member_count: 10)
301
318
  end
302
319
 
303
320
  let(:criteria) do
@@ -363,7 +380,7 @@ describe Mongoid::Criteria do
363
380
  describe "#cache" do
364
381
 
365
382
  let!(:person) do
366
- Person.create
383
+ Person.create!
367
384
  end
368
385
 
369
386
  context "when no eager loading is involved" do
@@ -515,11 +532,11 @@ describe Mongoid::Criteria do
515
532
  describe "#delete" do
516
533
 
517
534
  let(:depeche) do
518
- Band.create(name: "Depeche Mode")
535
+ Band.create!(name: "Depeche Mode")
519
536
  end
520
537
 
521
538
  let(:tool) do
522
- Band.create(name: "Tool")
539
+ Band.create!(name: "Tool")
523
540
  end
524
541
 
525
542
  context "when no selector is provided" do
@@ -573,7 +590,7 @@ describe Mongoid::Criteria do
573
590
  describe "#each" do
574
591
 
575
592
  let!(:band) do
576
- Band.create(name: "Depeche Mode")
593
+ Band.create!(name: "Depeche Mode")
577
594
  end
578
595
 
579
596
  context "when provided a block" do
@@ -593,14 +610,14 @@ describe Mongoid::Criteria do
593
610
  describe "#elem_match" do
594
611
 
595
612
  let!(:match) do
596
- Band.create(name: "Depeche Mode").tap do |band|
613
+ Band.create!(name: "Depeche Mode").tap do |band|
597
614
  r = band.records
598
- r.create(name: "101")
615
+ r.create!(name: "101")
599
616
  end
600
617
  end
601
618
 
602
619
  let!(:non_match) do
603
- Band.create(genres: [ "house" ])
620
+ Band.create!(genres: [ "house" ])
604
621
  end
605
622
 
606
623
  let(:criteria) do
@@ -646,7 +663,7 @@ describe Mongoid::Criteria do
646
663
  context "when matching documents exist" do
647
664
 
648
665
  let!(:match) do
649
- Band.create(name: "Depeche Mode")
666
+ Band.create!(name: "Depeche Mode")
650
667
  end
651
668
 
652
669
  let(:criteria) do
@@ -661,7 +678,7 @@ describe Mongoid::Criteria do
661
678
  context "when no matching documents exist" do
662
679
 
663
680
  let!(:nonmatch) do
664
- Band.create(name: "New Order")
681
+ Band.create!(name: "New Order")
665
682
  end
666
683
 
667
684
  let(:criteria) do
@@ -677,11 +694,11 @@ describe Mongoid::Criteria do
677
694
  describe "#exists" do
678
695
 
679
696
  let!(:match) do
680
- Band.create(name: "Depeche Mode")
697
+ Band.create!(name: "Depeche Mode")
681
698
  end
682
699
 
683
700
  let!(:non_match) do
684
- Band.create
701
+ Band.create!
685
702
  end
686
703
 
687
704
  let(:criteria) do
@@ -698,7 +715,7 @@ describe Mongoid::Criteria do
698
715
  context "when matching documents exist" do
699
716
 
700
717
  let!(:match) do
701
- Band.create(name: "Depeche Mode")
718
+ Band.create!(name: "Depeche Mode")
702
719
  end
703
720
 
704
721
  let(:criteria) do
@@ -768,23 +785,83 @@ describe Mongoid::Criteria do
768
785
 
769
786
  describe "#field_list" do
770
787
 
788
+ context "when using the default discriminator key" do
789
+ let(:criteria) do
790
+ Doctor.only(:_id)
791
+ end
792
+
793
+ it "returns the fields with required _id minus type" do
794
+ expect(criteria.field_list).to eq([ "_id" ])
795
+ end
796
+ end
797
+
798
+ context "when using a custom discriminator key" do
799
+ before do
800
+ Person.discriminator_key = "dkey"
801
+ end
802
+
803
+ after do
804
+ Person.discriminator_key = nil
805
+ end
806
+
807
+ let(:criteria) do
808
+ Doctor.only(:_id, :_type)
809
+ end
810
+
811
+ it "returns the fields with type without dkey" do
812
+ expect(criteria.field_list).to eq([ "_id", "_type" ])
813
+ end
814
+ end
815
+ end
816
+
817
+ describe "#find" do
818
+ let!(:depeche) do
819
+ Band.create!(name: "Depeche Mode")
820
+ end
821
+
771
822
  let(:criteria) do
772
- Band.only(:name)
823
+ Band.where(name: "Depeche Mode")
824
+ end
825
+
826
+ context "when given a block" do
827
+ it "behaves as Enumerable" do
828
+ result = criteria.find { |c| c.name == "Depeche Mode" }
829
+ expect(result).to eq(depeche)
830
+ end
831
+ end
832
+
833
+ context "when given a Proc and a block" do
834
+ it "behaves as Enumerable" do
835
+ result = criteria.find(-> {"default"}) { |c| c.name == "Not Depeche Mode" }
836
+ expect(result).to eq("default")
837
+ end
838
+ end
839
+
840
+ context "when given a Proc" do
841
+ it "behaves as Enumerable" do
842
+ lambda do
843
+ criteria.find(-> {"default"})
844
+ # Proc is not serializable to a BSON type
845
+ end.should raise_error(BSON::Error::UnserializableClass)
846
+ end
773
847
  end
774
848
 
775
- it "returns the fields with required _id minus type" do
776
- expect(criteria.field_list).to eq([ "_id", "name" ])
849
+ context "when given an id" do
850
+ it "behaves as Findable" do
851
+ result = criteria.find(depeche.id)
852
+ expect(result).to eq(depeche)
853
+ end
777
854
  end
778
855
  end
779
856
 
780
857
  describe "#find_one_and_update" do
781
858
 
782
859
  let!(:depeche) do
783
- Band.create(name: "Depeche Mode")
860
+ Band.create!(name: "Depeche Mode")
784
861
  end
785
862
 
786
863
  let!(:tool) do
787
- Band.create(name: "Tool")
864
+ Band.create!(name: "Tool")
788
865
  end
789
866
 
790
867
  context "when the selector matches" do
@@ -982,7 +1059,7 @@ describe Mongoid::Criteria do
982
1059
  end
983
1060
 
984
1061
  let!(:match) do
985
- Bar.create(location: [ 52.30, 13.25 ])
1062
+ Bar.create!(location: [ 52.30, 13.25 ])
986
1063
  end
987
1064
 
988
1065
  let(:criteria) do
@@ -994,7 +1071,7 @@ describe Mongoid::Criteria do
994
1071
  end
995
1072
  end
996
1073
 
997
- describe "#gt" do
1074
+ describe "#eq" do
998
1075
 
999
1076
  let!(:match) do
1000
1077
  Band.create(member_count: 5)
@@ -1004,6 +1081,25 @@ describe Mongoid::Criteria do
1004
1081
  Band.create(member_count: 1)
1005
1082
  end
1006
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
+
1007
1103
  let(:criteria) do
1008
1104
  Band.gt(member_count: 4)
1009
1105
  end
@@ -1016,11 +1112,11 @@ describe Mongoid::Criteria do
1016
1112
  describe "#gte" do
1017
1113
 
1018
1114
  let!(:match) do
1019
- Band.create(member_count: 5)
1115
+ Band.create!(member_count: 5)
1020
1116
  end
1021
1117
 
1022
1118
  let!(:non_match) do
1023
- Band.create(member_count: 1)
1119
+ Band.create!(member_count: 1)
1024
1120
  end
1025
1121
 
1026
1122
  let(:criteria) do
@@ -1039,11 +1135,11 @@ describe Mongoid::Criteria do
1039
1135
  context "when querying on a normal field" do
1040
1136
 
1041
1137
  let!(:match) do
1042
- Band.create(genres: [ "electro", "dub" ])
1138
+ Band.create!(genres: [ "electro", "dub" ])
1043
1139
  end
1044
1140
 
1045
1141
  let!(:non_match) do
1046
- Band.create(genres: [ "house" ])
1142
+ Band.create!(genres: [ "house" ])
1047
1143
  end
1048
1144
 
1049
1145
  let(:criteria) do
@@ -1062,7 +1158,7 @@ describe Mongoid::Criteria do
1062
1158
  end
1063
1159
 
1064
1160
  let!(:match_one) do
1065
- Person.create(preference_ids: [ id ])
1161
+ Person.create!(preference_ids: [ id ])
1066
1162
  end
1067
1163
 
1068
1164
  context "when providing valid ids" do
@@ -1103,7 +1199,7 @@ describe Mongoid::Criteria do
1103
1199
  context "when the relation is a one to one" do
1104
1200
 
1105
1201
  let!(:game) do
1106
- Game.create
1202
+ Game.create!
1107
1203
  end
1108
1204
 
1109
1205
  let(:criteria) do
@@ -1141,7 +1237,7 @@ describe Mongoid::Criteria do
1141
1237
  describe "#includes" do
1142
1238
 
1143
1239
  let!(:person) do
1144
- Person.create(age: 1)
1240
+ Person.create!(age: 1)
1145
1241
  end
1146
1242
 
1147
1243
  context "when providing a name that is not a relation" do
@@ -1156,11 +1252,11 @@ describe Mongoid::Criteria do
1156
1252
  context "when providing one association" do
1157
1253
 
1158
1254
  let!(:user) do
1159
- User.create(posts: [ post1 ])
1255
+ User.create!(posts: [ post1 ])
1160
1256
  end
1161
1257
 
1162
1258
  let!(:post1) do
1163
- Post.create
1259
+ Post.create!
1164
1260
  end
1165
1261
 
1166
1262
  let(:result) do
@@ -1179,15 +1275,15 @@ describe Mongoid::Criteria do
1179
1275
  context "when providing a list of associations" do
1180
1276
 
1181
1277
  let!(:user) do
1182
- User.create(posts: [ post1 ], descriptions: [ description1 ])
1278
+ User.create!(posts: [ post1 ], descriptions: [ description1 ])
1183
1279
  end
1184
1280
 
1185
1281
  let!(:post1) do
1186
- Post.create
1282
+ Post.create!
1187
1283
  end
1188
1284
 
1189
1285
  let!(:description1) do
1190
- Description.create(details: 1)
1286
+ Description.create!(details: 1)
1191
1287
  end
1192
1288
 
1193
1289
  let(:result) do
@@ -1207,13 +1303,13 @@ describe Mongoid::Criteria do
1207
1303
  context "when providing a nested association" do
1208
1304
 
1209
1305
  let!(:user) do
1210
- User.create
1306
+ User.create!
1211
1307
  end
1212
1308
 
1213
1309
  before do
1214
- p = Post.create(alerts: [ Alert.create ])
1310
+ p = Post.create!(alerts: [ Alert.create! ])
1215
1311
  user.posts = [ p ]
1216
- user.save
1312
+ user.save!
1217
1313
  end
1218
1314
 
1219
1315
  let(:result) do
@@ -1233,7 +1329,7 @@ describe Mongoid::Criteria do
1233
1329
  context "when providing a deeply nested association" do
1234
1330
 
1235
1331
  let!(:user) do
1236
- User.create
1332
+ User.create!
1237
1333
  end
1238
1334
 
1239
1335
  let(:results) do
@@ -1271,15 +1367,15 @@ describe Mongoid::Criteria do
1271
1367
  context "when the includes is on the subclass" do
1272
1368
 
1273
1369
  let!(:c_one) do
1274
- C.create
1370
+ C.create!
1275
1371
  end
1276
1372
 
1277
1373
  let!(:c_two) do
1278
- C.create
1374
+ C.create!
1279
1375
  end
1280
1376
 
1281
1377
  let!(:b) do
1282
- B.create(c: c_two)
1378
+ B.create!(c: c_two)
1283
1379
  end
1284
1380
 
1285
1381
  let!(:results) do
@@ -1334,19 +1430,19 @@ describe Mongoid::Criteria do
1334
1430
  context "when the includes is on the several relations" do
1335
1431
 
1336
1432
  let!(:d_one) do
1337
- D.create
1433
+ D.create!
1338
1434
  end
1339
1435
 
1340
1436
  let!(:d_two) do
1341
- D.create
1437
+ D.create!
1342
1438
  end
1343
1439
 
1344
1440
  let!(:b) do
1345
- B.create(d: d_two)
1441
+ B.create!(d: d_two)
1346
1442
  end
1347
1443
 
1348
1444
  let!(:c) do
1349
- C.create(d: d_two)
1445
+ C.create!(d: d_two)
1350
1446
  end
1351
1447
 
1352
1448
  let!(:results) do
@@ -1405,19 +1501,19 @@ describe Mongoid::Criteria do
1405
1501
  context "when the includes is on the several relations" do
1406
1502
 
1407
1503
  let!(:d_one) do
1408
- D.create
1504
+ D.create!
1409
1505
  end
1410
1506
 
1411
1507
  let!(:d_two) do
1412
- D.create
1508
+ D.create!
1413
1509
  end
1414
1510
 
1415
1511
  let!(:bs) do
1416
- 2.times.map { B.create(d: d_two) }
1512
+ 2.times.map { B.create!(d: d_two) }
1417
1513
  end
1418
1514
 
1419
1515
  let!(:cs) do
1420
- 2.times.map { C.create(d: d_two) }
1516
+ 2.times.map { C.create!(d: d_two) }
1421
1517
  end
1422
1518
 
1423
1519
  let!(:results) do
@@ -1445,25 +1541,25 @@ describe Mongoid::Criteria do
1445
1541
  end
1446
1542
  end
1447
1543
 
1448
- context "when including the same metadata multiple times" do
1544
+ context "when including the same association multiple times" do
1449
1545
 
1450
1546
  let(:criteria) do
1451
1547
  Person.all.includes(:posts, :posts).includes(:posts)
1452
1548
  end
1453
1549
 
1454
- let(:metadata) do
1550
+ let(:association) do
1455
1551
  Person.reflect_on_association(:posts)
1456
1552
  end
1457
1553
 
1458
- it "does not duplicate the metadata in the inclusions" do
1459
- expect(criteria.inclusions).to eq([ metadata ])
1554
+ it "does not duplicate the association in the inclusions" do
1555
+ expect(criteria.inclusions).to eq([ association ])
1460
1556
  end
1461
1557
  end
1462
1558
 
1463
1559
  context "when mapping the results more than once" do
1464
1560
 
1465
1561
  let!(:post) do
1466
- person.posts.create(title: "one")
1562
+ person.posts.create!(title: "one")
1467
1563
  end
1468
1564
 
1469
1565
  let(:criteria) do
@@ -1485,15 +1581,15 @@ describe Mongoid::Criteria do
1485
1581
  context "when the criteria is from the root" do
1486
1582
 
1487
1583
  let!(:person_two) do
1488
- Person.create(age: 2)
1584
+ Person.create!(age: 2)
1489
1585
  end
1490
1586
 
1491
1587
  let!(:post_one) do
1492
- person.posts.create(title: "one")
1588
+ person.posts.create!(title: "one")
1493
1589
  end
1494
1590
 
1495
1591
  let!(:post_two) do
1496
- person_two.posts.create(title: "two")
1592
+ person_two.posts.create!(title: "two")
1497
1593
  end
1498
1594
 
1499
1595
  context "when calling first" do
@@ -1542,15 +1638,15 @@ describe Mongoid::Criteria do
1542
1638
  context "when the criteria is from an embedded relation" do
1543
1639
 
1544
1640
  let(:peep) do
1545
- Person.create
1641
+ Person.create!
1546
1642
  end
1547
1643
 
1548
1644
  let!(:address_one) do
1549
- peep.addresses.create(street: "rosenthaler")
1645
+ peep.addresses.create!(street: "rosenthaler")
1550
1646
  end
1551
1647
 
1552
1648
  let!(:address_two) do
1553
- peep.addresses.create(street: "weinmeister")
1649
+ peep.addresses.create!(street: "weinmeister")
1554
1650
  end
1555
1651
 
1556
1652
  let!(:depeche) do
@@ -1564,8 +1660,8 @@ describe Mongoid::Criteria do
1564
1660
  before do
1565
1661
  address_one.band = depeche
1566
1662
  address_two.band = tool
1567
- address_one.save
1568
- address_two.save
1663
+ address_one.save!
1664
+ address_two.save!
1569
1665
  end
1570
1666
 
1571
1667
  context "when calling first" do
@@ -1662,11 +1758,11 @@ describe Mongoid::Criteria do
1662
1758
  end
1663
1759
 
1664
1760
  let!(:post_one) do
1665
- person.posts.create(title: "one")
1761
+ person.posts.create!(title: "one")
1666
1762
  end
1667
1763
 
1668
1764
  let!(:post_two) do
1669
- person.posts.create(title: "two")
1765
+ person.posts.create!(title: "two")
1670
1766
  end
1671
1767
 
1672
1768
  context "when the criteria has no options" do
@@ -1784,11 +1880,11 @@ describe Mongoid::Criteria do
1784
1880
  context "when the criteria has limiting options" do
1785
1881
 
1786
1882
  let!(:person_two) do
1787
- Person.create
1883
+ Person.create!
1788
1884
  end
1789
1885
 
1790
1886
  let!(:post_three) do
1791
- person_two.posts.create(title: "three")
1887
+ person_two.posts.create!(title: "three")
1792
1888
  end
1793
1889
 
1794
1890
  let!(:criteria) do
@@ -1820,11 +1916,11 @@ describe Mongoid::Criteria do
1820
1916
  context "when including a has and belongs to many" do
1821
1917
 
1822
1918
  let!(:preference_one) do
1823
- person.preferences.create(name: "one")
1919
+ person.preferences.create!(name: "one")
1824
1920
  end
1825
1921
 
1826
1922
  let!(:preference_two) do
1827
- person.preferences.create(name: "two")
1923
+ person.preferences.create!(name: "two")
1828
1924
  end
1829
1925
 
1830
1926
  context "when one of the related items is deleted" do
@@ -1928,11 +2024,11 @@ describe Mongoid::Criteria do
1928
2024
  context "when including a has many" do
1929
2025
 
1930
2026
  let!(:post_one) do
1931
- person.posts.create(title: "one")
2027
+ person.posts.create!(title: "one")
1932
2028
  end
1933
2029
 
1934
2030
  let!(:post_two) do
1935
- person.posts.create(title: "two")
2031
+ person.posts.create!(title: "two")
1936
2032
  end
1937
2033
 
1938
2034
  context "when the criteria has no options" do
@@ -2017,11 +2113,11 @@ describe Mongoid::Criteria do
2017
2113
  context "when the criteria has limiting options" do
2018
2114
 
2019
2115
  let!(:person_two) do
2020
- Person.create
2116
+ Person.create!
2021
2117
  end
2022
2118
 
2023
2119
  let!(:post_three) do
2024
- person_two.posts.create(title: "three")
2120
+ person_two.posts.create!(title: "three")
2025
2121
  end
2026
2122
 
2027
2123
  let!(:criteria) do
@@ -2082,7 +2178,7 @@ describe Mongoid::Criteria do
2082
2178
  context "when the criteria has limiting options" do
2083
2179
 
2084
2180
  let!(:person_two) do
2085
- Person.create(age: 2)
2181
+ Person.create!(age: 2)
2086
2182
  end
2087
2183
 
2088
2184
  let!(:game_three) do
@@ -2114,7 +2210,7 @@ describe Mongoid::Criteria do
2114
2210
  context "when including a belongs to" do
2115
2211
 
2116
2212
  let(:person_two) do
2117
- Person.create(age: 2)
2213
+ Person.create!(age: 2)
2118
2214
  end
2119
2215
 
2120
2216
  let!(:game_one) do
@@ -2175,11 +2271,11 @@ describe Mongoid::Criteria do
2175
2271
  context "when including multiples in the same criteria" do
2176
2272
 
2177
2273
  let!(:post_one) do
2178
- person.posts.create(title: "one")
2274
+ person.posts.create!(title: "one")
2179
2275
  end
2180
2276
 
2181
2277
  let!(:post_two) do
2182
- person.posts.create(title: "two")
2278
+ person.posts.create!(title: "two")
2183
2279
  end
2184
2280
 
2185
2281
  let!(:game_one) do
@@ -2218,12 +2314,12 @@ describe Mongoid::Criteria do
2218
2314
  Band.includes(:records)
2219
2315
  end
2220
2316
 
2221
- let(:metadata) do
2317
+ let(:association) do
2222
2318
  Band.relations["records"]
2223
2319
  end
2224
2320
 
2225
2321
  it "returns the inclusions" do
2226
- expect(criteria.inclusions).to eq([ metadata ])
2322
+ expect(criteria.inclusions).to eq([ association ])
2227
2323
  end
2228
2324
  end
2229
2325
 
@@ -2233,27 +2329,27 @@ describe Mongoid::Criteria do
2233
2329
  Band.all
2234
2330
  end
2235
2331
 
2236
- let(:metadata) do
2332
+ let(:association) do
2237
2333
  Band.relations["records"]
2238
2334
  end
2239
2335
 
2240
2336
  before do
2241
- criteria.inclusions = [ metadata ]
2337
+ criteria.inclusions = [ association ]
2242
2338
  end
2243
2339
 
2244
2340
  it "sets the inclusions" do
2245
- expect(criteria.inclusions).to eq([ metadata ])
2341
+ expect(criteria.inclusions).to eq([ association ])
2246
2342
  end
2247
2343
  end
2248
2344
 
2249
2345
  describe "#lt" do
2250
2346
 
2251
2347
  let!(:match) do
2252
- Band.create(member_count: 1)
2348
+ Band.create!(member_count: 1)
2253
2349
  end
2254
2350
 
2255
2351
  let!(:non_match) do
2256
- Band.create(member_count: 5)
2352
+ Band.create!(member_count: 5)
2257
2353
  end
2258
2354
 
2259
2355
  let(:criteria) do
@@ -2268,11 +2364,11 @@ describe Mongoid::Criteria do
2268
2364
  describe "#lte" do
2269
2365
 
2270
2366
  let!(:match) do
2271
- Band.create(member_count: 4)
2367
+ Band.create!(member_count: 4)
2272
2368
  end
2273
2369
 
2274
2370
  let!(:non_match) do
2275
- Band.create(member_count: 5)
2371
+ Band.create!(member_count: 5)
2276
2372
  end
2277
2373
 
2278
2374
  let(:criteria) do
@@ -2305,11 +2401,11 @@ describe Mongoid::Criteria do
2305
2401
  end
2306
2402
 
2307
2403
  let!(:depeche_mode) do
2308
- Band.create(name: "Depeche Mode", likes: 200)
2404
+ Band.create!(name: "Depeche Mode", likes: 200)
2309
2405
  end
2310
2406
 
2311
2407
  let!(:tool) do
2312
- Band.create(name: "Tool", likes: 100)
2408
+ Band.create!(name: "Tool", likes: 100)
2313
2409
  end
2314
2410
 
2315
2411
  context "when no timeout options are provided" do
@@ -2319,7 +2415,7 @@ describe Mongoid::Criteria do
2319
2415
  end
2320
2416
 
2321
2417
  it "returns the map/reduce results" do
2322
- expect(map_reduce).to eq([
2418
+ expect(map_reduce.sort_by { |doc| doc['_id'] }).to eq([
2323
2419
  { "_id" => "Depeche Mode", "value" => { "likes" => 200 }},
2324
2420
  { "_id" => "Tool", "value" => { "likes" => 100 }}
2325
2421
  ])
@@ -2332,11 +2428,11 @@ describe Mongoid::Criteria do
2332
2428
  context "when provided a single field" do
2333
2429
 
2334
2430
  let!(:depeche) do
2335
- Band.create(name: "Depeche Mode", likes: 1000)
2431
+ Band.create!(name: "Depeche Mode", likes: 1000)
2336
2432
  end
2337
2433
 
2338
2434
  let!(:tool) do
2339
- Band.create(name: "Tool", likes: 500)
2435
+ Band.create!(name: "Tool", likes: 500)
2340
2436
  end
2341
2437
 
2342
2438
  let(:criteria) do
@@ -2376,11 +2472,11 @@ describe Mongoid::Criteria do
2376
2472
  end
2377
2473
 
2378
2474
  let!(:match) do
2379
- Bar.create(location: [ 52.30, 13.25 ])
2475
+ Bar.create!(location: [ 52.30, 13.25 ])
2380
2476
  end
2381
2477
 
2382
2478
  let!(:non_match) do
2383
- Bar.create(location: [ 19.26, 99.70 ])
2479
+ Bar.create!(location: [ 19.26, 99.70 ])
2384
2480
  end
2385
2481
 
2386
2482
  let(:criteria) do
@@ -2410,7 +2506,7 @@ describe Mongoid::Criteria do
2410
2506
  end
2411
2507
  end
2412
2508
 
2413
- let(:metadata) do
2509
+ let(:association) do
2414
2510
  Band.relations["records"]
2415
2511
  end
2416
2512
 
@@ -2435,7 +2531,7 @@ describe Mongoid::Criteria do
2435
2531
  end
2436
2532
 
2437
2533
  it "merges the inclusions" do
2438
- expect(merged.inclusions).to eq([ metadata ])
2534
+ expect(merged.inclusions).to eq([ association ])
2439
2535
  end
2440
2536
 
2441
2537
  it "returns a new criteria" do
@@ -2449,7 +2545,7 @@ describe Mongoid::Criteria do
2449
2545
  { klass: Band, includes: [ :records ] }
2450
2546
  end
2451
2547
 
2452
- let(:metadata) do
2548
+ let(:association) do
2453
2549
  Band.relations["records"]
2454
2550
  end
2455
2551
 
@@ -2470,7 +2566,7 @@ describe Mongoid::Criteria do
2470
2566
  end
2471
2567
 
2472
2568
  it "merges the inclusions" do
2473
- expect(merged.inclusions).to eq([ metadata ])
2569
+ expect(merged.inclusions).to eq([ association ])
2474
2570
  end
2475
2571
 
2476
2572
  it "returns a new criteria" do
@@ -2495,7 +2591,7 @@ describe Mongoid::Criteria do
2495
2591
  end
2496
2592
  end
2497
2593
 
2498
- let(:metadata) do
2594
+ let(:association) do
2499
2595
  Band.relations["records"]
2500
2596
  end
2501
2597
 
@@ -2520,7 +2616,7 @@ describe Mongoid::Criteria do
2520
2616
  end
2521
2617
 
2522
2618
  it "merges the inclusions" do
2523
- expect(merged.inclusions).to eq([ metadata ])
2619
+ expect(merged.inclusions).to eq([ association ])
2524
2620
  end
2525
2621
 
2526
2622
  it "returns the same criteria" do
@@ -2533,11 +2629,11 @@ describe Mongoid::Criteria do
2533
2629
  context "when provided a single field" do
2534
2630
 
2535
2631
  let!(:depeche) do
2536
- Band.create(name: "Depeche Mode", likes: 1000)
2632
+ Band.create!(name: "Depeche Mode", likes: 1000)
2537
2633
  end
2538
2634
 
2539
2635
  let!(:tool) do
2540
- Band.create(name: "Tool", likes: 500)
2636
+ Band.create!(name: "Tool", likes: 500)
2541
2637
  end
2542
2638
 
2543
2639
  let(:criteria) do
@@ -2573,11 +2669,11 @@ describe Mongoid::Criteria do
2573
2669
  describe "#mod" do
2574
2670
 
2575
2671
  let!(:match) do
2576
- Band.create(member_count: 5)
2672
+ Band.create!(member_count: 5)
2577
2673
  end
2578
2674
 
2579
2675
  let!(:non_match) do
2580
- Band.create(member_count: 2)
2676
+ Band.create!(member_count: 2)
2581
2677
  end
2582
2678
 
2583
2679
  let(:criteria) do
@@ -2592,11 +2688,11 @@ describe Mongoid::Criteria do
2592
2688
  describe "#ne" do
2593
2689
 
2594
2690
  let!(:match) do
2595
- Band.create(name: "Depeche Mode")
2691
+ Band.create!(name: "Depeche Mode")
2596
2692
  end
2597
2693
 
2598
2694
  let!(:non_match) do
2599
- Band.create(name: "Tool")
2695
+ Band.create!(name: "Tool")
2600
2696
  end
2601
2697
 
2602
2698
  let(:criteria) do
@@ -2615,7 +2711,7 @@ describe Mongoid::Criteria do
2615
2711
  end
2616
2712
 
2617
2713
  let!(:match) do
2618
- Bar.create(location: [ 52.30, 13.25 ])
2714
+ Bar.create!(location: [ 52.30, 13.25 ])
2619
2715
  end
2620
2716
 
2621
2717
  let(:criteria) do
@@ -2634,7 +2730,7 @@ describe Mongoid::Criteria do
2634
2730
  end
2635
2731
 
2636
2732
  let!(:match) do
2637
- Bar.create(location: [ 52.30, 13.25 ])
2733
+ Bar.create!(location: [ 52.30, 13.25 ])
2638
2734
  end
2639
2735
 
2640
2736
  let(:criteria) do
@@ -2649,11 +2745,11 @@ describe Mongoid::Criteria do
2649
2745
  describe "#nin" do
2650
2746
 
2651
2747
  let!(:match) do
2652
- Band.create(name: "Depeche Mode")
2748
+ Band.create!(name: "Depeche Mode")
2653
2749
  end
2654
2750
 
2655
2751
  let!(:non_match) do
2656
- Band.create(name: "Tool")
2752
+ Band.create!(name: "Tool")
2657
2753
  end
2658
2754
 
2659
2755
  let(:criteria) do
@@ -2668,11 +2764,11 @@ describe Mongoid::Criteria do
2668
2764
  describe "#nor" do
2669
2765
 
2670
2766
  let!(:match) do
2671
- Band.create(name: "Depeche Mode")
2767
+ Band.create!(name: "Depeche Mode")
2672
2768
  end
2673
2769
 
2674
2770
  let!(:non_match) do
2675
- Band.create(name: "Tool")
2771
+ Band.create!(name: "Tool")
2676
2772
  end
2677
2773
 
2678
2774
  let(:criteria) do
@@ -2684,230 +2780,16 @@ describe Mongoid::Criteria do
2684
2780
  end
2685
2781
  end
2686
2782
 
2687
- describe "#only" do
2688
-
2689
- let!(:band) do
2690
- Band.create(name: "Depeche Mode", likes: 3, views: 10)
2691
- end
2692
-
2693
- context "when not using inheritance" do
2694
-
2695
- context "when passing splat args" do
2696
-
2697
- let(:criteria) do
2698
- Band.only(:_id)
2699
- end
2700
-
2701
- it "limits the returned fields" do
2702
- expect {
2703
- criteria.first.name
2704
- }.to raise_error(ActiveModel::MissingAttributeError)
2705
- end
2706
-
2707
- it "does not add _type to the fields" do
2708
- expect(criteria.options[:fields]["_type"]).to be_nil
2709
- end
2710
- end
2711
-
2712
- context "when not including id" do
2713
-
2714
- let(:criteria) do
2715
- Band.only(:name)
2716
- end
2717
-
2718
- it "responds to id anyway" do
2719
- expect {
2720
- criteria.first.id
2721
- }.to_not raise_error
2722
- end
2723
- end
2724
-
2725
- context "when passing an array" do
2726
-
2727
- let(:criteria) do
2728
- Band.only([ :name, :likes ])
2729
- end
2730
-
2731
- it "includes the limited fields" do
2732
- expect(criteria.first.name).to_not be_nil
2733
- end
2734
-
2735
- it "excludes the non included fields" do
2736
- expect {
2737
- criteria.first.active
2738
- }.to raise_error(ActiveModel::MissingAttributeError)
2739
- end
2740
-
2741
- it "does not add _type to the fields" do
2742
- expect(criteria.options[:fields]["_type"]).to be_nil
2743
- end
2744
- end
2745
-
2746
- context "when instantiating a class of another type inside the iteration" do
2747
-
2748
- let(:criteria) do
2749
- Band.only(:name)
2750
- end
2751
-
2752
- it "only limits the fields on the correct model" do
2753
- criteria.each do |band|
2754
- expect(Person.new.age).to eq(100)
2755
- end
2756
- end
2757
- end
2758
-
2759
- context "when instantiating a document not in the result set" do
2760
-
2761
- let(:criteria) do
2762
- Band.only(:name)
2763
- end
2764
-
2765
- it "only limits the fields on the correct criteria" do
2766
- criteria.each do |band|
2767
- expect(Band.new.active).to be true
2768
- end
2769
- end
2770
- end
2771
-
2772
- context "when nesting a criteria within a criteria" do
2773
-
2774
- let(:criteria) do
2775
- Band.only(:name)
2776
- end
2777
-
2778
- it "only limits the fields on the correct criteria" do
2779
- criteria.each do |band|
2780
- Band.all.each do |b|
2781
- expect(b.active).to be true
2782
- end
2783
- end
2784
- end
2785
- end
2786
- end
2787
-
2788
- context "when using inheritance" do
2789
-
2790
- let(:criteria) do
2791
- Doctor.only(:_id)
2792
- end
2793
-
2794
- it "adds _type to the fields" do
2795
- expect(criteria.options[:fields]["_type"]).to eq(1)
2796
- end
2797
- end
2798
-
2799
- context "when limiting to embedded documents" do
2800
-
2801
- context "when the embedded documents are aliased" do
2802
-
2803
- let(:criteria) do
2804
- Person.only(:phones)
2805
- end
2806
-
2807
- it "properly uses the database field name" do
2808
- expect(criteria.options).to eq(fields: { "_id" => 1, "mobile_phones" => 1 })
2809
- end
2810
- end
2811
- end
2812
-
2813
- context 'when the field is localized' do
2814
-
2815
- before do
2816
- I18n.locale = :en
2817
- d = Dictionary.create(description: 'english-text')
2818
- I18n.locale = :de
2819
- d.description = 'deutsch-text'
2820
- d.save
2821
- end
2822
-
2823
- after do
2824
- I18n.locale = :en
2825
- end
2826
-
2827
- context 'when entire field is included' do
2828
-
2829
- let(:dictionary) do
2830
- Dictionary.only(:description).first
2831
-
2832
- end
2833
-
2834
- it 'loads all translations' do
2835
- expect(dictionary.description_translations.keys).to include('de', 'en')
2836
- end
2837
-
2838
- it 'returns the field value for the current locale' do
2839
- I18n.locale = :en
2840
- expect(dictionary.description).to eq('english-text')
2841
- I18n.locale = :de
2842
- expect(dictionary.description).to eq('deutsch-text')
2843
- end
2844
- end
2845
-
2846
- context 'when a specific locale is included' do
2847
-
2848
- let(:dictionary) do
2849
- Dictionary.only(:'description.de').first
2850
- end
2851
-
2852
- it 'loads translations only for the included locale' do
2853
- expect(dictionary.description_translations.keys).to include('de')
2854
- expect(dictionary.description_translations.keys).to_not include('en')
2855
- end
2856
-
2857
- it 'returns the field value for the included locale' do
2858
- I18n.locale = :en
2859
- expect(dictionary.description).to be_nil
2860
- I18n.locale = :de
2861
- expect(dictionary.description).to eq('deutsch-text')
2862
- end
2863
- end
2864
-
2865
- context 'when entire field is excluded' do
2866
-
2867
- let(:dictionary) do
2868
- Dictionary.without(:description).first
2869
- end
2870
-
2871
- it 'does not load all translations' do
2872
- expect(dictionary.description_translations.keys).to_not include('de', 'en')
2873
- end
2874
-
2875
- it 'raises an ActiveModel::MissingAttributeError when attempting to access the field' do
2876
- expect{dictionary.description}.to raise_error ActiveModel::MissingAttributeError
2877
- end
2878
- end
2879
-
2880
- context 'when a specific locale is excluded' do
2881
-
2882
- let(:dictionary) do
2883
- Dictionary.without(:'description.de').first
2884
- end
2885
-
2886
- it 'does not load excluded translations' do
2887
- expect(dictionary.description_translations.keys).to_not include('de')
2888
- expect(dictionary.description_translations.keys).to include('en')
2889
- end
2890
-
2891
- it 'returns nil for excluded translations' do
2892
- I18n.locale = :en
2893
- expect(dictionary.description).to eq('english-text')
2894
- I18n.locale = :de
2895
- expect(dictionary.description).to be_nil
2896
- end
2897
- end
2898
- end
2899
- end
2900
-
2901
2783
  [ :or, :any_of ].each do |method|
2902
2784
 
2903
2785
  describe "\##{method}" do
2904
2786
 
2905
2787
  let!(:match) do
2906
- Band.create(name: "Depeche Mode")
2788
+ Band.create!(name: "Depeche Mode")
2907
2789
  end
2908
2790
 
2909
2791
  let!(:non_match) do
2910
- Band.create(name: "Tool")
2792
+ Band.create!(name: "Tool")
2911
2793
  end
2912
2794
 
2913
2795
  context "when sending a normal $or criterion" do
@@ -2937,25 +2819,29 @@ describe Mongoid::Criteria do
2937
2819
  describe "#pluck" do
2938
2820
 
2939
2821
  let!(:depeche) do
2940
- Band.create(name: "Depeche Mode", likes: 3)
2822
+ Band.create!(name: "Depeche Mode", likes: 3)
2941
2823
  end
2942
2824
 
2943
2825
  let!(:tool) do
2944
- Band.create(name: "Tool", likes: 3)
2826
+ Band.create!(name: "Tool", likes: 3)
2945
2827
  end
2946
2828
 
2947
2829
  let!(:photek) do
2948
- 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")
2949
2835
  end
2950
2836
 
2951
2837
  context "when the field is aliased" do
2952
2838
 
2953
2839
  let!(:expensive) do
2954
- Product.create(price: 100000)
2840
+ Product.create!(price: 100000)
2955
2841
  end
2956
2842
 
2957
2843
  let!(:cheap) do
2958
- Product.create(price: 1)
2844
+ Product.create!(price: 1)
2959
2845
  end
2960
2846
 
2961
2847
  context "when using alias_attribute" do
@@ -2964,8 +2850,10 @@ describe Mongoid::Criteria do
2964
2850
  Product.pluck(:price)
2965
2851
  end
2966
2852
 
2967
- it "uses the aliases" do
2968
- 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
2969
2857
  end
2970
2858
  end
2971
2859
  end
@@ -2982,14 +2870,18 @@ describe Mongoid::Criteria do
2982
2870
  criteria.pluck(:name)
2983
2871
  end
2984
2872
 
2985
- it "returns the values" do
2986
- 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
2987
2877
  end
2988
2878
 
2989
2879
  context "when subsequently executing the criteria without a pluck" do
2990
2880
 
2991
- it "does not limit the fields" do
2992
- 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
2993
2885
  end
2994
2886
  end
2995
2887
 
@@ -3000,51 +2892,83 @@ describe Mongoid::Criteria do
3000
2892
  end
3001
2893
 
3002
2894
  context 'when a top-level field and a subdocument field are plucked' do
3003
-
3004
2895
  before do
3005
- Band.create(name: 'FKA Twigs')
3006
- 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') ])
3007
2898
  end
3008
2899
 
3009
2900
  let(:embedded_pluck) do
3010
2901
  criteria.pluck(:name, 'records.name')
3011
2902
  end
3012
2903
 
3013
- let(:expected) do
3014
- [
3015
- ["FKA Twigs", nil],
3016
- ['FKA Twigs', [{ "name" => "LP1" }]]
3017
- ]
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
3018
2916
  end
3019
2917
 
3020
- it 'returns the list of top-level field and subdocument values' do
3021
- 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
3022
2930
  end
3023
2931
  end
3024
2932
 
3025
2933
  context 'when only a subdocument field is plucked' do
3026
2934
 
3027
2935
  before do
3028
- Band.create(name: 'FKA Twigs')
3029
- 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') ])
3030
2938
  end
3031
2939
 
3032
2940
  let(:embedded_pluck) do
3033
2941
  criteria.pluck('records.name')
3034
2942
  end
3035
2943
 
3036
- let(:expected) do
3037
- [
3038
- nil,
3039
- [{ "name" => "LP1" }]
3040
- ]
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
3041
2956
  end
3042
2957
 
3043
- it 'returns the list of subdocument values' do
3044
- 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
3045
2970
  end
3046
2971
  end
3047
-
3048
2972
  end
3049
2973
  end
3050
2974
 
@@ -3054,8 +2978,10 @@ describe Mongoid::Criteria do
3054
2978
  Band.where(:name.exists => true).pluck(:name, :likes)
3055
2979
  end
3056
2980
 
3057
- it "returns the values" do
3058
- 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
3059
2985
  end
3060
2986
  end
3061
2987
 
@@ -3065,8 +2991,10 @@ describe Mongoid::Criteria do
3065
2991
  Band.where(:name.exists => true).pluck(:likes)
3066
2992
  end
3067
2993
 
3068
- it "returns the duplicates" do
3069
- 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
3070
2998
  end
3071
2999
  end
3072
3000
  end
@@ -3077,8 +3005,10 @@ describe Mongoid::Criteria do
3077
3005
  Band.where(name: "New Order").pluck(:_id)
3078
3006
  end
3079
3007
 
3080
- it "returns an empty array" do
3081
- 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
3082
3012
  end
3083
3013
  end
3084
3014
 
@@ -3088,8 +3018,10 @@ describe Mongoid::Criteria do
3088
3018
  Band.all.pluck(:id)
3089
3019
  end
3090
3020
 
3091
- it "returns the field values" do
3092
- 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
3093
3025
  end
3094
3026
  end
3095
3027
 
@@ -3099,8 +3031,10 @@ describe Mongoid::Criteria do
3099
3031
  Band.all.pluck(:id, :fooz)
3100
3032
  end
3101
3033
 
3102
- it "returns nil for the field that doesnt exist" do
3103
- 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
3104
3038
  end
3105
3039
  end
3106
3040
 
@@ -3112,8 +3046,10 @@ describe Mongoid::Criteria do
3112
3046
  Band.all.pluck(:foo)
3113
3047
  end
3114
3048
 
3115
- it "returns a array with nil values" do
3116
- 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
3117
3053
  end
3118
3054
  end
3119
3055
 
@@ -3123,8 +3059,10 @@ describe Mongoid::Criteria do
3123
3059
  Band.all.pluck(:foo, :bar)
3124
3060
  end
3125
3061
 
3126
- it "returns a nil arrays" do
3127
- 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
3128
3066
  end
3129
3067
  end
3130
3068
  end
@@ -3133,10 +3071,10 @@ describe Mongoid::Criteria do
3133
3071
 
3134
3072
  before do
3135
3073
  I18n.locale = :en
3136
- d = Dictionary.create(description: 'english-text')
3074
+ d = Dictionary.create!(description: 'english-text')
3137
3075
  I18n.locale = :de
3138
3076
  d.description = 'deutsch-text'
3139
- d.save
3077
+ d.save!
3140
3078
  end
3141
3079
 
3142
3080
  after do
@@ -3144,13 +3082,48 @@ describe Mongoid::Criteria do
3144
3082
  end
3145
3083
 
3146
3084
  context 'when plucking the entire field' do
3147
-
3148
3085
  let(:plucked) do
3149
3086
  Dictionary.all.pluck(:description)
3150
3087
  end
3151
3088
 
3152
- it 'returns all translations' do
3153
- 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
3154
3127
  end
3155
3128
  end
3156
3129
 
@@ -3160,8 +3133,235 @@ describe Mongoid::Criteria do
3160
3133
  Dictionary.all.pluck(:'description.de')
3161
3134
  end
3162
3135
 
3163
- it 'returns the specific translations' do
3164
- 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)
3165
3365
  end
3166
3366
  end
3167
3367
  end
@@ -3248,11 +3448,11 @@ describe Mongoid::Criteria do
3248
3448
  describe "#sort" do
3249
3449
 
3250
3450
  let!(:depeche) do
3251
- Band.create(name: "Depeche Mode", likes: 1000)
3451
+ Band.create!(name: "Depeche Mode", likes: 1000)
3252
3452
  end
3253
3453
 
3254
3454
  let!(:tool) do
3255
- Band.create(name: "Tool", likes: 500)
3455
+ Band.create!(name: "Tool", likes: 500)
3256
3456
  end
3257
3457
 
3258
3458
  let(:sorted) do
@@ -3271,11 +3471,11 @@ describe Mongoid::Criteria do
3271
3471
  context "when provided a single field" do
3272
3472
 
3273
3473
  let!(:depeche) do
3274
- Band.create(name: "Depeche Mode", likes: 1000)
3474
+ Band.create!(name: "Depeche Mode", likes: 1000)
3275
3475
  end
3276
3476
 
3277
3477
  let!(:tool) do
3278
- Band.create(name: "Tool", likes: 500)
3478
+ Band.create!(name: "Tool", likes: 500)
3279
3479
  end
3280
3480
 
3281
3481
  let(:criteria) do
@@ -3309,7 +3509,7 @@ describe Mongoid::Criteria do
3309
3509
  describe "#to_ary" do
3310
3510
 
3311
3511
  let!(:band) do
3312
- Band.create(name: "Depeche Mode")
3512
+ Band.create!(name: "Depeche Mode")
3313
3513
  end
3314
3514
 
3315
3515
  let(:criteria) do
@@ -3325,11 +3525,11 @@ describe Mongoid::Criteria do
3325
3525
  max_server_version '4.0'
3326
3526
 
3327
3527
  let!(:band) do
3328
- Band.create(name: "Depeche Mode")
3528
+ Band.create!(name: "Depeche Mode")
3329
3529
  end
3330
3530
 
3331
3531
  let!(:band2) do
3332
- Band.create(name: "Tool")
3532
+ Band.create!(name: "Tool")
3333
3533
  end
3334
3534
 
3335
3535
  let(:criteria) do
@@ -3368,34 +3568,75 @@ describe Mongoid::Criteria do
3368
3568
  end
3369
3569
 
3370
3570
  describe "#type" do
3571
+ context "when using the default discriminator_key" do
3572
+ context "when the type is a string" do
3371
3573
 
3372
- context "when the type is a string" do
3574
+ let!(:browser) do
3575
+ Browser.create!
3576
+ end
3373
3577
 
3374
- let!(:browser) do
3375
- Browser.create
3376
- end
3578
+ let(:criteria) do
3579
+ Canvas.all.type("Browser")
3580
+ end
3377
3581
 
3378
- let(:criteria) do
3379
- Canvas.all.type("Browser")
3582
+ it "returns documents with the provided type" do
3583
+ expect(criteria).to eq([ browser ])
3584
+ end
3380
3585
  end
3381
3586
 
3382
- it "returns documents with the provided type" do
3383
- 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
3384
3600
  end
3385
3601
  end
3386
3602
 
3387
- 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
3388
3607
 
3389
- let!(:browser) do
3390
- Firefox.create
3608
+ after do
3609
+ Canvas.discriminator_key = nil
3391
3610
  end
3392
3611
 
3393
- let(:criteria) do
3394
- 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
3395
3625
  end
3396
3626
 
3397
- it "returns documents with the provided types" do
3398
- 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
3399
3640
  end
3400
3641
  end
3401
3642
  end
@@ -3403,11 +3644,43 @@ describe Mongoid::Criteria do
3403
3644
  describe "#where" do
3404
3645
 
3405
3646
  let!(:match) do
3406
- Band.create(name: "Depeche Mode")
3647
+ Band.create!(name: "Depeche Mode")
3407
3648
  end
3408
3649
 
3409
3650
  let!(:non_match) do
3410
- 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
3411
3684
  end
3412
3685
 
3413
3686
  context "when provided a string" do
@@ -3472,7 +3745,7 @@ describe Mongoid::Criteria do
3472
3745
  end
3473
3746
 
3474
3747
  let!(:band) do
3475
- Band.create(name: "Boards of Canada", sales: sales)
3748
+ Band.create!(name: "Boards of Canada", sales: sales)
3476
3749
  end
3477
3750
 
3478
3751
  let(:from_db) do
@@ -3484,14 +3757,15 @@ describe Mongoid::Criteria do
3484
3757
  end
3485
3758
  end
3486
3759
 
3487
- 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'
3488
3762
 
3489
3763
  let(:decimal) do
3490
3764
  BSON::Decimal128.new("0.0005")
3491
3765
  end
3492
3766
 
3493
3767
  let!(:band) do
3494
- Band.create(name: "Boards of Canada", decimal: decimal)
3768
+ Band.create!(name: "Boards of Canada", decimal: decimal)
3495
3769
  end
3496
3770
 
3497
3771
  let(:from_db) do
@@ -3506,7 +3780,7 @@ describe Mongoid::Criteria do
3506
3780
  context 'when querying on a polymorphic relation' do
3507
3781
 
3508
3782
  let(:movie) do
3509
- Movie.create
3783
+ Movie.create!
3510
3784
  end
3511
3785
 
3512
3786
  let(:selector) do
@@ -3518,12 +3792,78 @@ describe Mongoid::Criteria do
3518
3792
  end
3519
3793
  end
3520
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
3521
3861
  end
3522
3862
 
3523
3863
  describe "#for_js" do
3524
3864
 
3525
3865
  let!(:match) do
3526
- Band.create(name: "Depeche Mode")
3866
+ Band.create!(name: "Depeche Mode")
3527
3867
  end
3528
3868
 
3529
3869
  context "when the code has no scope" do
@@ -3538,6 +3878,7 @@ describe Mongoid::Criteria do
3538
3878
  end
3539
3879
 
3540
3880
  context "when the code has scope" do
3881
+ max_server_version '4.2'
3541
3882
 
3542
3883
  let(:criteria) do
3543
3884
  Band.for_js("this.name == param", param: "Depeche Mode")
@@ -3559,10 +3900,14 @@ describe Mongoid::Criteria do
3559
3900
 
3560
3901
  before do
3561
3902
  expect(Person).to receive(:minor).and_call_original
3903
+ expect(Person).to receive(:older_than).and_call_original
3562
3904
  end
3563
3905
 
3564
3906
  it "calls the method on the class" do
3565
3907
  expect(criteria.minor).to be_empty
3908
+ expect do
3909
+ criteria.older_than(age: 25)
3910
+ end.not_to raise_error
3566
3911
  end
3567
3912
  end
3568
3913
 
@@ -3605,11 +3950,11 @@ describe Mongoid::Criteria do
3605
3950
  describe "#uniq" do
3606
3951
 
3607
3952
  let!(:band_one) do
3608
- Band.create(name: "New Order")
3953
+ Band.create!(name: "New Order")
3609
3954
  end
3610
3955
 
3611
3956
  let!(:band_two) do
3612
- Band.create(name: "New Order")
3957
+ Band.create!(name: "New Order")
3613
3958
  end
3614
3959
 
3615
3960
  let(:criteria) do
@@ -3649,7 +3994,7 @@ describe Mongoid::Criteria do
3649
3994
  end
3650
3995
  end
3651
3996
 
3652
- describe "#geo_spacial" do
3997
+ describe "#geo_spatial" do
3653
3998
 
3654
3999
  context "when checking within a polygon" do
3655
4000
 
@@ -3658,11 +4003,11 @@ describe Mongoid::Criteria do
3658
4003
  end
3659
4004
 
3660
4005
  let!(:match) do
3661
- Bar.create(location: [ 52.30, 13.25 ])
4006
+ Bar.create!(location: [ 52.30, 13.25 ])
3662
4007
  end
3663
4008
 
3664
4009
  let(:criteria) do
3665
- Bar.geo_spacial(
4010
+ Bar.geo_spatial(
3666
4011
  :location.within_polygon => [[[ 50, 10 ], [ 50, 20 ], [ 60, 20 ], [ 60, 10 ], [ 50, 10 ]]]
3667
4012
  )
3668
4013
  end
@@ -3676,11 +4021,11 @@ describe Mongoid::Criteria do
3676
4021
  describe "#with_size" do
3677
4022
 
3678
4023
  let!(:match) do
3679
- Band.create(genres: [ "electro", "dub" ])
4024
+ Band.create!(genres: [ "electro", "dub" ])
3680
4025
  end
3681
4026
 
3682
4027
  let!(:non_match) do
3683
- Band.create(genres: [ "house" ])
4028
+ Band.create!(genres: [ "house" ])
3684
4029
  end
3685
4030
 
3686
4031
  let(:criteria) do
@@ -3695,7 +4040,7 @@ describe Mongoid::Criteria do
3695
4040
  describe "#with_type" do
3696
4041
 
3697
4042
  let!(:match) do
3698
- Band.create(name: "Depeche Mode")
4043
+ Band.create!(name: "Depeche Mode")
3699
4044
  end
3700
4045
 
3701
4046
  let(:criteria) do
@@ -3707,73 +4052,76 @@ describe Mongoid::Criteria do
3707
4052
  end
3708
4053
  end
3709
4054
 
3710
- 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
3711
4058
 
3712
- let!(:person) do
3713
- Person.create!(username: "davinci", age: 50, pets: false)
3714
- end
4059
+ let(:criteria) do
4060
+ described_class.new(Firefox)
4061
+ end
3715
4062
 
3716
- 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
3717
4071
 
3718
- context "when the embedded documents are aliased" do
4072
+ context "when more than one subclass exists" do
3719
4073
 
3720
4074
  let(:criteria) do
3721
- Person.without(:phones)
4075
+ described_class.new(Browser)
3722
4076
  end
3723
4077
 
3724
- it "properly uses the database field name" do
3725
- expect(criteria.options).to eq(fields: { "mobile_phones" => 0 })
4078
+ let(:selection) do
4079
+ criteria.send(:type_selection)
3726
4080
  end
3727
- end
3728
- end
3729
4081
 
3730
- context "when excluding id" do
3731
-
3732
- let(:criteria) do
3733
- 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
3734
4085
  end
4086
+ end
3735
4087
 
3736
- it "does not raise error" do
3737
- expect {
3738
- criteria.first.id
3739
- }.to_not raise_error
4088
+ context "when using a custom discriminator_key" do
4089
+ before do
4090
+ Canvas.discriminator_key = "dkey"
3740
4091
  end
3741
4092
 
3742
- it "returns id anyway" do
3743
- expect(criteria.first.id).to_not be_nil
4093
+ after do
4094
+ Canvas.discriminator_key = nil
3744
4095
  end
3745
- end
3746
- end
3747
4096
 
3748
- describe "#type_selection" do
3749
-
3750
- context "when only one subclass exists" do
4097
+ context "when only one subclass exists" do
3751
4098
 
3752
- let(:criteria) do
3753
- described_class.new(Firefox)
3754
- end
4099
+ let(:criteria) do
4100
+ described_class.new(Firefox)
4101
+ end
3755
4102
 
3756
- let(:selection) do
3757
- criteria.send(:type_selection)
3758
- end
4103
+ let(:selection) do
4104
+ criteria.send(:type_selection)
4105
+ end
3759
4106
 
3760
- it "does not use an $in query" do
3761
- expect(selection).to eq({ _type: "Firefox" })
4107
+ it "does not use an $in query" do
4108
+ expect(selection).to eq({ dkey: "Firefox" })
4109
+ end
3762
4110
  end
3763
- end
3764
4111
 
3765
- context "when more than one subclass exists" do
4112
+ context "when more than one subclass exists" do
3766
4113
 
3767
- let(:criteria) do
3768
- described_class.new(Browser)
3769
- end
4114
+ let(:criteria) do
4115
+ described_class.new(Browser)
4116
+ end
3770
4117
 
3771
- let(:selection) do
3772
- criteria.send(:type_selection)
3773
- end
4118
+ let(:selection) do
4119
+ criteria.send(:type_selection)
4120
+ end
3774
4121
 
3775
- it "does not use an $in query" do
3776
- 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
3777
4125
  end
3778
4126
  end
3779
4127
  end