mongoid 7.3.5 → 7.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (895) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +17 -17
  4. data/README.md +3 -3
  5. data/lib/config/locales/en.yml +28 -20
  6. data/lib/mongoid/association/accessors.rb +0 -27
  7. data/lib/mongoid/association/bindable.rb +0 -21
  8. data/lib/mongoid/association/builders.rb +0 -9
  9. data/lib/mongoid/association/constrainable.rb +0 -3
  10. data/lib/mongoid/association/depending.rb +0 -7
  11. data/lib/mongoid/association/eager_loadable.rb +0 -3
  12. data/lib/mongoid/association/embedded/batchable.rb +12 -59
  13. data/lib/mongoid/association/embedded/cyclic.rb +2 -11
  14. data/lib/mongoid/association/embedded/embedded_in/binding.rb +0 -7
  15. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +0 -3
  16. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +0 -13
  17. data/lib/mongoid/association/embedded/embedded_in.rb +0 -23
  18. data/lib/mongoid/association/embedded/embeds_many/binding.rb +0 -7
  19. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +0 -3
  20. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +31 -44
  21. data/lib/mongoid/association/embedded/embeds_many.rb +0 -31
  22. data/lib/mongoid/association/embedded/embeds_one/binding.rb +0 -7
  23. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +0 -3
  24. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +26 -14
  25. data/lib/mongoid/association/embedded/embeds_one.rb +0 -27
  26. data/lib/mongoid/association/embedded.rb +0 -1
  27. data/lib/mongoid/association/macros.rb +26 -5
  28. data/lib/mongoid/association/many.rb +0 -17
  29. data/lib/mongoid/association/marshalable.rb +0 -5
  30. data/lib/mongoid/association/nested/many.rb +0 -11
  31. data/lib/mongoid/association/nested/nested_buildable.rb +0 -9
  32. data/lib/mongoid/association/nested/one.rb +1 -16
  33. data/lib/mongoid/association/nested.rb +0 -3
  34. data/lib/mongoid/association/one.rb +1 -10
  35. data/lib/mongoid/association/options.rb +0 -33
  36. data/lib/mongoid/association/proxy.rb +0 -21
  37. data/lib/mongoid/association/referenced/auto_save.rb +0 -9
  38. data/lib/mongoid/association/referenced/belongs_to/binding.rb +0 -7
  39. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +4 -5
  40. data/lib/mongoid/association/referenced/belongs_to/eager.rb +0 -1
  41. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +0 -13
  42. data/lib/mongoid/association/referenced/belongs_to.rb +9 -34
  43. data/lib/mongoid/association/referenced/counter_cache.rb +2 -15
  44. data/lib/mongoid/association/referenced/eager.rb +3 -24
  45. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +0 -5
  46. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +0 -3
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +0 -1
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +12 -39
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +11 -38
  50. data/lib/mongoid/association/referenced/has_many/binding.rb +0 -5
  51. data/lib/mongoid/association/referenced/has_many/buildable.rb +0 -3
  52. data/lib/mongoid/association/referenced/has_many/eager.rb +0 -1
  53. data/lib/mongoid/association/referenced/has_many/enumerable.rb +20 -64
  54. data/lib/mongoid/association/referenced/has_many/proxy.rb +20 -63
  55. data/lib/mongoid/association/referenced/has_many.rb +12 -39
  56. data/lib/mongoid/association/referenced/has_one/binding.rb +0 -7
  57. data/lib/mongoid/association/referenced/has_one/buildable.rb +3 -4
  58. data/lib/mongoid/association/referenced/has_one/eager.rb +0 -1
  59. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +0 -15
  60. data/lib/mongoid/association/referenced/has_one/proxy.rb +0 -9
  61. data/lib/mongoid/association/referenced/has_one.rb +9 -32
  62. data/lib/mongoid/association/referenced/syncable.rb +0 -17
  63. data/lib/mongoid/association/referenced.rb +0 -1
  64. data/lib/mongoid/association/reflections.rb +0 -1
  65. data/lib/mongoid/association/relatable.rb +0 -61
  66. data/lib/mongoid/association.rb +0 -17
  67. data/lib/mongoid/atomic/modifiers.rb +4 -51
  68. data/lib/mongoid/atomic/paths/embedded/many.rb +0 -24
  69. data/lib/mongoid/atomic/paths/embedded/one.rb +0 -5
  70. data/lib/mongoid/atomic/paths/embedded.rb +0 -3
  71. data/lib/mongoid/atomic/paths/root.rb +0 -5
  72. data/lib/mongoid/atomic/paths.rb +0 -1
  73. data/lib/mongoid/atomic.rb +1 -42
  74. data/lib/mongoid/attributes/dynamic.rb +0 -17
  75. data/lib/mongoid/attributes/nested.rb +0 -5
  76. data/lib/mongoid/attributes/processing.rb +1 -18
  77. data/lib/mongoid/attributes/projector.rb +0 -1
  78. data/lib/mongoid/attributes/readonly.rb +0 -5
  79. data/lib/mongoid/attributes.rb +0 -33
  80. data/lib/mongoid/cacheable.rb +1 -6
  81. data/lib/mongoid/changeable.rb +3 -59
  82. data/lib/mongoid/clients/factory.rb +0 -7
  83. data/lib/mongoid/clients/options.rb +0 -5
  84. data/lib/mongoid/clients/sessions.rb +0 -7
  85. data/lib/mongoid/clients/storage_options.rb +0 -7
  86. data/lib/mongoid/clients/validators/storage.rb +0 -9
  87. data/lib/mongoid/clients/validators.rb +0 -1
  88. data/lib/mongoid/clients.rb +0 -9
  89. data/lib/mongoid/composable.rb +0 -7
  90. data/lib/mongoid/config/environment.rb +21 -6
  91. data/lib/mongoid/config/options.rb +0 -11
  92. data/lib/mongoid/config/validators/client.rb +0 -17
  93. data/lib/mongoid/config/validators/option.rb +0 -3
  94. data/lib/mongoid/config/validators.rb +0 -1
  95. data/lib/mongoid/config.rb +43 -30
  96. data/lib/mongoid/contextual/aggregable/memory.rb +14 -11
  97. data/lib/mongoid/contextual/aggregable/mongo.rb +15 -20
  98. data/lib/mongoid/contextual/aggregable/none.rb +65 -0
  99. data/lib/mongoid/contextual/aggregable.rb +17 -0
  100. data/lib/mongoid/contextual/atomic.rb +0 -25
  101. data/lib/mongoid/contextual/command.rb +0 -5
  102. data/lib/mongoid/contextual/geo_near.rb +1 -34
  103. data/lib/mongoid/contextual/map_reduce.rb +0 -31
  104. data/lib/mongoid/contextual/memory.rb +147 -70
  105. data/lib/mongoid/contextual/mongo.rb +249 -103
  106. data/lib/mongoid/contextual/none.rb +83 -28
  107. data/lib/mongoid/contextual/queryable.rb +0 -3
  108. data/lib/mongoid/contextual.rb +0 -5
  109. data/lib/mongoid/copyable.rb +0 -5
  110. data/lib/mongoid/criteria/findable.rb +0 -13
  111. data/lib/mongoid/criteria/includable.rb +0 -9
  112. data/lib/mongoid/criteria/inspectable.rb +0 -3
  113. data/lib/mongoid/criteria/marshalable.rb +0 -5
  114. data/lib/mongoid/criteria/modifiable.rb +0 -19
  115. data/lib/mongoid/criteria/options.rb +0 -3
  116. data/lib/mongoid/criteria/permission.rb +0 -1
  117. data/lib/mongoid/criteria/queryable/aggregable.rb +0 -13
  118. data/lib/mongoid/criteria/queryable/expandable.rb +0 -1
  119. data/lib/mongoid/criteria/queryable/extensions/array.rb +2 -25
  120. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +0 -3
  121. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +0 -3
  122. data/lib/mongoid/criteria/queryable/extensions/date.rb +0 -7
  123. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +0 -5
  124. data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -24
  125. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +0 -13
  126. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +0 -11
  127. data/lib/mongoid/criteria/queryable/extensions/object.rb +1 -28
  128. data/lib/mongoid/criteria/queryable/extensions/range.rb +38 -16
  129. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +0 -9
  130. data/lib/mongoid/criteria/queryable/extensions/set.rb +0 -3
  131. data/lib/mongoid/criteria/queryable/extensions/string.rb +0 -17
  132. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +0 -9
  133. data/lib/mongoid/criteria/queryable/extensions/time.rb +0 -7
  134. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +0 -7
  135. data/lib/mongoid/criteria/queryable/extensions.rb +0 -1
  136. data/lib/mongoid/criteria/queryable/key.rb +1 -14
  137. data/lib/mongoid/criteria/queryable/macroable.rb +0 -3
  138. data/lib/mongoid/criteria/queryable/mergeable.rb +22 -30
  139. data/lib/mongoid/criteria/queryable/optional.rb +0 -45
  140. data/lib/mongoid/criteria/queryable/options.rb +0 -19
  141. data/lib/mongoid/criteria/queryable/pipeline.rb +0 -13
  142. data/lib/mongoid/criteria/queryable/selectable.rb +45 -76
  143. data/lib/mongoid/criteria/queryable/selector.rb +0 -17
  144. data/lib/mongoid/criteria/queryable/smash.rb +0 -11
  145. data/lib/mongoid/criteria/queryable/storable.rb +6 -2
  146. data/lib/mongoid/criteria/queryable.rb +0 -7
  147. data/lib/mongoid/criteria/scopable.rb +25 -19
  148. data/lib/mongoid/criteria.rb +2 -57
  149. data/lib/mongoid/document.rb +1 -50
  150. data/lib/mongoid/equality.rb +26 -10
  151. data/lib/mongoid/errors/ambiguous_relationship.rb +2 -5
  152. data/lib/mongoid/errors/callback.rb +0 -3
  153. data/lib/mongoid/errors/criteria_argument_required.rb +0 -1
  154. data/lib/mongoid/errors/delete_restriction.rb +0 -3
  155. data/lib/mongoid/errors/document_not_destroyed.rb +2 -7
  156. data/lib/mongoid/errors/document_not_found.rb +23 -15
  157. data/lib/mongoid/errors/eager_load.rb +0 -3
  158. data/lib/mongoid/errors/empty_config_file.rb +0 -1
  159. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +0 -3
  160. data/lib/mongoid/errors/invalid_collection.rb +0 -1
  161. data/lib/mongoid/errors/invalid_config_file.rb +0 -1
  162. data/lib/mongoid/errors/invalid_config_option.rb +0 -3
  163. data/lib/mongoid/errors/invalid_dependent_strategy.rb +0 -3
  164. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +0 -1
  165. data/lib/mongoid/errors/invalid_elem_match_operator.rb +0 -1
  166. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +0 -1
  167. data/lib/mongoid/errors/invalid_expression_operator.rb +0 -1
  168. data/lib/mongoid/errors/invalid_field.rb +0 -5
  169. data/lib/mongoid/errors/invalid_field_operator.rb +0 -1
  170. data/lib/mongoid/errors/invalid_field_option.rb +0 -3
  171. data/lib/mongoid/errors/invalid_find.rb +0 -3
  172. data/lib/mongoid/errors/invalid_includes.rb +0 -3
  173. data/lib/mongoid/errors/invalid_index.rb +0 -3
  174. data/lib/mongoid/errors/invalid_options.rb +0 -3
  175. data/lib/mongoid/errors/invalid_path.rb +0 -3
  176. data/lib/mongoid/errors/invalid_persistence_option.rb +0 -5
  177. data/lib/mongoid/errors/invalid_query.rb +0 -1
  178. data/lib/mongoid/errors/invalid_relation.rb +0 -7
  179. data/lib/mongoid/errors/invalid_relation_option.rb +0 -3
  180. data/lib/mongoid/errors/invalid_scope.rb +0 -3
  181. data/lib/mongoid/errors/invalid_session_use.rb +1 -6
  182. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +0 -1
  183. data/lib/mongoid/errors/invalid_storage_options.rb +0 -3
  184. data/lib/mongoid/errors/invalid_storage_parent.rb +0 -3
  185. data/lib/mongoid/errors/invalid_time.rb +0 -3
  186. data/lib/mongoid/errors/invalid_value.rb +0 -1
  187. data/lib/mongoid/errors/inverse_not_found.rb +0 -3
  188. data/lib/mongoid/errors/mixed_client_configuration.rb +0 -3
  189. data/lib/mongoid/errors/mixed_relations.rb +0 -3
  190. data/lib/mongoid/errors/mongoid_error.rb +0 -9
  191. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +0 -3
  192. data/lib/mongoid/errors/no_client_config.rb +0 -3
  193. data/lib/mongoid/errors/no_client_database.rb +0 -3
  194. data/lib/mongoid/errors/no_client_hosts.rb +0 -3
  195. data/lib/mongoid/errors/no_clients_config.rb +0 -3
  196. data/lib/mongoid/errors/no_default_client.rb +0 -3
  197. data/lib/mongoid/errors/no_environment.rb +0 -3
  198. data/lib/mongoid/errors/no_map_reduce_output.rb +0 -3
  199. data/lib/mongoid/errors/no_metadata.rb +0 -3
  200. data/lib/mongoid/errors/no_parent.rb +0 -3
  201. data/lib/mongoid/errors/readonly_attribute.rb +0 -3
  202. data/lib/mongoid/errors/readonly_document.rb +1 -6
  203. data/lib/mongoid/errors/scope_overwrite.rb +0 -1
  204. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +0 -1
  205. data/lib/mongoid/errors/unknown_attribute.rb +0 -3
  206. data/lib/mongoid/errors/unknown_model.rb +0 -3
  207. data/lib/mongoid/errors/unsaved_document.rb +1 -2
  208. data/lib/mongoid/errors/unsupported_javascript.rb +0 -3
  209. data/lib/mongoid/errors/validations.rb +0 -1
  210. data/lib/mongoid/errors.rb +0 -1
  211. data/lib/mongoid/evolvable.rb +0 -3
  212. data/lib/mongoid/extensions/array.rb +3 -29
  213. data/lib/mongoid/extensions/big_decimal.rb +0 -11
  214. data/lib/mongoid/extensions/boolean.rb +0 -3
  215. data/lib/mongoid/extensions/date.rb +0 -9
  216. data/lib/mongoid/extensions/date_time.rb +0 -9
  217. data/lib/mongoid/extensions/decimal128.rb +0 -5
  218. data/lib/mongoid/extensions/false_class.rb +1 -6
  219. data/lib/mongoid/extensions/float.rb +0 -7
  220. data/lib/mongoid/extensions/hash.rb +0 -27
  221. data/lib/mongoid/extensions/integer.rb +0 -9
  222. data/lib/mongoid/extensions/module.rb +0 -3
  223. data/lib/mongoid/extensions/nil_class.rb +0 -5
  224. data/lib/mongoid/extensions/object.rb +1 -40
  225. data/lib/mongoid/extensions/object_id.rb +0 -7
  226. data/lib/mongoid/extensions/range.rb +0 -11
  227. data/lib/mongoid/extensions/regexp.rb +0 -3
  228. data/lib/mongoid/extensions/set.rb +0 -7
  229. data/lib/mongoid/extensions/string.rb +1 -30
  230. data/lib/mongoid/extensions/symbol.rb +0 -7
  231. data/lib/mongoid/extensions/time.rb +0 -11
  232. data/lib/mongoid/extensions/time_with_zone.rb +13 -9
  233. data/lib/mongoid/extensions/true_class.rb +1 -6
  234. data/lib/mongoid/extensions.rb +15 -3
  235. data/lib/mongoid/factory.rb +1 -2
  236. data/lib/mongoid/fields/foreign_key.rb +0 -21
  237. data/lib/mongoid/fields/localized.rb +0 -11
  238. data/lib/mongoid/fields/standard.rb +0 -33
  239. data/lib/mongoid/fields/validators/macro.rb +0 -9
  240. data/lib/mongoid/fields/validators.rb +0 -1
  241. data/lib/mongoid/fields.rb +191 -60
  242. data/lib/mongoid/findable.rb +20 -10
  243. data/lib/mongoid/indexable/specification.rb +0 -15
  244. data/lib/mongoid/indexable/validators/options.rb +0 -7
  245. data/lib/mongoid/indexable.rb +1 -18
  246. data/lib/mongoid/inspectable.rb +1 -10
  247. data/lib/mongoid/interceptable.rb +0 -25
  248. data/lib/mongoid/loggable.rb +0 -9
  249. data/lib/mongoid/matchable.rb +0 -5
  250. data/lib/mongoid/matcher/eq_impl.rb +37 -2
  251. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +6 -1
  252. data/lib/mongoid/persistable/creatable.rb +1 -20
  253. data/lib/mongoid/persistable/deletable.rb +0 -17
  254. data/lib/mongoid/persistable/destroyable.rb +0 -7
  255. data/lib/mongoid/persistable/incrementable.rb +0 -5
  256. data/lib/mongoid/persistable/logical.rb +0 -5
  257. data/lib/mongoid/persistable/poppable.rb +0 -5
  258. data/lib/mongoid/persistable/pullable.rb +0 -7
  259. data/lib/mongoid/persistable/pushable.rb +0 -7
  260. data/lib/mongoid/persistable/renamable.rb +0 -5
  261. data/lib/mongoid/persistable/savable.rb +0 -7
  262. data/lib/mongoid/persistable/settable.rb +0 -5
  263. data/lib/mongoid/persistable/unsettable.rb +0 -5
  264. data/lib/mongoid/persistable/updatable.rb +2 -17
  265. data/lib/mongoid/persistable/upsertable.rb +0 -7
  266. data/lib/mongoid/persistable.rb +0 -23
  267. data/lib/mongoid/persistence_context.rb +0 -27
  268. data/lib/mongoid/positional.rb +0 -5
  269. data/lib/mongoid/query_cache.rb +0 -33
  270. data/lib/mongoid/railtie.rb +0 -15
  271. data/lib/mongoid/railties/controller_runtime.rb +0 -1
  272. data/lib/mongoid/reloadable.rb +4 -16
  273. data/lib/mongoid/scopable.rb +6 -34
  274. data/lib/mongoid/selectable.rb +0 -9
  275. data/lib/mongoid/serializable.rb +0 -15
  276. data/lib/mongoid/shardable.rb +0 -7
  277. data/lib/mongoid/stateful.rb +0 -9
  278. data/lib/mongoid/stringified_symbol.rb +2 -3
  279. data/lib/mongoid/tasks/database.rb +0 -5
  280. data/lib/mongoid/threaded/lifecycle.rb +0 -21
  281. data/lib/mongoid/threaded.rb +0 -55
  282. data/lib/mongoid/timestamps/created/short.rb +0 -1
  283. data/lib/mongoid/timestamps/created.rb +0 -1
  284. data/lib/mongoid/timestamps/short.rb +0 -1
  285. data/lib/mongoid/timestamps/timeless.rb +0 -7
  286. data/lib/mongoid/timestamps/updated/short.rb +0 -1
  287. data/lib/mongoid/timestamps/updated.rb +0 -3
  288. data/lib/mongoid/timestamps.rb +0 -1
  289. data/lib/mongoid/touchable.rb +0 -7
  290. data/lib/mongoid/traversable.rb +67 -53
  291. data/lib/mongoid/validatable/associated.rb +0 -3
  292. data/lib/mongoid/validatable/format.rb +0 -1
  293. data/lib/mongoid/validatable/length.rb +0 -1
  294. data/lib/mongoid/validatable/localizable.rb +0 -3
  295. data/lib/mongoid/validatable/macros.rb +0 -7
  296. data/lib/mongoid/validatable/presence.rb +1 -8
  297. data/lib/mongoid/validatable/queryable.rb +0 -3
  298. data/lib/mongoid/validatable/uniqueness.rb +15 -30
  299. data/lib/mongoid/validatable.rb +1 -22
  300. data/lib/mongoid/version.rb +1 -2
  301. data/lib/mongoid/warnings.rb +29 -0
  302. data/lib/mongoid.rb +1 -15
  303. data/lib/rails/generators/mongoid/config/config_generator.rb +0 -1
  304. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +4 -3
  305. data/lib/rails/generators/mongoid/model/model_generator.rb +0 -1
  306. data/lib/rails/generators/mongoid_generator.rb +0 -1
  307. data/lib/rails/mongoid.rb +0 -3
  308. data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
  309. data/spec/integration/app_spec.rb +20 -15
  310. data/spec/integration/associations/belongs_to_spec.rb +0 -1
  311. data/spec/integration/associations/embedded_dirty_spec.rb +57 -0
  312. data/spec/integration/associations/embedded_spec.rb +0 -1
  313. data/spec/integration/associations/embeds_many_spec.rb +0 -1
  314. data/spec/integration/associations/embeds_one_spec.rb +0 -1
  315. data/spec/integration/associations/foreign_key_spec.rb +0 -1
  316. data/spec/integration/associations/foreign_key_spec_models.rb +0 -1
  317. data/spec/integration/associations/has_many_spec.rb +0 -1
  318. data/spec/integration/associations/has_one_spec.rb +0 -1
  319. data/spec/integration/associations/nested_attributes_assignment_spec.rb +0 -1
  320. data/spec/integration/associations/reverse_population_spec.rb +0 -1
  321. data/spec/integration/associations/reverse_population_spec_models.rb +0 -1
  322. data/spec/integration/associations/scope_option_spec.rb +101 -0
  323. data/spec/integration/atomic/modifiers_spec.rb +0 -1
  324. data/spec/integration/bson_regexp_raw_spec.rb +0 -1
  325. data/spec/integration/callbacks_models.rb +12 -0
  326. data/spec/integration/callbacks_spec.rb +18 -6
  327. data/spec/integration/contextual/empty_spec.rb +0 -1
  328. data/spec/integration/criteria/alias_query_spec.rb +161 -0
  329. data/spec/integration/criteria/date_field_spec.rb +0 -1
  330. data/spec/integration/criteria/default_scope_spec.rb +51 -0
  331. data/spec/integration/criteria/logical_spec.rb +30 -0
  332. data/spec/integration/criteria/range_spec.rb +265 -0
  333. data/spec/integration/criteria/time_with_zone_spec.rb +125 -15
  334. data/spec/integration/discriminator_key_spec.rb +0 -1
  335. data/spec/integration/discriminator_value_spec.rb +0 -1
  336. data/spec/integration/document_spec.rb +0 -1
  337. data/spec/integration/i18n_fallbacks_spec.rb +15 -2
  338. data/spec/integration/matcher_examples_spec.rb +0 -1
  339. data/spec/integration/matcher_operator_spec.rb +27 -3
  340. data/spec/integration/matcher_spec.rb +95 -1
  341. data/spec/integration/server_query_spec.rb +0 -1
  342. data/spec/integration/shardable_spec.rb +0 -1
  343. data/spec/integration/stringified_symbol_field_spec.rb +14 -1
  344. data/spec/lite_spec_helper.rb +1 -2
  345. data/spec/mongoid/association/accessors_spec.rb +44 -15
  346. data/spec/mongoid/association/auto_save_spec.rb +72 -34
  347. data/spec/mongoid/association/builders_spec.rb +1 -2
  348. data/spec/mongoid/association/constrainable_spec.rb +0 -1
  349. data/spec/mongoid/association/counter_cache_spec.rb +32 -33
  350. data/spec/mongoid/association/depending_spec.rb +12 -13
  351. data/spec/mongoid/association/eager_spec.rb +4 -5
  352. data/spec/mongoid/association/embedded/cyclic_spec.rb +2 -3
  353. data/spec/mongoid/association/embedded/dirty_spec.rb +2 -3
  354. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +0 -1
  355. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +0 -1
  356. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +13 -14
  357. data/spec/mongoid/association/embedded/embedded_in_spec.rb +0 -1
  358. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +0 -1
  359. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +0 -1
  360. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +384 -156
  361. data/spec/mongoid/association/embedded/embeds_many_models.rb +0 -122
  362. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +0 -1
  363. data/spec/mongoid/association/embedded/embeds_many_spec.rb +0 -1
  364. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +0 -1
  365. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +0 -1
  366. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +21 -22
  367. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +0 -1
  368. data/spec/mongoid/association/embedded/embeds_one_models.rb +0 -1
  369. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +0 -1
  370. data/spec/mongoid/association/embedded/embeds_one_spec.rb +0 -1
  371. data/spec/mongoid/association/macros_spec.rb +9 -10
  372. data/spec/mongoid/association/nested/many_spec.rb +0 -1
  373. data/spec/mongoid/association/nested/one_spec.rb +0 -1
  374. data/spec/mongoid/association/options_spec.rb +0 -1
  375. data/spec/mongoid/association/polymorphic_spec.rb +0 -1
  376. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +0 -1
  377. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +55 -17
  378. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +50 -15
  379. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +57 -53
  380. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +0 -1
  381. data/spec/mongoid/association/referenced/belongs_to_spec.rb +22 -2
  382. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +0 -1
  383. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +26 -2
  384. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +31 -3
  385. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +0 -1
  386. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +179 -162
  387. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +18 -1
  388. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +0 -1
  389. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +21 -1
  390. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +0 -1
  391. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +21 -1
  392. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +23 -7
  393. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +113 -33
  394. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +0 -1
  395. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +225 -178
  396. data/spec/mongoid/association/referenced/has_many_models.rb +18 -1
  397. data/spec/mongoid/association/referenced/has_many_query_spec.rb +0 -1
  398. data/spec/mongoid/association/referenced/has_many_spec.rb +21 -1
  399. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +0 -1
  400. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +51 -8
  401. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +17 -2
  402. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +26 -27
  403. data/spec/mongoid/association/referenced/has_one_models.rb +18 -1
  404. data/spec/mongoid/association/referenced/has_one_query_spec.rb +0 -1
  405. data/spec/mongoid/association/referenced/has_one_spec.rb +21 -1
  406. data/spec/mongoid/association/reflections_spec.rb +0 -1
  407. data/spec/mongoid/association/syncable_spec.rb +31 -32
  408. data/spec/mongoid/association_spec.rb +0 -1
  409. data/spec/mongoid/atomic/modifiers_spec.rb +0 -1
  410. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +0 -1
  411. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +0 -1
  412. data/spec/mongoid/atomic/paths/root_spec.rb +0 -1
  413. data/spec/mongoid/atomic/paths_spec.rb +0 -1
  414. data/spec/mongoid/atomic_spec.rb +28 -7
  415. data/spec/mongoid/attributes/dynamic_spec.rb +0 -1
  416. data/spec/mongoid/attributes/nested_spec.rb +66 -67
  417. data/spec/mongoid/attributes/projector_spec.rb +5 -2
  418. data/spec/mongoid/attributes/readonly_spec.rb +22 -23
  419. data/spec/mongoid/attributes_spec.rb +32 -33
  420. data/spec/mongoid/cacheable_spec.rb +1 -2
  421. data/spec/mongoid/changeable_spec.rb +35 -36
  422. data/spec/mongoid/clients/factory_spec.rb +11 -13
  423. data/spec/mongoid/clients/options_spec.rb +5 -5
  424. data/spec/mongoid/clients/sessions_spec.rb +22 -23
  425. data/spec/mongoid/clients/transactions_spec.rb +49 -27
  426. data/spec/mongoid/clients_spec.rb +6 -7
  427. data/spec/mongoid/composable_spec.rb +0 -1
  428. data/spec/mongoid/config/environment_spec.rb +39 -2
  429. data/spec/mongoid/config/options_spec.rb +0 -1
  430. data/spec/mongoid/config_spec.rb +154 -4
  431. data/spec/mongoid/contextual/aggregable/memory_spec.rb +51 -12
  432. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +120 -21
  433. data/spec/mongoid/contextual/aggregable/none_spec.rb +60 -0
  434. data/spec/mongoid/contextual/atomic_spec.rb +46 -47
  435. data/spec/mongoid/contextual/geo_near_spec.rb +17 -18
  436. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -3
  437. data/spec/mongoid/contextual/memory_spec.rb +849 -89
  438. data/spec/mongoid/contextual/mongo_spec.rb +1185 -160
  439. data/spec/mongoid/contextual/none_spec.rb +43 -72
  440. data/spec/mongoid/copyable_spec.rb +12 -13
  441. data/spec/mongoid/copyable_spec_models.rb +0 -1
  442. data/spec/mongoid/criteria/findable_spec.rb +23 -24
  443. data/spec/mongoid/criteria/inspectable_spec.rb +0 -1
  444. data/spec/mongoid/criteria/marshalable_spec.rb +0 -1
  445. data/spec/mongoid/criteria/modifiable_spec.rb +36 -37
  446. data/spec/mongoid/criteria/options_spec.rb +0 -1
  447. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +1 -2
  448. data/spec/mongoid/criteria/queryable/expandable_spec.rb +0 -1
  449. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +0 -1
  450. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +0 -1
  451. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -1
  452. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +0 -1
  453. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +0 -1
  454. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +0 -1
  455. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -1
  456. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +0 -1
  457. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -1
  458. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +0 -1
  459. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +0 -1
  460. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +0 -1
  461. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +0 -1
  462. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +237 -179
  463. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +0 -1
  464. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +0 -1
  465. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +0 -1
  466. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +0 -1
  467. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -1
  468. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +0 -1
  469. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +0 -1
  470. data/spec/mongoid/criteria/queryable/key_spec.rb +0 -1
  471. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +0 -1
  472. data/spec/mongoid/criteria/queryable/optional_spec.rb +1 -2
  473. data/spec/mongoid/criteria/queryable/options_spec.rb +0 -1
  474. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +0 -1
  475. data/spec/mongoid/criteria/queryable/queryable_spec.rb +1 -2
  476. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +0 -1
  477. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +0 -1
  478. data/spec/mongoid/criteria/queryable/selectable_spec.rb +227 -55
  479. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +0 -1
  480. data/spec/mongoid/criteria/queryable/selector_spec.rb +0 -1
  481. data/spec/mongoid/criteria/queryable/smash_spec.rb +0 -1
  482. data/spec/mongoid/criteria/queryable/storable_spec.rb +37 -1
  483. data/spec/mongoid/criteria/scopable_spec.rb +127 -1
  484. data/spec/mongoid/criteria_projection_spec.rb +3 -4
  485. data/spec/mongoid/criteria_spec.rb +523 -187
  486. data/spec/mongoid/document_fields_spec.rb +0 -1
  487. data/spec/mongoid/document_persistence_context_spec.rb +0 -1
  488. data/spec/mongoid/document_query_spec.rb +0 -1
  489. data/spec/mongoid/document_spec.rb +11 -33
  490. data/spec/mongoid/equality_spec.rb +142 -41
  491. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +0 -1
  492. data/spec/mongoid/errors/callback_spec.rb +0 -1
  493. data/spec/mongoid/errors/delete_restriction_spec.rb +0 -1
  494. data/spec/mongoid/errors/document_not_destroyed_spec.rb +0 -1
  495. data/spec/mongoid/errors/document_not_found_spec.rb +49 -1
  496. data/spec/mongoid/errors/eager_load_spec.rb +0 -1
  497. data/spec/mongoid/errors/invalid_collection_spec.rb +0 -1
  498. data/spec/mongoid/errors/invalid_config_file_spec.rb +0 -1
  499. data/spec/mongoid/errors/invalid_config_option_spec.rb +0 -1
  500. data/spec/mongoid/errors/invalid_field_option_spec.rb +0 -1
  501. data/spec/mongoid/errors/invalid_field_spec.rb +0 -1
  502. data/spec/mongoid/errors/invalid_find_spec.rb +0 -1
  503. data/spec/mongoid/errors/invalid_includes_spec.rb +0 -1
  504. data/spec/mongoid/errors/invalid_index_spec.rb +0 -1
  505. data/spec/mongoid/errors/invalid_options_spec.rb +0 -1
  506. data/spec/mongoid/errors/invalid_path_spec.rb +0 -1
  507. data/spec/mongoid/errors/invalid_relation_spec.rb +0 -1
  508. data/spec/mongoid/errors/invalid_scope_spec.rb +1 -2
  509. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +0 -1
  510. data/spec/mongoid/errors/invalid_storage_options_spec.rb +0 -1
  511. data/spec/mongoid/errors/invalid_time_spec.rb +0 -1
  512. data/spec/mongoid/errors/inverse_not_found_spec.rb +0 -1
  513. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +0 -1
  514. data/spec/mongoid/errors/mixed_relations_spec.rb +0 -1
  515. data/spec/mongoid/errors/mongoid_error_spec.rb +1 -2
  516. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +0 -1
  517. data/spec/mongoid/errors/no_client_config_spec.rb +0 -1
  518. data/spec/mongoid/errors/no_client_database_spec.rb +0 -1
  519. data/spec/mongoid/errors/no_client_hosts_spec.rb +0 -1
  520. data/spec/mongoid/errors/no_clients_config_spec.rb +0 -1
  521. data/spec/mongoid/errors/no_environment_spec.rb +0 -1
  522. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +0 -1
  523. data/spec/mongoid/errors/no_metadata_spec.rb +0 -1
  524. data/spec/mongoid/errors/no_parent_spec.rb +0 -1
  525. data/spec/mongoid/errors/readonly_attribute_spec.rb +0 -1
  526. data/spec/mongoid/errors/readonly_document_spec.rb +0 -1
  527. data/spec/mongoid/errors/scope_overwrite_spec.rb +0 -1
  528. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +0 -1
  529. data/spec/mongoid/errors/unknown_attribute_spec.rb +2 -3
  530. data/spec/mongoid/errors/unsaved_document_spec.rb +0 -1
  531. data/spec/mongoid/errors/unsupported_javascript_spec.rb +0 -1
  532. data/spec/mongoid/errors/validations_spec.rb +0 -1
  533. data/spec/mongoid/extensions/array_spec.rb +0 -1
  534. data/spec/mongoid/extensions/big_decimal_spec.rb +0 -1
  535. data/spec/mongoid/extensions/binary_spec.rb +0 -1
  536. data/spec/mongoid/extensions/boolean_spec.rb +0 -1
  537. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +0 -1
  538. data/spec/mongoid/extensions/date_spec.rb +0 -1
  539. data/spec/mongoid/extensions/date_time_spec.rb +0 -1
  540. data/spec/mongoid/extensions/decimal128_spec.rb +0 -1
  541. data/spec/mongoid/extensions/false_class_spec.rb +0 -1
  542. data/spec/mongoid/extensions/float_spec.rb +0 -1
  543. data/spec/mongoid/extensions/hash_spec.rb +0 -1
  544. data/spec/mongoid/extensions/integer_spec.rb +0 -1
  545. data/spec/mongoid/extensions/module_spec.rb +0 -1
  546. data/spec/mongoid/extensions/nil_class_spec.rb +0 -1
  547. data/spec/mongoid/extensions/object_id_spec.rb +0 -1
  548. data/spec/mongoid/extensions/object_spec.rb +0 -1
  549. data/spec/mongoid/extensions/range_spec.rb +0 -1
  550. data/spec/mongoid/extensions/regexp_spec.rb +0 -1
  551. data/spec/mongoid/extensions/set_spec.rb +0 -1
  552. data/spec/mongoid/extensions/string_spec.rb +2 -3
  553. data/spec/mongoid/extensions/stringified_symbol_spec.rb +0 -1
  554. data/spec/mongoid/extensions/symbol_spec.rb +0 -1
  555. data/spec/mongoid/extensions/time_spec.rb +0 -1
  556. data/spec/mongoid/extensions/time_with_zone_spec.rb +0 -1
  557. data/spec/mongoid/extensions/true_class_spec.rb +0 -1
  558. data/spec/mongoid/extensions_spec.rb +14 -3
  559. data/spec/mongoid/factory_spec.rb +1 -1
  560. data/spec/mongoid/fields/foreign_key_spec.rb +0 -1
  561. data/spec/mongoid/fields/localized_spec.rb +0 -1
  562. data/spec/mongoid/fields/standard_spec.rb +0 -1
  563. data/spec/mongoid/fields_spec.rb +326 -31
  564. data/spec/mongoid/findable_spec.rb +51 -22
  565. data/spec/mongoid/indexable/specification_spec.rb +0 -1
  566. data/spec/mongoid/indexable_spec.rb +0 -1
  567. data/spec/mongoid/inspectable_spec.rb +0 -1
  568. data/spec/mongoid/interceptable_spec.rb +102 -95
  569. data/spec/mongoid/loggable_spec.rb +0 -1
  570. data/spec/mongoid/matcher/extract_attribute_spec.rb +5 -2
  571. data/spec/mongoid/persistable/creatable_spec.rb +2 -3
  572. data/spec/mongoid/persistable/deletable_spec.rb +18 -19
  573. data/spec/mongoid/persistable/destroyable_spec.rb +8 -9
  574. data/spec/mongoid/persistable/incrementable_spec.rb +8 -9
  575. data/spec/mongoid/persistable/logical_spec.rb +4 -5
  576. data/spec/mongoid/persistable/poppable_spec.rb +4 -5
  577. data/spec/mongoid/persistable/pullable_spec.rb +8 -9
  578. data/spec/mongoid/persistable/pushable_spec.rb +8 -9
  579. data/spec/mongoid/persistable/renamable_spec.rb +3 -4
  580. data/spec/mongoid/persistable/savable_spec.rb +15 -11
  581. data/spec/mongoid/persistable/settable_spec.rb +9 -10
  582. data/spec/mongoid/persistable/unsettable_spec.rb +4 -5
  583. data/spec/mongoid/persistable/updatable_spec.rb +41 -24
  584. data/spec/mongoid/persistable/upsertable_spec.rb +1 -2
  585. data/spec/mongoid/persistable_spec.rb +1 -2
  586. data/spec/mongoid/persistence_context_spec.rb +0 -1
  587. data/spec/mongoid/positional_spec.rb +0 -1
  588. data/spec/mongoid/query_cache_middleware_spec.rb +1 -2
  589. data/spec/mongoid/query_cache_spec.rb +30 -8
  590. data/spec/mongoid/relations/proxy_spec.rb +6 -7
  591. data/spec/mongoid/reloadable_spec.rb +209 -23
  592. data/spec/mongoid/scopable_spec.rb +54 -22
  593. data/spec/mongoid/selectable_spec.rb +6 -7
  594. data/spec/mongoid/serializable_spec.rb +9 -10
  595. data/spec/mongoid/shardable_spec.rb +2 -3
  596. data/spec/mongoid/stateful_spec.rb +1 -2
  597. data/spec/mongoid/tasks/database_rake_spec.rb +0 -1
  598. data/spec/mongoid/tasks/database_spec.rb +0 -1
  599. data/spec/mongoid/threaded_spec.rb +2 -3
  600. data/spec/mongoid/timestamps/created/short_spec.rb +1 -2
  601. data/spec/mongoid/timestamps/created_spec.rb +1 -2
  602. data/spec/mongoid/timestamps/timeless_spec.rb +2 -3
  603. data/spec/mongoid/timestamps/updated/short_spec.rb +3 -4
  604. data/spec/mongoid/timestamps/updated_spec.rb +3 -4
  605. data/spec/mongoid/timestamps_spec.rb +6 -7
  606. data/spec/mongoid/touchable_spec.rb +15 -20
  607. data/spec/mongoid/touchable_spec_models.rb +0 -1
  608. data/spec/mongoid/traversable_spec.rb +65 -2
  609. data/spec/mongoid/validatable/associated_spec.rb +0 -1
  610. data/spec/mongoid/validatable/format_spec.rb +0 -1
  611. data/spec/mongoid/validatable/length_spec.rb +0 -1
  612. data/spec/mongoid/validatable/numericality_spec.rb +0 -1
  613. data/spec/mongoid/validatable/presence_spec.rb +26 -23
  614. data/spec/mongoid/validatable/uniqueness_spec.rb +67 -68
  615. data/spec/mongoid/validatable_spec.rb +2 -3
  616. data/spec/mongoid_spec.rb +0 -1
  617. data/spec/rails/controller_extension/controller_runtime_spec.rb +0 -1
  618. data/spec/rails/mongoid_spec.rb +0 -1
  619. data/spec/shared/lib/mrss/constraints.rb +10 -17
  620. data/spec/shared/lib/mrss/docker_runner.rb +23 -3
  621. data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
  622. data/spec/shared/lib/mrss/event_subscriber.rb +15 -5
  623. data/spec/shared/lib/mrss/lite_constraints.rb +40 -1
  624. data/spec/shared/share/Dockerfile.erb +56 -54
  625. data/spec/shared/shlib/config.sh +27 -0
  626. data/spec/shared/shlib/distro.sh +2 -1
  627. data/spec/shared/shlib/server.sh +46 -21
  628. data/spec/shared/shlib/set_env.sh +43 -5
  629. data/spec/spec_helper.rb +12 -22
  630. data/spec/support/authorization.rb +0 -1
  631. data/spec/support/constraints.rb +0 -1
  632. data/spec/support/expectations.rb +0 -1
  633. data/spec/support/macros.rb +31 -1
  634. data/spec/support/models/account.rb +1 -2
  635. data/spec/support/models/acolyte.rb +0 -1
  636. data/spec/support/models/actor.rb +0 -1
  637. data/spec/support/models/actress.rb +0 -1
  638. data/spec/support/models/address.rb +0 -1
  639. data/spec/support/models/address_component.rb +0 -1
  640. data/spec/support/models/address_number.rb +0 -1
  641. data/spec/support/models/agency.rb +0 -1
  642. data/spec/support/models/agent.rb +0 -1
  643. data/spec/support/models/album.rb +0 -1
  644. data/spec/support/models/alert.rb +0 -1
  645. data/spec/support/models/animal.rb +0 -1
  646. data/spec/support/models/answer.rb +0 -1
  647. data/spec/support/models/appointment.rb +0 -1
  648. data/spec/support/models/armrest.rb +0 -1
  649. data/spec/support/models/array_field.rb +0 -1
  650. data/spec/support/models/article.rb +0 -1
  651. data/spec/support/models/artist.rb +2 -1
  652. data/spec/support/models/artwork.rb +0 -1
  653. data/spec/support/models/audio.rb +0 -1
  654. data/spec/support/models/augmentation.rb +0 -1
  655. data/spec/support/models/author.rb +0 -1
  656. data/spec/support/models/baby.rb +0 -1
  657. data/spec/support/models/band.rb +4 -1
  658. data/spec/support/models/bar.rb +0 -1
  659. data/spec/support/models/basic.rb +0 -1
  660. data/spec/support/models/bed.rb +0 -1
  661. data/spec/support/models/big_palette.rb +0 -1
  662. data/spec/support/models/birthday.rb +0 -1
  663. data/spec/support/models/bolt.rb +0 -1
  664. data/spec/support/models/bomb.rb +0 -1
  665. data/spec/support/models/book.rb +0 -1
  666. data/spec/support/models/breed.rb +0 -1
  667. data/spec/support/models/browser.rb +0 -1
  668. data/spec/support/models/building.rb +0 -1
  669. data/spec/support/models/building_address.rb +0 -1
  670. data/spec/support/models/bus.rb +0 -1
  671. data/spec/support/models/business.rb +0 -1
  672. data/spec/support/models/callback_test.rb +0 -1
  673. data/spec/support/models/canvas.rb +0 -1
  674. data/spec/support/models/car.rb +0 -1
  675. data/spec/support/models/cat.rb +0 -1
  676. data/spec/support/models/category.rb +0 -1
  677. data/spec/support/models/child.rb +0 -1
  678. data/spec/support/models/child_doc.rb +3 -4
  679. data/spec/support/models/church.rb +0 -1
  680. data/spec/support/models/circle.rb +0 -1
  681. data/spec/support/models/circuit.rb +0 -1
  682. data/spec/support/models/circus.rb +0 -1
  683. data/spec/support/models/code.rb +2 -1
  684. data/spec/support/models/coding/pull_request.rb +0 -1
  685. data/spec/support/models/coding.rb +0 -1
  686. data/spec/support/models/comment.rb +0 -1
  687. data/spec/support/models/company.rb +0 -1
  688. data/spec/support/models/consumption_period.rb +0 -1
  689. data/spec/support/models/contextable_item.rb +0 -1
  690. data/spec/support/models/contractor.rb +0 -1
  691. data/spec/support/models/cookie.rb +0 -1
  692. data/spec/support/models/country_code.rb +2 -1
  693. data/spec/support/models/courier_job.rb +0 -1
  694. data/spec/support/models/crate.rb +0 -1
  695. data/spec/support/models/customer.rb +0 -1
  696. data/spec/support/models/customer_address.rb +0 -1
  697. data/spec/support/models/deed.rb +0 -1
  698. data/spec/support/models/definition.rb +0 -1
  699. data/spec/support/models/delegating_patient.rb +0 -1
  700. data/spec/support/models/description.rb +0 -1
  701. data/spec/support/models/dictionary.rb +0 -1
  702. data/spec/support/models/division.rb +0 -1
  703. data/spec/support/models/doctor.rb +0 -1
  704. data/spec/support/models/dog.rb +0 -1
  705. data/spec/support/models/dokument.rb +0 -1
  706. data/spec/support/models/draft.rb +0 -1
  707. data/spec/support/models/dragon.rb +0 -1
  708. data/spec/support/models/driver.rb +0 -1
  709. data/spec/support/models/drug.rb +0 -1
  710. data/spec/support/models/dungeon.rb +0 -1
  711. data/spec/support/models/edit.rb +0 -1
  712. data/spec/support/models/email.rb +0 -1
  713. data/spec/support/models/employer.rb +0 -1
  714. data/spec/support/models/entry.rb +0 -1
  715. data/spec/support/models/eraser.rb +0 -1
  716. data/spec/support/models/even.rb +0 -1
  717. data/spec/support/models/event.rb +0 -1
  718. data/spec/support/models/exhibition.rb +0 -1
  719. data/spec/support/models/exhibitor.rb +0 -1
  720. data/spec/support/models/explosion.rb +0 -1
  721. data/spec/support/models/eye.rb +0 -1
  722. data/spec/support/models/eye_bowl.rb +0 -1
  723. data/spec/support/models/face.rb +0 -1
  724. data/spec/support/models/favorite.rb +0 -1
  725. data/spec/support/models/filesystem.rb +0 -1
  726. data/spec/support/models/fire_hydrant.rb +0 -1
  727. data/spec/support/models/firefox.rb +0 -1
  728. data/spec/support/models/fish.rb +0 -1
  729. data/spec/support/models/folder.rb +0 -1
  730. data/spec/support/models/folder_item.rb +0 -1
  731. data/spec/support/models/fruits.rb +0 -1
  732. data/spec/support/models/game.rb +0 -1
  733. data/spec/support/models/ghost.rb +0 -1
  734. data/spec/support/models/guitar.rb +0 -1
  735. data/spec/support/models/hole.rb +0 -1
  736. data/spec/support/models/home.rb +0 -1
  737. data/spec/support/models/house.rb +0 -1
  738. data/spec/support/models/html_writer.rb +0 -1
  739. data/spec/support/models/id_key.rb +0 -1
  740. data/spec/support/models/idnodef.rb +0 -1
  741. data/spec/support/models/image.rb +0 -1
  742. data/spec/support/models/implant.rb +0 -1
  743. data/spec/support/models/instrument.rb +0 -1
  744. data/spec/support/models/item.rb +0 -1
  745. data/spec/support/models/jar.rb +0 -1
  746. data/spec/support/models/kaleidoscope.rb +0 -1
  747. data/spec/support/models/kangaroo.rb +0 -1
  748. data/spec/support/models/label.rb +2 -2
  749. data/spec/support/models/language.rb +0 -1
  750. data/spec/support/models/lat_lng.rb +0 -1
  751. data/spec/support/models/league.rb +0 -1
  752. data/spec/support/models/learner.rb +0 -1
  753. data/spec/support/models/line_item.rb +0 -1
  754. data/spec/support/models/location.rb +0 -1
  755. data/spec/support/models/login.rb +0 -1
  756. data/spec/support/models/manufacturer.rb +0 -1
  757. data/spec/support/models/meat.rb +0 -1
  758. data/spec/support/models/membership.rb +1 -1
  759. data/spec/support/models/message.rb +0 -1
  760. data/spec/support/models/minim.rb +0 -1
  761. data/spec/support/models/mixed_drink.rb +0 -1
  762. data/spec/support/models/mop.rb +0 -1
  763. data/spec/support/models/movie.rb +0 -1
  764. data/spec/support/models/my_hash.rb +0 -1
  765. data/spec/support/models/name.rb +0 -1
  766. data/spec/support/models/name_only.rb +0 -1
  767. data/spec/support/models/node.rb +0 -1
  768. data/spec/support/models/note.rb +0 -1
  769. data/spec/support/models/nut.rb +0 -1
  770. data/spec/support/models/odd.rb +0 -1
  771. data/spec/support/models/order.rb +2 -1
  772. data/spec/support/models/ordered_post.rb +1 -2
  773. data/spec/support/models/ordered_preference.rb +0 -1
  774. data/spec/support/models/oscar.rb +0 -1
  775. data/spec/support/models/other_owner_object.rb +0 -1
  776. data/spec/support/models/override.rb +0 -1
  777. data/spec/support/models/ownable.rb +0 -1
  778. data/spec/support/models/owner.rb +0 -1
  779. data/spec/support/models/pack.rb +0 -1
  780. data/spec/support/models/page.rb +0 -1
  781. data/spec/support/models/page_question.rb +0 -1
  782. data/spec/support/models/palette.rb +0 -1
  783. data/spec/support/models/parent.rb +0 -1
  784. data/spec/support/models/parent_doc.rb +0 -1
  785. data/spec/support/models/passport.rb +5 -1
  786. data/spec/support/models/patient.rb +0 -1
  787. data/spec/support/models/pdf_writer.rb +0 -1
  788. data/spec/support/models/pencil.rb +0 -1
  789. data/spec/support/models/person.rb +1 -1
  790. data/spec/support/models/pet.rb +0 -1
  791. data/spec/support/models/pet_owner.rb +0 -1
  792. data/spec/support/models/phone.rb +2 -2
  793. data/spec/support/models/piano.rb +0 -1
  794. data/spec/support/models/pizza.rb +0 -1
  795. data/spec/support/models/player.rb +0 -1
  796. data/spec/support/models/post.rb +0 -1
  797. data/spec/support/models/post_genre.rb +0 -1
  798. data/spec/support/models/powerup.rb +0 -1
  799. data/spec/support/models/preference.rb +0 -1
  800. data/spec/support/models/princess.rb +0 -1
  801. data/spec/support/models/product.rb +0 -1
  802. data/spec/support/models/profile.rb +0 -1
  803. data/spec/support/models/pronunciation.rb +0 -1
  804. data/spec/support/models/pub.rb +0 -1
  805. data/spec/support/models/publication/encyclopedia.rb +0 -1
  806. data/spec/support/models/publication/review.rb +0 -1
  807. data/spec/support/models/publication.rb +0 -1
  808. data/spec/support/models/purchase.rb +0 -1
  809. data/spec/support/models/purchased_item.rb +10 -0
  810. data/spec/support/models/question.rb +0 -1
  811. data/spec/support/models/quiz.rb +0 -1
  812. data/spec/support/models/rating.rb +0 -1
  813. data/spec/support/models/record.rb +0 -1
  814. data/spec/support/models/registry.rb +0 -1
  815. data/spec/support/models/role.rb +0 -1
  816. data/spec/support/models/root_category.rb +0 -1
  817. data/spec/support/models/sandwich.rb +0 -1
  818. data/spec/support/models/scheduler.rb +0 -1
  819. data/spec/support/models/scribe.rb +0 -1
  820. data/spec/support/models/sealer.rb +0 -1
  821. data/spec/support/models/seat.rb +0 -1
  822. data/spec/support/models/seo.rb +0 -1
  823. data/spec/support/models/series.rb +0 -1
  824. data/spec/support/models/server.rb +0 -1
  825. data/spec/support/models/service.rb +0 -1
  826. data/spec/support/models/shape.rb +0 -1
  827. data/spec/support/models/shelf.rb +0 -1
  828. data/spec/support/models/shipment_address.rb +0 -1
  829. data/spec/support/models/shipping_container.rb +0 -1
  830. data/spec/support/models/shipping_pack.rb +0 -1
  831. data/spec/support/models/shirt.rb +0 -1
  832. data/spec/support/models/shop.rb +0 -1
  833. data/spec/support/models/short_agent.rb +0 -1
  834. data/spec/support/models/short_quiz.rb +0 -1
  835. data/spec/support/models/simple.rb +0 -1
  836. data/spec/support/models/slave.rb +0 -1
  837. data/spec/support/models/song.rb +0 -1
  838. data/spec/support/models/sound.rb +0 -1
  839. data/spec/support/models/spacer.rb +0 -1
  840. data/spec/support/models/square.rb +0 -1
  841. data/spec/support/models/staff.rb +0 -1
  842. data/spec/support/models/store_as_dup_test1.rb +0 -1
  843. data/spec/support/models/store_as_dup_test2.rb +0 -1
  844. data/spec/support/models/store_as_dup_test3.rb +0 -1
  845. data/spec/support/models/store_as_dup_test4.rb +0 -1
  846. data/spec/support/models/strategy.rb +0 -1
  847. data/spec/support/models/sub_item.rb +0 -1
  848. data/spec/support/models/subscription.rb +0 -1
  849. data/spec/support/models/survey.rb +0 -1
  850. data/spec/support/models/symptom.rb +0 -1
  851. data/spec/support/models/tag.rb +0 -1
  852. data/spec/support/models/target.rb +0 -1
  853. data/spec/support/models/template.rb +0 -1
  854. data/spec/support/models/thing.rb +0 -1
  855. data/spec/support/models/threadlocker.rb +0 -1
  856. data/spec/support/models/title.rb +0 -1
  857. data/spec/support/models/tool.rb +0 -1
  858. data/spec/support/models/topping.rb +0 -1
  859. data/spec/support/models/toy.rb +0 -1
  860. data/spec/support/models/track.rb +0 -1
  861. data/spec/support/models/translation.rb +0 -1
  862. data/spec/support/models/tree.rb +0 -1
  863. data/spec/support/models/truck.rb +0 -1
  864. data/spec/support/models/updatable.rb +0 -1
  865. data/spec/support/models/user.rb +0 -1
  866. data/spec/support/models/user_account.rb +0 -1
  867. data/spec/support/models/validation_callback.rb +0 -1
  868. data/spec/support/models/vehicle.rb +0 -1
  869. data/spec/support/models/version.rb +0 -1
  870. data/spec/support/models/vertex.rb +0 -1
  871. data/spec/support/models/vet_visit.rb +0 -1
  872. data/spec/support/models/video.rb +0 -1
  873. data/spec/support/models/video_game.rb +0 -1
  874. data/spec/support/models/washer.rb +0 -1
  875. data/spec/support/models/weapon.rb +0 -1
  876. data/spec/support/models/wiki_page.rb +0 -1
  877. data/spec/support/models/word.rb +0 -1
  878. data/spec/support/models/word_origin.rb +0 -1
  879. data/spec/support/models/writer.rb +0 -1
  880. data/spec/support/schema_maps/schema_map_aws.json +17 -0
  881. data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
  882. data/spec/support/schema_maps/schema_map_azure.json +17 -0
  883. data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
  884. data/spec/support/schema_maps/schema_map_gcp.json +17 -0
  885. data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
  886. data/spec/support/schema_maps/schema_map_kmip.json +17 -0
  887. data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
  888. data/spec/support/schema_maps/schema_map_local.json +18 -0
  889. data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
  890. data/spec/support/shared/time.rb +0 -1
  891. data/spec/support/spec_config.rb +7 -1
  892. data.tar.gz.sig +0 -0
  893. metadata +51 -11
  894. metadata.gz.sig +0 -0
  895. data/lib/support/ruby_version.rb +0 -29
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # encoding: utf-8
3
2
 
