mongo 2.6.2 → 2.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1777) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CONTRIBUTING.md +12 -54
  4. data/LICENSE +1 -1
  5. data/README.md +70 -43
  6. data/Rakefile +107 -22
  7. data/lib/mongo/active_support.rb +20 -0
  8. data/lib/mongo/address/ipv4.rb +39 -6
  9. data/lib/mongo/address/ipv6.rb +39 -8
  10. data/lib/mongo/address/unix.rb +10 -4
  11. data/lib/mongo/address/validator.rb +102 -0
  12. data/lib/mongo/address.rb +153 -73
  13. data/lib/mongo/auth/aws/conversation.rb +128 -0
  14. data/lib/mongo/auth/aws/credentials_retriever.rb +222 -0
  15. data/lib/mongo/auth/aws/request.rb +286 -0
  16. data/lib/mongo/auth/aws.rb +40 -0
  17. data/lib/mongo/auth/base.rb +138 -0
  18. data/lib/mongo/auth/conversation_base.rb +87 -0
  19. data/lib/mongo/auth/cr/conversation.rb +26 -89
  20. data/lib/mongo/auth/cr.rb +14 -37
  21. data/lib/mongo/auth/credential_cache.rb +54 -0
  22. data/lib/mongo/auth/gssapi/conversation.rb +100 -0
  23. data/lib/mongo/auth/gssapi.rb +41 -0
  24. data/lib/mongo/auth/ldap/conversation.rb +14 -63
  25. data/lib/mongo/auth/ldap.rb +14 -35
  26. data/lib/mongo/auth/roles.rb +4 -1
  27. data/lib/mongo/auth/sasl_conversation_base.rb +102 -0
  28. data/lib/mongo/auth/scram/conversation.rb +18 -487
  29. data/lib/mongo/auth/scram.rb +44 -56
  30. data/lib/mongo/auth/scram256/conversation.rb +66 -0
  31. data/lib/mongo/auth/scram256.rb +34 -0
  32. data/lib/mongo/auth/scram_conversation_base.rb +378 -0
  33. data/lib/mongo/auth/stringprep/profiles/sasl.rb +5 -1
  34. data/lib/mongo/auth/stringprep/tables.rb +5 -1
  35. data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +3 -2
  36. data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +2 -1
  37. data/lib/mongo/auth/stringprep.rb +9 -5
  38. data/lib/mongo/auth/user/view.rb +31 -15
  39. data/lib/mongo/auth/user.rb +69 -19
  40. data/lib/mongo/auth/x509/conversation.rb +28 -62
  41. data/lib/mongo/auth/x509.rb +29 -33
  42. data/lib/mongo/auth.rb +96 -24
  43. data/lib/mongo/background_thread.rb +173 -0
  44. data/lib/mongo/bson.rb +4 -1
  45. data/lib/mongo/bulk_write/combineable.rb +24 -9
  46. data/lib/mongo/bulk_write/ordered_combiner.rb +4 -1
  47. data/lib/mongo/bulk_write/result.rb +5 -2
  48. data/lib/mongo/bulk_write/result_combiner.rb +18 -5
  49. data/lib/mongo/bulk_write/transformable.rb +21 -11
  50. data/lib/mongo/bulk_write/unordered_combiner.rb +4 -1
  51. data/lib/mongo/bulk_write/validatable.rb +9 -2
  52. data/lib/mongo/bulk_write.rb +99 -34
  53. data/lib/mongo/caching_cursor.rb +77 -0
  54. data/lib/mongo/client.rb +958 -122
  55. data/lib/mongo/client_encryption.rb +106 -0
  56. data/lib/mongo/cluster/periodic_executor.rb +39 -40
  57. data/lib/mongo/cluster/reapers/cursor_reaper.rb +96 -46
  58. data/lib/mongo/cluster/reapers/socket_reaper.rb +16 -10
  59. data/lib/mongo/cluster/sdam_flow.rb +626 -0
  60. data/lib/mongo/cluster/topology/base.rb +225 -0
  61. data/lib/mongo/cluster/topology/load_balanced.rb +102 -0
  62. data/lib/mongo/cluster/topology/no_replica_set_options.rb +37 -0
  63. data/lib/mongo/cluster/topology/replica_set_no_primary.rb +172 -0
  64. data/lib/mongo/cluster/topology/replica_set_with_primary.rb +30 -0
  65. data/lib/mongo/cluster/topology/sharded.rb +16 -116
  66. data/lib/mongo/cluster/topology/single.rb +22 -113
  67. data/lib/mongo/cluster/topology/unknown.rb +14 -152
  68. data/lib/mongo/cluster/topology.rb +78 -17
  69. data/lib/mongo/cluster.rb +833 -317
  70. data/lib/mongo/cluster_time.rb +142 -0
  71. data/lib/mongo/collection/view/aggregation.rb +39 -12
  72. data/lib/mongo/collection/view/builder/aggregation.rb +40 -11
  73. data/lib/mongo/collection/view/builder/map_reduce.rb +21 -52
  74. data/lib/mongo/collection/view/builder.rb +4 -5
  75. data/lib/mongo/collection/view/change_stream/retryable.rb +4 -1
  76. data/lib/mongo/collection/view/change_stream.rb +102 -79
  77. data/lib/mongo/collection/view/explainable.rb +32 -10
  78. data/lib/mongo/collection/view/immutable.rb +5 -2
  79. data/lib/mongo/collection/view/iterable.rb +144 -25
  80. data/lib/mongo/collection/view/map_reduce.rb +65 -30
  81. data/lib/mongo/collection/view/readable.rb +186 -91
  82. data/lib/mongo/collection/view/writable.rb +271 -123
  83. data/lib/mongo/collection/view.rb +54 -45
  84. data/lib/mongo/collection.rb +217 -70
  85. data/lib/mongo/crypt/auto_decryption_context.rb +43 -0
  86. data/lib/mongo/crypt/auto_encrypter.rb +182 -0
  87. data/lib/mongo/crypt/auto_encryption_context.rb +47 -0
  88. data/lib/mongo/crypt/binary.rb +158 -0
  89. data/lib/mongo/crypt/binding.rb +1232 -0
  90. data/lib/mongo/crypt/context.rb +138 -0
  91. data/lib/mongo/crypt/data_key_context.rb +165 -0
  92. data/lib/mongo/crypt/encryption_io.rb +309 -0
  93. data/lib/mongo/crypt/explicit_decryption_context.rb +43 -0
  94. data/lib/mongo/crypt/explicit_encrypter.rb +120 -0
  95. data/lib/mongo/crypt/explicit_encryption_context.rb +92 -0
  96. data/lib/mongo/crypt/handle.rb +318 -0
  97. data/lib/mongo/crypt/hooks.rb +93 -0
  98. data/lib/mongo/crypt/kms_context.rb +70 -0
  99. data/lib/mongo/crypt/status.rb +134 -0
  100. data/lib/mongo/crypt.rb +36 -0
  101. data/lib/mongo/cursor/kill_spec.rb +38 -0
  102. data/lib/mongo/cursor.rb +245 -82
  103. data/lib/mongo/database/view.rb +97 -20
  104. data/lib/mongo/database.rb +177 -29
  105. data/lib/mongo/dbref.rb +13 -3
  106. data/lib/mongo/distinguishing_semaphore.rb +58 -0
  107. data/lib/mongo/error/auth_error.rb +32 -0
  108. data/lib/mongo/error/bad_load_balancer_target.rb +26 -0
  109. data/lib/mongo/error/bulk_write_error.rb +37 -2
  110. data/lib/mongo/error/change_stream_resumable.rb +4 -1
  111. data/lib/mongo/error/closed_stream.rb +4 -1
  112. data/lib/mongo/error/connection_check_out_timeout.rb +51 -0
  113. data/lib/mongo/error/connection_perished.rb +26 -0
  114. data/lib/mongo/error/credential_check_error.rb +29 -0
  115. data/lib/mongo/error/crypt_error.rb +34 -0
  116. data/lib/mongo/error/extra_file_chunk.rb +4 -1
  117. data/lib/mongo/error/failed_string_prep_validation.rb +41 -0
  118. data/lib/mongo/error/file_not_found.rb +4 -1
  119. data/lib/mongo/error/handshake_error.rb +27 -0
  120. data/lib/mongo/error/insufficient_iteration_count.rb +4 -1
  121. data/lib/mongo/error/internal_driver_error.rb +25 -0
  122. data/lib/mongo/error/invalid_address.rb +27 -0
  123. data/lib/mongo/error/invalid_application_name.rb +4 -1
  124. data/lib/mongo/error/invalid_bulk_operation.rb +4 -1
  125. data/lib/mongo/error/invalid_bulk_operation_type.rb +4 -1
  126. data/lib/mongo/error/invalid_collection_name.rb +4 -1
  127. data/lib/mongo/error/invalid_cursor_operation.rb +30 -0
  128. data/lib/mongo/error/invalid_database_name.rb +4 -1
  129. data/lib/mongo/error/invalid_document.rb +4 -1
  130. data/lib/mongo/error/invalid_file.rb +4 -1
  131. data/lib/mongo/error/invalid_file_revision.rb +4 -1
  132. data/lib/mongo/error/invalid_min_pool_size.rb +4 -1
  133. data/lib/mongo/error/invalid_nonce.rb +5 -2
  134. data/lib/mongo/error/invalid_read_concern.rb +31 -0
  135. data/lib/mongo/error/invalid_read_option.rb +4 -1
  136. data/lib/mongo/error/invalid_replacement_document.rb +4 -1
  137. data/lib/mongo/error/invalid_server_auth_host.rb +25 -0
  138. data/lib/mongo/error/invalid_server_auth_response.rb +26 -0
  139. data/lib/mongo/error/invalid_server_preference.rb +10 -1
  140. data/lib/mongo/error/invalid_session.rb +6 -2
  141. data/lib/mongo/error/invalid_signature.rb +4 -1
  142. data/lib/mongo/error/invalid_transaction_operation.rb +5 -2
  143. data/lib/mongo/error/invalid_txt_record.rb +4 -1
  144. data/lib/mongo/error/invalid_update_document.rb +4 -1
  145. data/lib/mongo/error/invalid_uri.rb +4 -1
  146. data/lib/mongo/error/invalid_write_concern.rb +6 -3
  147. data/lib/mongo/error/kms_error.rb +25 -0
  148. data/lib/mongo/error/lint_error.rb +4 -1
  149. data/lib/mongo/error/max_bson_size.rb +18 -4
  150. data/lib/mongo/error/max_message_size.rb +4 -1
  151. data/lib/mongo/error/mismatched_domain.rb +4 -1
  152. data/lib/mongo/error/missing_file_chunk.rb +4 -1
  153. data/lib/mongo/error/missing_password.rb +32 -0
  154. data/lib/mongo/error/missing_resume_token.rb +4 -1
  155. data/lib/mongo/error/missing_scram_server_signature.rb +30 -0
  156. data/lib/mongo/error/missing_service_id.rb +26 -0
  157. data/lib/mongo/error/mongocryptd_spawn_error.rb +25 -0
  158. data/lib/mongo/error/multi_index_drop.rb +4 -1
  159. data/lib/mongo/error/need_primary_server.rb +4 -1
  160. data/lib/mongo/error/no_server_available.rb +17 -5
  161. data/lib/mongo/error/no_service_connection_available.rb +49 -0
  162. data/lib/mongo/error/no_srv_records.rb +4 -1
  163. data/lib/mongo/error/notable.rb +90 -0
  164. data/lib/mongo/error/operation_failure.rb +168 -45
  165. data/lib/mongo/error/parser.rb +174 -19
  166. data/lib/mongo/error/pool_closed_error.rb +53 -0
  167. data/lib/mongo/error/raise_original_error.rb +32 -0
  168. data/lib/mongo/error/sdam_error_detection.rb +83 -0
  169. data/lib/mongo/error/server_api_conflict.rb +26 -0
  170. data/lib/mongo/error/server_api_not_supported.rb +27 -0
  171. data/lib/mongo/error/server_certificate_revoked.rb +25 -0
  172. data/lib/mongo/error/session_ended.rb +30 -0
  173. data/lib/mongo/error/sessions_not_supported.rb +38 -0
  174. data/lib/mongo/error/socket_error.rb +4 -1
  175. data/lib/mongo/error/socket_timeout_error.rb +4 -1
  176. data/lib/mongo/error/unchangeable_collection_option.rb +4 -1
  177. data/lib/mongo/error/unexpected_chunk_length.rb +4 -1
  178. data/lib/mongo/error/unexpected_response.rb +4 -1
  179. data/lib/mongo/error/unknown_payload_type.rb +4 -1
  180. data/lib/mongo/error/unmet_dependency.rb +24 -0
  181. data/lib/mongo/error/unsupported_array_filters.rb +10 -2
  182. data/lib/mongo/error/unsupported_collation.rb +10 -2
  183. data/lib/mongo/error/unsupported_features.rb +4 -1
  184. data/lib/mongo/error/unsupported_message_type.rb +4 -1
  185. data/lib/mongo/error/unsupported_option.rb +104 -0
  186. data/lib/mongo/error/write_retryable.rb +4 -1
  187. data/lib/mongo/error.rb +82 -7
  188. data/lib/mongo/event/base.rb +15 -3
  189. data/lib/mongo/event/listeners.rb +4 -1
  190. data/lib/mongo/event/publisher.rb +4 -1
  191. data/lib/mongo/event/subscriber.rb +4 -1
  192. data/lib/mongo/event.rb +8 -7
  193. data/lib/mongo/grid/file/chunk.rb +8 -5
  194. data/lib/mongo/grid/file/info.rb +14 -4
  195. data/lib/mongo/grid/file.rb +9 -1
  196. data/lib/mongo/grid/fs_bucket.rb +143 -62
  197. data/lib/mongo/grid/stream/read.rb +68 -31
  198. data/lib/mongo/grid/stream/write.rb +34 -9
  199. data/lib/mongo/grid/stream.rb +4 -1
  200. data/lib/mongo/grid.rb +4 -1
  201. data/lib/mongo/id.rb +69 -0
  202. data/lib/mongo/index/view.rb +94 -46
  203. data/lib/mongo/index.rb +5 -1
  204. data/lib/mongo/lint.rb +65 -5
  205. data/lib/mongo/loggable.rb +9 -2
  206. data/lib/mongo/logger.rb +7 -6
  207. data/lib/mongo/monitoring/cmap_log_subscriber.rb +56 -0
  208. data/lib/mongo/monitoring/command_log_subscriber.rb +24 -4
  209. data/lib/mongo/monitoring/event/cmap/base.rb +31 -0
  210. data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +88 -0
  211. data/lib/mongo/monitoring/event/cmap/connection_check_out_started.rb +59 -0
  212. data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +74 -0
  213. data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +75 -0
  214. data/lib/mongo/monitoring/event/cmap/connection_closed.rb +106 -0
  215. data/lib/mongo/monitoring/event/cmap/connection_created.rb +67 -0
  216. data/lib/mongo/monitoring/event/cmap/connection_ready.rb +67 -0
  217. data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +63 -0
  218. data/lib/mongo/monitoring/event/cmap/pool_closed.rb +68 -0
  219. data/lib/mongo/monitoring/event/cmap/pool_created.rb +75 -0
  220. data/lib/mongo/monitoring/event/cmap.rb +28 -0
  221. data/lib/mongo/monitoring/event/command_failed.rb +44 -6
  222. data/lib/mongo/monitoring/event/command_started.rb +90 -5
  223. data/lib/mongo/monitoring/event/command_succeeded.rb +41 -4
  224. data/lib/mongo/monitoring/event/secure.rb +45 -5
  225. data/lib/mongo/monitoring/event/server_closed.rb +17 -1
  226. data/lib/mongo/monitoring/event/server_description_changed.rb +43 -2
  227. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +92 -0
  228. data/lib/mongo/monitoring/event/server_heartbeat_started.rb +65 -0
  229. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +84 -0
  230. data/lib/mongo/monitoring/event/server_opening.rb +11 -4
  231. data/lib/mongo/monitoring/event/topology_changed.rb +12 -6
  232. data/lib/mongo/monitoring/event/topology_closed.rb +17 -1
  233. data/lib/mongo/monitoring/event/topology_opening.rb +11 -4
  234. data/lib/mongo/monitoring/event.rb +8 -1
  235. data/lib/mongo/monitoring/publishable.rb +49 -49
  236. data/lib/mongo/monitoring/sdam_log_subscriber.rb +4 -1
  237. data/lib/mongo/monitoring/server_closed_log_subscriber.rb +4 -1
  238. data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +13 -2
  239. data/lib/mongo/monitoring/server_opening_log_subscriber.rb +4 -1
  240. data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +8 -5
  241. data/lib/mongo/monitoring/topology_closed_log_subscriber.rb +33 -0
  242. data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +5 -2
  243. data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +65 -0
  244. data/lib/mongo/monitoring.rb +116 -10
  245. data/lib/mongo/operation/aggregate/command.rb +17 -21
  246. data/lib/mongo/operation/aggregate/op_msg.rb +7 -30
  247. data/lib/mongo/operation/aggregate/result.rb +28 -11
  248. data/lib/mongo/operation/aggregate.rb +6 -20
  249. data/lib/mongo/operation/collections_info/command.rb +48 -0
  250. data/lib/mongo/operation/collections_info/result.rb +23 -3
  251. data/lib/mongo/operation/collections_info.rb +18 -29
  252. data/lib/mongo/operation/command/command.rb +6 -3
  253. data/lib/mongo/operation/command/op_msg.rb +5 -27
  254. data/lib/mongo/operation/command.rb +5 -19
  255. data/lib/mongo/operation/context.rb +120 -0
  256. data/lib/mongo/operation/count/command.rb +12 -3
  257. data/lib/mongo/operation/count/op_msg.rb +7 -7
  258. data/lib/mongo/operation/count.rb +5 -19
  259. data/lib/mongo/operation/create/command.rb +13 -4
  260. data/lib/mongo/operation/create/op_msg.rb +9 -16
  261. data/lib/mongo/operation/create.rb +5 -19
  262. data/lib/mongo/operation/create_index/command.rb +24 -5
  263. data/lib/mongo/operation/create_index/op_msg.rb +24 -20
  264. data/lib/mongo/operation/create_index.rb +5 -19
  265. data/lib/mongo/operation/create_user/command.rb +8 -4
  266. data/lib/mongo/operation/create_user/op_msg.rb +7 -19
  267. data/lib/mongo/operation/create_user.rb +5 -19
  268. data/lib/mongo/operation/delete/bulk_result.rb +7 -2
  269. data/lib/mongo/operation/delete/command.rb +15 -22
  270. data/lib/mongo/operation/delete/legacy.rb +15 -20
  271. data/lib/mongo/operation/delete/op_msg.rb +20 -28
  272. data/lib/mongo/operation/delete/result.rb +9 -3
  273. data/lib/mongo/operation/delete.rb +4 -1
  274. data/lib/mongo/operation/distinct/command.rb +12 -3
  275. data/lib/mongo/operation/distinct/op_msg.rb +9 -16
  276. data/lib/mongo/operation/distinct.rb +5 -19
  277. data/lib/mongo/operation/drop/command.rb +6 -3
  278. data/lib/mongo/operation/drop/op_msg.rb +6 -20
  279. data/lib/mongo/operation/drop.rb +5 -19
  280. data/lib/mongo/operation/drop_database/command.rb +6 -3
  281. data/lib/mongo/operation/drop_database/op_msg.rb +6 -20
  282. data/lib/mongo/operation/drop_database.rb +5 -19
  283. data/lib/mongo/operation/drop_index/command.rb +7 -4
  284. data/lib/mongo/operation/drop_index/op_msg.rb +7 -19
  285. data/lib/mongo/operation/drop_index.rb +5 -19
  286. data/lib/mongo/operation/explain/command.rb +23 -19
  287. data/lib/mongo/operation/explain/legacy.rb +18 -19
  288. data/lib/mongo/operation/explain/op_msg.rb +17 -26
  289. data/lib/mongo/operation/explain/result.rb +8 -2
  290. data/lib/mongo/operation/explain.rb +5 -21
  291. data/lib/mongo/operation/find/builder/command.rb +110 -0
  292. data/lib/mongo/operation/find/builder/flags.rb +61 -0
  293. data/lib/mongo/operation/find/builder/legacy.rb +123 -0
  294. data/lib/mongo/operation/find/builder/modifiers.rb +89 -0
  295. data/lib/mongo/operation/find/builder.rb +21 -0
  296. data/lib/mongo/operation/find/command.rb +16 -19
  297. data/lib/mongo/operation/find/legacy/result.rb +8 -2
  298. data/lib/mongo/operation/find/legacy.rb +16 -19
  299. data/lib/mongo/operation/find/op_msg.rb +17 -33
  300. data/lib/mongo/operation/find/result.rb +18 -2
  301. data/lib/mongo/operation/find.rb +6 -21
  302. data/lib/mongo/operation/get_more/command.rb +8 -19
  303. data/lib/mongo/operation/get_more/command_builder.rb +38 -0
  304. data/lib/mongo/operation/get_more/legacy.rb +5 -2
  305. data/lib/mongo/operation/get_more/op_msg.rb +10 -37
  306. data/lib/mongo/operation/get_more/result.rb +17 -2
  307. data/lib/mongo/operation/get_more.rb +6 -11
  308. data/lib/mongo/operation/indexes/command.rb +7 -19
  309. data/lib/mongo/operation/indexes/legacy.rb +11 -20
  310. data/lib/mongo/operation/indexes/op_msg.rb +7 -30
  311. data/lib/mongo/operation/indexes/result.rb +10 -2
  312. data/lib/mongo/operation/indexes.rb +15 -17
  313. data/lib/mongo/operation/insert/bulk_result.rb +15 -3
  314. data/lib/mongo/operation/insert/command.rb +14 -20
  315. data/lib/mongo/operation/insert/legacy.rb +15 -19
  316. data/lib/mongo/operation/insert/op_msg.rb +17 -27
  317. data/lib/mongo/operation/insert/result.rb +16 -5
  318. data/lib/mongo/operation/insert.rb +6 -2
  319. data/lib/mongo/operation/kill_cursors/command.rb +14 -3
  320. data/lib/mongo/operation/kill_cursors/command_builder.rb +35 -0
  321. data/lib/mongo/operation/kill_cursors/legacy.rb +7 -3
  322. data/lib/mongo/operation/kill_cursors/op_msg.rb +12 -16
  323. data/lib/mongo/operation/kill_cursors.rb +6 -21
  324. data/lib/mongo/operation/list_collections/command.rb +9 -23
  325. data/lib/mongo/operation/list_collections/op_msg.rb +9 -31
  326. data/lib/mongo/operation/list_collections/result.rb +20 -3
  327. data/lib/mongo/operation/list_collections.rb +5 -19
  328. data/lib/mongo/operation/map_reduce/command.rb +15 -19
  329. data/lib/mongo/operation/map_reduce/op_msg.rb +8 -31
  330. data/lib/mongo/operation/map_reduce/result.rb +15 -2
  331. data/lib/mongo/operation/map_reduce.rb +5 -19
  332. data/lib/mongo/operation/op_msg_base.rb +33 -0
  333. data/lib/mongo/operation/parallel_scan/command.rb +13 -23
  334. data/lib/mongo/operation/parallel_scan/op_msg.rb +12 -30
  335. data/lib/mongo/operation/parallel_scan/result.rb +9 -2
  336. data/lib/mongo/operation/parallel_scan.rb +5 -19
  337. data/lib/mongo/operation/remove_user/command.rb +8 -4
  338. data/lib/mongo/operation/remove_user/op_msg.rb +7 -19
  339. data/lib/mongo/operation/remove_user.rb +5 -19
  340. data/lib/mongo/operation/result.rb +157 -40
  341. data/lib/mongo/operation/shared/bypass_document_validation.rb +14 -4
  342. data/lib/mongo/operation/shared/causal_consistency_supported.rb +19 -7
  343. data/lib/mongo/operation/shared/executable.rb +97 -13
  344. data/lib/mongo/operation/shared/executable_no_validate.rb +32 -0
  345. data/lib/mongo/operation/shared/executable_transaction_label.rb +30 -0
  346. data/lib/mongo/operation/shared/idable.rb +6 -2
  347. data/lib/mongo/operation/shared/limited.rb +14 -2
  348. data/lib/mongo/operation/shared/object_id_generator.rb +5 -1
  349. data/lib/mongo/operation/shared/op_msg_or_command.rb +41 -0
  350. data/lib/mongo/operation/shared/op_msg_or_find_command.rb +44 -0
  351. data/lib/mongo/operation/shared/polymorphic_lookup.rb +36 -0
  352. data/lib/mongo/operation/shared/polymorphic_operation.rb +42 -0
  353. data/lib/mongo/operation/shared/polymorphic_result.rb +50 -0
  354. data/lib/mongo/operation/shared/read_preference_supported.rb +82 -23
  355. data/lib/mongo/operation/shared/response_handling.rb +173 -0
  356. data/lib/mongo/operation/shared/result/aggregatable.rb +8 -9
  357. data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +32 -0
  358. data/lib/mongo/operation/shared/sessions_supported.rb +152 -46
  359. data/lib/mongo/operation/shared/specifiable.rb +40 -56
  360. data/lib/mongo/operation/shared/validatable.rb +87 -0
  361. data/lib/mongo/operation/shared/write.rb +33 -24
  362. data/lib/mongo/operation/shared/write_concern_supported.rb +10 -6
  363. data/lib/mongo/operation/update/bulk_result.rb +5 -2
  364. data/lib/mongo/operation/update/command.rb +15 -22
  365. data/lib/mongo/operation/update/legacy/result.rb +13 -2
  366. data/lib/mongo/operation/update/legacy.rb +25 -29
  367. data/lib/mongo/operation/update/op_msg.rb +18 -30
  368. data/lib/mongo/operation/update/result.rb +14 -3
  369. data/lib/mongo/operation/update.rb +4 -1
  370. data/lib/mongo/operation/update_user/command.rb +8 -4
  371. data/lib/mongo/operation/update_user/op_msg.rb +7 -19
  372. data/lib/mongo/operation/update_user.rb +5 -19
  373. data/lib/mongo/operation/users_info/command.rb +8 -20
  374. data/lib/mongo/operation/users_info/op_msg.rb +8 -29
  375. data/lib/mongo/operation/users_info/result.rb +8 -2
  376. data/lib/mongo/operation/users_info.rb +5 -19
  377. data/lib/mongo/operation/write_command/command.rb +51 -0
  378. data/lib/mongo/operation/write_command/op_msg.rb +43 -0
  379. data/lib/mongo/operation/write_command.rb +32 -0
  380. data/lib/mongo/operation.rb +26 -1
  381. data/lib/mongo/options/mapper.rb +13 -3
  382. data/lib/mongo/options/redacted.rb +4 -1
  383. data/lib/mongo/options.rb +4 -1
  384. data/lib/mongo/protocol/bit_vector.rb +6 -2
  385. data/lib/mongo/protocol/compressed.rb +62 -14
  386. data/lib/mongo/protocol/delete.rb +4 -1
  387. data/lib/mongo/protocol/get_more.rb +6 -2
  388. data/lib/mongo/protocol/insert.rb +7 -2
  389. data/lib/mongo/protocol/kill_cursors.rb +10 -14
  390. data/lib/mongo/protocol/message.rb +161 -29
  391. data/lib/mongo/protocol/msg.rb +271 -41
  392. data/lib/mongo/protocol/query.rb +98 -43
  393. data/lib/mongo/protocol/registry.rb +4 -1
  394. data/lib/mongo/protocol/reply.rb +4 -1
  395. data/lib/mongo/protocol/serializers.rb +67 -20
  396. data/lib/mongo/protocol/update.rb +10 -3
  397. data/lib/mongo/protocol.rb +3 -0
  398. data/lib/mongo/query_cache.rb +275 -0
  399. data/lib/mongo/retryable.rb +391 -72
  400. data/lib/mongo/semaphore.rb +49 -0
  401. data/lib/mongo/server/app_metadata.rb +267 -0
  402. data/lib/mongo/server/connection.rb +197 -135
  403. data/lib/mongo/server/connection_base.rb +276 -0
  404. data/lib/mongo/server/connection_common.rb +205 -0
  405. data/lib/mongo/server/connection_pool/generation_manager.rb +71 -0
  406. data/lib/mongo/server/connection_pool/populator.rb +61 -0
  407. data/lib/mongo/server/connection_pool.rb +792 -58
  408. data/lib/mongo/server/description/features.rb +50 -17
  409. data/lib/mongo/server/description/load_balancer.rb +33 -0
  410. data/lib/mongo/server/description.rb +314 -75
  411. data/lib/mongo/server/monitor/app_metadata.rb +37 -0
  412. data/lib/mongo/server/monitor/connection.rb +178 -112
  413. data/lib/mongo/server/monitor.rb +246 -110
  414. data/lib/mongo/server/pending_connection.rb +288 -0
  415. data/lib/mongo/server/push_monitor/connection.rb +31 -0
  416. data/lib/mongo/server/push_monitor.rb +194 -0
  417. data/lib/mongo/server/round_trip_time_averager.rb +76 -0
  418. data/lib/mongo/server.rb +416 -73
  419. data/lib/mongo/server_selector/base.rb +629 -0
  420. data/lib/mongo/server_selector/nearest.rb +32 -25
  421. data/lib/mongo/server_selector/primary.rb +30 -32
  422. data/lib/mongo/server_selector/primary_preferred.rb +38 -29
  423. data/lib/mongo/server_selector/secondary.rb +32 -25
  424. data/lib/mongo/server_selector/secondary_preferred.rb +30 -38
  425. data/lib/mongo/server_selector.rb +15 -2
  426. data/lib/mongo/session/server_session.rb +21 -7
  427. data/lib/mongo/session/session_pool.rb +32 -9
  428. data/lib/mongo/session.rb +747 -375
  429. data/lib/mongo/socket/ocsp_cache.rb +100 -0
  430. data/lib/mongo/socket/ocsp_verifier.rb +345 -0
  431. data/lib/mongo/socket/ssl.rb +285 -69
  432. data/lib/mongo/socket/tcp.rb +49 -33
  433. data/lib/mongo/socket/unix.rb +24 -34
  434. data/lib/mongo/socket.rb +218 -48
  435. data/lib/mongo/srv/monitor.rb +113 -0
  436. data/lib/mongo/srv/resolver.rb +137 -0
  437. data/lib/mongo/srv/result.rb +128 -0
  438. data/lib/mongo/srv.rb +20 -0
  439. data/lib/mongo/timeout.rb +54 -0
  440. data/lib/mongo/topology_version.rb +92 -0
  441. data/lib/mongo/uri/options_mapper.rb +624 -0
  442. data/lib/mongo/uri/srv_protocol.rb +141 -60
  443. data/lib/mongo/uri.rb +194 -302
  444. data/lib/mongo/utils.rb +111 -0
  445. data/lib/mongo/version.rb +5 -2
  446. data/lib/mongo/write_concern/acknowledged.rb +17 -4
  447. data/lib/mongo/write_concern/base.rb +70 -0
  448. data/lib/mongo/write_concern/unacknowledged.rb +17 -4
  449. data/lib/mongo/write_concern.rb +19 -35
  450. data/lib/mongo.rb +65 -3
  451. data/mongo.gemspec +15 -9
  452. data/spec/NOTES.aws-auth.md +296 -0
  453. data/spec/README.aws-auth.md +318 -0
  454. data/spec/README.md +715 -0
  455. data/spec/USERS.md +72 -0
  456. data/spec/atlas/atlas_connectivity_spec.rb +10 -37
  457. data/spec/atlas/operations_spec.rb +28 -0
  458. data/spec/integration/auth_spec.rb +309 -0
  459. data/spec/integration/awaited_ismaster_spec.rb +31 -0
  460. data/spec/integration/aws_auth_request_spec.rb +77 -0
  461. data/spec/integration/aws_credentials_retriever_spec.rb +106 -0
  462. data/spec/integration/bson_symbol_spec.rb +39 -0
  463. data/spec/integration/bulk_insert_spec.rb +8 -3
  464. data/spec/integration/bulk_write_error_message_spec.rb +41 -0
  465. data/spec/integration/bulk_write_spec.rb +70 -0
  466. data/spec/integration/change_stream_examples_spec.rb +60 -42
  467. data/spec/integration/change_stream_spec.rb +499 -56
  468. data/spec/integration/check_clean_slate_spec.rb +19 -0
  469. data/spec/integration/client_authentication_options_spec.rb +514 -0
  470. data/spec/integration/client_connectivity_spec.rb +41 -0
  471. data/spec/integration/client_construction_aws_auth_spec.rb +194 -0
  472. data/spec/integration/client_construction_spec.rb +293 -0
  473. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +360 -0
  474. data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +306 -0
  475. data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +75 -0
  476. data/spec/integration/client_side_encryption/auto_encryption_old_wire_version_spec.rb +82 -0
  477. data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +224 -0
  478. data/spec/integration/client_side_encryption/auto_encryption_spec.rb +604 -0
  479. data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +190 -0
  480. data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +81 -0
  481. data/spec/integration/client_side_encryption/client_close_spec.rb +66 -0
  482. data/spec/integration/client_side_encryption/corpus_spec.rb +236 -0
  483. data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +135 -0
  484. data/spec/integration/client_side_encryption/data_key_spec.rb +168 -0
  485. data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +117 -0
  486. data/spec/integration/client_side_encryption/external_key_vault_spec.rb +144 -0
  487. data/spec/integration/client_side_encryption/views_spec.rb +47 -0
  488. data/spec/integration/client_spec.rb +49 -0
  489. data/spec/integration/client_update_spec.rb +157 -0
  490. data/spec/integration/collection_indexes_prose_spec.rb +58 -0
  491. data/spec/integration/command_monitoring_spec.rb +145 -53
  492. data/spec/integration/command_spec.rb +179 -0
  493. data/spec/integration/connect_single_rs_name_spec.rb +75 -0
  494. data/spec/integration/connection_pool_populator_spec.rb +305 -0
  495. data/spec/integration/connection_spec.rb +353 -0
  496. data/spec/integration/crud_spec.rb +366 -0
  497. data/spec/integration/cursor_pinning_spec.rb +121 -0
  498. data/spec/integration/cursor_reaping_spec.rb +143 -0
  499. data/spec/integration/docs_examples_spec.rb +18 -5
  500. data/spec/integration/error_detection_spec.rb +42 -0
  501. data/spec/integration/fork_reconnect_spec.rb +200 -0
  502. data/spec/integration/get_more_spec.rb +42 -0
  503. data/spec/integration/grid_fs_bucket_spec.rb +51 -0
  504. data/spec/integration/heartbeat_events_spec.rb +102 -0
  505. data/spec/integration/map_reduce_spec.rb +77 -0
  506. data/spec/integration/mmapv1_spec.rb +31 -0
  507. data/spec/integration/mongos_pinning_spec.rb +37 -0
  508. data/spec/integration/ocsp_connectivity_spec.rb +29 -0
  509. data/spec/integration/ocsp_verifier_cache_spec.rb +191 -0
  510. data/spec/integration/ocsp_verifier_spec.rb +355 -0
  511. data/spec/integration/operation_failure_code_spec.rb +29 -0
  512. data/spec/integration/operation_failure_message_spec.rb +90 -0
  513. data/spec/integration/query_cache_spec.rb +1093 -0
  514. data/spec/integration/query_cache_transactions_spec.rb +193 -0
  515. data/spec/integration/read_concern_spec.rb +92 -0
  516. data/spec/integration/read_preference_spec.rb +544 -0
  517. data/spec/integration/reconnect_spec.rb +176 -12
  518. data/spec/integration/retryable_errors_spec.rb +286 -0
  519. data/spec/integration/retryable_writes/retryable_writes_36_and_older_spec.rb +764 -0
  520. data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +405 -0
  521. data/spec/integration/retryable_writes/shared/adds_diagnostics.rb +18 -0
  522. data/spec/integration/retryable_writes/shared/does_not_support_retries.rb +27 -0
  523. data/spec/integration/retryable_writes/shared/only_supports_legacy_retries.rb +28 -0
  524. data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +220 -0
  525. data/spec/integration/retryable_writes/shared/performs_modern_retries.rb +235 -0
  526. data/spec/integration/retryable_writes/shared/performs_no_retries.rb +113 -0
  527. data/spec/integration/retryable_writes/shared/supports_legacy_retries.rb +22 -0
  528. data/spec/integration/retryable_writes/shared/supports_modern_retries.rb +28 -0
  529. data/spec/integration/retryable_writes/shared/supports_retries.rb +19 -0
  530. data/spec/integration/retryable_writes_errors_spec.rb +34 -0
  531. data/spec/integration/sdam_error_handling_spec.rb +426 -0
  532. data/spec/integration/sdam_events_spec.rb +138 -0
  533. data/spec/integration/sdam_prose_spec.rb +67 -0
  534. data/spec/integration/secondary_reads_spec.rb +102 -0
  535. data/spec/integration/server_description_spec.rb +48 -0
  536. data/spec/integration/server_monitor_spec.rb +56 -0
  537. data/spec/integration/server_selection_spec.rb +39 -0
  538. data/spec/integration/server_selector_spec.rb +105 -0
  539. data/spec/integration/server_spec.rb +69 -0
  540. data/spec/integration/shell_examples_spec.rb +3 -0
  541. data/spec/integration/size_limit_spec.rb +115 -0
  542. data/spec/integration/snappy_compression_spec.rb +28 -0
  543. data/spec/integration/srv_monitoring_spec.rb +406 -0
  544. data/spec/integration/srv_spec.rb +59 -0
  545. data/spec/integration/ssl_uri_options_spec.rb +28 -0
  546. data/spec/integration/step_down_spec.rb +207 -0
  547. data/spec/integration/time_zone_querying_spec.rb +55 -0
  548. data/spec/integration/transaction_pinning_spec.rb +120 -0
  549. data/spec/integration/transactions_api_examples_spec.rb +62 -0
  550. data/spec/integration/transactions_examples_spec.rb +42 -19
  551. data/spec/integration/truncated_utf8_spec.rb +26 -0
  552. data/spec/integration/versioned_api_examples_spec.rb +114 -0
  553. data/spec/integration/x509_auth_spec.rb +112 -0
  554. data/spec/integration/zlib_compression_spec.rb +28 -0
  555. data/spec/integration/zstd_compression_spec.rb +29 -0
  556. data/spec/kerberos/kerberos_spec.rb +94 -0
  557. data/spec/lite_spec_helper.rb +146 -47
  558. data/spec/mongo/address/ipv4_spec.rb +8 -1
  559. data/spec/mongo/address/ipv6_spec.rb +7 -0
  560. data/spec/mongo/address/unix_spec.rb +4 -0
  561. data/spec/mongo/address/validator_spec.rb +54 -0
  562. data/spec/mongo/address_spec.rb +52 -21
  563. data/spec/mongo/auth/aws/request_region_spec.rb +45 -0
  564. data/spec/mongo/auth/aws/request_spec.rb +79 -0
  565. data/spec/mongo/auth/cr_spec.rb +26 -38
  566. data/spec/mongo/auth/gssapi/conversation_spec.rb +124 -0
  567. data/spec/mongo/auth/invalid_mechanism_spec.rb +14 -0
  568. data/spec/mongo/auth/ldap/conversation_spec.rb +6 -3
  569. data/spec/mongo/auth/ldap_spec.rb +19 -34
  570. data/spec/mongo/auth/scram/conversation_spec.rb +124 -323
  571. data/spec/mongo/auth/scram256/conversation_spec.rb +174 -0
  572. data/spec/mongo/auth/scram_negotiation_spec.rb +531 -0
  573. data/spec/mongo/auth/scram_spec.rb +61 -108
  574. data/spec/mongo/auth/stringprep/profiles/sasl_spec.rb +3 -0
  575. data/spec/mongo/auth/stringprep_spec.rb +3 -0
  576. data/spec/mongo/auth/user/view_spec.rb +162 -19
  577. data/spec/mongo/auth/user_spec.rb +164 -11
  578. data/spec/mongo/auth/x509/conversation_spec.rb +8 -5
  579. data/spec/mongo/auth/x509_spec.rb +43 -32
  580. data/spec/mongo/auth_spec.rb +7 -4
  581. data/spec/mongo/bson_spec.rb +3 -0
  582. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +9 -6
  583. data/spec/mongo/bulk_write/result_spec.rb +14 -7
  584. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +7 -4
  585. data/spec/mongo/bulk_write_spec.rb +333 -129
  586. data/spec/mongo/caching_cursor_spec.rb +73 -0
  587. data/spec/mongo/client_construction_spec.rb +2620 -0
  588. data/spec/mongo/client_encryption_spec.rb +414 -0
  589. data/spec/mongo/client_spec.rb +259 -1034
  590. data/spec/mongo/cluster/cursor_reaper_spec.rb +53 -31
  591. data/spec/mongo/cluster/periodic_executor_spec.rb +21 -0
  592. data/spec/mongo/cluster/socket_reaper_spec.rb +18 -4
  593. data/spec/mongo/cluster/topology/replica_set_spec.rb +253 -267
  594. data/spec/mongo/cluster/topology/sharded_spec.rb +59 -55
  595. data/spec/mongo/cluster/topology/single_spec.rb +94 -31
  596. data/spec/mongo/cluster/topology/unknown_spec.rb +33 -115
  597. data/spec/mongo/cluster/topology_spec.rb +114 -13
  598. data/spec/mongo/cluster_spec.rb +400 -262
  599. data/spec/mongo/cluster_time_spec.rb +151 -0
  600. data/spec/mongo/collection/view/aggregation_spec.rb +65 -32
  601. data/spec/mongo/collection/view/builder/find_command_spec.rb +24 -6
  602. data/spec/mongo/collection/view/builder/op_query_spec.rb +7 -0
  603. data/spec/mongo/collection/view/change_stream_resume_spec.rb +397 -0
  604. data/spec/mongo/collection/view/change_stream_spec.rb +70 -282
  605. data/spec/mongo/collection/view/explainable_spec.rb +91 -5
  606. data/spec/mongo/collection/view/immutable_spec.rb +4 -1
  607. data/spec/mongo/collection/view/iterable_spec.rb +41 -0
  608. data/spec/mongo/collection/view/map_reduce_spec.rb +64 -27
  609. data/spec/mongo/collection/view/readable_spec.rb +133 -45
  610. data/spec/mongo/collection/view/writable_spec.rb +276 -34
  611. data/spec/mongo/collection/view_spec.rb +13 -9
  612. data/spec/mongo/collection_crud_spec.rb +4365 -0
  613. data/spec/mongo/collection_ddl_spec.rb +537 -0
  614. data/spec/mongo/collection_spec.rb +326 -4242
  615. data/spec/mongo/crypt/auto_decryption_context_spec.rb +93 -0
  616. data/spec/mongo/crypt/auto_encrypter_spec.rb +190 -0
  617. data/spec/mongo/crypt/auto_encryption_context_spec.rb +110 -0
  618. data/spec/mongo/crypt/binary_spec.rb +113 -0
  619. data/spec/mongo/crypt/binding/binary_spec.rb +54 -0
  620. data/spec/mongo/crypt/binding/context_spec.rb +255 -0
  621. data/spec/mongo/crypt/binding/helpers_spec.rb +44 -0
  622. data/spec/mongo/crypt/binding/mongocrypt_spec.rb +142 -0
  623. data/spec/mongo/crypt/binding/status_spec.rb +97 -0
  624. data/spec/mongo/crypt/binding/version_spec.rb +20 -0
  625. data/spec/mongo/crypt/binding_unloaded_spec.rb +23 -0
  626. data/spec/mongo/crypt/data_key_context_spec.rb +216 -0
  627. data/spec/mongo/crypt/encryption_io_spec.rb +139 -0
  628. data/spec/mongo/crypt/explicit_decryption_context_spec.rb +75 -0
  629. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +173 -0
  630. data/spec/mongo/crypt/handle_spec.rb +235 -0
  631. data/spec/mongo/crypt/helpers/mongo_crypt_spec_helper.rb +111 -0
  632. data/spec/mongo/crypt/status_spec.rb +150 -0
  633. data/spec/mongo/cursor/builder/get_more_command_spec.rb +20 -4
  634. data/spec/mongo/cursor/builder/op_get_more_spec.rb +20 -4
  635. data/spec/mongo/cursor_spec.rb +315 -49
  636. data/spec/mongo/database_spec.rb +749 -73
  637. data/spec/mongo/dbref_spec.rb +3 -0
  638. data/spec/mongo/distinguishing_semaphore_spec.rb +66 -0
  639. data/spec/mongo/error/bulk_write_error_spec.rb +52 -0
  640. data/spec/mongo/error/crypt_error_spec.rb +29 -0
  641. data/spec/mongo/error/max_bson_size_spec.rb +38 -0
  642. data/spec/mongo/error/no_server_available_spec.rb +35 -0
  643. data/spec/mongo/error/notable_spec.rb +62 -0
  644. data/spec/mongo/error/operation_failure_heavy_spec.rb +61 -0
  645. data/spec/mongo/error/operation_failure_spec.rb +439 -38
  646. data/spec/mongo/error/parser_spec.rb +325 -31
  647. data/spec/mongo/error/unsupported_option_spec.rb +57 -0
  648. data/spec/mongo/event/publisher_spec.rb +3 -0
  649. data/spec/mongo/event/subscriber_spec.rb +3 -0
  650. data/spec/mongo/grid/file/chunk_spec.rb +7 -4
  651. data/spec/mongo/grid/file/info_spec.rb +6 -3
  652. data/spec/mongo/grid/file_spec.rb +4 -1
  653. data/spec/mongo/grid/fs_bucket_spec.rb +76 -70
  654. data/spec/mongo/grid/stream/read_spec.rb +44 -27
  655. data/spec/mongo/grid/stream/write_spec.rb +51 -33
  656. data/spec/mongo/grid/stream_spec.rb +4 -1
  657. data/spec/mongo/id_spec.rb +38 -0
  658. data/spec/mongo/index/view_spec.rb +374 -96
  659. data/spec/mongo/lint_spec.rb +79 -0
  660. data/spec/mongo/logger_spec.rb +16 -11
  661. data/spec/mongo/monitoring/command_log_subscriber_spec.rb +3 -0
  662. data/spec/mongo/monitoring/event/cmap/connection_check_out_failed_spec.rb +26 -0
  663. data/spec/mongo/monitoring/event/cmap/connection_check_out_started_spec.rb +22 -0
  664. data/spec/mongo/monitoring/event/cmap/connection_checked_in_spec.rb +33 -0
  665. data/spec/mongo/monitoring/event/cmap/connection_checked_out_spec.rb +33 -0
  666. data/spec/mongo/monitoring/event/cmap/connection_closed_spec.rb +30 -0
  667. data/spec/mongo/monitoring/event/cmap/connection_created_spec.rb +27 -0
  668. data/spec/mongo/monitoring/event/cmap/connection_ready_spec.rb +27 -0
  669. data/spec/mongo/monitoring/event/cmap/pool_cleared_spec.rb +22 -0
  670. data/spec/mongo/monitoring/event/cmap/pool_closed_spec.rb +29 -0
  671. data/spec/mongo/monitoring/event/cmap/pool_created_spec.rb +36 -0
  672. data/spec/mongo/monitoring/event/command_failed_spec.rb +60 -3
  673. data/spec/mongo/monitoring/event/command_started_spec.rb +4 -1
  674. data/spec/mongo/monitoring/event/command_succeeded_spec.rb +47 -7
  675. data/spec/mongo/monitoring/event/secure_spec.rb +29 -5
  676. data/spec/mongo/monitoring/event/server_closed_spec.rb +38 -0
  677. data/spec/mongo/monitoring/event/server_description_changed_spec.rb +38 -0
  678. data/spec/mongo/monitoring/event/server_heartbeat_failed_spec.rb +34 -0
  679. data/spec/mongo/monitoring/event/server_heartbeat_started_spec.rb +34 -0
  680. data/spec/mongo/monitoring/event/server_heartbeat_succeeded_spec.rb +34 -0
  681. data/spec/mongo/monitoring/event/server_opening_spec.rb +38 -0
  682. data/spec/mongo/monitoring/event/topology_changed_spec.rb +44 -0
  683. data/spec/mongo/monitoring/event/topology_closed_spec.rb +38 -0
  684. data/spec/mongo/monitoring/event/topology_opening_spec.rb +38 -0
  685. data/spec/mongo/monitoring_spec.rb +5 -2
  686. data/spec/mongo/operation/aggregate/result_spec.rb +11 -1
  687. data/spec/mongo/operation/aggregate_spec.rb +7 -3
  688. data/spec/mongo/operation/collections_info_spec.rb +9 -3
  689. data/spec/mongo/operation/command_spec.rb +12 -6
  690. data/spec/mongo/operation/create_index_spec.rb +17 -14
  691. data/spec/mongo/operation/create_user_spec.rb +15 -6
  692. data/spec/mongo/operation/delete/bulk_spec.rb +40 -18
  693. data/spec/mongo/operation/delete/command_spec.rb +6 -2
  694. data/spec/mongo/operation/delete/op_msg_spec.rb +69 -35
  695. data/spec/mongo/operation/delete_spec.rb +35 -17
  696. data/spec/mongo/operation/drop_index_spec.rb +14 -4
  697. data/spec/mongo/operation/find/builder/flags_spec.rb +109 -0
  698. data/spec/mongo/operation/find/builder/modifiers_spec.rb +213 -0
  699. data/spec/mongo/operation/find/legacy_spec.rb +37 -9
  700. data/spec/mongo/operation/get_more_spec.rb +13 -3
  701. data/spec/mongo/operation/indexes_spec.rb +10 -2
  702. data/spec/mongo/operation/insert/bulk_spec.rb +42 -11
  703. data/spec/mongo/operation/insert/command_spec.rb +10 -2
  704. data/spec/mongo/operation/insert/op_msg_spec.rb +100 -57
  705. data/spec/mongo/operation/insert_spec.rb +25 -18
  706. data/spec/mongo/operation/kill_cursors_spec.rb +8 -2
  707. data/spec/mongo/operation/limited_spec.rb +8 -3
  708. data/spec/mongo/operation/map_reduce_spec.rb +10 -4
  709. data/spec/mongo/operation/read_preference_legacy_spec.rb +360 -0
  710. data/spec/mongo/operation/read_preference_op_msg_spec.rb +309 -0
  711. data/spec/mongo/operation/remove_user_spec.rb +15 -5
  712. data/spec/mongo/operation/result_spec.rb +46 -6
  713. data/spec/mongo/operation/specifiable_spec.rb +3 -0
  714. data/spec/mongo/operation/update/bulk_spec.rb +28 -9
  715. data/spec/mongo/operation/update/command_spec.rb +15 -7
  716. data/spec/mongo/operation/update/op_msg_spec.rb +74 -40
  717. data/spec/mongo/operation/update_spec.rb +21 -13
  718. data/spec/mongo/operation/update_user_spec.rb +13 -7
  719. data/spec/mongo/options/redacted_spec.rb +3 -0
  720. data/spec/mongo/protocol/compressed_spec.rb +30 -13
  721. data/spec/mongo/protocol/delete_spec.rb +13 -9
  722. data/spec/mongo/protocol/get_more_spec.rb +13 -9
  723. data/spec/mongo/protocol/insert_spec.rb +13 -9
  724. data/spec/mongo/protocol/kill_cursors_spec.rb +10 -6
  725. data/spec/mongo/protocol/msg_spec.rb +90 -61
  726. data/spec/mongo/protocol/query_spec.rb +19 -16
  727. data/spec/mongo/protocol/registry_spec.rb +4 -1
  728. data/spec/mongo/protocol/reply_spec.rb +4 -1
  729. data/spec/mongo/protocol/update_spec.rb +14 -10
  730. data/spec/mongo/query_cache_middleware_spec.rb +55 -0
  731. data/spec/mongo/query_cache_spec.rb +287 -0
  732. data/spec/mongo/retryable_spec.rb +272 -127
  733. data/spec/mongo/semaphore_spec.rb +54 -0
  734. data/spec/mongo/server/app_metadata_spec.rb +170 -0
  735. data/spec/mongo/server/connection_auth_spec.rb +136 -0
  736. data/spec/mongo/server/connection_common_spec.rb +75 -0
  737. data/spec/mongo/server/connection_pool/populator_spec.rb +106 -0
  738. data/spec/mongo/server/connection_pool_spec.rb +862 -220
  739. data/spec/mongo/server/connection_spec.rb +830 -213
  740. data/spec/mongo/server/description/features_spec.rb +3 -0
  741. data/spec/mongo/server/description_query_methods_spec.rb +291 -0
  742. data/spec/mongo/server/description_spec.rb +619 -713
  743. data/spec/mongo/server/monitor/app_metadata_spec.rb +25 -0
  744. data/spec/mongo/server/monitor/connection_spec.rb +99 -40
  745. data/spec/mongo/server/monitor_spec.rb +180 -103
  746. data/spec/mongo/server/round_trip_time_averager_spec.rb +48 -0
  747. data/spec/mongo/server_selector/nearest_spec.rb +32 -25
  748. data/spec/mongo/server_selector/primary_preferred_spec.rb +35 -28
  749. data/spec/mongo/server_selector/primary_spec.rb +35 -11
  750. data/spec/mongo/server_selector/secondary_preferred_spec.rb +52 -29
  751. data/spec/mongo/server_selector/secondary_spec.rb +27 -20
  752. data/spec/mongo/server_selector_spec.rb +208 -5
  753. data/spec/mongo/server_spec.rb +238 -51
  754. data/spec/mongo/session/server_session_spec.rb +3 -0
  755. data/spec/mongo/session/session_pool_spec.rb +66 -18
  756. data/spec/mongo/session_spec.rb +104 -8
  757. data/spec/mongo/session_transaction_spec.rb +206 -0
  758. data/spec/mongo/socket/ssl_spec.rb +472 -173
  759. data/spec/mongo/socket/tcp_spec.rb +17 -0
  760. data/spec/mongo/socket/unix_spec.rb +13 -9
  761. data/spec/mongo/socket_spec.rb +87 -10
  762. data/spec/mongo/srv/monitor_spec.rb +233 -0
  763. data/spec/mongo/srv/result_spec.rb +57 -0
  764. data/spec/mongo/timeout_spec.rb +42 -0
  765. data/spec/mongo/tls_context_hooks_spec.rb +40 -0
  766. data/spec/mongo/uri/srv_protocol_spec.rb +264 -93
  767. data/spec/mongo/uri_option_parsing_spec.rb +625 -0
  768. data/spec/mongo/uri_spec.rb +373 -89
  769. data/spec/mongo/utils_spec.rb +56 -0
  770. data/spec/mongo/write_concern/acknowledged_spec.rb +3 -0
  771. data/spec/mongo/write_concern/unacknowledged_spec.rb +3 -0
  772. data/spec/mongo/write_concern_spec.rb +72 -4
  773. data/spec/runners/auth.rb +140 -0
  774. data/spec/runners/change_streams/outcome.rb +45 -0
  775. data/spec/runners/change_streams/spec.rb +60 -0
  776. data/spec/runners/change_streams/test.rb +232 -0
  777. data/spec/runners/cmap/verifier.rb +48 -0
  778. data/spec/runners/cmap.rb +373 -0
  779. data/spec/runners/command_monitoring.rb +346 -0
  780. data/spec/runners/connection_string.rb +385 -0
  781. data/spec/runners/crud/context.rb +30 -0
  782. data/spec/runners/crud/operation.rb +471 -0
  783. data/spec/runners/crud/outcome.rb +56 -0
  784. data/spec/runners/crud/requirement.rb +134 -0
  785. data/spec/runners/crud/spec.rb +73 -0
  786. data/spec/runners/crud/test.rb +123 -0
  787. data/spec/runners/crud/test_base.rb +53 -0
  788. data/spec/runners/crud/verifier.rb +217 -0
  789. data/spec/runners/crud.rb +257 -0
  790. data/spec/runners/gridfs.rb +641 -0
  791. data/spec/runners/read_write_concern_document.rb +70 -0
  792. data/spec/runners/sdam/verifier.rb +112 -0
  793. data/spec/runners/sdam.rb +279 -0
  794. data/spec/runners/server_selection.rb +365 -0
  795. data/spec/runners/server_selection_rtt.rb +41 -0
  796. data/spec/runners/transactions/operation.rb +328 -0
  797. data/spec/runners/transactions/spec.rb +29 -0
  798. data/spec/runners/transactions/test.rb +326 -0
  799. data/spec/runners/transactions.rb +104 -0
  800. data/spec/runners/unified/assertions.rb +281 -0
  801. data/spec/runners/unified/change_stream_operations.rb +29 -0
  802. data/spec/runners/unified/crud_operations.rb +206 -0
  803. data/spec/runners/unified/ddl_operations.rb +106 -0
  804. data/spec/runners/unified/entity_map.rb +42 -0
  805. data/spec/runners/unified/error.rb +28 -0
  806. data/spec/runners/unified/event_subscriber.rb +104 -0
  807. data/spec/runners/unified/exceptions.rb +24 -0
  808. data/spec/runners/unified/grid_fs_operations.rb +58 -0
  809. data/spec/runners/unified/support_operations.rb +261 -0
  810. data/spec/runners/unified/test.rb +426 -0
  811. data/spec/runners/unified/test_group.rb +31 -0
  812. data/spec/runners/unified.rb +99 -0
  813. data/spec/shared/LICENSE +20 -0
  814. data/spec/shared/bin/get-mongodb-download-url +17 -0
  815. data/spec/shared/bin/s3-copy +45 -0
  816. data/spec/shared/bin/s3-upload +69 -0
  817. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  818. data/spec/shared/lib/mrss/cluster_config.rb +231 -0
  819. data/spec/shared/lib/mrss/constraints.rb +385 -0
  820. data/spec/shared/lib/mrss/docker_runner.rb +271 -0
  821. data/spec/shared/lib/mrss/event_subscriber.rb +200 -0
  822. data/spec/shared/lib/mrss/lite_constraints.rb +191 -0
  823. data/spec/shared/lib/mrss/server_version_registry.rb +120 -0
  824. data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
  825. data/spec/shared/lib/mrss/utils.rb +15 -0
  826. data/spec/shared/share/Dockerfile.erb +323 -0
  827. data/spec/shared/share/haproxy-1.conf +16 -0
  828. data/spec/shared/share/haproxy-2.conf +17 -0
  829. data/spec/shared/shlib/distro.sh +73 -0
  830. data/spec/shared/shlib/server.sh +367 -0
  831. data/spec/shared/shlib/set_env.sh +131 -0
  832. data/spec/solo/clean_exit_spec.rb +24 -0
  833. data/spec/spec_helper.rb +15 -303
  834. data/spec/spec_tests/auth_spec.rb +58 -0
  835. data/spec/spec_tests/change_streams_spec.rb +60 -9
  836. data/spec/spec_tests/change_streams_unified_spec.rb +13 -0
  837. data/spec/spec_tests/client_side_encryption_spec.rb +14 -0
  838. data/spec/spec_tests/cmap_spec.rb +112 -0
  839. data/spec/spec_tests/collection_management_spec.rb +13 -0
  840. data/spec/spec_tests/command_monitoring_spec.rb +49 -42
  841. data/spec/spec_tests/command_monitoring_unified_spec.rb +13 -0
  842. data/spec/spec_tests/connection_string_spec.rb +6 -111
  843. data/spec/spec_tests/crud_spec.rb +14 -35
  844. data/spec/spec_tests/crud_unified_spec.rb +13 -0
  845. data/spec/spec_tests/data/auth/connection-string.yml +366 -0
  846. data/spec/spec_tests/data/change_streams/change-streams-errors.yml +101 -0
  847. data/spec/spec_tests/data/change_streams/change-streams-resume-allowlist.yml +1173 -0
  848. data/spec/spec_tests/data/change_streams/change-streams-resume-errorLabels.yml +1105 -0
  849. data/spec/spec_tests/data/change_streams/change-streams.yml +535 -0
  850. data/spec/spec_tests/data/change_streams_unified/change-streams.yml +72 -0
  851. data/spec/spec_tests/data/client_side_encryption/aggregate.yml +134 -0
  852. data/spec/spec_tests/data/client_side_encryption/badQueries.yml +526 -0
  853. data/spec/spec_tests/data/client_side_encryption/badSchema.yml +73 -0
  854. data/spec/spec_tests/data/client_side_encryption/basic.yml +116 -0
  855. data/spec/spec_tests/data/client_side_encryption/bulk.yml +88 -0
  856. data/spec/spec_tests/data/client_side_encryption/bypassAutoEncryption.yml +100 -0
  857. data/spec/spec_tests/data/client_side_encryption/bypassedCommand.yml +42 -0
  858. data/spec/spec_tests/data/client_side_encryption/count.yml +61 -0
  859. data/spec/spec_tests/data/client_side_encryption/countDocuments.yml +59 -0
  860. data/spec/spec_tests/data/client_side_encryption/delete.yml +105 -0
  861. data/spec/spec_tests/data/client_side_encryption/distinct.yml +73 -0
  862. data/spec/spec_tests/data/client_side_encryption/explain.yml +64 -0
  863. data/spec/spec_tests/data/client_side_encryption/find.yml +119 -0
  864. data/spec/spec_tests/data/client_side_encryption/findOneAndDelete.yml +57 -0
  865. data/spec/spec_tests/data/client_side_encryption/findOneAndReplace.yml +57 -0
  866. data/spec/spec_tests/data/client_side_encryption/findOneAndUpdate.yml +57 -0
  867. data/spec/spec_tests/data/client_side_encryption/getMore.yml +68 -0
  868. data/spec/spec_tests/data/client_side_encryption/insert.yml +102 -0
  869. data/spec/spec_tests/data/client_side_encryption/keyAltName.yml +71 -0
  870. data/spec/spec_tests/data/client_side_encryption/localKMS.yml +54 -0
  871. data/spec/spec_tests/data/client_side_encryption/localSchema.yml +72 -0
  872. data/spec/spec_tests/data/client_side_encryption/malformedCiphertext.yml +69 -0
  873. data/spec/spec_tests/data/client_side_encryption/maxWireVersion.yml +20 -0
  874. data/spec/spec_tests/data/client_side_encryption/missingKey.yml +49 -0
  875. data/spec/spec_tests/data/client_side_encryption/replaceOne.yml +64 -0
  876. data/spec/spec_tests/data/client_side_encryption/types.yml +527 -0
  877. data/spec/spec_tests/data/client_side_encryption/unsupportedCommand.yml +25 -0
  878. data/spec/spec_tests/data/client_side_encryption/updateMany.yml +77 -0
  879. data/spec/spec_tests/data/client_side_encryption/updateOne.yml +171 -0
  880. data/spec/spec_tests/data/cmap/connection-must-have-id.yml +27 -0
  881. data/spec/spec_tests/data/cmap/connection-must-order-ids.yml +27 -0
  882. data/spec/spec_tests/data/cmap/pool-checkin-destroy-closed.yml +27 -0
  883. data/spec/spec_tests/data/cmap/pool-checkin-destroy-stale.yml +27 -0
  884. data/spec/spec_tests/data/cmap/pool-checkin-make-available.yml +24 -0
  885. data/spec/spec_tests/data/cmap/pool-checkin.yml +19 -0
  886. data/spec/spec_tests/data/cmap/pool-checkout-connection.yml +19 -0
  887. data/spec/spec_tests/data/cmap/pool-checkout-error-closed.yml +36 -0
  888. data/spec/spec_tests/data/cmap/pool-checkout-multiple.yml +37 -0
  889. data/spec/spec_tests/data/cmap/pool-checkout-no-idle.yml +35 -0
  890. data/spec/spec_tests/data/cmap/pool-checkout-no-stale.yml +33 -0
  891. data/spec/spec_tests/data/cmap/pool-close-destroy-conns.yml +28 -0
  892. data/spec/spec_tests/data/cmap/pool-close.yml +11 -0
  893. data/spec/spec_tests/data/cmap/pool-create-max-size.yml +71 -0
  894. data/spec/spec_tests/data/cmap/pool-create-min-size.yml +34 -0
  895. data/spec/spec_tests/data/cmap/pool-create-with-options.yml +21 -0
  896. data/spec/spec_tests/data/cmap/pool-create.yml +12 -0
  897. data/spec/spec_tests/data/cmap/wait-queue-fairness.yml +124 -0
  898. data/spec/spec_tests/data/cmap/wait-queue-timeout.yml +46 -0
  899. data/spec/spec_tests/data/collection_management/timeseries-collection.yml +129 -0
  900. data/spec/spec_tests/data/command_monitoring/bulkWrite.yml +49 -0
  901. data/spec/{support → spec_tests/data}/command_monitoring/command.yml +0 -0
  902. data/spec/{support → spec_tests/data}/command_monitoring/deleteMany.yml +0 -0
  903. data/spec/{support → spec_tests/data}/command_monitoring/deleteOne.yml +0 -0
  904. data/spec/spec_tests/data/command_monitoring/find.yml +266 -0
  905. data/spec/spec_tests/data/command_monitoring/insertMany.yml +75 -0
  906. data/spec/{support → spec_tests/data}/command_monitoring/insertOne.yml +0 -0
  907. data/spec/{support → spec_tests/data}/command_monitoring/unacknowledgedBulkWrite.yml +0 -0
  908. data/spec/spec_tests/data/command_monitoring/updateMany.yml +65 -0
  909. data/spec/spec_tests/data/command_monitoring/updateOne.yml +90 -0
  910. data/spec/spec_tests/data/command_monitoring_unified/redacted-commands.yml +340 -0
  911. data/spec/spec_tests/data/connection_string/invalid-uris.yml +261 -0
  912. data/spec/spec_tests/data/connection_string/valid-auth.yml +257 -0
  913. data/spec/{support/connection_string_tests → spec_tests/data/connection_string}/valid-db-with-dotted-name.yml +0 -0
  914. data/spec/{support/connection_string_tests → spec_tests/data/connection_string}/valid-host_identifiers.yml +0 -0
  915. data/spec/{support/connection_string_tests → spec_tests/data/connection_string}/valid-options.yml +0 -0
  916. data/spec/{support/connection_string_tests → spec_tests/data/connection_string}/valid-unix_socket-absolute.yml +0 -0
  917. data/spec/{support/connection_string_tests → spec_tests/data/connection_string}/valid-unix_socket-relative.yml +0 -0
  918. data/spec/spec_tests/data/connection_string/valid-warnings.yml +75 -0
  919. data/spec/spec_tests/data/crud/read/aggregate-collation.yml +18 -0
  920. data/spec/spec_tests/data/crud/read/aggregate-out.yml +44 -0
  921. data/spec/{support/crud_tests → spec_tests/data/crud}/read/aggregate.yml +0 -0
  922. data/spec/spec_tests/data/crud/read/count-collation.yml +26 -0
  923. data/spec/spec_tests/data/crud/read/count-empty.yml +29 -0
  924. data/spec/{support/crud_tests → spec_tests/data/crud}/read/count.yml +0 -0
  925. data/spec/spec_tests/data/crud/read/distinct-collation.yml +18 -0
  926. data/spec/{support/crud_tests → spec_tests/data/crud}/read/distinct.yml +0 -0
  927. data/spec/spec_tests/data/crud/read/find-collation.yml +16 -0
  928. data/spec/{support/crud_tests → spec_tests/data/crud}/read/find.yml +0 -0
  929. data/spec/spec_tests/data/crud/write/bulkWrite-arrayFilters.yml +45 -0
  930. data/spec/spec_tests/data/crud/write/bulkWrite-collation.yml +102 -0
  931. data/spec/spec_tests/data/crud/write/bulkWrite.yml +405 -0
  932. data/spec/spec_tests/data/crud/write/deleteMany-collation.yml +23 -0
  933. data/spec/{support/crud_tests → spec_tests/data/crud}/write/deleteMany.yml +0 -0
  934. data/spec/spec_tests/data/crud/write/deleteOne-collation.yml +23 -0
  935. data/spec/{support/crud_tests → spec_tests/data/crud}/write/deleteOne.yml +0 -0
  936. data/spec/spec_tests/data/crud/write/findOneAndDelete-collation.yml +24 -0
  937. data/spec/{support/crud_tests → spec_tests/data/crud}/write/findOneAndDelete.yml +0 -0
  938. data/spec/spec_tests/data/crud/write/findOneAndReplace-collation.yml +25 -0
  939. data/spec/{support/crud_tests → spec_tests/data/crud}/write/findOneAndReplace-upsert.yml +0 -0
  940. data/spec/{support/crud_tests → spec_tests/data/crud}/write/findOneAndReplace-upsert_pre_2.6.yml +0 -0
  941. data/spec/{support/crud_tests → spec_tests/data/crud}/write/findOneAndReplace.yml +0 -0
  942. data/spec/{support/crud_tests → spec_tests/data/crud}/write/findOneAndUpdate-arrayFilters.yml +0 -0
  943. data/spec/spec_tests/data/crud/write/findOneAndUpdate-collation.yml +28 -0
  944. data/spec/{support/crud_tests → spec_tests/data/crud}/write/findOneAndUpdate.yml +0 -0
  945. data/spec/spec_tests/data/crud/write/insertMany.yml +81 -0
  946. data/spec/{support/crud_tests → spec_tests/data/crud}/write/insertOne.yml +0 -0
  947. data/spec/spec_tests/data/crud/write/replaceOne-collation.yml +25 -0
  948. data/spec/{support/crud_tests → spec_tests/data/crud}/write/replaceOne-pre_2.6.yml +0 -0
  949. data/spec/{support/crud_tests → spec_tests/data/crud}/write/replaceOne-upsert.yml +0 -0
  950. data/spec/{support/crud_tests → spec_tests/data/crud}/write/replaceOne.yml +0 -0
  951. data/spec/spec_tests/data/crud/write/updateMany-arrayFilters.yml +66 -0
  952. data/spec/spec_tests/data/crud/write/updateMany-collation.yml +29 -0
  953. data/spec/{support/crud_tests → spec_tests/data/crud}/write/updateMany-pre_2.6.yml +0 -0
  954. data/spec/{support/crud_tests → spec_tests/data/crud}/write/updateMany.yml +0 -0
  955. data/spec/spec_tests/data/crud/write/updateOne-arrayFilters.yml +114 -0
  956. data/spec/spec_tests/data/crud/write/updateOne-collation.yml +26 -0
  957. data/spec/{support/crud_tests → spec_tests/data/crud}/write/updateOne-pre_2.6.yml +0 -0
  958. data/spec/{support/crud_tests → spec_tests/data/crud}/write/updateOne.yml +0 -0
  959. data/spec/spec_tests/data/crud_unified/estimatedDocumentCount.yml +267 -0
  960. data/spec/spec_tests/data/crud_unified/updateWithPipelines.yml +305 -0
  961. data/spec/spec_tests/data/crud_v2/aggregate-merge.yml +103 -0
  962. data/spec/spec_tests/data/crud_v2/aggregate-out-readConcern.yml +111 -0
  963. data/spec/spec_tests/data/crud_v2/bulkWrite-arrayFilters.yml +103 -0
  964. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-clientError.yml +63 -0
  965. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-serverError.yml +92 -0
  966. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint.yml +103 -0
  967. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-clientError.yml +90 -0
  968. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-serverError.yml +147 -0
  969. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint.yml +164 -0
  970. data/spec/spec_tests/data/crud_v2/db-aggregate.yml +39 -0
  971. data/spec/spec_tests/data/crud_v2/deleteMany-hint-clientError.yml +43 -0
  972. data/spec/spec_tests/data/crud_v2/deleteMany-hint-serverError.yml +62 -0
  973. data/spec/spec_tests/data/crud_v2/deleteMany-hint.yml +58 -0
  974. data/spec/spec_tests/data/crud_v2/deleteOne-hint-clientError.yml +41 -0
  975. data/spec/spec_tests/data/crud_v2/deleteOne-hint-serverError.yml +60 -0
  976. data/spec/spec_tests/data/crud_v2/deleteOne-hint.yml +57 -0
  977. data/spec/spec_tests/data/crud_v2/find-allowdiskuse-clientError.yml +28 -0
  978. data/spec/spec_tests/data/crud_v2/find-allowdiskuse-serverError.yml +44 -0
  979. data/spec/spec_tests/data/crud_v2/find-allowdiskuse.yml +50 -0
  980. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-clientError.yml +45 -0
  981. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-serverError.yml +60 -0
  982. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint.yml +56 -0
  983. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-clientError.yml +40 -0
  984. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-serverError.yml +59 -0
  985. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint.yml +55 -0
  986. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-clientError.yml +40 -0
  987. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-serverError.yml +58 -0
  988. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint.yml +55 -0
  989. data/spec/spec_tests/data/crud_v2/replaceOne-hint.yml +61 -0
  990. data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-delete-hint-clientError.yml +60 -0
  991. data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-update-hint-clientError.yml +88 -0
  992. data/spec/spec_tests/data/crud_v2/unacknowledged-deleteMany-hint-clientError.yml +40 -0
  993. data/spec/spec_tests/data/crud_v2/unacknowledged-deleteOne-hint-clientError.yml +38 -0
  994. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndDelete-hint-clientError.yml +42 -0
  995. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndReplace-hint-clientError.yml +40 -0
  996. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndUpdate-hint-clientError.yml +40 -0
  997. data/spec/spec_tests/data/crud_v2/unacknowledged-replaceOne-hint-clientError.yml +40 -0
  998. data/spec/spec_tests/data/crud_v2/unacknowledged-updateMany-hint-clientError.yml +43 -0
  999. data/spec/spec_tests/data/crud_v2/unacknowledged-updateOne-hint-clientError.yml +40 -0
  1000. data/spec/spec_tests/data/crud_v2/updateMany-hint-clientError.yml +45 -0
  1001. data/spec/spec_tests/data/crud_v2/updateMany-hint-serverError.yml +66 -0
  1002. data/spec/spec_tests/data/crud_v2/updateMany-hint.yml +65 -0
  1003. data/spec/spec_tests/data/crud_v2/updateOne-hint-clientError.yml +43 -0
  1004. data/spec/spec_tests/data/crud_v2/updateOne-hint-serverError.yml +62 -0
  1005. data/spec/spec_tests/data/crud_v2/updateOne-hint.yml +61 -0
  1006. data/spec/spec_tests/data/crud_v2/updateWithPipelines.yml +157 -0
  1007. data/spec/{support/gridfs_tests → spec_tests/data/gridfs}/delete.yml +0 -0
  1008. data/spec/{support/gridfs_tests → spec_tests/data/gridfs}/download.yml +0 -0
  1009. data/spec/{support/gridfs_tests → spec_tests/data/gridfs}/download_by_name.yml +0 -0
  1010. data/spec/{support/gridfs_tests → spec_tests/data/gridfs}/upload.yml +0 -0
  1011. data/spec/spec_tests/data/load_balancers/event-monitoring.yml +99 -0
  1012. data/spec/spec_tests/data/load_balancers/lb-connection-establishment.yml +36 -0
  1013. data/spec/spec_tests/data/load_balancers/non-lb-connection-establishment.yml +56 -0
  1014. data/spec/spec_tests/data/load_balancers/server-selection.yml +50 -0
  1015. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetNoPrimary/DefaultNoMaxStaleness.yml +0 -0
  1016. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetNoPrimary/Incompatible.yml +0 -0
  1017. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetNoPrimary/LastUpdateTime.yml +0 -0
  1018. data/spec/{support/max_staleness/ReplicaSetNoPrimary/NoKnownServers.yml → spec_tests/data/max_staleness/ReplicaSetNoPrimary/MaxStalenessTooSmall.yml} +0 -0
  1019. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetNoPrimary/Nearest.yml +0 -0
  1020. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetNoPrimary/Nearest2.yml +0 -0
  1021. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/NoKnownServers.yml +16 -0
  1022. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred.yml +0 -0
  1023. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred_tags.yml +0 -0
  1024. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetNoPrimary/Secondary.yml +0 -0
  1025. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred.yml +0 -0
  1026. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred_tags.yml +0 -0
  1027. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetNoPrimary/ZeroMaxStaleness.yml +0 -0
  1028. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/DefaultNoMaxStaleness.yml +0 -0
  1029. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/Incompatible.yml +0 -0
  1030. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/LastUpdateTime.yml +0 -0
  1031. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/LongHeartbeat.yml +0 -0
  1032. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/LongHeartbeat2.yml +0 -0
  1033. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/MaxStalenessTooSmall.yml +0 -0
  1034. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/MaxStalenessWithModePrimary.yml +0 -0
  1035. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/Nearest.yml +0 -0
  1036. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/Nearest2.yml +0 -0
  1037. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/Nearest_tags.yml +0 -0
  1038. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/PrimaryPreferred.yml +0 -0
  1039. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/PrimaryPreferred_incompatible.yml +0 -0
  1040. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred.yml +0 -0
  1041. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags.yml +0 -0
  1042. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags2.yml +0 -0
  1043. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/Secondary_tags.yml +0 -0
  1044. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/Secondary_tags2.yml +0 -0
  1045. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/ZeroMaxStaleness.yml +0 -0
  1046. data/spec/{support → spec_tests/data}/max_staleness/Sharded/Incompatible.yml +0 -0
  1047. data/spec/{support → spec_tests/data}/max_staleness/Sharded/SmallMaxStaleness.yml +0 -0
  1048. data/spec/{support → spec_tests/data}/max_staleness/Single/Incompatible.yml +0 -0
  1049. data/spec/{support → spec_tests/data}/max_staleness/Single/SmallMaxStaleness.yml +0 -0
  1050. data/spec/spec_tests/data/max_staleness/Unknown/SmallMaxStaleness.yml +15 -0
  1051. data/spec/spec_tests/data/read_write_concern/connection-string/read-concern.yml +32 -0
  1052. data/spec/spec_tests/data/read_write_concern/connection-string/write-concern.yml +79 -0
  1053. data/spec/spec_tests/data/read_write_concern/document/read-concern.yml +37 -0
  1054. data/spec/spec_tests/data/read_write_concern/document/write-concern.yml +100 -0
  1055. data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-2.6.yml +215 -0
  1056. data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-3.2.yml +58 -0
  1057. data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-3.4.yml +95 -0
  1058. data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-4.2.yml +36 -0
  1059. data/spec/spec_tests/data/retryable_reads/aggregate-merge.yml +39 -0
  1060. data/spec/spec_tests/data/retryable_reads/aggregate-serverErrors.yml +157 -0
  1061. data/spec/spec_tests/data/retryable_reads/aggregate.yml +87 -0
  1062. data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch-serverErrors.yml +150 -0
  1063. data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch.yml +62 -0
  1064. data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch-serverErrors.yml +150 -0
  1065. data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch.yml +66 -0
  1066. data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch-serverErrors.yml +154 -0
  1067. data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch.yml +62 -0
  1068. data/spec/spec_tests/data/retryable_reads/count-serverErrors.yml +150 -0
  1069. data/spec/spec_tests/data/retryable_reads/count.yml +64 -0
  1070. data/spec/spec_tests/data/retryable_reads/countDocuments-serverErrors.yml +150 -0
  1071. data/spec/spec_tests/data/retryable_reads/countDocuments.yml +64 -0
  1072. data/spec/spec_tests/data/retryable_reads/distinct-serverErrors.yml +156 -0
  1073. data/spec/spec_tests/data/retryable_reads/distinct.yml +71 -0
  1074. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-4.9.yml +60 -0
  1075. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-pre4.9.yml +64 -0
  1076. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors-4.9.yml +146 -0
  1077. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors-pre4.9.yml +150 -0
  1078. data/spec/spec_tests/data/retryable_reads/find-serverErrors.yml +160 -0
  1079. data/spec/spec_tests/data/retryable_reads/find.yml +86 -0
  1080. data/spec/spec_tests/data/retryable_reads/findOne-serverErrors.yml +154 -0
  1081. data/spec/spec_tests/data/retryable_reads/findOne.yml +68 -0
  1082. data/spec/spec_tests/data/retryable_reads/gridfs-download-serverErrors.yml +173 -0
  1083. data/spec/spec_tests/data/retryable_reads/gridfs-download.yml +79 -0
  1084. data/spec/spec_tests/data/retryable_reads/gridfs-downloadByName-serverErrors.yml +174 -0
  1085. data/spec/spec_tests/data/retryable_reads/gridfs-downloadByName.yml +79 -0
  1086. data/spec/spec_tests/data/retryable_reads/listCollectionNames-serverErrors.yml +143 -0
  1087. data/spec/spec_tests/data/retryable_reads/listCollectionNames.yml +59 -0
  1088. data/spec/spec_tests/data/retryable_reads/listCollectionObjects-serverErrors.yml +144 -0
  1089. data/spec/spec_tests/data/retryable_reads/listCollectionObjects.yml +59 -0
  1090. data/spec/spec_tests/data/retryable_reads/listCollections-serverErrors.yml +143 -0
  1091. data/spec/spec_tests/data/retryable_reads/listCollections.yml +59 -0
  1092. data/spec/spec_tests/data/retryable_reads/listDatabaseNames-serverErrors.yml +143 -0
  1093. data/spec/spec_tests/data/retryable_reads/listDatabaseNames.yml +59 -0
  1094. data/spec/spec_tests/data/retryable_reads/listDatabaseObjects-serverErrors.yml +144 -0
  1095. data/spec/spec_tests/data/retryable_reads/listDatabaseObjects.yml +59 -0
  1096. data/spec/spec_tests/data/retryable_reads/listDatabases-serverErrors.yml +144 -0
  1097. data/spec/spec_tests/data/retryable_reads/listDatabases.yml +59 -0
  1098. data/spec/spec_tests/data/retryable_reads/listIndexNames-serverErrors.yml +144 -0
  1099. data/spec/spec_tests/data/retryable_reads/listIndexNames.yml +60 -0
  1100. data/spec/spec_tests/data/retryable_reads/listIndexes-serverErrors.yml +145 -0
  1101. data/spec/spec_tests/data/retryable_reads/listIndexes.yml +60 -0
  1102. data/spec/spec_tests/data/retryable_reads/mapReduce.yml +62 -0
  1103. data/spec/spec_tests/data/retryable_writes/bulkWrite-errorLabels.yml +77 -0
  1104. data/spec/spec_tests/data/retryable_writes/bulkWrite-serverErrors.yml +130 -0
  1105. data/spec/spec_tests/data/retryable_writes/bulkWrite.yml +402 -0
  1106. data/spec/spec_tests/data/retryable_writes/deleteMany.yml +22 -0
  1107. data/spec/spec_tests/data/retryable_writes/deleteOne-errorLabels.yml +48 -0
  1108. data/spec/spec_tests/data/retryable_writes/deleteOne-serverErrors.yml +73 -0
  1109. data/spec/spec_tests/data/retryable_writes/deleteOne.yml +57 -0
  1110. data/spec/spec_tests/data/retryable_writes/findOneAndDelete-errorLabels.yml +49 -0
  1111. data/spec/spec_tests/data/retryable_writes/findOneAndDelete-serverErrors.yml +74 -0
  1112. data/spec/spec_tests/data/retryable_writes/findOneAndDelete.yml +58 -0
  1113. data/spec/spec_tests/data/retryable_writes/findOneAndReplace-errorLabels.yml +52 -0
  1114. data/spec/spec_tests/data/retryable_writes/findOneAndReplace-serverErrors.yml +80 -0
  1115. data/spec/spec_tests/data/retryable_writes/findOneAndReplace.yml +63 -0
  1116. data/spec/spec_tests/data/retryable_writes/findOneAndUpdate-errorLabels.yml +52 -0
  1117. data/spec/spec_tests/data/retryable_writes/findOneAndUpdate-serverErrors.yml +79 -0
  1118. data/spec/spec_tests/data/retryable_writes/findOneAndUpdate.yml +62 -0
  1119. data/spec/spec_tests/data/retryable_writes/insertMany-errorLabels.yml +54 -0
  1120. data/spec/spec_tests/data/retryable_writes/insertMany-serverErrors.yml +84 -0
  1121. data/spec/spec_tests/data/retryable_writes/insertMany.yml +74 -0
  1122. data/spec/spec_tests/data/retryable_writes/insertOne-errorLabels.yml +44 -0
  1123. data/spec/spec_tests/data/retryable_writes/insertOne-serverErrors.yml +527 -0
  1124. data/spec/spec_tests/data/retryable_writes/insertOne.yml +61 -0
  1125. data/spec/spec_tests/data/retryable_writes/replaceOne-errorLabels.yml +53 -0
  1126. data/spec/spec_tests/data/retryable_writes/replaceOne-serverErrors.yml +82 -0
  1127. data/spec/spec_tests/data/retryable_writes/replaceOne.yml +66 -0
  1128. data/spec/spec_tests/data/retryable_writes/updateMany.yml +27 -0
  1129. data/spec/spec_tests/data/retryable_writes/updateOne-errorLabels.yml +53 -0
  1130. data/spec/spec_tests/data/retryable_writes/updateOne-serverErrors.yml +82 -0
  1131. data/spec/spec_tests/data/retryable_writes/updateOne.yml +129 -0
  1132. data/spec/spec_tests/data/sdam/errors/error_handling_handshake.yml +55 -0
  1133. data/spec/spec_tests/data/sdam/errors/non-stale-network-error.yml +47 -0
  1134. data/spec/spec_tests/data/sdam/errors/non-stale-network-timeout-error.yml +38 -0
  1135. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedAtShutdown.yml +61 -0
  1136. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedDueToReplStateChange.yml +61 -0
  1137. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-LegacyNotPrimary.yml +61 -0
  1138. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotPrimaryNoSecondaryOk.yml +61 -0
  1139. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotPrimaryOrSecondary.yml +61 -0
  1140. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotWritablePrimary.yml +61 -0
  1141. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-PrimarySteppedDown.yml +61 -0
  1142. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-ShutdownInProgress.yml +61 -0
  1143. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedAtShutdown.yml +52 -0
  1144. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedDueToReplStateChange.yml +52 -0
  1145. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-LegacyNotPrimary.yml +52 -0
  1146. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotPrimaryNoSecondaryOk.yml +52 -0
  1147. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotPrimaryOrSecondary.yml +52 -0
  1148. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotWritablePrimary.yml +52 -0
  1149. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-PrimarySteppedDown.yml +52 -0
  1150. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-ShutdownInProgress.yml +52 -0
  1151. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedAtShutdown.yml +61 -0
  1152. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedDueToReplStateChange.yml +61 -0
  1153. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-LegacyNotPrimary.yml +61 -0
  1154. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotPrimaryNoSecondaryOk.yml +61 -0
  1155. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotPrimaryOrSecondary.yml +61 -0
  1156. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotWritablePrimary.yml +61 -0
  1157. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-PrimarySteppedDown.yml +61 -0
  1158. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-ShutdownInProgress.yml +61 -0
  1159. data/spec/spec_tests/data/sdam/errors/post-42-InterruptedAtShutdown.yml +47 -0
  1160. data/spec/spec_tests/data/sdam/errors/post-42-InterruptedDueToReplStateChange.yml +47 -0
  1161. data/spec/spec_tests/data/sdam/errors/post-42-LegacyNotPrimary.yml +47 -0
  1162. data/spec/spec_tests/data/sdam/errors/post-42-NotPrimaryNoSecondaryOk.yml +47 -0
  1163. data/spec/spec_tests/data/sdam/errors/post-42-NotPrimaryOrSecondary.yml +47 -0
  1164. data/spec/spec_tests/data/sdam/errors/post-42-NotWritablePrimary.yml +47 -0
  1165. data/spec/spec_tests/data/sdam/errors/post-42-PrimarySteppedDown.yml +47 -0
  1166. data/spec/spec_tests/data/sdam/errors/post-42-ShutdownInProgress.yml +47 -0
  1167. data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedAtShutdown.yml +47 -0
  1168. data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedDueToReplStateChange.yml +47 -0
  1169. data/spec/spec_tests/data/sdam/errors/pre-42-LegacyNotPrimary.yml +47 -0
  1170. data/spec/spec_tests/data/sdam/errors/pre-42-NotPrimaryNoSecondaryOk.yml +47 -0
  1171. data/spec/spec_tests/data/sdam/errors/pre-42-NotPrimaryOrSecondary.yml +47 -0
  1172. data/spec/spec_tests/data/sdam/errors/pre-42-NotWritablePrimary.yml +47 -0
  1173. data/spec/spec_tests/data/sdam/errors/pre-42-PrimarySteppedDown.yml +47 -0
  1174. data/spec/spec_tests/data/sdam/errors/pre-42-ShutdownInProgress.yml +47 -0
  1175. data/spec/spec_tests/data/sdam/errors/prefer-error-code.yml +54 -0
  1176. data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedAtShutdown.yml +91 -0
  1177. data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedDueToReplStateChange.yml +91 -0
  1178. data/spec/spec_tests/data/sdam/errors/stale-generation-NotPrimaryNoSecondaryOk.yml +91 -0
  1179. data/spec/spec_tests/data/sdam/errors/stale-generation-NotPrimaryOrSecondary.yml +91 -0
  1180. data/spec/spec_tests/data/sdam/errors/stale-generation-NotWritablePrimary.yml +91 -0
  1181. data/spec/spec_tests/data/sdam/errors/stale-generation-PrimarySteppedDown.yml +91 -0
  1182. data/spec/spec_tests/data/sdam/errors/stale-generation-ShutdownInProgress.yml +91 -0
  1183. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedAtShutdown.yml +91 -0
  1184. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedDueToReplStateChange.yml +91 -0
  1185. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-LegacyNotPrimary.yml +91 -0
  1186. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotPrimaryNoSecondaryOk.yml +91 -0
  1187. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotPrimaryOrSecondary.yml +91 -0
  1188. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotWritablePrimary.yml +91 -0
  1189. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-PrimarySteppedDown.yml +91 -0
  1190. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-ShutdownInProgress.yml +91 -0
  1191. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-network.yml +82 -0
  1192. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-timeout.yml +82 -0
  1193. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedAtShutdown.yml +91 -0
  1194. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedDueToReplStateChange.yml +91 -0
  1195. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-LegacyNotPrimary.yml +91 -0
  1196. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotPrimaryNoSecondaryOk.yml +91 -0
  1197. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotPrimaryOrSecondary.yml +91 -0
  1198. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotWritablePrimary.yml +91 -0
  1199. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-PrimarySteppedDown.yml +91 -0
  1200. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-ShutdownInProgress.yml +91 -0
  1201. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-network.yml +82 -0
  1202. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-timeout.yml +82 -0
  1203. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedAtShutdown.yml +65 -0
  1204. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedDueToReplStateChange.yml +65 -0
  1205. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-LegacyNotPrimary.yml +65 -0
  1206. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotPrimaryNoSecondaryOk.yml +65 -0
  1207. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotPrimaryOrSecondary.yml +65 -0
  1208. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotWritablePrimary.yml +65 -0
  1209. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-PrimarySteppedDown.yml +65 -0
  1210. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-ShutdownInProgress.yml +65 -0
  1211. data/spec/spec_tests/data/sdam/errors/write_errors_ignored.yml +42 -0
  1212. data/spec/spec_tests/data/sdam/load-balanced/discover_load_balancer.yml +25 -0
  1213. data/spec/spec_tests/data/sdam/rs/compatible.yml +45 -0
  1214. data/spec/spec_tests/data/sdam/rs/compatible_unknown.yml +34 -0
  1215. data/spec/spec_tests/data/sdam/rs/discover_arbiters.yml +44 -0
  1216. data/spec/spec_tests/data/sdam/rs/discover_arbiters_replicaset.yml +44 -0
  1217. data/spec/spec_tests/data/sdam/rs/discover_ghost.yml +36 -0
  1218. data/spec/spec_tests/data/sdam/rs/discover_ghost_replicaset.yml +42 -0
  1219. data/spec/spec_tests/data/sdam/rs/discover_hidden.yml +51 -0
  1220. data/spec/spec_tests/data/sdam/rs/discover_hidden_replicaset.yml +51 -0
  1221. data/spec/spec_tests/data/sdam/rs/discover_passives.yml +83 -0
  1222. data/spec/spec_tests/data/sdam/rs/discover_passives_replicaset.yml +83 -0
  1223. data/spec/spec_tests/data/sdam/rs/discover_primary.yml +43 -0
  1224. data/spec/spec_tests/data/sdam/rs/discover_primary_replicaset.yml +43 -0
  1225. data/spec/spec_tests/data/sdam/rs/discover_rsother.yml +50 -0
  1226. data/spec/spec_tests/data/sdam/rs/discover_rsother_replicaset.yml +68 -0
  1227. data/spec/spec_tests/data/sdam/rs/discover_secondary.yml +44 -0
  1228. data/spec/spec_tests/data/sdam/rs/discover_secondary_replicaset.yml +44 -0
  1229. data/spec/spec_tests/data/sdam/rs/discovery.yml +207 -0
  1230. data/spec/spec_tests/data/sdam/rs/equal_electionids.yml +57 -0
  1231. data/spec/spec_tests/data/sdam/rs/hosts_differ_from_seeds.yml +37 -0
  1232. data/spec/spec_tests/data/sdam/rs/incompatible_arbiter.yml +36 -0
  1233. data/spec/spec_tests/data/sdam/rs/incompatible_ghost.yml +34 -0
  1234. data/spec/spec_tests/data/sdam/rs/incompatible_other.yml +36 -0
  1235. data/spec/spec_tests/data/sdam/rs/ls_timeout.yml +249 -0
  1236. data/spec/spec_tests/data/sdam/rs/member_reconfig.yml +74 -0
  1237. data/spec/spec_tests/data/sdam/rs/member_standalone.yml +66 -0
  1238. data/spec/spec_tests/data/sdam/rs/new_primary.yml +80 -0
  1239. data/spec/spec_tests/data/sdam/rs/new_primary_new_electionid.yml +119 -0
  1240. data/spec/spec_tests/data/sdam/rs/new_primary_new_setversion.yml +119 -0
  1241. data/spec/spec_tests/data/sdam/rs/new_primary_wrong_set_name.yml +77 -0
  1242. data/spec/spec_tests/data/sdam/rs/non_rs_member.yml +33 -0
  1243. data/spec/spec_tests/data/sdam/rs/normalize_case.yml +52 -0
  1244. data/spec/spec_tests/data/sdam/rs/normalize_case_me.yml +102 -0
  1245. data/spec/spec_tests/data/sdam/rs/null_election_id.yml +175 -0
  1246. data/spec/spec_tests/data/sdam/rs/primary_becomes_ghost.yml +65 -0
  1247. data/spec/spec_tests/data/sdam/rs/primary_becomes_mongos.yml +58 -0
  1248. data/spec/spec_tests/data/sdam/rs/primary_becomes_standalone.yml +55 -0
  1249. data/spec/spec_tests/data/sdam/rs/primary_changes_set_name.yml +63 -0
  1250. data/spec/spec_tests/data/sdam/rs/primary_disconnect.yml +59 -0
  1251. data/spec/spec_tests/data/sdam/rs/primary_disconnect_electionid.yml +189 -0
  1252. data/spec/spec_tests/data/sdam/rs/primary_disconnect_setversion.yml +189 -0
  1253. data/spec/spec_tests/data/sdam/rs/primary_hint_from_secondary_with_mismatched_me.yml +64 -0
  1254. data/spec/spec_tests/data/sdam/rs/primary_mismatched_me.yml +27 -0
  1255. data/spec/spec_tests/data/sdam/rs/primary_mismatched_me_not_removed.yml +75 -0
  1256. data/spec/spec_tests/data/sdam/rs/primary_reports_new_member.yml +175 -0
  1257. data/spec/spec_tests/data/sdam/rs/primary_to_no_primary_mismatched_me.yml +81 -0
  1258. data/spec/spec_tests/data/sdam/rs/primary_wrong_set_name.yml +30 -0
  1259. data/spec/spec_tests/data/sdam/rs/repeated.yml +105 -0
  1260. data/spec/spec_tests/data/sdam/rs/replicaset_rsnp.yml +21 -0
  1261. data/spec/spec_tests/data/sdam/rs/response_from_removed.yml +69 -0
  1262. data/spec/spec_tests/data/sdam/rs/ruby_primary_address_change.yml +31 -0
  1263. data/spec/spec_tests/data/sdam/rs/ruby_secondary_wrong_set_name_with_primary_second.yml +73 -0
  1264. data/spec/spec_tests/data/sdam/rs/sec_not_auth.yml +55 -0
  1265. data/spec/spec_tests/data/sdam/rs/secondary_ignore_ok_0.yml +87 -0
  1266. data/spec/spec_tests/data/sdam/rs/secondary_mismatched_me.yml +28 -0
  1267. data/spec/spec_tests/data/sdam/rs/secondary_wrong_set_name.yml +31 -0
  1268. data/spec/spec_tests/data/sdam/rs/secondary_wrong_set_name_with_primary.yml +75 -0
  1269. data/spec/spec_tests/data/sdam/rs/setversion_without_electionid.yml +79 -0
  1270. data/spec/spec_tests/data/sdam/rs/stepdown_change_set_name.yml +65 -0
  1271. data/spec/spec_tests/data/sdam/rs/too_new.yml +45 -0
  1272. data/spec/spec_tests/data/sdam/rs/too_old.yml +41 -0
  1273. data/spec/spec_tests/data/sdam/rs/topology_version_equal.yml +68 -0
  1274. data/spec/spec_tests/data/sdam/rs/topology_version_greater.yml +194 -0
  1275. data/spec/spec_tests/data/sdam/rs/topology_version_less.yml +64 -0
  1276. data/spec/spec_tests/data/sdam/rs/unexpected_mongos.yml +29 -0
  1277. data/spec/spec_tests/data/sdam/rs/use_setversion_without_electionid.yml +117 -0
  1278. data/spec/spec_tests/data/sdam/rs/wrong_set_name.yml +38 -0
  1279. data/spec/spec_tests/data/sdam/sharded/compatible.yml +40 -0
  1280. data/spec/spec_tests/data/sdam/sharded/discover_single_mongos.yml +24 -0
  1281. data/spec/spec_tests/data/sdam/sharded/ls_timeout_mongos.yml +101 -0
  1282. data/spec/spec_tests/data/sdam/sharded/mongos_disconnect.yml +113 -0
  1283. data/spec/spec_tests/data/sdam/sharded/multiple_mongoses.yml +52 -0
  1284. data/spec/spec_tests/data/sdam/sharded/non_mongos_removed.yml +47 -0
  1285. data/spec/{support → spec_tests/data}/sdam/sharded/normalize_uri_case.yml +0 -0
  1286. data/spec/spec_tests/data/sdam/sharded/ruby_primary_different_address.yml +21 -0
  1287. data/spec/spec_tests/data/sdam/sharded/ruby_primary_mismatched_me.yml +22 -0
  1288. data/spec/spec_tests/data/sdam/sharded/too_new.yml +38 -0
  1289. data/spec/spec_tests/data/sdam/sharded/too_old.yml +38 -0
  1290. data/spec/spec_tests/data/sdam/single/compatible.yml +27 -0
  1291. data/spec/spec_tests/data/sdam/single/direct_connection_external_ip.yml +37 -0
  1292. data/spec/spec_tests/data/sdam/single/direct_connection_mongos.yml +36 -0
  1293. data/spec/spec_tests/data/sdam/single/direct_connection_replicaset.yml +23 -0
  1294. data/spec/spec_tests/data/sdam/single/direct_connection_rsarbiter.yml +38 -0
  1295. data/spec/spec_tests/data/sdam/single/direct_connection_rsprimary.yml +37 -0
  1296. data/spec/spec_tests/data/sdam/single/direct_connection_rssecondary.yml +38 -0
  1297. data/spec/spec_tests/data/sdam/single/direct_connection_standalone.yml +35 -0
  1298. data/spec/spec_tests/data/sdam/single/direct_connection_unavailable_seed.yml +28 -0
  1299. data/spec/spec_tests/data/sdam/single/direct_connection_wrong_set_name.yml +40 -0
  1300. data/spec/spec_tests/data/sdam/single/discover_standalone.yml +35 -0
  1301. data/spec/spec_tests/data/sdam/single/discover_unavailable_seed.yml +28 -0
  1302. data/spec/spec_tests/data/sdam/single/ls_timeout_standalone.yml +36 -0
  1303. data/spec/spec_tests/data/sdam/single/not_ok_response.yml +44 -0
  1304. data/spec/spec_tests/data/sdam/single/ruby_primary_different_address.yml +24 -0
  1305. data/spec/spec_tests/data/sdam/single/ruby_primary_mismatched_me.yml +25 -0
  1306. data/spec/spec_tests/data/sdam/single/standalone_removed.yml +35 -0
  1307. data/spec/spec_tests/data/sdam/single/standalone_using_legacy_hello.yml +34 -0
  1308. data/spec/spec_tests/data/sdam/single/too_new.yml +27 -0
  1309. data/spec/spec_tests/data/sdam/single/too_old.yml +25 -0
  1310. data/spec/spec_tests/data/sdam/single/too_old_then_upgraded.yml +48 -0
  1311. data/spec/spec_tests/data/sdam_integration/cancel-server-check.yml +96 -0
  1312. data/spec/spec_tests/data/sdam_integration/connectTimeoutMS.yml +88 -0
  1313. data/spec/spec_tests/data/sdam_integration/find-network-error.yml +85 -0
  1314. data/spec/spec_tests/data/sdam_integration/find-shutdown-error.yml +118 -0
  1315. data/spec/spec_tests/data/sdam_integration/hello-command-error.yml +160 -0
  1316. data/spec/spec_tests/data/sdam_integration/hello-network-error.yml +158 -0
  1317. data/spec/spec_tests/data/sdam_integration/hello-timeout.yml +225 -0
  1318. data/spec/spec_tests/data/sdam_integration/insert-network-error.yml +88 -0
  1319. data/spec/spec_tests/data/sdam_integration/insert-shutdown-error.yml +117 -0
  1320. data/spec/spec_tests/data/sdam_integration/rediscover-quickly-after-step-down.yml +98 -0
  1321. data/spec/spec_tests/data/sdam_monitoring/discovered_standalone.yml +70 -0
  1322. data/spec/spec_tests/data/sdam_monitoring/load_balancer.yml +65 -0
  1323. data/spec/spec_tests/data/sdam_monitoring/replica_set_other_chain.yml +222 -0
  1324. data/spec/spec_tests/data/sdam_monitoring/replica_set_other_change.yml +225 -0
  1325. data/spec/spec_tests/data/sdam_monitoring/replica_set_primary_address_change.yml +251 -0
  1326. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_me_mismatch.yml +111 -0
  1327. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_no_primary.yml +113 -0
  1328. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_primary.yml +112 -0
  1329. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_primary_and_secondary.yml +198 -0
  1330. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_primary_removal.yml +175 -0
  1331. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_removal.yml +111 -0
  1332. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_second_seed_removal.yml +106 -0
  1333. data/spec/spec_tests/data/sdam_monitoring/required_replica_set.yml +108 -0
  1334. data/spec/spec_tests/data/sdam_monitoring/standalone.yml +70 -0
  1335. data/spec/spec_tests/data/sdam_monitoring/standalone_repeated.yml +86 -0
  1336. data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +73 -0
  1337. data/spec/spec_tests/data/sdam_monitoring/standalone_to_rs_with_me_mismatch.yml +90 -0
  1338. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-directConnection.yml +13 -0
  1339. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-replicaSet-errors.yml +6 -0
  1340. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-multiple-hosts.yml +5 -0
  1341. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-txt.yml +10 -0
  1342. data/spec/spec_tests/data/seed_list_discovery/replica-set/direct-connection-false.yml +10 -0
  1343. data/spec/spec_tests/data/seed_list_discovery/replica-set/direct-connection-true.yml +5 -0
  1344. data/spec/spec_tests/data/seed_list_discovery/replica-set/encoded-userinfo-and-db.yml +15 -0
  1345. data/spec/spec_tests/data/seed_list_discovery/replica-set/loadBalanced-false-txt.yml +10 -0
  1346. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/longer-parent-in-return.yml +0 -0
  1347. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/misformatted-option.yml +0 -0
  1348. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/no-results.yml +0 -0
  1349. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/not-enough-parts.yml +0 -0
  1350. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/one-result-default-port.yml +0 -0
  1351. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/one-txt-record-multiple-strings.yml +0 -0
  1352. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/one-txt-record.yml +0 -0
  1353. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/parent-part-mismatch1.yml +0 -0
  1354. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/parent-part-mismatch2.yml +0 -0
  1355. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/parent-part-mismatch3.yml +0 -0
  1356. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/parent-part-mismatch4.yml +0 -0
  1357. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/parent-part-mismatch5.yml +0 -0
  1358. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/returned-parent-too-short.yml +0 -0
  1359. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/returned-parent-wrong.yml +0 -0
  1360. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/two-results-default-port.yml +0 -0
  1361. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/two-results-nonstandard-port.yml +0 -0
  1362. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/two-txt-records.yml +0 -0
  1363. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/txt-record-not-allowed-option.yml +0 -0
  1364. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/txt-record-with-overridden-ssl-option.yml +0 -0
  1365. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/txt-record-with-overridden-uri-option.yml +0 -0
  1366. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/txt-record-with-unallowed-option.yml +0 -0
  1367. data/spec/spec_tests/data/seed_list_discovery/replica-set/uri-with-admin-database.yml +13 -0
  1368. data/spec/spec_tests/data/seed_list_discovery/replica-set/uri-with-auth.yml +12 -0
  1369. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/uri-with-port.yml +0 -0
  1370. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/uri-with-two-hosts.yml +0 -0
  1371. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetNoPrimary/read/Nearest.yml +0 -0
  1372. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetNoPrimary/read/Nearest_multiple.yml +0 -0
  1373. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetNoPrimary/read/Nearest_non_matching.yml +0 -0
  1374. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetNoPrimary/read/PossiblePrimary.yml +0 -0
  1375. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetNoPrimary/read/PossiblePrimaryNearest.yml +0 -0
  1376. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetNoPrimary/read/Primary.yml +0 -0
  1377. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetNoPrimary/read/PrimaryPreferred.yml +0 -0
  1378. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetNoPrimary/read/PrimaryPreferred_non_matching.yml +0 -0
  1379. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetNoPrimary/read/Secondary.yml +0 -0
  1380. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetNoPrimary/read/SecondaryPreferred.yml +0 -0
  1381. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetNoPrimary/read/SecondaryPreferred_non_matching.yml +0 -0
  1382. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetNoPrimary/read/Secondary_multi_tags.yml +0 -0
  1383. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetNoPrimary/read/Secondary_multi_tags2.yml +0 -0
  1384. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetNoPrimary/read/Secondary_non_matching.yml +0 -0
  1385. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetWithPrimary/read/Nearest.yml +0 -0
  1386. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetWithPrimary/read/Nearest_multiple.yml +0 -0
  1387. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetWithPrimary/read/Nearest_non_matching.yml +0 -0
  1388. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetWithPrimary/read/Primary.yml +0 -0
  1389. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetWithPrimary/read/PrimaryPreferred.yml +0 -0
  1390. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.yml +0 -0
  1391. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetWithPrimary/read/Secondary.yml +0 -0
  1392. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetWithPrimary/read/SecondaryPreferred.yml +0 -0
  1393. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetWithPrimary/read/SecondaryPreferred_non_matching.yml +0 -0
  1394. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetWithPrimary/read/SecondaryPreferred_tags.yml +0 -0
  1395. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetWithPrimary/read/Secondary_non_matching.yml +0 -0
  1396. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/Sharded/read/Nearest.yml +0 -0
  1397. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/Sharded/read/Primary.yml +0 -0
  1398. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/Sharded/read/PrimaryPreferred.yml +0 -0
  1399. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/Sharded/read/Secondary.yml +0 -0
  1400. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/Sharded/read/SecondaryPreferred.yml +0 -0
  1401. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/Single/read/SecondaryPreferred.yml +0 -0
  1402. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/Unknown/read/SecondaryPreferred.yml +0 -0
  1403. data/spec/{support/server_selection/rtt → spec_tests/data/server_selection_rtt}/first_value.yml +0 -0
  1404. data/spec/{support/server_selection/rtt → spec_tests/data/server_selection_rtt}/first_value_zero.yml +0 -0
  1405. data/spec/{support/server_selection/rtt → spec_tests/data/server_selection_rtt}/value_test_1.yml +0 -0
  1406. data/spec/{support/server_selection/rtt → spec_tests/data/server_selection_rtt}/value_test_2.yml +0 -0
  1407. data/spec/{support/server_selection/rtt → spec_tests/data/server_selection_rtt}/value_test_3.yml +0 -0
  1408. data/spec/{support/server_selection/rtt → spec_tests/data/server_selection_rtt}/value_test_4.yml +0 -0
  1409. data/spec/{support/server_selection/rtt → spec_tests/data/server_selection_rtt}/value_test_5.yml +0 -0
  1410. data/spec/spec_tests/data/transactions/abort.yml +413 -0
  1411. data/spec/spec_tests/data/transactions/bulk.yml +267 -0
  1412. data/spec/spec_tests/data/transactions/causal-consistency.yml +175 -0
  1413. data/spec/spec_tests/data/transactions/commit.yml +603 -0
  1414. data/spec/spec_tests/data/transactions/count.yml +67 -0
  1415. data/spec/spec_tests/data/transactions/create-collection.yml +131 -0
  1416. data/spec/spec_tests/data/transactions/create-index.yml +152 -0
  1417. data/spec/spec_tests/data/transactions/delete.yml +192 -0
  1418. data/spec/spec_tests/data/transactions/error-labels.yml +1030 -0
  1419. data/spec/spec_tests/data/transactions/errors-client.yml +56 -0
  1420. data/spec/spec_tests/data/transactions/errors.yml +133 -0
  1421. data/spec/spec_tests/data/transactions/findOneAndDelete.yml +134 -0
  1422. data/spec/spec_tests/data/transactions/findOneAndReplace.yml +148 -0
  1423. data/spec/spec_tests/data/transactions/findOneAndUpdate.yml +236 -0
  1424. data/spec/spec_tests/data/transactions/insert.yml +390 -0
  1425. data/spec/spec_tests/data/transactions/isolation.yml +133 -0
  1426. data/spec/spec_tests/data/transactions/mongos-pin-auto.yml +1674 -0
  1427. data/spec/spec_tests/data/transactions/mongos-recovery-token.yml +350 -0
  1428. data/spec/spec_tests/data/transactions/pin-mongos.yml +559 -0
  1429. data/spec/spec_tests/data/transactions/read-concern.yml +623 -0
  1430. data/spec/spec_tests/data/transactions/read-pref.yml +348 -0
  1431. data/spec/spec_tests/data/transactions/reads.yml +261 -0
  1432. data/spec/spec_tests/data/transactions/retryable-abort-errorLabels.yml +126 -0
  1433. data/spec/spec_tests/data/transactions/retryable-abort.yml +1317 -0
  1434. data/spec/spec_tests/data/transactions/retryable-commit-errorLabels.yml +134 -0
  1435. data/spec/spec_tests/data/transactions/retryable-commit.yml +1462 -0
  1436. data/spec/spec_tests/data/transactions/retryable-writes.yml +218 -0
  1437. data/spec/spec_tests/data/transactions/run-command.yml +197 -0
  1438. data/spec/spec_tests/data/transactions/transaction-options-repl.yml +117 -0
  1439. data/spec/spec_tests/data/transactions/transaction-options.yml +781 -0
  1440. data/spec/spec_tests/data/transactions/update.yml +246 -0
  1441. data/spec/spec_tests/data/transactions/write-concern.yml +554 -0
  1442. data/spec/spec_tests/data/transactions_api/callback-aborts.yml +170 -0
  1443. data/spec/spec_tests/data/transactions_api/callback-commits.yml +204 -0
  1444. data/spec/spec_tests/data/transactions_api/callback-retry.yml +215 -0
  1445. data/spec/spec_tests/data/transactions_api/commit-retry.yml +324 -0
  1446. data/spec/spec_tests/data/transactions_api/commit-transienttransactionerror-4.2.yml +139 -0
  1447. data/spec/spec_tests/data/transactions_api/commit-transienttransactionerror.yml +175 -0
  1448. data/spec/spec_tests/data/transactions_api/commit-writeconcernerror.yml +216 -0
  1449. data/spec/spec_tests/data/transactions_api/commit.yml +193 -0
  1450. data/spec/spec_tests/data/transactions_api/transaction-options.yml +274 -0
  1451. data/spec/spec_tests/data/transactions_unified/mongos-unpin.yml +172 -0
  1452. data/spec/spec_tests/data/unified/valid-fail/operation-failure.yml +31 -0
  1453. data/spec/spec_tests/data/unified/valid-pass/poc-change-streams.yml +220 -0
  1454. data/spec/spec_tests/data/unified/valid-pass/poc-command-monitoring.yml +102 -0
  1455. data/spec/spec_tests/data/unified/valid-pass/poc-crud.yml +184 -0
  1456. data/spec/spec_tests/data/unified/valid-pass/poc-gridfs.yml +155 -0
  1457. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-reads.yml +193 -0
  1458. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-writes.yml +210 -0
  1459. data/spec/spec_tests/data/unified/valid-pass/poc-sessions.yml +215 -0
  1460. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-convenient-api.yml +235 -0
  1461. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-mongos-pin-auto.yml +169 -0
  1462. data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +170 -0
  1463. data/spec/spec_tests/data/uri_options/auth-options.yml +49 -0
  1464. data/spec/spec_tests/data/uri_options/compression-options.yml +51 -0
  1465. data/spec/spec_tests/data/uri_options/concern-options.yml +55 -0
  1466. data/spec/spec_tests/data/uri_options/connection-options.yml +209 -0
  1467. data/spec/spec_tests/data/uri_options/connection-pool-options.yml +26 -0
  1468. data/spec/spec_tests/data/uri_options/read-preference-options.yml +66 -0
  1469. data/spec/spec_tests/data/uri_options/ruby-auth-options.yml +12 -0
  1470. data/spec/spec_tests/data/uri_options/ruby-connection-options.yml +58 -0
  1471. data/spec/spec_tests/data/uri_options/tls-options.yml +364 -0
  1472. data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +417 -0
  1473. data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +411 -0
  1474. data/spec/spec_tests/data/versioned_api/runcommand-helper-no-api-version-declared.yml +75 -0
  1475. data/spec/spec_tests/data/versioned_api/test-commands-deprecation-errors.yml +47 -0
  1476. data/spec/spec_tests/data/versioned_api/test-commands-strict-mode.yml +46 -0
  1477. data/spec/spec_tests/data/versioned_api/transaction-handling.yml +128 -0
  1478. data/spec/spec_tests/gridfs_spec.rb +6 -1
  1479. data/spec/spec_tests/load_balancers_spec.rb +15 -0
  1480. data/spec/spec_tests/max_staleness_spec.rb +7 -120
  1481. data/spec/spec_tests/read_write_concern_connection_string_spec.rb +13 -0
  1482. data/spec/spec_tests/read_write_concern_document_spec.rb +77 -0
  1483. data/spec/spec_tests/read_write_concern_operaton_spec.rb +13 -0
  1484. data/spec/spec_tests/retryable_reads_spec.rb +50 -0
  1485. data/spec/spec_tests/retryable_writes_spec.rb +14 -70
  1486. data/spec/spec_tests/sdam_integration_spec.rb +16 -0
  1487. data/spec/spec_tests/sdam_monitoring_spec.rb +59 -22
  1488. data/spec/spec_tests/sdam_spec.rb +156 -20
  1489. data/spec/spec_tests/seed_list_discovery_spec.rb +118 -0
  1490. data/spec/spec_tests/server_selection_rtt_spec.rb +11 -63
  1491. data/spec/spec_tests/server_selection_spec.rb +7 -90
  1492. data/spec/spec_tests/transactions_api_spec.rb +13 -0
  1493. data/spec/spec_tests/transactions_spec.rb +8 -44
  1494. data/spec/spec_tests/transactions_unified_spec.rb +13 -0
  1495. data/spec/spec_tests/unified_spec.rb +18 -0
  1496. data/spec/spec_tests/uri_options_spec.rb +93 -0
  1497. data/spec/spec_tests/versioned_api_spec.rb +13 -0
  1498. data/spec/stress/cleanup_spec.rb +61 -0
  1499. data/spec/stress/connection_pool_stress_spec.rb +204 -0
  1500. data/spec/stress/connection_pool_timing_spec.rb +184 -0
  1501. data/spec/stress/fork_reconnect_stress_spec.rb +108 -0
  1502. data/spec/stress/push_monitor_close_spec.rb +44 -0
  1503. data/spec/support/authorization.rb +43 -173
  1504. data/spec/support/aws_utils/base.rb +137 -0
  1505. data/spec/support/aws_utils/inspector.rb +227 -0
  1506. data/spec/support/aws_utils/orchestrator.rb +373 -0
  1507. data/spec/support/aws_utils/provisioner.rb +363 -0
  1508. data/spec/support/aws_utils.rb +65 -0
  1509. data/spec/support/background_thread_registry.rb +70 -0
  1510. data/spec/support/certificates/README.md +106 -0
  1511. data/spec/support/certificates/atlas-ocsp-ca.crt +110 -0
  1512. data/spec/support/certificates/atlas-ocsp.crt +157 -0
  1513. data/spec/support/certificates/ca.crt +76 -0
  1514. data/spec/support/certificates/client-encrypted.key +30 -0
  1515. data/spec/support/certificates/client-int.crt +78 -0
  1516. data/spec/support/certificates/client-second-level-bundle.pem +179 -0
  1517. data/spec/support/certificates/client-second-level.crt +74 -0
  1518. data/spec/support/certificates/client-second-level.key +27 -0
  1519. data/spec/support/certificates/client-second-level.pem +101 -0
  1520. data/spec/support/certificates/client-x509.crt +78 -0
  1521. data/spec/support/certificates/client-x509.key +27 -0
  1522. data/spec/support/certificates/client-x509.pem +105 -0
  1523. data/spec/support/certificates/client.crt +74 -0
  1524. data/spec/support/certificates/client.key +27 -0
  1525. data/spec/support/certificates/client.pem +90 -90
  1526. data/spec/support/certificates/crl.pem +10 -8
  1527. data/spec/support/certificates/crl_client_revoked.pem +11 -10
  1528. data/spec/support/certificates/multi-ca.crt +152 -0
  1529. data/spec/support/certificates/python-ca.crt +76 -0
  1530. data/spec/support/certificates/server-int.crt +78 -0
  1531. data/spec/support/certificates/server-second-level-bundle.pem +179 -0
  1532. data/spec/support/certificates/server-second-level.crt +74 -0
  1533. data/spec/support/certificates/server-second-level.key +27 -0
  1534. data/spec/support/certificates/server-second-level.pem +101 -0
  1535. data/spec/support/certificates/server.pem +99 -32
  1536. data/spec/support/client_registry.rb +254 -0
  1537. data/spec/support/client_registry_macros.rb +26 -0
  1538. data/spec/support/cluster_tools.rb +379 -0
  1539. data/spec/support/common_shortcuts.rb +374 -0
  1540. data/spec/support/constraints.rb +12 -73
  1541. data/spec/support/crypt/corpus/corpus-key-aws.json +33 -0
  1542. data/spec/support/crypt/corpus/corpus-key-local.json +31 -0
  1543. data/spec/support/crypt/corpus/corpus-schema.json +2057 -0
  1544. data/spec/support/crypt/corpus/corpus.json +3657 -0
  1545. data/spec/support/crypt/corpus/corpus_encrypted.json +4152 -0
  1546. data/spec/support/crypt/data_keys/key_document_aws.json +34 -0
  1547. data/spec/support/crypt/data_keys/key_document_local.json +31 -0
  1548. data/spec/support/crypt/external/external-key.json +31 -0
  1549. data/spec/support/crypt/external/external-schema.json +19 -0
  1550. data/spec/support/crypt/limits/limits-doc.json +102 -0
  1551. data/spec/support/crypt/limits/limits-key.json +31 -0
  1552. data/spec/support/crypt/limits/limits-schema.json +1405 -0
  1553. data/spec/support/crypt/schema_maps/schema_map_aws.json +17 -0
  1554. data/spec/support/crypt/schema_maps/schema_map_aws_key_alt_names.json +12 -0
  1555. data/spec/support/crypt/schema_maps/schema_map_local.json +18 -0
  1556. data/spec/support/crypt/schema_maps/schema_map_local_key_alt_names.json +12 -0
  1557. data/spec/support/crypt.rb +157 -0
  1558. data/spec/support/dns.rb +16 -0
  1559. data/spec/support/json_ext_formatter.rb +16 -0
  1560. data/spec/support/keyword_struct.rb +29 -0
  1561. data/spec/support/local_resource_registry.rb +37 -0
  1562. data/spec/support/matchers.rb +52 -1
  1563. data/spec/support/monitoring_ext.rb +19 -0
  1564. data/spec/support/ocsp +1 -0
  1565. data/spec/support/primary_socket.rb +5 -2
  1566. data/spec/support/sdam_formatter_integration.rb +119 -0
  1567. data/spec/support/session_registry.rb +55 -0
  1568. data/spec/support/shared/app_metadata.rb +167 -0
  1569. data/spec/support/shared/auth_context.rb +16 -0
  1570. data/spec/support/shared/protocol.rb +5 -0
  1571. data/spec/support/shared/scram_conversation.rb +103 -0
  1572. data/spec/support/shared/server_selector.rb +114 -65
  1573. data/spec/support/shared/session.rb +108 -63
  1574. data/spec/support/spec_config.rb +585 -22
  1575. data/spec/support/spec_setup.rb +83 -0
  1576. data/spec/support/using_hash.rb +31 -0
  1577. data/spec/support/utils.rb +598 -0
  1578. data.tar.gz.sig +0 -0
  1579. metadata +2227 -792
  1580. metadata.gz.sig +2 -1
  1581. data/lib/mongo/cluster/app_metadata.rb +0 -158
  1582. data/lib/mongo/cluster/topology/replica_set.rb +0 -339
  1583. data/lib/mongo/collection/view/builder/find_command.rb +0 -139
  1584. data/lib/mongo/collection/view/builder/flags.rb +0 -62
  1585. data/lib/mongo/collection/view/builder/modifiers.rb +0 -80
  1586. data/lib/mongo/collection/view/builder/op_query.rb +0 -91
  1587. data/lib/mongo/cursor/builder/get_more_command.rb +0 -74
  1588. data/lib/mongo/cursor/builder/kill_cursors_command.rb +0 -90
  1589. data/lib/mongo/cursor/builder/op_get_more.rb +0 -61
  1590. data/lib/mongo/cursor/builder/op_kill_cursors.rb +0 -84
  1591. data/lib/mongo/cursor/builder.rb +0 -18
  1592. data/lib/mongo/error/failed_stringprep_validation.rb +0 -38
  1593. data/lib/mongo/event/description_changed.rb +0 -72
  1594. data/lib/mongo/event/member_discovered.rb +0 -67
  1595. data/lib/mongo/event/primary_elected.rb +0 -55
  1596. data/lib/mongo/event/standalone_discovered.rb +0 -53
  1597. data/lib/mongo/server/connectable.rb +0 -107
  1598. data/lib/mongo/server/connection_pool/queue.rb +0 -242
  1599. data/lib/mongo/server/context.rb +0 -69
  1600. data/lib/mongo/server/description/inspector/description_changed.rb +0 -57
  1601. data/lib/mongo/server/description/inspector/member_discovered.rb +0 -59
  1602. data/lib/mongo/server/description/inspector/primary_elected.rb +0 -60
  1603. data/lib/mongo/server/description/inspector/standalone_discovered.rb +0 -56
  1604. data/lib/mongo/server/description/inspector.rb +0 -81
  1605. data/lib/mongo/server_selector/selectable.rb +0 -281
  1606. data/lib/mongo/write_concern/normalizable.rb +0 -64
  1607. data/spec/integration/retryable_writes_spec.rb +0 -737
  1608. data/spec/mongo/auth/scram/negotiation_spec.rb +0 -575
  1609. data/spec/mongo/cluster/app_metadata_spec.rb +0 -133
  1610. data/spec/mongo/collection/view/builder/flags_spec.rb +0 -106
  1611. data/spec/mongo/collection/view/builder/modifiers_spec.rb +0 -210
  1612. data/spec/mongo/operation/read_preference_spec.rb +0 -245
  1613. data/spec/mongo/server/connection_pool/queue_spec.rb +0 -223
  1614. data/spec/mongo/server/description/inspector/description_changed_spec.rb +0 -78
  1615. data/spec/mongo/server/description/inspector/primary_elected_spec.rb +0 -94
  1616. data/spec/spec_tests/dns_seedlist_discovery_spec.rb +0 -96
  1617. data/spec/support/certificates/ca.pem +0 -17
  1618. data/spec/support/certificates/client_cert.pem +0 -21
  1619. data/spec/support/certificates/client_key.pem +0 -28
  1620. data/spec/support/certificates/client_key_encrypted.pem +0 -30
  1621. data/spec/support/certificates/password_protected.pem +0 -51
  1622. data/spec/support/change_streams/operation.rb +0 -62
  1623. data/spec/support/change_streams.rb +0 -265
  1624. data/spec/support/change_streams_tests/change-streams-errors.yml +0 -53
  1625. data/spec/support/change_streams_tests/change-streams.yml +0 -299
  1626. data/spec/support/command_monitoring/bulkWrite.yml +0 -49
  1627. data/spec/support/command_monitoring/find.yml +0 -266
  1628. data/spec/support/command_monitoring/insertMany.yml +0 -75
  1629. data/spec/support/command_monitoring/updateMany.yml +0 -67
  1630. data/spec/support/command_monitoring/updateOne.yml +0 -95
  1631. data/spec/support/command_monitoring.rb +0 -376
  1632. data/spec/support/connection_string.rb +0 -232
  1633. data/spec/support/connection_string_tests/invalid-uris.yml +0 -241
  1634. data/spec/support/connection_string_tests/valid-auth.yml +0 -241
  1635. data/spec/support/connection_string_tests/valid-warnings.yml +0 -55
  1636. data/spec/support/crud/read.rb +0 -175
  1637. data/spec/support/crud/write.rb +0 -269
  1638. data/spec/support/crud.rb +0 -320
  1639. data/spec/support/crud_tests/read/aggregate-collation.yml +0 -17
  1640. data/spec/support/crud_tests/read/aggregate-out.yml +0 -49
  1641. data/spec/support/crud_tests/read/count-collation.yml +0 -25
  1642. data/spec/support/crud_tests/read/distinct-collation.yml +0 -17
  1643. data/spec/support/crud_tests/read/find-collation.yml +0 -15
  1644. data/spec/support/crud_tests/write/bulkWrite-arrayFilters.yml +0 -44
  1645. data/spec/support/crud_tests/write/deleteMany-collation.yml +0 -22
  1646. data/spec/support/crud_tests/write/deleteOne-collation.yml +0 -22
  1647. data/spec/support/crud_tests/write/findOneAndDelete-collation.yml +0 -23
  1648. data/spec/support/crud_tests/write/findOneAndReplace-collation.yml +0 -24
  1649. data/spec/support/crud_tests/write/findOneAndUpdate-collation.yml +0 -27
  1650. data/spec/support/crud_tests/write/insertMany.yml +0 -21
  1651. data/spec/support/crud_tests/write/replaceOne-collation.yml +0 -24
  1652. data/spec/support/crud_tests/write/updateMany-arrayFilters.yml +0 -63
  1653. data/spec/support/crud_tests/write/updateMany-collation.yml +0 -28
  1654. data/spec/support/crud_tests/write/updateOne-arrayFilters.yml +0 -109
  1655. data/spec/support/crud_tests/write/updateOne-collation.yml +0 -25
  1656. data/spec/support/event_subscriber.rb +0 -66
  1657. data/spec/support/gridfs.rb +0 -638
  1658. data/spec/support/lite_constraints.rb +0 -18
  1659. data/spec/support/max_staleness/Unknown/SmallMaxStaleness.yml +0 -14
  1660. data/spec/support/retryable_writes_tests/bulkWrite-serverErrors.yml +0 -90
  1661. data/spec/support/retryable_writes_tests/bulkWrite.yml +0 -403
  1662. data/spec/support/retryable_writes_tests/deleteOne-serverErrors.yml +0 -50
  1663. data/spec/support/retryable_writes_tests/deleteOne.yml +0 -60
  1664. data/spec/support/retryable_writes_tests/findOneAndDelete-serverErrors.yml +0 -50
  1665. data/spec/support/retryable_writes_tests/findOneAndDelete.yml +0 -61
  1666. data/spec/support/retryable_writes_tests/findOneAndReplace-serverErrors.yml +0 -54
  1667. data/spec/support/retryable_writes_tests/findOneAndReplace.yml +0 -66
  1668. data/spec/support/retryable_writes_tests/findOneAndUpdate-serverErrors.yml +0 -54
  1669. data/spec/support/retryable_writes_tests/findOneAndUpdate.yml +0 -65
  1670. data/spec/support/retryable_writes_tests/insertMany-serverErrors.yml +0 -59
  1671. data/spec/support/retryable_writes_tests/insertMany.yml +0 -77
  1672. data/spec/support/retryable_writes_tests/insertOne-serverErrors.yml +0 -471
  1673. data/spec/support/retryable_writes_tests/insertOne.yml +0 -64
  1674. data/spec/support/retryable_writes_tests/replaceOne-serverErrors.yml +0 -58
  1675. data/spec/support/retryable_writes_tests/replaceOne.yml +0 -69
  1676. data/spec/support/retryable_writes_tests/updateOne-serverErrors.yml +0 -58
  1677. data/spec/support/retryable_writes_tests/updateOne.yml +0 -138
  1678. data/spec/support/sdam/rs/compatible.yml +0 -41
  1679. data/spec/support/sdam/rs/discover_arbiters.yml +0 -43
  1680. data/spec/support/sdam/rs/discover_passives.yml +0 -81
  1681. data/spec/support/sdam/rs/discover_primary.yml +0 -42
  1682. data/spec/support/sdam/rs/discover_secondary.yml +0 -43
  1683. data/spec/support/sdam/rs/discovery.yml +0 -203
  1684. data/spec/support/sdam/rs/equal_electionids.yml +0 -53
  1685. data/spec/support/sdam/rs/ghost_discovered.yml +0 -41
  1686. data/spec/support/sdam/rs/hosts_differ_from_seeds.yml +0 -36
  1687. data/spec/support/sdam/rs/ls_timeout.yml +0 -243
  1688. data/spec/support/sdam/rs/member_reconfig.yml +0 -72
  1689. data/spec/support/sdam/rs/member_standalone.yml +0 -64
  1690. data/spec/support/sdam/rs/new_primary.yml +0 -78
  1691. data/spec/support/sdam/rs/new_primary_new_electionid.yml +0 -110
  1692. data/spec/support/sdam/rs/new_primary_new_setversion.yml +0 -110
  1693. data/spec/support/sdam/rs/new_primary_wrong_set_name.yml +0 -75
  1694. data/spec/support/sdam/rs/non_rs_member.yml +0 -32
  1695. data/spec/support/sdam/rs/normalize_case.yml +0 -51
  1696. data/spec/support/sdam/rs/normalize_case_me.yml +0 -100
  1697. data/spec/support/sdam/rs/null_election_id.yml +0 -164
  1698. data/spec/support/sdam/rs/primary_becomes_standalone.yml +0 -54
  1699. data/spec/support/sdam/rs/primary_changes_set_name.yml +0 -61
  1700. data/spec/support/sdam/rs/primary_disconnect.yml +0 -58
  1701. data/spec/support/sdam/rs/primary_disconnect_electionid.yml +0 -174
  1702. data/spec/support/sdam/rs/primary_disconnect_setversion.yml +0 -174
  1703. data/spec/support/sdam/rs/primary_hint_from_secondary_with_mismatched_me.yml +0 -62
  1704. data/spec/support/sdam/rs/primary_mismatched_me.yml +0 -26
  1705. data/spec/support/sdam/rs/primary_reports_new_member.yml +0 -171
  1706. data/spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml +0 -79
  1707. data/spec/support/sdam/rs/primary_wrong_set_name.yml +0 -29
  1708. data/spec/support/sdam/rs/response_from_removed.yml +0 -67
  1709. data/spec/support/sdam/rs/rsother_discovered.yml +0 -66
  1710. data/spec/support/sdam/rs/sec_not_auth.yml +0 -53
  1711. data/spec/support/sdam/rs/secondary_ignore_ok_0.yml +0 -85
  1712. data/spec/support/sdam/rs/secondary_mismatched_me.yml +0 -26
  1713. data/spec/support/sdam/rs/secondary_wrong_set_name.yml +0 -30
  1714. data/spec/support/sdam/rs/secondary_wrong_set_name_with_primary.yml +0 -73
  1715. data/spec/support/sdam/rs/set_version_without_electionid.yml +0 -69
  1716. data/spec/support/sdam/rs/setversion_without_electionid.yml +0 -75
  1717. data/spec/support/sdam/rs/stepdown_change_set_name.yml +0 -63
  1718. data/spec/support/sdam/rs/too_new.yml +0 -41
  1719. data/spec/support/sdam/rs/too_old.yml +0 -39
  1720. data/spec/support/sdam/rs/unexpected_mongos.yml +0 -28
  1721. data/spec/support/sdam/rs/use_setversion_without_electionid.yml +0 -108
  1722. data/spec/support/sdam/rs/wrong_set_name.yml +0 -37
  1723. data/spec/support/sdam/sharded/compatible.yml +0 -38
  1724. data/spec/support/sdam/sharded/ls_timeout_mongos.yml +0 -97
  1725. data/spec/support/sdam/sharded/mongos_disconnect.yml +0 -110
  1726. data/spec/support/sdam/sharded/multiple_mongoses.yml +0 -50
  1727. data/spec/support/sdam/sharded/non_mongos_removed.yml +0 -45
  1728. data/spec/support/sdam/sharded/single_mongos.yml +0 -33
  1729. data/spec/support/sdam/sharded/too_new.yml +0 -36
  1730. data/spec/support/sdam/sharded/too_old.yml +0 -36
  1731. data/spec/support/sdam/single/compatible.yml +0 -26
  1732. data/spec/support/sdam/single/direct_connection_external_ip.yml +0 -36
  1733. data/spec/support/sdam/single/direct_connection_mongos.yml +0 -35
  1734. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +0 -37
  1735. data/spec/support/sdam/single/direct_connection_rsprimary.yml +0 -36
  1736. data/spec/support/sdam/single/direct_connection_rssecondary.yml +0 -37
  1737. data/spec/support/sdam/single/direct_connection_slave.yml +0 -34
  1738. data/spec/support/sdam/single/direct_connection_standalone.yml +0 -34
  1739. data/spec/support/sdam/single/ls_timeout_standalone.yml +0 -35
  1740. data/spec/support/sdam/single/not_ok_response.yml +0 -42
  1741. data/spec/support/sdam/single/standalone_removed.yml +0 -34
  1742. data/spec/support/sdam/single/too_new.yml +0 -26
  1743. data/spec/support/sdam/single/too_old.yml +0 -24
  1744. data/spec/support/sdam/single/unavailable_seed.yml +0 -28
  1745. data/spec/support/sdam_monitoring/replica_set_with_no_primary.yml +0 -112
  1746. data/spec/support/sdam_monitoring/replica_set_with_primary.yml +0 -111
  1747. data/spec/support/sdam_monitoring/replica_set_with_removal.yml +0 -106
  1748. data/spec/support/sdam_monitoring/required_replica_set.yml +0 -84
  1749. data/spec/support/sdam_monitoring/standalone.yml +0 -70
  1750. data/spec/support/sdam_monitoring.rb +0 -144
  1751. data/spec/support/server_discovery_and_monitoring.rb +0 -236
  1752. data/spec/support/server_selection.rb +0 -163
  1753. data/spec/support/server_selection_rtt.rb +0 -41
  1754. data/spec/support/transactions/operation.rb +0 -373
  1755. data/spec/support/transactions.rb +0 -391
  1756. data/spec/support/transactions_tests/abort.yml +0 -403
  1757. data/spec/support/transactions_tests/bulk.yml +0 -267
  1758. data/spec/support/transactions_tests/causal-consistency.yml +0 -173
  1759. data/spec/support/transactions_tests/commit.yml +0 -593
  1760. data/spec/support/transactions_tests/delete.yml +0 -184
  1761. data/spec/support/transactions_tests/error-labels.yml +0 -948
  1762. data/spec/support/transactions_tests/errors.yml +0 -125
  1763. data/spec/support/transactions_tests/findOneAndDelete.yml +0 -126
  1764. data/spec/support/transactions_tests/findOneAndReplace.yml +0 -140
  1765. data/spec/support/transactions_tests/findOneAndUpdate.yml +0 -228
  1766. data/spec/support/transactions_tests/insert.yml +0 -264
  1767. data/spec/support/transactions_tests/isolation.yml +0 -125
  1768. data/spec/support/transactions_tests/read-pref.yml +0 -340
  1769. data/spec/support/transactions_tests/reads.yml +0 -298
  1770. data/spec/support/transactions_tests/retryable-abort.yml +0 -1292
  1771. data/spec/support/transactions_tests/retryable-commit.yml +0 -1332
  1772. data/spec/support/transactions_tests/retryable-writes.yml +0 -208
  1773. data/spec/support/transactions_tests/run-command.yml +0 -189
  1774. data/spec/support/transactions_tests/transaction-options.yml +0 -877
  1775. data/spec/support/transactions_tests/update.yml +0 -246
  1776. data/spec/support/transactions_tests/write-concern.yml +0 -236
  1777. data/spec/support/travis.rb +0 -14
