mongoid 6.4.4 → 7.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1369) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +30 -30
  4. data/LICENSE +1 -0
  5. data/README.md +34 -20
  6. data/Rakefile +75 -5
  7. data/lib/config/locales/en.yml +149 -66
  8. data/lib/mongoid/association/accessors.rb +402 -0
  9. data/lib/mongoid/association/bindable.rb +179 -0
  10. data/lib/mongoid/association/builders.rb +84 -0
  11. data/lib/mongoid/association/constrainable.rb +43 -0
  12. data/lib/mongoid/association/depending.rb +128 -0
  13. data/lib/mongoid/association/eager_loadable.rb +35 -0
  14. data/lib/mongoid/association/embedded/batchable.rb +358 -0
  15. data/lib/mongoid/association/embedded/cyclic.rb +102 -0
  16. data/lib/mongoid/association/embedded/embedded_in/binding.rb +52 -0
  17. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +38 -0
  18. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +111 -0
  19. data/lib/mongoid/association/embedded/embedded_in.rb +134 -0
  20. data/lib/mongoid/association/embedded/embeds_many/binding.rb +41 -0
  21. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +45 -0
  22. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +549 -0
  23. data/lib/mongoid/association/embedded/embeds_many.rb +183 -0
  24. data/lib/mongoid/association/embedded/embeds_one/binding.rb +43 -0
  25. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +39 -0
  26. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +145 -0
  27. data/lib/mongoid/association/embedded/embeds_one.rb +150 -0
  28. data/lib/mongoid/association/embedded.rb +6 -0
  29. data/lib/mongoid/association/macros.rb +227 -0
  30. data/lib/mongoid/association/many.rb +198 -0
  31. data/lib/mongoid/association/marshalable.rb +31 -0
  32. data/lib/mongoid/association/nested/many.rb +191 -0
  33. data/lib/mongoid/association/nested/nested_buildable.rb +66 -0
  34. data/lib/mongoid/association/nested/one.rb +116 -0
  35. data/lib/mongoid/association/nested.rb +15 -0
  36. data/lib/mongoid/association/one.rb +53 -0
  37. data/lib/mongoid/association/options.rb +122 -0
  38. data/lib/mongoid/association/proxy.rb +189 -0
  39. data/lib/mongoid/association/referenced/auto_save.rb +73 -0
  40. data/lib/mongoid/association/referenced/belongs_to/binding.rb +82 -0
  41. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +48 -0
  42. data/lib/mongoid/association/referenced/belongs_to/eager.rb +73 -0
  43. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +125 -0
  44. data/lib/mongoid/association/referenced/belongs_to.rb +226 -0
  45. data/lib/mongoid/association/referenced/counter_cache.rb +152 -0
  46. data/lib/mongoid/association/referenced/eager.rb +163 -0
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +72 -0
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +40 -0
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +53 -0
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +292 -0
  51. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +270 -0
  52. data/lib/mongoid/association/referenced/has_many/binding.rb +36 -0
  53. data/lib/mongoid/association/referenced/has_many/buildable.rb +38 -0
  54. data/lib/mongoid/association/referenced/has_many/eager.rb +44 -0
  55. data/lib/mongoid/association/referenced/has_many/enumerable.rb +502 -0
  56. data/lib/mongoid/association/referenced/has_many/proxy.rb +545 -0
  57. data/lib/mongoid/association/referenced/has_many.rb +251 -0
  58. data/lib/mongoid/association/referenced/has_one/binding.rb +42 -0
  59. data/lib/mongoid/association/referenced/has_one/buildable.rb +74 -0
  60. data/lib/mongoid/association/referenced/has_one/eager.rb +36 -0
  61. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +113 -0
  62. data/lib/mongoid/association/referenced/has_one/proxy.rb +111 -0
  63. data/lib/mongoid/association/referenced/has_one.rb +184 -0
  64. data/lib/mongoid/association/referenced/syncable.rb +155 -0
  65. data/lib/mongoid/association/referenced.rb +9 -0
  66. data/lib/mongoid/association/reflections.rb +69 -0
  67. data/lib/mongoid/association/relatable.rb +455 -0
  68. data/lib/mongoid/association.rb +135 -0
  69. data/lib/mongoid/atomic/modifiers.rb +27 -51
  70. data/lib/mongoid/atomic/paths/embedded/many.rb +5 -8
  71. data/lib/mongoid/atomic/paths/embedded/one.rb +5 -8
  72. data/lib/mongoid/atomic/paths/embedded.rb +3 -4
  73. data/lib/mongoid/atomic/paths/root.rb +4 -7
  74. data/lib/mongoid/atomic/paths.rb +2 -1
  75. data/lib/mongoid/atomic.rb +43 -48
  76. data/lib/mongoid/attributes/dynamic.rb +19 -33
  77. data/lib/mongoid/attributes/nested.rb +29 -21
  78. data/lib/mongoid/attributes/processing.rb +11 -26
  79. data/lib/mongoid/attributes/projector.rb +119 -0
  80. data/lib/mongoid/attributes/readonly.rb +5 -10
  81. data/lib/mongoid/attributes.rb +94 -91
  82. data/lib/mongoid/cacheable.rb +6 -9
  83. data/lib/mongoid/changeable.rb +7 -61
  84. data/lib/mongoid/clients/factory.rb +42 -17
  85. data/lib/mongoid/clients/options.rb +17 -18
  86. data/lib/mongoid/clients/sessions.rb +22 -10
  87. data/lib/mongoid/clients/storage_options.rb +7 -12
  88. data/lib/mongoid/clients/validators/storage.rb +2 -9
  89. data/lib/mongoid/clients/validators.rb +2 -1
  90. data/lib/mongoid/clients.rb +3 -10
  91. data/lib/mongoid/composable.rb +9 -13
  92. data/lib/mongoid/config/environment.rb +51 -13
  93. data/lib/mongoid/config/options.rb +20 -23
  94. data/lib/mongoid/config/validators/client.rb +2 -17
  95. data/lib/mongoid/config/validators/option.rb +2 -3
  96. data/lib/mongoid/config/validators.rb +2 -1
  97. data/lib/mongoid/config.rb +117 -40
  98. data/lib/mongoid/contextual/aggregable/memory.rb +17 -12
  99. data/lib/mongoid/contextual/aggregable/mongo.rb +25 -26
  100. data/lib/mongoid/contextual/aggregable/none.rb +65 -0
  101. data/lib/mongoid/contextual/aggregable.rb +17 -0
  102. data/lib/mongoid/contextual/atomic.rb +29 -31
  103. data/lib/mongoid/contextual/command.rb +2 -5
  104. data/lib/mongoid/contextual/geo_near.rb +7 -38
  105. data/lib/mongoid/contextual/map_reduce.rb +5 -33
  106. data/lib/mongoid/contextual/memory.rb +167 -70
  107. data/lib/mongoid/contextual/mongo.rb +281 -109
  108. data/lib/mongoid/contextual/none.rb +88 -28
  109. data/lib/mongoid/contextual/queryable.rb +2 -3
  110. data/lib/mongoid/contextual.rb +7 -9
  111. data/lib/mongoid/copyable.rb +20 -14
  112. data/lib/mongoid/criteria/findable.rb +12 -15
  113. data/lib/mongoid/criteria/includable.rb +21 -28
  114. data/lib/mongoid/criteria/inspectable.rb +2 -3
  115. data/lib/mongoid/criteria/marshalable.rb +2 -5
  116. data/lib/mongoid/criteria/modifiable.rb +10 -22
  117. data/lib/mongoid/criteria/options.rb +4 -5
  118. data/lib/mongoid/criteria/permission.rb +2 -1
  119. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -13
  120. data/lib/mongoid/criteria/queryable/expandable.rb +68 -0
  121. data/lib/mongoid/criteria/queryable/extensions/array.rb +5 -26
  122. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +3 -4
  123. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +3 -4
  124. data/lib/mongoid/criteria/queryable/extensions/date.rb +3 -8
  125. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +5 -11
  126. data/lib/mongoid/criteria/queryable/extensions/hash.rb +4 -25
  127. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +3 -14
  128. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +4 -13
  129. data/lib/mongoid/criteria/queryable/extensions/object.rb +4 -29
  130. data/lib/mongoid/criteria/queryable/extensions/range.rb +41 -17
  131. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +9 -16
  132. data/lib/mongoid/criteria/queryable/extensions/set.rb +3 -4
  133. data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -19
  134. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +3 -10
  135. data/lib/mongoid/criteria/queryable/extensions/time.rb +4 -9
  136. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +13 -6
  137. data/lib/mongoid/criteria/queryable/extensions.rb +1 -4
  138. data/lib/mongoid/criteria/queryable/key.rb +101 -27
  139. data/lib/mongoid/criteria/queryable/macroable.rb +3 -4
  140. data/lib/mongoid/criteria/queryable/mergeable.rb +205 -44
  141. data/lib/mongoid/criteria/queryable/optional.rb +5 -48
  142. data/lib/mongoid/criteria/queryable/options.rb +2 -19
  143. data/lib/mongoid/criteria/queryable/pipeline.rb +14 -19
  144. data/lib/mongoid/criteria/queryable/selectable.rb +436 -166
  145. data/lib/mongoid/criteria/queryable/selector.rb +45 -55
  146. data/lib/mongoid/criteria/queryable/smash.rb +2 -11
  147. data/lib/mongoid/criteria/queryable/storable.rb +237 -0
  148. data/lib/mongoid/criteria/queryable.rb +7 -9
  149. data/lib/mongoid/criteria/scopable.rb +27 -19
  150. data/lib/mongoid/criteria.rb +90 -75
  151. data/lib/mongoid/document.rb +36 -74
  152. data/lib/mongoid/equality.rb +29 -12
  153. data/lib/mongoid/errors/ambiguous_relationship.rb +4 -5
  154. data/lib/mongoid/errors/callback.rb +2 -3
  155. data/lib/mongoid/errors/criteria_argument_required.rb +18 -0
  156. data/lib/mongoid/errors/delete_restriction.rb +10 -13
  157. data/lib/mongoid/errors/document_not_destroyed.rb +4 -7
  158. data/lib/mongoid/errors/document_not_found.rb +25 -15
  159. data/lib/mongoid/errors/eager_load.rb +6 -5
  160. data/lib/mongoid/errors/empty_config_file.rb +25 -0
  161. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +2 -3
  162. data/lib/mongoid/errors/invalid_collection.rb +2 -1
  163. data/lib/mongoid/errors/invalid_config_file.rb +25 -0
  164. data/lib/mongoid/errors/invalid_config_option.rb +2 -3
  165. data/lib/mongoid/errors/invalid_dependent_strategy.rb +31 -0
  166. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +24 -0
  167. data/lib/mongoid/errors/invalid_elem_match_operator.rb +32 -0
  168. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +25 -0
  169. data/lib/mongoid/errors/invalid_expression_operator.rb +27 -0
  170. data/lib/mongoid/errors/invalid_field.rb +2 -5
  171. data/lib/mongoid/errors/invalid_field_operator.rb +32 -0
  172. data/lib/mongoid/errors/invalid_field_option.rb +2 -3
  173. data/lib/mongoid/errors/invalid_find.rb +2 -3
  174. data/lib/mongoid/errors/invalid_includes.rb +2 -3
  175. data/lib/mongoid/errors/invalid_index.rb +2 -3
  176. data/lib/mongoid/errors/invalid_options.rb +4 -5
  177. data/lib/mongoid/errors/invalid_path.rb +2 -3
  178. data/lib/mongoid/errors/invalid_persistence_option.rb +2 -5
  179. data/lib/mongoid/errors/invalid_query.rb +40 -0
  180. data/lib/mongoid/errors/invalid_relation.rb +4 -9
  181. data/lib/mongoid/errors/invalid_relation_option.rb +28 -0
  182. data/lib/mongoid/errors/invalid_scope.rb +2 -3
  183. data/lib/mongoid/errors/invalid_session_use.rb +3 -6
  184. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +6 -5
  185. data/lib/mongoid/errors/invalid_storage_options.rb +2 -3
  186. data/lib/mongoid/errors/invalid_storage_parent.rb +2 -3
  187. data/lib/mongoid/errors/invalid_time.rb +2 -3
  188. data/lib/mongoid/errors/invalid_value.rb +2 -1
  189. data/lib/mongoid/errors/inverse_not_found.rb +3 -4
  190. data/lib/mongoid/errors/mixed_client_configuration.rb +2 -3
  191. data/lib/mongoid/errors/mixed_relations.rb +2 -3
  192. data/lib/mongoid/errors/mongoid_error.rb +3 -10
  193. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +3 -4
  194. data/lib/mongoid/errors/no_client_config.rb +4 -5
  195. data/lib/mongoid/errors/no_client_database.rb +2 -3
  196. data/lib/mongoid/errors/no_client_hosts.rb +2 -3
  197. data/lib/mongoid/errors/no_clients_config.rb +2 -3
  198. data/lib/mongoid/errors/no_default_client.rb +3 -4
  199. data/lib/mongoid/errors/no_environment.rb +2 -3
  200. data/lib/mongoid/errors/no_map_reduce_output.rb +2 -3
  201. data/lib/mongoid/errors/no_metadata.rb +2 -3
  202. data/lib/mongoid/errors/no_parent.rb +2 -3
  203. data/lib/mongoid/errors/readonly_attribute.rb +2 -3
  204. data/lib/mongoid/errors/readonly_document.rb +3 -6
  205. data/lib/mongoid/errors/scope_overwrite.rb +2 -1
  206. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +2 -0
  207. data/lib/mongoid/errors/unknown_attribute.rb +2 -3
  208. data/lib/mongoid/errors/unknown_model.rb +24 -0
  209. data/lib/mongoid/errors/unsaved_document.rb +3 -2
  210. data/lib/mongoid/errors/unsupported_javascript.rb +2 -3
  211. data/lib/mongoid/errors/validations.rb +2 -1
  212. data/lib/mongoid/errors.rb +15 -1
  213. data/lib/mongoid/evolvable.rb +4 -5
  214. data/lib/mongoid/extensions/array.rb +33 -42
  215. data/lib/mongoid/extensions/big_decimal.rb +2 -11
  216. data/lib/mongoid/extensions/boolean.rb +3 -5
  217. data/lib/mongoid/extensions/date.rb +13 -12
  218. data/lib/mongoid/extensions/date_time.rb +4 -12
  219. data/lib/mongoid/extensions/decimal128.rb +2 -5
  220. data/lib/mongoid/extensions/false_class.rb +4 -7
  221. data/lib/mongoid/extensions/float.rb +5 -10
  222. data/lib/mongoid/extensions/hash.rb +56 -38
  223. data/lib/mongoid/extensions/integer.rb +5 -12
  224. data/lib/mongoid/extensions/module.rb +2 -3
  225. data/lib/mongoid/extensions/nil_class.rb +2 -5
  226. data/lib/mongoid/extensions/object.rb +21 -48
  227. data/lib/mongoid/extensions/object_id.rb +2 -7
  228. data/lib/mongoid/extensions/range.rb +3 -11
  229. data/lib/mongoid/extensions/regexp.rb +3 -4
  230. data/lib/mongoid/extensions/set.rb +2 -7
  231. data/lib/mongoid/extensions/string.rb +24 -42
  232. data/lib/mongoid/extensions/symbol.rb +2 -7
  233. data/lib/mongoid/extensions/time.rb +12 -9
  234. data/lib/mongoid/extensions/time_with_zone.rb +25 -7
  235. data/lib/mongoid/extensions/true_class.rb +4 -7
  236. data/lib/mongoid/extensions.rb +18 -7
  237. data/lib/mongoid/factory.rb +59 -10
  238. data/lib/mongoid/fields/foreign_key.rb +8 -27
  239. data/lib/mongoid/fields/localized.rb +2 -11
  240. data/lib/mongoid/fields/standard.rb +8 -50
  241. data/lib/mongoid/fields/validators/macro.rb +37 -19
  242. data/lib/mongoid/fields/validators.rb +2 -1
  243. data/lib/mongoid/fields.rb +245 -70
  244. data/lib/mongoid/findable.rb +78 -27
  245. data/lib/mongoid/indexable/specification.rb +3 -16
  246. data/lib/mongoid/indexable/validators/options.rb +2 -7
  247. data/lib/mongoid/indexable.rb +10 -22
  248. data/lib/mongoid/inspectable.rb +4 -11
  249. data/lib/mongoid/interceptable.rb +18 -35
  250. data/lib/mongoid/loggable.rb +13 -16
  251. data/lib/mongoid/matchable.rb +3 -153
  252. data/lib/mongoid/matcher/all.rb +22 -0
  253. data/lib/mongoid/matcher/and.rb +21 -0
  254. data/lib/mongoid/matcher/bits.rb +41 -0
  255. data/lib/mongoid/matcher/bits_all_clear.rb +20 -0
  256. data/lib/mongoid/matcher/bits_all_set.rb +20 -0
  257. data/lib/mongoid/matcher/bits_any_clear.rb +20 -0
  258. data/lib/mongoid/matcher/bits_any_set.rb +20 -0
  259. data/lib/mongoid/matcher/elem_match.rb +36 -0
  260. data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
  261. data/lib/mongoid/matcher/eq.rb +11 -0
  262. data/lib/mongoid/matcher/eq_impl.rb +67 -0
  263. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +26 -0
  264. data/lib/mongoid/matcher/exists.rb +15 -0
  265. data/lib/mongoid/matcher/expression.rb +35 -0
  266. data/lib/mongoid/matcher/expression_operator.rb +19 -0
  267. data/lib/mongoid/matcher/field_expression.rb +62 -0
  268. data/lib/mongoid/matcher/field_operator.rb +54 -0
  269. data/lib/mongoid/matcher/gt.rb +17 -0
  270. data/lib/mongoid/matcher/gte.rb +17 -0
  271. data/lib/mongoid/matcher/in.rb +25 -0
  272. data/lib/mongoid/matcher/lt.rb +17 -0
  273. data/lib/mongoid/matcher/lte.rb +17 -0
  274. data/lib/mongoid/matcher/mod.rb +17 -0
  275. data/lib/mongoid/matcher/ne.rb +16 -0
  276. data/lib/mongoid/matcher/nin.rb +11 -0
  277. data/lib/mongoid/matcher/nor.rb +25 -0
  278. data/lib/mongoid/matcher/not.rb +29 -0
  279. data/lib/mongoid/matcher/or.rb +21 -0
  280. data/lib/mongoid/matcher/regex.rb +41 -0
  281. data/lib/mongoid/matcher/size.rb +26 -0
  282. data/lib/mongoid/matcher/type.rb +99 -0
  283. data/lib/mongoid/matcher.rb +110 -0
  284. data/lib/mongoid/persistable/creatable.rb +4 -21
  285. data/lib/mongoid/persistable/deletable.rb +11 -26
  286. data/lib/mongoid/persistable/destroyable.rb +11 -10
  287. data/lib/mongoid/persistable/incrementable.rb +7 -8
  288. data/lib/mongoid/persistable/logical.rb +5 -7
  289. data/lib/mongoid/persistable/poppable.rb +3 -6
  290. data/lib/mongoid/persistable/pullable.rb +3 -8
  291. data/lib/mongoid/persistable/pushable.rb +14 -10
  292. data/lib/mongoid/persistable/renamable.rb +10 -8
  293. data/lib/mongoid/persistable/savable.rb +3 -8
  294. data/lib/mongoid/persistable/settable.rb +60 -18
  295. data/lib/mongoid/persistable/unsettable.rb +8 -8
  296. data/lib/mongoid/persistable/updatable.rb +32 -20
  297. data/lib/mongoid/persistable/upsertable.rb +4 -9
  298. data/lib/mongoid/persistable.rb +136 -42
  299. data/lib/mongoid/persistence_context.rb +49 -47
  300. data/lib/mongoid/positional.rb +3 -6
  301. data/lib/mongoid/query_cache.rb +138 -106
  302. data/lib/mongoid/railtie.rb +3 -16
  303. data/lib/mongoid/railties/controller_runtime.rb +3 -1
  304. data/lib/mongoid/railties/database.rake +9 -0
  305. data/lib/mongoid/reloadable.rb +14 -19
  306. data/lib/mongoid/scopable.rb +19 -44
  307. data/lib/mongoid/selectable.rb +8 -17
  308. data/lib/mongoid/serializable.rb +28 -33
  309. data/lib/mongoid/shardable.rb +80 -17
  310. data/lib/mongoid/stateful.rb +3 -10
  311. data/lib/mongoid/stringified_symbol.rb +52 -0
  312. data/lib/mongoid/tasks/database.rake +12 -5
  313. data/lib/mongoid/tasks/database.rb +85 -5
  314. data/lib/mongoid/threaded/lifecycle.rb +2 -21
  315. data/lib/mongoid/threaded.rb +2 -55
  316. data/lib/mongoid/timestamps/created/short.rb +2 -1
  317. data/lib/mongoid/timestamps/created.rb +3 -2
  318. data/lib/mongoid/timestamps/short.rb +2 -1
  319. data/lib/mongoid/timestamps/timeless.rb +6 -9
  320. data/lib/mongoid/timestamps/updated/short.rb +2 -1
  321. data/lib/mongoid/timestamps/updated.rb +3 -4
  322. data/lib/mongoid/timestamps.rb +3 -2
  323. data/lib/mongoid/touchable.rb +132 -0
  324. data/lib/mongoid/traversable.rb +183 -60
  325. data/lib/mongoid/validatable/associated.rb +5 -6
  326. data/lib/mongoid/validatable/format.rb +2 -1
  327. data/lib/mongoid/validatable/length.rb +2 -1
  328. data/lib/mongoid/validatable/localizable.rb +2 -3
  329. data/lib/mongoid/validatable/macros.rb +3 -8
  330. data/lib/mongoid/validatable/presence.rb +10 -15
  331. data/lib/mongoid/validatable/queryable.rb +2 -3
  332. data/lib/mongoid/validatable/uniqueness.rb +25 -38
  333. data/lib/mongoid/validatable.rb +16 -35
  334. data/lib/mongoid/version.rb +3 -2
  335. data/lib/mongoid/warnings.rb +29 -0
  336. data/lib/mongoid.rb +34 -15
  337. data/lib/rails/generators/mongoid/config/config_generator.rb +10 -2
  338. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +53 -29
  339. data/lib/rails/generators/mongoid/model/model_generator.rb +3 -2
  340. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
  341. data/lib/rails/generators/mongoid_generator.rb +2 -1
  342. data/lib/rails/mongoid.rb +4 -5
  343. data/spec/README.md +33 -0
  344. data/spec/config/mongoid.yml +14 -3
  345. data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
  346. data/spec/integration/app_spec.rb +349 -0
  347. data/spec/integration/associations/belongs_to_spec.rb +15 -0
  348. data/spec/integration/associations/embedded_dirty_spec.rb +57 -0
  349. data/spec/integration/associations/embedded_spec.rb +268 -0
  350. data/spec/integration/associations/embeds_many_spec.rb +206 -0
  351. data/spec/integration/associations/embeds_one_spec.rb +23 -0
  352. data/spec/integration/associations/foreign_key_spec.rb +98 -0
  353. data/spec/integration/associations/foreign_key_spec_models.rb +64 -0
  354. data/spec/integration/associations/has_many_spec.rb +128 -0
  355. data/spec/integration/associations/has_one_spec.rb +176 -0
  356. data/spec/integration/associations/nested_attributes_assignment_spec.rb +115 -0
  357. data/spec/integration/associations/reverse_population_spec.rb +34 -0
  358. data/spec/integration/associations/reverse_population_spec_models.rb +36 -0
  359. data/spec/integration/associations/scope_option_spec.rb +101 -0
  360. data/spec/integration/atomic/modifiers_spec.rb +116 -0
  361. data/spec/integration/bson_regexp_raw_spec.rb +19 -0
  362. data/spec/integration/callbacks_models.rb +61 -0
  363. data/spec/integration/callbacks_spec.rb +228 -0
  364. data/spec/integration/contextual/empty_spec.rb +141 -0
  365. data/spec/integration/criteria/alias_query_spec.rb +161 -0
  366. data/spec/integration/criteria/date_field_spec.rb +40 -0
  367. data/spec/integration/criteria/default_scope_spec.rb +72 -0
  368. data/spec/integration/criteria/logical_spec.rb +124 -0
  369. data/spec/integration/criteria/range_spec.rb +265 -0
  370. data/spec/integration/criteria/time_with_zone_spec.rb +142 -0
  371. data/spec/integration/discriminator_key_spec.rb +353 -0
  372. data/spec/integration/discriminator_value_spec.rb +206 -0
  373. data/spec/integration/document_spec.rb +51 -0
  374. data/spec/integration/i18n_fallbacks_spec.rb +103 -0
  375. data/spec/integration/matcher_examples_spec.rb +758 -0
  376. data/spec/integration/matcher_operator_data/all.yml +140 -0
  377. data/spec/integration/matcher_operator_data/and.yml +93 -0
  378. data/spec/integration/matcher_operator_data/bits_all_clear.yml +159 -0
  379. data/spec/integration/matcher_operator_data/bits_all_set.yml +159 -0
  380. data/spec/integration/matcher_operator_data/bits_any_clear.yml +159 -0
  381. data/spec/integration/matcher_operator_data/bits_any_set.yml +159 -0
  382. data/spec/integration/matcher_operator_data/comment.yml +22 -0
  383. data/spec/integration/matcher_operator_data/elem_match.yml +409 -0
  384. data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
  385. data/spec/integration/matcher_operator_data/eq.yml +191 -0
  386. data/spec/integration/matcher_operator_data/exists.yml +213 -0
  387. data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
  388. data/spec/integration/matcher_operator_data/gt.yml +132 -0
  389. data/spec/integration/matcher_operator_data/gt_types.yml +63 -0
  390. data/spec/integration/matcher_operator_data/gte.yml +132 -0
  391. data/spec/integration/matcher_operator_data/gte_types.yml +15 -0
  392. data/spec/integration/matcher_operator_data/implicit.yml +331 -0
  393. data/spec/integration/matcher_operator_data/implicit_traversal.yml +112 -0
  394. data/spec/integration/matcher_operator_data/in.yml +210 -0
  395. data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
  396. data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
  397. data/spec/integration/matcher_operator_data/lt.yml +132 -0
  398. data/spec/integration/matcher_operator_data/lt_types.yml +15 -0
  399. data/spec/integration/matcher_operator_data/lte.yml +132 -0
  400. data/spec/integration/matcher_operator_data/lte_types.yml +15 -0
  401. data/spec/integration/matcher_operator_data/mod.yml +55 -0
  402. data/spec/integration/matcher_operator_data/multiple.yml +29 -0
  403. data/spec/integration/matcher_operator_data/ne.yml +150 -0
  404. data/spec/integration/matcher_operator_data/ne_types.yml +15 -0
  405. data/spec/integration/matcher_operator_data/nin.yml +114 -0
  406. data/spec/integration/matcher_operator_data/nor.yml +126 -0
  407. data/spec/integration/matcher_operator_data/not.yml +196 -0
  408. data/spec/integration/matcher_operator_data/or.yml +137 -0
  409. data/spec/integration/matcher_operator_data/regex.yml +174 -0
  410. data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
  411. data/spec/integration/matcher_operator_data/size.yml +174 -0
  412. data/spec/integration/matcher_operator_data/type.yml +70 -0
  413. data/spec/integration/matcher_operator_data/type_array.yml +16 -0
  414. data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
  415. data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
  416. data/spec/integration/matcher_operator_data/type_code.yml +26 -0
  417. data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
  418. data/spec/integration/matcher_operator_data/type_date.yml +39 -0
  419. data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
  420. data/spec/integration/matcher_operator_data/type_decimal.yml +40 -0
  421. data/spec/integration/matcher_operator_data/type_double.yml +15 -0
  422. data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
  423. data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
  424. data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
  425. data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
  426. data/spec/integration/matcher_operator_data/type_null.yml +23 -0
  427. data/spec/integration/matcher_operator_data/type_object.yml +23 -0
  428. data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
  429. data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
  430. data/spec/integration/matcher_operator_data/type_string.yml +15 -0
  431. data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
  432. data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
  433. data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
  434. data/spec/integration/matcher_operator_spec.rb +124 -0
  435. data/spec/integration/matcher_spec.rb +283 -0
  436. data/spec/integration/server_query_spec.rb +141 -0
  437. data/spec/integration/shardable_spec.rb +148 -0
  438. data/spec/integration/stringified_symbol_field_spec.rb +203 -0
  439. data/spec/lite_spec_helper.rb +83 -0
  440. data/spec/mongoid/association/accessors_spec.rb +1067 -0
  441. data/spec/mongoid/association/auto_save_spec.rb +403 -0
  442. data/spec/mongoid/association/builders_spec.rb +255 -0
  443. data/spec/mongoid/association/constrainable_spec.rb +117 -0
  444. data/spec/mongoid/association/counter_cache_spec.rb +452 -0
  445. data/spec/mongoid/association/depending_spec.rb +959 -0
  446. data/spec/mongoid/association/eager_spec.rb +281 -0
  447. data/spec/mongoid/association/embedded/cyclic_spec.rb +180 -0
  448. data/spec/mongoid/association/embedded/dirty_spec.rb +67 -0
  449. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +173 -0
  450. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +36 -0
  451. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +559 -0
  452. data/spec/mongoid/association/embedded/embedded_in_spec.rb +903 -0
  453. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +56 -0
  454. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +106 -0
  455. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +4652 -0
  456. data/spec/mongoid/association/embedded/embeds_many_models.rb +69 -0
  457. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +51 -0
  458. data/spec/mongoid/association/embedded/embeds_many_spec.rb +864 -0
  459. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +79 -0
  460. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +81 -0
  461. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +1025 -0
  462. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +8 -0
  463. data/spec/mongoid/association/embedded/embeds_one_models.rb +54 -0
  464. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +28 -0
  465. data/spec/mongoid/association/embedded/embeds_one_spec.rb +956 -0
  466. data/spec/mongoid/association/macros_spec.rb +1116 -0
  467. data/spec/mongoid/association/nested/many_spec.rb +232 -0
  468. data/spec/mongoid/association/nested/one_spec.rb +253 -0
  469. data/spec/mongoid/association/options_spec.rb +1323 -0
  470. data/spec/mongoid/association/polymorphic_spec.rb +162 -0
  471. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +243 -0
  472. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +238 -0
  473. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +412 -0
  474. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +1373 -0
  475. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +57 -0
  476. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2046 -0
  477. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +180 -0
  478. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +148 -0
  479. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +196 -0
  480. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +76 -0
  481. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +3773 -0
  482. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +67 -0
  483. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +39 -0
  484. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +1071 -0
  485. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +155 -0
  486. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +142 -0
  487. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +290 -0
  488. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2286 -0
  489. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +23 -0
  490. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +4092 -0
  491. data/spec/mongoid/association/referenced/has_many_models.rb +95 -0
  492. data/spec/mongoid/association/referenced/has_many_query_spec.rb +37 -0
  493. data/spec/mongoid/association/referenced/has_many_spec.rb +1248 -0
  494. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +133 -0
  495. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +159 -0
  496. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +193 -0
  497. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +1142 -0
  498. data/spec/mongoid/association/referenced/has_one_models.rb +97 -0
  499. data/spec/mongoid/association/referenced/has_one_query_spec.rb +37 -0
  500. data/spec/mongoid/association/referenced/has_one_spec.rb +1383 -0
  501. data/spec/mongoid/association/reflections_spec.rb +92 -0
  502. data/spec/mongoid/association/syncable_spec.rb +499 -0
  503. data/spec/mongoid/association_spec.rb +191 -0
  504. data/spec/mongoid/atomic/modifiers_spec.rb +51 -2
  505. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +2 -0
  506. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +2 -0
  507. data/spec/mongoid/atomic/paths/root_spec.rb +2 -0
  508. data/spec/mongoid/atomic/paths_spec.rb +107 -12
  509. data/spec/mongoid/atomic_spec.rb +57 -10
  510. data/spec/mongoid/attributes/dynamic_spec.rb +152 -0
  511. data/spec/mongoid/attributes/nested_spec.rb +98 -78
  512. data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
  513. data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
  514. data/spec/mongoid/attributes/projector_spec.rb +44 -0
  515. data/spec/mongoid/attributes/readonly_spec.rb +84 -127
  516. data/spec/mongoid/attributes_spec.rb +417 -34
  517. data/spec/mongoid/cacheable_spec.rb +3 -1
  518. data/spec/mongoid/changeable_spec.rb +60 -35
  519. data/spec/mongoid/clients/factory_spec.rb +146 -33
  520. data/spec/mongoid/clients/options_spec.rb +93 -60
  521. data/spec/mongoid/clients/sessions_spec.rb +40 -30
  522. data/spec/mongoid/clients/transactions_spec.rb +415 -0
  523. data/spec/mongoid/clients_spec.rb +78 -16
  524. data/spec/mongoid/composable_spec.rb +2 -0
  525. data/spec/mongoid/config/environment_spec.rb +126 -8
  526. data/spec/mongoid/config/options_spec.rb +22 -3
  527. data/spec/mongoid/config_spec.rb +350 -2
  528. data/spec/mongoid/contextual/aggregable/memory_spec.rb +53 -11
  529. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +122 -20
  530. data/spec/mongoid/contextual/aggregable/none_spec.rb +60 -0
  531. data/spec/mongoid/contextual/atomic_spec.rb +242 -81
  532. data/spec/mongoid/contextual/geo_near_spec.rb +31 -19
  533. data/spec/mongoid/contextual/map_reduce_spec.rb +24 -7
  534. data/spec/mongoid/contextual/memory_spec.rb +870 -88
  535. data/spec/mongoid/contextual/mongo_spec.rb +1318 -183
  536. data/spec/mongoid/contextual/none_spec.rb +45 -71
  537. data/spec/mongoid/copyable_spec.rb +294 -29
  538. data/spec/mongoid/copyable_spec_models.rb +47 -0
  539. data/spec/mongoid/criteria/findable_spec.rb +77 -20
  540. data/spec/mongoid/criteria/inspectable_spec.rb +2 -0
  541. data/spec/mongoid/criteria/marshalable_spec.rb +2 -0
  542. data/spec/mongoid/criteria/modifiable_spec.rb +215 -40
  543. data/spec/mongoid/criteria/options_spec.rb +2 -0
  544. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +3 -1
  545. data/spec/mongoid/criteria/queryable/expandable_spec.rb +61 -0
  546. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +2 -0
  547. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +2 -0
  548. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +2 -0
  549. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +3 -1
  550. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +2 -0
  551. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +35 -17
  552. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +2 -0
  553. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +2 -0
  554. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +2 -0
  555. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +2 -0
  556. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +2 -0
  557. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +53 -0
  558. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +2 -0
  559. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +239 -178
  560. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +3 -1
  561. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +9 -7
  562. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +2 -0
  563. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +46 -1
  564. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +2 -0
  565. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +42 -23
  566. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +30 -1
  567. data/spec/mongoid/criteria/queryable/key_spec.rb +50 -6
  568. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +145 -12
  569. data/spec/mongoid/criteria/queryable/optional_spec.rb +3 -1
  570. data/spec/mongoid/criteria/queryable/options_spec.rb +2 -0
  571. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +14 -0
  572. data/spec/mongoid/criteria/queryable/queryable_spec.rb +3 -1
  573. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +2069 -0
  574. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +38 -0
  575. data/spec/mongoid/criteria/queryable/selectable_spec.rb +1155 -2927
  576. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +589 -0
  577. data/spec/mongoid/criteria/queryable/selector_spec.rb +39 -0
  578. data/spec/mongoid/criteria/queryable/smash_spec.rb +2 -0
  579. data/spec/mongoid/criteria/queryable/storable_spec.rb +226 -0
  580. data/spec/mongoid/criteria/scopable_spec.rb +129 -0
  581. data/spec/mongoid/criteria_projection_spec.rb +410 -0
  582. data/spec/mongoid/criteria_spec.rb +829 -478
  583. data/spec/mongoid/document_fields_spec.rb +113 -0
  584. data/spec/mongoid/document_persistence_context_spec.rb +32 -0
  585. data/spec/mongoid/document_query_spec.rb +89 -0
  586. data/spec/mongoid/document_spec.rb +131 -31
  587. data/spec/mongoid/equality_spec.rb +144 -41
  588. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +5 -3
  589. data/spec/mongoid/errors/callback_spec.rb +2 -0
  590. data/spec/mongoid/errors/delete_restriction_spec.rb +4 -2
  591. data/spec/mongoid/errors/document_not_destroyed_spec.rb +2 -0
  592. data/spec/mongoid/errors/document_not_found_spec.rb +51 -0
  593. data/spec/mongoid/errors/eager_load_spec.rb +2 -0
  594. data/spec/mongoid/errors/invalid_collection_spec.rb +2 -0
  595. data/spec/mongoid/errors/invalid_config_file_spec.rb +31 -0
  596. data/spec/mongoid/errors/invalid_config_option_spec.rb +2 -0
  597. data/spec/mongoid/errors/invalid_field_option_spec.rb +2 -0
  598. data/spec/mongoid/errors/invalid_field_spec.rb +2 -0
  599. data/spec/mongoid/errors/invalid_find_spec.rb +2 -0
  600. data/spec/mongoid/errors/invalid_includes_spec.rb +2 -0
  601. data/spec/mongoid/errors/invalid_index_spec.rb +2 -0
  602. data/spec/mongoid/errors/invalid_options_spec.rb +4 -2
  603. data/spec/mongoid/errors/invalid_path_spec.rb +2 -0
  604. data/spec/mongoid/errors/invalid_relation_spec.rb +4 -2
  605. data/spec/mongoid/errors/invalid_scope_spec.rb +3 -1
  606. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +2 -0
  607. data/spec/mongoid/errors/invalid_storage_options_spec.rb +2 -0
  608. data/spec/mongoid/errors/invalid_time_spec.rb +2 -0
  609. data/spec/mongoid/errors/inverse_not_found_spec.rb +3 -1
  610. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +2 -0
  611. data/spec/mongoid/errors/mixed_relations_spec.rb +2 -0
  612. data/spec/mongoid/errors/mongoid_error_spec.rb +22 -8
  613. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +5 -3
  614. data/spec/mongoid/errors/no_client_config_spec.rb +4 -2
  615. data/spec/mongoid/errors/no_client_database_spec.rb +5 -3
  616. data/spec/mongoid/errors/no_client_hosts_spec.rb +5 -3
  617. data/spec/mongoid/errors/no_clients_config_spec.rb +2 -0
  618. data/spec/mongoid/errors/no_environment_spec.rb +2 -0
  619. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +2 -0
  620. data/spec/mongoid/errors/no_metadata_spec.rb +4 -2
  621. data/spec/mongoid/errors/no_parent_spec.rb +3 -1
  622. data/spec/mongoid/errors/readonly_attribute_spec.rb +2 -0
  623. data/spec/mongoid/errors/readonly_document_spec.rb +2 -0
  624. data/spec/mongoid/errors/scope_overwrite_spec.rb +2 -0
  625. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +2 -0
  626. data/spec/mongoid/errors/unknown_attribute_spec.rb +4 -2
  627. data/spec/mongoid/errors/unsaved_document_spec.rb +3 -1
  628. data/spec/mongoid/errors/unsupported_javascript_spec.rb +2 -0
  629. data/spec/mongoid/errors/validations_spec.rb +2 -0
  630. data/spec/mongoid/extensions/array_spec.rb +36 -58
  631. data/spec/mongoid/extensions/big_decimal_spec.rb +2 -0
  632. data/spec/mongoid/extensions/binary_spec.rb +2 -0
  633. data/spec/mongoid/extensions/boolean_spec.rb +2 -0
  634. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +335 -0
  635. data/spec/mongoid/extensions/date_spec.rb +8 -160
  636. data/spec/mongoid/extensions/date_time_spec.rb +17 -60
  637. data/spec/mongoid/extensions/decimal128_spec.rb +2 -0
  638. data/spec/mongoid/extensions/false_class_spec.rb +3 -1
  639. data/spec/mongoid/extensions/float_spec.rb +17 -3
  640. data/spec/mongoid/extensions/hash_spec.rb +123 -1
  641. data/spec/mongoid/extensions/integer_spec.rb +14 -2
  642. data/spec/mongoid/extensions/module_spec.rb +2 -0
  643. data/spec/mongoid/extensions/nil_class_spec.rb +2 -0
  644. data/spec/mongoid/extensions/object_id_spec.rb +2 -0
  645. data/spec/mongoid/extensions/object_spec.rb +20 -35
  646. data/spec/mongoid/extensions/range_spec.rb +9 -0
  647. data/spec/mongoid/extensions/regexp_spec.rb +2 -0
  648. data/spec/mongoid/extensions/set_spec.rb +2 -0
  649. data/spec/mongoid/extensions/string_spec.rb +95 -34
  650. data/spec/mongoid/extensions/stringified_symbol_spec.rb +84 -0
  651. data/spec/mongoid/extensions/symbol_spec.rb +2 -0
  652. data/spec/mongoid/extensions/time_spec.rb +29 -0
  653. data/spec/mongoid/extensions/time_with_zone_spec.rb +33 -0
  654. data/spec/mongoid/extensions/true_class_spec.rb +3 -1
  655. data/spec/mongoid/extensions_spec.rb +16 -2
  656. data/spec/mongoid/factory_spec.rb +301 -23
  657. data/spec/mongoid/fields/foreign_key_spec.rb +26 -32
  658. data/spec/mongoid/fields/localized_spec.rb +6 -4
  659. data/spec/mongoid/fields/standard_spec.rb +2 -0
  660. data/spec/mongoid/fields_spec.rb +419 -37
  661. data/spec/mongoid/findable_spec.rb +84 -20
  662. data/spec/mongoid/indexable/specification_spec.rb +2 -0
  663. data/spec/mongoid/indexable_spec.rb +54 -14
  664. data/spec/mongoid/inspectable_spec.rb +39 -2
  665. data/spec/mongoid/interceptable_spec.rb +189 -96
  666. data/spec/mongoid/interceptable_spec_models.rb +76 -0
  667. data/spec/mongoid/loggable_spec.rb +2 -0
  668. data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
  669. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +239 -0
  670. data/spec/mongoid/matcher/extract_attribute_spec.rb +40 -0
  671. data/spec/mongoid/persistable/creatable_spec.rb +112 -27
  672. data/spec/mongoid/persistable/deletable_spec.rb +273 -11
  673. data/spec/mongoid/persistable/destroyable_spec.rb +201 -11
  674. data/spec/mongoid/persistable/incrementable_spec.rb +23 -7
  675. data/spec/mongoid/persistable/logical_spec.rb +19 -3
  676. data/spec/mongoid/persistable/poppable_spec.rb +19 -3
  677. data/spec/mongoid/persistable/pullable_spec.rb +36 -6
  678. data/spec/mongoid/persistable/pushable_spec.rb +91 -7
  679. data/spec/mongoid/persistable/renamable_spec.rb +18 -2
  680. data/spec/mongoid/persistable/savable_spec.rb +189 -26
  681. data/spec/mongoid/persistable/settable_spec.rb +149 -18
  682. data/spec/mongoid/persistable/unsettable_spec.rb +19 -3
  683. data/spec/mongoid/persistable/updatable_spec.rb +45 -23
  684. data/spec/mongoid/persistable/upsertable_spec.rb +4 -2
  685. data/spec/mongoid/persistable_spec.rb +106 -15
  686. data/spec/mongoid/persistence_context_spec.rb +3 -1
  687. data/spec/mongoid/positional_spec.rb +2 -0
  688. data/spec/mongoid/query_cache_middleware_spec.rb +68 -0
  689. data/spec/mongoid/query_cache_spec.rb +577 -64
  690. data/spec/mongoid/relations/proxy_spec.rb +126 -124
  691. data/spec/mongoid/reloadable_spec.rb +298 -20
  692. data/spec/mongoid/scopable_spec.rb +102 -37
  693. data/spec/mongoid/selectable_spec.rb +8 -6
  694. data/spec/mongoid/serializable_spec.rb +160 -29
  695. data/spec/mongoid/shardable_models.rb +61 -0
  696. data/spec/mongoid/shardable_spec.rb +145 -26
  697. data/spec/mongoid/stateful_spec.rb +3 -1
  698. data/spec/mongoid/tasks/database_rake_spec.rb +15 -13
  699. data/spec/mongoid/tasks/database_spec.rb +3 -1
  700. data/spec/mongoid/threaded_spec.rb +4 -2
  701. data/spec/mongoid/timestamps/created/short_spec.rb +3 -1
  702. data/spec/mongoid/timestamps/created_spec.rb +3 -1
  703. data/spec/mongoid/timestamps/timeless_spec.rb +4 -2
  704. data/spec/mongoid/timestamps/updated/short_spec.rb +5 -3
  705. data/spec/mongoid/timestamps/updated_spec.rb +5 -3
  706. data/spec/mongoid/timestamps_spec.rb +8 -6
  707. data/spec/mongoid/touchable_spec.rb +588 -0
  708. data/spec/mongoid/touchable_spec_models.rb +53 -0
  709. data/spec/mongoid/traversable_spec.rb +1167 -1
  710. data/spec/mongoid/validatable/associated_spec.rb +3 -1
  711. data/spec/mongoid/validatable/format_spec.rb +2 -0
  712. data/spec/mongoid/validatable/length_spec.rb +2 -0
  713. data/spec/mongoid/validatable/numericality_spec.rb +2 -0
  714. data/spec/mongoid/validatable/presence_spec.rb +33 -26
  715. data/spec/mongoid/validatable/uniqueness_spec.rb +102 -73
  716. data/spec/mongoid/validatable_spec.rb +5 -3
  717. data/spec/mongoid_spec.rb +2 -0
  718. data/spec/rails/controller_extension/controller_runtime_spec.rb +3 -1
  719. data/spec/rails/mongoid_spec.rb +4 -2
  720. data/spec/shared/LICENSE +20 -0
  721. data/spec/shared/bin/get-mongodb-download-url +17 -0
  722. data/spec/shared/bin/s3-copy +45 -0
  723. data/spec/shared/bin/s3-upload +69 -0
  724. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  725. data/spec/shared/lib/mrss/cluster_config.rb +231 -0
  726. data/spec/shared/lib/mrss/constraints.rb +378 -0
  727. data/spec/shared/lib/mrss/docker_runner.rb +291 -0
  728. data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
  729. data/spec/shared/lib/mrss/event_subscriber.rb +210 -0
  730. data/spec/shared/lib/mrss/lite_constraints.rb +230 -0
  731. data/spec/shared/lib/mrss/server_version_registry.rb +120 -0
  732. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  733. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  734. data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
  735. data/spec/shared/lib/mrss/utils.rb +15 -0
  736. data/spec/shared/share/Dockerfile.erb +325 -0
  737. data/spec/shared/share/haproxy-1.conf +16 -0
  738. data/spec/shared/share/haproxy-2.conf +17 -0
  739. data/spec/shared/shlib/config.sh +27 -0
  740. data/spec/shared/shlib/distro.sh +74 -0
  741. data/spec/shared/shlib/server.sh +392 -0
  742. data/spec/shared/shlib/set_env.sh +169 -0
  743. data/spec/spec_helper.rb +73 -76
  744. data/spec/support/authorization.rb +2 -0
  745. data/spec/support/client_registry.rb +9 -0
  746. data/spec/support/constraints.rb +53 -0
  747. data/spec/support/expectations.rb +21 -3
  748. data/spec/support/helpers.rb +11 -0
  749. data/spec/support/macros.rb +51 -0
  750. data/spec/support/models/account.rb +38 -0
  751. data/spec/support/models/acolyte.rb +19 -0
  752. data/spec/support/models/actor.rb +20 -0
  753. data/spec/support/models/actress.rb +4 -0
  754. data/spec/support/models/address.rb +85 -0
  755. data/spec/support/models/address_component.rb +7 -0
  756. data/spec/support/models/address_number.rb +8 -0
  757. data/spec/support/models/agency.rb +7 -0
  758. data/spec/support/models/agent.rb +18 -0
  759. data/spec/support/models/album.rb +20 -0
  760. data/spec/support/models/alert.rb +9 -0
  761. data/spec/support/models/animal.rb +28 -0
  762. data/spec/support/models/answer.rb +8 -0
  763. data/spec/support/models/appointment.rb +9 -0
  764. data/spec/support/models/armrest.rb +9 -0
  765. data/spec/{app → support}/models/array_field.rb +0 -0
  766. data/spec/support/models/article.rb +14 -0
  767. data/spec/support/models/artist.rb +91 -0
  768. data/spec/support/models/artwork.rb +6 -0
  769. data/spec/support/models/audible_sound.rb +3 -0
  770. data/spec/support/models/audio.rb +7 -0
  771. data/spec/support/models/augmentation.rb +13 -0
  772. data/spec/support/models/author.rb +8 -0
  773. data/spec/support/models/baby.rb +6 -0
  774. data/spec/support/models/band.rb +37 -0
  775. data/spec/support/models/bar.rb +12 -0
  776. data/spec/support/models/basic.rb +8 -0
  777. data/spec/support/models/bed.rb +3 -0
  778. data/spec/support/models/big_palette.rb +4 -0
  779. data/spec/support/models/birthday.rb +15 -0
  780. data/spec/support/models/bolt.rb +7 -0
  781. data/spec/support/models/bomb.rb +6 -0
  782. data/spec/support/models/book.rb +18 -0
  783. data/spec/support/models/breed.rb +6 -0
  784. data/spec/support/models/browser.rb +8 -0
  785. data/spec/support/models/building.rb +8 -0
  786. data/spec/support/models/building_address.rb +9 -0
  787. data/spec/support/models/bus.rb +9 -0
  788. data/spec/support/models/business.rb +7 -0
  789. data/spec/support/models/callback_test.rb +11 -0
  790. data/spec/support/models/canvas.rb +27 -0
  791. data/spec/support/models/car.rb +3 -0
  792. data/spec/support/models/cat.rb +10 -0
  793. data/spec/support/models/category.rb +10 -0
  794. data/spec/support/models/child.rb +6 -0
  795. data/spec/support/models/child_doc.rb +24 -0
  796. data/spec/support/models/church.rb +8 -0
  797. data/spec/support/models/circle.rb +5 -0
  798. data/spec/support/models/circuit.rb +6 -0
  799. data/spec/support/models/circus.rb +9 -0
  800. data/spec/support/models/code.rb +15 -0
  801. data/spec/support/models/coding/pull_request.rb +11 -0
  802. data/spec/support/models/coding.rb +3 -0
  803. data/spec/support/models/comment.rb +18 -0
  804. data/spec/support/models/company.rb +7 -0
  805. data/spec/support/models/consumption_period.rb +9 -0
  806. data/spec/support/models/contextable_item.rb +7 -0
  807. data/spec/support/models/contractor.rb +7 -0
  808. data/spec/support/models/cookie.rb +8 -0
  809. data/spec/support/models/country_code.rb +12 -0
  810. data/spec/support/models/courier_job.rb +6 -0
  811. data/spec/support/models/crate.rb +12 -0
  812. data/spec/support/models/customer.rb +10 -0
  813. data/spec/support/models/customer_address.rb +11 -0
  814. data/spec/support/models/deed.rb +7 -0
  815. data/spec/support/models/definition.rb +11 -0
  816. data/spec/support/models/delegating_patient.rb +15 -0
  817. data/spec/support/models/description.rb +13 -0
  818. data/spec/support/models/dictionary.rb +18 -0
  819. data/spec/support/models/division.rb +12 -0
  820. data/spec/support/models/doctor.rb +14 -0
  821. data/spec/support/models/dog.rb +9 -0
  822. data/spec/support/models/dokument.rb +8 -0
  823. data/spec/support/models/draft.rb +11 -0
  824. data/spec/support/models/dragon.rb +6 -0
  825. data/spec/support/models/driver.rb +9 -0
  826. data/spec/support/models/drug.rb +8 -0
  827. data/spec/support/models/dungeon.rb +6 -0
  828. data/spec/support/models/edit.rb +7 -0
  829. data/spec/support/models/email.rb +8 -0
  830. data/spec/support/models/employer.rb +7 -0
  831. data/spec/support/models/entry.rb +8 -0
  832. data/spec/support/models/eraser.rb +3 -0
  833. data/spec/support/models/even.rb +9 -0
  834. data/spec/support/models/event.rb +24 -0
  835. data/spec/support/models/exhibition.rb +6 -0
  836. data/spec/support/models/exhibitor.rb +8 -0
  837. data/spec/support/models/explosion.rb +6 -0
  838. data/spec/support/models/eye.rb +11 -0
  839. data/spec/support/models/eye_bowl.rb +11 -0
  840. data/spec/support/models/face.rb +10 -0
  841. data/spec/support/models/favorite.rb +8 -0
  842. data/spec/support/models/filesystem.rb +7 -0
  843. data/spec/support/models/fire_hydrant.rb +8 -0
  844. data/spec/support/models/firefox.rb +6 -0
  845. data/spec/support/models/fish.rb +9 -0
  846. data/spec/support/models/folder.rb +9 -0
  847. data/spec/support/models/folder_item.rb +11 -0
  848. data/spec/support/models/fruits.rb +36 -0
  849. data/spec/support/models/game.rb +21 -0
  850. data/spec/support/models/ghost.rb +9 -0
  851. data/spec/support/models/guitar.rb +4 -0
  852. data/spec/support/models/hole.rb +12 -0
  853. data/spec/support/models/home.rb +6 -0
  854. data/spec/support/models/house.rb +8 -0
  855. data/spec/support/models/html_writer.rb +5 -0
  856. data/spec/support/models/id_key.rb +8 -0
  857. data/spec/support/models/idnodef.rb +7 -0
  858. data/spec/support/models/image.rb +24 -0
  859. data/spec/support/models/implant.rb +18 -0
  860. data/spec/support/models/instrument.rb +8 -0
  861. data/spec/support/models/item.rb +10 -0
  862. data/spec/support/models/jar.rb +9 -0
  863. data/spec/support/models/kaleidoscope.rb +8 -0
  864. data/spec/support/models/kangaroo.rb +6 -0
  865. data/spec/support/models/label.rb +50 -0
  866. data/spec/support/models/language.rb +7 -0
  867. data/spec/support/models/lat_lng.rb +17 -0
  868. data/spec/support/models/league.rb +13 -0
  869. data/spec/support/models/learner.rb +4 -0
  870. data/spec/support/models/line_item.rb +8 -0
  871. data/spec/support/models/location.rb +10 -0
  872. data/spec/support/models/login.rb +10 -0
  873. data/spec/support/models/manufacturer.rb +9 -0
  874. data/spec/support/models/meat.rb +6 -0
  875. data/spec/support/models/membership.rb +7 -0
  876. data/spec/support/models/message.rb +13 -0
  877. data/spec/support/models/minim.rb +6 -0
  878. data/spec/support/models/mixed_drink.rb +6 -0
  879. data/spec/support/models/mop.rb +24 -0
  880. data/spec/support/models/movie.rb +15 -0
  881. data/spec/support/models/my_hash.rb +4 -0
  882. data/spec/support/models/name.rb +26 -0
  883. data/spec/support/models/name_only.rb +8 -0
  884. data/spec/support/models/node.rb +7 -0
  885. data/spec/support/models/note.rb +19 -0
  886. data/spec/support/models/nut.rb +7 -0
  887. data/spec/support/models/odd.rb +9 -0
  888. data/spec/support/models/order.rb +12 -0
  889. data/spec/support/models/ordered_post.rb +13 -0
  890. data/spec/support/models/ordered_preference.rb +8 -0
  891. data/spec/support/models/oscar.rb +16 -0
  892. data/spec/support/models/other_owner_object.rb +4 -0
  893. data/spec/support/models/override.rb +18 -0
  894. data/spec/support/models/ownable.rb +8 -0
  895. data/spec/support/models/owner.rb +10 -0
  896. data/spec/support/models/pack.rb +5 -0
  897. data/spec/support/models/page.rb +18 -0
  898. data/spec/support/models/page_question.rb +6 -0
  899. data/spec/support/models/palette.rb +9 -0
  900. data/spec/support/models/parent.rb +7 -0
  901. data/spec/support/models/parent_doc.rb +8 -0
  902. data/spec/support/models/passport.rb +13 -0
  903. data/spec/support/models/patient.rb +11 -0
  904. data/spec/support/models/pdf_writer.rb +5 -0
  905. data/spec/support/models/pencil.rb +3 -0
  906. data/spec/support/models/person.rb +230 -0
  907. data/spec/support/models/pet.rb +25 -0
  908. data/spec/support/models/pet_owner.rb +8 -0
  909. data/spec/support/models/phone.rb +13 -0
  910. data/spec/support/models/piano.rb +4 -0
  911. data/spec/support/models/pizza.rb +9 -0
  912. data/spec/support/models/player.rb +37 -0
  913. data/spec/support/models/post.rb +52 -0
  914. data/spec/support/models/post_genre.rb +8 -0
  915. data/spec/support/models/powerup.rb +13 -0
  916. data/spec/support/models/preference.rb +11 -0
  917. data/spec/support/models/princess.rb +12 -0
  918. data/spec/support/models/product.rb +19 -0
  919. data/spec/support/models/profile.rb +17 -0
  920. data/spec/support/models/pronunciation.rb +7 -0
  921. data/spec/support/models/pub.rb +8 -0
  922. data/spec/support/models/publication/encyclopedia.rb +11 -0
  923. data/spec/support/models/publication/review.rb +13 -0
  924. data/spec/support/models/publication.rb +4 -0
  925. data/spec/support/models/purchase.rb +6 -0
  926. data/spec/support/models/purchased_item.rb +10 -0
  927. data/spec/support/models/question.rb +10 -0
  928. data/spec/support/models/quiz.rb +9 -0
  929. data/spec/support/models/rating.rb +10 -0
  930. data/spec/support/models/record.rb +54 -0
  931. data/spec/support/models/registry.rb +6 -0
  932. data/spec/support/models/role.rb +9 -0
  933. data/spec/support/models/root_category.rb +6 -0
  934. data/spec/support/models/sandwich.rb +11 -0
  935. data/spec/support/models/scheduler.rb +9 -0
  936. data/spec/support/models/scribe.rb +7 -0
  937. data/spec/support/models/sealer.rb +7 -0
  938. data/spec/support/models/seat.rb +24 -0
  939. data/spec/support/models/seo.rb +9 -0
  940. data/spec/support/models/series.rb +7 -0
  941. data/spec/support/models/server.rb +15 -0
  942. data/spec/support/models/service.rb +24 -0
  943. data/spec/support/models/shape.rb +14 -0
  944. data/spec/support/models/shelf.rb +7 -0
  945. data/spec/support/models/shipment_address.rb +5 -0
  946. data/spec/support/models/shipping_container.rb +7 -0
  947. data/spec/support/models/shipping_pack.rb +5 -0
  948. data/spec/support/models/shirt.rb +11 -0
  949. data/spec/support/models/shop.rb +8 -0
  950. data/spec/support/models/short_agent.rb +6 -0
  951. data/spec/support/models/short_quiz.rb +7 -0
  952. data/spec/support/models/simple.rb +7 -0
  953. data/spec/support/models/slave.rb +8 -0
  954. data/spec/support/models/song.rb +10 -0
  955. data/spec/support/models/sound.rb +7 -0
  956. data/spec/support/models/spacer.rb +7 -0
  957. data/spec/support/models/square.rb +6 -0
  958. data/spec/support/models/staff.rb +9 -0
  959. data/spec/support/models/store_as_dup_test1.rb +7 -0
  960. data/spec/support/models/store_as_dup_test2.rb +7 -0
  961. data/spec/support/models/store_as_dup_test3.rb +7 -0
  962. data/spec/support/models/store_as_dup_test4.rb +7 -0
  963. data/spec/support/models/strategy.rb +5 -0
  964. data/spec/support/models/sub_item.rb +5 -0
  965. data/spec/support/models/subscription.rb +7 -0
  966. data/spec/support/models/survey.rb +7 -0
  967. data/spec/support/models/symptom.rb +8 -0
  968. data/spec/support/models/system_role.rb +7 -0
  969. data/spec/support/models/tag.rb +10 -0
  970. data/spec/support/models/target.rb +7 -0
  971. data/spec/support/models/template.rb +7 -0
  972. data/spec/support/models/thing.rb +11 -0
  973. data/spec/support/models/threadlocker.rb +7 -0
  974. data/spec/support/models/title.rb +5 -0
  975. data/spec/support/models/tool.rb +10 -0
  976. data/spec/support/models/topping.rb +7 -0
  977. data/spec/support/models/toy.rb +9 -0
  978. data/spec/support/models/track.rb +40 -0
  979. data/spec/support/models/translation.rb +7 -0
  980. data/spec/support/models/tree.rb +11 -0
  981. data/spec/support/models/truck.rb +7 -0
  982. data/spec/support/models/updatable.rb +7 -0
  983. data/spec/support/models/user.rb +23 -0
  984. data/spec/support/models/user_account.rb +12 -0
  985. data/spec/support/models/validation_callback.rb +12 -0
  986. data/spec/support/models/vehicle.rb +18 -0
  987. data/spec/support/models/version.rb +7 -0
  988. data/spec/support/models/vertex.rb +8 -0
  989. data/spec/support/models/vet_visit.rb +7 -0
  990. data/spec/support/models/video.rb +15 -0
  991. data/spec/support/models/video_game.rb +3 -0
  992. data/spec/support/models/washer.rb +7 -0
  993. data/spec/support/models/weapon.rb +13 -0
  994. data/spec/support/models/wiki_page.rb +17 -0
  995. data/spec/support/models/word.rb +17 -0
  996. data/spec/support/models/word_origin.rb +13 -0
  997. data/spec/support/models/writer.rb +13 -0
  998. data/spec/support/schema_maps/schema_map_aws.json +17 -0
  999. data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
  1000. data/spec/support/schema_maps/schema_map_azure.json +17 -0
  1001. data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
  1002. data/spec/support/schema_maps/schema_map_gcp.json +17 -0
  1003. data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
  1004. data/spec/support/schema_maps/schema_map_kmip.json +17 -0
  1005. data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
  1006. data/spec/support/schema_maps/schema_map_local.json +18 -0
  1007. data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
  1008. data/spec/support/shared/time.rb +53 -0
  1009. data/spec/support/spec_config.rb +64 -0
  1010. data.tar.gz.sig +3 -1
  1011. metadata +1301 -830
  1012. metadata.gz.sig +0 -0
  1013. data/lib/mongoid/criteria/queryable/forwardable.rb +0 -65
  1014. data/lib/mongoid/matchable/all.rb +0 -27
  1015. data/lib/mongoid/matchable/and.rb +0 -30
  1016. data/lib/mongoid/matchable/default.rb +0 -72
  1017. data/lib/mongoid/matchable/elem_match.rb +0 -28
  1018. data/lib/mongoid/matchable/exists.rb +0 -23
  1019. data/lib/mongoid/matchable/gt.rb +0 -23
  1020. data/lib/mongoid/matchable/gte.rb +0 -23
  1021. data/lib/mongoid/matchable/in.rb +0 -24
  1022. data/lib/mongoid/matchable/lt.rb +0 -23
  1023. data/lib/mongoid/matchable/lte.rb +0 -23
  1024. data/lib/mongoid/matchable/ne.rb +0 -21
  1025. data/lib/mongoid/matchable/nin.rb +0 -22
  1026. data/lib/mongoid/matchable/nor.rb +0 -37
  1027. data/lib/mongoid/matchable/or.rb +0 -33
  1028. data/lib/mongoid/matchable/regexp.rb +0 -27
  1029. data/lib/mongoid/matchable/size.rb +0 -21
  1030. data/lib/mongoid/relations/accessors.rb +0 -267
  1031. data/lib/mongoid/relations/auto_save.rb +0 -94
  1032. data/lib/mongoid/relations/binding.rb +0 -218
  1033. data/lib/mongoid/relations/bindings/embedded/in.rb +0 -59
  1034. data/lib/mongoid/relations/bindings/embedded/many.rb +0 -43
  1035. data/lib/mongoid/relations/bindings/embedded/one.rb +0 -45
  1036. data/lib/mongoid/relations/bindings/referenced/in.rb +0 -65
  1037. data/lib/mongoid/relations/bindings/referenced/many.rb +0 -38
  1038. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +0 -70
  1039. data/lib/mongoid/relations/bindings/referenced/one.rb +0 -44
  1040. data/lib/mongoid/relations/bindings.rb +0 -9
  1041. data/lib/mongoid/relations/builder.rb +0 -57
  1042. data/lib/mongoid/relations/builders/embedded/in.rb +0 -29
  1043. data/lib/mongoid/relations/builders/embedded/many.rb +0 -36
  1044. data/lib/mongoid/relations/builders/embedded/one.rb +0 -30
  1045. data/lib/mongoid/relations/builders/nested_attributes/many.rb +0 -199
  1046. data/lib/mongoid/relations/builders/nested_attributes/one.rb +0 -126
  1047. data/lib/mongoid/relations/builders/referenced/in.rb +0 -26
  1048. data/lib/mongoid/relations/builders/referenced/many.rb +0 -26
  1049. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +0 -39
  1050. data/lib/mongoid/relations/builders/referenced/one.rb +0 -26
  1051. data/lib/mongoid/relations/builders.rb +0 -106
  1052. data/lib/mongoid/relations/cascading/delete.rb +0 -44
  1053. data/lib/mongoid/relations/cascading/destroy.rb +0 -43
  1054. data/lib/mongoid/relations/cascading/nullify.rb +0 -35
  1055. data/lib/mongoid/relations/cascading/restrict.rb +0 -39
  1056. data/lib/mongoid/relations/cascading.rb +0 -56
  1057. data/lib/mongoid/relations/constraint.rb +0 -55
  1058. data/lib/mongoid/relations/conversions.rb +0 -34
  1059. data/lib/mongoid/relations/counter_cache.rb +0 -160
  1060. data/lib/mongoid/relations/cyclic.rb +0 -107
  1061. data/lib/mongoid/relations/eager/base.rb +0 -153
  1062. data/lib/mongoid/relations/eager/belongs_to.rb +0 -31
  1063. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +0 -47
  1064. data/lib/mongoid/relations/eager/has_many.rb +0 -38
  1065. data/lib/mongoid/relations/eager/has_one.rb +0 -30
  1066. data/lib/mongoid/relations/eager.rb +0 -36
  1067. data/lib/mongoid/relations/embedded/batchable.rb +0 -384
  1068. data/lib/mongoid/relations/embedded/in.rb +0 -241
  1069. data/lib/mongoid/relations/embedded/many.rb +0 -683
  1070. data/lib/mongoid/relations/embedded/one.rb +0 -235
  1071. data/lib/mongoid/relations/macros.rb +0 -367
  1072. data/lib/mongoid/relations/many.rb +0 -242
  1073. data/lib/mongoid/relations/marshalable.rb +0 -32
  1074. data/lib/mongoid/relations/metadata.rb +0 -1179
  1075. data/lib/mongoid/relations/nested_builder.rb +0 -74
  1076. data/lib/mongoid/relations/one.rb +0 -60
  1077. data/lib/mongoid/relations/options.rb +0 -49
  1078. data/lib/mongoid/relations/polymorphic.rb +0 -39
  1079. data/lib/mongoid/relations/proxy.rb +0 -215
  1080. data/lib/mongoid/relations/referenced/in.rb +0 -304
  1081. data/lib/mongoid/relations/referenced/many.rb +0 -812
  1082. data/lib/mongoid/relations/referenced/many_to_many.rb +0 -479
  1083. data/lib/mongoid/relations/referenced/one.rb +0 -290
  1084. data/lib/mongoid/relations/reflections.rb +0 -64
  1085. data/lib/mongoid/relations/synchronization.rb +0 -169
  1086. data/lib/mongoid/relations/targets/enumerable.rb +0 -493
  1087. data/lib/mongoid/relations/targets.rb +0 -2
  1088. data/lib/mongoid/relations/touchable.rb +0 -97
  1089. data/lib/mongoid/relations.rb +0 -148
  1090. data/lib/support/ruby_version.rb +0 -26
  1091. data/spec/app/models/account.rb +0 -36
  1092. data/spec/app/models/acolyte.rb +0 -17
  1093. data/spec/app/models/actor.rb +0 -18
  1094. data/spec/app/models/actress.rb +0 -2
  1095. data/spec/app/models/address.rb +0 -79
  1096. data/spec/app/models/address_component.rb +0 -5
  1097. data/spec/app/models/address_number.rb +0 -6
  1098. data/spec/app/models/agency.rb +0 -5
  1099. data/spec/app/models/agent.rb +0 -16
  1100. data/spec/app/models/album.rb +0 -18
  1101. data/spec/app/models/alert.rb +0 -7
  1102. data/spec/app/models/animal.rb +0 -25
  1103. data/spec/app/models/answer.rb +0 -6
  1104. data/spec/app/models/appointment.rb +0 -7
  1105. data/spec/app/models/article.rb +0 -12
  1106. data/spec/app/models/artist.rb +0 -87
  1107. data/spec/app/models/artwork.rb +0 -4
  1108. data/spec/app/models/audio.rb +0 -5
  1109. data/spec/app/models/augmentation.rb +0 -11
  1110. data/spec/app/models/author.rb +0 -6
  1111. data/spec/app/models/baby.rb +0 -4
  1112. data/spec/app/models/band.rb +0 -31
  1113. data/spec/app/models/bar.rb +0 -10
  1114. data/spec/app/models/basic.rb +0 -6
  1115. data/spec/app/models/bed.rb +0 -1
  1116. data/spec/app/models/big_palette.rb +0 -2
  1117. data/spec/app/models/birthday.rb +0 -13
  1118. data/spec/app/models/bomb.rb +0 -4
  1119. data/spec/app/models/book.rb +0 -16
  1120. data/spec/app/models/breed.rb +0 -4
  1121. data/spec/app/models/browser.rb +0 -6
  1122. data/spec/app/models/building.rb +0 -6
  1123. data/spec/app/models/building_address.rb +0 -7
  1124. data/spec/app/models/bus.rb +0 -7
  1125. data/spec/app/models/business.rb +0 -5
  1126. data/spec/app/models/callback_test.rb +0 -9
  1127. data/spec/app/models/canvas.rb +0 -25
  1128. data/spec/app/models/car.rb +0 -1
  1129. data/spec/app/models/cat.rb +0 -8
  1130. data/spec/app/models/category.rb +0 -8
  1131. data/spec/app/models/child.rb +0 -4
  1132. data/spec/app/models/child_doc.rb +0 -22
  1133. data/spec/app/models/church.rb +0 -6
  1134. data/spec/app/models/circle.rb +0 -3
  1135. data/spec/app/models/circuit.rb +0 -4
  1136. data/spec/app/models/circus.rb +0 -7
  1137. data/spec/app/models/code.rb +0 -11
  1138. data/spec/app/models/comment.rb +0 -16
  1139. data/spec/app/models/company.rb +0 -5
  1140. data/spec/app/models/consumption_period.rb +0 -7
  1141. data/spec/app/models/contextable_item.rb +0 -5
  1142. data/spec/app/models/contractor.rb +0 -5
  1143. data/spec/app/models/cookie.rb +0 -6
  1144. data/spec/app/models/country_code.rb +0 -8
  1145. data/spec/app/models/courier_job.rb +0 -4
  1146. data/spec/app/models/definition.rb +0 -9
  1147. data/spec/app/models/description.rb +0 -11
  1148. data/spec/app/models/dictionary.rb +0 -10
  1149. data/spec/app/models/division.rb +0 -10
  1150. data/spec/app/models/doctor.rb +0 -12
  1151. data/spec/app/models/dog.rb +0 -7
  1152. data/spec/app/models/dokument.rb +0 -6
  1153. data/spec/app/models/draft.rb +0 -9
  1154. data/spec/app/models/dragon.rb +0 -4
  1155. data/spec/app/models/driver.rb +0 -7
  1156. data/spec/app/models/drug.rb +0 -6
  1157. data/spec/app/models/dungeon.rb +0 -4
  1158. data/spec/app/models/edit.rb +0 -5
  1159. data/spec/app/models/email.rb +0 -6
  1160. data/spec/app/models/employer.rb +0 -5
  1161. data/spec/app/models/entry.rb +0 -6
  1162. data/spec/app/models/eraser.rb +0 -1
  1163. data/spec/app/models/even.rb +0 -7
  1164. data/spec/app/models/event.rb +0 -22
  1165. data/spec/app/models/exhibition.rb +0 -4
  1166. data/spec/app/models/exhibitor.rb +0 -6
  1167. data/spec/app/models/explosion.rb +0 -4
  1168. data/spec/app/models/eye.rb +0 -9
  1169. data/spec/app/models/eye_bowl.rb +0 -9
  1170. data/spec/app/models/face.rb +0 -8
  1171. data/spec/app/models/favorite.rb +0 -6
  1172. data/spec/app/models/filesystem.rb +0 -5
  1173. data/spec/app/models/fire_hydrant.rb +0 -6
  1174. data/spec/app/models/firefox.rb +0 -4
  1175. data/spec/app/models/fish.rb +0 -7
  1176. data/spec/app/models/folder.rb +0 -7
  1177. data/spec/app/models/folder_item.rb +0 -9
  1178. data/spec/app/models/fruits.rb +0 -34
  1179. data/spec/app/models/game.rb +0 -19
  1180. data/spec/app/models/ghost.rb +0 -7
  1181. data/spec/app/models/home.rb +0 -4
  1182. data/spec/app/models/house.rb +0 -6
  1183. data/spec/app/models/html_writer.rb +0 -3
  1184. data/spec/app/models/id_key.rb +0 -6
  1185. data/spec/app/models/image.rb +0 -22
  1186. data/spec/app/models/implant.rb +0 -16
  1187. data/spec/app/models/item.rb +0 -8
  1188. data/spec/app/models/jar.rb +0 -7
  1189. data/spec/app/models/kaleidoscope.rb +0 -6
  1190. data/spec/app/models/kangaroo.rb +0 -4
  1191. data/spec/app/models/label.rb +0 -47
  1192. data/spec/app/models/language.rb +0 -5
  1193. data/spec/app/models/lat_lng.rb +0 -15
  1194. data/spec/app/models/league.rb +0 -11
  1195. data/spec/app/models/learner.rb +0 -2
  1196. data/spec/app/models/line_item.rb +0 -6
  1197. data/spec/app/models/location.rb +0 -8
  1198. data/spec/app/models/login.rb +0 -8
  1199. data/spec/app/models/manufacturer.rb +0 -7
  1200. data/spec/app/models/meat.rb +0 -4
  1201. data/spec/app/models/membership.rb +0 -4
  1202. data/spec/app/models/message.rb +0 -11
  1203. data/spec/app/models/mixed_drink.rb +0 -4
  1204. data/spec/app/models/movie.rb +0 -13
  1205. data/spec/app/models/my_hash.rb +0 -2
  1206. data/spec/app/models/name.rb +0 -24
  1207. data/spec/app/models/node.rb +0 -5
  1208. data/spec/app/models/note.rb +0 -17
  1209. data/spec/app/models/odd.rb +0 -7
  1210. data/spec/app/models/ordered_post.rb +0 -11
  1211. data/spec/app/models/ordered_preference.rb +0 -6
  1212. data/spec/app/models/oscar.rb +0 -14
  1213. data/spec/app/models/override.rb +0 -16
  1214. data/spec/app/models/ownable.rb +0 -6
  1215. data/spec/app/models/owner.rb +0 -6
  1216. data/spec/app/models/pack.rb +0 -3
  1217. data/spec/app/models/page.rb +0 -16
  1218. data/spec/app/models/page_question.rb +0 -4
  1219. data/spec/app/models/palette.rb +0 -7
  1220. data/spec/app/models/parent.rb +0 -5
  1221. data/spec/app/models/parent_doc.rb +0 -6
  1222. data/spec/app/models/passport.rb +0 -5
  1223. data/spec/app/models/patient.rb +0 -9
  1224. data/spec/app/models/pdf_writer.rb +0 -3
  1225. data/spec/app/models/pencil.rb +0 -1
  1226. data/spec/app/models/person.rb +0 -207
  1227. data/spec/app/models/pet.rb +0 -23
  1228. data/spec/app/models/pet_owner.rb +0 -6
  1229. data/spec/app/models/phone.rb +0 -9
  1230. data/spec/app/models/pizza.rb +0 -7
  1231. data/spec/app/models/player.rb +0 -35
  1232. data/spec/app/models/post.rb +0 -50
  1233. data/spec/app/models/post_genre.rb +0 -6
  1234. data/spec/app/models/powerup.rb +0 -11
  1235. data/spec/app/models/preference.rb +0 -9
  1236. data/spec/app/models/princess.rb +0 -10
  1237. data/spec/app/models/product.rb +0 -17
  1238. data/spec/app/models/profile.rb +0 -5
  1239. data/spec/app/models/pronunciation.rb +0 -5
  1240. data/spec/app/models/pub.rb +0 -6
  1241. data/spec/app/models/purchase.rb +0 -4
  1242. data/spec/app/models/question.rb +0 -8
  1243. data/spec/app/models/quiz.rb +0 -7
  1244. data/spec/app/models/rating.rb +0 -8
  1245. data/spec/app/models/record.rb +0 -52
  1246. data/spec/app/models/registry.rb +0 -4
  1247. data/spec/app/models/role.rb +0 -7
  1248. data/spec/app/models/root_category.rb +0 -4
  1249. data/spec/app/models/sandwich.rb +0 -9
  1250. data/spec/app/models/scheduler.rb +0 -7
  1251. data/spec/app/models/seo.rb +0 -7
  1252. data/spec/app/models/series.rb +0 -4
  1253. data/spec/app/models/server.rb +0 -13
  1254. data/spec/app/models/service.rb +0 -22
  1255. data/spec/app/models/shape.rb +0 -12
  1256. data/spec/app/models/shelf.rb +0 -5
  1257. data/spec/app/models/shipment_address.rb +0 -2
  1258. data/spec/app/models/shipping_container.rb +0 -5
  1259. data/spec/app/models/shipping_pack.rb +0 -3
  1260. data/spec/app/models/shop.rb +0 -6
  1261. data/spec/app/models/short_agent.rb +0 -4
  1262. data/spec/app/models/short_quiz.rb +0 -5
  1263. data/spec/app/models/simple.rb +0 -5
  1264. data/spec/app/models/slave.rb +0 -6
  1265. data/spec/app/models/song.rb +0 -8
  1266. data/spec/app/models/sound.rb +0 -5
  1267. data/spec/app/models/square.rb +0 -4
  1268. data/spec/app/models/staff.rb +0 -7
  1269. data/spec/app/models/store_as_dup_test1.rb +0 -5
  1270. data/spec/app/models/store_as_dup_test2.rb +0 -5
  1271. data/spec/app/models/strategy.rb +0 -3
  1272. data/spec/app/models/sub_item.rb +0 -3
  1273. data/spec/app/models/subscription.rb +0 -5
  1274. data/spec/app/models/survey.rb +0 -5
  1275. data/spec/app/models/symptom.rb +0 -6
  1276. data/spec/app/models/tag.rb +0 -8
  1277. data/spec/app/models/target.rb +0 -5
  1278. data/spec/app/models/template.rb +0 -5
  1279. data/spec/app/models/thing.rb +0 -9
  1280. data/spec/app/models/title.rb +0 -3
  1281. data/spec/app/models/tool.rb +0 -8
  1282. data/spec/app/models/topping.rb +0 -5
  1283. data/spec/app/models/track.rb +0 -38
  1284. data/spec/app/models/translation.rb +0 -5
  1285. data/spec/app/models/tree.rb +0 -9
  1286. data/spec/app/models/truck.rb +0 -3
  1287. data/spec/app/models/user.rb +0 -21
  1288. data/spec/app/models/user_account.rb +0 -10
  1289. data/spec/app/models/validation_callback.rb +0 -10
  1290. data/spec/app/models/vehicle.rb +0 -11
  1291. data/spec/app/models/version.rb +0 -5
  1292. data/spec/app/models/vet_visit.rb +0 -5
  1293. data/spec/app/models/video.rb +0 -13
  1294. data/spec/app/models/video_game.rb +0 -1
  1295. data/spec/app/models/weapon.rb +0 -11
  1296. data/spec/app/models/wiki_page.rb +0 -14
  1297. data/spec/app/models/word.rb +0 -15
  1298. data/spec/app/models/word_origin.rb +0 -11
  1299. data/spec/app/models/writer.rb +0 -11
  1300. data/spec/mongoid/criteria/queryable/forwardable_spec.rb +0 -87
  1301. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +0 -184
  1302. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +0 -201
  1303. data/spec/mongoid/matchable/all_spec.rb +0 -31
  1304. data/spec/mongoid/matchable/and_spec.rb +0 -187
  1305. data/spec/mongoid/matchable/default_spec.rb +0 -130
  1306. data/spec/mongoid/matchable/elem_match_spec.rb +0 -86
  1307. data/spec/mongoid/matchable/exists_spec.rb +0 -57
  1308. data/spec/mongoid/matchable/gt_spec.rb +0 -86
  1309. data/spec/mongoid/matchable/gte_spec.rb +0 -84
  1310. data/spec/mongoid/matchable/in_spec.rb +0 -49
  1311. data/spec/mongoid/matchable/lt_spec.rb +0 -85
  1312. data/spec/mongoid/matchable/lte_spec.rb +0 -85
  1313. data/spec/mongoid/matchable/ne_spec.rb +0 -46
  1314. data/spec/mongoid/matchable/nin_spec.rb +0 -48
  1315. data/spec/mongoid/matchable/nor_spec.rb +0 -209
  1316. data/spec/mongoid/matchable/or_spec.rb +0 -131
  1317. data/spec/mongoid/matchable/regexp_spec.rb +0 -59
  1318. data/spec/mongoid/matchable/size_spec.rb +0 -25
  1319. data/spec/mongoid/matchable_spec.rb +0 -853
  1320. data/spec/mongoid/relations/accessors_spec.rb +0 -821
  1321. data/spec/mongoid/relations/auto_save_spec.rb +0 -314
  1322. data/spec/mongoid/relations/bindings/embedded/in_spec.rb +0 -171
  1323. data/spec/mongoid/relations/bindings/embedded/many_spec.rb +0 -54
  1324. data/spec/mongoid/relations/bindings/embedded/one_spec.rb +0 -77
  1325. data/spec/mongoid/relations/bindings/referenced/in_spec.rb +0 -241
  1326. data/spec/mongoid/relations/bindings/referenced/many_spec.rb +0 -153
  1327. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +0 -178
  1328. data/spec/mongoid/relations/bindings/referenced/one_spec.rb +0 -131
  1329. data/spec/mongoid/relations/builders/embedded/in_spec.rb +0 -34
  1330. data/spec/mongoid/relations/builders/embedded/many_spec.rb +0 -132
  1331. data/spec/mongoid/relations/builders/embedded/one_spec.rb +0 -99
  1332. data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +0 -233
  1333. data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +0 -250
  1334. data/spec/mongoid/relations/builders/referenced/in_spec.rb +0 -230
  1335. data/spec/mongoid/relations/builders/referenced/many_spec.rb +0 -137
  1336. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +0 -178
  1337. data/spec/mongoid/relations/builders/referenced/one_spec.rb +0 -111
  1338. data/spec/mongoid/relations/builders_spec.rb +0 -253
  1339. data/spec/mongoid/relations/cascading/delete_spec.rb +0 -101
  1340. data/spec/mongoid/relations/cascading/destroy_spec.rb +0 -47
  1341. data/spec/mongoid/relations/cascading/nullify_spec.rb +0 -32
  1342. data/spec/mongoid/relations/cascading/restrict_spec.rb +0 -68
  1343. data/spec/mongoid/relations/cascading_spec.rb +0 -355
  1344. data/spec/mongoid/relations/constraint_spec.rb +0 -75
  1345. data/spec/mongoid/relations/conversions_spec.rb +0 -128
  1346. data/spec/mongoid/relations/counter_cache_spec.rb +0 -450
  1347. data/spec/mongoid/relations/cyclic_spec.rb +0 -178
  1348. data/spec/mongoid/relations/eager/belongs_to_spec.rb +0 -163
  1349. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +0 -133
  1350. data/spec/mongoid/relations/eager/has_many_spec.rb +0 -244
  1351. data/spec/mongoid/relations/eager/has_one_spec.rb +0 -163
  1352. data/spec/mongoid/relations/eager_spec.rb +0 -279
  1353. data/spec/mongoid/relations/embedded/dirty_spec.rb +0 -65
  1354. data/spec/mongoid/relations/embedded/in_spec.rb +0 -579
  1355. data/spec/mongoid/relations/embedded/many_spec.rb +0 -4412
  1356. data/spec/mongoid/relations/embedded/one_spec.rb +0 -1068
  1357. data/spec/mongoid/relations/macros_spec.rb +0 -1039
  1358. data/spec/mongoid/relations/metadata_spec.rb +0 -1985
  1359. data/spec/mongoid/relations/options_spec.rb +0 -35
  1360. data/spec/mongoid/relations/polymorphic_spec.rb +0 -128
  1361. data/spec/mongoid/relations/referenced/in_spec.rb +0 -1366
  1362. data/spec/mongoid/relations/referenced/many_spec.rb +0 -3816
  1363. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +0 -3577
  1364. data/spec/mongoid/relations/referenced/one_spec.rb +0 -1240
  1365. data/spec/mongoid/relations/reflections_spec.rb +0 -101
  1366. data/spec/mongoid/relations/synchronization_spec.rb +0 -495
  1367. data/spec/mongoid/relations/targets/enumerable_spec.rb +0 -1825
  1368. data/spec/mongoid/relations/touchable_spec.rb +0 -402
  1369. data/spec/mongoid/relations_spec.rb +0 -189
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "spec_helper"
2
4
 
