mongoid 7.1.5 → 7.2.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 (461) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/README.md +9 -2
  5. data/Rakefile +33 -7
  6. data/lib/config/locales/en.yml +37 -1
  7. data/lib/mongoid.rb +23 -0
  8. data/lib/mongoid/association/depending.rb +1 -6
  9. data/lib/mongoid/association/many.rb +3 -3
  10. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  11. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +1 -1
  12. data/lib/mongoid/association/referenced/has_many/enumerable.rb +36 -1
  13. data/lib/mongoid/association/referenced/has_many/proxy.rb +8 -1
  14. data/lib/mongoid/association/referenced/has_one/buildable.rb +9 -1
  15. data/lib/mongoid/association/referenced/has_one/proxy.rb +6 -1
  16. data/lib/mongoid/atomic/modifiers.rb +1 -1
  17. data/lib/mongoid/attributes/dynamic.rb +1 -1
  18. data/lib/mongoid/clients/factory.rb +17 -0
  19. data/lib/mongoid/composable.rb +1 -0
  20. data/lib/mongoid/config.rb +3 -0
  21. data/lib/mongoid/contextual/mongo.rb +23 -4
  22. data/lib/mongoid/copyable.rb +7 -3
  23. data/lib/mongoid/criteria.rb +57 -7
  24. data/lib/mongoid/criteria/queryable/key.rb +1 -1
  25. data/lib/mongoid/criteria/queryable/mergeable.rb +2 -2
  26. data/lib/mongoid/criteria/queryable/selectable.rb +21 -6
  27. data/lib/mongoid/criteria/queryable/selector.rb +3 -7
  28. data/lib/mongoid/criteria/queryable/storable.rb +3 -3
  29. data/lib/mongoid/document.rb +18 -5
  30. data/lib/mongoid/errors.rb +7 -0
  31. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +25 -0
  32. data/lib/mongoid/errors/invalid_elem_match_operator.rb +33 -0
  33. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +26 -0
  34. data/lib/mongoid/errors/invalid_expression_operator.rb +28 -0
  35. data/lib/mongoid/errors/invalid_field_operator.rb +33 -0
  36. data/lib/mongoid/errors/invalid_query.rb +41 -0
  37. data/lib/mongoid/extensions.rb +1 -0
  38. data/lib/mongoid/factory.rb +27 -10
  39. data/lib/mongoid/fields.rb +3 -0
  40. data/lib/mongoid/fields/validators/macro.rb +22 -9
  41. data/lib/mongoid/findable.rb +50 -14
  42. data/lib/mongoid/indexable.rb +2 -2
  43. data/lib/mongoid/interceptable.rb +3 -1
  44. data/lib/mongoid/matchable.rb +1 -149
  45. data/lib/mongoid/matcher.rb +127 -0
  46. data/lib/mongoid/matcher/all.rb +22 -0
  47. data/lib/mongoid/matcher/and.rb +21 -0
  48. data/lib/mongoid/matcher/elem_match.rb +35 -0
  49. data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
  50. data/lib/mongoid/matcher/eq.rb +11 -0
  51. data/lib/mongoid/matcher/eq_impl.rb +32 -0
  52. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +21 -0
  53. data/lib/mongoid/matcher/exists.rb +15 -0
  54. data/lib/mongoid/matcher/expression.rb +40 -0
  55. data/lib/mongoid/matcher/expression_operator.rb +19 -0
  56. data/lib/mongoid/matcher/field_expression.rb +63 -0
  57. data/lib/mongoid/matcher/field_operator.rb +48 -0
  58. data/lib/mongoid/matcher/gt.rb +17 -0
  59. data/lib/mongoid/matcher/gte.rb +17 -0
  60. data/lib/mongoid/matcher/in.rb +25 -0
  61. data/lib/mongoid/matcher/lt.rb +17 -0
  62. data/lib/mongoid/matcher/lte.rb +17 -0
  63. data/lib/mongoid/matcher/ne.rb +16 -0
  64. data/lib/mongoid/matcher/nin.rb +11 -0
  65. data/lib/mongoid/matcher/nor.rb +25 -0
  66. data/lib/mongoid/matcher/not.rb +29 -0
  67. data/lib/mongoid/matcher/or.rb +21 -0
  68. data/lib/mongoid/matcher/regex.rb +41 -0
  69. data/lib/mongoid/matcher/size.rb +26 -0
  70. data/lib/mongoid/persistable/deletable.rb +1 -1
  71. data/lib/mongoid/query_cache.rb +64 -62
  72. data/lib/mongoid/reloadable.rb +2 -2
  73. data/lib/mongoid/serializable.rb +1 -1
  74. data/lib/mongoid/stringified_symbol.rb +53 -0
  75. data/lib/mongoid/traversable.rb +111 -4
  76. data/lib/mongoid/version.rb +1 -1
  77. data/spec/README.md +19 -4
  78. data/spec/integration/app_spec.rb +46 -13
  79. data/spec/integration/associations/embedded_spec.rb +94 -0
  80. data/spec/integration/associations/embeds_many_spec.rb +24 -0
  81. data/spec/integration/associations/embeds_one_spec.rb +24 -0
  82. data/spec/integration/associations/has_many_spec.rb +108 -13
  83. data/spec/integration/associations/has_one_spec.rb +108 -13
  84. data/spec/integration/associations/nested_attributes_assignment_spec.rb +116 -0
  85. data/spec/integration/atomic/modifiers_spec.rb +117 -0
  86. data/spec/integration/callbacks_models.rb +49 -0
  87. data/spec/integration/callbacks_spec.rb +216 -0
  88. data/spec/integration/discriminator_key_spec.rb +354 -0
  89. data/spec/integration/discriminator_value_spec.rb +207 -0
  90. data/spec/integration/{matchable_spec.rb → matcher_examples_spec.rb} +120 -41
  91. data/spec/integration/matcher_operator_data/all.yml +140 -0
  92. data/spec/integration/matcher_operator_data/and.yml +93 -0
  93. data/spec/integration/matcher_operator_data/elem_match.yml +363 -0
  94. data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
  95. data/spec/integration/matcher_operator_data/eq.yml +191 -0
  96. data/spec/integration/matcher_operator_data/exists.yml +213 -0
  97. data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
  98. data/spec/integration/matcher_operator_data/gt.yml +132 -0
  99. data/spec/integration/matcher_operator_data/gt_types.yml +63 -0
  100. data/spec/integration/matcher_operator_data/gte.yml +132 -0
  101. data/spec/integration/matcher_operator_data/gte_types.yml +15 -0
  102. data/spec/integration/matcher_operator_data/implicit.yml +331 -0
  103. data/spec/integration/matcher_operator_data/implicit_traversal.yml +16 -0
  104. data/spec/integration/matcher_operator_data/in.yml +194 -0
  105. data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
  106. data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
  107. data/spec/integration/matcher_operator_data/lt.yml +132 -0
  108. data/spec/integration/matcher_operator_data/lt_types.yml +15 -0
  109. data/spec/integration/matcher_operator_data/lte.yml +132 -0
  110. data/spec/integration/matcher_operator_data/lte_types.yml +15 -0
  111. data/spec/integration/matcher_operator_data/multiple.yml +29 -0
  112. data/spec/integration/matcher_operator_data/ne.yml +150 -0
  113. data/spec/integration/matcher_operator_data/ne_types.yml +15 -0
  114. data/spec/integration/matcher_operator_data/nin.yml +114 -0
  115. data/spec/integration/matcher_operator_data/nor.yml +126 -0
  116. data/spec/integration/matcher_operator_data/not.yml +196 -0
  117. data/spec/integration/matcher_operator_data/or.yml +137 -0
  118. data/spec/integration/matcher_operator_data/regex.yml +174 -0
  119. data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
  120. data/spec/integration/matcher_operator_data/size.yml +174 -0
  121. data/spec/integration/matcher_operator_spec.rb +100 -0
  122. data/spec/integration/matcher_spec.rb +189 -0
  123. data/spec/integration/server_query_spec.rb +142 -0
  124. data/spec/integration/stringified_symbol_field_spec.rb +190 -0
  125. data/spec/lite_spec_helper.rb +4 -3
  126. data/spec/mongoid/association/depending_spec.rb +78 -26
  127. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +50 -0
  128. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +33 -0
  129. data/spec/mongoid/association/embedded/embeds_many_models.rb +1 -0
  130. data/spec/mongoid/association/embedded/embeds_one_models.rb +1 -0
  131. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +460 -186
  132. data/spec/mongoid/association/referenced/has_many_models.rb +21 -0
  133. data/spec/mongoid/association/referenced/has_one_models.rb +21 -0
  134. data/spec/mongoid/association/referenced/has_one_spec.rb +1 -1
  135. data/spec/mongoid/atomic/modifiers_spec.rb +47 -0
  136. data/spec/mongoid/atomic/paths_spec.rb +41 -0
  137. data/spec/mongoid/atomic_spec.rb +23 -0
  138. data/spec/mongoid/attributes/nested_spec.rb +1 -1
  139. data/spec/mongoid/clients/factory_spec.rb +37 -0
  140. data/spec/mongoid/clients/sessions_spec.rb +1 -6
  141. data/spec/mongoid/config_spec.rb +28 -0
  142. data/spec/mongoid/contextual/mongo_spec.rb +70 -16
  143. data/spec/mongoid/copyable_spec.rb +197 -18
  144. data/spec/mongoid/copyable_spec_models.rb +28 -0
  145. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +36 -0
  146. data/spec/mongoid/criteria/queryable/selectable_spec.rb +84 -82
  147. data/spec/mongoid/criteria_spec.rb +204 -39
  148. data/spec/mongoid/document_spec.rb +89 -15
  149. data/spec/mongoid/equality_spec.rb +0 -1
  150. data/spec/mongoid/errors/delete_restriction_spec.rb +1 -1
  151. data/spec/mongoid/extensions/stringified_symbol_spec.rb +85 -0
  152. data/spec/mongoid/factory_spec.rb +261 -28
  153. data/spec/mongoid/fields_spec.rb +48 -2
  154. data/spec/mongoid/findable_spec.rb +32 -0
  155. data/spec/mongoid/indexable_spec.rb +28 -2
  156. data/spec/mongoid/inspectable_spec.rb +29 -2
  157. data/spec/mongoid/interceptable_spec.rb +2 -2
  158. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +259 -0
  159. data/spec/mongoid/matcher/extract_attribute_spec.rb +47 -0
  160. data/spec/mongoid/persistable/creatable_spec.rb +108 -25
  161. data/spec/mongoid/persistable/deletable_spec.rb +86 -0
  162. data/spec/mongoid/persistable/savable_spec.rb +174 -16
  163. data/spec/mongoid/query_cache_middleware_spec.rb +16 -3
  164. data/spec/mongoid/query_cache_spec.rb +442 -41
  165. data/spec/mongoid/reloadable_spec.rb +72 -0
  166. data/spec/mongoid/serializable_spec.rb +21 -3
  167. data/spec/mongoid/traversable_spec.rb +1100 -0
  168. data/spec/shared/LICENSE +20 -0
  169. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  170. data/spec/shared/lib/mrss/cluster_config.rb +211 -0
  171. data/spec/shared/lib/mrss/constraints.rb +330 -0
  172. data/spec/shared/lib/mrss/docker_runner.rb +262 -0
  173. data/spec/shared/lib/mrss/lite_constraints.rb +175 -0
  174. data/spec/shared/lib/mrss/server_version_registry.rb +69 -0
  175. data/spec/shared/lib/mrss/spec_organizer.rb +149 -0
  176. data/spec/shared/share/Dockerfile.erb +229 -0
  177. data/spec/shared/shlib/distro.sh +73 -0
  178. data/spec/shared/shlib/server.sh +270 -0
  179. data/spec/shared/shlib/set_env.sh +128 -0
  180. data/spec/spec_helper.rb +4 -2
  181. data/spec/support/constraints.rb +20 -222
  182. data/spec/support/helpers.rb +1 -1
  183. data/spec/{app → support}/models/account.rb +0 -0
  184. data/spec/{app → support}/models/acolyte.rb +0 -0
  185. data/spec/{app → support}/models/actor.rb +1 -1
  186. data/spec/{app → support}/models/actress.rb +0 -0
  187. data/spec/{app → support}/models/address.rb +0 -0
  188. data/spec/{app → support}/models/address_component.rb +0 -0
  189. data/spec/{app → support}/models/address_number.rb +0 -0
  190. data/spec/{app → support}/models/agency.rb +0 -0
  191. data/spec/{app → support}/models/agent.rb +0 -0
  192. data/spec/{app → support}/models/album.rb +0 -0
  193. data/spec/{app → support}/models/alert.rb +0 -0
  194. data/spec/{app → support}/models/animal.rb +0 -0
  195. data/spec/{app → support}/models/answer.rb +0 -0
  196. data/spec/{app → support}/models/appointment.rb +0 -0
  197. data/spec/support/models/armrest.rb +10 -0
  198. data/spec/{app → support}/models/array_field.rb +0 -0
  199. data/spec/{app → support}/models/article.rb +0 -0
  200. data/spec/{app → support}/models/artist.rb +0 -0
  201. data/spec/{app → support}/models/artwork.rb +0 -0
  202. data/spec/{app → support}/models/audio.rb +0 -0
  203. data/spec/{app → support}/models/augmentation.rb +0 -0
  204. data/spec/{app → support}/models/author.rb +0 -0
  205. data/spec/{app → support}/models/baby.rb +0 -0
  206. data/spec/{app → support}/models/band.rb +0 -0
  207. data/spec/{app → support}/models/bar.rb +0 -0
  208. data/spec/{app → support}/models/basic.rb +0 -0
  209. data/spec/{app → support}/models/bed.rb +0 -0
  210. data/spec/{app → support}/models/big_palette.rb +0 -0
  211. data/spec/{app → support}/models/birthday.rb +0 -0
  212. data/spec/{app → support}/models/bomb.rb +0 -0
  213. data/spec/{app → support}/models/book.rb +0 -0
  214. data/spec/{app → support}/models/breed.rb +0 -0
  215. data/spec/{app → support}/models/browser.rb +1 -1
  216. data/spec/{app → support}/models/building.rb +0 -0
  217. data/spec/{app → support}/models/building_address.rb +0 -0
  218. data/spec/{app → support}/models/bus.rb +0 -0
  219. data/spec/{app → support}/models/business.rb +0 -0
  220. data/spec/{app → support}/models/callback_test.rb +0 -0
  221. data/spec/{app → support}/models/canvas.rb +1 -1
  222. data/spec/{app → support}/models/car.rb +0 -0
  223. data/spec/{app → support}/models/cat.rb +0 -0
  224. data/spec/{app → support}/models/category.rb +0 -0
  225. data/spec/{app → support}/models/child.rb +0 -0
  226. data/spec/{app → support}/models/child_doc.rb +0 -0
  227. data/spec/{app → support}/models/church.rb +0 -0
  228. data/spec/{app → support}/models/circle.rb +0 -0
  229. data/spec/{app → support}/models/circuit.rb +0 -0
  230. data/spec/{app → support}/models/circus.rb +0 -0
  231. data/spec/{app → support}/models/code.rb +0 -0
  232. data/spec/{app → support}/models/coding.rb +1 -1
  233. data/spec/{app → support}/models/coding/pull_request.rb +0 -0
  234. data/spec/{app → support}/models/comment.rb +0 -0
  235. data/spec/{app → support}/models/company.rb +0 -0
  236. data/spec/{app → support}/models/consumption_period.rb +0 -0
  237. data/spec/{app → support}/models/contextable_item.rb +0 -0
  238. data/spec/{app → support}/models/contractor.rb +0 -0
  239. data/spec/{app → support}/models/cookie.rb +0 -0
  240. data/spec/{app → support}/models/country_code.rb +0 -0
  241. data/spec/{app → support}/models/courier_job.rb +0 -0
  242. data/spec/support/models/crate.rb +13 -0
  243. data/spec/support/models/customer.rb +11 -0
  244. data/spec/support/models/customer_address.rb +12 -0
  245. data/spec/support/models/deed.rb +8 -0
  246. data/spec/{app → support}/models/definition.rb +0 -0
  247. data/spec/{app → support}/models/delegating_patient.rb +0 -0
  248. data/spec/{app → support}/models/description.rb +0 -0
  249. data/spec/{app → support}/models/dictionary.rb +6 -0
  250. data/spec/{app → support}/models/division.rb +0 -0
  251. data/spec/{app → support}/models/doctor.rb +0 -0
  252. data/spec/{app → support}/models/dog.rb +0 -0
  253. data/spec/{app → support}/models/dokument.rb +0 -0
  254. data/spec/{app → support}/models/draft.rb +0 -0
  255. data/spec/{app → support}/models/dragon.rb +0 -0
  256. data/spec/{app → support}/models/driver.rb +1 -1
  257. data/spec/{app → support}/models/drug.rb +0 -0
  258. data/spec/{app → support}/models/dungeon.rb +0 -0
  259. data/spec/{app → support}/models/edit.rb +0 -0
  260. data/spec/{app → support}/models/email.rb +0 -0
  261. data/spec/{app → support}/models/employer.rb +0 -0
  262. data/spec/{app → support}/models/entry.rb +0 -0
  263. data/spec/{app → support}/models/eraser.rb +0 -0
  264. data/spec/{app → support}/models/even.rb +0 -0
  265. data/spec/{app → support}/models/event.rb +0 -0
  266. data/spec/{app → support}/models/exhibition.rb +0 -0
  267. data/spec/{app → support}/models/exhibitor.rb +0 -0
  268. data/spec/{app → support}/models/explosion.rb +0 -0
  269. data/spec/{app → support}/models/eye.rb +0 -0
  270. data/spec/{app → support}/models/eye_bowl.rb +0 -0
  271. data/spec/{app → support}/models/face.rb +0 -0
  272. data/spec/{app → support}/models/favorite.rb +0 -0
  273. data/spec/{app → support}/models/filesystem.rb +0 -0
  274. data/spec/{app → support}/models/fire_hydrant.rb +0 -0
  275. data/spec/{app → support}/models/firefox.rb +0 -0
  276. data/spec/{app → support}/models/fish.rb +0 -0
  277. data/spec/{app → support}/models/folder.rb +0 -0
  278. data/spec/{app → support}/models/folder_item.rb +0 -0
  279. data/spec/{app → support}/models/fruits.rb +0 -0
  280. data/spec/{app → support}/models/game.rb +0 -0
  281. data/spec/{app → support}/models/ghost.rb +0 -0
  282. data/spec/support/models/guitar.rb +5 -0
  283. data/spec/{app → support}/models/home.rb +0 -0
  284. data/spec/{app → support}/models/house.rb +0 -0
  285. data/spec/{app → support}/models/html_writer.rb +0 -0
  286. data/spec/{app → support}/models/id_key.rb +0 -0
  287. data/spec/support/models/idnodef.rb +8 -0
  288. data/spec/{app → support}/models/image.rb +0 -0
  289. data/spec/{app → support}/models/implant.rb +0 -0
  290. data/spec/support/models/instrument.rb +9 -0
  291. data/spec/{app → support}/models/item.rb +1 -1
  292. data/spec/{app → support}/models/jar.rb +0 -0
  293. data/spec/{app → support}/models/kaleidoscope.rb +0 -0
  294. data/spec/{app → support}/models/kangaroo.rb +0 -0
  295. data/spec/{app → support}/models/label.rb +0 -0
  296. data/spec/{app → support}/models/language.rb +0 -0
  297. data/spec/{app → support}/models/lat_lng.rb +0 -0
  298. data/spec/{app → support}/models/league.rb +0 -0
  299. data/spec/{app → support}/models/learner.rb +0 -0
  300. data/spec/{app → support}/models/line_item.rb +0 -0
  301. data/spec/{app → support}/models/location.rb +0 -0
  302. data/spec/{app → support}/models/login.rb +0 -0
  303. data/spec/{app → support}/models/manufacturer.rb +0 -0
  304. data/spec/{app → support}/models/meat.rb +0 -0
  305. data/spec/{app → support}/models/membership.rb +0 -0
  306. data/spec/{app → support}/models/message.rb +0 -0
  307. data/spec/{app → support}/models/minim.rb +0 -0
  308. data/spec/{app → support}/models/mixed_drink.rb +0 -0
  309. data/spec/support/models/mop.rb +16 -0
  310. data/spec/{app → support}/models/movie.rb +0 -0
  311. data/spec/{app → support}/models/my_hash.rb +0 -0
  312. data/spec/{app → support}/models/name.rb +0 -0
  313. data/spec/{app → support}/models/name_only.rb +0 -0
  314. data/spec/{app → support}/models/node.rb +0 -0
  315. data/spec/{app → support}/models/note.rb +0 -0
  316. data/spec/{app → support}/models/odd.rb +0 -0
  317. data/spec/support/models/order.rb +11 -0
  318. data/spec/{app → support}/models/ordered_post.rb +0 -0
  319. data/spec/{app → support}/models/ordered_preference.rb +0 -0
  320. data/spec/{app → support}/models/oscar.rb +0 -0
  321. data/spec/{app → support}/models/other_owner_object.rb +0 -0
  322. data/spec/{app → support}/models/override.rb +0 -0
  323. data/spec/{app → support}/models/ownable.rb +0 -0
  324. data/spec/{app → support}/models/owner.rb +2 -0
  325. data/spec/{app → support}/models/pack.rb +0 -0
  326. data/spec/{app → support}/models/page.rb +0 -0
  327. data/spec/{app → support}/models/page_question.rb +0 -0
  328. data/spec/{app → support}/models/palette.rb +1 -1
  329. data/spec/{app → support}/models/parent.rb +0 -0
  330. data/spec/{app → support}/models/parent_doc.rb +0 -0
  331. data/spec/{app → support}/models/passport.rb +0 -0
  332. data/spec/{app → support}/models/patient.rb +0 -0
  333. data/spec/{app → support}/models/pdf_writer.rb +0 -0
  334. data/spec/{app → support}/models/pencil.rb +0 -0
  335. data/spec/{app → support}/models/person.rb +3 -1
  336. data/spec/{app → support}/models/pet.rb +0 -0
  337. data/spec/{app → support}/models/pet_owner.rb +0 -0
  338. data/spec/{app → support}/models/phone.rb +0 -0
  339. data/spec/support/models/piano.rb +5 -0
  340. data/spec/{app → support}/models/pizza.rb +0 -0
  341. data/spec/{app → support}/models/player.rb +0 -0
  342. data/spec/{app → support}/models/post.rb +0 -0
  343. data/spec/{app → support}/models/post_genre.rb +0 -0
  344. data/spec/{app → support}/models/powerup.rb +0 -0
  345. data/spec/{app → support}/models/preference.rb +0 -0
  346. data/spec/{app → support}/models/princess.rb +0 -0
  347. data/spec/{app → support}/models/product.rb +0 -0
  348. data/spec/support/models/profile.rb +18 -0
  349. data/spec/{app → support}/models/pronunciation.rb +0 -0
  350. data/spec/{app → support}/models/pub.rb +0 -0
  351. data/spec/support/models/publication.rb +5 -0
  352. data/spec/{app → support}/models/publication/encyclopedia.rb +0 -0
  353. data/spec/{app → support}/models/publication/review.rb +0 -0
  354. data/spec/{app → support}/models/purchase.rb +0 -0
  355. data/spec/{app → support}/models/question.rb +0 -0
  356. data/spec/{app → support}/models/quiz.rb +0 -0
  357. data/spec/{app → support}/models/rating.rb +0 -0
  358. data/spec/{app → support}/models/record.rb +0 -0
  359. data/spec/{app → support}/models/registry.rb +0 -0
  360. data/spec/{app → support}/models/role.rb +0 -0
  361. data/spec/{app → support}/models/root_category.rb +0 -0
  362. data/spec/{app → support}/models/sandwich.rb +0 -0
  363. data/spec/{app → support}/models/scheduler.rb +0 -0
  364. data/spec/{app/models/profile.rb → support/models/scribe.rb} +2 -2
  365. data/spec/support/models/seat.rb +25 -0
  366. data/spec/{app → support}/models/seo.rb +0 -0
  367. data/spec/{app → support}/models/series.rb +1 -0
  368. data/spec/{app → support}/models/server.rb +0 -0
  369. data/spec/{app → support}/models/service.rb +0 -0
  370. data/spec/{app → support}/models/shape.rb +2 -2
  371. data/spec/{app → support}/models/shelf.rb +0 -0
  372. data/spec/{app → support}/models/shipment_address.rb +0 -0
  373. data/spec/{app → support}/models/shipping_container.rb +0 -0
  374. data/spec/{app → support}/models/shipping_pack.rb +0 -0
  375. data/spec/{app → support}/models/shop.rb +0 -0
  376. data/spec/{app → support}/models/short_agent.rb +0 -0
  377. data/spec/{app → support}/models/short_quiz.rb +0 -0
  378. data/spec/{app → support}/models/simple.rb +0 -0
  379. data/spec/{app → support}/models/slave.rb +0 -0
  380. data/spec/{app → support}/models/song.rb +0 -0
  381. data/spec/{app → support}/models/sound.rb +0 -0
  382. data/spec/{app → support}/models/square.rb +0 -0
  383. data/spec/{app → support}/models/staff.rb +0 -0
  384. data/spec/{app → support}/models/store_as_dup_test1.rb +0 -0
  385. data/spec/{app → support}/models/store_as_dup_test2.rb +0 -0
  386. data/spec/{app → support}/models/store_as_dup_test3.rb +0 -0
  387. data/spec/{app → support}/models/store_as_dup_test4.rb +0 -0
  388. data/spec/{app → support}/models/strategy.rb +0 -0
  389. data/spec/{app → support}/models/sub_item.rb +0 -0
  390. data/spec/{app → support}/models/subscription.rb +0 -0
  391. data/spec/{app → support}/models/survey.rb +0 -0
  392. data/spec/{app → support}/models/symptom.rb +0 -0
  393. data/spec/support/models/system_role.rb +7 -0
  394. data/spec/{app → support}/models/tag.rb +0 -0
  395. data/spec/{app → support}/models/target.rb +0 -0
  396. data/spec/{app → support}/models/template.rb +0 -0
  397. data/spec/{app → support}/models/thing.rb +0 -0
  398. data/spec/{app → support}/models/title.rb +0 -0
  399. data/spec/{app → support}/models/tool.rb +2 -2
  400. data/spec/{app → support}/models/topping.rb +0 -0
  401. data/spec/support/models/toy.rb +10 -0
  402. data/spec/{app → support}/models/track.rb +0 -0
  403. data/spec/{app → support}/models/translation.rb +0 -0
  404. data/spec/{app → support}/models/tree.rb +0 -0
  405. data/spec/{app → support}/models/truck.rb +2 -0
  406. data/spec/{app → support}/models/updatable.rb +0 -0
  407. data/spec/{app → support}/models/user.rb +0 -0
  408. data/spec/{app → support}/models/user_account.rb +0 -0
  409. data/spec/{app → support}/models/validation_callback.rb +0 -0
  410. data/spec/{app → support}/models/vehicle.rb +7 -2
  411. data/spec/{app → support}/models/version.rb +0 -0
  412. data/spec/{app → support}/models/vertex.rb +0 -0
  413. data/spec/{app → support}/models/vet_visit.rb +0 -0
  414. data/spec/{app → support}/models/video.rb +0 -0
  415. data/spec/{app → support}/models/video_game.rb +0 -0
  416. data/spec/{app → support}/models/weapon.rb +0 -0
  417. data/spec/{app → support}/models/wiki_page.rb +1 -0
  418. data/spec/{app → support}/models/word.rb +0 -0
  419. data/spec/{app → support}/models/word_origin.rb +0 -0
  420. data/spec/{app → support}/models/writer.rb +2 -2
  421. data/spec/support/spec_config.rb +1 -1
  422. metadata +895 -755
  423. metadata.gz.sig +0 -0
  424. data/lib/mongoid/matchable/all.rb +0 -30
  425. data/lib/mongoid/matchable/and.rb +0 -32
  426. data/lib/mongoid/matchable/default.rb +0 -121
  427. data/lib/mongoid/matchable/elem_match.rb +0 -36
  428. data/lib/mongoid/matchable/eq.rb +0 -23
  429. data/lib/mongoid/matchable/exists.rb +0 -25
  430. data/lib/mongoid/matchable/gt.rb +0 -25
  431. data/lib/mongoid/matchable/gte.rb +0 -25
  432. data/lib/mongoid/matchable/in.rb +0 -26
  433. data/lib/mongoid/matchable/lt.rb +0 -25
  434. data/lib/mongoid/matchable/lte.rb +0 -25
  435. data/lib/mongoid/matchable/ne.rb +0 -23
  436. data/lib/mongoid/matchable/nin.rb +0 -24
  437. data/lib/mongoid/matchable/nor.rb +0 -38
  438. data/lib/mongoid/matchable/or.rb +0 -35
  439. data/lib/mongoid/matchable/regexp.rb +0 -30
  440. data/lib/mongoid/matchable/size.rb +0 -23
  441. data/spec/app/models/publication.rb +0 -5
  442. data/spec/mongoid/matchable/all_spec.rb +0 -34
  443. data/spec/mongoid/matchable/and_spec.rb +0 -190
  444. data/spec/mongoid/matchable/default_spec.rb +0 -140
  445. data/spec/mongoid/matchable/elem_match_spec.rb +0 -109
  446. data/spec/mongoid/matchable/eq_spec.rb +0 -49
  447. data/spec/mongoid/matchable/exists_spec.rb +0 -60
  448. data/spec/mongoid/matchable/gt_spec.rb +0 -89
  449. data/spec/mongoid/matchable/gte_spec.rb +0 -87
  450. data/spec/mongoid/matchable/in_spec.rb +0 -52
  451. data/spec/mongoid/matchable/lt_spec.rb +0 -88
  452. data/spec/mongoid/matchable/lte_spec.rb +0 -88
  453. data/spec/mongoid/matchable/ne_spec.rb +0 -49
  454. data/spec/mongoid/matchable/nin_spec.rb +0 -51
  455. data/spec/mongoid/matchable/nor_spec.rb +0 -210
  456. data/spec/mongoid/matchable/or_spec.rb +0 -134
  457. data/spec/mongoid/matchable/regexp_spec.rb +0 -62
  458. data/spec/mongoid/matchable/size_spec.rb +0 -28
  459. data/spec/mongoid/matchable_spec.rb +0 -856
  460. data/spec/support/child_process_helper.rb +0 -76
  461. data/spec/support/lite_constraints.rb +0 -22