@@ -1,21 +1,22 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  require 'spec_helper'
2
5
 
3
6
  describe Mongo::Collection do
4
7
 
5
- after do
6
- authorized_collection.delete_many
7
- end
8
+ let(:subscriber) { Mrss::EventSubscriber.new }
8
9
 
9
- let(:collection_invalid_write_concern) do
10
- authorized_collection.client.with(write: INVALID_WRITE_CONCERN)[authorized_collection.name]
10
+ let(:client) do
11
+ authorized_client.tap do |client|
12
+ client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
13
+ end
11
14
  end
12
15
 
13
- let(:collection_with_validator) do
14
- authorized_client[:validating]
15
- end
16
+ let(:authorized_collection) { client['collection_spec'] }
16
17
 
17
- let(:client) do
18
- authorized_client
18
+ before do
19
+ authorized_client['collection_spec'].drop
19
20
  end
20
21
 
21
22
  describe '#==' do
@@ -98,18 +99,116 @@ describe Mongo::Collection do
98
99
  end
99
100
  end
100
101
 
102
+ describe '#initialize' do
103
+
104
+ let(:client) do
105
+ new_local_client(SpecConfig.instance.addresses,
106
+ SpecConfig.instance.test_options.merge(monitoring_io: false))
107
+ end
108
+
109
+ let(:database) { client.database }
110
+
111
+ context 'write concern given in :write option' do
112
+ let(:collection) do
113
+ Mongo::Collection.new(database, 'foo', write: {w: 1})
114
+ end
115
+
116
+ it 'stores write concern' do
117
+ expect(collection.write_concern).to be_a(Mongo::WriteConcern::Acknowledged)
118
+ expect(collection.write_concern.options).to eq(w: 1)
119
+ end
120
+
121
+ it 'stores write concern under :write' do
122
+ expect(collection.options[:write]).to eq(w: 1)
123
+ expect(collection.options[:write_concern]).to be nil
124
+ end
125
+ end
126
+
127
+ context 'write concern given in :write_concern option' do
128
+ let(:collection) do
129
+ Mongo::Collection.new(database, 'foo', write_concern: {w: 1})
130
+ end
131
+
132
+ it 'stores write concern' do
133
+ expect(collection.write_concern).to be_a(Mongo::WriteConcern::Acknowledged)
134
+ expect(collection.write_concern.options).to eq(w: 1)
135
+ end
136
+
137
+ it 'stores write concern under :write_concern' do
138
+ expect(collection.options[:write_concern]).to eq(w: 1)
139
+ expect(collection.options[:write]).to be nil
140
+ end
141
+ end
142
+
143
+ context 'write concern given in both :write and :write_concern options' do
144
+ context 'identical values' do
145
+
146
+ let(:collection) do
147
+ Mongo::Collection.new(database, 'foo',
148
+ write: {w: 1}, write_concern: {w: 1})
149
+ end
150
+
151
+ it 'stores write concern' do
152
+ expect(collection.write_concern).to be_a(Mongo::WriteConcern::Acknowledged)
153
+ expect(collection.write_concern.options).to eq(w: 1)
154
+ end
155
+
156
+ it 'stores write concern under both options' do
157
+ expect(collection.options[:write]).to eq(w: 1)
158
+ expect(collection.options[:write_concern]).to eq(w: 1)
159
+ end
160
+ end
161
+
162
+ context 'different values' do
163
+
164
+ let(:collection) do
165
+ Mongo::Collection.new(database, 'foo',
166
+ write: {w: 1}, write_concern: {w: 2})
167
+ end
168
+
169
+ it 'raises an exception' do
170
+ expect do
171
+ collection
172
+ end.to raise_error(ArgumentError, /If :write and :write_concern are both given, they must be identical/)
173
+ end
174
+ end
175
+ end
176
+
177
+ =begin WriteConcern object support
178
+ context 'when write concern is provided via a WriteConcern object' do
179
+
180
+ let(:collection) do
181
+ Mongo::Collection.new(database, 'foo', write_concern: wc)
182
+ end
183
+
184
+ let(:wc) { Mongo::WriteConcern.get(w: 2) }
185
+
186
+ it 'stores write concern options in collection options' do
187
+ expect(collection.options[:write_concern]).to eq(w: 2)
188
+ end
189
+
190
+ it 'caches write concern object' do
191
+ expect(collection.write_concern).to be wc
192
+ end
193
+ end
194
+ =end
195
+ end
196
+
101
197
  describe '#with' do