3
5
  describe Mongoid::Contextual::Mongo do
@@ -7,7 +9,7 @@ describe Mongoid::Contextual::Mongo do
7
9
  describe "##{method}" do
8
10
 
9
11
  before do
10
- Band.create(name: "Depeche Mode")
12
+ Band.create!(name: "Depeche Mode")
11
13
  end
12
14
 
13
15
  context "when the count is zero" do
@@ -78,11 +80,11 @@ describe Mongoid::Contextual::Mongo do
78
80
  describe "#count" do
79
81
 
80
82
  let!(:depeche) do
81
- Band.create(name: "Depeche Mode")
83
+ Band.create!(name: "Depeche Mode")
82
84
  end
83
85
 
84
86
  let!(:new_order) do
85
- Band.create(name: "New Order")
87
+ Band.create!(name: "New Order")
86
88
  end
87
89
 
88
90
  let(:criteria) do
@@ -106,11 +108,8 @@ describe Mongoid::Contextual::Mongo do
106
108
  described_class.new(criteria.cache)
107
109
  end
108
110
 
109
- before do
110
- expect(context.view).to receive(:count).once.and_return(1)
111
- end
112
-
113
111
  it "returns the count cached value after first call" do
112
+ expect(context.view).to receive(:count_documents).once.and_return(1)
114
113
  2.times { expect(context.count).to eq(1) }
