mongoid 7.1.0.rc0 → 7.2.0.rc1

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 (508) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/CHANGELOG.md +6 -6
  5. data/LICENSE +1 -1
  6. data/README.md +14 -7
  7. data/Rakefile +21 -0
  8. data/lib/config/locales/en.yml +42 -6
  9. data/lib/mongoid.rb +26 -2
  10. data/lib/mongoid/association/accessors.rb +37 -2
  11. data/lib/mongoid/association/depending.rb +1 -6
  12. data/lib/mongoid/association/embedded/embeds_many.rb +2 -1
  13. data/lib/mongoid/association/embedded/embeds_one.rb +2 -1
  14. data/lib/mongoid/association/many.rb +5 -4
  15. data/lib/mongoid/association/proxy.rb +6 -4
  16. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -1
  17. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  18. data/lib/mongoid/association/referenced/belongs_to/eager.rb +38 -2
  19. data/lib/mongoid/association/referenced/eager.rb +29 -9
  20. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +1 -1
  21. data/lib/mongoid/association/referenced/has_many/enumerable.rb +30 -15
  22. data/lib/mongoid/association/referenced/has_many/proxy.rb +11 -3
  23. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  24. data/lib/mongoid/atomic.rb +13 -3
  25. data/lib/mongoid/atomic/modifiers.rb +1 -1
  26. data/lib/mongoid/attributes.rb +28 -20
  27. data/lib/mongoid/attributes/dynamic.rb +1 -1
  28. data/lib/mongoid/clients/factory.rb +19 -2
  29. data/lib/mongoid/clients/options.rb +8 -8
  30. data/lib/mongoid/clients/sessions.rb +20 -4
  31. data/lib/mongoid/clients/storage_options.rb +5 -5
  32. data/lib/mongoid/composable.rb +1 -0
  33. data/lib/mongoid/config.rb +45 -12
  34. data/lib/mongoid/config/options.rb +5 -2
  35. data/lib/mongoid/contextual.rb +5 -4
  36. data/lib/mongoid/contextual/geo_near.rb +3 -2
  37. data/lib/mongoid/contextual/map_reduce.rb +3 -2
  38. data/lib/mongoid/contextual/mongo.rb +25 -5
  39. data/lib/mongoid/copyable.rb +2 -2
  40. data/lib/mongoid/criteria.rb +80 -11
  41. data/lib/mongoid/criteria/modifiable.rb +2 -1
  42. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
  43. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +6 -6
  44. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +12 -0
  45. data/lib/mongoid/criteria/queryable/key.rb +1 -1
  46. data/lib/mongoid/criteria/queryable/mergeable.rb +75 -8
  47. data/lib/mongoid/criteria/queryable/pipeline.rb +3 -2
  48. data/lib/mongoid/criteria/queryable/selectable.rb +141 -19
  49. data/lib/mongoid/criteria/queryable/selector.rb +3 -3
  50. data/lib/mongoid/criteria/queryable/storable.rb +106 -101
  51. data/lib/mongoid/document.rb +15 -3
  52. data/lib/mongoid/errors.rb +7 -0
  53. data/lib/mongoid/errors/eager_load.rb +2 -0
  54. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +25 -0
  55. data/lib/mongoid/errors/invalid_elem_match_operator.rb +33 -0
  56. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +26 -0
  57. data/lib/mongoid/errors/invalid_expression_operator.rb +28 -0
  58. data/lib/mongoid/errors/invalid_field_operator.rb +33 -0
  59. data/lib/mongoid/errors/invalid_query.rb +41 -0
  60. data/lib/mongoid/errors/no_client_config.rb +2 -2
  61. data/lib/mongoid/errors/no_default_client.rb +1 -1
  62. data/lib/mongoid/extensions/hash.rb +4 -2
  63. data/lib/mongoid/extensions/regexp.rb +1 -1
  64. data/lib/mongoid/factory.rb +27 -10
  65. data/lib/mongoid/fields.rb +2 -1
  66. data/lib/mongoid/fields/standard.rb +2 -1
  67. data/lib/mongoid/fields/validators/macro.rb +26 -10
  68. data/lib/mongoid/findable.rb +55 -18
  69. data/lib/mongoid/indexable.rb +2 -2
  70. data/lib/mongoid/interceptable.rb +5 -1
  71. data/lib/mongoid/matchable.rb +1 -149
  72. data/lib/mongoid/matcher.rb +127 -0
  73. data/lib/mongoid/matcher/all.rb +22 -0
  74. data/lib/mongoid/matcher/and.rb +21 -0
  75. data/lib/mongoid/matcher/elem_match.rb +35 -0
  76. data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
  77. data/lib/mongoid/matcher/eq.rb +11 -0
  78. data/lib/mongoid/matcher/eq_impl.rb +32 -0
  79. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +21 -0
  80. data/lib/mongoid/matcher/exists.rb +15 -0
  81. data/lib/mongoid/matcher/expression.rb +40 -0
  82. data/lib/mongoid/matcher/expression_operator.rb +19 -0
  83. data/lib/mongoid/matcher/field_expression.rb +63 -0
  84. data/lib/mongoid/matcher/field_operator.rb +52 -0
  85. data/lib/mongoid/matcher/gt.rb +17 -0
  86. data/lib/mongoid/matcher/gte.rb +17 -0
  87. data/lib/mongoid/matcher/in.rb +25 -0
  88. data/lib/mongoid/matcher/lt.rb +17 -0
  89. data/lib/mongoid/matcher/lte.rb +17 -0
  90. data/lib/mongoid/matcher/ne.rb +16 -0
  91. data/lib/mongoid/matcher/nin.rb +11 -0
  92. data/lib/mongoid/matcher/nor.rb +25 -0
  93. data/lib/mongoid/matcher/not.rb +29 -0
  94. data/lib/mongoid/matcher/or.rb +21 -0
  95. data/lib/mongoid/matcher/regex.rb +41 -0
  96. data/lib/mongoid/matcher/size.rb +26 -0
  97. data/lib/mongoid/persistable/deletable.rb +1 -1
  98. data/lib/mongoid/persistable/pushable.rb +11 -2
  99. data/lib/mongoid/persistence_context.rb +6 -6
  100. data/lib/mongoid/query_cache.rb +83 -38
  101. data/lib/mongoid/railties/database.rake +7 -0
  102. data/lib/mongoid/reloadable.rb +2 -2
  103. data/lib/mongoid/serializable.rb +11 -3
  104. data/lib/mongoid/shardable.rb +56 -4
  105. data/lib/mongoid/tasks/database.rake +10 -5
  106. data/lib/mongoid/tasks/database.rb +83 -0
  107. data/lib/mongoid/timestamps/timeless.rb +3 -1
  108. data/lib/mongoid/traversable.rb +111 -4
  109. data/lib/mongoid/validatable/uniqueness.rb +1 -1
  110. data/lib/mongoid/version.rb +1 -1
  111. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +32 -23
  112. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
  113. data/spec/integration/app_spec.rb +254 -0
  114. data/spec/integration/associations/embedded_spec.rb +148 -0
  115. data/spec/integration/associations/has_many_spec.rb +69 -0
  116. data/spec/integration/associations/has_one_spec.rb +69 -0
  117. data/spec/integration/associations/nested_attributes_assignment_spec.rb +116 -0
  118. data/spec/integration/atomic/modifiers_spec.rb +117 -0
  119. data/spec/integration/bson_regexp_raw_spec.rb +20 -0
  120. data/spec/integration/criteria/date_field_spec.rb +41 -0
  121. data/spec/integration/criteria/logical_spec.rb +13 -0
  122. data/spec/integration/discriminator_key_spec.rb +354 -0
  123. data/spec/integration/discriminator_value_spec.rb +207 -0
  124. data/spec/integration/document_spec.rb +22 -0
  125. data/spec/integration/{matchable_spec.rb → matcher_examples_spec.rb} +120 -41
  126. data/spec/integration/matcher_operator_data/all.yml +140 -0
  127. data/spec/integration/matcher_operator_data/and.yml +93 -0
  128. data/spec/integration/matcher_operator_data/elem_match.yml +363 -0
  129. data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
  130. data/spec/integration/matcher_operator_data/eq.yml +191 -0
  131. data/spec/integration/matcher_operator_data/exists.yml +213 -0
  132. data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
  133. data/spec/integration/matcher_operator_data/gt.yml +132 -0
  134. data/spec/integration/matcher_operator_data/gte.yml +132 -0
  135. data/spec/integration/matcher_operator_data/implicit.yml +331 -0
  136. data/spec/integration/matcher_operator_data/implicit_traversal.yml +16 -0
  137. data/spec/integration/matcher_operator_data/in.yml +194 -0
  138. data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
  139. data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
  140. data/spec/integration/matcher_operator_data/lt.yml +132 -0
  141. data/spec/integration/matcher_operator_data/lte.yml +132 -0
  142. data/spec/integration/matcher_operator_data/multiple.yml +29 -0
  143. data/spec/integration/matcher_operator_data/ne.yml +150 -0
  144. data/spec/integration/matcher_operator_data/nin.yml +114 -0
  145. data/spec/integration/matcher_operator_data/nor.yml +126 -0
  146. data/spec/integration/matcher_operator_data/not.yml +196 -0
  147. data/spec/integration/matcher_operator_data/or.yml +137 -0
  148. data/spec/integration/matcher_operator_data/regex.yml +174 -0
  149. data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
  150. data/spec/integration/matcher_operator_data/size.yml +174 -0
  151. data/spec/integration/matcher_operator_spec.rb +100 -0
  152. data/spec/integration/matcher_spec.rb +189 -0
  153. data/spec/integration/server_query_spec.rb +142 -0
  154. data/spec/integration/shardable_spec.rb +149 -0
  155. data/spec/lite_spec_helper.rb +15 -4
  156. data/spec/mongoid/association/accessors_spec.rb +238 -63
  157. data/spec/mongoid/association/depending_spec.rb +78 -26
  158. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +33 -0
  159. data/spec/mongoid/association/embedded/embeds_many_models.rb +20 -0
  160. data/spec/mongoid/association/embedded/embeds_many_spec.rb +10 -0
  161. data/spec/mongoid/association/embedded/embeds_one_models.rb +1 -0
  162. data/spec/mongoid/association/embedded/embeds_one_spec.rb +0 -2
  163. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +193 -10
  164. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +140 -1
  165. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +146 -68
  166. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +462 -187
  167. data/spec/mongoid/association/referenced/has_many_models.rb +9 -0
  168. data/spec/mongoid/association/referenced/has_one_models.rb +9 -0
  169. data/spec/mongoid/atomic/modifiers_spec.rb +47 -0
  170. data/spec/mongoid/atomic_spec.rb +23 -0
  171. data/spec/mongoid/attributes/nested_spec.rb +1 -1
  172. data/spec/mongoid/attributes_spec.rb +19 -7
  173. data/spec/mongoid/changeable_spec.rb +23 -0
  174. data/spec/mongoid/clients/factory_spec.rb +45 -8
  175. data/spec/mongoid/clients/options_spec.rb +11 -11
  176. data/spec/mongoid/clients/sessions_spec.rb +9 -10
  177. data/spec/mongoid/clients/transactions_spec.rb +20 -8
  178. data/spec/mongoid/clients_spec.rb +2 -2
  179. data/spec/mongoid/config_spec.rb +28 -0
  180. data/spec/mongoid/contextual/atomic_spec.rb +22 -11
  181. data/spec/mongoid/contextual/geo_near_spec.rb +11 -2
  182. data/spec/mongoid/contextual/map_reduce_spec.rb +20 -5
  183. data/spec/mongoid/contextual/mongo_spec.rb +146 -69
  184. data/spec/mongoid/copyable_spec.rb +153 -1
  185. data/spec/mongoid/copyable_spec_models.rb +14 -0
  186. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +1 -1
  187. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +7 -7
  188. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +1 -1
  189. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +19 -7
  190. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +28 -1
  191. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +45 -12
  192. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +1051 -392
  193. data/spec/mongoid/criteria/queryable/selectable_spec.rb +136 -82
  194. data/spec/mongoid/criteria/queryable/storable_spec.rb +80 -2
  195. data/spec/mongoid/criteria_spec.rb +240 -41
  196. data/spec/mongoid/document_fields_spec.rb +29 -0
  197. data/spec/mongoid/document_persistence_context_spec.rb +33 -0
  198. data/spec/mongoid/document_spec.rb +89 -15
  199. data/spec/mongoid/errors/delete_restriction_spec.rb +1 -1
  200. data/spec/mongoid/errors/no_client_config_spec.rb +2 -2
  201. data/spec/mongoid/errors/no_client_database_spec.rb +3 -3
  202. data/spec/mongoid/errors/no_client_hosts_spec.rb +3 -3
  203. data/spec/mongoid/factory_spec.rb +261 -28
  204. data/spec/mongoid/fields_spec.rb +72 -3
  205. data/spec/mongoid/findable_spec.rb +32 -0
  206. data/spec/mongoid/indexable_spec.rb +34 -6
  207. data/spec/mongoid/inspectable_spec.rb +29 -2
  208. data/spec/mongoid/interceptable_spec.rb +64 -2
  209. data/spec/mongoid/interceptable_spec_models.rb +76 -0
  210. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +259 -0
  211. data/spec/mongoid/matcher/extract_attribute_spec.rb +47 -0
  212. data/spec/mongoid/persistable/creatable_spec.rb +108 -25
  213. data/spec/mongoid/persistable/deletable_spec.rb +86 -0
  214. data/spec/mongoid/persistable/pushable_spec.rb +55 -1
  215. data/spec/mongoid/persistable/savable_spec.rb +174 -16
  216. data/spec/mongoid/query_cache_middleware_spec.rb +16 -3
  217. data/spec/mongoid/query_cache_spec.rb +498 -29
  218. data/spec/mongoid/relations/proxy_spec.rb +1 -1
  219. data/spec/mongoid/reloadable_spec.rb +72 -0
  220. data/spec/mongoid/scopable_spec.rb +2 -1
  221. data/spec/mongoid/serializable_spec.rb +149 -20
  222. data/spec/mongoid/shardable_models.rb +61 -0
  223. data/spec/mongoid/shardable_spec.rb +69 -16
  224. data/spec/mongoid/tasks/database_rake_spec.rb +13 -13
  225. data/spec/mongoid/tasks/database_spec.rb +1 -1
  226. data/spec/mongoid/traversable_spec.rb +1100 -0
  227. data/spec/spec_helper.rb +4 -33
  228. data/spec/support/child_process_helper.rb +79 -0
  229. data/spec/support/cluster_config.rb +3 -3
  230. data/spec/support/constraints.rb +50 -10
  231. data/spec/support/expectations.rb +3 -1
  232. data/spec/support/helpers.rb +11 -0
  233. data/spec/support/lite_constraints.rb +22 -0
  234. data/spec/{app → support}/models/account.rb +0 -0
  235. data/spec/{app → support}/models/acolyte.rb +0 -0
  236. data/spec/{app → support}/models/actor.rb +1 -1
  237. data/spec/{app → support}/models/actress.rb +0 -0
  238. data/spec/{app → support}/models/address.rb +0 -0
  239. data/spec/{app → support}/models/address_component.rb +0 -0
  240. data/spec/{app → support}/models/address_number.rb +0 -0
  241. data/spec/{app → support}/models/agency.rb +0 -0
  242. data/spec/{app → support}/models/agent.rb +0 -0
  243. data/spec/{app → support}/models/album.rb +0 -0
  244. data/spec/{app → support}/models/alert.rb +0 -0
  245. data/spec/{app → support}/models/animal.rb +0 -0
  246. data/spec/{app → support}/models/answer.rb +0 -0
  247. data/spec/{app → support}/models/appointment.rb +0 -0
  248. data/spec/support/models/armrest.rb +10 -0
  249. data/spec/{app → support}/models/array_field.rb +0 -0
  250. data/spec/{app → support}/models/article.rb +0 -0
  251. data/spec/{app → support}/models/artist.rb +0 -0
  252. data/spec/{app → support}/models/artwork.rb +0 -0
  253. data/spec/{app → support}/models/audio.rb +0 -0
  254. data/spec/{app → support}/models/augmentation.rb +0 -0
  255. data/spec/{app → support}/models/author.rb +0 -0
  256. data/spec/{app → support}/models/baby.rb +0 -0
  257. data/spec/{app → support}/models/band.rb +0 -0
  258. data/spec/{app → support}/models/bar.rb +0 -0
  259. data/spec/{app → support}/models/basic.rb +0 -0
  260. data/spec/{app → support}/models/bed.rb +0 -0
  261. data/spec/{app → support}/models/big_palette.rb +0 -0
  262. data/spec/{app → support}/models/birthday.rb +0 -0
  263. data/spec/{app → support}/models/bomb.rb +0 -0
  264. data/spec/{app → support}/models/book.rb +0 -0
  265. data/spec/{app → support}/models/breed.rb +0 -0
  266. data/spec/{app → support}/models/browser.rb +1 -1
  267. data/spec/{app → support}/models/building.rb +0 -0
  268. data/spec/{app → support}/models/building_address.rb +0 -0
  269. data/spec/{app → support}/models/bus.rb +0 -0
  270. data/spec/{app → support}/models/business.rb +0 -0
  271. data/spec/{app → support}/models/callback_test.rb +0 -0
  272. data/spec/{app → support}/models/canvas.rb +1 -1
  273. data/spec/{app → support}/models/car.rb +0 -0
  274. data/spec/{app → support}/models/cat.rb +0 -0
  275. data/spec/{app → support}/models/category.rb +0 -0
  276. data/spec/{app → support}/models/child.rb +0 -0
  277. data/spec/{app → support}/models/child_doc.rb +0 -0
  278. data/spec/{app → support}/models/church.rb +0 -0
  279. data/spec/{app → support}/models/circle.rb +0 -0
  280. data/spec/{app → support}/models/circuit.rb +0 -0
  281. data/spec/{app → support}/models/circus.rb +0 -0
  282. data/spec/{app → support}/models/code.rb +0 -0
  283. data/spec/support/models/coding.rb +4 -0
  284. data/spec/support/models/coding/pull_request.rb +12 -0
  285. data/spec/{app → support}/models/comment.rb +0 -0
  286. data/spec/{app → support}/models/company.rb +0 -0
  287. data/spec/{app → support}/models/consumption_period.rb +0 -0
  288. data/spec/{app → support}/models/contextable_item.rb +0 -0
  289. data/spec/{app → support}/models/contractor.rb +0 -0
  290. data/spec/{app → support}/models/cookie.rb +0 -0
  291. data/spec/{app → support}/models/country_code.rb +0 -0
  292. data/spec/{app → support}/models/courier_job.rb +0 -0
  293. data/spec/support/models/crate.rb +13 -0
  294. data/spec/support/models/deed.rb +8 -0
  295. data/spec/{app → support}/models/definition.rb +0 -0
  296. data/spec/support/models/delegating_patient.rb +16 -0
  297. data/spec/{app → support}/models/description.rb +0 -0
  298. data/spec/{app → support}/models/dictionary.rb +0 -0
  299. data/spec/{app → support}/models/division.rb +0 -0
  300. data/spec/{app → support}/models/doctor.rb +0 -0
  301. data/spec/{app → support}/models/dog.rb +0 -0
  302. data/spec/{app → support}/models/dokument.rb +0 -0
  303. data/spec/{app → support}/models/draft.rb +0 -0
  304. data/spec/{app → support}/models/dragon.rb +0 -0
  305. data/spec/{app → support}/models/driver.rb +1 -1
  306. data/spec/{app → support}/models/drug.rb +0 -0
  307. data/spec/{app → support}/models/dungeon.rb +0 -0
  308. data/spec/{app → support}/models/edit.rb +0 -0
  309. data/spec/{app → support}/models/email.rb +0 -0
  310. data/spec/{app → support}/models/employer.rb +0 -0
  311. data/spec/{app → support}/models/entry.rb +0 -0
  312. data/spec/{app → support}/models/eraser.rb +0 -0
  313. data/spec/{app → support}/models/even.rb +0 -0
  314. data/spec/{app → support}/models/event.rb +0 -0
  315. data/spec/{app → support}/models/exhibition.rb +0 -0
  316. data/spec/{app → support}/models/exhibitor.rb +0 -0
  317. data/spec/{app → support}/models/explosion.rb +0 -0
  318. data/spec/{app → support}/models/eye.rb +0 -0
  319. data/spec/{app → support}/models/eye_bowl.rb +0 -0
  320. data/spec/{app → support}/models/face.rb +0 -0
  321. data/spec/{app → support}/models/favorite.rb +0 -0
  322. data/spec/{app → support}/models/filesystem.rb +0 -0
  323. data/spec/{app → support}/models/fire_hydrant.rb +0 -0
  324. data/spec/{app → support}/models/firefox.rb +0 -0
  325. data/spec/{app → support}/models/fish.rb +0 -0
  326. data/spec/{app → support}/models/folder.rb +0 -0
  327. data/spec/{app → support}/models/folder_item.rb +0 -0
  328. data/spec/{app → support}/models/fruits.rb +0 -0
  329. data/spec/{app → support}/models/game.rb +0 -0
  330. data/spec/{app → support}/models/ghost.rb +0 -0
  331. data/spec/support/models/guitar.rb +5 -0
  332. data/spec/{app → support}/models/home.rb +0 -0
  333. data/spec/{app → support}/models/house.rb +0 -0
  334. data/spec/{app → support}/models/html_writer.rb +0 -0
  335. data/spec/{app → support}/models/id_key.rb +0 -0
  336. data/spec/support/models/idnodef.rb +8 -0
  337. data/spec/{app → support}/models/image.rb +0 -0
  338. data/spec/{app → support}/models/implant.rb +0 -0
  339. data/spec/support/models/instrument.rb +9 -0
  340. data/spec/{app → support}/models/item.rb +1 -1
  341. data/spec/{app → support}/models/jar.rb +0 -0
  342. data/spec/{app → support}/models/kaleidoscope.rb +0 -0
  343. data/spec/{app → support}/models/kangaroo.rb +0 -0
  344. data/spec/{app → support}/models/label.rb +0 -0
  345. data/spec/{app → support}/models/language.rb +0 -0
  346. data/spec/{app → support}/models/lat_lng.rb +0 -0
  347. data/spec/{app → support}/models/league.rb +0 -0
  348. data/spec/{app → support}/models/learner.rb +0 -0
  349. data/spec/{app → support}/models/line_item.rb +0 -0
  350. data/spec/{app → support}/models/location.rb +0 -0
  351. data/spec/{app → support}/models/login.rb +0 -0
  352. data/spec/{app → support}/models/manufacturer.rb +0 -0
  353. data/spec/{app → support}/models/meat.rb +0 -0
  354. data/spec/{app → support}/models/membership.rb +0 -0
  355. data/spec/{app → support}/models/message.rb +0 -0
  356. data/spec/{app → support}/models/minim.rb +0 -0
  357. data/spec/{app → support}/models/mixed_drink.rb +0 -0
  358. data/spec/support/models/mop.rb +16 -0
  359. data/spec/{app → support}/models/movie.rb +0 -0
  360. data/spec/{app → support}/models/my_hash.rb +0 -0
  361. data/spec/{app → support}/models/name.rb +0 -0
  362. data/spec/{app → support}/models/name_only.rb +0 -0
  363. data/spec/{app → support}/models/node.rb +0 -0
  364. data/spec/{app → support}/models/note.rb +0 -0
  365. data/spec/{app → support}/models/odd.rb +0 -0
  366. data/spec/{app → support}/models/ordered_post.rb +0 -0
  367. data/spec/{app → support}/models/ordered_preference.rb +0 -0
  368. data/spec/{app → support}/models/oscar.rb +0 -0
  369. data/spec/{app → support}/models/other_owner_object.rb +0 -0
  370. data/spec/{app → support}/models/override.rb +0 -0
  371. data/spec/{app → support}/models/ownable.rb +0 -0
  372. data/spec/{app → support}/models/owner.rb +2 -0
  373. data/spec/{app → support}/models/pack.rb +0 -0
  374. data/spec/{app → support}/models/page.rb +0 -0
  375. data/spec/{app → support}/models/page_question.rb +0 -0
  376. data/spec/{app → support}/models/palette.rb +1 -1
  377. data/spec/{app → support}/models/parent.rb +0 -0
  378. data/spec/{app → support}/models/parent_doc.rb +0 -0
  379. data/spec/{app → support}/models/passport.rb +1 -0
  380. data/spec/{app → support}/models/patient.rb +0 -0
  381. data/spec/{app → support}/models/pdf_writer.rb +0 -0
  382. data/spec/{app → support}/models/pencil.rb +0 -0
  383. data/spec/{app → support}/models/person.rb +1 -1
  384. data/spec/{app → support}/models/pet.rb +0 -0
  385. data/spec/{app → support}/models/pet_owner.rb +0 -0
  386. data/spec/{app → support}/models/phone.rb +1 -0
  387. data/spec/support/models/piano.rb +5 -0
  388. data/spec/{app → support}/models/pizza.rb +0 -0
  389. data/spec/{app → support}/models/player.rb +0 -0
  390. data/spec/{app → support}/models/post.rb +0 -0
  391. data/spec/{app → support}/models/post_genre.rb +0 -0
  392. data/spec/{app → support}/models/powerup.rb +0 -0
  393. data/spec/{app → support}/models/preference.rb +0 -0
  394. data/spec/{app → support}/models/princess.rb +0 -0
  395. data/spec/{app → support}/models/product.rb +0 -0
  396. data/spec/support/models/profile.rb +18 -0
  397. data/spec/{app → support}/models/pronunciation.rb +0 -0
  398. data/spec/{app → support}/models/pub.rb +0 -0
  399. data/spec/support/models/publication.rb +5 -0
  400. data/spec/support/models/publication/encyclopedia.rb +12 -0
  401. data/spec/support/models/publication/review.rb +14 -0
  402. data/spec/{app → support}/models/purchase.rb +0 -0
  403. data/spec/{app → support}/models/question.rb +0 -0
  404. data/spec/{app → support}/models/quiz.rb +0 -0
  405. data/spec/{app → support}/models/rating.rb +0 -0
  406. data/spec/{app → support}/models/record.rb +0 -0
  407. data/spec/{app → support}/models/registry.rb +0 -0
  408. data/spec/{app → support}/models/role.rb +0 -0
  409. data/spec/{app → support}/models/root_category.rb +0 -0
  410. data/spec/{app → support}/models/sandwich.rb +0 -0
  411. data/spec/{app → support}/models/scheduler.rb +0 -0
  412. data/spec/{app/models/profile.rb → support/models/scribe.rb} +2 -2
  413. data/spec/support/models/seat.rb +25 -0
  414. data/spec/{app → support}/models/seo.rb +0 -0
  415. data/spec/{app → support}/models/series.rb +0 -0
  416. data/spec/{app → support}/models/server.rb +0 -0
  417. data/spec/{app → support}/models/service.rb +0 -0
  418. data/spec/{app → support}/models/shape.rb +2 -2
  419. data/spec/{app → support}/models/shelf.rb +0 -0
  420. data/spec/{app → support}/models/shipment_address.rb +0 -0
  421. data/spec/{app → support}/models/shipping_container.rb +0 -0
  422. data/spec/{app → support}/models/shipping_pack.rb +0 -0
  423. data/spec/{app → support}/models/shop.rb +0 -0
  424. data/spec/{app → support}/models/short_agent.rb +0 -0
  425. data/spec/{app → support}/models/short_quiz.rb +0 -0
  426. data/spec/{app → support}/models/simple.rb +0 -0
  427. data/spec/{app → support}/models/slave.rb +0 -0
  428. data/spec/{app → support}/models/song.rb +0 -0
  429. data/spec/{app → support}/models/sound.rb +0 -0
  430. data/spec/{app → support}/models/square.rb +0 -0
  431. data/spec/{app → support}/models/staff.rb +0 -0
  432. data/spec/{app → support}/models/store_as_dup_test1.rb +0 -0
  433. data/spec/{app → support}/models/store_as_dup_test2.rb +0 -0
  434. data/spec/{app → support}/models/store_as_dup_test3.rb +0 -0
  435. data/spec/{app → support}/models/store_as_dup_test4.rb +0 -0
  436. data/spec/{app → support}/models/strategy.rb +0 -0
  437. data/spec/{app → support}/models/sub_item.rb +0 -0
  438. data/spec/{app → support}/models/subscription.rb +0 -0
  439. data/spec/{app → support}/models/survey.rb +0 -0
  440. data/spec/{app → support}/models/symptom.rb +0 -0
  441. data/spec/support/models/system_role.rb +7 -0
  442. data/spec/{app → support}/models/tag.rb +0 -0
  443. data/spec/{app → support}/models/target.rb +0 -0
  444. data/spec/{app → support}/models/template.rb +0 -0
  445. data/spec/{app → support}/models/thing.rb +0 -0
  446. data/spec/{app → support}/models/title.rb +0 -0
  447. data/spec/{app → support}/models/tool.rb +2 -2
  448. data/spec/{app → support}/models/topping.rb +0 -0
  449. data/spec/support/models/toy.rb +10 -0
  450. data/spec/{app → support}/models/track.rb +0 -0
  451. data/spec/{app → support}/models/translation.rb +0 -0
  452. data/spec/{app → support}/models/tree.rb +0 -0
  453. data/spec/{app → support}/models/truck.rb +2 -0
  454. data/spec/{app → support}/models/updatable.rb +0 -0
  455. data/spec/{app → support}/models/user.rb +0 -0
  456. data/spec/{app → support}/models/user_account.rb +0 -0
  457. data/spec/{app → support}/models/validation_callback.rb +0 -0
  458. data/spec/{app → support}/models/vehicle.rb +7 -2
  459. data/spec/{app → support}/models/version.rb +0 -0
  460. data/spec/{app → support}/models/vertex.rb +0 -0
  461. data/spec/{app → support}/models/vet_visit.rb +0 -0
  462. data/spec/{app → support}/models/video.rb +0 -0
  463. data/spec/{app → support}/models/video_game.rb +0 -0
  464. data/spec/{app → support}/models/weapon.rb +0 -0
  465. data/spec/{app → support}/models/wiki_page.rb +0 -0
  466. data/spec/{app → support}/models/word.rb +0 -0
  467. data/spec/{app → support}/models/word_origin.rb +0 -0
  468. data/spec/{app → support}/models/writer.rb +2 -2
  469. data/spec/support/session_registry.rb +50 -0
  470. data/spec/support/spec_config.rb +13 -5
  471. data/spec/support/spec_organizer.rb +130 -0
  472. metadata +882 -752
  473. metadata.gz.sig +0 -0
  474. data/lib/mongoid/matchable/all.rb +0 -30
  475. data/lib/mongoid/matchable/and.rb +0 -32
  476. data/lib/mongoid/matchable/default.rb +0 -121
  477. data/lib/mongoid/matchable/elem_match.rb +0 -36
  478. data/lib/mongoid/matchable/eq.rb +0 -23
  479. data/lib/mongoid/matchable/exists.rb +0 -25
  480. data/lib/mongoid/matchable/gt.rb +0 -25
  481. data/lib/mongoid/matchable/gte.rb +0 -25
  482. data/lib/mongoid/matchable/in.rb +0 -26
  483. data/lib/mongoid/matchable/lt.rb +0 -25
  484. data/lib/mongoid/matchable/lte.rb +0 -25
  485. data/lib/mongoid/matchable/ne.rb +0 -23
  486. data/lib/mongoid/matchable/nin.rb +0 -24
  487. data/lib/mongoid/matchable/nor.rb +0 -38
  488. data/lib/mongoid/matchable/or.rb +0 -35
  489. data/lib/mongoid/matchable/regexp.rb +0 -30
  490. data/lib/mongoid/matchable/size.rb +0 -23
  491. data/spec/mongoid/matchable/all_spec.rb +0 -34
  492. data/spec/mongoid/matchable/and_spec.rb +0 -190
  493. data/spec/mongoid/matchable/default_spec.rb +0 -140
  494. data/spec/mongoid/matchable/elem_match_spec.rb +0 -109
  495. data/spec/mongoid/matchable/eq_spec.rb +0 -49
  496. data/spec/mongoid/matchable/exists_spec.rb +0 -60
  497. data/spec/mongoid/matchable/gt_spec.rb +0 -89
  498. data/spec/mongoid/matchable/gte_spec.rb +0 -87
  499. data/spec/mongoid/matchable/in_spec.rb +0 -52
  500. data/spec/mongoid/matchable/lt_spec.rb +0 -88
  501. data/spec/mongoid/matchable/lte_spec.rb +0 -88
  502. data/spec/mongoid/matchable/ne_spec.rb +0 -49
  503. data/spec/mongoid/matchable/nin_spec.rb +0 -51
  504. data/spec/mongoid/matchable/nor_spec.rb +0 -210
  505. data/spec/mongoid/matchable/or_spec.rb +0 -134
  506. data/spec/mongoid/matchable/regexp_spec.rb +0 -62
  507. data/spec/mongoid/matchable/size_spec.rb +0 -28
  508. data/spec/mongoid/matchable_spec.rb +0 -856