4
3
  require "spec_helper"
5
4
 
@@ -10,7 +9,7 @@ describe Mongoid::Contextual::Mongo do
10
9
  describe "##{method}" do
11
10
 
12
11
  before do
13
- Band.create(name: "Depeche Mode")
12
+ Band.create!(name: "Depeche Mode")
14
13
  end
15
14
 
16
15
  context "when the count is zero" do
@@ -81,11 +80,11 @@ describe Mongoid::Contextual::Mongo do
81
80
  describe "#count" do
82
81
 
83
82
  let!(:depeche) do
84
- Band.create(name: "Depeche Mode")
83
+ Band.create!(name: "Depeche Mode")
85
84
  end
86
85
 
87
86
  let!(:new_order) do
88
- Band.create(name: "New Order")
87
+ Band.create!(name: "New Order")
89
88
  end
90
89
 
91
90
  let(:criteria) do
@@ -134,7 +133,7 @@ describe Mongoid::Contextual::Mongo do
134
133
  context "and a limit true" do
135
134
 
136
135
  before do
137
- 2.times { Band.create(name: "Depeche Mode", likes: 1) }
136
+ 2.times { Band.create!(name: "Depeche Mode", likes: 1) }
138
137
  end
139
138
 
140
139
  let(:count) do
@@ -152,7 +151,7 @@ describe Mongoid::Contextual::Mongo do
152
151
  context "when provided limit" do
