mongo 2.11.0.rc0 → 2.11.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/Rakefile +2 -0
- data/lib/mongo/auth.rb +11 -2
- data/lib/mongo/auth/cr/conversation.rb +1 -1
- data/lib/mongo/auth/ldap/conversation.rb +1 -1
- data/lib/mongo/auth/scram/conversation.rb +4 -1
- data/lib/mongo/auth/user.rb +15 -1
- data/lib/mongo/auth/user/view.rb +10 -4
- data/lib/mongo/auth/x509.rb +11 -1
- data/lib/mongo/auth/x509/conversation.rb +15 -6
- data/lib/mongo/background_thread.rb +28 -13
- data/lib/mongo/client.rb +23 -15
- data/lib/mongo/collection/view/change_stream.rb +5 -1
- data/lib/mongo/collection/view/readable.rb +5 -2
- data/lib/mongo/collection/view/writable.rb +3 -1
- data/lib/mongo/cursor/builder/get_more_command.rb +4 -1
- data/lib/mongo/cursor/builder/kill_cursors_command.rb +16 -5
- data/lib/mongo/cursor/builder/op_get_more.rb +2 -2
- data/lib/mongo/cursor/builder/op_kill_cursors.rb +17 -5
- data/lib/mongo/error/operation_failure.rb +3 -3
- data/lib/mongo/monitoring/command_log_subscriber.rb +5 -3
- data/lib/mongo/monitoring/event/command_started.rb +13 -3
- data/lib/mongo/monitoring/publishable.rb +4 -2
- data/lib/mongo/operation/create_user/command.rb +1 -0
- data/lib/mongo/operation/remove_user/command.rb +1 -0
- data/lib/mongo/operation/update_user/command.rb +1 -0
- data/lib/mongo/protocol/get_more.rb +2 -1
- data/lib/mongo/protocol/kill_cursors.rb +6 -13
- data/lib/mongo/protocol/serializers.rb +10 -4
- data/lib/mongo/retryable.rb +1 -1
- data/lib/mongo/server/connection.rb +6 -2
- data/lib/mongo/server/connection_base.rb +2 -1
- data/lib/mongo/server/monitor.rb +1 -1
- data/lib/mongo/server/pending_connection.rb +6 -0
- data/lib/mongo/socket/ssl.rb +1 -1
- data/lib/mongo/uri.rb +5 -41
- data/lib/mongo/version.rb +1 -1
- data/mongo.gemspec +11 -2
- data/spec/README.md +105 -9
- data/spec/USERS.md +72 -0
- data/spec/integration/auth_spec.rb +20 -6
- data/spec/integration/client_construction_spec.rb +3 -1
- data/spec/integration/client_options_spec.rb +437 -0
- data/spec/integration/command_monitoring_spec.rb +4 -1
- data/spec/integration/connection_pool_populator_spec.rb +4 -0
- data/spec/integration/connection_spec.rb +4 -2
- data/spec/integration/cursor_reaping_spec.rb +1 -1
- data/spec/integration/get_more_spec.rb +32 -0
- data/spec/integration/retryable_errors_spec.rb +99 -0
- data/spec/integration/retryable_writes_errors_spec.rb +11 -10
- data/spec/lite_spec_helper.rb +2 -1
- data/spec/mongo/auth/scram_spec.rb +1 -0
- data/spec/mongo/auth/user/view_spec.rb +102 -1
- data/spec/mongo/auth/user_spec.rb +56 -15
- data/spec/mongo/auth/x509_spec.rb +31 -1
- data/spec/mongo/bulk_write_spec.rb +2 -2
- data/spec/mongo/collection/view/change_stream_spec.rb +2 -2
- data/spec/mongo/collection/view/readable_spec.rb +8 -4
- data/spec/mongo/cursor/builder/get_more_command_spec.rb +4 -2
- data/spec/mongo/cursor/builder/op_get_more_spec.rb +4 -2
- data/spec/mongo/cursor_spec.rb +3 -3
- data/spec/mongo/retryable_spec.rb +31 -52
- data/spec/mongo/server/connection_auth_spec.rb +3 -0
- data/spec/mongo/server/connection_pool_spec.rb +4 -0
- data/spec/mongo/server/connection_spec.rb +12 -4
- data/spec/mongo/server/monitor_spec.rb +19 -1
- data/spec/mongo/socket/ssl_spec.rb +1 -1
- data/spec/mongo/uri/srv_protocol_spec.rb +0 -13
- data/spec/mongo/uri_option_parsing_spec.rb +0 -8
- data/spec/mongo/uri_spec.rb +6 -20
- data/spec/runners/connection_string.rb +116 -0
- data/spec/runners/read_write_concern_document.rb +67 -0
- data/spec/spec_tests/change_streams_spec.rb +17 -2
- data/spec/spec_tests/connection_string_spec.rb +2 -59
- data/spec/spec_tests/data/change_streams/change-streams-errors.yml +3 -3
- data/spec/spec_tests/data/change_streams/change-streams.yml +88 -20
- data/spec/spec_tests/data/cmap/connection-must-have-id.yml +6 -0
- data/spec/spec_tests/data/cmap/connection-must-order-ids.yml +6 -0
- data/spec/spec_tests/data/cmap/pool-checkin-destroy-closed.yml +3 -0
- data/spec/spec_tests/data/cmap/pool-checkin-destroy-stale.yml +3 -0
- data/spec/spec_tests/data/cmap/pool-checkin-make-available.yml +3 -0
- data/spec/spec_tests/data/cmap/pool-checkin.yml +1 -0
- data/spec/spec_tests/data/cmap/pool-checkout-connection.yml +2 -0
- data/spec/spec_tests/data/cmap/pool-checkout-error-closed.yml +5 -0
- data/spec/spec_tests/data/cmap/pool-checkout-multiple.yml +3 -0
- data/spec/spec_tests/data/cmap/pool-checkout-no-idle.yml +4 -0
- data/spec/spec_tests/data/cmap/pool-checkout-no-stale.yml +4 -0
- data/spec/spec_tests/data/cmap/pool-close-destroy-conns.yml +2 -0
- data/spec/spec_tests/data/cmap/pool-create-max-size.yml +15 -0
- data/spec/spec_tests/data/cmap/pool-create-min-size.yml +4 -0
- data/spec/spec_tests/data/cmap/wait-queue-fairness.yml +31 -1
- data/spec/spec_tests/data/cmap/wait-queue-timeout.yml +5 -0
- data/spec/spec_tests/data/read_write_concern/connection-string/read-concern.yml +32 -0
- data/spec/spec_tests/data/read_write_concern/connection-string/write-concern.yml +82 -0
- data/spec/spec_tests/data/read_write_concern/document/read-concern.yml +37 -0
- data/spec/spec_tests/data/read_write_concern/document/write-concern.yml +100 -0
- data/spec/spec_tests/data/retryable_reads/aggregate-merge.yml +39 -0
- data/spec/spec_tests/data/retryable_reads/aggregate-serverErrors.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch-serverErrors.yml +2 -2
- data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch-serverErrors.yml +2 -2
- data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch-serverErrors.yml +2 -2
- data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/count-serverErrors.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/countDocuments-serverErrors.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/distinct-serverErrors.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/find-serverErrors.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/findOne-serverErrors.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/gridfs-download-serverErrors.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/gridfs-downloadByName-serverErrors.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/listCollectionNames-serverErrors.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/listCollectionObjects-serverErrors.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/listCollections-serverErrors.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/listDatabaseNames-serverErrors.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/listDatabaseObjects-serverErrors.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/listDatabases-serverErrors.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/listIndexNames-serverErrors.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/listIndexes-serverErrors.yml +1 -1
- data/spec/spec_tests/data/transactions/read-concern.yml +6 -6
- data/spec/spec_tests/data/transactions/transaction-options-repl.yml +117 -0
- data/spec/spec_tests/data/transactions/transaction-options.yml +14 -121
- data/spec/spec_tests/data/transactions/write-concern.yml +3 -0
- data/spec/spec_tests/data/transactions_api/transaction-options.yml +11 -12
- data/spec/spec_tests/dns_seedlist_discovery_spec.rb +17 -7
- data/spec/spec_tests/read_write_concern_connection_string_spec.rb +8 -0
- data/spec/spec_tests/read_write_concern_document_spec.rb +74 -0
- data/spec/spec_tests/retryable_reads_spec.rb +32 -1
- data/spec/spec_tests/uri_options_spec.rb +4 -2
- data/spec/support/auth.rb +5 -14
- data/spec/support/certificates/client-x509.crt +78 -0
- data/spec/support/certificates/client-x509.key +27 -0
- data/spec/support/certificates/client-x509.pem +105 -0
- data/spec/support/change_streams.rb +8 -11
- data/spec/support/client_registry.rb +26 -12
- data/spec/support/cluster_tools.rb +2 -2
- data/spec/support/cmap.rb +11 -7
- data/spec/support/command_monitoring.rb +8 -8
- data/spec/support/connection_string.rb +56 -28
- data/spec/support/constraints.rb +8 -0
- data/spec/support/crud/spec.rb +5 -8
- data/spec/support/event_subscriber.rb +7 -0
- data/spec/support/gridfs.rb +4 -7
- data/spec/support/server_discovery_and_monitoring.rb +3 -8
- data/spec/support/server_selection.rb +4 -9
- data/spec/support/server_selection_rtt.rb +4 -7
- data/spec/support/spec_config.rb +47 -19
- data/spec/support/spec_setup.rb +5 -0
- data/spec/support/utils.rb +46 -8
- metadata +637 -597
- metadata.gz.sig +0 -0
@@ -66,10 +66,13 @@ describe 'Command monitoring' do
|
|
66
66
|
end
|
67
67
|
|
68
68
|
context 'client with no established connections' do
|
69
|
-
#
|
69
|
+
# For simplicity use 3.6+ servers only, then we can assert
|
70
70
|
# scram auth commands
|
71
71
|
min_server_fcv '3.6'
|
72
72
|
|
73
|
+
# X.509 auth uses authenticate instead of sasl* commands
|
74
|
+
require_no_x509_auth
|
75
|
+
|
73
76
|
it 'does not nest auth and find' do
|
74
77
|
expect(subscriber.started_events.length).to eq 0
|
75
78
|
client['test-collection'].find(a: 1).first
|
@@ -21,6 +21,10 @@ describe 'Connection pool populator integration' do
|
|
21
21
|
|
22
22
|
declare_topology_double
|
23
23
|
|
24
|
+
let(:app_metadata) do
|
25
|
+
Mongo::Server::AppMetadata.new(options)
|
26
|
+
end
|
27
|
+
|
24
28
|
let(:cluster) do
|
25
29
|
double('cluster').tap do |cl|
|
26
30
|
allow(cl).to receive(:topology).and_return(topology)
|
@@ -158,8 +158,10 @@ describe 'Connections' do
|
|
158
158
|
RSpec::Mocks.with_temporary_scope do
|
159
159
|
# now pretend an ismaster returned a different range
|
160
160
|
features = Mongo::Server::Description::Features.new(0..3)
|
161
|
-
#
|
162
|
-
|
161
|
+
# One Features instantiation is for SDAM event publication, this
|
162
|
+
# one always happens. The second one happens on servers
|
163
|
+
# where we do not negotiate auth mechanism.
|
164
|
+
expect(Mongo::Server::Description::Features).to receive(:new).at_least(:once).and_return(features)
|
163
165
|
|
164
166
|
connection = Mongo::Server::Connection.new(server, server.options)
|
165
167
|
expect(connection.connect!).to be true
|
@@ -59,7 +59,7 @@ describe 'Cursor reaping' do
|
|
59
59
|
client.cluster.instance_variable_get('@periodic_executor').execute
|
60
60
|
|
61
61
|
started_event = EventSubscriber.started_events.detect do |event|
|
62
|
-
event.command['killCursors'] && event.command['cursors'].include?(cursor_id)
|
62
|
+
event.command['killCursors'] && event.command['cursors'].map(&:value).include?(cursor_id)
|
63
63
|
end
|
64
64
|
|
65
65
|
expect(started_event).not_to be_nil
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'getMore operation' do
|
4
|
+
# https://jira.mongodb.org/browse/RUBY-1987
|
5
|
+
min_server_fcv '3.2'
|
6
|
+
|
7
|
+
let(:collection) do
|
8
|
+
subscribed_client['get_more_spec']
|
9
|
+
end
|
10
|
+
|
11
|
+
let(:scope) do
|
12
|
+
collection.find.batch_size(1).each
|
13
|
+
end
|
14
|
+
|
15
|
+
before do
|
16
|
+
collection.delete_many
|
17
|
+
collection.insert_one(a: 1)
|
18
|
+
#collection.insert_one(a: 2)
|
19
|
+
EventSubscriber.clear_events!
|
20
|
+
end
|
21
|
+
|
22
|
+
let(:get_more_command) do
|
23
|
+
event = EventSubscriber.single_command_started_event('getMore')
|
24
|
+
event.command['getMore']
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'sends cursor id as int64' do
|
28
|
+
scope.to_a
|
29
|
+
|
30
|
+
expect(get_more_command).to be_a(BSON::Int64)
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Retryable writes tests' do
|
4
|
+
# Requirement for fail point
|
5
|
+
min_server_fcv '4.0'
|
6
|
+
|
7
|
+
let(:client) do
|
8
|
+
subscribed_client
|
9
|
+
end
|
10
|
+
|
11
|
+
let(:collection) do
|
12
|
+
client['retryable-writes-error-spec']
|
13
|
+
end
|
14
|
+
|
15
|
+
context 'when retry fails' do
|
16
|
+
require_topology :replica_set
|
17
|
+
|
18
|
+
let(:fail_point_command) do
|
19
|
+
{
|
20
|
+
configureFailPoint: 'failCommand',
|
21
|
+
mode: {times: 1},
|
22
|
+
data: {
|
23
|
+
failCommands: ['find'],
|
24
|
+
errorCode: 11600,
|
25
|
+
},
|
26
|
+
}
|
27
|
+
end
|
28
|
+
|
29
|
+
let(:clear_fail_point_command) do
|
30
|
+
{
|
31
|
+
configureFailPoint: 'failCommand',
|
32
|
+
mode: 'off',
|
33
|
+
}
|
34
|
+
end
|
35
|
+
|
36
|
+
after do
|
37
|
+
ClusterTools.instance.direct_client_for_each_server do |client|
|
38
|
+
client.use(:admin).database.command(clear_fail_point_command)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
let(:collection) do
|
43
|
+
client['retryable-writes-error-spec', read: {mode: :secondary_preferred}]
|
44
|
+
end
|
45
|
+
|
46
|
+
let(:events) do
|
47
|
+
events = EventSubscriber.command_started_events('find')
|
48
|
+
end
|
49
|
+
|
50
|
+
let(:first_server) do
|
51
|
+
client.cluster.servers_list.detect do |server|
|
52
|
+
server.address.seed == events.first.address.seed
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
let(:second_server) do
|
57
|
+
client.cluster.servers_list.detect do |server|
|
58
|
+
server.address.seed == events.last.address.seed
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
let(:perform_read) do
|
63
|
+
client.cluster.servers_list.each do |server|
|
64
|
+
server.monitor.stop!
|
65
|
+
end
|
66
|
+
|
67
|
+
ClusterTools.instance.direct_client_for_each_server do |client|
|
68
|
+
client.use(:admin).database.command(fail_point_command)
|
69
|
+
end
|
70
|
+
|
71
|
+
begin
|
72
|
+
collection.find(a: 1).to_a
|
73
|
+
rescue Mongo::Error::OperationFailure => @exception
|
74
|
+
else
|
75
|
+
fail('Expected operation to fail')
|
76
|
+
end
|
77
|
+
|
78
|
+
puts @exception.message
|
79
|
+
|
80
|
+
expect(events.length).to eq(2)
|
81
|
+
expect(events.first.address.seed).not_to eq(events.last.address.seed)
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'is reported on the server of the second attempt' do
|
85
|
+
perform_read
|
86
|
+
|
87
|
+
expect(@exception.message).not_to include(first_server.address.seed)
|
88
|
+
expect(@exception.message).to include(second_server.address.seed)
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'marks servers used in both attempts unknown' do
|
92
|
+
perform_read
|
93
|
+
|
94
|
+
expect(first_server).to be_unknown
|
95
|
+
|
96
|
+
expect(second_server).to be_unknown
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -1,7 +1,16 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe 'Retryable writes errors tests' do
|
4
|
-
|
4
|
+
|
5
|
+
let(:client) do
|
6
|
+
authorized_client.with(retry_writes: true)
|
7
|
+
end
|
8
|
+
|
9
|
+
let(:collection) do
|
10
|
+
client['retryable-writes-error-spec']
|
11
|
+
end
|
12
|
+
|
13
|
+
context 'when the storage engine does not support retryable writes but the server does' do
|
5
14
|
require_mmapv1
|
6
15
|
min_server_fcv '3.6'
|
7
16
|
require_topology :replica_set, :sharded
|
@@ -10,14 +19,6 @@ describe 'Retryable writes errors tests' do
|
|
10
19
|
collection.delete_many
|
11
20
|
end
|
12
21
|
|
13
|
-
let(:collection) do
|
14
|
-
client[authorized_collection.name]
|
15
|
-
end
|
16
|
-
|
17
|
-
let(:client) do
|
18
|
-
authorized_client.with(retry_writes: true)
|
19
|
-
end
|
20
|
-
|
21
22
|
context 'when a retryable write is attempted' do
|
22
23
|
it 'raises an actionable error message' do
|
23
24
|
expect {
|
@@ -27,4 +28,4 @@ describe 'Retryable writes errors tests' do
|
|
27
28
|
end
|
28
29
|
end
|
29
30
|
end
|
30
|
-
end
|
31
|
+
end
|
data/spec/lite_spec_helper.rb
CHANGED
@@ -47,6 +47,7 @@ else
|
|
47
47
|
PossiblyConcurrentArray = Array
|
48
48
|
end
|
49
49
|
|
50
|
+
require 'support/utils'
|
50
51
|
require 'support/spec_config'
|
51
52
|
|
52
53
|
Mongo::Logger.logger = Logger.new($stdout)
|
@@ -68,6 +69,7 @@ require 'support/sdam_monitoring'
|
|
68
69
|
require 'support/crud'
|
69
70
|
require 'support/command_monitoring'
|
70
71
|
require 'support/cmap'
|
72
|
+
require 'runners/connection_string'
|
71
73
|
require 'support/connection_string'
|
72
74
|
require 'support/gridfs'
|
73
75
|
require 'support/transactions'
|
@@ -77,7 +79,6 @@ require 'support/client_registry'
|
|
77
79
|
require 'support/client_registry_macros'
|
78
80
|
require 'support/json_ext_formatter'
|
79
81
|
require 'support/sdam_formatter_integration'
|
80
|
-
require 'support/utils'
|
81
82
|
require 'support/background_thread_registry'
|
82
83
|
require 'support/auth'
|
83
84
|
|
@@ -7,7 +7,46 @@ describe Mongo::Auth::User::View do
|
|
7
7
|
end
|
8
8
|
|
9
9
|
before do
|
10
|
-
|
10
|
+
# Separate view instance to not interfere with test assertions
|
11
|
+
view = described_class.new(root_authorized_client.database)
|
12
|
+
begin
|
13
|
+
view.remove('durran')
|
14
|
+
rescue Mongo::Error::OperationFailure
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
shared_context 'testing write concern' do
|
19
|
+
|
20
|
+
let(:subscriber) do
|
21
|
+
EventSubscriber.new
|
22
|
+
end
|
23
|
+
|
24
|
+
let(:client) do
|
25
|
+
root_authorized_client.tap do |client|
|
26
|
+
client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
let(:view) do
|
31
|
+
described_class.new(client.database)
|
32
|
+
end
|
33
|
+
|
34
|
+
before do
|
35
|
+
allow_any_instance_of(Mongo::Monitoring::Event::CommandStarted).to receive(:redacted) do |instance, command_name, document|
|
36
|
+
document
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
shared_examples_for 'forwards write concern to server' do
|
42
|
+
# w:2 requires more than one node in the deployment
|
43
|
+
require_topology :replica_set
|
44
|
+
|
45
|
+
it 'forwards write concern to server' do
|
46
|
+
response
|
47
|
+
|
48
|
+
expect(event.command['writeConcern']).to eq('w' => 2)
|
49
|
+
end
|
11
50
|
end
|
12
51
|
|
13
52
|
describe '#create' do
|
@@ -73,6 +112,25 @@ describe Mongo::Auth::User::View do
|
|
73
112
|
|
74
113
|
it_behaves_like 'an operation using a session'
|
75
114
|
end
|
115
|
+
|
116
|
+
context 'when write concern is given' do
|
117
|
+
include_context 'testing write concern'
|
118
|
+
|
119
|
+
let(:response) do
|
120
|
+
view.create(
|
121
|
+
'durran',
|
122
|
+
password: 'password',
|
123
|
+
roles: [Mongo::Auth::Roles::READ_WRITE],
|
124
|
+
write_concern: {w: 2},
|
125
|
+
)
|
126
|
+
end
|
127
|
+
|
128
|
+
let(:event) do
|
129
|
+
subscriber.single_command_started_event('createUser')
|
130
|
+
end
|
131
|
+
|
132
|
+
it_behaves_like 'forwards write concern to server'
|
133
|
+
end
|
76
134
|
end
|
77
135
|
|
78
136
|
describe '#update' do
|
@@ -183,6 +241,25 @@ describe Mongo::Auth::User::View do
|
|
183
241
|
it_behaves_like 'an operation using a session'
|
184
242
|
end
|
185
243
|
end
|
244
|
+
|
245
|
+
context 'when write concern is given' do
|
246
|
+
include_context 'testing write concern'
|
247
|
+
|
248
|
+
let(:response) do
|
249
|
+
view.update(
|
250
|
+
'durran',
|
251
|
+
password: 'password1',
|
252
|
+
roles: [Mongo::Auth::Roles::READ_WRITE],
|
253
|
+
write_concern: {w: 2},
|
254
|
+
)
|
255
|
+
end
|
256
|
+
|
257
|
+
let(:event) do
|
258
|
+
subscriber.single_command_started_event('updateUser')
|
259
|
+
end
|
260
|
+
|
261
|
+
it_behaves_like 'forwards write concern to server'
|
262
|
+
end
|
186
263
|
end
|
187
264
|
|
188
265
|
describe '#remove' do
|
@@ -260,6 +337,30 @@ describe Mongo::Auth::User::View do
|
|
260
337
|
it_behaves_like 'a failed operation using a session'
|
261
338
|
end
|
262
339
|
end
|
340
|
+
|
341
|
+
context 'when write concern is given' do
|
342
|
+
include_context 'testing write concern'
|
343
|
+
|
344
|
+
before do
|
345
|
+
view.create(
|
346
|
+
'durran',
|
347
|
+
password: 'password', roles: [ Mongo::Auth::Roles::READ_WRITE ]
|
348
|
+
)
|
349
|
+
end
|
350
|
+
|
351
|
+
let(:response) do
|
352
|
+
view.remove(
|
353
|
+
'durran',
|
354
|
+
write_concern: {w: 2},
|
355
|
+
)
|
356
|
+
end
|
357
|
+
|
358
|
+
let(:event) do
|
359
|
+
subscriber.single_command_started_event('dropUser')
|
360
|
+
end
|
361
|
+
|
362
|
+
it_behaves_like 'forwards write concern to server'
|
363
|
+
end
|
263
364
|
end
|
264
365
|
|
265
366
|
describe '#info' do
|
@@ -10,6 +10,24 @@ describe Mongo::Auth::User do
|
|
10
10
|
described_class.new(options)
|
11
11
|
end
|
12
12
|
|
13
|
+
shared_examples_for 'sets database and auth source to admin' do
|
14
|
+
|
15
|
+
it 'sets database to admin' do
|
16
|
+
expect(user.database).to eq('admin')
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'sets auth source to admin' do
|
20
|
+
expect(user.auth_source).to eq('admin')
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
shared_examples_for 'sets auth source to $external' do
|
25
|
+
|
26
|
+
it 'sets auth source to $external' do
|
27
|
+
expect(user.auth_source).to eq('$external')
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
13
31
|
describe '#initialize' do
|
14
32
|
let(:user) { Mongo::Auth::User.new(options) }
|
15
33
|
|
@@ -19,6 +37,8 @@ describe Mongo::Auth::User do
|
|
19
37
|
it 'succeeds' do
|
20
38
|
expect(user).to be_a(Mongo::Auth::User)
|
21
39
|
end
|
40
|
+
|
41
|
+
it_behaves_like 'sets database and auth source to admin'
|
22
42
|
end
|
23
43
|
|
24
44
|
context 'invalid mechanism' do
|
@@ -45,6 +65,8 @@ describe Mongo::Auth::User do
|
|
45
65
|
it 'converts mechanism to symbol' do
|
46
66
|
expect(user.mechanism).to eq(:scram)
|
47
67
|
end
|
68
|
+
|
69
|
+
it_behaves_like 'sets database and auth source to admin'
|
48
70
|
end
|
49
71
|
|
50
72
|
context 'linting' do
|
@@ -69,6 +91,40 @@ describe Mongo::Auth::User do
|
|
69
91
|
it 'stores mechanism' do
|
70
92
|
expect(user.mechanism).to eq(:scram)
|
71
93
|
end
|
94
|
+
|
95
|
+
it_behaves_like 'sets database and auth source to admin'
|
96
|
+
end
|
97
|
+
|
98
|
+
context 'mechanism is x509' do
|
99
|
+
let(:options) { {auth_mech: :mongodb_x509} }
|
100
|
+
|
101
|
+
it 'sets database to admin' do
|
102
|
+
expect(user.database).to eq('admin')
|
103
|
+
end
|
104
|
+
|
105
|
+
it_behaves_like 'sets auth source to $external'
|
106
|
+
|
107
|
+
context 'database is explicitly given' do
|
108
|
+
let(:options) { {auth_mech: :mongodb_x509, database: 'foo'} }
|
109
|
+
|
110
|
+
it 'sets database to the specified one' do
|
111
|
+
expect(user.database).to eq('foo')
|
112
|
+
end
|
113
|
+
|
114
|
+
it_behaves_like 'sets auth source to $external'
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
it 'sets the database' do
|
119
|
+
expect(user.database).to eq('testing')
|
120
|
+
end
|
121
|
+
|
122
|
+
it 'sets the name' do
|
123
|
+
expect(user.name).to eq('user')
|
124
|
+
end
|
125
|
+
|
126
|
+
it 'sets the password' do
|
127
|
+
expect(user.password).to eq('pass')
|
72
128
|
end
|
73
129
|
end
|
74
130
|
|
@@ -131,21 +187,6 @@ describe Mongo::Auth::User do
|
|
131
187
|
end
|
132
188
|
end
|
133
189
|
|
134
|
-
describe '#initialize' do
|
135
|
-
|
136
|
-
it 'sets the database' do
|
137
|
-
expect(user.database).to eq('testing')
|
138
|
-
end
|
139
|
-
|
140
|
-
it 'sets the name' do
|
141
|
-
expect(user.name).to eq('user')
|
142
|
-
end
|
143
|
-
|
144
|
-
it 'sets the password' do
|
145
|
-
expect(user.password).to eq('pass')
|
146
|
-
end
|
147
|
-
end
|
148
|
-
|
149
190
|
describe '#hashed_password' do
|
150
191
|
|
151
192
|
let(:expected) do
|