@@ -55,7 +55,8 @@ describe Mongoid::Clients::Sessions do
55
55
 
56
56
  context 'when a transaction is used on a model class' do
57
57
 
58
- context 'when transactions are supported', if: testing_transactions? do
58
+ context 'when transactions are supported' do
59
+ require_transaction_support
59
60
 
60
61
  around do |example|
61
62
  Mongoid::Clients.with_name(:other).database.collections.each(&:drop)
@@ -191,7 +192,10 @@ describe Mongoid::Clients::Sessions do
191
192
  end
192
193
  end
193
194
 
194
- context 'when sessions are supported but transactions are not', if: sessions_supported? && !testing_transactions? do
195
+ context 'when sessions are supported but transactions are not' do
196
+ min_server_version '3.6'
197
+ # Could also test 4.0 in sharded cluster
198
+ max_server_version '3.6'
195
199
 
196
200
  let!(:error) do
197
201
  e = nil
@@ -222,7 +226,8 @@ describe Mongoid::Clients::Sessions do
222
226
  end
223
227
  end
224
228
 
225
- context 'when transactions are supported', if: testing_transactions? do
229
+ context 'when transactions are supported' do
230
+ require_transaction_support
226
231
 
227
232
  around do |example|
228
233
  Mongoid::Clients.with_name(:other).database.collections.each(&:drop)