102
198
 
103
199
  let(:client) do
104
- Mongo::Client.new(SpecConfig.instance.addresses, TEST_OPTIONS)
200
+ new_local_client_nmio(SpecConfig.instance.addresses,
201
+ SpecConfig.instance.test_options.merge(
202
+ SpecConfig.instance.auth_options
203
+ ))
105
204
  end
106
205
 
107
206
  let(:database) do
108
- Mongo::Database.new(client, :test)
207
+ Mongo::Database.new(client, SpecConfig.instance.test_db)
109
208
  end
110
209
 
111
210
  let(:collection) do
112
- database.collection(:users)
211
+ database.collection('test-collection')
113
212
  end
114
213
 
115
214
  let(:new_collection) do
@@ -133,7 +232,8 @@ describe Mongo::Collection do
133
232
  context 'when the client has a server selection timeout setting' do
134
233
 
135
234
  let(:client) do
136
- Mongo::Client.new(SpecConfig.instance.addresses, TEST_OPTIONS.merge(server_selection_timeout: 2))
235
+ new_local_client(SpecConfig.instance.addresses,
236
+ SpecConfig.instance.test_options.merge(server_selection_timeout: 2, monitoring_io: false))
137
237
  end
138
238
 
139
239
  it 'passes the the server_selection_timeout to the cluster' do
