mongo 2.6.2 → 2.16.0

Sign up to get free protection for your applications and to get access to all the features.
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