@@ -345,16 +350,23 @@ describe Mongoid::Clients::Sessions do
345
350
  end
346
351
  end
347
352
 
348
- context 'when sessions are supported but transactions are not', if: sessions_supported? && !testing_transactions? do
353
+ context 'when sessions are supported but transactions are not' do
354
+ min_server_version '3.6'
355
+ # Could also test 4.0 in sharded cluster
356
+ max_server_version '3.6'
349
357
 
350
358
  around do |example|
351
359
  Mongoid::Clients.with_name(:other).database.collections.each(&:drop)
352
360
  Mongoid::Clients.with_name(:other).command(create: :people)
353
- subscriber.clear_events!
354
- person.with(client: :other) do
355
- example.run
361
+
362
+ begin
363
+ subscriber.clear_events!
364
+ person.with(client: :other) do
365
+ example.run
366
+ end
367
+ ensure
368
+ Mongoid::Clients.with_name(:other).database.collections.each(&:drop)
356
369
  end
357
- Mongoid::Clients.with_name(:other).database.collections.each(&:drop)
358
370
  end
359
371
 
360
372
  let!(:error) do
@@ -728,7 +728,7 @@ describe Mongoid::Clients do
728
728
  end
729
729
  end
730
730
 
731
- describe ".store_in", if: non_legacy_server? do
731
+ describe ".store_in" do
732
732
 