@@ -40,9 +40,22 @@ describe Mongoid::QueryCache::Middleware do
40
40
  expect(code).to eq(200)
41
41
  end
42
42
 
43
- it "cleans the query cache after reponds" do
44
- middleware.call({})
45
- expect(Mongoid::QueryCache.cache_table).to be_empty
43
+ context 'with driver query cache' do
44
+ min_driver_version '2.14'
45
+
46
+ it "cleans the query cache after it responds" do
47
+ middleware.call({})
48
+ expect(Mongo::QueryCache.send(:cache_table)).to be_empty
49
+ end
50
+ end
51
+
52
+ context 'with mongoid query cache' do
53
+ max_driver_version '2.13'
54
+
55
+ it "cleans the query cache after it responds" do
56
+ middleware.call({})
57
+ expect(Mongoid::QueryCache.cache_table).to be_empty
58
+ end
46
59
  end
47
60
  end
48
61
  end
@@ -24,6 +24,210 @@ describe Mongoid::QueryCache do
24
24
  SessionRegistry.instance.verify_sessions_ended!
25
25
  end
26
26
 
27
+ describe '#cache' do
28
+ context 'with driver query cache' do
29
+ min_driver_version '2.14'
30
+
31
+ context 'when query cache is not enabled' do
32
+ before do
33
+ Mongoid::QueryCache.enabled = false
34
+ end
35
+
36
+ it 'turns on the query cache within the block' do
37
+ expect(Mongoid::QueryCache.enabled?).to be false
38
+
39
+ Mongoid::QueryCache.cache do
40
+ expect(Mongoid::QueryCache.enabled?).to be true
41
+ end
42
+
43
+ expect(Mongoid::QueryCache.enabled?).to be false
44
+ end
45
+ end
46
+
47
+ context 'when query cache is enabled' do
48
+ before do
49
+ Mongoid::QueryCache.enabled = true
50
+ end
51
+
52
+ it 'keeps the query cache enabled within the block' do
53
+ expect(Mongoid::QueryCache.enabled?).to be true
54
+
55
+ Mongoid::QueryCache.cache do
56
+ expect(Mongoid::QueryCache.enabled?).to be true
57
+ end
58
+
59
+ expect(Mongoid::QueryCache.enabled?).to be true
60
+ end
61
+ end
62
+
63
+ context 'nested inside #uncached' do
64
+ it 'turns on the query cache in the block' do
65
+ Mongoid::QueryCache.uncached do
66
+ expect(Mongoid::QueryCache.enabled?).to be false
67
+
68
+ Mongoid::QueryCache.cache do
69
+ expect(Mongoid::QueryCache.enabled?).to be true
70
+ end
71
+
72
+ expect(Mongoid::QueryCache.enabled?).to be false
73
+ end
74
+ end
75
+ end
76
+ end
77
+
78
+ context 'with mongoid query cache' do
79
+ max_driver_version '2.13'
80
+
81
+ context 'when query cache is not enabled' do
82
+ before do
83
+ Mongoid::QueryCache.enabled = false
84
+ end
85
+
86
+ it 'turns on the query cache within the block' do
87
+ expect(Mongoid::QueryCache.enabled?).to be false
88
+
89
+ Mongoid::QueryCache.cache do
90
+ expect(Mongoid::QueryCache.enabled?).to be true
91
+ end
92
+
93
+ expect(Mongoid::QueryCache.enabled?).to be false
94
+ end
95
+ end
96
+
97
+ context 'when query cache is enabled' do
98
+ before do
99
+ Mongoid::QueryCache.enabled = true
100
+ end
101
+
102
+ it 'keeps the query cache enabled within the block' do
103
+ expect(Mongoid::QueryCache.enabled?).to be true
104
+
105
+ Mongoid::QueryCache.cache do
106
+ expect(Mongoid::QueryCache.enabled?).to be true
107
+ end
108
+
109
+ expect(Mongoid::QueryCache.enabled?).to be true
110
+ end
111
+ end
112
+
113
+ context 'nested inside #uncached' do
114
+ it 'turns on the query cache in the block' do
115
+ Mongoid::QueryCache.uncached do
116
+ expect(Mongoid::QueryCache.enabled?).to be false
117
+
118
+ Mongoid::QueryCache.cache do
119
+ expect(Mongoid::QueryCache.enabled?).to be true
120
+ end
121
+
122
+ expect(Mongoid::QueryCache.enabled?).to be false
123
+ end
124
+ end
125
+ end
126
+ end
127
+ end
128
+
129
+ describe '#uncached' do
130
+ context 'with driver query cache' do
131
+ min_driver_version '2.14'
132
+
133
+ context 'when query cache is not enabled' do
134
+ before do
135
+ Mongoid::QueryCache.enabled = false
136
+ end
137
+
138
+ it 'keeps the query cache turned off within the block' do
139
+ expect(Mongoid::QueryCache.enabled?).to be false
140
+
141
+ Mongoid::QueryCache.uncached do
142
+ expect(Mongoid::QueryCache.enabled?).to be false
143
+ end
144
+
145
+ expect(Mongoid::QueryCache.enabled?).to be false
146
+ end
147
+ end
148
+
149
+ context 'when query cache is enabled' do
150
+ before do
151
+ Mongoid::QueryCache.enabled = true
152
+ end
153
+
154
+ it 'turns off the query cache within the block' do
155
+ expect(Mongoid::QueryCache.enabled?).to be true
156
+
157
+ Mongoid::QueryCache.uncached do
158
+ expect(Mongoid::QueryCache.enabled?).to be false
159
+ end
160
+
161
+ expect(Mongoid::QueryCache.enabled?).to be true
162
+ end
163
+ end
164
+
165
+ context 'nested inside #cache' do
166
+ it 'turns on the query cache in the block' do
167
+ Mongoid::QueryCache.cache do
168
+ expect(Mongoid::QueryCache.enabled?).to be true
169
+
170
+ Mongoid::QueryCache.uncached do
171
+ expect(Mongoid::QueryCache.enabled?).to be false
172
+ end
173
+
174
+ expect(Mongoid::QueryCache.enabled?).to be true
175
+ end
176
+ end
177
+ end
178
+ end
179
+
180
+ context 'with mongoid query cache' do
181
+ max_driver_version '2.13'
182
+
183
+ context 'when query cache is not enabled' do
184
+ before do
185
+ Mongoid::QueryCache.enabled = false
186
+ end
187
+
188
+ it 'keeps the query cache turned off within the block' do
189
+ expect(Mongoid::QueryCache.enabled?).to be false
190
+
191
+ Mongoid::QueryCache.uncached do
192
+ expect(Mongoid::QueryCache.enabled?).to be false
193
+ end
194
+
195
+ expect(Mongoid::QueryCache.enabled?).to be false
196
+ end
197
+ end
198
+
199
+ context 'when query cache is enabled' do
200
+ before do
201
+ Mongoid::QueryCache.enabled = true
202
+ end
203
+
204
+ it 'turns off the query cache within the block' do
205
+ expect(Mongoid::QueryCache.enabled?).to be true
206
+
207
+ Mongoid::QueryCache.uncached do
208
+ expect(Mongoid::QueryCache.enabled?).to be false
209
+ end
210
+
211
+ expect(Mongoid::QueryCache.enabled?).to be true
212
+ end
213
+ end
214
+
215
+ context 'nested inside #cache' do
216
+ it 'turns on the query cache in the block' do
217
+ Mongoid::QueryCache.cache do
218
+ expect(Mongoid::QueryCache.enabled?).to be true
219
+
220
+ Mongoid::QueryCache.uncached do
221
+ expect(Mongoid::QueryCache.enabled?).to be false
222
+ end
223
+
224
+ expect(Mongoid::QueryCache.enabled?).to be true
225
+ end
226
+ end
227
+ end
228
+ end
229
+ end
230
+
27
231
  context 'when iterating over objects sharing the same base' do