115
114
  end
116
115
  end
@@ -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
@@ -168,7 +167,8 @@ describe Mongoid::Contextual::Mongo do
168
167
  end
169
168
  end
170
169
 
171
- context 'when a collation is specified', if: collation_supported? do
170
+ context 'when a collation is specified' do
171
+ min_server_version '3.4'
172
172
 
173
173
  let(:context) do
174
174
  described_class.new(criteria)
@@ -191,16 +191,81 @@ describe Mongoid::Contextual::Mongo do
191
191
  end
192
192
  end
193
193
 
194
+ describe "#estimated_count" do
195
+
196
+ let!(:depeche) do
197
+ Band.create!(name: "Depeche Mode")
198
+ end
199
+
200
+ let!(:new_order) do
201
+ Band.create!(name: "New Order")
202
+ end
203
+
204
+ let(:criteria) do
205
+ Band.where
206
+ end
207
+
208
+ context "when not providing options" do
209
+ it 'returns the correct count' do
210
+ expect(criteria.estimated_count).to eq(2)
211
+ end
212
+ end
213
+
214
+ context "when providing options" do
215
+ it 'returns the correct count' do
216
+ expect(criteria.estimated_count(maxTimeMS: 1000)).to eq(2)
217
+ end
218
+ end
219
+
220
+ context "when context is cached" do
221
+
222
+ let(:context) do
223
+ described_class.new(criteria.cache)
224
+ end
225
+
226
+ it "returns the count cached value after first call" do
227
+ expect(context.view).to receive(:estimated_document_count).once.and_return(1)
228
+ 2.times do
229
+ context.estimated_count
230
+ end
231
+ end
232
+ end
233
+
234
+ context "when the criteria contains a selector", :focus do
235
+ let(:criteria) do
236
+ Band.where(name: "New Order")
237
+ end
238
+
239
+ context "when not providing options" do
240
+ it 'raises an error' do
241
+ expect do
242
+ criteria.estimated_count
243
+ end.to raise_error(Mongoid::Errors::InvalidEstimatedCountCriteria)
244
+ end
245
+ end
246
+
247
+ context "when providing options" do
248
+ it 'raises an error' do
249
+ expect do
250
+ criteria.estimated_count(maxTimeMS: 1000)
251
+ end.to raise_error(Mongoid::Errors::InvalidEstimatedCountCriteria)
252
+ end
253
+ end
254
+ end
255
+ end
256
+
257
+
258
+
194
259
  [ :delete, :delete_all ].each do |method|