733
733
  context "when provided a non hash" do
734
734
 
@@ -765,7 +765,7 @@ describe Mongoid::Clients do
765
765
  end
766
766
  end
767
767
 
768
- describe ".with", if: non_legacy_server? do
768
+ describe ".with" do
769
769
 
770
770
  context "when changing write concern options" do
771
771
 
@@ -197,6 +197,34 @@ describe Mongoid::Config do
197
197
  end
198
198
  end
199
199
 
200
+ context 'when discriminator_key override' do
201
+ context 'is not set in the config' do
202
+ it 'has the value _type by default' do
203
+ Mongoid::Config.reset
204
+ configuration = CONFIG.merge(options: {})
205
+
206
+ Mongoid.configure { |config| config.load_configuration(configuration) }
207
+
208
+ expect(Mongoid::Config.discriminator_key).to be("_type")
209
+ end
210
+ end
211
+
212
+ context 'is set in the config' do
213
+ it 'sets the value' do
214
+ Mongoid::Config.reset
215
+ configuration = CONFIG.merge(options: {discriminator_key: "test"})
216
+
217
+ Mongoid.configure { |config| config.load_configuration(configuration) }
218
+
219
+ expect(Mongoid::Config.discriminator_key).to be("test")
220
+ end
221
+
222
+ it 'is set globally' do
223
+ expect(Mongoid.discriminator_key).to be("test")
224
+ end
225
+ end
226
+ end
227
+
200
228
  describe "#load!" do