28
232
 
29
233
  let(:server) do
@@ -99,6 +303,111 @@ describe Mongoid::QueryCache do
99
303
  end
100
304
  end
101
305
 
306
+ context 'when driver query cache exists' do
307
+ min_driver_version '2.14'
308
+
309
+ before do
310
+ Band.all.to_a
311
+ Band.create!
312
+ end
313
+
314
+ it 'recognizes the driver query cache' do
315
+ expect(defined?(Mongo::QueryCache)).to_not be_nil
316
+ end
317
+
318
+ context 'when query cache enabled' do
319
+
320
+ it 'uses the driver query cache' do
321
+ expect(Mongo::QueryCache).to receive(:enabled=).and_call_original
322
+ Mongoid::QueryCache.enabled = true
323
+
324
+ expect(Mongoid::QueryCache.enabled?).to be(true)
325
+ expect(Mongo::QueryCache.enabled?).to be(true)
326
+ end
327
+ end
328
+
329
+ context 'when query cache disabled' do
330
+
331
+ it 'uses the driver query cache' do
332
+ expect(Mongo::QueryCache).to receive(:enabled=).and_call_original
333
+ Mongoid::QueryCache.enabled = false
334
+
335
+ expect(Mongoid::QueryCache.enabled?).to be(false)
336
+ expect(Mongo::QueryCache.enabled?).to be(false)
337
+ end
338
+ end
339
+
340
+ context 'when block is cached' do
341
+
342
+ before do
343
+ Mongoid::QueryCache.enabled = false
344
+ end
345
+
346
+ it 'uses the driver query cache' do
347
+ expect(Mongo::QueryCache).to receive(:cache).and_call_original
348
+ Mongoid::QueryCache.cache do
349
+ expect(Mongo::QueryCache).to receive(:enabled?).exactly(2).and_call_original
350
+ expect(Mongoid::QueryCache.enabled?).to be(true)
351
+ expect(Mongo::QueryCache.enabled?).to be(true)
352
+ end
353
+ end
354
+ end
355
+
356
+ context 'when block is uncached' do
357
+
358
+ before do
359
+ Mongoid::QueryCache.enabled = true
360
+ end
361
+
362
+ it 'uses the driver query cache' do
363
+ expect(Mongo::QueryCache).to receive(:uncached).and_call_original
364
+ Mongoid::QueryCache.uncached do
365
+ expect(Mongo::QueryCache).to receive(:enabled?).exactly(2).and_call_original
366
+ expect(Mongoid::QueryCache.enabled?).to be(false)
367
+ expect(Mongo::QueryCache.enabled?).to be(false)
368
+ end
369
+ end
370
+ end
371
+
372
+ context 'when clear_cache is used' do
373
+
374
+ before do
375
+ Band.all.to_a
376
+ end
377
+
378
+ it 'requires Mongoid to query again' do
379
+ expect_no_queries do
380
+ Band.all.to_a
381
+ end
382
+
383
+ Mongoid::QueryCache.clear_cache
384
+
385
+ expect_query(1) do
386
+ Band.all.to_a
387
+ end
388
+ end
389
+ end
390
+
391
+ context 'when query cache used and cleared' do
392
+ it 'uses the driver query cache' do
393
+ expect(Mongo::QueryCache).to receive(:set).once.and_call_original
394
+
395
+ expect_query(1) do
396
+ Band.all.to_a
397
+ Band.all.to_a
398
+ end
399
+ end
400
+ end
401
+ end
402
+
403
+ context 'when drivers query cache does not exist' do
404
+ max_driver_version '2.13'
405
+
406
+ it 'does not recognize the driver query cache' do
407
+ expect(defined?(Mongo::QueryCache)).to be_nil
408
+ end
409
+ end
410
+
102
411
  context "when querying for a single document" do