195
260
 
196
261
  describe "##{method}" do
197
262
 
198
263
  let!(:depeche_mode) do
199
- Band.create(name: "Depeche Mode")
264
+ Band.create!(name: "Depeche Mode")
200
265
  end
201
266
 
202
267
  let!(:new_order) do
203
- Band.create(name: "New Order")
268
+ Band.create!(name: "New Order")
204
269
  end
205
270
 
206
271
  context "when the selector is contraining" do
@@ -229,7 +294,8 @@ describe Mongoid::Contextual::Mongo do
229
294
  expect(deleted).to eq(1)
230
295
  end
231
296
 
232
- context 'when the criteria has a collation', if: collation_supported? do
297
+ context 'when the criteria has a collation' do
298
+ min_server_version '3.4'
233
299
 
234
300
  let(:criteria) do
235
301
  Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
@@ -300,11 +366,11 @@ describe Mongoid::Contextual::Mongo do
300
366
  describe "##{method}" do
301
367
 
302
368
  let!(:depeche_mode) do
303
- Band.create(name: "Depeche Mode")
369
+ Band.create!(name: "Depeche Mode")
304
370
  end
305
371
 
306
372
  let!(:new_order) do
307
- Band.create(name: "New Order")
373
+ Band.create!(name: "New Order")
308
374
  end