201
229
 
202
230
  before(:all) do
@@ -77,7 +77,8 @@ describe Mongoid::Contextual::Atomic do
77
77
  end
78
78
  end
79
79
 
80
- context 'when the criteria has a collation', if: collation_supported? do
80
+ context 'when the criteria has a collation' do
81
+ min_server_version '3.4'
81
82
 
82
83
  let(:criteria) do
83
84
  Band.where(members: [ "DAVE" ]).collation(locale: 'en_US', strength: 2)
@@ -173,7 +174,8 @@ describe Mongoid::Contextual::Atomic do
173
174
  end
174
175
  end
175
176
 
176
- context 'when the criteria has a collation', if: collation_supported? do
177
+ context 'when the criteria has a collation' do
178
+ min_server_version '3.4'
177
179
 
178
180
  let(:criteria) do
179
181
  Band.where(members: [ "DAVE" ]).collation(locale: 'en_US', strength: 2)
@@ -244,7 +246,8 @@ describe Mongoid::Contextual::Atomic do
244
246
  end
245
247
  end
246
248
 
247
- context 'when the criteria has a collation', if: collation_supported? do
249
+ context 'when the criteria has a collation' do
250
+ min_server_version '3.4'
248
251
 
249
252
  let!(:depeche_mode) do
250
253
  Band.create(members: [ "Dave" ], likes: 60)