103
412
 
104
413
  [ :first, :one, :last ].each do |method|
@@ -148,24 +457,81 @@ describe Mongoid::QueryCache do
148
457
  end
149
458
 
150
459
  it 'returns all documents' do
151
- expect(Person.all.to_a.count).to eq(3)
152
- Person.first
153
- expect(Person.all.to_a.count).to eq(3)
460
+ # Mongoid adds a sort by _id to the Person.first call, which is why
461
+ # these commands issue two queries instead of one.
462
+ expect_query(2) do
463
+ expect(Person.all.to_a.count).to eq(3)
464
+ Person.first
465
+ expect(Person.all.to_a.count).to eq(3)
466
+ end
467
+ end
468
+
469
+ it 'caches the query when order is specified' do
470
+ expect_query(1) do
471
+ expect(Person.order(_id: 1).all.to_a.count).to eq(3)
472
+ Person.first
473
+ expect(Person.order(_id: 1).all.to_a.count).to eq(3)
474
+ end
154
475
  end
155
476
 
156
477
  context 'with conditions specified' do
157
478
  it 'returns all documents' do
158
- expect(Person.gt(age: 0).to_a.count).to eq(3)
159
- Person.gt(age: 0).first
160
- expect(Person.gt(age: 0).to_a.count).to eq(3)
479
+ # Mongoid adds a sort by _id to the Person.first call, which is why
480
+ # these commands issue two queries instead of one.
481
+ expect_query(2) do
482
+ expect(Person.gt(age: 0).to_a.count).to eq(3)
483
+ Person.gt(age: 0).first
484
+ expect(Person.gt(age: 0).to_a.count).to eq(3)
485
+ end
486
+ end
487
+
488
+ it 'caches the query when order is specified' do
489
+ expect_query(1) do
490
+ expect(Person.order(_id: 1).gt(age: 0).to_a.count).to eq(3)
491
+ Person.gt(age: 0).first
492
+ expect(Person.order(_id: 1).gt(age: 0).to_a.count).to eq(3)
493
+ end
161
494
  end