153
152
 
154
153
  before do
155
- 2.times { Band.create(name: "Depeche Mode") }
154
+ 2.times { Band.create!(name: "Depeche Mode") }
156
155
  end
157
156
 
158
157
  let(:context) do
@@ -195,11 +194,11 @@ describe Mongoid::Contextual::Mongo do
195
194
  describe "#estimated_count" do
196
195
 
197
196
  let!(:depeche) do
198
- Band.create(name: "Depeche Mode")
197
+ Band.create!(name: "Depeche Mode")
199
198
  end
200
199
 
201
200
  let!(:new_order) do
202
- Band.create(name: "New Order")
201
+ Band.create!(name: "New Order")
203
202
  end
204
203
 
205
204
  let(:criteria) do
@@ -262,11 +261,11 @@ describe Mongoid::Contextual::Mongo do
262
261
  describe "##{method}" do
263
262
 
264
263
  let!(:depeche_mode) do
265
- Band.create(name: "Depeche Mode")
264
+ Band.create!(name: "Depeche Mode")
266
265
  end
267
266
 
268
267
  let!(:new_order) do
269
- Band.create(name: "New Order")
268
+ Band.create!(name: "New Order")
270
269
  end
271
270
 
272
271
  context "when the selector is contraining" do
@@ -367,11 +366,11 @@ describe Mongoid::Contextual::Mongo do
367
366
  describe "##{method}" do