@@ -323,7 +326,8 @@ describe Mongoid::Contextual::Atomic do
323
326
  end
324
327
  end
325
328
 
326
- context 'when the criteria has a collation', if: collation_supported? do
329
+ context 'when the criteria has a collation' do
330
+ min_server_version '3.4'
327
331
 
328
332
  let!(:depeche_mode) do
329
333
  Band.create(members: [ "Dave" ])
@@ -395,7 +399,8 @@ describe Mongoid::Contextual::Atomic do
395
399
  end
396
400
  end
397
401
 
398
- 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'
399
404
 
400
405
  let!(:depeche_mode) do
401
406
  Band.create(members: [ "Dave" ])
@@ -449,7 +454,8 @@ describe Mongoid::Contextual::Atomic do
449
454
  expect(smiths.reload.members).to be_nil
450
455
  end
451
456
 
452
- context 'when the criteria has a collation', if: collation_supported? do
457
+ context 'when the criteria has a collation' do
458
+ min_server_version '3.4'
453
459
 
454
460
  let!(:depeche_mode) do
455
461
  Band.create(members: [ "Dave" ])
@@ -506,7 +512,8 @@ describe Mongoid::Contextual::Atomic do
506
512
  end
507
513
  end
508
514
 
509
- context 'when the criteria has a collation', if: collation_supported? do
515
+ context 'when the criteria has a collation' do
516
+ min_server_version '3.4'
510
517
 
511
518
  let!(:depeche_mode) do
512
519
  Band.create(members: [ "Dave", "Alan", "Fletch" ])
@@ -563,7 +570,8 @@ describe Mongoid::Contextual::Atomic do
563
570
  end
564
571
  end
565
572
 
566
- context 'when the criteria has a collation', if: collation_supported? do
573
+ context 'when the criteria has a collation' do
574
+ min_server_version '3.4'
567
575
 
568
576
  let!(:depeche_mode) do
569
577
  Band.create(members: [ "Dave" ])
@@ -628,7 +636,8 @@ describe Mongoid::Contextual::Atomic do
628
636
  end
629
637
  end
630
638
 
631
- context 'when the criteria has a collation', if: collation_supported? do
639
+ context 'when the criteria has a collation' do
640
+ min_server_version '3.4'
632
641
 
633
642
  let!(:depeche_mode) do
634
643
  Band.create(members: [ "Dave" ])
@@ -689,7 +698,8 @@ describe Mongoid::Contextual::Atomic do
689
698
  end
690
699
  end
691
700
 
692
- context 'when the criteria has a collation', if: collation_supported? do
701
+ context 'when the criteria has a collation' do
702
+ min_server_version '3.4'
693
703
 
694
704
  let!(:depeche_mode) do
695
705
  Band.create(members: [ "Dave" ])
@@ -848,7 +858,8 @@ describe Mongoid::Contextual::Atomic do
848
858
  end
849
859
  end
850
860
 
851
- context 'when the criteria has a collation', if: collation_supported? do
861
+ context 'when the criteria has a collation' do
862
+ min_server_version '3.4'
852
863
 
853
864
  let!(:depeche_mode) do
854
865
  Band.create(name: "Depeche Mode", years: 10)
@@ -49,8 +49,17 @@ describe Mongoid::Contextual::GeoNear do
49
49
  described_class.new(collection, criteria, [ 52, 13 ])
50
50
  end
51
51
 
52
- it "returns 0.0" do
53
- expect(geo_near.average_distance).to be_nil
52
+ let(:expected_value) do
53
+ if ClusterConfig.instance.fcv_ish == '4.0' && ClusterConfig.instance.topology == :sharded
54
+ # https://jira.mongodb.org/browse/SERVER-50074
55
+ 0.0
56
+ else
57
+ nil
58
+ end
59
+ end
60
+
61
+ it "is nil except for 4.0 sharded when it is 0" do
62
+ expect(geo_near.average_distance).to be expected_value
54
63
  end
55
64
  end
56
65
  end
@@ -78,6 +78,7 @@ describe Mongoid::Contextual::MapReduce do
78
78
  end
79
79
 
80
80
  describe "#counts" do
81
+ max_server_version '4.2'
81
82
 
82
83
  let(:criteria) do
83
84
  Band.all
@@ -106,7 +107,8 @@ describe Mongoid::Contextual::MapReduce do
106
107
  end
107
108
 
108
109
  it "iterates over the results" do