162
495
  end
163
496
 
164
497
  context 'with order specified' do
165
498
  it 'returns all documents' do
166
- expect(Person.order_by(name: 1).to_a.count).to eq(3)
167
- Person.order_by(name: 1).first
168
- expect(Person.order_by(name: 1).to_a.count).to eq(3)
499
+ expect_query(1) do
500
+ expect(Person.order_by(name: 1).to_a.count).to eq(3)
501
+ Person.order_by(name: 1).first
502
+ expect(Person.order_by(name: 1).to_a.count).to eq(3)
503
+ end
504
+ end
505
+ end
506
+ end
507
+
508
+ context 'when using a block API' do
509
+ before do
510
+ Band.destroy_all
511
+ 5.times { Band.create }
512
+ end
513
+
514
+ context '#any? with no block' do
515
+ it 'doesn\'t leak sessions' do
516
+ Band.all.any?
517
+ end
518
+ end
519
+
520
+ context '#all? with no block' do
521
+ it 'doesn\'t leak sessions' do
522
+ Band.all.all?
523
+ end
524
+ end
525
+
526
+ context '#none? with no block' do
527
+ it 'doesn\'t leak sessions' do
528
+ Band.all.none?
529
+ end
530
+ end
531
+
532
+ context '#one? with no block' do
533
+ it 'doesn\'t leak sessions' do
534
+ Band.all.one?
169
535
  end