309
375
 
310
376
  context "when the selector is contraining" do
@@ -333,7 +399,8 @@ describe Mongoid::Contextual::Mongo do
333
399
  expect(destroyed).to eq(1)
334
400
  end
335
401
 
336
- context 'when the criteria has a collation', if: collation_supported? do
402
+ context 'when the criteria has a collation' do
403
+ min_server_version '3.4'
337
404
 
338
405
  let(:criteria) do
339
406
  Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
@@ -384,7 +451,7 @@ describe Mongoid::Contextual::Mongo do
384
451
  context 'when the write concern is unacknowledged' do
385
452
 
386
453
  before do
387
- 2.times { Band.create }
454
+ 2.times { Band.create! }
388
455
  end
389
456
 
390
457
  let(:criteria) do
@@ -406,27 +473,83 @@ describe Mongoid::Contextual::Mongo do
406
473
  describe "#distinct" do
407
474
 
408
475
  before do
409
- Band.create(name: "Depeche Mode", years: 30)
410
- 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")
411
479
  end
412
480
 
413
- 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
414
483
 
415
- let(:criteria) do
416
- 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
417
495
  end
418
496
 
419
- let(:context) do
420
- 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
421
510
  end
422
511
 
423
- it "returns the distinct matching fields" do
424
- expect(context.distinct(:name)).to eq([ "Depeche Mode" ])
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
425
525
  end