@@ -144,19 +244,101 @@ describe Mongo::Collection do
144
244
  context 'when the client has a read preference set' do
145
245
 
146
246
  let(:client) do
147
- Mongo::Client.new(SpecConfig.instance.addresses, TEST_OPTIONS.merge(read: { mode: :primary_preferred }))
247
+ authorized_client.with(client_options).tap do |client|
248
+ expect(client.options[:read]).to eq(Mongo::Options::Redacted.new(
249
+ mode: :primary_preferred))
250
+ client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
251
+ end
252
+ end
253
+
254
+ let(:client_options) do
255
+ {
256
+ read: { mode: :primary_preferred },
257
+ monitoring_io: false,
258
+ }
259
+ end
260
+
261
+ let(:new_options) do
262
+ { read: { mode: :secondary } }
148
263
  end
149
264
 
150
265
  it 'sets the new read options on the new collection' do
151
- expect(new_collection.read_preference).to eq(new_options[:read])
152
- expect(new_collection.read_preference).not_to eq(client.read_preference)
266
+ # This is strictly a Hash, not a BSON::Document like the client's
267
+ # read preference.
268
+ expect(new_collection.read_preference).to eq(mode: :secondary)
269
+ end
270
+
271
+ it 'duplicates the read option' do
272
+ expect(new_collection.read_preference).not_to eql(client.read_preference)
273
+ end
274
+
275
+ context 'when reading from collection' do
276
+ # Since we are requesting a secondary read, we need a replica set.
277
+ require_topology :replica_set
278
+
279
+ let(:client_options) do
280
+ {read: { mode: :primary_preferred }}
281
+ end
282
+
283
+ shared_examples_for "uses collection's read preference when reading" do
284
+ it "uses collection's read preference when reading" do
285
+ expect do
286
+ new_collection.find.to_a.count
287
+ end.not_to raise_error
288
+
289
+ event = subscriber.started_events.detect do |event|
290
+ event.command['find']
291
+ end
292
+ actual_rp = event.command['$readPreference']
293
+ expect(actual_rp).to eq(expected_read_preference)
294
+ end
295
+ end
296
+
297
+ context 'post-OP_MSG server' do
298
+ min_server_fcv '3.6'
299
+
300
+ context 'standalone' do
301
+ require_topology :single
302
+
303
+ let(:expected_read_preference) do
304
+ nil
305
+ end
306
+
307
+ it_behaves_like "uses collection's read preference when reading"
308
+ end
309
+
310
+ context 'RS, sharded' do
311
+ require_topology :replica_set, :sharded
312
+
313
+ let(:expected_read_preference) do
314
+ {'mode' => 'secondary'}
315
+ end
316
+
317
+ it_behaves_like "uses collection's read preference when reading"
318
+ end
319
+ end
320
+
321
+ context 'pre-OP-MSG server' do
322
+ max_server_version '3.4'
323
+
324
+ let(:expected_read_preference) do
325
+ nil
326
+ end
327
+
328
+ it_behaves_like "uses collection's read preference when reading"
329
+ end
153
330
  end