109
- expect(results.entries).to eq([
110
+ ordered_results = results.entries.sort_by { |doc| doc['_id'] }
111
+ expect(ordered_results.entries).to eq([
110
112
  { "_id" => "Depeche Mode", "value" => { "likes" => 200 }},
111
113
  { "_id" => "Tool", "value" => { "likes" => 100 }}
112
114
  ])
@@ -127,7 +129,8 @@ describe Mongoid::Contextual::MapReduce do
127
129
  end
128
130
 
129
131
  it "iterates over the results" do
130
- expect(results.entries).to eq(expected_results)
132
+ ordered_results = results.entries.sort_by { |doc| doc['_id'] }
133
+ expect(ordered_results).to eq(expected_results)
131
134
  end
132
135
 
133
136
  it 'outputs to the collection' do
@@ -147,6 +150,7 @@ describe Mongoid::Contextual::MapReduce do
147
150
  end
148
151
 
149
152
  context "when the statstics are requested" do
153
+ max_server_version '4.2'
150
154
 
151
155
  it "raises an error" do
152
156
  expect {
@@ -191,14 +195,16 @@ describe Mongoid::Contextual::MapReduce do
191
195
  Band.where(name: 'DEPECHE MODE').collation(locale: 'en_US', strength: 2)
192
196
  end
193
197
 
194
- context 'when the server supports collations', if: collation_supported? do
198
+ context 'when the server supports collations' do
199
+ min_server_version '3.4'
195
200
 
196
201
  it 'applies the collation' do
197
202
  expect(map_reduce.out(inline: 1).count).to eq(1)
198
203
  end
199
204
  end
200
205
 
201
- context 'when the server does not support collations', unless: collation_supported? do
206
+ context 'when the server does not support collations' do
207
+ max_server_version '3.2'
202
208
 
203
209
  it 'raises an exception' do
204
210
  expect {
@@ -210,6 +216,7 @@ describe Mongoid::Contextual::MapReduce do
210
216
  end
211
217
 
212
218
  describe "#emitted" do
219
+ max_server_version '4.2'
213
220
 
214
221
  let(:emitted) do
215
222
  map_reduce.out(inline: 1).emitted
@@ -261,6 +268,7 @@ describe Mongoid::Contextual::MapReduce do
261
268
  end
262
269
 
263
270
  describe "#input" do
271
+ max_server_version '4.2'
264
272
 
265
273
  let(:input) do
266
274
  map_reduce.out(inline: 1).input
@@ -311,6 +319,7 @@ describe Mongoid::Contextual::MapReduce do
311
319
  end
312
320
 
313
321
  describe "#output" do
322
+ max_server_version '4.2'
314
323
 
315
324
  let(:output) do
316
325
  map_reduce.out(inline: 1).output
@@ -343,12 +352,16 @@ describe Mongoid::Contextual::MapReduce do
343
352
  end
344
353
 
345
354
  context 'when a read preference is defined' do
355
+ require_topology :replica_set
356
+ # On 4.4 it seems the server inserts on the primary, not on the server
357
+ # that executed the map/reduce.
358
+ max_server_version '4.2'
346
359
 
347
360
  let(:criteria) do
348
361
  Band.all.read(mode: :secondary)
349
362
  end
350
363
 
351
- it "uses the read preference", if: testing_replica_set? do
364
+ it "uses the read preference" do
352
365
 
353
366
  expect {
354
367
  replace_map_reduce.raw
@@ -359,6 +372,7 @@ describe Mongoid::Contextual::MapReduce do
359
372
  end
360
373
 
361
374
  describe "#reduced" do
375
+ max_server_version '4.2'
362
376
 
363
377
  let(:reduced) do
364
378
  map_reduce.out(inline: 1).reduced
@@ -389,6 +403,7 @@ describe Mongoid::Contextual::MapReduce do
389
403
  end
390
404
 
391
405
  describe "#time" do
406
+ max_server_version '4.2'
392
407
 
393
408
  let(:time) do
394
409
  map_reduce.out(inline: 1).time
@@ -109,11 +109,8 @@ describe Mongoid::Contextual::Mongo do
109
109
  described_class.new(criteria.cache)
110
110
  end
111
111
 
112
- before do
113
- expect(context.view).to receive(:count).once.and_return(1)
114
- end
115
-
116
112
  it "returns the count cached value after first call" do
113
+ expect(context.view).to receive(:count_documents).once.and_return(1)
117
114
  2.times { expect(context.count).to eq(1) }
118
115
  end
119
116
  end
@@ -171,7 +168,8 @@ describe Mongoid::Contextual::Mongo do
171
168
  end
172
169
  end
173
170
 
174
- context 'when a collation is specified', if: collation_supported? do
171
+ context 'when a collation is specified' do
172
+ min_server_version '3.4'
175
173
 
176
174
  let(:context) do
177
175
  described_class.new(criteria)
@@ -194,6 +192,71 @@ describe Mongoid::Contextual::Mongo do
194
192
  end
195
193
  end
196
194
 
195
+ describe "#estimated_count" do
196
+
197
+ let!(:depeche) do
198
+ Band.create(name: "Depeche Mode")
199
+ end
200
+
201
+ let!(:new_order) do
202
+ Band.create(name: "New Order")
203
+ end
204
+
205
+ let(:criteria) do
206
+ Band.where
207
+ end
208
+
209
+ context "when not providing options" do
210
+ it 'returns the correct count' do
211
+ expect(criteria.estimated_count).to eq(2)
212
+ end
213
+ end
214
+
215
+ context "when providing options" do
216
+ it 'returns the correct count' do
217
+ expect(criteria.estimated_count(maxTimeMS: 1000)).to eq(2)
218
+ end
219
+ end
220
+
221
+ context "when context is cached" do
222
+
223
+ let(:context) do
224
+ described_class.new(criteria.cache)
225
+ end
226
+
227
+ it "returns the count cached value after first call" do
228
+ expect(context.view).to receive(:estimated_document_count).once.and_return(1)
229
+ 2.times do
230
+ context.estimated_count
231
+ end
232
+ end
233
+ end
234
+
235
+ context "when the criteria contains a selector", :focus do
236
+ let(:criteria) do
237
+ Band.where(name: "New Order")
238
+ end
239
+
240
+ context "when not providing options" do
241
+ it 'raises an error' do
242
+ expect do
243
+ criteria.estimated_count
244
+ end.to raise_error(Mongoid::Errors::InvalidEstimatedCountCriteria)
245
+ end
246
+ end
247
+
248
+ context "when providing options" do
249
+ it 'raises an error' do
250
+ expect do
251
+ criteria.estimated_count(maxTimeMS: 1000)
252
+ end.to raise_error(Mongoid::Errors::InvalidEstimatedCountCriteria)
253
+ end
254
+ end
255
+ end
256
+ end
257
+
258
+
259
+
197
260
  [ :delete, :delete_all ].each do |method|
198
261
 
199
262
  describe "##{method}" do
@@ -232,7 +295,8 @@ describe Mongoid::Contextual::Mongo do
232
295
  expect(deleted).to eq(1)
233
296
  end
234
297
 
235
- context 'when the criteria has a collation', if: collation_supported? do
298
+ context 'when the criteria has a collation' do
299
+ min_server_version '3.4'
236
300
 
237
301
  let(:criteria) do
238
302
  Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
@@ -336,7 +400,8 @@ describe Mongoid::Contextual::Mongo do
336
400
  expect(destroyed).to eq(1)
337
401
  end
338
402
 
339
- context 'when the criteria has a collation', if: collation_supported? do
403
+ context 'when the criteria has a collation' do
404
+ min_server_version '3.4'
340
405
 
341
406
  let(:criteria) do
342
407
  Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
@@ -458,7 +523,8 @@ describe Mongoid::Contextual::Mongo do
458
523
  end
459
524
  end
460
525
 
461
- context 'when a collation is specified', if: collation_supported? do
526
+ context 'when a collation is specified' do
527
+ min_server_version '3.4'
462
528
 
463
529
  before do
464
530
  Band.create(name: 'DEPECHE MODE')
@@ -496,7 +562,8 @@ describe Mongoid::Contextual::Mongo do
496
562
  described_class.new(criteria)
497
563
  end
498
564
 
499
- context 'when the criteria has a collation', if: collation_supported? do
565
+ context 'when the criteria has a collation' do
566
+ min_server_version '3.4'
500
567
 
501
568
  let(:criteria) do
502
569
  Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
@@ -853,7 +920,8 @@ describe Mongoid::Contextual::Mongo do
853
920
  end
854
921
  end
855
922
 
856
- context 'when a collation is specified on the criteria', if: collation_supported? do
923
+ context 'when a collation is specified on the criteria' do
924
+ min_server_version '3.4'
857
925
 
858
926
  let(:criteria) do
859
927
  Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
@@ -1006,7 +1074,8 @@ describe Mongoid::Contextual::Mongo do
1006
1074
  end
1007
1075
  end
1008
1076
 
1009
- context 'when a collation is specified on the criteria', if: collation_supported? do
1077
+ context 'when a collation is specified on the criteria' do
1078
+ min_server_version '3.4'
1010
1079
 
1011
1080
  let(:criteria) do
1012
1081
  Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
@@ -1080,7 +1149,8 @@ describe Mongoid::Contextual::Mongo do
1080
1149
  }.to raise_error(Mongoid::Errors::DocumentNotFound)
1081
1150
  end
1082
1151
 
1083
- context 'when a collation is specified on the criteria', if: collation_supported? do
1152
+ context 'when a collation is specified on the criteria' do
1153
+ min_server_version '3.4'
1084
1154
 
1085
1155
  let(:criteria) do
1086
1156
  Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
@@ -1152,7 +1222,8 @@ describe Mongoid::Contextual::Mongo do
1152
1222
  expect(context.send(method)).to eq(depeche_mode)
1153
1223
  end
1154
1224
 
1155
- context 'when the criteria has a collation', if: collation_supported? do
1225
+ context 'when the criteria has a collation' do
1226
+ min_server_version '3.4'
1156
1227
 
1157
1228
  let(:criteria) do
1158
1229
  Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
@@ -1390,12 +1461,8 @@ describe Mongoid::Contextual::Mongo do
1390
1461
  end
1391
1462
 
1392
1463
  context "when calling more than once" do
1393
-
1394
- before do
1395
- expect(context.view).to receive(:count).once.and_return(2)
1396
- end
1397
-
1398
1464
  it "returns the cached value for subsequent calls" do
1465
+ expect(context.view).to receive(:count_documents).once.and_return(2)
1399
1466
  2.times { expect(context.send(method)).to eq(2) }
1400
1467
  end
1401
1468
  end
@@ -1404,10 +1471,10 @@ describe Mongoid::Contextual::Mongo do
1404
1471
 
1405
1472
  before do
1406
1473
  context.entries
1407
- expect(context.view).to receive(:count).once.and_return(2)
1408
1474
  end
1409
1475
 
1410
1476
  it "returns the cached value for all calls" do
1477
+ expect(context.view).to receive(:count_documents).once.and_return(2)
1411
1478
  expect(context.send(method)).to eq(2)
1412
1479
  end
1413
1480
 
@@ -1439,12 +1506,8 @@ describe Mongoid::Contextual::Mongo do
1439
1506
  end
1440
1507
 
1441
1508
  context "when calling more than once" do
1442
-
1443
- before do
1444
- expect(context.view).to receive(:count).once.and_return(1)
1445
- end
1446
-
1447
1509
  it "returns the cached value for subsequent calls" do
1510
+ expect(context.view).to receive(:count_documents).once.and_return(1)
1448
1511
  2.times { expect(context.send(method)).to eq(1) }
1449
1512
  end
1450
1513
  end
@@ -1453,10 +1516,10 @@ describe Mongoid::Contextual::Mongo do
1453
1516
 
1454
1517
  before do
1455
1518
  context.entries
1456
- expect(context.view).to receive(:count).once.and_return(1)
1457
1519
  end
1458
1520
 
1459
1521
  it "returns the cached value for all calls" do
1522
+ expect(context.view).to receive(:count_documents).once.and_return(1)
1460
1523
  expect(context.send(method)).to eq(1)
1461
1524
  end
1462
1525
 
@@ -1556,6 +1619,10 @@ describe Mongoid::Contextual::Mongo do
1556
1619
  }}
1557
1620
  end
1558
1621
 
1622
+ let(:ordered_results) do
1623
+ results['results'].sort_by { |doc| doc['_id'] }
1624
+ end
1625
+
1559
1626
  context "when no selection is provided" do
1560
1627
 
1561
1628
  let(:criteria) do
@@ -1587,36 +1654,40 @@ describe Mongoid::Contextual::Mongo do
1587
1654
  end
1588
1655
 
1589
1656
  it "contains the entire raw results" do
1590
- expect(results["results"]).to eq([
1657
+ expect(ordered_results).to eq([
1591
1658
  { "_id" => "Depeche Mode", "value" => { "likes" => 200 }},
1592
1659
  { "_id" => "Tool", "value" => { "likes" => 100 }}
1593
1660
  ])
1594
1661
  end
1595
1662
 
1596
- it "contains the execution time" do
1597
- expect(results.time).to_not be_nil
1598
- end
1663
+ context 'when statistics are available' do
1664
+ max_server_version '4.2'
1599
1665
 
1600
- it "contains the count statistics" do
1601
- expect(results["counts"]).to eq({
1602
- "input" => 2, "emit" => 2, "reduce" => 0, "output" => 2
1603
- })
1604
- end
1666
+ it "contains the execution time" do
1667
+ expect(results.time).to_not be_nil
1668
+ end
1605
1669
 
1606
- it "contains the input count" do
1607
- expect(results.input).to eq(2)
1608
- end
1670
+ it "contains the count statistics" do
1671
+ expect(results["counts"]).to eq({
1672
+ "input" => 2, "emit" => 2, "reduce" => 0, "output" => 2
1673
+ })
1674
+ end
1609
1675
 
1610
- it "contains the emitted count" do
1611
- expect(results.emitted).to eq(2)
1612
- end
1676
+ it "contains the input count" do
1677
+ expect(results.input).to eq(2)
1678
+ end
1613
1679
 
1614
- it "contains the reduced count" do
1615
- expect(results.reduced).to eq(0)
1616
- end
1680
+ it "contains the emitted count" do
1681
+ expect(results.emitted).to eq(2)
1682
+ end
1683
+
1684
+ it "contains the reduced count" do
1685
+ expect(results.reduced).to eq(0)
1686
+ end
1617
1687
 
1618
- it "contains the output count" do
1619
- expect(results.output).to eq(2)
1688
+ it "contains the output count" do
1689
+ expect(results.output).to eq(2)
1690
+ end
1620
1691
  end
1621
1692
  end
1622
1693
 
@@ -1645,35 +1716,39 @@ describe Mongoid::Contextual::Mongo do
1645
1716
  end
1646
1717
 
1647
1718
  it "contains the entire raw results" do
1648
- expect(results["results"]).to eq([
1719
+ expect(ordered_results).to eq([
1649
1720
  { "_id" => "Depeche Mode", "value" => { "likes" => 200 }}
1650
1721
  ])
1651
1722
  end
1652
1723
 
1653
- it "contains the execution time" do
1654
- expect(results.time).to_not be_nil
1655
- end
1724
+ context 'when statistics are available' do
1725
+ max_server_version '4.2'
1656
1726
 
1657
- it "contains the count statistics" do
1658
- expect(results["counts"]).to eq({
1659
- "input" => 1, "emit" => 1, "reduce" => 0, "output" => 1
1660
- })
1661
- end
1727
+ it "contains the execution time" do
1728
+ expect(results.time).to_not be_nil
1729
+ end
1662
1730
 
1663
- it "contains the input count" do
1664
- expect(results.input).to eq(1)
1665
- end
1731
+ it "contains the count statistics" do
1732
+ expect(results["counts"]).to eq({
1733
+ "input" => 1, "emit" => 1, "reduce" => 0, "output" => 1
1734
+ })
1735
+ end
1666
1736
 
1667
- it "contains the emitted count" do
1668
- expect(results.emitted).to eq(1)
1669
- end
1737
+ it "contains the input count" do
1738
+ expect(results.input).to eq(1)
1739
+ end
1670
1740
 
1671
- it "contains the reduced count" do
1672
- expect(results.reduced).to eq(0)
1673
- end
1741
+ it "contains the emitted count" do
1742
+ expect(results.emitted).to eq(1)
1743
+ end
1744
+
1745
+ it "contains the reduced count" do
1746
+ expect(results.reduced).to eq(0)
1747
+ end
1674
1748
 
1675
- it "contains the output count" do
1676
- expect(results.output).to eq(1)
1749
+ it "contains the output count" do
1750
+ expect(results.output).to eq(1)
1751
+ end
1677
1752
  end
1678
1753
  end
1679
1754
 
@@ -1713,7 +1788,7 @@ describe Mongoid::Contextual::Mongo do
1713
1788
  end
1714
1789
 
1715
1790
  it "contains the entire raw results" do
1716
- expect(results["results"]).to eq([
1791
+ expect(ordered_results).to eq([
1717
1792
  { "_id" => "Depeche Mode", "value" => { "likes" => 200 }},
1718
1793
  { "_id" => "Tool", "value" => { "likes" => 100 }}
1719
1794
  ])
@@ -2166,7 +2241,8 @@ describe Mongoid::Contextual::Mongo do
2166
2241
  end
2167
2242
  end
2168
2243
 
2169
- context 'when provided array filters', if: array_filters_supported? do
2244
+ context 'when provided array filters' do
2245
+ min_server_version '3.6'
2170
2246
 
2171
2247
  before do
2172
2248
  Band.delete_all
@@ -2338,7 +2414,8 @@ describe Mongoid::Contextual::Mongo do
2338
2414
  end
2339
2415
  end
2340
2416
 
2341
- context 'when provided array filters', if: array_filters_supported? do
2417
+ context 'when provided array filters' do
2418
+ min_server_version '3.6'
2342
2419
 
2343
2420
  before do
2344
2421
  Band.delete_all
@@ -2376,7 +2453,7 @@ describe Mongoid::Contextual::Mongo do
2376
2453
 
2377
2454
  describe '#pipeline' do
2378
2455
 
2379
- context 'when the criteria has a selector', if: non_legacy_server? do
2456
+ context 'when the criteria has a selector' do
2380
2457
 
2381
2458
  before do
2382
2459
  Artist.index(name: "text")