426
- end
427
526
 
428
- context "when not limiting the result set" do
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
549
+ end
550
+ end
429
551
 
552
+ context "when providing a demongoizable field" do
430
553
  let(:criteria) do
431
554
  Band.criteria
432
555
  end
@@ -435,46 +558,253 @@ describe Mongoid::Contextual::Mongo do
435
558
  described_class.new(criteria)
436
559
  end
437
560
 
438
- it "returns the distinct field values" do
439
- 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
440
575
  end
441
576
  end
442
577
 
443
- 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
444
590
 
445
591
  let(:criteria) do
446
- Band.criteria
592
+ Dictionary.criteria
447
593
  end
448
594
 
449
595
  let(:context) do
450
596
  described_class.new(criteria)
451
597
  end
452
598
 
453
- it "returns the distinct field values" do
454
- expect(context.distinct(:years)).to eq([ 30, 25 ])
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
455
615
  end
456
- end
457
616
 
458
- context 'when a collation is specified', if: collation_supported? do
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
459
620
 
460
- before do
461
- 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
462
633
  end
463
634
 
464
- let(:context) do
465
- 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
466
656
  end
467
657
 
468
- let(:expected_results) do
469
- ["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
470
679
  end
471
680
 
472
- let(:criteria) do
473
- 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
474
801
  end
475
802
 
476
- it 'applies the collation' do
477
- 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
478
808
  end
479
809
  end
480
810
  end
@@ -482,7 +812,7 @@ describe Mongoid::Contextual::Mongo do
482
812
  describe "#each" do
483
813
 
484
814
  before do
485
- Band.create(name: "Depeche Mode")
815
+ Band.create!(name: "Depeche Mode")
486
816
  end
487
817
 
488
818
  let(:criteria) do
@@ -493,7 +823,8 @@ describe Mongoid::Contextual::Mongo do
493
823
  described_class.new(criteria)
494
824
  end
495
825
 
496
- context 'when the criteria has a collation', if: collation_supported? do
826
+ context 'when the criteria has a collation' do
827
+ min_server_version '3.4'
497
828
 
498
829
  let(:criteria) do
499
830
  Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
@@ -559,7 +890,7 @@ describe Mongoid::Contextual::Mongo do
559
890
  context "when iterating with next" do
560
891
 
561
892
  before do
562
- 10.times { |i| Band.create(name: "Test #{i}") }
893
+ 10.times { |i| Band.create!(name: "Test #{i}") }
563
894
  end
564
895
 
565
896
  let(:criteria) do
@@ -571,12 +902,50 @@ describe Mongoid::Contextual::Mongo do
571
902
  end
572
903
 
573
904
  it "does not load all documents" do
574
- 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
+
575
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)
576
920
  end
