mongoid 5.4.1 → 7.4.0

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