368
367
 
369
368
  let!(:depeche_mode) do
370
- Band.create(name: "Depeche Mode")
369
+ Band.create!(name: "Depeche Mode")
371
370
  end
372
371
 
373
372
  let!(:new_order) do
374
- Band.create(name: "New Order")
373
+ Band.create!(name: "New Order")
375
374
  end
376
375
 
377
376
  context "when the selector is contraining" do
@@ -452,7 +451,7 @@ describe Mongoid::Contextual::Mongo do
452
451
  context 'when the write concern is unacknowledged' do
453
452
 
454
453
  before do
455
- 2.times { Band.create }
454
+ 2.times { Band.create! }
456
455
  end
457
456
 
458
457
  let(:criteria) do
@@ -474,27 +473,83 @@ describe Mongoid::Contextual::Mongo do
474
473
  describe "#distinct" do
475
474
 
476
475
  before do
477
- Band.create(name: "Depeche Mode", years: 30)
478
- Band.create(name: "New Order", years: 25)
476
+ Band.create!(name: "Depeche Mode", years: 30, sales: "1E2")
477
+ Band.create!(name: "New Order", years: 25, sales: "2E3")
478
+ Band.create!(name: "10,000 Maniacs", years: 20, sales: "1E2")
479
479
  end
480
480
 