577
921
  end
578
922
  end
579
923
  end
924
+
925
+ context 'when the criteria has a parent document' do
926
+
927
+ before do
928
+ Post.create!(person: person)
929
+ Post.create!(person: person)
930
+ Post.create!(person: person)
931
+ end
932
+
933
+ let(:person) do
934
+ Person.new
935
+ end
936
+
937
+ let(:criteria) do
938
+ person.posts.all
939
+ end
940
+
941
+ let(:persons) do
942
+ criteria.collect(&:person)
943
+ end
944
+
945
+ it 'sets the same parent object on each related object' do
946
+ expect(persons.uniq.size).to eq(1)
947
+ end
948
+ end
580
949
  end
581
950
 
582
951
  describe "#eager_load" do
@@ -591,12 +960,12 @@ describe Mongoid::Contextual::Mongo do
591
960
 
592
961
  context "when no documents are returned" do
593
962
 
594
- let(:game_metadata) do
963
+ let(:game_association) do
595
964
  Person.reflect_on_association(:game)
596
965
  end
597
966
 
598
967
  it "does not make any additional database queries" do
599
- expect(game_metadata).to receive(:eager_load).never
968
+ expect(game_association).to receive(:eager_load).never
600
969
  context.send(:eager_load, [])
601
970
  end
602
971
  end
@@ -605,7 +974,7 @@ describe Mongoid::Contextual::Mongo do
605
974
  describe "#exists?" do
606
975
 
607
976
  before do
608
- Band.create(name: "Depeche Mode")
977
+ Band.create!(name: "Depeche Mode")
609
978
  end
610
979
 
611
980
  context "when the count is zero" do
@@ -718,11 +1087,11 @@ describe Mongoid::Contextual::Mongo do
718
1087
  describe "#find_one_and_replace" do
719
1088
 
720
1089
  let!(:depeche) do
721
- Band.create(name: "Depeche Mode")
1090
+ Band.create!(name: "Depeche Mode")
722
1091
  end
723
1092
 
724
1093
  let!(:tool) do
725
- Band.create(name: "Tool")
1094
+ Band.create!(name: "Tool")
726
1095
  end
727
1096
 
728
1097
  context "when the selector matches" do
@@ -825,7 +1194,8 @@ describe Mongoid::Contextual::Mongo do
825
1194
  end
826
1195
  end
827
1196
 
828
- context 'when a collation is specified on the criteria', if: collation_supported? do
1197
+ context 'when a collation is specified on the criteria' do
1198
+ min_server_version '3.4'
829
1199
 
830
1200
  let(:criteria) do
831
1201
  Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
@@ -873,11 +1243,11 @@ describe Mongoid::Contextual::Mongo do
873
1243
  describe "#find_one_and_update" do
874
1244
 
875
1245
  let!(:depeche) do
876
- Band.create(name: "Depeche Mode")
1246
+ Band.create!(name: "Depeche Mode")
877
1247
  end
878
1248
 
879
1249
  let!(:tool) do
880
- Band.create(name: "Tool")
1250
+ Band.create!(name: "Tool")
881
1251
  end
882
1252
 
883
1253
  context "when the selector matches" do
@@ -978,7 +1348,8 @@ describe Mongoid::Contextual::Mongo do
978
1348
  end
979
1349
  end
980
1350
 
981
- context 'when a collation is specified on the criteria', if: collation_supported? do
1351
+ context 'when a collation is specified on the criteria' do
1352
+ min_server_version '3.4'
982
1353
 
983
1354
  let(:criteria) do
984
1355
  Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
@@ -1025,7 +1396,7 @@ describe Mongoid::Contextual::Mongo do
1025
1396
  describe "#find_one_and_delete" do
1026
1397
 
1027
1398
  let!(:depeche) do
1028
- Band.create(name: "Depeche Mode")
1399
+ Band.create!(name: "Depeche Mode")
1029
1400
  end
1030
1401
 
1031
1402
  let(:criteria) do
@@ -1052,7 +1423,8 @@ describe Mongoid::Contextual::Mongo do
1052
1423
  }.to raise_error(Mongoid::Errors::DocumentNotFound)
1053
1424
  end
1054
1425
 
1055
- context 'when a collation is specified on the criteria', if: collation_supported? do
1426
+ context 'when a collation is specified on the criteria' do
1427
+ min_server_version '3.4'
1056
1428
 
1057
1429
  let(:criteria) do
1058
1430
  Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
@@ -1103,11 +1475,15 @@ describe Mongoid::Contextual::Mongo do
1103
1475
  describe "##{method}" do
1104
1476
 
1105
1477
  let!(:depeche_mode) do
1106
- Band.create(name: "Depeche Mode")
1478
+ Band.create!(name: "Depeche Mode")
1107
1479
  end
1108
1480
 
1109
1481
  let!(:new_order) do
1110
- 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")
1111
1487
  end
1112
1488
 
1113
1489
  context "when the context is not cached" do
@@ -1124,7 +1500,8 @@ describe Mongoid::Contextual::Mongo do
1124
1500
  expect(context.send(method)).to eq(depeche_mode)
1125
1501
  end
1126
1502
 
1127
- context 'when the criteria has a collation', if: collation_supported? do
1503
+ context 'when the criteria has a collation' do
1504
+ min_server_version '3.4'
1128
1505
 
1129
1506
  let(:criteria) do
1130
1507
  Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
@@ -1149,14 +1526,14 @@ describe Mongoid::Contextual::Mongo do
1149
1526
  context "when there is sort on the context" do
1150
1527
 
1151
1528
  it "follows the main sort" do
1152
- expect(context.send(method)).to eq(new_order)
1529
+ expect(context.send(method)).to eq(rolling_stones)
1153
1530
  end
1154
1531
  end
1155
1532
 
1156
1533
  context "when subsequently calling #last" do
1157
1534
 
1158
1535
  it "returns the correct document" do
1159
- expect(context.send(method)).to eq(new_order)
1536
+ expect(context.send(method)).to eq(rolling_stones)
1160
1537
  expect(context.last).to eq(depeche_mode)
1161
1538
  end
1162
1539
  end
@@ -1181,23 +1558,22 @@ describe Mongoid::Contextual::Mongo do
1181
1558
 
1182
1559
  it 'returns the last document, sorted by _id' do
1183
1560
  expect(context.send(method)).to eq(depeche_mode)
1184
- expect(context.last).to eq(new_order)
1561
+ expect(context.last).to eq(rolling_stones)
1185
1562
  end
1186
1563
  end
1187
1564
 
1188
- context 'with option { sort: :none }' do
1189
-
1565
+ context 'with option { id_sort: :none }' do
1190
1566
  let(:opts) do
1191
1567
  { id_sort: :none }
1192
1568
  end
1193
1569
 
1194
- it 'does not apply the sort on _id' do
1570
+ it 'applies the sort on _id' do
1195
1571
  expect(context.send(method, opts)).to eq(depeche_mode)
1196
1572
  end
1197
1573
 
1198
1574
  context 'when calling #last' do
1199
1575
 
1200
- it 'does not apply a sort on _id' do
1576
+ it 'doesn\'t apply a sort on _id' do
1201
1577
  expect(context.send(method, opts)).to eq(depeche_mode)
1202
1578
  expect(context.last(opts)).to eq(depeche_mode)
1203
1579
  end
@@ -1215,33 +1591,32 @@ describe Mongoid::Contextual::Mongo do
1215
1591
  described_class.new(criteria)
1216
1592
  end
1217
1593
 
1218
-
1219
1594
  it 'applies the criteria sort' do
1220
- expect(context.send(method)).to eq(new_order)
1595
+ expect(context.send(method)).to eq(rolling_stones)
1221
1596
  end
1222
1597
 
1223
1598
  context 'when calling #last' do
1224
1599
 
1225
1600
  it 'applies the criteria sort' do
1226
- expect(context.send(method)).to eq(new_order)
1601
+ expect(context.send(method)).to eq(rolling_stones)
1227
1602
  expect(context.last).to eq(depeche_mode)
1228
1603
  end
1229
1604
  end
1230
1605
 
1231
- context 'with option { sort: :none }' do
1606
+ context 'with option { id_sort: :none }' do
1232
1607
 
1233
1608
  let(:opts) do
1234
1609
  { id_sort: :none }
1235
1610
  end
1236
1611
 
1237
- it 'applies the criteria sort' do
1238
- 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)
1239
1614
  end
1240
1615
 
1241
1616
  context 'when calling #last' do
1242
1617
 
1243
- it 'applies the criteria sort' do
1244
- 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)
1245
1620
  expect(context.last(opts)).to eq(depeche_mode)
1246
1621
  end
1247
1622
  end
@@ -1261,14 +1636,14 @@ describe Mongoid::Contextual::Mongo do
1261
1636
  context "when there is sort on the context" do
1262
1637
 
1263
1638
  it "follows the main sort" do
1264
- expect(context.send(method)).to eq(new_order)
1639
+ expect(context.send(method)).to eq(rolling_stones)
1265
1640
  end
1266
1641
  end
1267
1642
 
1268
1643
  context "when subsequently calling #last" do
1269
1644
 
1270
1645
  it "returns the correct document" do
1271
- expect(context.send(method)).to eq(new_order)
1646
+ expect(context.send(method)).to eq(rolling_stones)
1272
1647
  expect(context.last).to eq(depeche_mode)
1273
1648
  end
1274
1649
  end
@@ -1308,43 +1683,717 @@ describe Mongoid::Contextual::Mongo do
1308
1683
  end
1309
1684
  end
1310
1685
  end
1311
- end
1312
- end
1313
1686
 
1314
- describe "#initialize" do
1687
+ context "when including a limit" do
1315
1688
 
1316
- let(:criteria) do
1317
- Band.where(name: "Depeche Mode").no_timeout
1318
- end
1689
+ context "when the context is not cached" do
1319
1690
 
1320
- let(:context) do
1321
- described_class.new(criteria)
1322
- end
1691
+ let(:context) do
1692
+ described_class.new(criteria)
1693
+ end
1323
1694
 
1324
- it "sets the criteria" do
1325
- expect(context.criteria).to eq(criteria)
1326
- end
1695
+ context "when the limit is 1" do
1696
+ let(:criteria) do
1697
+ Band.criteria
1698
+ end
1327
1699
 
1328
- it "sets the klass" do
1329
- expect(context.klass).to eq(Band)
1330
- end
1700
+ let(:docs) do
1701
+ context.send(method, 1)
1702
+ end
1331
1703
 
1332
- it "sets the view" do
1333
- expect(context.view).to be_a(Mongo::Collection::View)
1334
- end
1704
+ it "returns an array of documents" do
1705
+ expect(docs).to eq([ depeche_mode ])
1706
+ end
1707
+ end
1335
1708
 
1336
- it "sets the view selector" do
1337
- expect(context.view.selector).to eq({ "name" => "Depeche Mode" })
1338
- end
1339
- end
1709
+ context "when the limit is >1" do
1710
+ let(:criteria) do
1711
+ Band.criteria
1712
+ end
1713
+
1714
+ let(:docs) do
1715
+ context.send(method, 2)
1716
+ end
1717
+
1718
+ it "returns the number of documents in order" do
1719
+ expect(docs).to eq([ depeche_mode, new_order ])
1720
+ end
1721
+ end
1722
+
1723
+ context 'when the criteria has a collation' do
1724
+ min_server_version '3.4'
1725
+
1726
+ let(:criteria) do
1727
+ Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
1728
+ end
1729
+
1730
+ it "returns the first matching document" do
1731
+ expect(context.send(method, 1)).to eq([ depeche_mode ])
1732
+ end
1733
+ end
1734
+ end
1735
+
1736
+ context "when the context is cached" do
1737
+
1738
+ let(:context) do
1739
+ described_class.new(criteria)
1740
+ end
1741
+
1742
+ context "when the whole context is loaded" do
1743
+
1744
+ before do
1745
+ context.to_a
1746
+ end
1747
+
1748
+ context "when all of the documents are cached" do
1749
+
1750
+ let(:criteria) do
1751
+ Band.all.cache
1752
+ end
1753
+
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
1340
2389
 
1341
2390
  [ :length, :size ].each do |method|
1342
2391
 
1343
2392
  describe "##{method}" do
1344
2393
 
1345
2394
  before do
1346
- Band.create(name: "Depeche Mode")
1347
- Band.create(name: "New Order")
2395
+ Band.create!(name: "Depeche Mode")
2396
+ Band.create!(name: "New Order")
1348
2397
  end
1349
2398
 
1350
2399
  context "when the criteria has a limit" do
@@ -1362,12 +2411,8 @@ describe Mongoid::Contextual::Mongo do
1362
2411
  end
1363
2412
 
1364
2413
  context "when calling more than once" do
1365
-
1366
- before do
1367
- expect(context.view).to receive(:count).once.and_return(2)
1368
- end
1369
-
1370
2414
  it "returns the cached value for subsequent calls" do