154
331
  end
155
332
 
156
333
  context 'when the client has a read preference and server selection timeout set' do
157
334
 
158
335
  let(:client) do
159
- Mongo::Client.new(SpecConfig.instance.addresses, TEST_OPTIONS.merge(read: { mode: :primary_preferred }, server_selection_timeout: 2))
336
+ new_local_client(SpecConfig.instance.addresses,
337
+ SpecConfig.instance.test_options.merge(
338
+ read: { mode: :primary_preferred },
339
+ server_selection_timeout: 2,
340
+ monitoring_io: false
341
+ ))
160
342
  end
161
343
 
162
344
  it 'sets the new read options on the new collection' do
@@ -186,12 +368,116 @@ describe Mongo::Collection do
186
368
  context 'when the client has a write concern set' do
187
369
 
188
370
  let(:client) do
189
- Mongo::Client.new(SpecConfig.instance.addresses, TEST_OPTIONS.merge(write: INVALID_WRITE_CONCERN))
371
+ new_local_client(SpecConfig.instance.addresses,
372
+ SpecConfig.instance.test_options.merge(
373
+ write: INVALID_WRITE_CONCERN,
374
+ monitoring_io: false,
375
+ ))
190
376
  end
191
377
 
192
378
  it 'sets the new write options on the new collection' do
193
379
  expect(new_collection.write_concern.options).to eq(Mongo::WriteConcern.get(new_options[:write]).options)
194
380
  end
381
+
382
+ context 'when client uses :write_concern and collection uses :write' do
383
+
384
+ let(:client) do
385
+ new_local_client(SpecConfig.instance.addresses,
386
+ SpecConfig.instance.test_options.merge(
387
+ write_concern: {w: 1},
388
+ monitoring_io: false,
389
+ ))
390
+ end
391
+
392
+ it 'uses :write from collection options only' do
393
+ expect(new_collection.options[:write]).to eq(w: 5)
394
+ expect(new_collection.options[:write_concern]).to be nil
395
+ end
396
+ end
397
+
398
+ context 'when client uses :write and collection uses :write_concern' do
399
+
400
+ let(:client) do
401
+ new_local_client(SpecConfig.instance.addresses,
402
+ SpecConfig.instance.test_options.merge(
403
+ write: {w: 1},
404
+ monitoring_io: false,
405
+ ))
406
+ end
407
+
408
+ let(:new_options) do
409
+ { write_concern: { w: 5 } }
410
+ end
411
+
412
+ it 'uses :write_concern from collection options only' do
413
+ expect(new_collection.options[:write_concern]).to eq(w: 5)
414
+ expect(new_collection.options[:write]).to be nil
415
+ end
416
+ end
417
+
418
+ context 'when collection previously had :wrte_concern and :write is used with a different value' do
419
+
420
+ let(:collection) do
421
+ database.collection(:users, write_concern: {w: 2})
422
+ end
423
+
424
+ let(:new_options) do
425
+ { write: { w: 5 } }
426
+ end
427
+
428
+ it 'uses the new option' do
429
+ expect(new_collection.options[:write]).to eq(w: 5)
430
+ expect(new_collection.options[:write_concern]).to be nil
431
+ end
432
+ end
433
+
434
+ context 'when collection previously had :wrte and :write_concern is used with a different value' do
435
+
436
+ let(:collection) do
437
+ database.collection(:users, write: {w: 2})
438
+ end
439
+
440
+ let(:new_options) do
441
+ { write_concern: { w: 5 } }
442
+ end
443
+
444
+ it 'uses the new option' do
445
+ expect(new_collection.options[:write_concern]).to eq(w: 5)
446
+ expect(new_collection.options[:write]).to be nil
447
+ end
448
+ end
449
+
450
+ context 'when collection previously had :wrte_concern and :write is used with the same value' do
451
+
452
+ let(:collection) do
453
+ database.collection(:users, write_concern: {w: 2})
454
+ end
455
+
456
+ let(:new_options) do
457
+ { write: { w: 2 } }
458
+ end
459
+
460
+ it 'uses the new option' do
461
+ expect(new_collection.options[:write]).to eq(w: 2)
462
+ expect(new_collection.options[:write_concern]).to be nil
463
+ end
464
+ end
465
+
466
+ context 'when collection previously had :wrte and :write_concern is used with the same value' do
467
+
468
+ let(:collection) do
469
+ database.collection(:users, write: {w: 2})
470
+ end
471
+
472
+ let(:new_options) do
473
+ { write_concern: { w: 2 } }
474
+ end
475
+
476
+ it 'uses the new option' do
477
+ expect(new_collection.options[:write]).to be nil
478
+ expect(new_collection.options[:write_concern]).to eq(w: 2)
479
+ end
480
+ end
195
481
  end
196
482
  end
197
483
 
@@ -219,7 +505,11 @@ describe Mongo::Collection do
219
505
  context 'when the client has a server selection timeout setting' do
220
506
 
221
507
  let(:client) do
222
- Mongo::Client.new(SpecConfig.instance.addresses, TEST_OPTIONS.merge(server_selection_timeout: 2))
508
+ new_local_client(SpecConfig.instance.addresses,
509
+ SpecConfig.instance.test_options.merge(
510
+ server_selection_timeout: 2,
511
+ monitoring_io: false,
512
+ ))
223
513
  end
224
514
 
225
515
  it 'passes the server_selection_timeout setting to the cluster' do
@@ -230,7 +520,11 @@ describe Mongo::Collection do
230
520
  context 'when the client has a read preference set' do
231
521
 
232
522
  let(:client) do
233
- Mongo::Client.new(SpecConfig.instance.addresses, TEST_OPTIONS.merge(read: { mode: :primary_preferred }))
523
+ new_local_client(SpecConfig.instance.addresses,
524
+ SpecConfig.instance.test_options.merge(
525
+ read: { mode: :primary_preferred },
526
+ monitoring_io: false,
527
+ ))
234
528
  end
235
529
 
236
530
  it 'sets the new read options on the new collection' do
@@ -357,13 +651,10 @@ describe Mongo::Collection do
357
651
  end
358
652
 
359
653
  before do
654
+ authorized_client[:specs].drop
360
655
  collection.create
361
656
  end
362
657
 
363
- after do
364
- collection.drop
365
- end
366
-
367
658
  it 'returns true' do
368
659
  expect(collection).to be_capped
369
660
  end
@@ -376,4240 +667,33 @@ describe Mongo::Collection do
376
667
  end
377
668
 
378
669
  before do
670
+ authorized_client[:specs].drop
379
671
  collection.create
380
672
  end
381
673
 
382
- after do
383
- collection.drop
384
- end
385
-
386
674
  it 'returns false' do
387
675
  expect(collection).to_not be_capped
388
676
  end
389
677
  end
390
678
  end
391
679
 
392
- describe '#create' do
393
-
394
- let(:database) do
395
- authorized_client.database
396
- end
397
-
398
- context 'when the collection has no options' do
399
-
400
- let(:collection) do
401
- described_class.new(database, :specs)
402
- end
403
-
404
- let!(:response) do
405
- collection.create
406
- end
407
-
408
- after do
409
- collection.drop
410
- end
411
-
412
- it 'executes the command' do
413
- expect(response).to be_successful
414
- end
680
+ describe '#inspect' do
415
681
 
416
- it 'creates the collection in the database' do
417
- expect(database.collection_names).to include('specs')
418
- end
682
+ it 'includes the object id' do
683
+ expect(authorized_collection.inspect).to include(authorized_collection.object_id.to_s)
419
684
  end
420
685
 
