mongo 2.13.0.beta1 → 2.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +1 -5
- data/Rakefile +50 -9
- data/lib/mongo.rb +13 -2
- data/lib/mongo/address.rb +1 -1
- data/lib/mongo/address/ipv4.rb +1 -1
- data/lib/mongo/address/ipv6.rb +1 -1
- data/lib/mongo/auth/aws/request.rb +31 -5
- data/lib/mongo/bulk_write.rb +18 -0
- data/lib/mongo/caching_cursor.rb +74 -0
- data/lib/mongo/client.rb +238 -31
- data/lib/mongo/cluster.rb +56 -20
- data/lib/mongo/cluster/sdam_flow.rb +13 -10
- data/lib/mongo/cluster/topology/replica_set_no_primary.rb +3 -2
- data/lib/mongo/cluster/topology/sharded.rb +1 -1
- data/lib/mongo/cluster/topology/single.rb +2 -2
- data/lib/mongo/collection.rb +66 -24
- data/lib/mongo/collection/view.rb +24 -20
- data/lib/mongo/collection/view/aggregation.rb +25 -4
- data/lib/mongo/collection/view/builder/find_command.rb +38 -18
- data/lib/mongo/collection/view/explainable.rb +27 -8
- data/lib/mongo/collection/view/iterable.rb +72 -12
- data/lib/mongo/collection/view/readable.rb +19 -3
- data/lib/mongo/collection/view/writable.rb +55 -5
- data/lib/mongo/crypt/encryption_io.rb +6 -6
- data/lib/mongo/cursor.rb +16 -3
- data/lib/mongo/database.rb +37 -4
- data/lib/mongo/database/view.rb +18 -3
- data/lib/mongo/distinguishing_semaphore.rb +55 -0
- data/lib/mongo/error.rb +5 -0
- data/lib/mongo/error/invalid_read_concern.rb +28 -0
- data/lib/mongo/error/invalid_server_auth_host.rb +22 -0
- data/lib/mongo/error/invalid_session.rb +2 -1
- data/lib/mongo/error/operation_failure.rb +11 -5
- data/lib/mongo/error/server_certificate_revoked.rb +22 -0
- data/lib/mongo/error/sessions_not_supported.rb +35 -0
- data/lib/mongo/error/unsupported_option.rb +14 -12
- data/lib/mongo/event/base.rb +6 -0
- data/lib/mongo/grid/file.rb +5 -0
- data/lib/mongo/grid/file/chunk.rb +2 -0
- data/lib/mongo/grid/fs_bucket.rb +15 -13
- data/lib/mongo/grid/stream/write.rb +9 -3
- data/lib/mongo/index/view.rb +3 -0
- data/lib/mongo/lint.rb +2 -1
- data/lib/mongo/logger.rb +3 -3
- data/lib/mongo/monitoring.rb +38 -0
- data/lib/mongo/monitoring/command_log_subscriber.rb +10 -2
- data/lib/mongo/monitoring/event/command_failed.rb +11 -0
- data/lib/mongo/monitoring/event/command_started.rb +37 -2
- data/lib/mongo/monitoring/event/command_succeeded.rb +11 -0
- data/lib/mongo/monitoring/event/server_closed.rb +1 -1
- data/lib/mongo/monitoring/event/server_description_changed.rb +27 -4
- data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +9 -2
- data/lib/mongo/monitoring/event/server_heartbeat_started.rb +9 -2
- data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +9 -2
- data/lib/mongo/monitoring/event/server_opening.rb +1 -1
- data/lib/mongo/monitoring/event/topology_changed.rb +1 -1
- data/lib/mongo/monitoring/event/topology_closed.rb +1 -1
- data/lib/mongo/monitoring/event/topology_opening.rb +1 -1
- data/lib/mongo/monitoring/publishable.rb +6 -3
- data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +9 -1
- data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +1 -1
- data/lib/mongo/operation.rb +2 -0
- data/lib/mongo/operation/aggregate/result.rb +9 -8
- data/lib/mongo/operation/collections_info/command.rb +5 -0
- data/lib/mongo/operation/collections_info/result.rb +18 -1
- data/lib/mongo/operation/delete/bulk_result.rb +2 -0
- data/lib/mongo/operation/delete/result.rb +3 -0
- data/lib/mongo/operation/explain/command.rb +4 -0
- data/lib/mongo/operation/explain/legacy.rb +4 -0
- data/lib/mongo/operation/explain/op_msg.rb +6 -0
- data/lib/mongo/operation/explain/result.rb +3 -0
- data/lib/mongo/operation/find/legacy/result.rb +2 -0
- data/lib/mongo/operation/find/result.rb +13 -0
- data/lib/mongo/operation/get_more/result.rb +3 -0
- data/lib/mongo/operation/indexes/result.rb +5 -0
- data/lib/mongo/operation/insert/bulk_result.rb +5 -0
- data/lib/mongo/operation/insert/result.rb +5 -0
- data/lib/mongo/operation/list_collections/result.rb +5 -0
- data/lib/mongo/operation/map_reduce/result.rb +10 -0
- data/lib/mongo/operation/parallel_scan/result.rb +4 -0
- data/lib/mongo/operation/result.rb +35 -6
- data/lib/mongo/operation/shared/bypass_document_validation.rb +1 -0
- data/lib/mongo/operation/shared/causal_consistency_supported.rb +1 -0
- data/lib/mongo/operation/shared/collections_info_or_list_collections.rb +2 -0
- data/lib/mongo/operation/shared/executable.rb +1 -0
- data/lib/mongo/operation/shared/idable.rb +2 -1
- data/lib/mongo/operation/shared/limited.rb +1 -0
- data/lib/mongo/operation/shared/object_id_generator.rb +1 -0
- data/lib/mongo/operation/shared/result/aggregatable.rb +1 -0
- data/lib/mongo/operation/shared/sessions_supported.rb +1 -0
- data/lib/mongo/operation/shared/specifiable.rb +1 -0
- data/lib/mongo/operation/shared/write.rb +1 -0
- data/lib/mongo/operation/shared/write_concern_supported.rb +1 -0
- data/lib/mongo/operation/update/legacy/result.rb +7 -0
- data/lib/mongo/operation/update/result.rb +8 -0
- data/lib/mongo/operation/users_info/result.rb +3 -0
- data/lib/mongo/protocol/message.rb +47 -10
- data/lib/mongo/protocol/msg.rb +34 -1
- data/lib/mongo/protocol/query.rb +36 -0
- data/lib/mongo/protocol/serializers.rb +5 -2
- data/lib/mongo/query_cache.rb +242 -0
- data/lib/mongo/retryable.rb +8 -1
- data/lib/mongo/server.rb +15 -4
- data/lib/mongo/server/app_metadata.rb +27 -3
- data/lib/mongo/server/connection.rb +4 -4
- data/lib/mongo/server/connection_base.rb +38 -12
- data/lib/mongo/server/connection_common.rb +2 -2
- data/lib/mongo/server/connection_pool.rb +3 -0
- data/lib/mongo/server/description.rb +13 -1
- data/lib/mongo/server/monitor.rb +76 -44
- data/lib/mongo/server/monitor/connection.rb +57 -9
- data/lib/mongo/server/pending_connection.rb +14 -4
- data/lib/mongo/server/push_monitor.rb +173 -0
- data/{spec/runners/transactions/context.rb → lib/mongo/server/push_monitor/connection.rb} +9 -14
- data/lib/mongo/server_selector.rb +0 -1
- data/lib/mongo/server_selector/base.rb +583 -1
- data/lib/mongo/server_selector/nearest.rb +1 -6
- data/lib/mongo/server_selector/primary.rb +1 -6
- data/lib/mongo/server_selector/primary_preferred.rb +7 -10
- data/lib/mongo/server_selector/secondary.rb +1 -6
- data/lib/mongo/server_selector/secondary_preferred.rb +1 -7
- data/lib/mongo/session.rb +7 -1
- data/lib/mongo/socket.rb +26 -12
- data/lib/mongo/socket/ocsp_cache.rb +97 -0
- data/lib/mongo/socket/ocsp_verifier.rb +368 -0
- data/lib/mongo/socket/ssl.rb +46 -25
- data/lib/mongo/socket/tcp.rb +1 -1
- data/lib/mongo/srv/monitor.rb +7 -13
- data/lib/mongo/srv/resolver.rb +14 -10
- data/lib/mongo/timeout.rb +2 -0
- data/lib/mongo/topology_version.rb +9 -0
- data/lib/mongo/uri.rb +21 -390
- data/lib/mongo/uri/options_mapper.rb +582 -0
- data/lib/mongo/uri/srv_protocol.rb +3 -2
- data/lib/mongo/utils.rb +73 -0
- data/lib/mongo/version.rb +1 -1
- data/spec/NOTES.aws-auth.md +12 -7
- data/spec/README.aws-auth.md +2 -2
- data/spec/README.md +63 -1
- data/spec/integration/awaited_ismaster_spec.rb +28 -0
- data/spec/integration/bson_symbol_spec.rb +4 -2
- data/spec/integration/bulk_write_spec.rb +67 -0
- data/spec/integration/change_stream_examples_spec.rb +6 -2
- data/spec/integration/change_stream_spec.rb +1 -1
- data/spec/integration/check_clean_slate_spec.rb +16 -0
- data/spec/integration/client_authentication_options_spec.rb +92 -28
- data/spec/integration/client_construction_spec.rb +1 -0
- data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +9 -5
- data/spec/integration/connect_single_rs_name_spec.rb +5 -2
- data/spec/integration/connection_pool_populator_spec.rb +4 -2
- data/spec/integration/connection_spec.rb +7 -4
- data/spec/integration/crud_spec.rb +4 -4
- data/spec/integration/cursor_reaping_spec.rb +54 -18
- data/spec/integration/docs_examples_spec.rb +6 -0
- data/spec/integration/fork_reconnect_spec.rb +56 -1
- data/spec/integration/grid_fs_bucket_spec.rb +48 -0
- data/spec/integration/heartbeat_events_spec.rb +4 -23
- data/spec/integration/ocsp_connectivity_spec.rb +26 -0
- data/spec/integration/ocsp_verifier_cache_spec.rb +188 -0
- data/spec/integration/ocsp_verifier_spec.rb +334 -0
- data/spec/integration/query_cache_spec.rb +1045 -0
- data/spec/integration/query_cache_transactions_spec.rb +190 -0
- data/spec/integration/read_concern_spec.rb +1 -1
- data/spec/integration/retryable_errors_spec.rb +1 -1
- data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +1 -0
- data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +4 -2
- data/spec/integration/retryable_writes/shared/performs_modern_retries.rb +3 -3
- data/spec/integration/retryable_writes/shared/performs_no_retries.rb +2 -2
- data/spec/integration/sdam_error_handling_spec.rb +122 -15
- data/spec/integration/sdam_events_spec.rb +80 -6
- data/spec/integration/sdam_prose_spec.rb +64 -0
- data/spec/integration/server_monitor_spec.rb +25 -1
- data/spec/integration/server_selection_spec.rb +36 -0
- data/spec/integration/size_limit_spec.rb +23 -5
- data/spec/integration/srv_monitoring_spec.rb +38 -3
- data/spec/integration/srv_spec.rb +56 -0
- data/spec/integration/ssl_uri_options_spec.rb +2 -2
- data/spec/integration/transactions_examples_spec.rb +17 -7
- data/spec/integration/zlib_compression_spec.rb +25 -0
- data/spec/lite_spec_helper.rb +20 -9
- data/spec/mongo/address_spec.rb +1 -1
- data/spec/mongo/auth/aws/request_region_spec.rb +42 -0
- data/spec/mongo/auth/aws/request_spec.rb +76 -0
- data/spec/mongo/auth/scram_spec.rb +1 -1
- data/spec/mongo/auth/user_spec.rb +1 -1
- data/spec/mongo/bulk_write_spec.rb +2 -2
- data/spec/mongo/caching_cursor_spec.rb +70 -0
- data/spec/mongo/client_construction_spec.rb +386 -3
- data/spec/mongo/client_encryption_spec.rb +16 -10
- data/spec/mongo/client_spec.rb +85 -3
- data/spec/mongo/cluster/topology/replica_set_spec.rb +53 -10
- data/spec/mongo/cluster/topology/sharded_spec.rb +1 -1
- data/spec/mongo/cluster/topology/single_spec.rb +19 -8
- data/spec/mongo/cluster/topology/unknown_spec.rb +1 -1
- data/spec/mongo/cluster/topology_spec.rb +1 -1
- data/spec/mongo/cluster_spec.rb +37 -35
- data/spec/mongo/collection/view/change_stream_resume_spec.rb +7 -7
- data/spec/mongo/collection/view/explainable_spec.rb +87 -4
- data/spec/mongo/collection/view/map_reduce_spec.rb +2 -0
- data/spec/mongo/collection/view/readable_spec.rb +36 -0
- data/spec/mongo/collection_spec.rb +572 -0
- data/spec/mongo/crypt/auto_decryption_context_spec.rb +1 -1
- data/spec/mongo/crypt/auto_encryption_context_spec.rb +1 -1
- data/spec/mongo/crypt/binary_spec.rb +1 -6
- data/spec/mongo/crypt/binding/binary_spec.rb +1 -6
- data/spec/mongo/crypt/binding/context_spec.rb +2 -7
- data/spec/mongo/crypt/binding/helpers_spec.rb +1 -6
- data/spec/mongo/crypt/binding/mongocrypt_spec.rb +2 -7
- data/spec/mongo/crypt/binding/status_spec.rb +1 -6
- data/spec/mongo/crypt/binding/version_spec.rb +1 -6
- data/spec/mongo/crypt/data_key_context_spec.rb +1 -1
- data/spec/mongo/crypt/explicit_decryption_context_spec.rb +1 -1
- data/spec/mongo/crypt/explicit_encryption_context_spec.rb +1 -1
- data/spec/mongo/crypt/status_spec.rb +1 -6
- data/spec/mongo/database_spec.rb +353 -8
- data/spec/mongo/distinguishing_semaphore_spec.rb +63 -0
- data/spec/mongo/error/no_server_available_spec.rb +1 -1
- data/spec/mongo/error/operation_failure_spec.rb +40 -0
- data/spec/mongo/index/view_spec.rb +148 -2
- data/spec/mongo/logger_spec.rb +13 -11
- data/spec/mongo/monitoring/event/server_closed_spec.rb +1 -1
- data/spec/mongo/monitoring/event/server_description_changed_spec.rb +1 -4
- data/spec/mongo/monitoring/event/server_opening_spec.rb +1 -1
- data/spec/mongo/monitoring/event/topology_changed_spec.rb +1 -1
- data/spec/mongo/monitoring/event/topology_closed_spec.rb +1 -1
- data/spec/mongo/monitoring/event/topology_opening_spec.rb +1 -1
- data/spec/mongo/operation/delete/op_msg_spec.rb +3 -3
- data/spec/mongo/operation/insert/command_spec.rb +2 -2
- data/spec/mongo/operation/insert/op_msg_spec.rb +3 -3
- data/spec/mongo/operation/read_preference_op_msg_spec.rb +1 -1
- data/spec/mongo/operation/update/command_spec.rb +2 -2
- data/spec/mongo/operation/update/op_msg_spec.rb +3 -3
- data/spec/mongo/protocol/msg_spec.rb +10 -0
- data/spec/mongo/query_cache_spec.rb +280 -0
- data/spec/mongo/semaphore_spec.rb +51 -0
- data/spec/mongo/server/app_metadata_shared.rb +82 -2
- data/spec/mongo/server/connection_auth_spec.rb +2 -2
- data/spec/mongo/server/connection_pool_spec.rb +7 -3
- data/spec/mongo/server/connection_spec.rb +15 -8
- data/spec/mongo/server/description_spec.rb +18 -0
- data/spec/mongo/server_selector/nearest_spec.rb +23 -23
- data/spec/mongo/server_selector/primary_preferred_spec.rb +26 -26
- data/spec/mongo/server_selector/primary_spec.rb +9 -9
- data/spec/mongo/server_selector/secondary_preferred_spec.rb +22 -22
- data/spec/mongo/server_selector/secondary_spec.rb +18 -18
- data/spec/mongo/server_selector_spec.rb +6 -6
- data/spec/mongo/session_spec.rb +35 -0
- data/spec/mongo/socket/ssl_spec.rb +4 -4
- data/spec/mongo/socket_spec.rb +1 -1
- data/spec/mongo/uri/srv_protocol_spec.rb +64 -33
- data/spec/mongo/uri_option_parsing_spec.rb +11 -11
- data/spec/mongo/uri_spec.rb +68 -41
- data/spec/mongo/utils_spec.rb +39 -0
- data/spec/runners/auth.rb +3 -0
- data/spec/runners/change_streams/test.rb +3 -3
- data/spec/runners/cmap.rb +1 -1
- data/spec/runners/command_monitoring.rb +3 -34
- data/spec/runners/connection_string.rb +35 -124
- data/spec/runners/crud/context.rb +9 -5
- data/spec/runners/crud/operation.rb +59 -27
- data/spec/runners/crud/spec.rb +0 -8
- data/spec/runners/crud/test.rb +1 -1
- data/spec/runners/crud/test_base.rb +0 -19
- data/spec/runners/sdam.rb +2 -2
- data/spec/runners/server_selection.rb +242 -28
- data/spec/runners/transactions.rb +12 -12
- data/spec/runners/transactions/operation.rb +151 -25
- data/spec/runners/transactions/test.rb +62 -18
- data/spec/shared/LICENSE +20 -0
- data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
- data/spec/shared/lib/mrss/constraints.rb +303 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +175 -0
- data/spec/shared/lib/mrss/spec_organizer.rb +149 -0
- data/spec/spec_helper.rb +3 -1
- data/spec/spec_tests/cmap_spec.rb +7 -3
- data/spec/spec_tests/command_monitoring_spec.rb +22 -12
- data/spec/spec_tests/crud_spec.rb +1 -1
- data/spec/spec_tests/data/change_streams/change-streams-errors.yml +4 -9
- data/spec/spec_tests/data/change_streams/change-streams-resume-whitelist.yml +66 -0
- data/spec/spec_tests/data/change_streams/change-streams.yml +0 -1
- data/spec/spec_tests/data/cmap/pool-checkout-connection.yml +6 -2
- data/spec/spec_tests/data/cmap/pool-create-min-size.yml +3 -0
- data/spec/spec_tests/data/connection_string/valid-warnings.yml +24 -0
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/MaxStalenessTooSmall.yml +15 -0
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/NoKnownServers.yml +4 -3
- data/spec/spec_tests/data/max_staleness/Unknown/SmallMaxStaleness.yml +1 -0
- data/spec/spec_tests/data/sdam_integration/cancel-server-check.yml +96 -0
- data/spec/spec_tests/data/sdam_integration/connectTimeoutMS.yml +88 -0
- data/spec/spec_tests/data/sdam_integration/find-network-error.yml +83 -0
- data/spec/spec_tests/data/sdam_integration/find-shutdown-error.yml +116 -0
- data/spec/spec_tests/data/sdam_integration/insert-network-error.yml +86 -0
- data/spec/spec_tests/data/sdam_integration/insert-shutdown-error.yml +115 -0
- data/spec/spec_tests/data/sdam_integration/isMaster-command-error.yml +168 -0
- data/spec/spec_tests/data/sdam_integration/isMaster-network-error.yml +162 -0
- data/spec/spec_tests/data/sdam_integration/isMaster-timeout.yml +229 -0
- data/spec/spec_tests/data/sdam_integration/rediscover-quickly-after-step-down.yml +87 -0
- data/spec/spec_tests/data/sdam_monitoring/discovered_standalone.yml +1 -3
- data/spec/spec_tests/data/sdam_monitoring/standalone.yml +2 -2
- data/spec/spec_tests/data/sdam_monitoring/standalone_repeated.yml +2 -2
- data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +2 -2
- data/spec/spec_tests/data/sdam_monitoring/standalone_to_rs_with_me_mismatch.yml +2 -2
- data/spec/spec_tests/data/uri_options/auth-options.yml +25 -0
- data/spec/spec_tests/data/uri_options/compression-options.yml +6 -3
- data/spec/spec_tests/data/uri_options/read-preference-options.yml +24 -0
- data/spec/spec_tests/data/uri_options/ruby-connection-options.yml +1 -0
- data/spec/spec_tests/data/uri_options/tls-options.yml +160 -4
- data/spec/spec_tests/dns_seedlist_discovery_spec.rb +9 -1
- data/spec/spec_tests/max_staleness_spec.rb +4 -142
- data/spec/spec_tests/retryable_reads_spec.rb +2 -2
- data/spec/spec_tests/sdam_integration_spec.rb +13 -0
- data/spec/spec_tests/sdam_monitoring_spec.rb +1 -2
- data/spec/spec_tests/server_selection_spec.rb +4 -116
- data/spec/spec_tests/uri_options_spec.rb +31 -33
- data/spec/stress/cleanup_spec.rb +17 -2
- data/spec/stress/connection_pool_stress_spec.rb +10 -8
- data/spec/stress/fork_reconnect_stress_spec.rb +1 -1
- data/spec/support/certificates/atlas-ocsp-ca.crt +28 -0
- data/spec/support/certificates/atlas-ocsp.crt +41 -0
- data/spec/support/client_registry.rb +1 -0
- data/spec/support/client_registry_macros.rb +11 -2
- data/spec/support/cluster_config.rb +4 -0
- data/spec/support/common_shortcuts.rb +45 -0
- data/spec/support/constraints.rb +6 -253
- data/spec/support/event_subscriber.rb +123 -33
- data/spec/support/keyword_struct.rb +26 -0
- data/spec/support/matchers.rb +16 -0
- data/spec/support/ocsp +1 -0
- data/spec/support/session_registry.rb +52 -0
- data/spec/support/shared/server_selector.rb +13 -1
- data/spec/support/spec_config.rb +60 -13
- data/spec/support/spec_setup.rb +1 -1
- data/spec/support/utils.rb +84 -1
- metadata +1027 -937
- metadata.gz.sig +0 -0
- data/lib/mongo/server_selector/selectable.rb +0 -560
- data/spec/runners/sdam_monitoring.rb +0 -89
- data/spec/support/lite_constraints.rb +0 -141
@@ -183,7 +183,7 @@ describe Mongo::Collection::View::ChangeStream do
|
|
183
183
|
|
184
184
|
context 'when a killCursors command is issued for the cursor' do
|
185
185
|
context 'using Enumerable' do
|
186
|
-
|
186
|
+
require_mri
|
187
187
|
|
188
188
|
before do
|
189
189
|
change_stream
|
@@ -196,7 +196,7 @@ describe Mongo::Collection::View::ChangeStream do
|
|
196
196
|
change_stream.to_enum
|
197
197
|
end
|
198
198
|
|
199
|
-
it '
|
199
|
+
it 'resumes on a cursor not found error' do
|
200
200
|
original_cursor_id = cursor.id
|
201
201
|
|
202
202
|
client.use(:admin).command({
|
@@ -204,9 +204,9 @@ describe Mongo::Collection::View::ChangeStream do
|
|
204
204
|
cursors: [cursor.id]
|
205
205
|
})
|
206
206
|
|
207
|
-
|
207
|
+
expect do
|
208
208
|
enum.next
|
209
|
-
end.
|
209
|
+
end.not_to raise_error
|
210
210
|
end
|
211
211
|
end
|
212
212
|
|
@@ -218,7 +218,7 @@ describe Mongo::Collection::View::ChangeStream do
|
|
218
218
|
collection.insert_one(a:2)
|
219
219
|
end
|
220
220
|
|
221
|
-
it '
|
221
|
+
it 'resumes on a cursor not found error' do
|
222
222
|
original_cursor_id = cursor.id
|
223
223
|
|
224
224
|
client.use(:admin).command({
|
@@ -226,9 +226,9 @@ describe Mongo::Collection::View::ChangeStream do
|
|
226
226
|
cursors: [cursor.id]
|
227
227
|
})
|
228
228
|
|
229
|
-
|
229
|
+
expect do
|
230
230
|
change_stream.try_next
|
231
|
-
end.
|
231
|
+
end.not_to raise_error
|
232
232
|
end
|
233
233
|
end
|
234
234
|
end
|
@@ -20,12 +20,95 @@ describe Mongo::Collection::View::Explainable do
|
|
20
20
|
|
21
21
|
describe '#explain' do
|
22
22
|
|
23
|
-
|
24
|
-
|
23
|
+
shared_examples 'executes the explain' do
|
24
|
+
context '3.0+ server' do
|
25
|
+
min_server_fcv '3.0'
|
26
|
+
|
27
|
+
context 'not sharded' do
|
28
|
+
require_topology :single, :replica_set
|
29
|
+
|
30
|
+
it 'executes the explain' do
|
31
|
+
explain[:queryPlanner][:namespace].should == authorized_collection.namespace
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'sharded' do
|
36
|
+
require_topology :sharded
|
37
|
+
|
38
|
+
context 'pre-3.2 server' do
|
39
|
+
max_server_version '3.0'
|
40
|
+
|
41
|
+
it 'executes the explain' do
|
42
|
+
explain[:queryPlanner][:parsedQuery].should be_a(Hash)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context '3.2+ server' do
|
47
|
+
min_server_fcv '3.2'
|
48
|
+
|
49
|
+
it 'executes the explain' do
|
50
|
+
explain[:queryPlanner][:mongosPlannerVersion].should == 1
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
context '2.6 server' do
|
57
|
+
max_server_version '2.6'
|
58
|
+
|
59
|
+
it 'executes the explain' do
|
60
|
+
explain[:cursor].should == 'BasicCursor'
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
context 'without arguments' do
|
66
|
+
let(:explain) do
|
67
|
+
view.explain
|
68
|
+
end
|
69
|
+
|
70
|
+
include_examples 'executes the explain'
|
25
71
|
end
|
26
72
|
|
27
|
-
|
28
|
-
|
73
|
+
context 'with verbosity argument' do
|
74
|
+
let(:explain) do
|
75
|
+
view.explain(verbosity: verbosity)
|
76
|
+
end
|
77
|
+
|
78
|
+
shared_examples 'triggers server error' do
|
79
|
+
# 3.0 does not produce the error.
|
80
|
+
min_server_fcv '3.2'
|
81
|
+
|
82
|
+
it 'triggers server error' do
|
83
|
+
lambda do
|
84
|
+
explain
|
85
|
+
end.should raise_error(Mongo::Error::OperationFailure, /verbosity string must be/)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
context 'valid symbol value' do
|
90
|
+
let(:verbosity) { :query_planner }
|
91
|
+
|
92
|
+
include_examples 'executes the explain'
|
93
|
+
end
|
94
|
+
|
95
|
+
context 'valid string value' do
|
96
|
+
let(:verbosity) { 'executionStats' }
|
97
|
+
|
98
|
+
include_examples 'executes the explain'
|
99
|
+
end
|
100
|
+
|
101
|
+
context 'invalid symbol value' do
|
102
|
+
let(:verbosity) { :bogus }
|
103
|
+
|
104
|
+
include_examples 'triggers server error'
|
105
|
+
end
|
106
|
+
|
107
|
+
context 'invalid string value' do
|
108
|
+
let(:verbosity) { 'bogus' }
|
109
|
+
|
110
|
+
include_examples 'triggers server error'
|
111
|
+
end
|
29
112
|
end
|
30
113
|
end
|
31
114
|
end
|
@@ -581,6 +581,7 @@ describe Mongo::Collection::View::MapReduce do
|
|
581
581
|
|
582
582
|
context 'when the server is not valid for writing' do
|
583
583
|
clean_slate
|
584
|
+
require_warning_clean
|
584
585
|
|
585
586
|
before do
|
586
587
|
stop_monitoring(authorized_client)
|
@@ -661,6 +662,7 @@ describe Mongo::Collection::View::MapReduce do
|
|
661
662
|
|
662
663
|
context 'when the server is a valid for writing' do
|
663
664
|
clean_slate
|
665
|
+
require_warning_clean
|
664
666
|
|
665
667
|
before do
|
666
668
|
stop_monitoring(authorized_client)
|
@@ -602,6 +602,42 @@ describe Mongo::Collection::View::Readable do
|
|
602
602
|
end
|
603
603
|
end
|
604
604
|
|
605
|
+
describe "#estimated_document_count" do
|
606
|
+
|
607
|
+
let(:documents) do
|
608
|
+
(1..10).map{ |i| { field: "test#{i}" }}
|
609
|
+
end
|
610
|
+
|
611
|
+
before do
|
612
|
+
authorized_collection.delete_many
|
613
|
+
authorized_collection.insert_many(documents)
|
614
|
+
end
|
615
|
+
|
616
|
+
let(:result) do
|
617
|
+
view.estimated_document_count(options)
|
618
|
+
end
|
619
|
+
|
620
|
+
context 'when a selector is provided' do
|
621
|
+
|
622
|
+
let(:selector) do
|
623
|
+
{ field: 'test1' }
|
624
|
+
end
|
625
|
+
|
626
|
+
it 'raises an error' do
|
627
|
+
expect {
|
628
|
+
result
|
629
|
+
}.to raise_error(ArgumentError, "Cannot call estimated_document_count when querying with a filter")
|
630
|
+
end
|
631
|
+
end
|
632
|
+
|
633
|
+
context 'when no selector is provided' do
|
634
|
+
|
635
|
+
it 'returns the estimated count of matching documents' do
|
636
|
+
expect(view.estimated_document_count).to eq(10)
|
637
|
+
end
|
638
|
+
end
|
639
|
+
end
|
640
|
+
|
605
641
|
describe '#distinct' do
|
606
642
|
|
607
643
|
context 'when incorporating read concern' do
|
@@ -821,6 +821,38 @@ describe Mongo::Collection do
|
|
821
821
|
end
|
822
822
|
end
|
823
823
|
|
824
|
+
context 'when write concern passed in as an option' do
|
825
|
+
min_server_fcv '3.4'
|
826
|
+
require_topology :replica_set
|
827
|
+
|
828
|
+
before do
|
829
|
+
database['collection_spec'].drop
|
830
|
+
end
|
831
|
+
|
832
|
+
let(:events) do
|
833
|
+
subscriber.command_started_events('create')
|
834
|
+
end
|
835
|
+
|
836
|
+
let(:options) do
|
837
|
+
{ write_concern: {w: 1} }
|
838
|
+
end
|
839
|
+
|
840
|
+
let!(:collection) do
|
841
|
+
authorized_collection.with(options)
|
842
|
+
end
|
843
|
+
|
844
|
+
let!(:command) do
|
845
|
+
Utils.get_command_event(authorized_client, 'create') do |client|
|
846
|
+
collection.create({ write_concern: {w: 2} })
|
847
|
+
end.command
|
848
|
+
end
|
849
|
+
|
850
|
+
it 'applies the write concern passed in as an option' do
|
851
|
+
expect(events.length).to eq(1)
|
852
|
+
expect(command[:writeConcern][:w]).to eq(2)
|
853
|
+
end
|
854
|
+
end
|
855
|
+
|
824
856
|
context 'when the server does not support write concern on the create command' do
|
825
857
|
max_server_version '3.2'
|
826
858
|
|
@@ -941,6 +973,30 @@ describe Mongo::Collection do
|
|
941
973
|
it_behaves_like 'a failed operation using a session'
|
942
974
|
end
|
943
975
|
end
|
976
|
+
|
977
|
+
context 'when collation has a strength' do
|
978
|
+
min_server_fcv '3.4'
|
979
|
+
|
980
|
+
let(:band_collection) do
|
981
|
+
described_class.new(database, :bands)
|
982
|
+
end
|
983
|
+
|
984
|
+
before do
|
985
|
+
band_collection.delete_many
|
986
|
+
band_collection.insert_many([{ name: "Depeche Mode" }, { name: "New Order" }])
|
987
|
+
end
|
988
|
+
|
989
|
+
let(:options) do
|
990
|
+
{ collation: { locale: 'en_US', strength: 2 } }
|
991
|
+
end
|
992
|
+
let(:band_result) do
|
993
|
+
band_collection.find({ name: 'DEPECHE MODE' }, options)
|
994
|
+
end
|
995
|
+
|
996
|
+
it 'finds Capitalize from UPPER CASE' do
|
997
|
+
expect(band_result.count_documents).to eq(1)
|
998
|
+
end
|
999
|
+
end
|
944
1000
|
end
|
945
1001
|
|
946
1002
|
describe '#drop' do
|
@@ -1035,6 +1091,34 @@ describe Mongo::Collection do
|
|
1035
1091
|
end
|
1036
1092
|
end
|
1037
1093
|
|
1094
|
+
context 'when write concern passed in as an option' do
|
1095
|
+
min_server_fcv '3.4'
|
1096
|
+
require_set_write_concern
|
1097
|
+
|
1098
|
+
let(:events) do
|
1099
|
+
subscriber.command_started_events('drop')
|
1100
|
+
end
|
1101
|
+
|
1102
|
+
let(:options) do
|
1103
|
+
{ write_concern: {w: 1} }
|
1104
|
+
end
|
1105
|
+
|
1106
|
+
let!(:collection) do
|
1107
|
+
authorized_collection.with(options)
|
1108
|
+
end
|
1109
|
+
|
1110
|
+
let!(:command) do
|
1111
|
+
Utils.get_command_event(authorized_client, 'drop') do |client|
|
1112
|
+
collection.drop({ write_concern: {w: 0} })
|
1113
|
+
end.command
|
1114
|
+
end
|
1115
|
+
|
1116
|
+
it 'applies the write concern passed in as an option' do
|
1117
|
+
expect(events.length).to eq(1)
|
1118
|
+
expect(command[:writeConcern][:w]).to eq(0)
|
1119
|
+
end
|
1120
|
+
end
|
1121
|
+
|
1038
1122
|
context 'when the server does not support write concern on the drop command' do
|
1039
1123
|
max_server_version '3.2'
|
1040
1124
|
|
@@ -1601,6 +1685,40 @@ describe Mongo::Collection do
|
|
1601
1685
|
expect(result.inserted_count).to be(0)
|
1602
1686
|
end
|
1603
1687
|
end
|
1688
|
+
|
1689
|
+
context 'when various options passed in' do
|
1690
|
+
# w: 2 requires a replica set
|
1691
|
+
require_topology :replica_set
|
1692
|
+
|
1693
|
+
# https://jira.mongodb.org/browse/RUBY-2306
|
1694
|
+
min_server_fcv '3.6'
|
1695
|
+
|
1696
|
+
let(:session) do
|
1697
|
+
authorized_client.start_session
|
1698
|
+
end
|
1699
|
+
|
1700
|
+
let(:events) do
|
1701
|
+
subscriber.command_started_events('insert')
|
1702
|
+
end
|
1703
|
+
|
1704
|
+
let(:collection) do
|
1705
|
+
authorized_collection.with(write_concern: {w: 2})
|
1706
|
+
end
|
1707
|
+
|
1708
|
+
let!(:command) do
|
1709
|
+
Utils.get_command_event(authorized_client, 'insert') do |client|
|
1710
|
+
collection.insert_many([{ name: 'test1' }, { name: 'test2' }], session: session,
|
1711
|
+
write_concern: {w: 1}, bypass_document_validation: true)
|
1712
|
+
end.command
|
1713
|
+
end
|
1714
|
+
|
1715
|
+
it 'inserts many successfully with correct options sent to server' do
|
1716
|
+
expect(events.length).to eq(1)
|
1717
|
+
expect(command[:writeConcern]).to_not be_nil
|
1718
|
+
expect(command[:writeConcern][:w]).to eq(1)
|
1719
|
+
expect(command[:bypassDocumentValidation]).to be(true)
|
1720
|
+
end
|
1721
|
+
end
|
1604
1722
|
end
|
1605
1723
|
|
1606
1724
|
describe '#insert_one' do
|
@@ -1683,6 +1801,37 @@ describe Mongo::Collection do
|
|
1683
1801
|
it_behaves_like 'an implicit session with an unacknowledged write'
|
1684
1802
|
end
|
1685
1803
|
|
1804
|
+
context 'when various options passed in' do
|
1805
|
+
# https://jira.mongodb.org/browse/RUBY-2306
|
1806
|
+
min_server_fcv '3.6'
|
1807
|
+
|
1808
|
+
let(:session) do
|
1809
|
+
authorized_client.start_session
|
1810
|
+
end
|
1811
|
+
|
1812
|
+
let(:events) do
|
1813
|
+
subscriber.command_started_events('insert')
|
1814
|
+
end
|
1815
|
+
|
1816
|
+
let(:collection) do
|
1817
|
+
authorized_collection.with(write_concern: {w: 3})
|
1818
|
+
end
|
1819
|
+
|
1820
|
+
let!(:command) do
|
1821
|
+
Utils.get_command_event(authorized_client, 'insert') do |client|
|
1822
|
+
collection.insert_one({name: 'test1'}, session: session, write_concern: {w: 1},
|
1823
|
+
bypass_document_validation: true)
|
1824
|
+
end.command
|
1825
|
+
end
|
1826
|
+
|
1827
|
+
it 'inserts one successfully with correct options sent to server' do
|
1828
|
+
expect(events.length).to eq(1)
|
1829
|
+
expect(command[:writeConcern]).to_not be_nil
|
1830
|
+
expect(command[:writeConcern][:w]).to eq(1)
|
1831
|
+
expect(command[:bypassDocumentValidation]).to be(true)
|
1832
|
+
end
|
1833
|
+
end
|
1834
|
+
|
1686
1835
|
context 'when the document contains invalid keys' do
|
1687
1836
|
|
1688
1837
|
let(:doc) do
|
@@ -1696,6 +1845,18 @@ describe Mongo::Collection do
|
|
1696
1845
|
end
|
1697
1846
|
end
|
1698
1847
|
|
1848
|
+
context 'when the document is nil' do
|
1849
|
+
let(:result) do
|
1850
|
+
authorized_collection.insert_one(nil)
|
1851
|
+
end
|
1852
|
+
|
1853
|
+
it 'raises an ArgumentError' do
|
1854
|
+
expect {
|
1855
|
+
result
|
1856
|
+
}.to raise_error(ArgumentError, "Document to be inserted cannot be nil")
|
1857
|
+
end
|
1858
|
+
end
|
1859
|
+
|
1699
1860
|
context 'when the insert fails' do
|
1700
1861
|
|
1701
1862
|
let(:result) do
|
@@ -1791,6 +1952,52 @@ describe Mongo::Collection do
|
|
1791
1952
|
end
|
1792
1953
|
end
|
1793
1954
|
|
1955
|
+
describe '#bulk_write' do
|
1956
|
+
|
1957
|
+
context 'when various options passed in' do
|
1958
|
+
min_server_fcv '3.2'
|
1959
|
+
require_topology :replica_set
|
1960
|
+
|
1961
|
+
# https://jira.mongodb.org/browse/RUBY-2306
|
1962
|
+
min_server_fcv '3.6'
|
1963
|
+
|
1964
|
+
let(:requests) do
|
1965
|
+
[
|
1966
|
+
{ insert_one: { name: "anne" }},
|
1967
|
+
{ insert_one: { name: "bob" }},
|
1968
|
+
{ insert_one: { name: "charlie" }}
|
1969
|
+
]
|
1970
|
+
end
|
1971
|
+
|
1972
|
+
let(:session) do
|
1973
|
+
authorized_client.start_session
|
1974
|
+
end
|
1975
|
+
|
1976
|
+
let!(:command) do
|
1977
|
+
Utils.get_command_event(authorized_client, 'insert') do |client|
|
1978
|
+
collection.bulk_write(requests, session: session, write_concern: {w: 1},
|
1979
|
+
bypass_document_validation: true)
|
1980
|
+
end.command
|
1981
|
+
end
|
1982
|
+
|
1983
|
+
let(:events) do
|
1984
|
+
subscriber.command_started_events('insert')
|
1985
|
+
end
|
1986
|
+
|
1987
|
+
let(:collection) do
|
1988
|
+
authorized_collection.with(write_concern: {w: 2})
|
1989
|
+
end
|
1990
|
+
|
1991
|
+
it 'inserts successfully with correct options sent to server' do
|
1992
|
+
expect(collection.count).to eq(3)
|
1993
|
+
expect(events.length).to eq(1)
|
1994
|
+
expect(command[:writeConcern]).to_not be_nil
|
1995
|
+
expect(command[:writeConcern][:w]).to eq(1)
|
1996
|
+
expect(command[:bypassDocumentValidation]).to eq(true)
|
1997
|
+
end
|
1998
|
+
end
|
1999
|
+
end
|
2000
|
+
|
1794
2001
|
describe '#inspect' do
|
1795
2002
|
|
1796
2003
|
it 'includes the object id' do
|
@@ -2000,6 +2207,39 @@ describe Mongo::Collection do
|
|
2000
2207
|
end
|
2001
2208
|
|
2002
2209
|
describe '#count_documents' do
|
2210
|
+
|
2211
|
+
before do
|
2212
|
+
authorized_collection.delete_many
|
2213
|
+
end
|
2214
|
+
|
2215
|
+
context 'no argument provided' do
|
2216
|
+
|
2217
|
+
context 'when collection is empty' do
|
2218
|
+
it 'returns 0 matching documents' do
|
2219
|
+
expect(authorized_collection.count_documents).to eq(0)
|
2220
|
+
end
|
2221
|
+
end
|
2222
|
+
|
2223
|
+
context 'when collection is not empty' do
|
2224
|
+
|
2225
|
+
let(:documents) do
|
2226
|
+
documents = []
|
2227
|
+
1.upto(10) do |index|
|
2228
|
+
documents << { key: 'a', _id: "in#{index}" }
|
2229
|
+
end
|
2230
|
+
documents
|
2231
|
+
end
|
2232
|
+
|
2233
|
+
before do
|
2234
|
+
authorized_collection.insert_many(documents)
|
2235
|
+
end
|
2236
|
+
|
2237
|
+
it 'returns 10 matching documents' do
|
2238
|
+
expect(authorized_collection.count_documents).to eq(10)
|
2239
|
+
end
|
2240
|
+
end
|
2241
|
+
end
|
2242
|
+
|
2003
2243
|
context 'when transactions are enabled' do
|
2004
2244
|
require_wired_tiger
|
2005
2245
|
require_transaction_support
|
@@ -2478,6 +2718,48 @@ describe Mongo::Collection do
|
|
2478
2718
|
expect(authorized_collection.find(name: 'bang').count).to eq(1)
|
2479
2719
|
end
|
2480
2720
|
end
|
2721
|
+
|
2722
|
+
context 'when various options passed in' do
|
2723
|
+
# w: 2 requires a replica set
|
2724
|
+
require_topology :replica_set
|
2725
|
+
|
2726
|
+
# https://jira.mongodb.org/browse/RUBY-2306
|
2727
|
+
min_server_fcv '3.6'
|
2728
|
+
|
2729
|
+
before do
|
2730
|
+
authorized_collection.insert_many([{ name: 'test1' }, { name: 'test2' }])
|
2731
|
+
end
|
2732
|
+
|
2733
|
+
let(:selector) do
|
2734
|
+
{name: 'test2'}
|
2735
|
+
end
|
2736
|
+
|
2737
|
+
let(:session) do
|
2738
|
+
authorized_client.start_session
|
2739
|
+
end
|
2740
|
+
|
2741
|
+
let(:events) do
|
2742
|
+
subscriber.command_started_events('delete')
|
2743
|
+
end
|
2744
|
+
|
2745
|
+
let(:collection) do
|
2746
|
+
authorized_collection.with(write_concern: {w: 2})
|
2747
|
+
end
|
2748
|
+
|
2749
|
+
let!(:command) do
|
2750
|
+
Utils.get_command_event(authorized_client, 'delete') do |client|
|
2751
|
+
collection.delete_one(selector, session: session, write_concern: {w: 1},
|
2752
|
+
bypass_document_validation: true)
|
2753
|
+
end.command
|
2754
|
+
end
|
2755
|
+
|
2756
|
+
it 'deletes one successfully with correct options sent to server' do
|
2757
|
+
expect(events.length).to eq(1)
|
2758
|
+
expect(command[:writeConcern]).to_not be_nil
|
2759
|
+
expect(command[:writeConcern][:w]).to eq(1)
|
2760
|
+
expect(command[:bypassDocumentValidation]).to eq(true)
|
2761
|
+
end
|
2762
|
+
end
|
2481
2763
|
end
|
2482
2764
|
|
2483
2765
|
describe '#delete_many' do
|
@@ -2668,6 +2950,48 @@ describe Mongo::Collection do
|
|
2668
2950
|
expect(authorized_collection.find(name: 'bang').count).to eq(2)
|
2669
2951
|
end
|
2670
2952
|
end
|
2953
|
+
|
2954
|
+
context 'when various options passed in' do
|
2955
|
+
# w: 2 requires a replica set
|
2956
|
+
require_topology :replica_set
|
2957
|
+
|
2958
|
+
# https://jira.mongodb.org/browse/RUBY-2306
|
2959
|
+
min_server_fcv '3.6'
|
2960
|
+
|
2961
|
+
before do
|
2962
|
+
collection.insert_many([{ name: 'test1' }, { name: 'test2' }, { name: 'test3'}])
|
2963
|
+
end
|
2964
|
+
|
2965
|
+
let(:selector) do
|
2966
|
+
{name: 'test1'}
|
2967
|
+
end
|
2968
|
+
|
2969
|
+
let(:session) do
|
2970
|
+
authorized_client.start_session
|
2971
|
+
end
|
2972
|
+
|
2973
|
+
let(:events) do
|
2974
|
+
subscriber.command_started_events('delete')
|
2975
|
+
end
|
2976
|
+
|
2977
|
+
let(:collection) do
|
2978
|
+
authorized_collection.with(write_concern: {w: 1})
|
2979
|
+
end
|
2980
|
+
|
2981
|
+
let!(:command) do
|
2982
|
+
Utils.get_command_event(authorized_client, 'delete') do |client|
|
2983
|
+
collection.delete_many(selector, session: session, write_concern: {w: 2},
|
2984
|
+
bypass_document_validation: true)
|
2985
|
+
end.command
|
2986
|
+
end
|
2987
|
+
|
2988
|
+
it 'deletes many successfully with correct options sent to server' do
|
2989
|
+
expect(events.length).to eq(1)
|
2990
|
+
expect(command[:writeConcern]).to_not be_nil
|
2991
|
+
expect(command[:writeConcern][:w]).to eq(2)
|
2992
|
+
expect(command[:bypassDocumentValidation]).to be(true)
|
2993
|
+
end
|
2994
|
+
end
|
2671
2995
|
end
|
2672
2996
|
|
2673
2997
|
describe '#parallel_scan' do
|
@@ -3174,6 +3498,51 @@ describe Mongo::Collection do
|
|
3174
3498
|
|
3175
3499
|
it_behaves_like 'an implicit session with an unacknowledged write'
|
3176
3500
|
end
|
3501
|
+
|
3502
|
+
context 'when various options passed in' do
|
3503
|
+
# w: 2 requires a replica set
|
3504
|
+
require_topology :replica_set
|
3505
|
+
|
3506
|
+
# https://jira.mongodb.org/browse/RUBY-2306
|
3507
|
+
min_server_fcv '3.6'
|
3508
|
+
|
3509
|
+
before do
|
3510
|
+
authorized_collection.insert_one({field: 'test1'})
|
3511
|
+
end
|
3512
|
+
|
3513
|
+
let(:session) do
|
3514
|
+
authorized_client.start_session
|
3515
|
+
end
|
3516
|
+
|
3517
|
+
let(:events) do
|
3518
|
+
subscriber.command_started_events('update')
|
3519
|
+
end
|
3520
|
+
|
3521
|
+
let(:collection) do
|
3522
|
+
authorized_collection.with(write_concern: {w: 3})
|
3523
|
+
end
|
3524
|
+
|
3525
|
+
let(:updated) do
|
3526
|
+
collection.find(field: 'test4').first
|
3527
|
+
end
|
3528
|
+
|
3529
|
+
let!(:command) do
|
3530
|
+
Utils.get_command_event(authorized_client, 'update') do |client|
|
3531
|
+
collection.replace_one(selector, { field: 'test4'},
|
3532
|
+
session: session, :return_document => :after, write_concern: {w: 2},
|
3533
|
+
upsert: true, bypass_document_validation: true)
|
3534
|
+
end.command
|
3535
|
+
end
|
3536
|
+
|
3537
|
+
it 'replaced one successfully with correct options sent to server' do
|
3538
|
+
expect(updated[:field]).to eq('test4')
|
3539
|
+
expect(events.length).to eq(1)
|
3540
|
+
expect(command[:writeConcern]).to_not be_nil
|
3541
|
+
expect(command[:writeConcern][:w]).to eq(2)
|
3542
|
+
expect(command[:bypassDocumentValidation]).to be(true)
|
3543
|
+
expect(command[:updates][0][:upsert]).to be(true)
|
3544
|
+
end
|
3545
|
+
end
|
3177
3546
|
end
|
3178
3547
|
|
3179
3548
|
describe '#update_many' do
|
@@ -3596,6 +3965,45 @@ describe Mongo::Collection do
|
|
3596
3965
|
|
3597
3966
|
it_behaves_like 'an implicit session with an unacknowledged write'
|
3598
3967
|
end
|
3968
|
+
|
3969
|
+
context 'when various options passed in' do
|
3970
|
+
# w: 2 requires a replica set
|
3971
|
+
require_topology :replica_set
|
3972
|
+
|
3973
|
+
# https://jira.mongodb.org/browse/RUBY-2306
|
3974
|
+
min_server_fcv '3.6'
|
3975
|
+
|
3976
|
+
before do
|
3977
|
+
collection.insert_many([{ field: 'test' }, { field: 'test2' }], session: session)
|
3978
|
+
end
|
3979
|
+
|
3980
|
+
let(:session) do
|
3981
|
+
authorized_client.start_session
|
3982
|
+
end
|
3983
|
+
|
3984
|
+
let(:collection) do
|
3985
|
+
authorized_collection.with(write_concern: {w: 1})
|
3986
|
+
end
|
3987
|
+
|
3988
|
+
let(:events) do
|
3989
|
+
subscriber.command_started_events('update')
|
3990
|
+
end
|
3991
|
+
|
3992
|
+
let!(:command) do
|
3993
|
+
Utils.get_command_event(authorized_client, 'update') do |client|
|
3994
|
+
collection.update_many(selector, {'$set'=> { field: 'testing' }}, session: session,
|
3995
|
+
write_concern: {w: 2}, bypass_document_validation: true, upsert: true)
|
3996
|
+
end.command
|
3997
|
+
end
|
3998
|
+
|
3999
|
+
it 'updates many successfully with correct options sent to server' do
|
4000
|
+
expect(events.length).to eq(1)
|
4001
|
+
expect(collection.options[:write_concern]).to eq(w: 1)
|
4002
|
+
expect(command[:writeConcern][:w]).to eq(2)
|
4003
|
+
expect(command[:bypassDocumentValidation]).to be(true)
|
4004
|
+
expect(command[:updates][0][:upsert]).to be(true)
|
4005
|
+
end
|
4006
|
+
end
|
3599
4007
|
end
|
3600
4008
|
|
3601
4009
|
describe '#update_one' do
|
@@ -4014,6 +4422,47 @@ describe Mongo::Collection do
|
|
4014
4422
|
|
4015
4423
|
it_behaves_like 'an implicit session with an unacknowledged write'
|
4016
4424
|
end
|
4425
|
+
|
4426
|
+
context 'when various options passed in' do
|
4427
|
+
# w: 2 requires a replica set
|
4428
|
+
require_topology :replica_set
|
4429
|
+
|
4430
|
+
# https://jira.mongodb.org/browse/RUBY-2306
|
4431
|
+
min_server_fcv '3.6'
|
4432
|
+
|
4433
|
+
before do
|
4434
|
+
collection.insert_many([{ field: 'test1' }, { field: 'test2' }], session: session)
|
4435
|
+
end
|
4436
|
+
|
4437
|
+
let(:session) do
|
4438
|
+
authorized_client.start_session
|
4439
|
+
end
|
4440
|
+
|
4441
|
+
let(:collection) do
|
4442
|
+
authorized_collection.with(write_concern: {w: 1})
|
4443
|
+
end
|
4444
|
+
|
4445
|
+
let(:events) do
|
4446
|
+
subscriber.command_started_events('update')
|
4447
|
+
end
|
4448
|
+
|
4449
|
+
let!(:command) do
|
4450
|
+
Utils.get_command_event(authorized_client, 'update') do |client|
|
4451
|
+
collection.update_one(selector, { '$set'=> { field: 'testing' } }, session: session,
|
4452
|
+
write_concern: {w: 2}, bypass_document_validation: true, :return_document => :after,
|
4453
|
+
upsert: true)
|
4454
|
+
end.command
|
4455
|
+
end
|
4456
|
+
|
4457
|
+
it 'updates one successfully with correct options sent to server' do
|
4458
|
+
expect(events.length).to eq(1)
|
4459
|
+
expect(command[:writeConcern]).to_not be_nil
|
4460
|
+
expect(command[:writeConcern][:w]).to eq(2)
|
4461
|
+
expect(collection.options[:write_concern]).to eq(w:1)
|
4462
|
+
expect(command[:bypassDocumentValidation]).to be(true)
|
4463
|
+
expect(command[:updates][0][:upsert]).to be(true)
|
4464
|
+
end
|
4465
|
+
end
|
4017
4466
|
end
|
4018
4467
|
|
4019
4468
|
describe '#find_one_and_delete' do
|
@@ -4231,6 +4680,46 @@ describe Mongo::Collection do
|
|
4231
4680
|
expect(result).to be_nil
|
4232
4681
|
end
|
4233
4682
|
end
|
4683
|
+
|
4684
|
+
context 'when various options passed in' do
|
4685
|
+
# w: 2 requires a replica set
|
4686
|
+
require_topology :replica_set
|
4687
|
+
|
4688
|
+
# https://jira.mongodb.org/browse/RUBY-2306
|
4689
|
+
min_server_fcv '3.6'
|
4690
|
+
|
4691
|
+
before do
|
4692
|
+
authorized_collection.delete_many
|
4693
|
+
authorized_collection.insert_many([{ name: 'test1' }, { name: 'test2' }])
|
4694
|
+
end
|
4695
|
+
|
4696
|
+
let(:collection) do
|
4697
|
+
authorized_collection.with(write_concern: {w: 2})
|
4698
|
+
end
|
4699
|
+
|
4700
|
+
let(:session) do
|
4701
|
+
authorized_client.start_session
|
4702
|
+
end
|
4703
|
+
|
4704
|
+
let!(:command) do
|
4705
|
+
Utils.get_command_event(authorized_client, 'findAndModify') do |client|
|
4706
|
+
collection.find_one_and_delete(selector, session: session, write_concern: {w: 2},
|
4707
|
+
bypass_document_validation: true, max_time_ms: 300)
|
4708
|
+
end.command
|
4709
|
+
end
|
4710
|
+
|
4711
|
+
let(:events) do
|
4712
|
+
subscriber.command_started_events('findAndModify')
|
4713
|
+
end
|
4714
|
+
|
4715
|
+
it 'finds and deletes successfully with correct options sent to server' do
|
4716
|
+
expect(events.length).to eq(1)
|
4717
|
+
expect(command[:writeConcern]).to_not be_nil
|
4718
|
+
expect(command[:writeConcern][:w]).to eq(2)
|
4719
|
+
expect(command[:bypassDocumentValidation]).to eq(true)
|
4720
|
+
expect(command[:maxTimeMS]).to eq(300)
|
4721
|
+
end
|
4722
|
+
end
|
4234
4723
|
end
|
4235
4724
|
|
4236
4725
|
describe '#find_one_and_update' do
|
@@ -4652,6 +5141,51 @@ describe Mongo::Collection do
|
|
4652
5141
|
end
|
4653
5142
|
end
|
4654
5143
|
end
|
5144
|
+
|
5145
|
+
context 'when various options passed in' do
|
5146
|
+
# w: 2 requires a replica set
|
5147
|
+
require_topology :replica_set
|
5148
|
+
|
5149
|
+
# https://jira.mongodb.org/browse/RUBY-2306
|
5150
|
+
min_server_fcv '3.6'
|
5151
|
+
|
5152
|
+
let(:session) do
|
5153
|
+
authorized_client.start_session
|
5154
|
+
end
|
5155
|
+
|
5156
|
+
let(:events) do
|
5157
|
+
subscriber.command_started_events('findAndModify')
|
5158
|
+
end
|
5159
|
+
|
5160
|
+
let(:collection) do
|
5161
|
+
authorized_collection.with(write_concern: {w: 2})
|
5162
|
+
end
|
5163
|
+
|
5164
|
+
let(:selector) do
|
5165
|
+
{field: 'test1'}
|
5166
|
+
end
|
5167
|
+
|
5168
|
+
before do
|
5169
|
+
collection.insert_one({field: 'test1'}, session: session)
|
5170
|
+
end
|
5171
|
+
|
5172
|
+
let!(:command) do
|
5173
|
+
Utils.get_command_event(authorized_client, 'findAndModify') do |client|
|
5174
|
+
collection.find_one_and_update(selector, { '$set' => {field: 'testing'}},
|
5175
|
+
:return_document => :after, write_concern: {w: 1}, upsert: true,
|
5176
|
+
bypass_document_validation: true, max_time_ms: 100, session: session)
|
5177
|
+
end.command
|
5178
|
+
end
|
5179
|
+
|
5180
|
+
it 'find and updates successfully with correct options sent to server' do
|
5181
|
+
expect(events.length).to eq(1)
|
5182
|
+
expect(command[:writeConcern]).to_not be_nil
|
5183
|
+
expect(command[:writeConcern][:w]).to eq(1)
|
5184
|
+
expect(command[:upsert]).to eq(true)
|
5185
|
+
expect(command[:bypassDocumentValidation]).to be(true)
|
5186
|
+
expect(command[:maxTimeMS]).to eq(100)
|
5187
|
+
end
|
5188
|
+
end
|
4655
5189
|
end
|
4656
5190
|
|
4657
5191
|
describe '#find_one_and_replace' do
|
@@ -4965,6 +5499,44 @@ describe Mongo::Collection do
|
|
4965
5499
|
expect(result).to be_nil
|
4966
5500
|
end
|
4967
5501
|
end
|
5502
|
+
|
5503
|
+
context 'when various options passed in' do
|
5504
|
+
# https://jira.mongodb.org/browse/RUBY-2306
|
5505
|
+
min_server_fcv '3.6'
|
5506
|
+
|
5507
|
+
before do
|
5508
|
+
authorized_collection.insert_one({field: 'test1'})
|
5509
|
+
end
|
5510
|
+
|
5511
|
+
let(:session) do
|
5512
|
+
authorized_client.start_session
|
5513
|
+
end
|
5514
|
+
|
5515
|
+
let(:events) do
|
5516
|
+
subscriber.command_started_events('findAndModify')
|
5517
|
+
end
|
5518
|
+
|
5519
|
+
let(:collection) do
|
5520
|
+
authorized_collection.with(write_concern: { w: 2 })
|
5521
|
+
end
|
5522
|
+
|
5523
|
+
let!(:command) do
|
5524
|
+
Utils.get_command_event(authorized_client, 'findAndModify') do |client|
|
5525
|
+
collection.find_one_and_replace(selector, { '$set' => {field: 'test5'}},
|
5526
|
+
:return_document => :after, write_concern: {w: 1}, session: session,
|
5527
|
+
upsert: true, bypass_document_validation: false, max_time_ms: 200)
|
5528
|
+
end.command
|
5529
|
+
end
|
5530
|
+
|
5531
|
+
it 'find and replaces successfully with correct options sent to server' do
|
5532
|
+
expect(events.length).to eq(1)
|
5533
|
+
expect(command[:writeConcern]).to_not be_nil
|
5534
|
+
expect(command[:writeConcern][:w]).to eq(1)
|
5535
|
+
expect(command[:upsert]).to be(true)
|
5536
|
+
expect(command[:bypassDocumentValidation]).to be_nil
|
5537
|
+
expect(command[:maxTimeMS]).to eq(200)
|
5538
|
+
end
|
5539
|
+
end
|
4968
5540
|
end
|
4969
5541
|
|
4970
5542
|
describe '#watch' do
|