481
- context "when limiting the result set" do
481
+ with_config_values :legacy_pluck_distinct, true, false do
482
+ context "when limiting the result set" do
482
483
 
483
- let(:criteria) do
484
- Band.where(name: "Depeche Mode")
484
+ let(:criteria) do
485
+ Band.where(name: "Depeche Mode")
486
+ end
487
+
488
+ let(:context) do
489
+ described_class.new(criteria)
490
+ end
491
+
492
+ it "returns the distinct matching fields" do
493
+ expect(context.distinct(:name)).to eq([ "Depeche Mode" ])
494
+ end
485
495
  end
486
496
 
487
- let(:context) do
488
- described_class.new(criteria)
497
+ context "when not limiting the result set" do
498
+
499
+ let(:criteria) do
500
+ Band.criteria
501
+ end
502
+
503
+ let(:context) do
504
+ described_class.new(criteria)
505
+ end
506
+
507
+ it "returns the distinct field values" do
508
+ expect(context.distinct(:name).sort).to eq([ "10,000 Maniacs", "Depeche Mode", "New Order" ].sort)
509
+ end
510
+ end
511
+
512
+ context "when providing an aliased field" do
513
+
514
+ let(:criteria) do
515
+ Band.criteria
516
+ end
517
+
518
+ let(:context) do
519
+ described_class.new(criteria)
520
+ end
521
+
522
+ it "returns the distinct field values" do
523
+ expect(context.distinct(:years).sort).to eq([ 20, 25, 30 ])
524
+ end
489
525
  end
490
526
 
491
- it "returns the distinct matching fields" do
492
- expect(context.distinct(:name)).to eq([ "Depeche Mode" ])
527
+ context 'when a collation is specified' do
528
+ min_server_version '3.4'
529
+
530
+ before do
531
+ Band.create!(name: 'DEPECHE MODE')
532
+ end
533
+
534
+ let(:context) do
535
+ described_class.new(criteria)
536
+ end
537
+
538
+ let(:expected_results) do
539
+ ["10,000 Maniacs", "Depeche Mode", "New Order"]
540
+ end
541
+
542
+ let(:criteria) do
543
+ Band.where({}).collation(locale: 'en_US', strength: 2)
544
+ end
545
+
546
+ it 'applies the collation' do
547
+ expect(context.distinct(:name).sort).to eq(expected_results.sort)
548
+ end
493
549
  end
494
550
  end
495
551
 
496
- context "when not limiting the result set" do
497
-
552
+ context "when providing a demongoizable field" do
498
553
  let(:criteria) do
499
554
  Band.criteria
500
555
  end
@@ -503,47 +558,253 @@ describe Mongoid::Contextual::Mongo do
503
558
  described_class.new(criteria)
504
559
  end
505
560
 
506
- it "returns the distinct field values" do
507
- expect(context.distinct(:name)).to eq([ "Depeche Mode", "New Order" ])
561
+ context "when legacy_pluck_distinct is set" do
562
+ config_override :legacy_pluck_distinct, true
563
+
564
+ it "returns the non-demongoized distinct field values" do
565
+ expect(context.distinct(:sales).sort).to eq([ "1E2", "2E3" ])
566
+ end
567
+ end
568
+
569
+ context "when legacy_pluck_distinct is not set" do
570
+ config_override :legacy_pluck_distinct, false
571
+
572
+ it "returns the non-demongoized distinct field values" do
573
+ expect(context.distinct(:sales).sort).to eq([ BigDecimal("1E2"), BigDecimal("2E3") ])
574
+ end
508
575
  end
509
576
  end
510
577
 
511
- context "when providing an aliased field" do
578
+ context "when getting a localized field" do
579
+ before do
580
+ I18n.locale = :en
581
+ d = Dictionary.create!(description: 'english-text')
582
+ I18n.locale = :de
583
+ d.description = 'deutsch-text'
584
+ d.save!
585
+ end
586
+
587
+ after do
588
+ I18n.locale = :en
589
+ end
512
590
 
513
591
  let(:criteria) do
514
- Band.criteria
592
+ Dictionary.criteria
515
593
  end
516
594
 
517
595
  let(:context) do
518
596
  described_class.new(criteria)
519
597
  end
520
598
 
521
- it "returns the distinct field values" do
522
- expect(context.distinct(:years).sort).to eq([ 25, 30 ])
599
+ context "when getting the field without _translations" do
600
+ context "when legacy_pluck_distinct is set" do
601
+ config_override :legacy_pluck_distinct, true
602
+
603
+ it "gets the full hash" do
604
+ expect(context.distinct(:description)).to eq([{ "de" => "deutsch-text", "en" => "english-text" }])
605
+ end
606
+ end
607
+
608
+ context "when legacy_pluck_distinct is not set" do
609
+ config_override :legacy_pluck_distinct, false
610
+
611
+ it "gets the demongoized localized field" do
612
+ expect(context.distinct(:description)).to eq([ 'deutsch-text' ])
613
+ end
614
+ end
523
615
  end
524
- end
525
616
 
526
- context 'when a collation is specified' do
527
- min_server_version '3.4'
617
+ context "when getting the field with _translations" do
618
+ context "when legacy_pluck_distinct is set" do
619
+ config_override :legacy_pluck_distinct, true
528
620
 
529
- before do
530
- Band.create(name: 'DEPECHE MODE')
621
+ it "gets an empty list" do
622
+ expect(context.distinct(:description_translations)).to eq([])
623
+ end
624
+ end
625
+
626
+ context "when legacy_pluck_distinct is not set" do
627
+ config_override :legacy_pluck_distinct, false
628
+
629
+ it "gets the full hash" do
630
+ expect(context.distinct(:description_translations)).to eq([ { "de" => "deutsch-text", "en" => "english-text" } ])
631
+ end
632
+ end
531
633
  end
532
634
 
533
- let(:context) do
534
- described_class.new(criteria)
635
+ context 'when plucking a specific locale' do
636
+
637
+ let(:distinct) do
638
+ context.distinct(:'description.de')
639
+ end
640
+
641
+ context "when legacy_pluck_distinct is set" do
642
+ config_override :legacy_pluck_distinct, true
643
+
644
+ it 'returns the specific translation' do
645
+ expect(distinct).to eq([ 'deutsch-text' ])
646
+ end
647
+ end
648
+
649
+ context "when legacy_pluck_distinct is not set" do
650
+ config_override :legacy_pluck_distinct, false
651
+
652
+ it 'returns the specific translation' do
653
+ expect(distinct).to eq([ "deutsch-text" ])
654
+ end
655
+ end
535
656
  end
536
657
 
537
- let(:expected_results) do
538
- ["Depeche Mode", "New Order"]
658
+ context 'when plucking a specific locale from _translations field' do
659
+
660
+ let(:distinct) do
661
+ context.distinct(:'description_translations.de')
662
+ end
663
+
664
+ context "when legacy_pluck_distinct is set" do
665
+ config_override :legacy_pluck_distinct, true
666
+
667
+ it 'returns the empty list' do
668
+ expect(distinct).to eq([])
669
+ end
670
+ end
671
+
672
+ context "when legacy_pluck_distinct is not set" do
673
+ config_override :legacy_pluck_distinct, false
674
+
675
+ it 'returns the specific translations' do
676
+ expect(distinct).to eq(['deutsch-text'])
677
+ end
678
+ end
539
679
  end
540
680
 
541
- let(:criteria) do
542
- Band.where({}).collation(locale: 'en_US', strength: 2)
681
+ context 'when fallbacks are enabled with a locale list' do
682
+ require_fallbacks
683
+
684
+ around(:all) do |example|
685
+ prev_fallbacks = I18n.fallbacks.dup
686
+ I18n.fallbacks[:he] = [ :en ]
687
+ example.run
688
+ I18n.fallbacks = prev_fallbacks
689
+ end
690
+
691
+ after do
692
+ I18n.locale = :en
693
+ end
694
+
695
+ let(:distinct) do
696
+ context.distinct(:description).first
697
+ end
698
+
699
+ context "when legacy_pluck_distinct is set" do
700
+ config_override :legacy_pluck_distinct, true
701
+
702
+ it "does not correctly use the fallback" do
703
+ distinct.should == {"de"=>"deutsch-text", "en"=>"english-text"}
704
+ end
705
+ end
706
+
707
+ context "when legacy_pluck_distinct is not set" do
708
+ config_override :legacy_pluck_distinct, false
709
+
710
+ it "correctly uses the fallback" do
711
+ I18n.locale = :en
712
+ d = Dictionary.create!(description: 'english-text')
713
+ I18n.locale = :he
714
+ distinct.should == "english-text"
715
+ end
716
+ end
717
+ end
718
+
719
+ context "when the localized field is embedded" do
720
+ before do
721
+ p = Passport.new
722
+ I18n.locale = :en
723
+ p.name = "Neil"
724
+ I18n.locale = :he
725
+ p.name = "Nissim"
726
+
727
+ Person.create!(passport: p, employer_id: 12345)
728
+ end
729
+
730
+ after do
731
+ I18n.locale = :en
732
+ end
733
+
734
+ let(:criteria) do
735
+ Person.where(employer_id: 12345)
736
+ end
737
+
738
+ let(:context) do
739
+ described_class.new(criteria)
740
+ end
741
+
742
+ let(:distinct) do
743
+ context.distinct("pass.name").first
744
+ end
745
+
746
+ let(:distinct_translations) do
747
+ context.distinct("pass.name_translations").first
748
+ end
749
+
750
+ let(:distinct_translations_field) do
751
+ context.distinct("pass.name_translations.en").first
752
+ end
753
+
754
+ context "when legacy_pluck_distinct is set" do
755
+ config_override :legacy_pluck_distinct, true
756
+
757
+ it "returns the full hash" do
758
+ expect(distinct).to eq({ "en" => "Neil", "he" => "Nissim" })
759
+ end
760
+
761
+ it "returns the empty hash" do
762
+ expect(distinct_translations).to eq(nil)
763
+ end
764
+
765
+ it "returns the empty hash" do
766
+ expect(distinct_translations_field).to eq(nil)
767
+ end
768
+ end
769
+
770
+ context "when legacy_pluck_distinct is not set" do
771
+ config_override :legacy_pluck_distinct, false
772
+
773
+ it "returns the translation for the current locale" do
774
+ expect(distinct).to eq("Nissim")
775
+ end
776
+
777
+ it "returns the full _translation hash" do
778
+ expect(distinct_translations).to eq({ "en" => "Neil", "he" => "Nissim" })
779
+ end
780
+
781
+ it "returns the translation for the requested locale" do
782
+ expect(distinct_translations_field).to eq("Neil")
783
+ end
784
+ end
785
+ end
786
+ end
787
+
788
+ context "when getting an embedded field" do
789
+
790
+ let(:label) { Label.new(sales: "1E2") }
791
+ let!(:band) { Band.create!(label: label) }
792
+ let(:criteria) { Band.where(_id: band.id) }
793
+ let(:context) { described_class.new(criteria) }
794
+
795
+ context "when legacy_pluck_distinct is set" do
796
+ config_override :legacy_pluck_distinct, true
797
+
798
+ it "returns the distinct matching fields" do
799
+ expect(context.distinct("label.sales")).to eq([ "1E2" ])
800
+ end
543
801
  end