170
536
  end
171
537
  end
@@ -259,7 +625,6 @@ describe Mongoid::QueryCache do
259
625
  end
260
626
 
261
627
  context "when the first query has a limit" do
262
-
263
628
  let(:game) do
264
629
  Game.create!(name: "2048")
265
630
  end
@@ -277,11 +642,28 @@ describe Mongoid::QueryCache do
277
642
  # which causes this test to fail.
278
643
  min_server_version '3.2'
279
644
 
280
- it "queries again" do
281
- expect_query(1) do
282
- result = game.ratings.where(:value.gt => 5).limit(2).asc(:id).to_a
283
- expect(result.length).to eq(2)
284
- expect(result.map { |r| r['value'] }).to eq([6, 7])
645
+ context 'with driver query cache' do
646
+ min_driver_version '2.14'
647
+
648
+ # The driver query cache re-uses results with a larger limit
649
+ it 'does not query again' do
650
+ expect_no_queries do
651
+ result = game.ratings.where(:value.gt => 5).limit(2).asc(:id).to_a
652
+ expect(result.length).to eq(2)
653
+ expect(result.map { |r| r['value'] }).to eq([6, 7])
654
+ end
655
+ end
656
+ end
657
+
658
+ context 'with mongoid query cache' do
659
+ max_driver_version '2.13'
660
+
661
+ it 'queries again' do
662
+ expect_query(1) do
663
+ result = game.ratings.where(:value.gt => 5).limit(2).asc(:id).to_a
664
+ expect(result.length).to eq(2)
665
+ expect(result.map { |r| r['value'] }).to eq([6, 7])
666
+ end
285
667
  end