2415
+ expect(context.view).to receive(:count_documents).once.and_return(2)
1371
2416
  2.times { expect(context.send(method)).to eq(2) }
1372
2417
  end
1373
2418
  end
@@ -1376,10 +2421,10 @@ describe Mongoid::Contextual::Mongo do
1376
2421
 
1377
2422
  before do
1378
2423
  context.entries
1379
- expect(context.view).to receive(:count).once.and_return(2)
1380
2424
  end
1381
2425
 
1382
2426
  it "returns the cached value for all calls" do
2427
+ expect(context.view).to receive(:count_documents).once.and_return(2)
1383
2428
  expect(context.send(method)).to eq(2)
1384
2429
  end
1385
2430
 
@@ -1411,12 +2456,8 @@ describe Mongoid::Contextual::Mongo do
1411
2456
  end
1412
2457
 
1413
2458
  context "when calling more than once" do
1414
-
1415
- before do
1416
- expect(context.view).to receive(:count).once.and_return(1)
1417
- end
1418
-
1419
2459
  it "returns the cached value for subsequent calls" do
2460
+ expect(context.view).to receive(:count_documents).once.and_return(1)
1420
2461
  2.times { expect(context.send(method)).to eq(1) }
1421
2462
  end
1422
2463
  end
@@ -1425,10 +2466,10 @@ describe Mongoid::Contextual::Mongo do
1425
2466
 
1426
2467
  before do
1427
2468
  context.entries
1428
- expect(context.view).to receive(:count).once.and_return(1)
1429
2469
  end
1430
2470
 
1431
2471
  it "returns the cached value for all calls" do
2472
+ expect(context.view).to receive(:count_documents).once.and_return(1)
1432
2473
  expect(context.send(method)).to eq(1)
1433
2474
  end
1434
2475
 
@@ -1450,11 +2491,11 @@ describe Mongoid::Contextual::Mongo do
1450
2491
  describe "#limit" do
1451
2492
 
1452
2493
  let!(:depeche_mode) do
1453
- Band.create(name: "Depeche Mode")
2494
+ Band.create!(name: "Depeche Mode")
1454
2495
  end
1455
2496
 
1456
2497
  let!(:new_order) do
1457
- Band.create(name: "New Order")
2498
+ Band.create!(name: "New Order")
1458
2499
  end
1459
2500
 
1460
2501
  let(:criteria) do
@@ -1470,11 +2511,85 @@ describe Mongoid::Contextual::Mongo do
1470
2511
  end
1471
2512
  end
1472
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
+
1473
2588
  describe "#map" do
1474
2589
 
1475
2590
  before do
1476
- Band.create(name: "Depeche Mode")
1477
- Band.create(name: "New Order")
2591
+ Band.create!(name: "Depeche Mode")
2592
+ Band.create!(name: "New Order")
1478
2593
  end
1479
2594
 
1480
2595
  let(:criteria) do
@@ -1487,7 +2602,8 @@ describe Mongoid::Contextual::Mongo do
1487
2602
 
1488
2603
  context "when passed the symbol field name" do
1489
2604
 
1490
- it "performs mapping" do
2605
+ it "performs mapping and warns" do
2606
+ expect(Mongoid::Warnings).to receive(:warn_map_field_deprecated)
1491
2607
  expect(context.map(:name)).to eq ["Depeche Mode", "New Order"]
1492
2608
  end
1493
2609
  end
@@ -1503,11 +2619,11 @@ describe Mongoid::Contextual::Mongo do
1503
2619
  describe "#map_reduce" do
1504
2620
 
1505
2621
  let!(:depeche_mode) do
1506
- Band.create(name: "Depeche Mode", likes: 200)
2622
+ Band.create!(name: "Depeche Mode", likes: 200)
1507
2623
  end
1508
2624
 
1509
2625
  let!(:tool) do
1510
- Band.create(name: "Tool", likes: 100)
2626
+ Band.create!(name: "Tool", likes: 100)
1511
2627
  end
1512
2628
 
1513
2629
  let(:map) do
@@ -1528,6 +2644,10 @@ describe Mongoid::Contextual::Mongo do
1528
2644
  }}
1529
2645
  end
1530
2646
 
2647
+ let(:ordered_results) do
2648
+ results['results'].sort_by { |doc| doc['_id'] }
2649
+ end
2650
+
1531
2651
  context "when no selection is provided" do
1532
2652
 
1533
2653
  let(:criteria) do
@@ -1559,36 +2679,40 @@ describe Mongoid::Contextual::Mongo do
1559
2679
  end
1560
2680
 
1561
2681
  it "contains the entire raw results" do
1562
- expect(results["results"]).to eq([
2682
+ expect(ordered_results).to eq([
1563
2683
  { "_id" => "Depeche Mode", "value" => { "likes" => 200 }},
1564
2684
  { "_id" => "Tool", "value" => { "likes" => 100 }}
1565
2685
  ])
1566
2686
  end
1567
2687
 
1568
- it "contains the execution time" do
1569
- expect(results.time).to_not be_nil
1570
- end
2688
+ context 'when statistics are available' do
2689
+ max_server_version '4.2'
1571
2690
 
1572
- it "contains the count statistics" do
1573
- expect(results["counts"]).to eq({
1574
- "input" => 2, "emit" => 2, "reduce" => 0, "output" => 2
1575
- })
1576
- end
2691
+ it "contains the execution time" do
2692
+ expect(results.time).to_not be_nil
2693
+ end
1577
2694
 
1578
- it "contains the input count" do
1579
- expect(results.input).to eq(2)
1580
- end
2695
+ it "contains the count statistics" do
2696
+ expect(results["counts"]).to eq({
2697
+ "input" => 2, "emit" => 2, "reduce" => 0, "output" => 2
2698
+ })
2699
+ end
1581
2700
 
1582
- it "contains the emitted count" do
1583
- expect(results.emitted).to eq(2)
1584
- end
2701
+ it "contains the input count" do
2702
+ expect(results.input).to eq(2)
2703
+ end
1585
2704
 
1586
- it "contains the reduced count" do
1587
- expect(results.reduced).to eq(0)
1588
- end
2705
+ it "contains the emitted count" do
2706
+ expect(results.emitted).to eq(2)
2707
+ end
1589
2708
 
1590
- it "contains the output count" do
1591
- expect(results.output).to eq(2)
2709
+ it "contains the reduced count" do
2710
+ expect(results.reduced).to eq(0)
2711
+ end
2712
+
2713
+ it "contains the output count" do
2714
+ expect(results.output).to eq(2)
2715
+ end
1592
2716
  end
1593
2717
  end
1594
2718
 
@@ -1617,35 +2741,39 @@ describe Mongoid::Contextual::Mongo do
1617
2741
  end
1618
2742
 
1619
2743
  it "contains the entire raw results" do
1620
- expect(results["results"]).to eq([
2744
+ expect(ordered_results).to eq([
1621
2745
  { "_id" => "Depeche Mode", "value" => { "likes" => 200 }}
1622
2746
  ])
1623
2747
  end
1624
2748
 
1625
- it "contains the execution time" do
1626
- expect(results.time).to_not be_nil
1627
- end
2749
+ context 'when statistics are available' do
2750
+ max_server_version '4.2'
1628
2751
 
1629
- it "contains the count statistics" do
1630
- expect(results["counts"]).to eq({
1631
- "input" => 1, "emit" => 1, "reduce" => 0, "output" => 1
1632
- })
1633
- end
2752
+ it "contains the execution time" do
2753
+ expect(results.time).to_not be_nil
2754
+ end
1634
2755
 
1635
- it "contains the input count" do
1636
- expect(results.input).to eq(1)
1637
- end
2756
+ it "contains the count statistics" do
2757
+ expect(results["counts"]).to eq({
2758
+ "input" => 1, "emit" => 1, "reduce" => 0, "output" => 1
2759
+ })
2760
+ end
1638
2761
 
1639
- it "contains the emitted count" do
1640
- expect(results.emitted).to eq(1)
1641
- end
2762
+ it "contains the input count" do
2763
+ expect(results.input).to eq(1)
2764
+ end
1642
2765
 
1643
- it "contains the reduced count" do
1644
- expect(results.reduced).to eq(0)
1645
- end
2766
+ it "contains the emitted count" do
2767
+ expect(results.emitted).to eq(1)
2768
+ end
2769
+
2770
+ it "contains the reduced count" do
2771
+ expect(results.reduced).to eq(0)
2772
+ end
1646
2773
 
1647
- it "contains the output count" do
1648
- expect(results.output).to eq(1)
2774
+ it "contains the output count" do
2775
+ expect(results.output).to eq(1)
2776
+ end
1649
2777
  end
1650
2778
  end
1651
2779
 
@@ -1685,7 +2813,7 @@ describe Mongoid::Contextual::Mongo do
1685
2813
  end
1686
2814
 
1687
2815
  it "contains the entire raw results" do
1688
- expect(results["results"]).to eq([
2816
+ expect(ordered_results).to eq([
1689
2817
  { "_id" => "Depeche Mode", "value" => { "likes" => 200 }},
1690
2818
  { "_id" => "Tool", "value" => { "likes" => 100 }}
1691
2819
  ])
@@ -1693,6 +2821,9 @@ describe Mongoid::Contextual::Mongo do
1693
2821
  end
1694
2822
 
1695
2823
  context "when limiting is provided" do
2824
+ # map/reduce with limit is not supported on sharded clusters:
2825
+ # https://jira.mongodb.org/browse/SERVER-2099
2826
+ require_topology :single, :replica_set
1696
2827
 
1697
2828
  let(:criteria) do
1698
2829
  Band.limit(1)
@@ -1799,6 +2930,8 @@ describe Mongoid::Contextual::Mongo do
1799
2930
  end
1800
2931
 
1801
2932
  context "when the output specifies a different db" do
2933
+ # Limit is not supported in sharded clusters
2934
+ require_topology :single, :replica_set
1802
2935
 
1803
2936
  let(:criteria) do
1804
2937
  Band.limit(1)
@@ -1915,11 +3048,11 @@ describe Mongoid::Contextual::Mongo do
1915
3048
  describe "#skip" do
1916
3049
 
1917
3050
  let!(:depeche_mode) do
1918
- Band.create(name: "Depeche Mode")
3051
+ Band.create!(name: "Depeche Mode")
1919
3052
  end
1920
3053
 
1921
3054
  let!(:new_order) do
1922
- Band.create(name: "New Order")
3055
+ Band.create!(name: "New Order")
1923
3056
  end
1924
3057
 
1925
3058
  let(:criteria) do
@@ -1938,11 +3071,11 @@ describe Mongoid::Contextual::Mongo do
1938
3071
  describe "#sort" do
1939
3072
 
1940
3073
  let!(:depeche_mode) do
1941
- Band.create(name: "Depeche Mode")
3074
+ Band.create!(name: "Depeche Mode")
1942
3075
  end
1943
3076
 
1944
3077
  let!(:new_order) do
1945
- Band.create(name: "New Order")
3078
+ Band.create!(name: "New Order")
1946
3079
  end
1947
3080
 
1948
3081
  let(:criteria) do
@@ -1981,11 +3114,11 @@ describe Mongoid::Contextual::Mongo do
1981
3114
  describe "#update" do
1982
3115
 
1983
3116
  let!(:depeche_mode) do
1984
- Band.create(name: "Depeche Mode")
3117
+ Band.create!(name: "Depeche Mode")
1985
3118
  end
1986
3119
 
1987
3120
  let!(:new_order) do
1988
- Band.create(name: "New Order")
3121
+ Band.create!(name: "New Order")
1989
3122
  end
1990
3123
 
1991
3124
  let(:criteria) do
@@ -1999,11 +3132,11 @@ describe Mongoid::Contextual::Mongo do
1999
3132
  context "when adding an element to a HABTM set" do
2000
3133
 
2001
3134
  let(:person) do
2002
- Person.create
3135
+ Person.create!
2003
3136
  end
2004
3137
 
2005
3138
  let(:preference) do
2006
- Preference.create
3139
+ Preference.create!
2007
3140
  end
2008
3141
 
2009
3142
  before do
@@ -2133,7 +3266,8 @@ describe Mongoid::Contextual::Mongo do
2133
3266
  end
2134
3267
  end
2135
3268
 
2136
- context 'when provided array filters', if: array_filters_supported? do
3269
+ context 'when provided array filters' do
3270
+ min_server_version '3.6'
2137
3271
 
2138
3272
  before do
2139
3273
  Band.delete_all
@@ -2141,12 +3275,12 @@ describe Mongoid::Contextual::Mongo do
2141
3275
  b.labels << Label.new(name: 'Warner')
2142
3276
  b.labels << Label.new(name: 'Sony')
2143
3277
  b.labels << Label.new(name: 'Cbs')
2144
- b.save
3278
+ b.save!
2145
3279
 
2146
3280
  b = Band.new(name: 'FKA Twigs')
2147
3281
  b.labels << Label.new(name: 'Warner')
2148
3282
  b.labels << Label.new(name: 'Cbs')
2149
- b.save
3283
+ b.save!
2150
3284
  end
2151
3285
 
2152
3286
 
@@ -2172,11 +3306,11 @@ describe Mongoid::Contextual::Mongo do
2172
3306
  describe "#update_all" do
2173
3307
 
2174
3308
  let!(:depeche_mode) do
2175
- Band.create(name: "Depeche Mode", origin: "Essex")
3309
+ Band.create!(name: "Depeche Mode", origin: "Essex")
2176
3310
  end
2177
3311
 
2178
3312
  let!(:new_order) do
2179
- Band.create(name: "New Order")
3313
+ Band.create!(name: "New Order")
2180
3314
  end
2181
3315
 
2182
3316
  let(:criteria) do
@@ -2305,7 +3439,8 @@ describe Mongoid::Contextual::Mongo do
2305
3439
  end
2306
3440
  end
2307
3441
 
2308
- context 'when provided array filters', if: array_filters_supported? do
3442
+ context 'when provided array filters' do
3443
+ min_server_version '3.6'
2309
3444
 
2310
3445
  before do
2311
3446
  Band.delete_all
@@ -2313,12 +3448,12 @@ describe Mongoid::Contextual::Mongo do
2313
3448
  b.labels << Label.new(name: 'Warner')
2314
3449
  b.labels << Label.new(name: 'Sony')
2315
3450
  b.labels << Label.new(name: 'Cbs')
2316
- b.save
3451
+ b.save!
2317
3452
 
2318
3453
  b = Band.new(name: 'FKA Twigs')
2319
3454
  b.labels << Label.new(name: 'Warner')
2320
3455
  b.labels << Label.new(name: 'Cbs')
2321
- b.save
3456
+ b.save!
2322
3457
  end
2323
3458
 
2324
3459
 
@@ -2328,7 +3463,7 @@ describe Mongoid::Contextual::Mongo do
2328
3463
 
2329
3464
  let!(:update) do
2330
3465
  context.update_all({ '$set' => { 'labels.$[i].name' => 'Sony' } },
2331
- array_filters: [{ 'i.name' => 'Cbs' }])
3466
+ array_filters: [{ 'i.name' => 'Cbs' }])
2332
3467
  end
2333
3468
 
2334
3469
  it 'applies the array filters' do
@@ -2343,7 +3478,7 @@ describe Mongoid::Contextual::Mongo do
2343
3478
 
2344
3479
  describe '#pipeline' do
2345
3480
 
2346
- context 'when the criteria has a selector', if: non_legacy_server? do
3481
+ context 'when the criteria has a selector' do
2347
3482
 
2348
3483
  before do
2349
3484
  Artist.index(name: "text")