544
802
 
545
- it 'applies the collation' do
546
- expect(context.distinct(:name)).to eq(expected_results)
803
+ context "when legacy_pluck_distinct is not set" do
804
+ config_override :legacy_pluck_distinct, false
805
+ it "returns the distinct matching fields" do
806
+ expect(context.distinct("label.sales")).to eq([ BigDecimal("1E2") ])
807
+ end
547
808
  end
548
809
  end
549
810
  end
@@ -551,7 +812,7 @@ describe Mongoid::Contextual::Mongo do
551
812
  describe "#each" do
552
813
 
553
814
  before do
554
- Band.create(name: "Depeche Mode")
815
+ Band.create!(name: "Depeche Mode")
555
816
  end
556
817
 
557
818
  let(:criteria) do
@@ -629,7 +890,7 @@ describe Mongoid::Contextual::Mongo do
629
890
  context "when iterating with next" do
630
891
 
631
892
  before do
632
- 10.times { |i| Band.create(name: "Test #{i}") }
893
+ 10.times { |i| Band.create!(name: "Test #{i}") }
633
894
  end
634
895
 
635
896
  let(:criteria) do
@@ -641,8 +902,21 @@ describe Mongoid::Contextual::Mongo do
641
902
  end
642
903
 
643
904
  it "does not load all documents" do
644
- expect(Mongo::Logger.logger).to receive(:debug?).exactly(2).times.and_call_original
905
+ subscriber = Mrss::EventSubscriber.new
906
+ context.view.client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
907
+
645
908
  enum.next
909
+
910
+ find_events = subscriber.all_events.select do |evt|
911
+ evt.command_name == 'find'
912
+ end
913
+ expect(find_events.length).to be(2)
914
+ get_more_events = subscriber.all_events.select do |evt|
915
+ evt.command_name == 'getMore'
916
+ end
917
+ expect(get_more_events.length).to be(0)
918
+ ensure
919
+ context.view.client.unsubscribe(Mongo::Monitoring::COMMAND, subscriber)
646
920
  end
647
921
  end
648
922
  end
@@ -651,9 +925,9 @@ describe Mongoid::Contextual::Mongo do
651
925
  context 'when the criteria has a parent document' do
652
926
 
653
927
  before do
654
- Post.create(person: person)
655
- Post.create(person: person)
656
- Post.create(person: person)
928
+ Post.create!(person: person)
929
+ Post.create!(person: person)
930
+ Post.create!(person: person)
657
931
  end
658
932
 
659
933
  let(:person) do
@@ -700,7 +974,7 @@ describe Mongoid::Contextual::Mongo do
700
974
  describe "#exists?" do
701
975
 
702
976
  before do
703
- Band.create(name: "Depeche Mode")
977
+ Band.create!(name: "Depeche Mode")
704
978
  end
705
979
 
706
980
  context "when the count is zero" do
@@ -813,11 +1087,11 @@ describe Mongoid::Contextual::Mongo do
813
1087
  describe "#find_one_and_replace" do
814
1088
 
815
1089
  let!(:depeche) do
816
- Band.create(name: "Depeche Mode")
1090
+ Band.create!(name: "Depeche Mode")
817
1091
  end
818
1092
 
819
1093
  let!(:tool) do
820
- Band.create(name: "Tool")
1094
+ Band.create!(name: "Tool")
821
1095
  end
822
1096
 
823
1097
  context "when the selector matches" do
@@ -969,11 +1243,11 @@ describe Mongoid::Contextual::Mongo do
969
1243
  describe "#find_one_and_update" do
970
1244
 
971
1245
  let!(:depeche) do
972
- Band.create(name: "Depeche Mode")
1246
+ Band.create!(name: "Depeche Mode")
973
1247
  end
974
1248
 
975
1249
  let!(:tool) do
976
- Band.create(name: "Tool")
1250
+ Band.create!(name: "Tool")
977
1251
  end
978
1252
 
979
1253
  context "when the selector matches" do
@@ -1122,7 +1396,7 @@ describe Mongoid::Contextual::Mongo do
1122
1396
  describe "#find_one_and_delete" do
1123
1397
 
1124
1398
  let!(:depeche) do
1125
- Band.create(name: "Depeche Mode")
1399
+ Band.create!(name: "Depeche Mode")
1126
1400
  end
1127
1401
 
1128
1402
  let(:criteria) do
@@ -1201,11 +1475,15 @@ describe Mongoid::Contextual::Mongo do
1201
1475
  describe "##{method}" do
1202
1476
 
1203
1477
  let!(:depeche_mode) do
1204
- Band.create(name: "Depeche Mode")
1478
+ Band.create!(name: "Depeche Mode")
1205
1479
  end
1206
1480
 
1207
1481
  let!(:new_order) do
1208
- Band.create(name: "New Order")
1482
+ Band.create!(name: "New Order")
1483
+ end
1484
+
1485
+ let!(:rolling_stones) do
1486
+ Band.create!(name: "The Rolling Stones")
1209
1487
  end
1210
1488
 
1211
1489
  context "when the context is not cached" do
@@ -1248,14 +1526,14 @@ describe Mongoid::Contextual::Mongo do
1248
1526
  context "when there is sort on the context" do
1249
1527
 
1250
1528
  it "follows the main sort" do
1251
- expect(context.send(method)).to eq(new_order)
1529
+ expect(context.send(method)).to eq(rolling_stones)
1252
1530
  end
1253
1531
  end
1254
1532
 
1255
1533
  context "when subsequently calling #last" do
1256
1534
 
1257
1535
  it "returns the correct document" do
1258
- expect(context.send(method)).to eq(new_order)
1536
+ expect(context.send(method)).to eq(rolling_stones)
1259
1537
  expect(context.last).to eq(depeche_mode)
1260
1538
  end
1261
1539
  end
@@ -1280,23 +1558,22 @@ describe Mongoid::Contextual::Mongo do
1280
1558
 
1281
1559
  it 'returns the last document, sorted by _id' do
1282
1560
  expect(context.send(method)).to eq(depeche_mode)
1283
- expect(context.last).to eq(new_order)
1561
+ expect(context.last).to eq(rolling_stones)
1284
1562
  end
1285
1563
  end
1286
1564
 
1287
- context 'with option { sort: :none }' do
1288
-
1565
+ context 'with option { id_sort: :none }' do
1289
1566
  let(:opts) do
1290
1567
  { id_sort: :none }
1291
1568
  end
1292
1569
 
1293
- it 'does not apply the sort on _id' do
1570
+ it 'applies the sort on _id' do
1294
1571
  expect(context.send(method, opts)).to eq(depeche_mode)
1295
1572
  end
1296
1573
 
1297
1574
  context 'when calling #last' do
1298
1575
 
1299
- it 'does not apply a sort on _id' do
1576
+ it 'doesn\'t apply a sort on _id' do
1300
1577
  expect(context.send(method, opts)).to eq(depeche_mode)
1301
1578
  expect(context.last(opts)).to eq(depeche_mode)
1302
1579
  end
@@ -1314,33 +1591,32 @@ describe Mongoid::Contextual::Mongo do
1314
1591
  described_class.new(criteria)
1315
1592
  end
1316
1593
 
1317
-
1318
1594
  it 'applies the criteria sort' do
1319
- expect(context.send(method)).to eq(new_order)
1595
+ expect(context.send(method)).to eq(rolling_stones)
1320
1596
  end
1321
1597
 
1322
1598
  context 'when calling #last' do
1323
1599
 
1324
1600
  it 'applies the criteria sort' do
1325
- expect(context.send(method)).to eq(new_order)
1601
+ expect(context.send(method)).to eq(rolling_stones)
1326
1602
  expect(context.last).to eq(depeche_mode)
1327
1603
  end
1328
1604
  end
1329
1605
 
1330
- context 'with option { sort: :none }' do
1606
+ context 'with option { id_sort: :none }' do
1331
1607
 
1332
1608
  let(:opts) do
1333
1609
  { id_sort: :none }
1334
1610
  end
1335
1611
 
1336
- it 'applies the criteria sort' do
1337
- expect(context.send(method, opts)).to eq(new_order)
1612
+ it 'uses the preexisting sort' do
1613
+ expect(context.send(method, opts)).to eq(rolling_stones)
1338
1614
  end
1339
1615
 
1340
1616
  context 'when calling #last' do
1341
1617
 
1342
- it 'applies the criteria sort' do
1343
- expect(context.send(method, opts)).to eq(new_order)
1618
+ it 'uses the preexisting sort' do
1619
+ expect(context.send(method, opts)).to eq(rolling_stones)
1344
1620
  expect(context.last(opts)).to eq(depeche_mode)
1345
1621
  end
1346
1622
  end
@@ -1360,14 +1636,14 @@ describe Mongoid::Contextual::Mongo do
1360
1636
  context "when there is sort on the context" do
1361
1637
 
1362
1638
  it "follows the main sort" do
1363
- expect(context.send(method)).to eq(new_order)
1639
+ expect(context.send(method)).to eq(rolling_stones)
1364
1640
  end
1365
1641
  end
1366
1642
 
1367
1643
  context "when subsequently calling #last" do
1368
1644
 
1369
1645
  it "returns the correct document" do
1370
- expect(context.send(method)).to eq(new_order)
1646
+ expect(context.send(method)).to eq(rolling_stones)
1371
1647
  expect(context.last).to eq(depeche_mode)
1372
1648
  end
1373
1649
  end
@@ -1407,95 +1683,769 @@ describe Mongoid::Contextual::Mongo do
1407
1683
  end
1408
1684
  end
1409
1685
  end
1410
- end
1411
- end
1412
-
1413
- describe "#initialize" do
1414
-
1415
- let(:criteria) do
1416
- Band.where(name: "Depeche Mode").no_timeout
1417
- end
1418
1686
 
1419
- let(:context) do
1420
- described_class.new(criteria)
1421
- end
1422
-
1423
- it "sets the criteria" do
1424
- expect(context.criteria).to eq(criteria)
1425
- end
1687
+ context "when including a limit" do
1426
1688
 
1427
- it "sets the klass" do
1428
- expect(context.klass).to eq(Band)
1429
- end
1689
+ context "when the context is not cached" do
1430
1690
 
1431
- it "sets the view" do
1432
- expect(context.view).to be_a(Mongo::Collection::View)
1433
- end
1691
+ let(:context) do
1692
+ described_class.new(criteria)
1693
+ end
1434
1694
 
1435
- it "sets the view selector" do
1436
- expect(context.view.selector).to eq({ "name" => "Depeche Mode" })
1437
- end
1438
- end
1695
+ context "when the limit is 1" do
1696
+ let(:criteria) do
1697
+ Band.criteria
1698
+ end
1439
1699
 
1440
- [ :length, :size ].each do |method|
1700
+ let(:docs) do
1701
+ context.send(method, 1)
1702
+ end
1441
1703
 
1442
- describe "##{method}" do
1704
+ it "returns an array of documents" do
1705
+ expect(docs).to eq([ depeche_mode ])
1706
+ end
1707
+ end
1443
1708
 
1444
- before do
1445
- Band.create!(name: "Depeche Mode")
1446
- Band.create!(name: "New Order")
1447
- end
1709
+ context "when the limit is >1" do
1710
+ let(:criteria) do
1711
+ Band.criteria
1712
+ end
1448
1713
 
1449
- context "when the criteria has a limit" do
1714
+ let(:docs) do
1715
+ context.send(method, 2)
1716
+ end
1450
1717
 
1451
- let(:criteria) do
1452
- Band.limit(1)
1453
- end
1718
+ it "returns the number of documents in order" do
1719
+ expect(docs).to eq([ depeche_mode, new_order ])
1720
+ end
1721
+ end
1454
1722
 
1455
- let(:context) do
1456
- described_class.new(criteria)
1457
- end
1723
+ context 'when the criteria has a collation' do
1724
+ min_server_version '3.4'
1458
1725
 
1459
- it "returns the number of documents that match" do
1460
- expect(context.send(method)).to eq(2)
1461
- end
1726
+ let(:criteria) do
1727
+ Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
1728
+ end
1462
1729
 
1463
- context "when calling more than once" do
1464
- it "returns the cached value for subsequent calls" do
1465
- expect(context.view).to receive(:count_documents).once.and_return(2)
1466
- 2.times { expect(context.send(method)).to eq(2) }
1730
+ it "returns the first matching document" do
1731
+ expect(context.send(method, 1)).to eq([ depeche_mode ])
1732
+ end
1467
1733
  end
1468
1734
  end
1469
1735
 
1470
- context "when the results have been iterated over" do
1471
-
1472
- before do
1473
- context.entries
1474
- end
1736
+ context "when the context is cached" do
1475
1737
 
1476
- it "returns the cached value for all calls" do
1477
- expect(context.view).to receive(:count_documents).once.and_return(2)
1478
- expect(context.send(method)).to eq(2)
1738
+ let(:context) do
1739
+ described_class.new(criteria)
1479
1740
  end
1480
1741
 
1481
- context "when the results have been iterated over multiple times" do
1742
+ context "when the whole context is loaded" do
1482
1743
 
1483
1744
  before do
1484
- context.entries
1745
+ context.to_a
1485
1746
  end
1486
1747
 
1487
- it "resets the length on each full iteration" do
1488
- expect(context.size).to eq(2)
1489
- end
1490
- end
1491
- end
1492
- end
1748
+ context "when all of the documents are cached" do
1493
1749
 
1494
- context "when the criteria has no limit" do
1750
+ let(:criteria) do
1751
+ Band.all.cache
1752
+ end
1495
1753
 