286
668
  end
287
669
  end
@@ -343,6 +725,7 @@ describe Mongoid::QueryCache do
343
725
  Band.destroy_all
344
726
 
345
727
  5.times { |i| Band.create!(name: "Band #{i}") }
728
+ Band.limit(2).skip(1).all.to_a
346
729
  end
347
730
 
348
731
  it "queries again" do
@@ -385,24 +768,24 @@ describe Mongoid::QueryCache do
385
768
  end
386
769
  end
387
770
 
388
- context 'when querying colleciton larger than the batch size' do
389
- before do
390
- Band.destroy_all
391
- 101.times { |i| Band.create!(_id: i) }
392
- end
771
+ context 'when querying colleciton larger than the batch size' do
772
+ before do
773
+ Band.destroy_all
774
+ 101.times { |i| Band.create!(_id: i) }
775
+ end
393
776
 
394
- it 'does not raise an exception when querying multiple times' do
395
- expect do
396
- results1 = Band.all.to_a
397
- expect(results1.length).to eq(101)
398
- expect(results1.map { |band| band["_id"] }).to eq([*0..100])
777
+ it 'does not raise an exception when querying multiple times' do
778
+ expect do
779
+ results1 = Band.all.to_a
780
+ expect(results1.length).to eq(101)
781
+ expect(results1.map { |band| band["_id"] }).to eq([*0..100])
399
782
 