421
- context 'when the collection has options' do
422
-
423
- context 'when the collection is capped' do
424
-
425
- shared_examples 'a capped collection command' do
426
-
427
- let!(:response) do
428
- collection.create
429
- end
430
-
431
- let(:options) do
432
- { :capped => true, :size => 1024 }
433
- end
434
-
435
- after do
436
- collection.drop
437
- end
438
-
439
- it 'executes the command' do
440
- expect(response).to be_successful
441
- end
442
-
443
- it 'sets the collection as capped' do
444
- expect(collection).to be_capped
445
- end
446
-
447
- it 'creates the collection in the database' do
448
- expect(database.collection_names).to include('specs')
449
- end
450
- end
451
-
452
- shared_examples 'a validated collection command' do
453
-
454
- let!(:response) do
455
- collection.create
456
- end
457
-
458
- let(:options) do
459
- { :validator => { fieldName: { '$gte' => 1024 } },
460
- :validationLevel => 'strict' }
461
- end
462
-
463
- let(:collection_info) do
464
- database.list_collections.find { |i| i['name'] == 'specs' }
465
- end
466
-
467
- after do
468
- collection.drop
469
- end
470
-
471
- it 'executes the command' do
472
- expect(response).to be_successful
473
- end
474
-
475
- it 'sets the collection with validators' do
476
- expect(collection_info['options']['validator']).to eq({ 'fieldName' => { '$gte' => 1024 } })
477
- end
478
-
479
- it 'creates the collection in the database' do
480
- expect(database.collection_names).to include('specs')
481
- end
482
- end
483
-
484
- context 'when instantiating a collection directly' do
485
-
486
- let(:collection) do
487
- described_class.new(database, :specs, options)
488
- end
489
-
490
- it_behaves_like 'a capped collection command'
491
-
492
- context 'when validators can be set' do
493
- min_server_version '3.2'
494
- it_behaves_like 'a validated collection command'
495
- end
496
- end
497
-
498
- context 'when instantiating a collection through the database' do
499
-
500
- let(:collection) do
501
- authorized_client[:specs, options]
502
- end
503
-
504
- it_behaves_like 'a capped collection command'
505
-
506
- context 'when validators can be set' do
507
- min_server_version '3.2'
508
- it_behaves_like 'a validated collection command'
509
- end
510
- end
511
- end
512
-
513
- context 'when the collection has a write concern' do
514
-
515
- after do
516
- database[:specs].drop
517
- end
518
-
519
- let(:options) do
520
- {
521
- write: INVALID_WRITE_CONCERN
522
- }
523
- end
524
-
525
- let(:collection) do
526
- described_class.new(database, :specs, options)
527
- end
528
-
529
- context 'when the server supports write concern on the create command', if: replica_set? && collation_enabled? do
530
-
531
- it 'applies the write concern' do
532
- expect{
533
- collection.create
534
- }.to raise_exception(Mongo::Error::OperationFailure)
535
- end
536
- end
537
-
538
- context 'when the server does not support write concern on the create command', unless: collation_enabled? do
539
-
540
- it 'does not apply the write concern' do
541
- expect(collection.create).to be_successful
542
- end
543
- end
544
- end
545
-
546
- context 'when the collection has a collation' do
547
-
548
- shared_examples 'a collection command with a collation option' do
549
-
550
- let(:response) do
551
- collection.create
552
- end
553
-
554
- let(:options) do
555
- { :collation => { locale: 'fr' } }
556
- end
557
-
558
- let(:collection_info) do
559
- database.list_collections.find { |i| i['name'] == 'specs' }
560
- end
561
-
562
- after do
563
- collection.drop
564
- end
565
-
566
- context 'when the server supports collations', if: collation_enabled? do
567
-
568
- it 'executes the command' do
569
- expect(response).to be_successful
570
- end
571
-
572
- it 'sets the collection with a collation' do
573
- response
574
- expect(collection_info['options']['collation']['locale']).to eq('fr')
575
- end
576
-
577
- it 'creates the collection in the database' do
578
- response
579
- expect(database.collection_names).to include('specs')
580
- end
581
- end
582
-
583
- context 'when the server does not support collations', unless: collation_enabled? do
584
-
585
- it 'raises an error' do
586
- expect {
587
- response
588
- }.to raise_exception(Mongo::Error::UnsupportedCollation)
589
- end
590
-
591
- context 'when a String key is used' do
592
-
593
- let(:options) do
594
- { 'collation' => { locale: 'fr' } }
595
- end
596
-
597
- it 'raises an exception' do
598
- expect {
599
- response
600
- }.to raise_exception(Mongo::Error::UnsupportedCollation)
601
- end
602
- end
603
- end
604
- end
605
-
606
- context 'when instantiating a collection directly' do
607
-
608
- let(:collection) do
609
- described_class.new(database, :specs, options)
610
- end
611
-
612
- it_behaves_like 'a collection command with a collation option'
613
- end
614
-
615
- context 'when instantiating a collection through the database' do
616
-
617
- let(:collection) do
618
- authorized_client[:specs, options]
619
- end
620
-
621
- it_behaves_like 'a collection command with a collation option'
622
- end
623
- end
624
-
625
- context 'when a session is provided' do
626
-
627
- let(:collection) do
628
- authorized_client[:specs]
629
- end
630
-
631
- let(:operation) do
632
- collection.create(session: session)
633
- end
634
-
635
- let(:session) do
636
- authorized_client.start_session
637
- end
638
-
639
- let(:client) do
640
- authorized_client
641
- end
642
-
643
- let(:failed_operation) do
644
- authorized_client[:specs, invalid: true].create(session: session)
645
- end
646
-
647
- after do
648
- collection.drop
649
- end
650
-
651
- it_behaves_like 'an operation using a session'
652
- it_behaves_like 'a failed operation using a session'
653
- end
654
- end
655
- end
656
-
657
- describe '#drop' do
658
-
659
- let(:database) do
660
- authorized_client.database
661
- end
662
-
663
- let(:collection) do
664
- described_class.new(database, :specs)
665
- end
666
-
667
- context 'when the collection exists' do
668
-
669
- before do
670
- collection.create
671
- end
672
-
673
- context 'when a session is provided' do
674
-
675
- let(:operation) do
676
- collection.drop(session: session)
677
- end
678
-
679
- let(:failed_operation) do
680
- collection.with(write: INVALID_WRITE_CONCERN).drop(session: session)
681
- end
682
-
683
- let(:session) do
684
- authorized_client.start_session
685
- end
686
-
687
- let(:client) do
688
- authorized_client
689
- end
690
-
691
- after do
692
- collection.drop
693
- end
694
-
695
- it_behaves_like 'an operation using a session'
696
-
697
- # Due to how rspec interprets nested `if: condition` guards, we can't use one to skip this
698
- # test in the case that the server will override the write concern (preventing the expected
699
- # failure), so we're forced to use a traditional conditional to avoid defining the test.
700
- it_behaves_like 'a failed operation using a session' if can_set_write_concern?
701
- end
702
-
703
- context 'when the collection does not have a write concern set' do
704
-
705
- let!(:response) do
706
- collection.drop
707
- end
708
-
709
- it 'executes the command' do
710
- expect(response).to be_successful
711
- end
712
-
713
- it 'drops the collection from the database' do
714
- expect(database.collection_names).to_not include('specs')
715
- end
716
-
717
- context 'when the collection does not exist', if: can_set_write_concern? do
718
-
719
- it 'does not raise an error' do
720
- expect(database['non-existent-coll'].drop).to be(false)
721
- end
722
- end
723
- end
724
-
725
- context 'when the collection has a write concern' do
726
-
727
- let(:write_options) do
728
- {
729
- write: INVALID_WRITE_CONCERN
730
- }
731
- end
732
-
733
- let(:collection_with_write_options) do
734
- collection.with(write_options)
735
- end
736
-
737
- after do
738
- collection.drop
739
- end
740
-
741
- context 'when the server supports write concern on the drop command', if: collation_enabled? && can_set_write_concern? do
742
-
743
- it 'applies the write concern' do
744
- expect{
745
- collection_with_write_options.drop
746
- }.to raise_exception(Mongo::Error::OperationFailure)
747
- end
748
- end
749
-
750
- context 'when the server does not support write concern on the drop command', unless: collation_enabled? do
751
-
752
- it 'does not apply the write concern' do
753
- expect(collection_with_write_options.drop).to be_successful
754
- end
755
- end
756
- end
757
- end
758
-
759
- context 'when the collection does not exist', if: can_set_write_concern? do
760
-
761
- it 'returns false' do
762
- expect(collection.drop).to be(false)
763
- end
764
- end
765
- end
766
-
767
- describe '#find' do
768
-
769
- describe 'updating cluster time' do
770
-
771
- let(:operation) do
772
- client[TEST_COLL].find.first
773
- end
774
-
775
- let(:operation_with_session) do
776
- client[TEST_COLL].find({}, session: session).first
777
- end
778
-
779
- let(:second_operation) do
780
- client[TEST_COLL].find({}, session: session).first
781
- end
782
-
783
- it_behaves_like 'an operation updating cluster time'
784
- end
785
-
786
- context 'when provided a filter' do
787
-
788
- let(:view) do
789
- authorized_collection.find(name: 1)
790
- end
791
-
792
- it 'returns a authorized_collection view for the filter' do
793
- expect(view.filter).to eq('name' => 1)
794
- end
795
- end
796
-
797
- context 'when provided no filter' do
798
-
799
- let(:view) do
800
- authorized_collection.find
801
- end
802
-
803
- it 'returns a authorized_collection view with an empty filter' do
804
- expect(view.filter).to be_empty
805
- end
806
- end
807
-
808
- context 'when providing a bad filter' do
809
-
810
- let(:view) do
811
- authorized_collection.find('$or' => [])
812
- end
813
-
814
- it 'raises an exception when iterating' do
815
- expect {
816
- view.to_a
817
- }.to raise_exception(Mongo::Error::OperationFailure)
818
- end
819
- end
820
-
821
- context 'when iterating the authorized_collection view' do
822
-
823
- before do
824
- authorized_collection.insert_many([{ field: 'test1' }, { field: 'test2' }])
825
- end
826
-
827
- let(:view) do
828
- authorized_collection.find
829
- end
830
-
831
- it 'iterates over the documents' do
832
- view.each do |document|
833
- expect(document).to_not be_nil
834
- end
835
- end
836
- end
837
-
838
- context 'when the user is not authorized', if: auth_enabled? do
839
-
840
- let(:view) do
841
- unauthorized_collection.find
842
- end
843
-
844
- it 'iterates over the documents' do
845
- expect {
846
- view.each{ |document| document }
847
- }.to raise_error(Mongo::Error::OperationFailure)
848
- end
849
- end
850
-
851
- context 'when documents contain potential error message fields' do
852
-
853
- [ Mongo::Error::ERRMSG, Mongo::Error::ERROR, Mongo::Operation::Result::OK ].each do |field|
854
-
855
- context "when the document contains a '#{field}' field" do
856
-
857
- let(:value) do
858
- 'testing'
859
- end
860
-
861
- let(:view) do
862
- authorized_collection.find
863
- end
864
-
865
- before do
866
- authorized_collection.insert_one({ field => value })
867
- end
868
-
869
- it 'iterates over the documents' do
870
- view.each do |document|
871
- expect(document[field]).to eq(value)
872
- end
873
- end
874
- end
875
- end
876
- end
877
-
878
- context 'when provided options' do
879
-
880
- context 'when a session is provided' do
881
-
882
- let(:operation) do
883
- authorized_collection.find({}, session: session).to_a
884
- end
885
-
886
- let(:session) do
887
- authorized_client.start_session
888
- end
889
-
890
- let(:failed_operation) do
891
- client[authorized_collection.name].find({ '$._id' => 1 }, session: session).to_a
892
- end
893
-
894
- let(:client) do
895
- authorized_client
896
- end
897
-
898
- it_behaves_like 'an operation using a session'
899
- it_behaves_like 'a failed operation using a session'
900
- end
901
-
902
- context 'session id', if: test_sessions? do
903
-
904
- let(:options) do
905
- { session: session }
906
- end
907
-
908
- let(:client) do
909
- subscribed_client
910
- end
911
-
912
- let(:session) do
913
- client.start_session
914
- end
915
-
916
- let(:view) do
917
- Mongo::Collection::View.new(client[TEST_COLL], selector, view_options)
918
- end
919
-
920
- let(:command) do
921
- client[TEST_COLL].find({}, session: session).explain
922
- EventSubscriber.started_events.find { |c| c.command_name == 'explain' }.command
923
- end
924
-
925
- it 'sends the session id' do
926
- expect(command['lsid']).to eq(session.session_id)
927
- end
928
- end
929
-
930
- context 'when a session supporting causal consistency is used' do
931
-
932
- let(:operation) do
933
- collection.find({}, session: session).to_a
934
- end
935
-
936
- let(:command) do
937
- operation
938
- EventSubscriber.started_events.find { |cmd| cmd.command_name == 'find' }.command
939
- end
940
-
941
- it_behaves_like 'an operation supporting causally consistent reads'
942
- end
943
-
944
- let(:view) do
945
- authorized_collection.find({}, options)
946
- end
947
-
948
- context 'when provided :allow_partial_results' do
949
-
950
- let(:options) do
951
- { allow_partial_results: true }
952
- end
953
-
954
- it 'returns a view with :allow_partial_results set' do
955
- expect(view.options[:allow_partial_results]).to be(options[:allow_partial_results])
956
- end
957
- end
958
-
959
- context 'when provided :batch_size' do
960
-
961
- let(:options) do
962
- { batch_size: 100 }
963
- end
964
-
965
- it 'returns a view with :batch_size set' do
966
- expect(view.options[:batch_size]).to eq(options[:batch_size])
967
- end
968
- end
969
-
970
- context 'when provided :comment' do
971
-
972
- let(:options) do
973
- { comment: 'slow query' }
974
- end
975
-
976
- it 'returns a view with :comment set' do
977
- expect(view.modifiers[:$comment]).to eq(options[:comment])
978
- end
979
- end
980
-
981
- context 'when provided :cursor_type' do
982
-
983
- let(:options) do
984
- { cursor_type: :tailable }
985
- end
986
-
987
- it 'returns a view with :cursor_type set' do
988
- expect(view.options[:cursor_type]).to eq(options[:cursor_type])
989
- end
990
- end
991
-
992
- context 'when provided :max_time_ms' do
993
-
994
- let(:options) do
995
- { max_time_ms: 500 }
996
- end
997
-
998
- it 'returns a view with :max_time_ms set' do
999
- expect(view.modifiers[:$maxTimeMS]).to eq(options[:max_time_ms])
1000
- end
1001
- end
1002
-
1003
- context 'when provided :modifiers' do
1004
-
1005
- let(:options) do
1006
- { modifiers: { '$orderby' => Mongo::Index::ASCENDING } }
1007
- end
1008
-
1009
- it 'returns a view with modifiers set' do
1010
- expect(view.modifiers).to eq(options[:modifiers])
1011
- end
1012
-
1013
- it 'dups the modifiers hash' do
1014
- expect(view.modifiers).not_to be(options[:modifiers])
1015
- end
1016
- end
1017
-
1018
- context 'when provided :no_cursor_timeout' do
1019
-
1020
- let(:options) do
1021
- { no_cursor_timeout: true }
1022
- end
1023
-
1024
- it 'returns a view with :no_cursor_timeout set' do
1025
- expect(view.options[:no_cursor_timeout]).to eq(options[:no_cursor_timeout])
1026
- end
1027
- end
1028
-
1029
- context 'when provided :oplog_replay' do
1030
-
1031
- let(:options) do
1032
- { oplog_replay: false }
1033
- end
1034
-
1035
- it 'returns a view with :oplog_replay set' do
1036
- expect(view.options[:oplog_replay]).to eq(options[:oplog_replay])
1037
- end
1038
- end
1039
-
1040
- context 'when provided :projection' do
1041
-
1042
- let(:options) do
1043
- { projection: { 'x' => 1 } }
1044
- end
1045
-
1046
- it 'returns a view with :projection set' do
1047
- expect(view.options[:projection]).to eq(options[:projection])
1048
- end
1049
- end
1050
-
1051
- context 'when provided :skip' do
1052
-
1053
- let(:options) do
1054
- { skip: 5 }
1055
- end
1056
-
1057
- it 'returns a view with :skip set' do
1058
- expect(view.options[:skip]).to eq(options[:skip])
1059
- end
1060
- end
1061
-
1062
- context 'when provided :sort' do
1063
-
1064
- let(:options) do
1065
- { sort: { 'x' => Mongo::Index::ASCENDING } }
1066
- end
1067
-
1068
- it 'returns a view with :sort set' do
1069
- expect(view.modifiers[:$orderby]).to eq(options[:sort])
1070
- end
1071
- end
1072
-
1073
- context 'when provided :collation' do
1074
-
1075
- let(:options) do
1076
- { collation: { 'locale' => 'en_US' } }
1077
- end
1078
-
1079
- it 'returns a view with :collation set' do
1080
- expect(view.options[:collation]).to eq(options[:collation])
1081
- end
1082
- end
1083
- end
1084
- end
1085
-
1086
- describe '#insert_many' do
1087
-
1088
- let(:result) do
1089
- authorized_collection.insert_many([{ name: 'test1' }, { name: 'test2' }])
1090
- end
1091
-
1092
- it 'inserts the documents into the collection' do
1093
- expect(result.inserted_count).to eq(2)
1094
- end
1095
-
1096
- it 'contains the ids in the result' do
1097
- expect(result.inserted_ids.size).to eq(2)
1098
- end
1099
-
1100
- context 'when a session is provided' do
1101
-
1102
- let(:session) do
1103
- authorized_client.start_session
1104
- end
1105
-
1106
- let(:operation) do
1107
- authorized_collection.insert_many([{ name: 'test1' }, { name: 'test2' }], session: session)
1108
- end
1109
-
1110
- let(:failed_operation) do
1111
- authorized_collection.insert_many([{ _id: 'test1' }, { _id: 'test1' }], session: session)
1112
- end
1113
-
1114
- let(:client) do
1115
- authorized_client
1116
- end
1117
-
1118
- it_behaves_like 'an operation using a session'
1119
- it_behaves_like 'a failed operation using a session'
1120
- end
1121
-
1122
- context 'when unacknowledged writes is used with an explicit session' do
1123
-
1124
- let(:collection_with_unacknowledged_write_concern) do
1125
- authorized_collection.with(write: { w: 0 })
1126
- end
1127
-
1128
- let(:operation) do
1129
- collection_with_unacknowledged_write_concern.insert_many([{ name: 'test1' }, { name: 'test2' }], session: session)
1130
- end
1131
-
1132
- it_behaves_like 'an explicit session with an unacknowledged write'
1133
- end
1134
-
1135
- context 'when unacknowledged writes is used with an implicit session' do
1136
-
1137
- let(:collection_with_unacknowledged_write_concern) do
1138
- subscribed_client.with(write: { w: 0 })[TEST_COLL]
1139
- end
1140
-
1141
- let(:operation) do
1142
- collection_with_unacknowledged_write_concern.insert_many([{ name: 'test1' }, { name: 'test2' }])
1143
- end
1144
-
1145
- it_behaves_like 'an implicit session with an unacknowledged write'
1146
- end
1147
-
1148
- context 'when a document contains invalid keys' do
1149
-
1150
- let(:docs) do
1151
- [ { 'first.name' => 'test1' }, { name: 'test2' } ]
1152
- end
1153
-
1154
- it 'raises a BSON::String::IllegalKey exception' do
1155
- expect {
1156
- authorized_collection.insert_many(docs)
1157
- }.to raise_exception(BSON::String::IllegalKey)
1158
- end
1159
- end
1160
-
1161
- context 'when the client has a custom id generator' do
1162
-
1163
- let(:generator) do
1164
- Class.new do
1165
- def generate
1166
- 1
1167
- end
1168
- end.new
1169
- end
1170
-
1171
- let(:custom_client) do
1172
- authorized_client.with(id_generator: generator)
1173
- end
1174
-
1175
- let(:custom_collection) do
1176
- custom_client[TEST_COLL]
1177
- end
1178
-
1179
- before do
1180
- custom_collection.insert_many([{ name: 'testing' }])
1181
- end
1182
-
1183
- after do
1184
- custom_client.close
1185
- end
1186
-
1187
- it 'inserts with the custom id' do
1188
- expect(custom_collection.find.first[:_id]).to eq(1)
1189
- end
1190
- end
1191
-
1192
- context 'when the inserts fail' do
1193
-
1194
- let(:result) do
1195
- authorized_collection.insert_many([{ _id: 1 }, { _id: 1 }])
1196
- end
1197
-
1198
- it 'raises an BulkWriteError' do
1199
- expect {
1200
- result
1201
- }.to raise_exception(Mongo::Error::BulkWriteError)
1202
- end
1203
- end
1204
-
1205
- context "when the documents exceed the max bson size" do
1206
-
1207
- let(:documents) do
1208
- [{ '_id' => 1, 'name' => '1'*17000000 }]
1209
- end
1210
-
1211
- it 'raises a MaxBSONSize error' do
1212
- expect {
1213
- authorized_collection.insert_many(documents)
1214
- }.to raise_error(Mongo::Error::MaxBSONSize)
1215
- end
1216
- end
1217
-
1218
- context 'when the documents are sent with OP_MSG', if: op_msg_enabled? do
1219
-
1220
- let(:client) do
1221
- subscribed_client
1222
- end
1223
-
1224
- let(:documents) do
1225
- [{ '_id' => 1, 'name' => '1'*16777191 }, { '_id' => 'y' }]
1226
- end
1227
-
1228
- before do
1229
- client[TEST_COLL].insert_many(documents)
1230
- end
1231
-
1232
- after do
1233
- client.close
1234
- end
1235
-
1236
- let(:insert_events) do
1237
- EventSubscriber.started_events.select { |e| e.command_name == 'insert' }
1238
- end
1239
-
1240
- it 'sends the documents in one OP_MSG' do
1241
- expect(insert_events.size).to eq(1)
1242
- expect(insert_events[0].command['documents']).to eq(documents)
1243
- end
1244
- end
1245
-
1246
- context 'when collection has a validator' do
1247
- min_server_version '3.2'
1248
-
1249
- around(:each) do |spec|
1250
- authorized_client[:validating,
1251
- :validator => { :a => { '$exists' => true } }].tap do |c|
1252
- c.create
1253
- end
1254
- spec.run
1255
- collection_with_validator.drop
1256
- end
1257
-
1258
- context 'when the document is valid' do
1259
-
1260
- let(:result) do
1261
- collection_with_validator.insert_many([{ a: 1 }, { a: 2 }])
1262
- end
1263
-
1264
- it 'inserts successfully' do
1265
- expect(result.inserted_count).to eq(2)
1266
- end
1267
- end
1268
-
1269
- context 'when the document is invalid' do
1270
-
1271
- context 'when bypass_document_validation is not set' do
1272
-
1273
- let(:result2) do
1274
- collection_with_validator.insert_many([{ x: 1 }, { x: 2 }])
1275
- end
1276
-
1277
- it 'raises a BulkWriteError' do
1278
- expect {
1279
- result2
1280
- }.to raise_exception(Mongo::Error::BulkWriteError)
1281
- end
1282
- end
1283
-
1284
- context 'when bypass_document_validation is true' do
1285
-
1286
- let(:result3) do
1287
- collection_with_validator.insert_many(
1288
- [{ x: 1 }, { x: 2 }], :bypass_document_validation => true)
1289
- end
1290
-
1291
- it 'inserts successfully' do
1292
- expect(result3.inserted_count).to eq(2)
1293
- end
1294
- end
1295
- end
1296
- end
1297
-
1298
- context 'when unacknowledged writes is used' do
1299
-
1300
- let(:collection_with_unacknowledged_write_concern) do
1301
- authorized_collection.with(write: { w: 0 })
1302
- end
1303
-
1304
- let(:result) do
1305
- collection_with_unacknowledged_write_concern.insert_many([{ _id: 1 }, { _id: 1 }])
1306
- end
1307
-
1308
- it 'does not raise an exception' do
1309
- expect(result.inserted_count).to be(0)
1310
- end
1311
- end
1312
- end
1313
-
1314
- describe '#insert_one' do
1315
-
1316
- describe 'updating cluster time' do
1317
-
1318
- let(:operation) do
1319
- client[TEST_COLL].insert_one({ name: 'testing' })
1320
- end
1321
-
1322
- let(:operation_with_session) do
1323
- client[TEST_COLL].insert_one({ name: 'testing' }, session: session)
1324
- end
1325
-
1326
- let(:second_operation) do
1327
- client[TEST_COLL].insert_one({ name: 'testing' }, session: session)
1328
- end
1329
-
1330
- it_behaves_like 'an operation updating cluster time'
1331
- end
1332
-
1333
- let(:result) do
1334
- authorized_collection.insert_one({ name: 'testing' })
1335
- end
1336
-
1337
- it 'inserts the document into the collection'do
1338
- expect(result.written_count).to eq(1)
1339
- end
1340
-
1341
- it 'contains the id in the result' do
1342
- expect(result.inserted_id).to_not be_nil
1343
- end
1344
-
1345
- context 'when a session is provided' do
1346
-
1347
- let(:session) do
1348
- authorized_client.start_session
1349
- end
1350
-
1351
- let(:operation) do
1352
- authorized_collection.insert_one({ name: 'testing' }, session: session)
1353
- end
1354
-
1355
- let(:failed_operation) do
1356
- authorized_collection.insert_one({ _id: 'testing' })
1357
- authorized_collection.insert_one({ _id: 'testing' }, session: session)
1358
- end
1359
-
1360
- let(:client) do
1361
- authorized_client
1362
- end
1363
-
1364
- it_behaves_like 'an operation using a session'
1365
- it_behaves_like 'a failed operation using a session'
1366
- end
1367
-
1368
- context 'when unacknowledged writes is used with an explicit session' do
1369
-
1370
- let(:collection_with_unacknowledged_write_concern) do
1371
- authorized_collection.with(write: { w: 0 })
1372
- end
1373
-
1374
- let(:operation) do
1375
- collection_with_unacknowledged_write_concern.insert_one({ name: 'testing' }, session: session)
1376
- end
1377
-
1378
- it_behaves_like 'an explicit session with an unacknowledged write'
1379
- end
1380
-
1381
- context 'when unacknowledged writes is used with an implicit session' do
1382
-
1383
- let(:collection_with_unacknowledged_write_concern) do
1384
- subscribed_client.with(write: { w: 0 })[TEST_COLL]
1385
- end
1386
-
1387
- let(:operation) do
1388
- collection_with_unacknowledged_write_concern.insert_one({ name: 'testing' })
1389
- end
1390
-
1391
- it_behaves_like 'an implicit session with an unacknowledged write'
1392
- end
1393
-
1394
- context 'when the document contains invalid keys' do
1395
-
1396
- let(:doc) do
1397
- { 'testing.test' => 'value' }
1398
- end
1399
-
1400
- it 'raises a BSON::String::IllegalKey exception' do
1401
- expect {
1402
- authorized_collection.insert_one(doc)
1403
- }.to raise_exception(BSON::String::IllegalKey)
1404
- end
1405
- end
1406
-
1407
- context 'when the insert fails' do
1408
-
1409
- let(:result) do
1410
- authorized_collection.insert_one(_id: 1)
1411
- authorized_collection.insert_one(_id: 1)
1412
- end
1413
-
1414
- it 'raises an OperationFailure' do
1415
- expect {
1416
- result
1417
- }.to raise_exception(Mongo::Error::OperationFailure)
1418
- end
1419
- end
1420
-
1421
- context 'when the client has a custom id generator' do
1422
-
1423
- let(:generator) do
1424
- Class.new do
1425
- def generate
1426
- 1
1427
- end
1428
- end.new
1429
- end
1430
-
1431
- let(:custom_client) do
1432
- authorized_client.with(id_generator: generator)
1433
- end
1434
-
1435
- let(:custom_collection) do
1436
- custom_client[TEST_COLL]
1437
- end
1438
-
1439
- before do
1440
- custom_collection.insert_one({ name: 'testing' })
1441
- end
1442
-
1443
- after do
1444
- custom_client.close
1445
- end
1446
-
1447
- it 'inserts with the custom id' do
1448
- expect(custom_collection.find.first[:_id]).to eq(1)
1449
- end
1450
- end
1451
-
1452
- context 'when collection has a validator' do
1453
- min_server_version '3.2'
1454
-
1455
- around(:each) do |spec|
1456
- authorized_client[:validating,
1457
- :validator => { :a => { '$exists' => true } }].tap do |c|
1458
- c.create
1459
- end
1460
- spec.run
1461
- collection_with_validator.drop
1462
- end
1463
-
1464
- context 'when the document is valid' do
1465
-
1466
- let(:result) do
1467
- collection_with_validator.insert_one({ a: 1 })
1468
- end
1469
-
1470
- it 'inserts successfully' do
1471
- expect(result.written_count).to eq(1)
1472
- end
1473
- end
1474
-
1475
- context 'when the document is invalid' do
1476
-
1477
- context 'when bypass_document_validation is not set' do
1478
-
1479
- let(:result2) do
1480
- collection_with_validator.insert_one({ x: 1 })
1481
- end
1482
-
1483
- it 'raises a OperationFailure' do
1484
- expect {
1485
- result2
1486
- }.to raise_exception(Mongo::Error::OperationFailure)
1487
- end
1488
- end
1489
-
1490
- context 'when bypass_document_validation is true' do
1491
-
1492
- let(:result3) do
1493
- collection_with_validator.insert_one(
1494
- { x: 1 }, :bypass_document_validation => true)
1495
- end
1496
-
1497
- it 'inserts successfully' do
1498
- expect(result3.written_count).to eq(1)
1499
- end
1500
- end
1501
- end
1502
- end
1503
- end
1504
-
1505
- describe '#inspect' do
1506
-
1507
- it 'includes the object id' do
1508
- expect(authorized_collection.inspect).to include(authorized_collection.object_id.to_s)
1509
- end
1510
-
1511
- it 'includes the namespace' do
1512
- expect(authorized_collection.inspect).to include(authorized_collection.namespace)
1513
- end
1514
- end
1515
-
1516
- describe '#indexes' do
1517
-
1518
- let(:index_spec) do
1519
- { name: 1 }
1520
- end
1521
-
1522
- let(:batch_size) { nil }
1523
-
1524
- let(:index_names) do
1525
- authorized_collection.indexes(batch_size: batch_size).collect { |i| i['name'] }
1526
- end
1527
-
1528
- before do
1529
- authorized_collection.indexes.create_one(index_spec, unique: true)
1530
- end
1531
-
1532
- after do
1533
- authorized_collection.indexes.drop_one('name_1')
1534
- end
1535
-
1536
- it 'returns a list of indexes' do
1537
- expect(index_names).to include(*'name_1', '_id_')
1538
- end
1539
-
1540
- context 'when a session is provided' do
1541
-
1542
- let(:session) do
1543
- authorized_client.start_session
1544
- end
1545
-
1546
- let(:operation) do
1547
- authorized_collection.indexes(batch_size: batch_size, session: session).collect { |i| i['name'] }
1548
- end
1549
-
1550
- let(:failed_operation) do
1551
- authorized_collection.indexes(batch_size: -100, session: session).collect { |i| i['name'] }
1552
- end
1553
-
1554
- let(:client) do
1555
- authorized_client
1556
- end
1557
-
1558
- it_behaves_like 'an operation using a session'
1559
- it_behaves_like 'a failed operation using a session'
1560
- end
1561
-
1562
- context 'when batch size is specified', unless: need_to_skip_on_sharded_auth_40? do
1563
-
1564
- let(:batch_size) { 1 }
1565
-
1566
- it 'returns a list of indexes' do
1567
- expect(index_names).to include(*'name_1', '_id_')
1568
- end
1569
- end
1570
- end
1571
-
1572
- describe '#aggregate' do
1573
-
1574
- describe 'updating cluster time' do
1575
-
1576
- let(:operation) do
1577
- client[TEST_COLL].aggregate([]).first
1578
- end
1579
-
1580
- let(:operation_with_session) do
1581
- client[TEST_COLL].aggregate([], session: session).first
1582
- end
1583
-
1584
- let(:second_operation) do
1585
- client[TEST_COLL].aggregate([], session: session).first
1586
- end
1587
-
1588
- it_behaves_like 'an operation updating cluster time'
1589
- end
1590
-
1591
- context 'when a session supporting causal consistency is used' do
1592
-
1593
- let(:operation) do
1594
- collection.aggregate([], session: session).first
1595
- end
1596
-
1597
- let(:command) do
1598
- operation
1599
- EventSubscriber.started_events.find { |cmd| cmd.command_name == 'aggregate' }.command
1600
- end
1601
-
1602
- it_behaves_like 'an operation supporting causally consistent reads'
1603
- end
1604
-
1605
- it 'returns an Aggregation object' do
1606
- expect(authorized_collection.aggregate([])).to be_a(Mongo::Collection::View::Aggregation)
1607
- end
1608
-
1609
- context 'when options are provided' do
1610
-
1611
- let(:options) do
1612
- { :allow_disk_use => true, :bypass_document_validation => true }
1613
- end
1614
-
1615
- it 'sets the options on the Aggregation object' do
1616
- expect(authorized_collection.aggregate([], options).options).to eq(BSON::Document.new(options))
1617
- end
1618
-
1619
- context 'when the :comment option is provided' do
1620
-
1621
- let(:options) do
1622
- { :comment => 'testing' }
1623
- end
1624
-
1625
- it 'sets the options on the Aggregation object' do
1626
- expect(authorized_collection.aggregate([], options).options).to eq(BSON::Document.new(options))
1627
- end
1628
- end
1629
-
1630
- context 'when a session is provided' do
1631
-
1632
- let(:session) do
1633
- authorized_client.start_session
1634
- end
1635
-
1636
- let(:operation) do
1637
- authorized_collection.aggregate([], session: session).to_a
1638
- end
1639
-
1640
- let(:failed_operation) do
1641
- authorized_collection.aggregate([ { '$invalid' => 1 }], session: session).to_a
1642
- end
1643
-
1644
- let(:client) do
1645
- authorized_client
1646
- end
1647
-
1648
- it_behaves_like 'an operation using a session'
1649
- it_behaves_like 'a failed operation using a session'
1650
- end
1651
-
1652
- context 'when a hint is provided' do
1653
-
1654
- let(:options) do
1655
- { 'hint' => { 'y' => 1 } }
1656
- end
1657
-
1658
- it 'sets the options on the Aggregation object' do
1659
- expect(authorized_collection.aggregate([], options).options).to eq(options)
1660
- end
1661
- end
1662
-
1663
- context 'when collation is provided' do
1664
-
1665
- before do
1666
- authorized_collection.insert_many([ { name: 'bang' }, { name: 'bang' }])
1667
- end
1668
-
1669
- let(:pipeline) do
1670
- [{ "$match" => { "name" => "BANG" } }]
1671
- end
1672
-
1673
- let(:options) do
1674
- { collation: { locale: 'en_US', strength: 2 } }
1675
- end
1676
-
1677
- let(:result) do
1678
- authorized_collection.aggregate(pipeline, options).collect { |doc| doc['name']}
1679
- end
1680
-
1681
- context 'when the server selected supports collations', if: collation_enabled? do
1682
-
1683
- it 'applies the collation' do
1684
- expect(result).to eq(['bang', 'bang'])
1685
- end
1686
- end
1687
-
1688
- context 'when the server selected does not support collations', unless: collation_enabled? do
1689
-
1690
- it 'raises an exception' do
1691
- expect {
1692
- result
1693
- }.to raise_exception(Mongo::Error::UnsupportedCollation)
1694
- end
1695
-
1696
- context 'when a String key is used' do
1697
-
1698
- let(:options) do
1699
- { 'collation' => { locale: 'en_US', strength: 2 } }
1700
- end
1701
-
1702
- it 'raises an exception' do
1703
- expect {
1704
- result
1705
- }.to raise_exception(Mongo::Error::UnsupportedCollation)
1706
- end
1707
- end
1708
- end
1709
- end
1710
- end
1711
- end
1712
-
1713
- describe '#count' do
1714
-
1715
- let(:documents) do
1716
- (1..10).map{ |i| { field: "test#{i}" }}
1717
- end
1718
-
1719
- before do
1720
- authorized_collection.insert_many(documents)
1721
- end
1722
-
1723
- it 'returns an integer count' do
1724
- expect(authorized_collection.count).to eq(10)
1725
- end
1726
-
1727
- context 'when options are provided' do
1728
-
1729
- it 'passes the options to the count' do
1730
- expect(authorized_collection.count({}, limit: 5)).to eq(5)
1731
- end
1732
-
1733
- context 'when a session is provided' do
1734
-
1735
- let(:session) do
1736
- authorized_client.start_session
1737
- end
1738
-
1739
- let(:operation) do
1740
- authorized_collection.count({}, session: session)
1741
- end
1742
-
1743
- let(:failed_operation) do
1744
- authorized_collection.count({ '$._id' => 1 }, session: session)
1745
- end
1746
-
1747
- let(:client) do
1748
- authorized_client
1749
- end
1750
-
1751
- it_behaves_like 'an operation using a session'
1752
- it_behaves_like 'a failed operation using a session'
1753
- end
1754
-
1755
- context 'when a session supporting causal consistency is used' do
1756
-
1757
- let(:operation) do
1758
- collection.count({}, session: session)
1759
- end
1760
-
1761
- let(:command) do
1762
- operation
1763
- EventSubscriber.started_events.find { |cmd| cmd.command_name == 'count' }.command
1764
- end
1765
-
1766
- it_behaves_like 'an operation supporting causally consistent reads'
1767
- end
1768
-
1769
- context 'when a collation is specified' do
1770
-
1771
- let(:selector) do
1772
- { name: 'BANG' }
1773
- end
1774
-
1775
- let(:result) do
1776
- authorized_collection.count(selector, options)
1777
- end
1778
-
1779
- before do
1780
- authorized_collection.insert_one(name: 'bang')
1781
- end
1782
-
1783
- let(:options) do
1784
- { collation: { locale: 'en_US', strength: 2 } }
1785
- end
1786
-
1787
- context 'when the server selected supports collations', if: collation_enabled? do
1788
-
1789
- it 'applies the collation to the count' do
1790
- expect(result).to eq(1)
1791
- end
1792
- end
1793
-
1794
- context 'when the server selected does not support collations', unless: collation_enabled? do
1795
-
1796
- it 'raises an exception' do
1797
- expect {
1798
- result
1799
- }.to raise_exception(Mongo::Error::UnsupportedCollation)
1800
- end
1801
-
1802
- context 'when a String key is used' do
1803
-
1804
- let(:options) do
1805
- { 'collation' => { locale: 'en_US', strength: 2 } }
1806
- end
1807
-
1808
- it 'raises an exception' do
1809
- expect {
1810
- result
1811
- }.to raise_exception(Mongo::Error::UnsupportedCollation)
1812
- end
1813
- end
1814
- end
1815
- end
1816
- end
1817
- end
1818
-
1819
- describe '#distinct' do
1820
-
1821
- let(:documents) do
1822
- (1..3).map{ |i| { field: "test#{i}" }}
1823
- end
1824
-
1825
- before do
1826
- authorized_collection.insert_many(documents)
1827
- end
1828
-
1829
- it 'returns the distinct values' do
1830
- expect(authorized_collection.distinct(:field).sort).to eq([ 'test1', 'test2', 'test3' ])
1831
- end
1832
-
1833
- context 'when a selector is provided' do
1834
-
1835
- it 'returns the distinct values' do
1836
- expect(authorized_collection.distinct(:field, field: 'test1')).to eq([ 'test1' ])
1837
- end
1838
- end
1839
-
1840
- context 'when options are provided' do
1841
-
1842
- it 'passes the options to the distinct command' do
1843
- expect(authorized_collection.distinct(:field, {}, max_time_ms: 100).sort).to eq([ 'test1', 'test2', 'test3' ])
1844
- end
1845
-
1846
- context 'when a session is provided' do
1847
-
1848
- let(:session) do
1849
- authorized_client.start_session
1850
- end
1851
-
1852
- let(:operation) do
1853
- authorized_collection.distinct(:field, {}, session: session)
1854
- end
1855
-
1856
- let(:failed_operation) do
1857
- authorized_collection.distinct(:field, { '$._id' => 1 }, session: session)
1858
- end
1859
-
1860
- let(:client) do
1861
- authorized_client
1862
- end
1863
-
1864
- it_behaves_like 'an operation using a session'
1865
- it_behaves_like 'a failed operation using a session'
1866
- end
1867
- end
1868
-
1869
- context 'when a session supporting causal consistency is used' do
1870
-
1871
- let(:operation) do
1872
- collection.distinct(:field, {}, session: session)
1873
- end
1874
-
1875
- let(:command) do
1876
- operation
1877
- EventSubscriber.started_events.find { |cmd| cmd.command_name == 'distinct' }.command
1878
- end
1879
-
1880
- it_behaves_like 'an operation supporting causally consistent reads'
1881
- end
1882
-
1883
- context 'when a collation is specified' do
1884
-
1885
- let(:result) do
1886
- authorized_collection.distinct(:name, {}, options)
1887
- end
1888
-
1889
- before do
1890
- authorized_collection.insert_one(name: 'bang')
1891
- authorized_collection.insert_one(name: 'BANG')
1892
- end
1893
-
1894
- let(:options) do
1895
- { collation: { locale: 'en_US', strength: 2 } }
1896
- end
1897
-
1898
- context 'when the server selected supports collations', if: collation_enabled? do
1899
-
1900
- it 'applies the collation to the distinct' do
1901
- expect(result).to eq(['bang'])
1902
- end
1903
- end
1904
-
1905
- context 'when the server selected does not support collations', unless: collation_enabled? do
1906
-
1907
- it 'raises an exception' do
1908
- expect {
1909
- result
1910
- }.to raise_exception(Mongo::Error::UnsupportedCollation)
1911
- end
1912
-
1913
- context 'when a String key is used' do
1914
-
1915
- let(:options) do
1916
- { 'collation' => { locale: 'en_US', strength: 2 } }
1917
- end
1918
-
1919
- it 'raises an exception' do
1920
- expect {
1921
- result
1922
- }.to raise_exception(Mongo::Error::UnsupportedCollation)
1923
- end
1924
- end
1925
- end
1926
- end
1927
-
1928
- context 'when a collation is not specified' do
1929
-
1930
- let(:result) do
1931
- authorized_collection.distinct(:name)
1932
- end
1933
-
1934
- before do
1935
- authorized_collection.insert_one(name: 'bang')
1936
- authorized_collection.insert_one(name: 'BANG')
1937
- end
1938
-
1939
- it 'does not apply the collation to the distinct' do
1940
- expect(result).to match_array(['bang', 'BANG'])
1941
- end
1942
- end
1943
- end
1944
-
1945
- describe '#delete_one' do
1946
-
1947
- context 'when a selector was provided' do
1948
-
1949
- let(:selector) do
1950
- { field: 'test1' }
1951
- end
1952
-
1953
- before do
1954
- authorized_collection.insert_many([
1955
- { field: 'test1' },
1956
- { field: 'test1' },
1957
- { field: 'test1' }
1958
- ])
1959
- end
1960
-
1961
- let(:response) do
1962
- authorized_collection.delete_one(selector)
1963
- end
1964
-
1965
- it 'deletes the first matching document in the collection' do
1966
- expect(response.deleted_count).to eq(1)
1967
- end
1968
- end
1969
-
1970
- context 'when no selector was provided' do
1971
-
1972
- before do
1973
- authorized_collection.insert_many([{ field: 'test1' }, { field: 'test2' }])
1974
- end
1975
-
1976
- let(:response) do
1977
- authorized_collection.delete_one
1978
- end
1979
-
1980
- it 'deletes the first document in the collection' do
1981
- expect(response.deleted_count).to eq(1)
1982
- end
1983
- end
1984
-
1985
- context 'when the delete fails', if: standalone? do
1986
-
1987
- let(:result) do
1988
- collection_invalid_write_concern.delete_one
1989
- end
1990
-
1991
- it 'raises an OperationFailure' do
1992
- expect {
1993
- result
1994
- }.to raise_exception(Mongo::Error::OperationFailure)
1995
- end
1996
- end
1997
-
1998
- context 'when a session is provided' do
1999
-
2000
- let(:session) do
2001
- authorized_client.start_session
2002
- end
2003
-
2004
- let(:operation) do
2005
- authorized_collection.delete_one({}, session: session)
2006
- end
2007
-
2008
- let(:failed_operation) do
2009
- authorized_collection.delete_one({ '$._id' => 1}, session: session)
2010
- end
2011
-
2012
- let(:client) do
2013
- authorized_client
2014
- end
2015
-
2016
- it_behaves_like 'an operation using a session'
2017
- it_behaves_like 'a failed operation using a session'
2018
- end
2019
-
2020
- context 'when unacknowledged writes is used' do
2021
-
2022
- let(:collection_with_unacknowledged_write_concern) do
2023
- authorized_collection.with(write: { w: 0 })
2024
- end
2025
-
2026
- let(:operation) do
2027
- collection_with_unacknowledged_write_concern.delete_one({}, session: session)
2028
- end
2029
-
2030
- it_behaves_like 'an explicit session with an unacknowledged write'
2031
- end
2032
-
2033
- context 'when unacknowledged writes is used with an implicit session' do
2034
-
2035
- let(:collection_with_unacknowledged_write_concern) do
2036
- subscribed_client.with(write: { w: 0 })[TEST_COLL]
2037
- end
2038
-
2039
- let(:operation) do
2040
- collection_with_unacknowledged_write_concern.delete_one
2041
- end
2042
-
2043
- it_behaves_like 'an implicit session with an unacknowledged write'
2044
- end
2045
-
2046
- context 'when a collation is provided' do
2047
-
2048
- let(:selector) do
2049
- { name: 'BANG' }
2050
- end
2051
-
2052
- let(:result) do
2053
- authorized_collection.delete_one(selector, options)
2054
- end
2055
-
2056
- before do
2057
- authorized_collection.insert_one(name: 'bang')
2058
- end
2059
-
2060
- let(:options) do
2061
- { collation: { locale: 'en_US', strength: 2 } }
2062
- end
2063
-
2064
- context 'when the server selected supports collations', if: collation_enabled? do
2065
-
2066
- it 'applies the collation' do
2067
- expect(result.written_count).to eq(1)
2068
- expect(authorized_collection.find(name: 'bang').count).to eq(0)
2069
- end
2070
-
2071
- context 'when unacknowledged writes is used' do
2072
-
2073
- let(:collection_with_unacknowledged_write_concern) do
2074
- authorized_collection.with(write: { w: 0 })
2075
- end
2076
-
2077
- let(:result) do
2078
- collection_with_unacknowledged_write_concern.delete_one(selector, options)
2079
- end
2080
-
2081
- it 'raises an exception' do
2082
- expect {
2083
- result
2084
- }.to raise_exception(Mongo::Error::UnsupportedCollation)
2085
- end
2086
-
2087
- context 'when a String key is used' do
2088
-
2089
- let(:options) do
2090
- { 'collation' => { locale: 'en_US', strength: 2 } }
2091
- end
2092
-
2093
- it 'raises an exception' do
2094
- expect {
2095
- result
2096
- }.to raise_exception(Mongo::Error::UnsupportedCollation)
2097
- end
2098
- end
2099
- end
2100
- end
2101
-
2102
- context 'when the server selected does not support collations', unless: collation_enabled? do
2103
-
2104
- it 'raises an exception' do
2105
- expect {
2106
- result
2107
- }.to raise_exception(Mongo::Error::UnsupportedCollation)
2108
- end
2109
-
2110
- context 'when a String key is used' do
2111
-
2112
- let(:options) do
2113
- { 'collation' => { locale: 'en_US', strength: 2 } }
2114
- end
2115
-
2116
- it 'raises an exception' do
2117
- expect {
2118
- result
2119
- }.to raise_exception(Mongo::Error::UnsupportedCollation)
2120
- end
2121
- end
2122
- end
2123
- end
2124
-
2125
- context 'when collation is not specified' do
2126
-
2127
- let(:selector) do
2128
- { name: 'BANG' }
2129
- end
2130
-
2131
- let(:result) do
2132
- authorized_collection.delete_one(selector)
2133
- end
2134
-
2135
- before do
2136
- authorized_collection.insert_one(name: 'bang')
2137
- end
2138
-
2139
- it 'does not apply the collation' do
2140
- expect(result.written_count).to eq(0)
2141
- expect(authorized_collection.find(name: 'bang').count).to eq(1)
2142
- end
2143
- end
2144
- end
2145
-
2146
- describe '#delete_many' do
2147
-
2148
- before do
2149
- authorized_collection.insert_many([{ field: 'test1' }, { field: 'test2' }])
2150
- end
2151
-
2152
- context 'when a selector was provided' do
2153
-
2154
- let(:selector) do
2155
- { field: 'test1' }
2156
- end
2157
-
2158
- it 'deletes the matching documents in the collection' do
2159
- expect(authorized_collection.delete_many(selector).deleted_count).to eq(1)
2160
- end
2161
- end
2162
-
2163
- context 'when no selector was provided' do
2164
-
2165
- it 'deletes all the documents in the collection' do
2166
- expect(authorized_collection.delete_many.deleted_count).to eq(2)
2167
- end
2168
- end
2169
-
2170
- context 'when the deletes fail', if: standalone? do
2171
-
2172
- let(:result) do
2173
- collection_invalid_write_concern.delete_many
2174
- end
2175
-
2176
- it 'raises an OperationFailure' do
2177
- expect {
2178
- result
2179
- }.to raise_exception(Mongo::Error::OperationFailure)
2180
- end
2181
- end
2182
-
2183
- context 'when a session is provided' do
2184
-
2185
- let(:session) do
2186
- authorized_client.start_session
2187
- end
2188
-
2189
- let(:operation) do
2190
- authorized_collection.delete_many({}, session: session)
2191
- end
2192
-
2193
- let(:failed_operation) do
2194
- authorized_collection.delete_many({ '$._id' => 1}, session: session)
2195
- end
2196
-
2197
- let(:client) do
2198
- authorized_client
2199
- end
2200
-
2201
- it_behaves_like 'an operation using a session'
2202
- it_behaves_like 'a failed operation using a session'
2203
- end
2204
-
2205
- context 'when unacknowledged writes is used with an explicit session' do
2206
-
2207
- let(:collection_with_unacknowledged_write_concern) do
2208
- authorized_collection.with(write: { w: 0 })
2209
- end
2210
-
2211
- let(:operation) do
2212
- collection_with_unacknowledged_write_concern.delete_many({ '$._id' => 1}, session: session)
2213
- end
2214
-
2215
- it_behaves_like 'an explicit session with an unacknowledged write'
2216
- end
2217
-
2218
- context 'when unacknowledged writes is used with an implicit session' do
2219
-
2220
- let(:collection_with_unacknowledged_write_concern) do
2221
- subscribed_client.with(write: { w: 0 })[TEST_COLL]
2222
- end
2223
-
2224
- let(:operation) do
2225
- collection_with_unacknowledged_write_concern.delete_many({ '$._id' => 1 })
2226
- end
2227
-
2228
- it_behaves_like 'an implicit session with an unacknowledged write'
2229
- end
2230
-
2231
- context 'when a collation is specified' do
2232
-
2233
- let(:selector) do
2234
- { name: 'BANG' }
2235
- end
2236
-
2237
- let(:result) do
2238
- authorized_collection.delete_many(selector, options)
2239
- end
2240
-
2241
- before do
2242
- authorized_collection.insert_one(name: 'bang')
2243
- authorized_collection.insert_one(name: 'bang')
2244
- end
2245
-
2246
- let(:options) do
2247
- { collation: { locale: 'en_US', strength: 2 } }
2248
- end
2249
-
2250
- context 'when the server selected supports collations', if: collation_enabled? do
2251
-
2252
- it 'applies the collation' do
2253
- expect(result.written_count).to eq(2)
2254
- expect(authorized_collection.find(name: 'bang').count).to eq(0)
2255
- end
2256
-
2257
- context 'when unacknowledged writes is used' do
2258
-
2259
- let(:collection_with_unacknowledged_write_concern) do
2260
- authorized_collection.with(write: { w: 0 })
2261
- end
2262
-
2263
- let(:result) do
2264
- collection_with_unacknowledged_write_concern.delete_many(selector, options)
2265
- end
2266
-
2267
- it 'raises an exception' do
2268
- expect {
2269
- result
2270
- }.to raise_exception(Mongo::Error::UnsupportedCollation)
2271
- end
2272
-
2273
- context 'when a String key is used' do
2274
-
2275
- let(:options) do
2276
- { 'collation' => { locale: 'en_US', strength: 2 } }
2277
- end
2278
-
2279
- it 'raises an exception' do
2280
- expect {
2281
- result
2282
- }.to raise_exception(Mongo::Error::UnsupportedCollation)
2283
- end
2284
- end
2285
- end
2286
- end
2287
-
2288
- context 'when the server selected does not support collations', unless: collation_enabled? do
2289
-
2290
- it 'raises an exception' do
2291
- expect {
2292
- result
2293
- }.to raise_exception(Mongo::Error::UnsupportedCollation)
2294
- end
2295
-
2296
- context 'when a String key is used' do
2297
-
2298
- let(:options) do
2299
- { 'collation' => { locale: 'en_US', strength: 2 } }
2300
- end
2301
-
2302
- it 'raises an exception' do
2303
- expect {
2304
- result
2305
- }.to raise_exception(Mongo::Error::UnsupportedCollation)
2306
- end
2307
- end
2308
- end
2309
- end
2310
-
2311
- context 'when a collation is not specified' do
2312
-
2313
- let(:selector) do
2314
- { name: 'BANG' }
2315
- end
2316
-
2317
- let(:result) do
2318
- authorized_collection.delete_many(selector)
2319
- end
2320
-
2321
- before do
2322
- authorized_collection.insert_one(name: 'bang')
2323
- authorized_collection.insert_one(name: 'bang')
2324
- end
2325
-
2326
- it 'does not apply the collation' do
2327
- expect(result.written_count).to eq(0)
2328
- expect(authorized_collection.find(name: 'bang').count).to eq(2)
2329
- end
2330
- end
2331
- end
2332
-
2333
- describe '#parallel_scan', unless: sharded? do
2334
- max_server_version '4.0'
2335
-
2336
- let(:documents) do
2337
- (1..200).map do |i|
2338
- { name: "testing-scan-#{i}" }
2339
- end
2340
- end
2341
-
2342
- before do
2343
- authorized_collection.insert_many(documents)
2344
- end
2345
-
2346
- let(:cursors) do
2347
- authorized_collection.parallel_scan(2)
2348
- end
2349
-
2350
- it 'returns an array of cursors' do
2351
- cursors.each do |cursor|
2352
- expect(cursor.class).to be(Mongo::Cursor)
2353
- end
2354
- end
2355
-
2356
- it 'returns the correct number of documents' do
2357
- expect(
2358
- cursors.reduce(0) { |total, cursor| total + cursor.to_a.size }
2359
- ).to eq(200)
2360
- end
2361
-
2362
- context 'when a session is provided' do
2363
-
2364
- let(:cursors) do
2365
- authorized_collection.parallel_scan(2, session: session)
2366
- end
2367
-
2368
- let(:operation) do
2369
- cursors.reduce(0) { |total, cursor| total + cursor.to_a.size }
2370
- end
2371
-
2372
- let(:failed_operation) do
2373
- authorized_collection.parallel_scan(-2, session: session)
2374
- end
2375
-
2376
- let(:client) do
2377
- authorized_client
2378
- end
2379
-
2380
- it_behaves_like 'an operation using a session'
2381
- it_behaves_like 'a failed operation using a session'
2382
- end
2383
-
2384
- context 'when a session is not provided' do
2385
- let(:client) { subscribed_client }
2386
- let(:collection) { client['test'] }
2387
-
2388
- let(:cursors) do
2389
- collection.parallel_scan(2)
2390
- end
2391
-
2392
- let(:operation) do
2393
- cursors.reduce(0) { |total, cursor| total + cursor.to_a.size }
2394
- end
2395
-
2396
- let(:failed_operation) do
2397
- collection.parallel_scan(-2)
2398
- end
2399
-
2400
- let(:command) do
2401
- operation
2402
- event = EventSubscriber.started_events.find { |cmd| cmd.command_name == 'parallelCollectionScan' }
2403
- expect(event).not_to be_nil
2404
- event.command
2405
- end
2406
-
2407
- it_behaves_like 'an operation not using a session'
2408
- it_behaves_like 'a failed operation not using a session'
2409
- end
2410
-
2411
- context 'when a session supporting causal consistency is used' do
2412
-
2413
- let(:cursors) do
2414
- collection.parallel_scan(2, session: session)
2415
- end
2416
-
2417
- let(:operation) do
2418
- cursors.reduce(0) { |total, cursor| total + cursor.to_a.size }
2419
- end
2420
-
2421
- let(:command) do
2422
- operation
2423
- event = EventSubscriber.started_events.find { |cmd| cmd.command_name == 'parallelCollectionScan' }
2424
- expect(event).not_to be_nil
2425
- event.command
2426
- end
2427
-
2428
- it_behaves_like 'an operation supporting causally consistent reads'
2429
- end
2430
-
2431
- context 'when a read concern is provided' do
2432
- min_server_version '3.2'
2433
-
2434
- let(:result) do
2435
- authorized_collection.with(options).parallel_scan(2)
2436
- end
2437
-
2438
- context 'when the read concern is valid' do
2439
-
2440
- let(:options) do
2441
- { read_concern: { level: 'local' }}
2442
- end
2443
-
2444
- it 'sends the read concern' do
2445
- expect { result }.to_not raise_error
2446
- end
2447
- end
2448
-
2449
- context 'when the read concern is not valid' do
2450
-
2451
- let(:options) do
2452
- { read_concern: { level: 'idontknow' }}
2453
- end
2454
-
2455
- it 'raises an exception' do
2456
- expect {
2457
- result
2458
- }.to raise_error(Mongo::Error::OperationFailure)
2459
- end
2460
- end
2461
- end
2462
-
2463
- context 'when the collection has a read preference', unless: sharded? do
2464
-
2465
- before do
2466
- allow(collection.client.cluster).to receive(:single?).and_return(false)
2467
- end
2468
-
2469
- after do
2470
- client.close
2471
- end
2472
-
2473
- let(:client) do
2474
- authorized_client.with(server_selection_timeout: 0.2)
2475
- end
2476
-
2477
- let(:collection) do
2478
- client[authorized_collection.name,
2479
- read: { :mode => :secondary, :tag_sets => [{ 'non' => 'existent' }] }]
2480
- end
2481
-
2482
- let(:result) do
2483
- collection.parallel_scan(2)
2484
- end
2485
-
2486
- it 'uses that read preference' do
2487
- expect {
2488
- result
2489
- }.to raise_exception(Mongo::Error::NoServerAvailable)
2490
- end
2491
- end
2492
-
2493
- context 'when a max time ms value is provided', if: !sharded? do
2494
-
2495
- let(:result) do
2496
- authorized_collection.parallel_scan(2, options)
2497
- end
2498
-
2499
- context 'when the read concern is valid' do
2500
-
2501
- let(:options) do
2502
- { max_time_ms: 5 }
2503
- end
2504
-
2505
- it 'sends the max time ms value' do
2506
- expect { result }.to_not raise_error
2507
- end
2508
- end
2509
-
2510
- context 'when the max time ms is not valid' do
2511
-
2512
- let(:options) do
2513
- { max_time_ms: 0.1 }
2514
- end
2515
-
2516
- it 'raises an exception' do
2517
- expect {
2518
- result
2519
- }.to raise_error(Mongo::Error::OperationFailure)
2520
- end
2521
- end
2522
- end
2523
- end
2524
-
2525
- describe '#replace_one' do
2526
-
2527
- let(:selector) do
2528
- { field: 'test1' }
2529
- end
2530
-
2531
- context 'when a selector was provided' do
2532
-
2533
- before do
2534
- authorized_collection.insert_many([{ field: 'test1' }, { field: 'test1' }])
2535
- end
2536
-
2537
- let!(:response) do
2538
- authorized_collection.replace_one(selector, { field: 'testing' })
2539
- end
2540
-
2541
- let(:updated) do
2542
- authorized_collection.find(field: 'testing').first
2543
- end
2544
-
2545
- it 'updates the first matching document in the collection' do
2546
- expect(response.modified_count).to eq(1)
2547
- end
2548
-
2549
- it 'updates the documents in the collection' do
2550
- expect(updated[:field]).to eq('testing')
2551
- end
2552
- end
2553
-
2554
- context 'when upsert is false' do
2555
-
2556
- let!(:response) do
2557
- authorized_collection.replace_one(selector, { field: 'test1' }, upsert: false)
2558
- end
2559
-
2560
- let(:updated) do
2561
- authorized_collection.find(field: 'test1').to_a
2562
- end
2563
-
2564
- it 'reports that no documents were written' do
2565
- expect(response.modified_count).to eq(0)
2566
- end
2567
-
2568
- it 'does not insert the document' do
2569
- expect(updated).to be_empty
2570
- end
2571
- end
2572
-
2573
- context 'when upsert is true' do
2574
-
2575
- let!(:response) do
2576
- authorized_collection.replace_one(selector, { field: 'test1' }, upsert: true)
2577
- end
2578
-
2579
- let(:updated) do
2580
- authorized_collection.find(field: 'test1').first
2581
- end
2582
-
2583
- it 'reports that a document was written' do
2584
- expect(response.written_count).to eq(1)
2585
- end
2586
-
2587
- it 'inserts the document' do
2588
- expect(updated[:field]).to eq('test1')
2589
- end
2590
- end
2591
-
2592
- context 'when upsert is not specified' do
2593
-
2594
- let!(:response) do
2595
- authorized_collection.replace_one(selector, { field: 'test1' })
2596
- end
2597
-
2598
- let(:updated) do
2599
- authorized_collection.find(field: 'test1').to_a
2600
- end
2601
-
2602
- it 'reports that no documents were written' do
2603
- expect(response.modified_count).to eq(0)
2604
- end
2605
-
2606
- it 'does not insert the document' do
2607
- expect(updated).to be_empty
2608
- end
2609
- end
2610
-
2611
- context 'when the replace fails' do
2612
-
2613
- let(:result) do
2614
- authorized_collection.replace_one(selector, { '$s' => 'test1' })
2615
- end
2616
-
2617
- it 'raises an OperationFailure' do
2618
- expect {
2619
- result
2620
- }.to raise_exception(Mongo::Error::OperationFailure)
2621
- end
2622
- end
2623
-
2624
- context 'when collection has a validator' do
2625
- min_server_version '3.2'
2626
-
2627
- around(:each) do |spec|
2628
- authorized_client[:validating,
2629
- :validator => { :a => { '$exists' => true } }].tap do |c|
2630
- c.create
2631
- end
2632
- spec.run
2633
- collection_with_validator.drop
2634
- end
2635
-
2636
- before do
2637
- collection_with_validator.insert_one({ a: 1 })
2638
- end
2639
-
2640
- context 'when the document is valid' do
2641
-
2642
- let(:result) do
2643
- collection_with_validator.replace_one({ a: 1 }, { a: 5 })
2644
- end
2645
-
2646
- it 'replaces successfully' do
2647
- expect(result.modified_count).to eq(1)
2648
- end
2649
- end
2650
-
2651
- context 'when the document is invalid' do
2652
-
2653
- context 'when bypass_document_validation is not set' do
2654
-
2655
- let(:result2) do
2656
- collection_with_validator.replace_one({ a: 1 }, { x: 5 })
2657
- end
2658
-
2659
- it 'raises OperationFailure' do
2660
- expect {
2661
- result2
2662
- }.to raise_exception(Mongo::Error::OperationFailure)
2663
- end
2664
- end
2665
-
2666
- context 'when bypass_document_validation is true' do
2667
-
2668
- let(:result3) do
2669
- collection_with_validator.replace_one(
2670
- { a: 1 }, { x: 1 }, :bypass_document_validation => true)
2671
- end
2672
-
2673
- it 'replaces successfully' do
2674
- expect(result3.written_count).to eq(1)
2675
- end
2676
- end
2677
- end
2678
- end
2679
-
2680
- context 'when a collation is specified' do
2681
-
2682
- let(:selector) do
2683
- { name: 'BANG' }
2684
- end
2685
-
2686
- let(:result) do
2687
- authorized_collection.replace_one(selector, { name: 'doink' }, options)
2688
- end
2689
-
2690
- before do
2691
- authorized_collection.insert_one(name: 'bang')
2692
- end
2693
-
2694
- let(:options) do
2695
- { collation: { locale: 'en_US', strength: 2 } }
2696
- end
2697
-
2698
- context 'when the server selected supports collations', if: collation_enabled? do
2699
-
2700
- it 'applies the collation' do
2701
- expect(result.written_count).to eq(1)
2702
- expect(authorized_collection.find(name: 'doink').count).to eq(1)
2703
- end
2704
-
2705
- context 'when unacknowledged writes is used' do
2706
-
2707
- let(:collection_with_unacknowledged_write_concern) do
2708
- authorized_collection.with(write: { w: 0 })
2709
- end
2710
-
2711
- let(:result) do
2712
- collection_with_unacknowledged_write_concern.replace_one(selector, { name: 'doink' }, options)
2713
- end
2714
-
2715
- it 'raises an exception' do
2716
- expect {
2717
- result
2718
- }.to raise_exception(Mongo::Error::UnsupportedCollation)
2719
- end
2720
-
2721
- context 'when a String key is used' do
2722
-
2723
- let(:options) do
2724
- { 'collation' => { locale: 'en_US', strength: 2 } }
2725
- end
2726
-
2727
- it 'raises an exception' do
2728
- expect {
2729
- result
2730
- }.to raise_exception(Mongo::Error::UnsupportedCollation)
2731
- end
2732
- end
2733
- end
2734
- end
2735
-
2736
- context 'when the server selected does not support collations', unless: collation_enabled? do
2737
-
2738
- it 'raises an exception' do
2739
- expect {
2740
- result
2741
- }.to raise_exception(Mongo::Error::UnsupportedCollation)
2742
- end
2743
-
2744
- context 'when a String key is used' do
2745
-
2746
- let(:options) do
2747
- { 'collation' => { locale: 'en_US', strength: 2 } }
2748
- end
2749
-
2750
- it 'raises an exception' do
2751
- expect {
2752
- result
2753
- }.to raise_exception(Mongo::Error::UnsupportedCollation)
2754
- end
2755
- end
2756
- end
2757
- end
2758
-
2759
- context 'when a collation is not specified' do
2760
-
2761
- let(:selector) do
2762
- { name: 'BANG' }
2763
- end
2764
-
2765
- let(:result) do
2766
- authorized_collection.replace_one(selector, { name: 'doink' })
2767
- end
2768
-
2769
- before do
2770
- authorized_collection.insert_one(name: 'bang')
2771
- end
2772
-
2773
- it 'does not apply the collation' do
2774
- expect(result.written_count).to eq(0)
2775
- expect(authorized_collection.find(name: 'bang').count).to eq(1)
2776
- end
2777
- end
2778
-
2779
- context 'when a session is provided' do
2780
-
2781
- let(:selector) do
2782
- { name: 'BANG' }
2783
- end
2784
-
2785
- before do
2786
- authorized_collection.insert_one(name: 'bang')
2787
- end
2788
-
2789
- let(:session) do
2790
- authorized_client.start_session
2791
- end
2792
-
2793
- let(:operation) do
2794
- authorized_collection.replace_one(selector, { name: 'doink' }, session: session)
2795
- end
2796
-
2797
- let(:failed_operation) do
2798
- authorized_collection.replace_one({ '$._id' => 1 }, { name: 'doink' }, session: session)
2799
- end
2800
-
2801
- let(:client) do
2802
- authorized_client
2803
- end
2804
-
2805
- it_behaves_like 'an operation using a session'
2806
- it_behaves_like 'a failed operation using a session'
2807
- end
2808
-
2809
- context 'when unacknowledged writes is used with an explicit session' do
2810
-
2811
- let(:collection_with_unacknowledged_write_concern) do
2812
- authorized_collection.with(write: { w: 0 })
2813
- end
2814
-
2815
- let(:operation) do
2816
- collection_with_unacknowledged_write_concern.replace_one({ a: 1 }, { x: 5 }, session: session)
2817
- end
2818
-
2819
- it_behaves_like 'an explicit session with an unacknowledged write'
2820
- end
2821
-
2822
- context 'when unacknowledged writes is used with an implicit session' do
2823
-
2824
- let(:collection_with_unacknowledged_write_concern) do
2825
- subscribed_client.with(write: { w: 0 })[TEST_COLL]
2826
- end
2827
-
2828
- let(:operation) do
2829
- collection_with_unacknowledged_write_concern.replace_one({ a: 1 }, { x: 5 })
2830
- end
2831
-
2832
- it_behaves_like 'an implicit session with an unacknowledged write'
2833
- end
2834
- end
2835
-
2836
- describe '#update_many' do
2837
-
2838
- let(:selector) do
2839
- { field: 'test' }
2840
- end
2841
-
2842
- context 'when a selector was provided' do
2843
-
2844
- before do
2845
- authorized_collection.insert_many([{ field: 'test' }, { field: 'test' }])
2846
- end
2847
-
2848
- let!(:response) do
2849
- authorized_collection.update_many(selector, '$set'=> { field: 'testing' })
2850
- end
2851
-
2852
- let(:updated) do
2853
- authorized_collection.find(field: 'testing').to_a.last
2854
- end
2855
-
2856
- it 'returns the number updated' do
2857
- expect(response.modified_count).to eq(2)
2858
- end
2859
-
2860
- it 'updates the documents in the collection' do
2861
- expect(updated[:field]).to eq('testing')
2862
- end
2863
- end
2864
-
2865
- context 'when upsert is false' do
2866
-
2867
- let(:response) do
2868
- authorized_collection.update_many(selector, { '$set'=> { field: 'testing' } },
2869
- upsert: false)
2870
- end
2871
-
2872
- let(:updated) do
2873
- authorized_collection.find.to_a
2874
- end
2875
-
2876
- it 'reports that no documents were updated' do
2877
- expect(response.modified_count).to eq(0)
2878
- end
2879
-
2880
- it 'updates no documents in the collection' do
2881
- expect(updated).to be_empty
2882
- end
2883
- end
2884
-
2885
- context 'when upsert is true' do
2886
-
2887
- let!(:response) do
2888
- authorized_collection.update_many(selector, { '$set'=> { field: 'testing' } },
2889
- upsert: true)
2890
- end
2891
-
2892
- let(:updated) do
2893
- authorized_collection.find.to_a.last
2894
- end
2895
-
2896
- it 'reports that a document was written' do
2897
- expect(response.written_count).to eq(1)
2898
- end
2899
-
2900
- it 'inserts a document into the collection' do
2901
- expect(updated[:field]).to eq('testing')
2902
- end
2903
- end
2904
-
2905
- context 'when upsert is not specified' do
2906
-
2907
- let(:response) do
2908
- authorized_collection.update_many(selector, { '$set'=> { field: 'testing' } })
2909
- end
2910
-
2911
- let(:updated) do
2912
- authorized_collection.find.to_a
2913
- end
2914
-
2915
- it 'reports that no documents were updated' do
2916
- expect(response.modified_count).to eq(0)
2917
- end
2918
-
2919
- it 'updates no documents in the collection' do
2920
- expect(updated).to be_empty
2921
- end
2922
- end
2923
-
2924
- context 'when arrayFilters is provided' do
2925
-
2926
- let(:selector) do
2927
- { '$or' => [{ _id: 0 }, { _id: 1 }]}
2928
- end
2929
-
2930
- context 'when the server supports arrayFilters', if: array_filters_enabled? do
2931
-
2932
- before do
2933
- authorized_collection.insert_many([{
2934
- _id: 0, x: [
2935
- { y: 1 },
2936
- { y: 2 },
2937
- { y: 3 }
2938
- ]
2939
- },
2940
- {
2941
- _id: 1,
2942
- x: [
2943
- { y: 3 },
2944
- { y: 2 },
2945
- { y: 1 }
2946
- ]
2947
- }])
2948
- end
2949
-
2950
- let(:result) do
2951
- authorized_collection.update_many(selector,
2952
- { '$set' => { 'x.$[i].y' => 5 } },
2953
- options)
2954
- end
2955
-
2956
- context 'when a Symbol key is used' do
2957
-
2958
- let(:options) do
2959
- { array_filters: [{ 'i.y' => 3 }] }
2960
- end
2961
-
2962
- it 'applies the arrayFilters' do
2963
- expect(result.matched_count).to eq(2)
2964
- expect(result.modified_count).to eq(2)
2965
-
2966
- docs = authorized_collection.find(selector, sort: { _id: 1 }).to_a
2967
- expect(docs[0]['x']).to eq ([{ 'y' => 1 }, { 'y' => 2 }, { 'y' => 5 }])
2968
- expect(docs[1]['x']).to eq ([{ 'y' => 5 }, { 'y' => 2 }, { 'y' => 1 }])
2969
- end
2970
- end
2971
-
2972
- context 'when a String key is used' do
2973
- let(:options) do
2974
- { 'array_filters' => [{ 'i.y' => 3 }] }
2975
- end
2976
-
2977
- it 'applies the arrayFilters' do
2978
- expect(result.matched_count).to eq(2)
2979
- expect(result.modified_count).to eq(2)
2980
-
2981
- docs = authorized_collection.find({}, sort: { _id: 1 }).to_a
2982
- expect(docs[0]['x']).to eq ([{ 'y' => 1 }, { 'y' => 2 }, { 'y' => 5 }])
2983
- expect(docs[1]['x']).to eq ([{ 'y' => 5 }, { 'y' => 2 }, { 'y' => 1 }])
2984
- end
2985
- end
2986
- end
2987
-
2988
- context 'when the server does not support arrayFilters', unless: array_filters_enabled? do
2989
-
2990
- let(:result) do
2991
- authorized_collection.update_many(selector,
2992
- { '$set' => { 'x.$[i].y' => 5 } },
2993
- options)
2994
- end
2995
-
2996
- context 'when a Symbol key is used' do
2997
-
2998
- let(:options) do
2999
- { array_filters: [{ 'i.y' => 3 }] }
3000
- end
3001
-
3002
- it 'raises an exception' do
3003
- expect {
3004
- result
3005
- }.to raise_exception(Mongo::Error::UnsupportedArrayFilters)
3006
- end
3007
- end
3008
-
3009
- context 'when a String key is used' do
3010
-
3011
- let(:options) do
3012
- { 'array_filters' => [{ 'i.y' => 3 }] }
3013
- end
3014
-
3015
- it 'raises an exception' do
3016
- expect {
3017
- result
3018
- }.to raise_exception(Mongo::Error::UnsupportedArrayFilters)
3019
- end
3020
- end
3021
- end
3022
- end
3023
-
3024
- context 'when the updates fail' do
3025
-
3026
- let(:result) do
3027
- authorized_collection.update_many(selector, { '$s'=> { field: 'testing' } })
3028
- end
3029
-
3030
- it 'raises an OperationFailure' do
3031
- expect {
3032
- result
3033
- }.to raise_exception(Mongo::Error::OperationFailure)
3034
- end
3035
- end
3036
-
3037
- context 'when collection has a validator' do
3038
- min_server_version '3.2'
3039
-
3040
- around(:each) do |spec|
3041
- authorized_client[:validating,
3042
- :validator => { :a => { '$exists' => true } }].tap do |c|
3043
- c.create
3044
- end
3045
- spec.run
3046
- collection_with_validator.drop
3047
- end
3048
-
3049
- before do
3050
- collection_with_validator.insert_many([{ a: 1 }, { a: 2 }])
3051
- end
3052
-
3053
- context 'when the document is valid' do
3054
-
3055
- let(:result) do
3056
- collection_with_validator.update_many(
3057
- { :a => { '$gt' => 0 } }, '$inc' => { :a => 1 } )
3058
- end
3059
-
3060
- it 'updates successfully' do
3061
- expect(result.modified_count).to eq(2)
3062
- end
3063
- end
3064
-
3065
- context 'when the document is invalid' do
3066
-
3067
- context 'when bypass_document_validation is not set' do
3068
-
3069
- let(:result2) do
3070
- collection_with_validator.update_many(
3071
- { :a => { '$gt' => 0 } }, '$unset' => { :a => '' })
3072
- end
3073
-
3074
- it 'raises OperationFailure' do
3075
- expect {
3076
- result2
3077
- }.to raise_exception(Mongo::Error::OperationFailure)
3078
- end
3079
- end
3080
-
3081
- context 'when bypass_document_validation is true' do
3082
-
3083
- let(:result3) do
3084
- collection_with_validator.update_many(
3085
- { :a => { '$gt' => 0 } }, { '$unset' => { :a => '' } },
3086
- :bypass_document_validation => true)
3087
- end
3088
-
3089
- it 'updates successfully' do
3090
- expect(result3.written_count).to eq(2)
3091
- end
3092
- end
3093
- end
3094
- end
3095
-
3096
- context 'when a collation is specified' do
3097
-
3098
- let(:selector) do
3099
- { name: 'BANG' }
3100
- end
3101
-
3102
- let(:result) do
3103
- authorized_collection.update_many(selector, { '$set' => { other: 'doink' } }, options)
3104
- end
3105
-
3106
- before do
3107
- authorized_collection.insert_one(name: 'bang')
3108
- authorized_collection.insert_one(name: 'baNG')
3109
- end
3110
-
3111
- let(:options) do
3112
- { collation: { locale: 'en_US', strength: 2 } }
3113
- end
3114
-
3115
- context 'when the server selected supports collations', if: collation_enabled? do
3116
-
3117
- it 'applies the collation' do
3118
- expect(result.written_count).to eq(2)
3119
- expect(authorized_collection.find(other: 'doink').count).to eq(2)
3120
- end
3121
-
3122
- context 'when unacknowledged writes is used' do
3123
-
3124
- let(:collection_with_unacknowledged_write_concern) do
3125
- authorized_collection.with(write: { w: 0 })
3126
- end
3127
-
3128
- let(:result) do
3129
- collection_with_unacknowledged_write_concern.update_many(selector, { '$set' => { other: 'doink' } }, options)
3130
- end
3131
-
3132
- it 'raises an exception' do
3133
- expect {
3134
- result
3135
- }.to raise_exception(Mongo::Error::UnsupportedCollation)
3136
- end
3137
-
3138
- context 'when a String key is used' do
3139
-
3140
- let(:options) do
3141
- { 'collation' => { locale: 'en_US', strength: 2 } }
3142
- end
3143
-
3144
- it 'raises an exception' do
3145
- expect {
3146
- result
3147
- }.to raise_exception(Mongo::Error::UnsupportedCollation)
3148
- end
3149
- end
3150
- end
3151
- end
3152
-
3153
- context 'when the server selected does not support collations', unless: collation_enabled? do
3154
-
3155
- it 'raises an exception' do
3156
- expect {
3157
- result
3158
- }.to raise_exception(Mongo::Error::UnsupportedCollation)
3159
- end
3160
-
3161
- context 'when a String key is used' do
3162
-
3163
- let(:options) do
3164
- { 'collation' => { locale: 'en_US', strength: 2 } }
3165
- end
3166
-
3167
- it 'raises an exception' do
3168
- expect {
3169
- result
3170
- }.to raise_exception(Mongo::Error::UnsupportedCollation)
3171
- end
3172
- end
3173
- end
3174
- end
3175
-
3176
- context 'when collation is not specified' do
3177
-
3178
- let(:selector) do
3179
- {name: 'BANG'}
3180
- end
3181
-
3182
- let(:result) do
3183
- authorized_collection.update_many(selector, { '$set' => {other: 'doink'} })
3184
- end
3185
-
3186
- before do
3187
- authorized_collection.insert_one(name: 'bang')
3188
- authorized_collection.insert_one(name: 'baNG')
3189
- end
3190
-
3191
- it 'does not apply the collation' do
3192
- expect(result.written_count).to eq(0)
3193
- end
3194
- end
3195
-
3196
- context 'when a session is provided' do
3197
-
3198
- let(:selector) do
3199
- { name: 'BANG' }
3200
- end
3201
-
3202
- let(:operation) do
3203
- authorized_collection.update_many(selector, { '$set' => {other: 'doink'} }, session: session)
3204
- end
3205
-
3206
- before do
3207
- authorized_collection.insert_one(name: 'bang')
3208
- authorized_collection.insert_one(name: 'baNG')
3209
- end
3210
-
3211
- let(:session) do
3212
- authorized_client.start_session
3213
- end
3214
-
3215
- let(:failed_operation) do
3216
- authorized_collection.update_many({ '$._id' => 1 }, { '$set' => {other: 'doink'} }, session: session)
3217
- end
3218
-
3219
- let(:client) do
3220
- authorized_client
3221
- end
3222
-
3223
- it_behaves_like 'an operation using a session'
3224
- it_behaves_like 'a failed operation using a session'
3225
- end
3226
-
3227
- context 'when unacknowledged writes is used with an explicit session' do
3228
-
3229
- let(:collection_with_unacknowledged_write_concern) do
3230
- authorized_collection.with(write: { w: 0 })
3231
- end
3232
-
3233
- let(:operation) do
3234
- collection_with_unacknowledged_write_concern.update_many({a: 1}, { '$set' => {x: 1} }, session: session)
3235
- end
3236
-
3237
- it_behaves_like 'an explicit session with an unacknowledged write'
3238
- end
3239
-
3240
- context 'when unacknowledged writes is used with an implicit session' do
3241
-
3242
- let(:collection_with_unacknowledged_write_concern) do
3243
- subscribed_client.with(write: { w: 0 })[TEST_COLL]
3244
- end
3245
-
3246
- let(:operation) do
3247
- collection_with_unacknowledged_write_concern.update_many({a: 1}, {'$set' => {x: 1}})
3248
- end
3249
-
3250
- it_behaves_like 'an implicit session with an unacknowledged write'
3251
- end
3252
- end
3253
-
3254
- describe '#update_one' do
3255
-
3256
- let(:selector) do
3257
- { field: 'test1' }
3258
- end
3259
-
3260
- context 'when a selector was provided' do
3261
-
3262
- before do
3263
- authorized_collection.insert_many([{ field: 'test1' }, { field: 'test1' }])
3264
- end
3265
-
3266
- let!(:response) do
3267
- authorized_collection.update_one(selector, '$set'=> { field: 'testing' })
3268
- end
3269
-
3270
- let(:updated) do
3271
- authorized_collection.find(field: 'testing').first
3272
- end
3273
-
3274
- it 'updates the first matching document in the collection' do
3275
- expect(response.modified_count).to eq(1)
3276
- end
3277
-
3278
- it 'updates the documents in the collection' do
3279
- expect(updated[:field]).to eq('testing')
3280
- end
3281
- end
3282
-
3283
- context 'when upsert is false' do
3284
-
3285
- let(:response) do
3286
- authorized_collection.update_one(selector, { '$set'=> { field: 'testing' } },
3287
- upsert: false)
3288
- end
3289
-
3290
- let(:updated) do
3291
- authorized_collection.find.to_a
3292
- end
3293
-
3294
- it 'reports that no documents were updated' do
3295
- expect(response.modified_count).to eq(0)
3296
- end
3297
-
3298
- it 'updates no documents in the collection' do
3299
- expect(updated).to be_empty
3300
- end
3301
- end
3302
-
3303
- context 'when upsert is true' do
3304
-
3305
- let!(:response) do
3306
- authorized_collection.update_one(selector, { '$set'=> { field: 'testing' } },
3307
- upsert: true)
3308
- end
3309
-
3310
- let(:updated) do
3311
- authorized_collection.find.first
3312
- end
3313
-
3314
- it 'reports that a document was written' do
3315
- expect(response.written_count).to eq(1)
3316
- end
3317
-
3318
- it 'inserts a document into the collection' do
3319
- expect(updated[:field]).to eq('testing')
3320
- end
3321
- end
3322
-
3323
- context 'when upsert is not specified' do
3324
-
3325
- let(:response) do
3326
- authorized_collection.update_one(selector, { '$set'=> { field: 'testing' } })
3327
- end
3328
-
3329
- let(:updated) do
3330
- authorized_collection.find.to_a
3331
- end
3332
-
3333
- it 'reports that no documents were updated' do
3334
- expect(response.modified_count).to eq(0)
3335
- end
3336
-
3337
- it 'updates no documents in the collection' do
3338
- expect(updated).to be_empty
3339
- end
3340
- end
3341
-
3342
- context 'when the update fails' do
3343
-
3344
- let(:result) do
3345
- authorized_collection.update_one(selector, { '$s'=> { field: 'testing' } })
3346
- end
3347
-
3348
- it 'raises an OperationFailure' do
3349
- expect {
3350
- result
3351
- }.to raise_exception(Mongo::Error::OperationFailure)
3352
- end
3353
- end
3354
-
3355
- context 'when collection has a validator' do
3356
- min_server_version '3.2'
3357
-
3358
- around(:each) do |spec|
3359
- authorized_client[:validating,
3360
- :validator => { :a => { '$exists' => true } }].tap do |c|
3361
- c.create
3362
- end
3363
- spec.run
3364
- collection_with_validator.drop
3365
- end
3366
-
3367
- before do
3368
- collection_with_validator.insert_one({ a: 1 })
3369
- end
3370
-
3371
- context 'when the document is valid' do
3372
-
3373
- let(:result) do
3374
- collection_with_validator.update_one(
3375
- { :a => { '$gt' => 0 } }, '$inc' => { :a => 1 } )
3376
- end
3377
-
3378
- it 'updates successfully' do
3379
- expect(result.modified_count).to eq(1)
3380
- end
3381
- end
3382
-
3383
- context 'when the document is invalid' do
3384
-
3385
- context 'when bypass_document_validation is not set' do
3386
-
3387
- let(:result2) do
3388
- collection_with_validator.update_one(
3389
- { :a => { '$gt' => 0 } }, '$unset' => { :a => '' })
3390
- end
3391
-
3392
- it 'raises OperationFailure' do
3393
- expect {
3394
- result2
3395
- }.to raise_exception(Mongo::Error::OperationFailure)
3396
- end
3397
- end
3398
-
3399
- context 'when bypass_document_validation is true' do
3400
-
3401
- let(:result3) do
3402
- collection_with_validator.update_one(
3403
- { :a => { '$gt' => 0 } }, { '$unset' => { :a => '' } },
3404
- :bypass_document_validation => true)
3405
- end
3406
-
3407
- it 'updates successfully' do
3408
- expect(result3.written_count).to eq(1)
3409
- end
3410
- end
3411
- end
3412
- end
3413
-
3414
- context 'when there is a collation specified' do
3415
-
3416
- let(:selector) do
3417
- { name: 'BANG' }
3418
- end
3419
-
3420
- let(:result) do
3421
- authorized_collection.update_one(selector, { '$set' => { other: 'doink' } }, options)
3422
- end
3423
-
3424
- before do
3425
- authorized_collection.insert_one(name: 'bang')
3426
- end
3427
-
3428
- let(:options) do
3429
- { collation: { locale: 'en_US', strength: 2 } }
3430
- end
3431
-
3432
- context 'when the server selected supports collations', if: collation_enabled? do
3433
-
3434
- it 'applies the collation' do
3435
- expect(result.written_count).to eq(1)
3436
- expect(authorized_collection.find(other: 'doink').count).to eq(1)
3437
- end
3438
-
3439
- context 'when unacknowledged writes is used' do
3440
-
3441
- let(:collection_with_unacknowledged_write_concern) do
3442
- authorized_collection.with(write: { w: 0 })
3443
- end
3444
-
3445
- let(:result) do
3446
- collection_with_unacknowledged_write_concern.update_one(selector, { '$set' => { other: 'doink' } }, options)
3447
- end
3448
-
3449
- it 'raises an exception' do
3450
- expect {
3451
- result
3452
- }.to raise_exception(Mongo::Error::UnsupportedCollation)
3453
- end
3454
-
3455
- context 'when a String key is used' do
3456
-
3457
- let(:options) do
3458
- { 'collation' => { locale: 'en_US', strength: 2 } }
3459
- end
3460
-
3461
- it 'raises an exception' do
3462
- expect {
3463
- result
3464
- }.to raise_exception(Mongo::Error::UnsupportedCollation)
3465
- end
3466
- end
3467
- end
3468
- end
3469
-
3470
- context 'when the server selected does not support collations', unless: collation_enabled? do
3471
-
3472
- it 'raises an exception' do
3473
- expect {
3474
- result
3475
- }.to raise_exception(Mongo::Error::UnsupportedCollation)
3476
- end
3477
-
3478
- context 'when a String key is used' do
3479
-
3480
- let(:options) do
3481
- { 'collation' => { locale: 'en_US', strength: 2 } }
3482
- end
3483
-
3484
- it 'raises an exception' do
3485
- expect {
3486
- result
3487
- }.to raise_exception(Mongo::Error::UnsupportedCollation)
3488
- end
3489
- end
3490
- end
3491
- end
3492
-
3493
- context 'when a collation is not specified' do
3494
-
3495
- let(:selector) do
3496
- { name: 'BANG' }
3497
- end
3498
-
3499
- let(:result) do
3500
- authorized_collection.update_one(selector, { '$set' => { other: 'doink' } })
3501
- end
3502
-
3503
- before do
3504
- authorized_collection.insert_one(name: 'bang')
3505
- end
3506
-
3507
- it 'does not apply the collation' do
3508
- expect(result.written_count).to eq(0)
3509
- end
3510
- end
3511
-
3512
-
3513
- context 'when arrayFilters is provided' do
3514
-
3515
- let(:selector) do
3516
- { _id: 0}
3517
- end
3518
-
3519
- context 'when the server supports arrayFilters', if: array_filters_enabled? do
3520
-
3521
- before do
3522
- authorized_collection.insert_one(_id: 0, x: [{ y: 1 }, { y: 2 }, {y: 3 }])
3523
- end
3524
-
3525
- let(:result) do
3526
- authorized_collection.update_one(selector,
3527
- { '$set' => { 'x.$[i].y' => 5 } },
3528
- options)
3529
- end
3530
-
3531
- context 'when a Symbol key is used' do
3532
-
3533
- let(:options) do
3534
- { array_filters: [{ 'i.y' => 3 }] }
3535
- end
3536
-
3537
- it 'applies the arrayFilters' do
3538
- expect(result.matched_count).to eq(1)
3539
- expect(result.modified_count).to eq(1)
3540
- expect(authorized_collection.find(selector).first['x'].last['y']).to eq(5)
3541
- end
3542
- end
3543
-
3544
- context 'when a String key is used' do
3545
-
3546
- let(:options) do
3547
- { 'array_filters' => [{ 'i.y' => 3 }] }
3548
- end
3549
-
3550
- it 'applies the arrayFilters' do
3551
- expect(result.matched_count).to eq(1)
3552
- expect(result.modified_count).to eq(1)
3553
- expect(authorized_collection.find(selector).first['x'].last['y']).to eq(5)
3554
- end
3555
- end
3556
- end
3557
-
3558
- context 'when the server does not support arrayFilters', unless: array_filters_enabled? do
3559
-
3560
- let(:result) do
3561
- authorized_collection.update_one(selector,
3562
- { '$set' => { 'x.$[i].y' => 5 } },
3563
- options)
3564
- end
3565
-
3566
- context 'when a Symbol key is used' do
3567
-
3568
- let(:options) do
3569
- { array_filters: [{ 'i.y' => 3 }] }
3570
- end
3571
-
3572
- it 'raises an exception' do
3573
- expect {
3574
- result
3575
- }.to raise_exception(Mongo::Error::UnsupportedArrayFilters)
3576
- end
3577
- end
3578
-
3579
- context 'when a String key is used' do
3580
-
3581
- let(:options) do
3582
- { 'array_filters' => [{ 'i.y' => 3 }] }
3583
- end
3584
-
3585
- it 'raises an exception' do
3586
- expect {
3587
- result
3588
- }.to raise_exception(Mongo::Error::UnsupportedArrayFilters)
3589
- end
3590
- end
3591
- end
3592
- end
3593
-
3594
- context 'when the documents are sent with OP_MSG', if: op_msg_enabled? do
3595
-
3596
- let(:client) do
3597
- subscribed_client
3598
- end
3599
-
3600
- let(:documents) do
3601
- [{ '_id' => 1, 'name' => '1'*16777191 }, { '_id' => 'y' }]
3602
- end
3603
-
3604
- before do
3605
- authorized_collection.insert_many([{ field: 'test1' }, { field: 'test1' }])
3606
- client[TEST_COLL].update_one({ a: 1 }, {'$set' => { 'name' => '1'*16777149 }})
3607
- end
3608
-
3609
- after do
3610
- client.close
3611
- end
3612
-
3613
- let(:update_events) do
3614
- EventSubscriber.started_events.select { |e| e.command_name == 'update' }
3615
- end
3616
-
3617
- it 'sends the documents in one OP_MSG' do
3618
- expect(update_events.size).to eq(1)
3619
- end
3620
- end
3621
-
3622
- context 'when a session is provided' do
3623
-
3624
- before do
3625
- authorized_collection.insert_many([{ field: 'test1' }, { field: 'test1' }])
3626
- end
3627
-
3628
- let(:session) do
3629
- authorized_client.start_session
3630
- end
3631
-
3632
- let(:operation) do
3633
- authorized_collection.update_one({ field: 'test' }, { '$set'=> { field: 'testing' } }, session: session)
3634
- end
3635
-
3636
- let(:failed_operation) do
3637
- authorized_collection.update_one({ '$._id' => 1 }, { '$set'=> { field: 'testing' } }, session: session)
3638
- end
3639
-
3640
- let(:client) do
3641
- authorized_client
3642
- end
3643
-
3644
- it_behaves_like 'an operation using a session'
3645
- it_behaves_like 'a failed operation using a session'
3646
- end
3647
-
3648
- context 'when unacknowledged writes is used with an explicit session' do
3649
-
3650
- let(:collection_with_unacknowledged_write_concern) do
3651
- authorized_collection.with(write: { w: 0 })
3652
- end
3653
-
3654
- let(:operation) do
3655
- collection_with_unacknowledged_write_concern.update_one({ a: 1 }, { '$set' => { x: 1 } }, session: session)
3656
- end
3657
-
3658
- it_behaves_like 'an explicit session with an unacknowledged write'
3659
- end
3660
-
3661
- context 'when unacknowledged writes is used with an implicit session' do
3662
-
3663
- let(:collection_with_unacknowledged_write_concern) do
3664
- subscribed_client.with(write: { w: 0 })[TEST_COLL]
3665
- end
3666
-
3667
- let(:operation) do
3668
- collection_with_unacknowledged_write_concern.update_one({ a: 1 }, { '$set' => { x: 1 }})
3669
- end
3670
-
3671
- it_behaves_like 'an implicit session with an unacknowledged write'
3672
- end
3673
- end
3674
-
3675
- describe '#find_one_and_delete' do
3676
-
3677
- before do
3678
- authorized_collection.insert_many([{ field: 'test1' }])
3679
- end
3680
-
3681
- let(:selector) do
3682
- { field: 'test1' }
3683
- end
3684
-
3685
- context 'when a matching document is found' do
3686
-
3687
- context 'when a session is provided' do
3688
-
3689
- let(:operation) do
3690
- authorized_collection.find_one_and_delete(selector, session: session)
3691
- end
3692
-
3693
- let(:failed_operation) do
3694
- authorized_collection.find_one_and_delete({ '$._id' => 1 }, session: session)
3695
- end
3696
-
3697
- let(:session) do
3698
- authorized_client.start_session
3699
- end
3700
-
3701
- let(:client) do
3702
- authorized_client
3703
- end
3704
-
3705
- it_behaves_like 'an operation using a session'
3706
- it_behaves_like 'a failed operation using a session'
3707
- end
3708
-
3709
- context 'when no options are provided' do
3710
-
3711
- let!(:document) do
3712
- authorized_collection.find_one_and_delete(selector)
3713
- end
3714
-
3715
- it 'deletes the document from the database' do
3716
- expect(authorized_collection.find.to_a).to be_empty
3717
- end
3718
-
3719
- it 'returns the document' do
3720
- expect(document['field']).to eq('test1')
3721
- end
3722
- end
3723
-
3724
- context 'when a projection is provided' do
3725
-
3726
- let!(:document) do
3727
- authorized_collection.find_one_and_delete(selector, projection: { _id: 1 })
3728
- end
3729
-
3730
- it 'deletes the document from the database' do
3731
- expect(authorized_collection.find.to_a).to be_empty
3732
- end
3733
-
3734
- it 'returns the document with limited fields' do
3735
- expect(document['field']).to be_nil
3736
- expect(document['_id']).to_not be_nil
3737
- end
3738
- end
3739
-
3740
- context 'when a sort is provided' do
3741
-
3742
- let!(:document) do
3743
- authorized_collection.find_one_and_delete(selector, sort: { field: 1 })
3744
- end
3745
-
3746
- it 'deletes the document from the database' do
3747
- expect(authorized_collection.find.to_a).to be_empty
3748
- end
3749
-
3750
- it 'returns the document with limited fields' do
3751
- expect(document['field']).to eq('test1')
3752
- end
3753
- end
3754
-
3755
- context 'when max_time_ms is provided' do
3756
-
3757
- it 'includes the max_time_ms value in the command' do
3758
- expect {
3759
- authorized_collection.find_one_and_delete(selector, max_time_ms: 0.1)
3760
- }.to raise_error(Mongo::Error::OperationFailure)
3761
- end
3762
- end
3763
- end
3764
-
3765
- context 'when no matching document is found' do
3766
-
3767
- let(:selector) do
3768
- { field: 'test5' }
3769
- end
3770
-
3771
- let!(:document) do
3772
- authorized_collection.find_one_and_delete(selector)
3773
- end
3774
-
3775
- it 'returns nil' do
3776
- expect(document).to be_nil
3777
- end
3778
- end
3779
-
3780
- context 'when the operation fails' do
3781
-
3782
- let(:result) do
3783
- authorized_collection.find_one_and_delete(selector, max_time_ms: 0.1)
3784
- end
3785
-
3786
- it 'raises an OperationFailure' do
3787
- expect {
3788
- result
3789
- }.to raise_exception(Mongo::Error::OperationFailure)
3790
- end
3791
- end
3792
-
3793
- context 'when write_concern is provided', if: standalone? do
3794
- min_server_version '3.2'
3795
-
3796
- it 'uses the write concern' do
3797
- expect {
3798
- authorized_collection.find_one_and_delete(selector,
3799
- write_concern: { w: 2 })
3800
- }.to raise_error(Mongo::Error::OperationFailure)
3801
- end
3802
- end
3803
-
3804
- context 'when the collection has a write concern', if: standalone? do
3805
- min_server_version '3.2'
3806
-
3807
- let(:collection) do
3808
- authorized_collection.with(write: { w: 2 })
3809
- end
3810
-
3811
- it 'uses the write concern' do
3812
- expect {
3813
- collection.find_one_and_delete(selector,
3814
- write_concern: { w: 2 })
3815
- }.to raise_error(Mongo::Error::OperationFailure)
3816
- end
3817
- end
3818
-
3819
- context 'when collation is specified' do
3820
-
3821
- let(:selector) do
3822
- { name: 'BANG' }
3823
- end
3824
-
3825
- let(:result) do
3826
- authorized_collection.find_one_and_delete(selector, options)
3827
- end
3828
-
3829
- before do
3830
- authorized_collection.insert_one(name: 'bang')
3831
- end
3832
-
3833
- let(:options) do
3834
- { collation: { locale: 'en_US', strength: 2 } }
3835
- end
3836
-
3837
- context 'when the server selected supports collations', if: collation_enabled? do
3838
-
3839
- it 'applies the collation' do
3840
- expect(result['name']).to eq('bang')
3841
- expect(authorized_collection.find(name: 'bang').count).to eq(0)
3842
- end
3843
- end
3844
-
3845
- context 'when the server selected does not support collations', unless: collation_enabled? do
3846
-
3847
- it 'raises an exception' do
3848
- expect {
3849
- result
3850
- }.to raise_exception(Mongo::Error::UnsupportedCollation)
3851
- end
3852
-
3853
- context 'when a String key is used' do
3854
-
3855
- let(:options) do
3856
- { 'collation' => { locale: 'en_US', strength: 2 } }
3857
- end
3858
-
3859
- it 'raises an exception' do
3860
- expect {
3861
- result
3862
- }.to raise_exception(Mongo::Error::UnsupportedCollation)
3863
- end
3864
- end
3865
- end
3866
- end
3867
-
3868
- context 'when collation is not specified' do
3869
-
3870
- let(:selector) do
3871
- { name: 'BANG' }
3872
- end
3873
-
3874
- let(:result) do
3875
- authorized_collection.find_one_and_delete(selector)
3876
- end
3877
-
3878
- before do
3879
- authorized_collection.insert_one(name: 'bang')
3880
- end
3881
-
3882
- it 'does not apply the collation' do
3883
- expect(result).to be_nil
3884
- end
3885
- end
3886
- end
3887
-
3888
- describe '#find_one_and_update' do
3889
-
3890
- let(:selector) do
3891
- { field: 'test1' }
3892
- end
3893
-
3894
- before do
3895
- authorized_collection.insert_many([{ field: 'test1' }])
3896
- end
3897
-
3898
- context 'when a matching document is found' do
3899
-
3900
- context 'when no options are provided' do
3901
-
3902
- let(:document) do
3903
- authorized_collection.find_one_and_update(selector, { '$set' => { field: 'testing' }})
3904
- end
3905
-
3906
- it 'returns the original document' do
3907
- expect(document['field']).to eq('test1')
3908
- end
3909
- end
3910
-
3911
- context 'when a session is provided' do
3912
-
3913
- let(:operation) do
3914
- authorized_collection.find_one_and_update(selector, { '$set' => { field: 'testing' }}, session: session)
3915
- end
3916
-
3917
- let(:failed_operation) do
3918
- authorized_collection.find_one_and_update({ '$._id' => 1 }, { '$set' => { field: 'testing' }}, session: session)
3919
- end
3920
-
3921
- let(:session) do
3922
- authorized_client.start_session
3923
- end
3924
-
3925
- let(:client) do
3926
- authorized_client
3927
- end
3928
-
3929
- it_behaves_like 'an operation using a session'
3930
- it_behaves_like 'a failed operation using a session'
3931
- end
3932
-
3933
- context 'when no options are provided' do
3934
-
3935
- let(:document) do
3936
- authorized_collection.find_one_and_update(selector, { '$set' => { field: 'testing' }})
3937
- end
3938
-
3939
- it 'returns the original document' do
3940
- expect(document['field']).to eq('test1')
3941
- end
3942
- end
3943
-
3944
- context 'when return_document options are provided' do
3945
-
3946
- context 'when return_document is :after' do
3947
-
3948
- let(:document) do
3949
- authorized_collection.find_one_and_update(selector, { '$set' => { field: 'testing' }}, :return_document => :after)
3950
- end
3951
-
3952
- it 'returns the new document' do
3953
- expect(document['field']).to eq('testing')
3954
- end
3955
- end
3956
-
3957
- context 'when return_document is :before' do
3958
-
3959
- let(:document) do
3960
- authorized_collection.find_one_and_update(selector, { '$set' => { field: 'testing' }}, :return_document => :before)
3961
- end
3962
-
3963
- it 'returns the original document' do
3964
- expect(document['field']).to eq('test1')
3965
- end
3966
- end
3967
- end
3968
-
3969
- context 'when a projection is provided' do
3970
-
3971
- let(:document) do
3972
- authorized_collection.find_one_and_update(selector, { '$set' => { field: 'testing' }}, projection: { _id: 1 })
3973
- end
3974
-
3975
- it 'returns the document with limited fields' do
3976
- expect(document['field']).to be_nil
3977
- expect(document['_id']).to_not be_nil
3978
- end
3979
- end
3980
-
3981
- context 'when a sort is provided' do
3982
-
3983
- let(:document) do
3984
- authorized_collection.find_one_and_update(selector, { '$set' => { field: 'testing' }}, sort: { field: 1 })
3985
- end
3986
-
3987
- it 'returns the original document' do
3988
- expect(document['field']).to eq('test1')
3989
- end
3990
- end
3991
- end
3992
-
3993
- context 'when max_time_ms is provided' do
3994
-
3995
- it 'includes the max_time_ms value in the command' do
3996
- expect {
3997
- authorized_collection.find_one_and_update(selector, { '$set' => { field: 'testing' }}, max_time_ms: 0.1)
3998
- }.to raise_error(Mongo::Error::OperationFailure)
3999
- end
4000
- end
4001
-
4002
- context 'when no matching document is found' do
4003
-
4004
- let(:selector) do
4005
- { field: 'test5' }
4006
- end
4007
-
4008
- let(:document) do
4009
- authorized_collection.find_one_and_update(selector, { '$set' => { field: 'testing' }})
4010
- end
4011
-
4012
- it 'returns nil' do
4013
- expect(document).to be_nil
4014
- end
4015
- end
4016
-
4017
- context 'when no matching document is found' do
4018
-
4019
- context 'when no upsert options are provided' do
4020
-
4021
- let(:selector) do
4022
- { field: 'test5' }
4023
- end
4024
-
4025
- let(:document) do
4026
- authorized_collection.find_one_and_update(selector, { '$set' => { field: 'testing' }})
4027
- end
4028
-
4029
- it 'returns nil' do
4030
- expect(document).to be_nil
4031
- end
4032
- end
4033
-
4034
- context 'when upsert options are provided' do
4035
-
4036
- let(:selector) do
4037
- { field: 'test5' }
4038
- end
4039
-
4040
- let(:document) do
4041
- authorized_collection.find_one_and_update(selector, { '$set' => { field: 'testing' }}, :upsert => true, :return_document => :after)
4042
- end
4043
-
4044
- it 'returns the new document' do
4045
- expect(document['field']).to eq('testing')
4046
- end
4047
- end
4048
- end
4049
-
4050
- context 'when the operation fails' do
4051
-
4052
- let(:result) do
4053
- authorized_collection.find_one_and_update(selector, { '$set' => { field: 'testing' }}, max_time_ms: 0.1)
4054
- end
4055
-
4056
- it 'raises an OperationFailure' do
4057
- expect {
4058
- result
4059
- }.to raise_exception(Mongo::Error::OperationFailure)
4060
- end
4061
- end
4062
-
4063
- context 'when collection has a validator' do
4064
- min_server_version '3.2'
4065
-
4066
- around(:each) do |spec|
4067
- authorized_client[:validating,
4068
- :validator => { :a => { '$exists' => true } }].tap do |c|
4069
- c.create
4070
- end
4071
- spec.run
4072
- collection_with_validator.drop
4073
- end
4074
-
4075
- before do
4076
- collection_with_validator.insert_one({ a: 1 })
4077
- end
4078
-
4079
- context 'when the document is valid' do
4080
-
4081
- let(:result) do
4082
- collection_with_validator.find_one_and_update(
4083
- { a: 1 }, { '$inc' => { :a => 1 } }, :return_document => :after)
4084
- end
4085
-
4086
- it 'updates successfully' do
4087
- expect(result['a']).to eq(2)
4088
- end
4089
- end
4090
-
4091
- context 'when the document is invalid' do
4092
-
4093
- context 'when bypass_document_validation is not set' do
4094
-
4095
- let(:result2) do
4096
- collection_with_validator.find_one_and_update(
4097
- { a: 1 }, { '$unset' => { :a => '' } }, :return_document => :after)
4098
- end
4099
-
4100
- it 'raises OperationFailure' do
4101
- expect {
4102
- result2
4103
- }.to raise_exception(Mongo::Error::OperationFailure)
4104
- end
4105
- end
4106
-
4107
- context 'when bypass_document_validation is true' do
4108
-
4109
- let(:result3) do
4110
- collection_with_validator.find_one_and_update(
4111
- { a: 1 }, { '$unset' => { :a => '' } },
4112
- :bypass_document_validation => true,
4113
- :return_document => :after)
4114
- end
4115
-
4116
- it 'updates successfully' do
4117
- expect(result3['a']).to be_nil
4118
- end
4119
- end
4120
- end
4121
- end
4122
-
4123
- context 'when write_concern is provided', if: standalone? do
4124
- min_server_version '3.2'
4125
-
4126
- it 'uses the write concern' do
4127
- expect {
4128
- authorized_collection.find_one_and_update(selector,
4129
- { '$set' => { field: 'testing' }},
4130
- write_concern: { w: 2 })
4131
- }.to raise_error(Mongo::Error::OperationFailure)
4132
- end
4133
- end
4134
-
4135
- context 'when the collection has a write concern', if: standalone? do
4136
- min_server_version '3.2'
4137
-
4138
- let(:collection) do
4139
- authorized_collection.with(write: { w: 2 })
4140
- end
4141
-
4142
- it 'uses the write concern' do
4143
- expect {
4144
- collection.find_one_and_update(selector,
4145
- { '$set' => { field: 'testing' }},
4146
- write_concern: { w: 2 })
4147
- }.to raise_error(Mongo::Error::OperationFailure)
4148
- end
4149
- end
4150
-
4151
- context 'when a collation is specified' do
4152
-
4153
- let(:selector) do
4154
- { name: 'BANG' }
4155
- end
4156
-
4157
- let(:result) do
4158
- authorized_collection.find_one_and_update(selector,
4159
- { '$set' => { other: 'doink' } },
4160
- options)
4161
- end
4162
-
4163
- before do
4164
- authorized_collection.insert_one(name: 'bang')
4165
- end
4166
-
4167
- let(:options) do
4168
- { collation: { locale: 'en_US', strength: 2 } }
4169
- end
4170
-
4171
- context 'when the server selected supports collations', if: collation_enabled? do
4172
-
4173
- it 'applies the collation' do
4174
- expect(result['name']).to eq('bang')
4175
- expect(authorized_collection.find({ name: 'bang' }, limit: -1).first['other']).to eq('doink')
4176
- end
4177
- end
4178
-
4179
- context 'when the server selected does not support collations', unless: collation_enabled? do
4180
-
4181
- it 'raises an exception' do
4182
- expect {
4183
- result
4184
- }.to raise_exception(Mongo::Error::UnsupportedCollation)
4185
- end
4186
-
4187
- context 'when a String key is used' do
4188
-
4189
- let(:options) do
4190
- { 'collation' => { locale: 'en_US', strength: 2 } }
4191
- end
4192
-
4193
- it 'raises an exception' do
4194
- expect {
4195
- result
4196
- }.to raise_exception(Mongo::Error::UnsupportedCollation)
4197
- end
4198
- end
4199
- end
4200
- end
4201
-
4202
- context 'when there is no collation specified' do
4203
-
4204
- let(:selector) do
4205
- { name: 'BANG' }
4206
- end
4207
-
4208
- let(:result) do
4209
- authorized_collection.find_one_and_update(selector, { '$set' => { other: 'doink' } })
4210
- end
4211
-
4212
- before do
4213
- authorized_collection.insert_one(name: 'bang')
4214
- end
4215
-
4216
- it 'does not apply the collation' do
4217
- expect(result).to be_nil
4218
- end
4219
- end
4220
-
4221
- context 'when arrayFilters is provided' do
4222
-
4223
- let(:selector) do
4224
- { _id: 0 }
4225
- end
4226
-
4227
- context 'when the server supports arrayFilters', if: array_filters_enabled? do
4228
-
4229
- before do
4230
- authorized_collection.insert_one(_id: 0, x: [{ y: 1 }, { y: 2 }, { y: 3 }])
4231
- end
4232
-
4233
- let(:result) do
4234
- authorized_collection.find_one_and_update(selector,
4235
- { '$set' => { 'x.$[i].y' => 5 } },
4236
- options)
4237
- end
4238
-
4239
- context 'when a Symbol key is used' do
4240
-
4241
- let(:options) do
4242
- { array_filters: [{ 'i.y' => 3 }] }
4243
- end
4244
-
4245
-
4246
- it 'applies the arrayFilters' do
4247
- expect(result['x']).to eq([{ 'y' => 1 }, { 'y' => 2 }, { 'y' => 3 }])
4248
- expect(authorized_collection.find(selector).first['x'].last['y']).to eq(5)
4249
- end
4250
- end
4251
-
4252
- context 'when a String key is used' do
4253
-
4254
- let(:options) do
4255
- { 'array_filters' => [{ 'i.y' => 3 }] }
4256
- end
4257
-
4258
- it 'applies the arrayFilters' do
4259
- expect(result['x']).to eq([{ 'y' => 1 }, { 'y' => 2 }, { 'y' => 3 }])
4260
- expect(authorized_collection.find(selector).first['x'].last['y']).to eq(5)
4261
- end
4262
- end
4263
- end
4264
-
4265
- context 'when the server selected does not support arrayFilters', unless: array_filters_enabled? do
4266
-
4267
- let(:result) do
4268
- authorized_collection.find_one_and_update(selector,
4269
- { '$set' => { 'x.$[i].y' => 5 } },
4270
- options)
4271
- end
4272
-
4273
- context 'when a Symbol key is used' do
4274
-
4275
- let(:options) do
4276
- { array_filters: [{ 'i.y' => 3 }] }
4277
- end
4278
-
4279
- it 'raises an exception' do
4280
- expect {
4281
- result
4282
- }.to raise_exception(Mongo::Error::UnsupportedArrayFilters)
4283
- end
4284
- end
4285
-
4286
- context 'when a String key is used' do
4287
-
4288
- let(:options) do
4289
- { 'array_filters' => [{ 'i.y' => 3 }] }
4290
- end
4291
-
4292
- it 'raises an exception' do
4293
- expect {
4294
- result
4295
- }.to raise_exception(Mongo::Error::UnsupportedArrayFilters)
4296
- end
4297
- end
4298
- end
4299
- end
4300
- end
4301
-
4302
- describe '#find_one_and_replace' do
4303
-
4304
- before do
4305
- authorized_collection.insert_many([{ field: 'test1', other: 'sth' }])
4306
- end
4307
-
4308
- let(:selector) do
4309
- { field: 'test1' }
4310
- end
4311
-
4312
- context 'when a matching document is found' do
4313
-
4314
- context 'when no options are provided' do
4315
-
4316
- let(:document) do
4317
- authorized_collection.find_one_and_replace(selector, { field: 'testing' })
4318
- end
4319
-
4320
- it 'returns the original document' do
4321
- expect(document['field']).to eq('test1')
4322
- end
4323
- end
4324
-
4325
- context 'when a session is provided' do
4326
-
4327
- let(:operation) do
4328
- authorized_collection.find_one_and_replace(selector, { field: 'testing' }, session: session)
4329
- end
4330
-
4331
- let(:failed_operation) do
4332
- authorized_collection.find_one_and_replace({ '$._id' => 1}, { field: 'testing' }, session: session)
4333
- end
4334
-
4335
- let(:session) do
4336
- authorized_client.start_session
4337
- end
4338
-
4339
- let(:client) do
4340
- authorized_client
4341
- end
4342
-
4343
- it_behaves_like 'an operation using a session'
4344
- it_behaves_like 'a failed operation using a session'
4345
- end
4346
-
4347
- context 'when return_document options are provided' do
4348
-
4349
- context 'when return_document is :after' do
4350
-
4351
- let(:document) do
4352
- authorized_collection.find_one_and_replace(selector, { field: 'testing' }, :return_document => :after)
4353
- end
4354
-
4355
- it 'returns the new document' do
4356
- expect(document['field']).to eq('testing')
4357
- end
4358
- end
4359
-
4360
- context 'when return_document is :before' do
4361
-
4362
- let(:document) do
4363
- authorized_collection.find_one_and_replace(selector, { field: 'testing' }, :return_document => :before)
4364
- end
4365
-
4366
- it 'returns the original document' do
4367
- expect(document['field']).to eq('test1')
4368
- end
4369
- end
4370
- end
4371
-
4372
- context 'when a projection is provided' do
4373
-
4374
- let(:document) do
4375
- authorized_collection.find_one_and_replace(selector, { field: 'testing' }, projection: { _id: 1 })
4376
- end
4377
-
4378
- it 'returns the document with limited fields' do
4379
- expect(document['field']).to be_nil
4380
- expect(document['_id']).to_not be_nil
4381
- end
4382
- end
4383
-
4384
- context 'when a sort is provided' do
4385
-
4386
- let(:document) do
4387
- authorized_collection.find_one_and_replace(selector, { field: 'testing' }, :sort => { field: 1 })
4388
- end
4389
-
4390
- it 'returns the original document' do
4391
- expect(document['field']).to eq('test1')
4392
- end
4393
- end
4394
- end
4395
-
4396
- context 'when no matching document is found' do
4397
-
4398
- context 'when no upsert options are provided' do
4399
-
4400
- let(:selector) do
4401
- { field: 'test5' }
4402
- end
4403
-
4404
- let(:document) do
4405
- authorized_collection.find_one_and_replace(selector, { field: 'testing' })
4406
- end
4407
-
4408
- it 'returns nil' do
4409
- expect(document).to be_nil
4410
- end
4411
- end
4412
-
4413
- context 'when upsert options are provided' do
4414
-
4415
- let(:selector) do
4416
- { field: 'test5' }
4417
- end
4418
-
4419
- let(:document) do
4420
- authorized_collection.find_one_and_replace(selector, { field: 'testing' }, :upsert => true, :return_document => :after)
4421
- end
4422
-
4423
- it 'returns the new document' do
4424
- expect(document['field']).to eq('testing')
4425
- end
4426
- end
4427
- end
4428
-
4429
- context 'when max_time_ms is provided' do
4430
-
4431
- it 'includes the max_time_ms value in the command' do
4432
- expect {
4433
- authorized_collection.find_one_and_replace(selector, { field: 'testing' }, max_time_ms: 0.1)
4434
- }.to raise_error(Mongo::Error::OperationFailure)
4435
- end
4436
- end
4437
-
4438
- context 'when the operation fails' do
4439
-
4440
- let(:result) do
4441
- authorized_collection.find_one_and_replace(selector, { field: 'testing' }, max_time_ms: 0.1)
4442
- end
4443
-
4444
- it 'raises an OperationFailure' do
4445
- expect {
4446
- result
4447
- }.to raise_exception(Mongo::Error::OperationFailure)
4448
- end
4449
- end
4450
-
4451
- context 'when collection has a validator' do
4452
- min_server_version '3.2'
4453
-
4454
- around(:each) do |spec|
4455
- authorized_client[:validating,
4456
- :validator => { :a => { '$exists' => true } }].tap do |c|
4457
- c.create
4458
- end
4459
- spec.run
4460
- collection_with_validator.drop
4461
- end
4462
-
4463
- before do
4464
- collection_with_validator.insert_one({ a: 1 })
4465
- end
4466
-
4467
- context 'when the document is valid' do
4468
-
4469
- let(:result) do
4470
- collection_with_validator.find_one_and_replace(
4471
- { a: 1 }, { a: 5 }, :return_document => :after)
4472
- end
4473
-
4474
- it 'replaces successfully when document is valid' do
4475
- expect(result[:a]).to eq(5)
4476
- end
4477
- end
4478
-
4479
- context 'when the document is invalid' do
4480
-
4481
- context 'when bypass_document_validation is not set' do
4482
-
4483
- let(:result2) do
4484
- collection_with_validator.find_one_and_replace(
4485
- { a: 1 }, { x: 5 }, :return_document => :after)
4486
- end
4487
-
4488
- it 'raises OperationFailure' do
4489
- expect {
4490
- result2
4491
- }.to raise_exception(Mongo::Error::OperationFailure)
4492
- end
4493
- end
4494
-
4495
- context 'when bypass_document_validation is true' do
4496
-
4497
- let(:result3) do
4498
- collection_with_validator.find_one_and_replace(
4499
- { a: 1 }, { x: 1 }, :bypass_document_validation => true,
4500
- :return_document => :after)
4501
- end
4502
-
4503
- it 'replaces successfully' do
4504
- expect(result3[:x]).to eq(1)
4505
- expect(result3[:a]).to be_nil
4506
- end
4507
- end
4508
- end
4509
- end
4510
-
4511
- context 'when write_concern is provided', if: standalone? do
4512
- min_server_version '3.2'
4513
-
4514
- it 'uses the write concern' do
4515
- expect {
4516
- authorized_collection.find_one_and_replace(selector,
4517
- { field: 'testing' },
4518
- write_concern: { w: 2 })
4519
- }.to raise_error(Mongo::Error::OperationFailure)
4520
- end
4521
- end
4522
-
4523
- context 'when the collection has a write concern', if: standalone? do
4524
- min_server_version '3.2'
4525
-
4526
- let(:collection) do
4527
- authorized_collection.with(write: { w: 2 })
4528
- end
4529
-
4530
- it 'uses the write concern' do
4531
- expect {
4532
- collection.find_one_and_replace(selector,
4533
- { field: 'testing' },
4534
- write_concern: { w: 2 })
4535
- }.to raise_error(Mongo::Error::OperationFailure)
4536
- end
4537
- end
4538
-
4539
- context 'when collation is provided' do
4540
-
4541
- let(:selector) do
4542
- { name: 'BANG' }
4543
- end
4544
-
4545
- let(:result) do
4546
- authorized_collection.find_one_and_replace(selector,
4547
- { name: 'doink' },
4548
- options)
4549
- end
4550
-
4551
- before do
4552
- authorized_collection.insert_one(name: 'bang')
4553
- end
4554
-
4555
- let(:options) do
4556
- { collation: { locale: 'en_US', strength: 2 } }
4557
- end
4558
-
4559
- context 'when the server selected supports collations', if: collation_enabled? do
4560
-
4561
- it 'applies the collation' do
4562
- expect(result['name']).to eq('bang')
4563
- expect(authorized_collection.find(name: 'doink').count).to eq(1)
4564
- end
4565
- end
4566
-
4567
- context 'when the server selected does not support collations', unless: collation_enabled? do
4568
-
4569
- it 'raises an exception' do
4570
- expect {
4571
- result
4572
- }.to raise_exception(Mongo::Error::UnsupportedCollation)
4573
- end
4574
-
4575
- context 'when a String key is used' do
4576
-
4577
- let(:options) do
4578
- { 'collation' => { locale: 'en_US', strength: 2 } }
4579
- end
4580
-
4581
- it 'raises an exception' do
4582
- expect {
4583
- result
4584
- }.to raise_exception(Mongo::Error::UnsupportedCollation)
4585
- end
4586
- end
4587
- end
4588
- end
4589
-
4590
- context 'when collation is not specified' do
4591
-
4592
- let(:selector) do
4593
- { name: 'BANG' }
4594
- end
4595
-
4596
- let(:result) do
4597
- authorized_collection.find_one_and_replace(selector, { name: 'doink' })
4598
- end
4599
-
4600
- before do
4601
- authorized_collection.insert_one(name: 'bang')
4602
- end
4603
-
4604
- it 'does not apply the collation' do
4605
- expect(result).to be_nil
4606
- end
686
+ it 'includes the namespace' do
687
+ expect(authorized_collection.inspect).to include(authorized_collection.namespace)
4607
688
  end
4608
689
  end
4609
690
 
4610
691
  describe '#watch' do
4611
692
 
4612
- context 'when change streams can be tested', if: test_change_streams? do
693
+ context 'when change streams can be tested' do
694
+ require_wired_tiger
695
+ min_server_fcv '3.6'
696
+ require_topology :replica_set
4613
697
 
4614
698
  let(:change_stream) do
4615
699
  authorized_collection.watch