1496
- let(:criteria) do
1497
- Band.where(name: "Depeche Mode")
1498
- end
1754
+ context "when requesting all of the documents" do
1755
+
1756
+ let(:docs) do
1757
+ context.send(method, 3)
1758
+ end
1759
+
1760
+ it "returns all of the documents without touching the database" do
1761
+ expect(context).to receive(:view).never
1762
+ expect(docs).to eq([ depeche_mode, new_order, rolling_stones ])
1763
+ end
1764
+ end
1765
+
1766
+ context "when requesting fewer than all of the documents" do
1767
+
1768
+ let(:docs) do
1769
+ context.send(method, 2)
1770
+ end
1771
+
1772
+ it "returns all of the documents without touching the database" do
1773
+ expect(context).to receive(:view).never
1774
+ expect(docs).to eq([ depeche_mode, new_order ])
1775
+ end
1776
+ end
1777
+ end
1778
+
1779
+ context "when only one document is cached" do
1780
+
1781
+ let(:criteria) do
1782
+ Band.where(name: "Depeche Mode").cache
1783
+ end
1784
+
1785
+ context "when requesting one document" do
1786
+
1787
+ let(:docs) do
1788
+ context.send(method, 1)
1789
+ end
1790
+
1791
+ it "returns one document without touching the database" do
1792
+ expect(context).to receive(:view).never
1793
+ expect(docs).to eq([ depeche_mode ])
1794
+ end
1795
+ end
1796
+ end
1797
+ end
1798
+
1799
+ context "when the first method was called before" do
1800
+
1801
+ let(:context) do
1802
+ described_class.new(criteria)
1803
+ end
1804
+
1805
+ let(:criteria) do
1806
+ Band.all.cache
1807
+ end
1808
+
1809
+ before do
1810
+ context.first(before_limit)
1811
+ end
1812
+
1813
+ let(:docs) do
1814
+ context.send(method, limit)
1815
+ end
1816
+
1817
+ context "when getting all of the documents before" do
1818
+ let(:before_limit) { 3 }
1819
+
1820
+ context "when getting all of the documents" do
1821
+ let(:limit) { 3 }
1822
+
1823
+ it "returns all documents without touching the database" do
1824
+ expect(context).to receive(:view).never
1825
+ expect(docs).to eq([ depeche_mode, new_order, rolling_stones ])
1826
+ end
1827
+ end
1828
+
1829
+ context "when getting fewer documents" do
1830
+ let(:limit) { 2 }
1831
+
1832
+ it "returns the correct documents without touching the database" do
1833
+ expect(context).to receive(:view).never
1834
+ expect(docs).to eq([ depeche_mode, new_order ])
1835
+ end
1836
+ end
1837
+ end
1838
+
1839
+ context "when getting fewer documents before" do
1840
+ let(:before_limit) { 2 }
1841
+
1842
+ context "when getting the same number of documents" do
1843
+ let(:limit) { 2 }
1844
+
1845
+ it "returns the correct documents without touching the database" do
1846
+ expect(context).to receive(:view).never
1847
+ expect(docs).to eq([ depeche_mode, new_order ])
1848
+ end
1849
+ end
1850
+
1851
+ context "when getting more documents" do
1852
+ let(:limit) { 3 }
1853
+
1854
+ it "returns the correct documents and touches the database" do
1855
+ expect(context).to receive(:view).exactly(3).times.and_call_original
1856
+ expect(docs).to eq([ depeche_mode, new_order, rolling_stones ])
1857
+ end
1858
+ end
1859
+ end
1860
+
1861
+ context "when getting one document before" do
1862
+ let(:before_limit) { 1 }
1863
+
1864
+ context "when getting one document" do
1865
+ let(:limit) { 1 }
1866
+
1867
+ it "returns the correct documents without touching the database" do
1868
+ expect(context).to receive(:view).never
1869
+ expect(docs).to eq([ depeche_mode ])
1870
+ end
1871
+ end
1872
+
1873
+ context "when getting more than one document" do
1874
+ let(:limit) { 3 }
1875
+
1876
+ it "returns the correct documents and touches the database" do
1877
+ expect(context).to receive(:view).exactly(3).times.and_call_original
1878
+ expect(docs).to eq([ depeche_mode, new_order, rolling_stones ])
1879
+ end
1880
+ end
1881
+ end
1882
+ end
1883
+ end
1884
+ end
1885
+
1886
+ context "when calling #first then #last" do
1887
+
1888
+ let(:context) do
1889
+ described_class.new(criteria)
1890
+ end
1891
+
1892
+ let(:criteria) do
1893
+ Band.all.cache
1894
+ end
1895
+
1896
+ before do
1897
+ context.first(before_limit)
1898
+ end
1899
+
1900
+ let(:docs) do
1901
+ context.last(limit)
1902
+ end
1903
+
1904
+ context "when getting one from the beginning and one from the end" do
1905
+ let(:before_limit) { 2 }
1906
+ let(:limit) { 1 }
1907
+
1908
+ it "gets the correct document" do
1909
+ expect(docs).to eq([rolling_stones])
1910
+ end
1911
+ end
1912
+ end
1913
+ end
1914
+ end
1915
+
1916
+ describe "#last" do
1917
+ let!(:depeche_mode) do
1918
+ Band.create!(name: "Depeche Mode")
1919
+ end
1920
+
1921
+ let!(:new_order) do
1922
+ Band.create!(name: "New Order")
1923
+ end
1924
+
1925
+ let!(:rolling_stones) do
1926
+ Band.create!(name: "The Rolling Stones")
1927
+ end
1928
+
1929
+ context "when the context is not cached" do
1930
+
1931
+ let(:criteria) do
1932
+ Band.where(name: "Depeche Mode")
1933
+ end
1934
+
1935
+ let(:context) do
1936
+ described_class.new(criteria)
1937
+ end
1938
+
1939
+ it "returns the last matching document" do
1940
+ expect(context.last).to eq(depeche_mode)
1941
+ end
1942
+
1943
+ context 'when the criteria has a collation' do
1944
+ min_server_version '3.4'
1945
+
1946
+ let(:criteria) do
1947
+ Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
1948
+ end
1949
+
1950
+ it "returns the last matching document" do
1951
+ expect(context.last).to eq(depeche_mode)
1952
+ end
1953
+ end
1954
+ end
1955
+
1956
+ context "when using .desc" do
1957
+
1958
+ let(:criteria) do
1959
+ Band.desc(:name)
1960
+ end
1961
+
1962
+ let(:context) do
1963
+ described_class.new(criteria)
1964
+ end
1965
+
1966
+ context "when there is sort on the context" do
1967
+
1968
+ it "follows the main sort" do
1969
+ expect(context.last).to eq(depeche_mode)
1970
+ end
1971
+ end
1972
+
1973
+ context "when subsequently calling #first" do
1974
+
1975
+ it "returns the correct document" do
1976
+ expect(context.last).to eq(depeche_mode)
1977
+ expect(context.first).to eq(rolling_stones)
1978
+ end
1979
+ end
1980
+ end
1981
+
1982
+ context 'when the criteria has no sort' do
1983
+
1984
+ let(:criteria) do
1985
+ Band.all
1986
+ end
1987
+
1988
+ let(:context) do
1989
+ described_class.new(criteria)
1990
+ end
1991
+
1992
+ it 'applies a sort on _id' do
1993
+ expect(context.last).to eq(rolling_stones)
1994
+ end
1995
+
1996
+ context 'when calling #first' do
1997
+
1998
+ it 'returns the first document, sorted by _id' do
1999
+ pending "MONGOID-5416"
2000
+ expect(context.last).to eq(rolling_stones)
2001
+ expect(context.first).to eq(depeche_mode)
2002
+ end
2003
+ end
2004
+
2005
+ context 'with option { id_sort: :none }' do
2006
+ let(:opts) do
2007
+ { id_sort: :none }
2008
+ end
2009
+
2010
+ it 'doesn\'t apply the sort on _id' do
2011
+ expect(context.last(opts)).to eq(depeche_mode)
2012
+ end
2013
+
2014
+ context 'when calling #first' do
2015
+
2016
+ it 'doesn\'t apply the sort on _id' do
2017
+ pending "MONGOID-5416"
2018
+ expect(context.last(opts)).to eq(rolling_stones)
2019
+ expect(context.first(opts)).to eq(depeche_mode)
2020
+ end
2021
+ end
2022
+ end
2023
+ end
2024
+
2025
+ context 'when the criteria has a sort' do
2026
+
2027
+ let(:criteria) do
2028
+ Band.desc(:name)
2029
+ end
2030
+
2031
+ let(:context) do
2032
+ described_class.new(criteria)
2033
+ end
2034
+
2035
+
2036
+ it 'applies the criteria sort' do
2037
+ expect(context.last).to eq(depeche_mode)
2038
+ end
2039
+
2040
+ context 'when calling #first' do
2041
+
2042
+ it 'applies the criteria sort' do
2043
+ expect(context.last).to eq(depeche_mode)
2044
+ expect(context.first).to eq(rolling_stones)
2045
+ end
2046
+ end
2047
+
2048
+ context 'with option { id_sort: :none }' do
2049
+
2050
+ let(:opts) do
2051
+ { id_sort: :none }
2052
+ end
2053
+
2054
+ it 'uses the preexisting sort' do
2055
+ expect(context.last(opts)).to eq(depeche_mode)
2056
+ end
2057
+
2058
+ context 'when calling #first' do
2059
+
2060
+ it 'uses the preexisting sort' do
2061
+ expect(context.last(opts)).to eq(depeche_mode)
2062
+ expect(context.first(opts)).to eq(rolling_stones)
2063
+ end
2064
+ end
2065
+ end
2066
+ end
2067
+
2068
+ context "when using .sort" do
2069
+
2070
+ let(:criteria) do
2071
+ Band.all.sort(:name => -1).criteria
2072
+ end
2073
+
2074
+ let(:context) do
2075
+ described_class.new(criteria)
2076
+ end
2077
+
2078
+ context "when there is sort on the context" do
2079
+
2080
+ it "follows the main sort" do
2081
+ expect(context.last).to eq(depeche_mode)
2082
+ end
2083
+ end
2084
+
2085
+ context "when subsequently calling #first" do
2086
+
2087
+ it "returns the correct document" do
2088
+ expect(context.last).to eq(depeche_mode)
2089
+ expect(context.first).to eq(rolling_stones)
2090
+ end
2091
+ end
2092
+ end
2093
+
2094
+ context "when the context is cached" do
2095
+
2096
+ let(:criteria) do
2097
+ Band.where(name: "Depeche Mode").cache
2098
+ end
2099
+
2100
+ let(:context) do
2101
+ described_class.new(criteria)
2102
+ end
2103
+
2104
+ context "when the cache is loaded" do
2105
+
2106
+ before do
2107
+ context.to_a
2108
+ end
2109
+
2110
+ it "returns the last document without touching the database" do
2111
+ expect(context).to receive(:view).never
2112
+ expect(context.last).to eq(depeche_mode)
2113
+ end
2114
+ end
2115
+
2116
+ context "when last method was called before" do
2117
+
2118
+ before do
2119
+ context.last
2120
+ end
2121
+
2122
+ it "returns the last document without touching the database" do
2123
+ expect(context).to receive(:view).never
2124
+ expect(context.last).to eq(depeche_mode)
2125
+ end
2126
+ end
2127
+ end
2128
+
2129
+ context "when including a limit" do
2130
+
2131
+ context "when the context is not cached" do
2132
+
2133
+ let(:context) do
2134
+ described_class.new(criteria)
2135
+ end
2136
+
2137
+ context "when the limit is 1" do
2138
+ let(:criteria) do
2139
+ Band.criteria
2140
+ end
2141
+
2142
+ let(:docs) do
2143
+ context.last(1)
2144
+ end
2145
+
2146
+ it "returns an array of documents" do
2147
+ expect(docs).to eq([ rolling_stones ])
2148
+ end
2149
+ end
2150
+
2151
+ context "when the limit is >1" do
2152
+ let(:criteria) do
2153
+ Band.criteria
2154
+ end
2155
+
2156
+ let(:docs) do
2157
+ context.last(2)
2158
+ end
2159
+
2160
+ it "returns the number of documents in order" do
2161
+ expect(docs).to eq([ new_order, rolling_stones ])
2162
+ end
2163
+ end
2164
+
2165
+ context 'when the criteria has a collation' do
2166
+ min_server_version '3.4'
2167
+
2168
+ let(:criteria) do
2169
+ Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
2170
+ end
2171
+
2172
+ it "returns the first matching document" do
2173
+ expect(context.last(1)).to eq([ depeche_mode ])
2174
+ end
2175
+ end
2176
+ end
2177
+
2178
+ context "when the context is cached" do
2179
+
2180
+ let(:context) do
2181
+ described_class.new(criteria)
2182
+ end
2183
+
2184
+ context "when the whole context is loaded" do
2185
+
2186
+ before do
2187
+ context.to_a
2188
+ end
2189
+
2190
+ context "when all of the documents are cached" do
2191
+
2192
+ let(:criteria) do
2193
+ Band.all.cache
2194
+ end
2195
+
2196
+ context "when requesting all of the documents" do
2197
+
2198
+ let(:docs) do
2199
+ context.last(3)
2200
+ end
2201
+
2202
+ it "returns all of the documents without touching the database" do
2203
+ expect(context).to receive(:view).never
2204
+ expect(docs).to eq([ depeche_mode, new_order, rolling_stones ])
2205
+ end
2206
+ end
2207
+
2208
+ context "when requesting fewer than all of the documents" do
2209
+
2210
+ let(:docs) do
2211
+ context.last(2)
2212
+ end
2213
+
2214
+ it "returns all of the documents without touching the database" do
2215
+ expect(context).to receive(:view).never
2216
+ expect(docs).to eq([ new_order, rolling_stones ])
2217
+ end
2218
+ end
2219
+ end
2220
+
2221
+ context "when only one document is cached" do
2222
+
2223
+ let(:criteria) do
2224
+ Band.where(name: "Depeche Mode").cache
2225
+ end
2226
+
2227
+ context "when requesting one document" do
2228
+
2229
+ let(:docs) do
2230
+ context.last(1)
2231
+ end
2232
+
2233
+ it "returns one document without touching the database" do
2234
+ expect(context).to receive(:view).never
2235
+ expect(docs).to eq([ depeche_mode ])
2236
+ end
2237
+ end
2238
+ end
2239
+ end
2240
+
2241
+ context "when the last method was called before" do
2242
+
2243
+ let(:context) do
2244
+ described_class.new(criteria)
2245
+ end
2246
+
2247
+ let(:criteria) do
2248
+ Band.all.cache
2249
+ end
2250
+
2251
+ before do
2252
+ context.last(before_limit)
2253
+ end
2254
+
2255
+ let(:docs) do
2256
+ context.last(limit)
2257
+ end
2258
+
2259
+ context "when getting all of the documents before" do
2260
+ let(:before_limit) { 3 }
2261
+
2262
+ context "when getting all of the documents" do
2263
+ let(:limit) { 3 }
2264
+
2265
+ it "returns all documents without touching the database" do
2266
+ expect(context).to receive(:view).never
2267
+ expect(docs).to eq([ depeche_mode, new_order, rolling_stones ])
2268
+ end
2269
+ end
2270
+
2271
+ context "when getting fewer documents" do
2272
+ let(:limit) { 2 }
2273
+
2274
+ it "returns the correct documents without touching the database" do
2275
+ expect(context).to receive(:view).never
2276
+ expect(docs).to eq([ new_order, rolling_stones ])
2277
+ end
2278
+ end
2279
+ end
2280
+
2281
+ context "when getting fewer documents before" do
2282
+ let(:before_limit) { 2 }
2283
+
2284
+ context "when getting the same number of documents" do
2285
+ let(:limit) { 2 }
2286
+
2287
+ it "returns the correct documents without touching the database" do
2288
+ expect(context).to receive(:view).never
2289
+ expect(docs).to eq([ new_order, rolling_stones ])
2290
+ end
2291
+ end
2292
+
2293
+ context "when getting more documents" do
2294
+ let(:limit) { 3 }
2295
+
2296
+ it "returns the correct documents and touches the database" do
2297
+ expect(context).to receive(:view).twice.and_call_original
2298
+ expect(docs).to eq([ depeche_mode, new_order, rolling_stones ])
2299
+ end
2300
+ end
2301
+ end
2302
+
2303
+ context "when getting one document before" do
2304
+ let(:before_limit) { 1 }
2305
+
2306
+ context "when getting one document" do
2307
+ let(:limit) { 1 }
2308
+
2309
+ it "returns the correct documents without touching the database" do
2310
+ expect(context).to receive(:view).never
2311
+ expect(docs).to eq([ rolling_stones ])
2312
+ end
2313
+ end
2314
+
2315
+ context "when getting more than one document" do
2316
+ let(:limit) { 3 }
2317
+
2318
+ it "returns the correct documents and touches the database" do
2319
+ expect(context).to receive(:view).twice.and_call_original
2320
+ expect(docs).to eq([ depeche_mode, new_order, rolling_stones ])
2321
+ end
2322
+ end
2323
+ end
2324
+ end
2325
+ end
2326
+ end
2327
+
2328
+ context "when calling #last then #first" do
2329
+
2330
+ let(:context) do
2331
+ described_class.new(criteria)
2332
+ end
2333
+
2334
+ let(:criteria) do
2335
+ Band.all.cache
2336
+ end
2337
+
2338
+ before do
2339
+ context.last(before_limit)
2340
+ end
2341
+
2342
+ let(:docs) do
2343
+ context.first(limit)
2344
+ end
2345
+
2346
+ context "when getting one from the beginning and one from the end" do
2347
+ let(:before_limit) { 2 }
2348
+ let(:limit) { 1 }
2349
+
2350
+ it "hits the database" do
2351
+ expect(context).to receive(:view).exactly(3).times.and_call_original
2352
+ docs
2353
+ end
2354
+
2355
+ it "gets the correct document" do
2356
+ pending "MONGOID-5416"
2357
+ expect(docs).to eq([ depeche_mode ])
2358
+ end
2359
+ end
2360
+ end
2361
+ end
2362
+
2363
+ describe "#initialize" do
2364
+
2365
+ let(:criteria) do
2366
+ Band.where(name: "Depeche Mode").no_timeout
2367
+ end
2368
+
2369
+ let(:context) do
2370
+ described_class.new(criteria)
2371
+ end
2372
+
2373
+ it "sets the criteria" do
2374
+ expect(context.criteria).to eq(criteria)
2375
+ end
2376
+
2377
+ it "sets the klass" do
2378
+ expect(context.klass).to eq(Band)
2379
+ end
2380
+
2381
+ it "sets the view" do
2382
+ expect(context.view).to be_a(Mongo::Collection::View)
2383
+ end
2384
+
2385
+ it "sets the view selector" do
2386
+ expect(context.view.selector).to eq({ "name" => "Depeche Mode" })
2387
+ end
2388
+ end
2389
+
2390
+ [ :length, :size ].each do |method|
2391
+
2392
+ describe "##{method}" do
2393
+
2394
+ before do
2395
+ Band.create!(name: "Depeche Mode")
2396
+ Band.create!(name: "New Order")
2397
+ end
2398
+
2399
+ context "when the criteria has a limit" do
2400
+
2401
+ let(:criteria) do
2402
+ Band.limit(1)
2403
+ end
2404
+
2405
+ let(:context) do
2406
+ described_class.new(criteria)
2407
+ end
2408
+
2409
+ it "returns the number of documents that match" do
2410
+ expect(context.send(method)).to eq(2)
2411
+ end
2412
+
2413
+ context "when calling more than once" do
2414
+ it "returns the cached value for subsequent calls" do
2415
+ expect(context.view).to receive(:count_documents).once.and_return(2)
2416
+ 2.times { expect(context.send(method)).to eq(2) }
2417
+ end
2418
+ end
2419
+
2420
+ context "when the results have been iterated over" do
2421
+
2422
+ before do
2423
+ context.entries
2424
+ end
2425
+
2426
+ it "returns the cached value for all calls" do
2427
+ expect(context.view).to receive(:count_documents).once.and_return(2)
2428
+ expect(context.send(method)).to eq(2)
2429
+ end
2430
+
2431
+ context "when the results have been iterated over multiple times" do
2432
+
2433
+ before do
2434
+ context.entries
2435
+ end
2436
+
2437
+ it "resets the length on each full iteration" do
2438
+ expect(context.size).to eq(2)
2439
+ end
2440
+ end
2441
+ end
2442
+ end
2443
+
2444
+ context "when the criteria has no limit" do
2445
+
2446
+ let(:criteria) do
2447
+ Band.where(name: "Depeche Mode")
2448
+ end
1499
2449
 