400
- results2 = Band.all.to_a
401
- expect(results2.length).to eq(101)
402
- expect(results2.map { |band| band["_id"] }).to eq([*0..100])
403
- end.not_to raise_error
404
- end
405
- end
783
+ results2 = Band.all.to_a
784
+ expect(results2.length).to eq(101)
785
+ expect(results2.map { |band| band["_id"] }).to eq([*0..100])
786
+ end.not_to raise_error
787
+ end
788
+ end
406
789
 
407
790
  context "when query caching is enabled and the batch_size is set" do
408
791
 
@@ -538,8 +921,10 @@ describe Mongoid::QueryCache do
538
921
  end
539
922
  end
540
923
 
541
- it "returns the same count of objects when using #pluck" do
542
- expect(Band.pluck(:name).length).to eq(99)
924
+ it "returns the same count of objects when using #pluck but doesn't cache" do
925
+ expect_query(1) do
926
+ expect(Band.pluck(:name).length).to eq(99)
927
+ end
543
928
  end
544
929
  end
545
930
  end
@@ -557,20 +942,36 @@ describe Mongoid::QueryCache do
557
942
  Mongoid::QueryCache.enabled = true
558
943
  10.times { Band.create! }
559
944
 
560
- Band.batch_size(4).all.to_a
945
+ Band.batch_size(4).to_a
561
946
  end
562
947
 
563
- it 'does not cache the result' do
564
- expect(Band.all.map(&:id).size).to eq(10)
565
- end
948
+ context 'with driver query cache' do
949
+ min_driver_version '2.14'
566
950
 
567
- context 'when a batch size smaller than the result set is specified' do
568
- let(:batch_size) do
569
- 4
951
+ # The driver query cache caches multi-batch cursors
952
+ it 'does cache the result' do
953
+ expect_no_queries do
954
+ expect(Band.all.map(&:id).size).to eq(10)
955
+ end
570
956
  end
957
+ end
958
+
959
+ context 'with mongoid query cache' do
960
+ max_driver_version '2.13'
571
961
 
572
962
  it 'does not cache the result' do
573
- expect(Band.batch_size(batch_size).all.map(&:id).size).to eq(10)
963
+ expect_query(1) do
964
+ expect(Band.all.map(&:id).size).to eq(10)
965
+ end
966
+ end
967
+ end
968
+ end
969
+
970
+ context 'when storing in system collection' do
971
+ it 'does not cache the query' do
972
+ expect_query(2) do
973
+ SystemRole.all.to_a
974
+ SystemRole.all.to_a
574
975
  end
575
976
  end
576
977
  end