1500
2450
  let(:context) do
1501
2451
  described_class.new(criteria)
@@ -1541,11 +2491,11 @@ describe Mongoid::Contextual::Mongo do
1541
2491
  describe "#limit" do
1542
2492
 
1543
2493
  let!(:depeche_mode) do
1544
- Band.create(name: "Depeche Mode")
2494
+ Band.create!(name: "Depeche Mode")
1545
2495
  end
1546
2496
 
1547
2497
  let!(:new_order) do
1548
- Band.create(name: "New Order")
2498
+ Band.create!(name: "New Order")
1549
2499
  end
1550
2500
 
1551
2501
  let(:criteria) do
@@ -1561,11 +2511,85 @@ describe Mongoid::Contextual::Mongo do
1561
2511
  end
1562
2512
  end
1563
2513
 
2514
+ describe "#take" do
2515
+
2516
+ let!(:depeche_mode) do
2517
+ Band.create!(name: "Depeche Mode")
2518
+ end
2519
+
2520
+ let!(:new_order) do
2521
+ Band.create!(name: "New Order")
2522
+ end
2523
+
2524
+ let!(:rolling_stones) do
2525
+ Band.create!(name: "The Rolling Stones")
2526
+ end
2527
+
2528
+ let(:criteria) do
2529
+ Band.all
2530
+ end
2531
+
2532
+ let(:context) do
2533
+ described_class.new(criteria)
2534
+ end
2535
+
2536
+ it "takes the correct number results" do
2537
+ expect(context.take(2)).to eq([ depeche_mode, new_order ])
2538
+ end
2539
+
2540
+ it "returns an array when passing 1" do
2541
+ expect(context.take(1)).to eq([ depeche_mode ])
2542
+ end
2543
+
2544
+ it "does not return an array when not passing an argument" do
2545
+ expect(context.take).to eq(depeche_mode)
2546
+ end
2547
+
2548
+ it "returns all the documents taking more than whats in the db" do
2549
+ expect(context.take(5)).to eq([ depeche_mode, new_order, rolling_stones ])
2550
+ end
2551
+ end
2552
+
2553
+ describe "#take!" do
2554
+
2555
+ let!(:depeche_mode) do
2556
+ Band.create!(name: "Depeche Mode")
2557
+ end
2558
+
2559
+ let!(:new_order) do
2560
+ Band.create!(name: "New Order")
2561
+ end
2562
+
2563
+ let!(:rolling_stones) do
2564
+ Band.create!(name: "The Rolling Stones")
2565
+ end
2566
+
2567
+ let(:criteria) do
2568
+ Band.all
2569
+ end
2570
+
2571
+ let(:context) do
2572
+ described_class.new(criteria)
2573
+ end
2574
+
2575
+ it "takes the first document" do
2576
+ expect(context.take!).to eq(depeche_mode)
2577
+ end
2578
+
2579
+ context "when there are no documents" do
2580
+ it "raises an error" do
2581
+ expect do
2582
+ Person.take!
2583
+ end.to raise_error(Mongoid::Errors::DocumentNotFound)
2584
+ end
2585
+ end
2586
+ end
2587
+
1564
2588
  describe "#map" do
1565
2589
 
1566
2590
  before do
1567
- Band.create(name: "Depeche Mode")
1568
- Band.create(name: "New Order")
2591
+ Band.create!(name: "Depeche Mode")
2592
+ Band.create!(name: "New Order")
1569
2593
  end
1570
2594
 
1571
2595
  let(:criteria) do
@@ -1578,7 +2602,8 @@ describe Mongoid::Contextual::Mongo do
1578
2602
 
1579
2603
  context "when passed the symbol field name" do
1580
2604
 
1581
- it "performs mapping" do
2605
+ it "performs mapping and warns" do
2606
+ expect(Mongoid::Warnings).to receive(:warn_map_field_deprecated)
1582
2607
  expect(context.map(:name)).to eq ["Depeche Mode", "New Order"]
1583
2608
  end
1584
2609
  end
@@ -1594,11 +2619,11 @@ describe Mongoid::Contextual::Mongo do
1594
2619
  describe "#map_reduce" do
1595
2620
 
1596
2621
  let!(:depeche_mode) do
1597
- Band.create(name: "Depeche Mode", likes: 200)
2622
+ Band.create!(name: "Depeche Mode", likes: 200)
1598
2623
  end
1599
2624
 
1600
2625
  let!(:tool) do
1601
- Band.create(name: "Tool", likes: 100)
2626
+ Band.create!(name: "Tool", likes: 100)
1602
2627
  end
1603
2628
 
1604
2629
  let(:map) do
@@ -2023,11 +3048,11 @@ describe Mongoid::Contextual::Mongo do
2023
3048
  describe "#skip" do
2024
3049
 
2025
3050
  let!(:depeche_mode) do
2026
- Band.create(name: "Depeche Mode")
3051
+ Band.create!(name: "Depeche Mode")
2027
3052
  end
2028
3053
 
2029
3054
  let!(:new_order) do
2030
- Band.create(name: "New Order")
3055
+ Band.create!(name: "New Order")
2031
3056
  end
2032
3057
 
2033
3058
  let(:criteria) do
@@ -2046,11 +3071,11 @@ describe Mongoid::Contextual::Mongo do
2046
3071
  describe "#sort" do
2047
3072
 
2048
3073
  let!(:depeche_mode) do
2049
- Band.create(name: "Depeche Mode")
3074
+ Band.create!(name: "Depeche Mode")
2050
3075
  end
2051
3076
 
2052
3077
  let!(:new_order) do
2053
- Band.create(name: "New Order")
3078
+ Band.create!(name: "New Order")
2054
3079
  end
2055
3080
 
2056
3081
  let(:criteria) do
@@ -2089,11 +3114,11 @@ describe Mongoid::Contextual::Mongo do
2089
3114
  describe "#update" do
2090
3115
 
2091
3116
  let!(:depeche_mode) do
2092
- Band.create(name: "Depeche Mode")
3117
+ Band.create!(name: "Depeche Mode")
2093
3118
  end
2094
3119
 
2095
3120
  let!(:new_order) do
2096
- Band.create(name: "New Order")
3121
+ Band.create!(name: "New Order")
2097
3122
  end
2098
3123
 
2099
3124
  let(:criteria) do
@@ -2107,11 +3132,11 @@ describe Mongoid::Contextual::Mongo do
2107
3132
  context "when adding an element to a HABTM set" do
2108
3133
 
2109
3134
  let(:person) do
2110
- Person.create
3135
+ Person.create!
2111
3136
  end
2112
3137
 
2113
3138
  let(:preference) do
2114
- Preference.create
3139
+ Preference.create!
2115
3140
  end
2116
3141
 
2117
3142
  before do
@@ -2250,12 +3275,12 @@ describe Mongoid::Contextual::Mongo do
2250
3275
  b.labels << Label.new(name: 'Warner')
2251
3276
  b.labels << Label.new(name: 'Sony')
2252
3277
  b.labels << Label.new(name: 'Cbs')
2253
- b.save
3278
+ b.save!
2254
3279
 
2255
3280
  b = Band.new(name: 'FKA Twigs')
2256
3281
  b.labels << Label.new(name: 'Warner')
2257
3282
  b.labels << Label.new(name: 'Cbs')
2258
- b.save
3283
+ b.save!
2259
3284
  end
2260
3285
 
2261
3286
 
@@ -2281,11 +3306,11 @@ describe Mongoid::Contextual::Mongo do
2281
3306
  describe "#update_all" do
2282
3307
 
2283
3308
  let!(:depeche_mode) do
2284
- Band.create(name: "Depeche Mode", origin: "Essex")
3309
+ Band.create!(name: "Depeche Mode", origin: "Essex")
2285
3310
  end
2286
3311
 
2287
3312
  let!(:new_order) do
2288
- Band.create(name: "New Order")
3313
+ Band.create!(name: "New Order")
2289
3314
  end
2290
3315
 
2291
3316
  let(:criteria) do
@@ -2423,12 +3448,12 @@ describe Mongoid::Contextual::Mongo do
2423
3448
  b.labels << Label.new(name: 'Warner')
2424
3449
  b.labels << Label.new(name: 'Sony')
2425
3450
  b.labels << Label.new(name: 'Cbs')
2426
- b.save
3451
+ b.save!
2427
3452
 
2428
3453
  b = Band.new(name: 'FKA Twigs')
2429
3454
  b.labels << Label.new(name: 'Warner')
2430
3455
  b.labels << Label.new(name: 'Cbs')
2431
- b.save
3456
+ b.save!
2432
3457
  end
2433
3458
 
2434
3459