mongo 2.7.2 → 2.8.0.rc0
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 -3
- data/lib/mongo/address.rb +17 -20
- data/lib/mongo/address/ipv4.rb +6 -3
- data/lib/mongo/address/ipv6.rb +6 -3
- data/lib/mongo/address/unix.rb +5 -2
- data/lib/mongo/auth.rb +15 -2
- data/lib/mongo/auth/cr/conversation.rb +4 -2
- data/lib/mongo/auth/ldap/conversation.rb +4 -2
- data/lib/mongo/auth/scram.rb +3 -7
- data/lib/mongo/auth/scram/conversation.rb +28 -19
- data/lib/mongo/auth/user.rb +45 -10
- data/lib/mongo/auth/x509/conversation.rb +4 -2
- data/lib/mongo/cluster.rb +9 -17
- data/lib/mongo/error.rb +2 -0
- data/lib/mongo/error/missing_password.rb +29 -0
- data/lib/mongo/error/operation_failure.rb +7 -3
- data/lib/mongo/error/parser.rb +2 -1
- data/lib/mongo/error/sdam_error_detection.rb +54 -0
- data/lib/mongo/operation/aggregate/command.rb +1 -16
- data/lib/mongo/operation/aggregate/op_msg.rb +1 -1
- data/lib/mongo/operation/collections_info.rb +2 -3
- data/lib/mongo/operation/delete/command.rb +2 -15
- data/lib/mongo/operation/delete/legacy.rb +1 -16
- data/lib/mongo/operation/explain/command.rb +1 -16
- data/lib/mongo/operation/explain/legacy.rb +1 -16
- data/lib/mongo/operation/find/command.rb +1 -16
- data/lib/mongo/operation/find/legacy.rb +1 -16
- data/lib/mongo/operation/get_more/command.rb +1 -16
- data/lib/mongo/operation/indexes/command.rb +1 -16
- data/lib/mongo/operation/indexes/legacy.rb +4 -16
- data/lib/mongo/operation/list_collections/command.rb +1 -16
- data/lib/mongo/operation/map_reduce/command.rb +1 -16
- data/lib/mongo/operation/parallel_scan/command.rb +1 -16
- data/lib/mongo/operation/result.rb +3 -0
- data/lib/mongo/operation/shared/executable.rb +4 -0
- data/lib/mongo/operation/shared/polymorphic_lookup.rb +1 -1
- data/lib/mongo/operation/shared/polymorphic_result.rb +8 -1
- data/lib/mongo/operation/shared/result/aggregatable.rb +0 -5
- data/lib/mongo/operation/update/command.rb +2 -15
- data/lib/mongo/operation/update/legacy.rb +1 -16
- data/lib/mongo/operation/users_info/command.rb +1 -16
- data/lib/mongo/retryable.rb +22 -10
- data/lib/mongo/server.rb +10 -1
- data/lib/mongo/server/app_metadata.rb +7 -2
- data/lib/mongo/server/connectable.rb +0 -6
- data/lib/mongo/server/connection.rb +86 -135
- data/lib/mongo/server/connection_base.rb +133 -0
- data/lib/mongo/server/connection_pool.rb +11 -24
- data/lib/mongo/server/connection_pool/queue.rb +41 -41
- data/lib/mongo/server/description.rb +1 -1
- data/lib/mongo/server/monitor.rb +4 -4
- data/lib/mongo/server/monitor/connection.rb +26 -7
- data/lib/mongo/server/pending_connection.rb +36 -0
- data/lib/mongo/server_selector/selectable.rb +9 -1
- data/lib/mongo/session.rb +0 -1
- data/lib/mongo/socket.rb +23 -6
- data/lib/mongo/socket/ssl.rb +11 -18
- data/lib/mongo/socket/tcp.rb +13 -14
- data/lib/mongo/socket/unix.rb +9 -27
- data/lib/mongo/uri.rb +1 -1
- data/lib/mongo/version.rb +1 -1
- data/spec/integration/auth_spec.rb +160 -0
- data/spec/integration/retryable_writes_spec.rb +55 -58
- data/spec/integration/sdam_error_handling_spec.rb +115 -0
- data/spec/mongo/address/ipv4_spec.rb +4 -0
- data/spec/mongo/address/ipv6_spec.rb +4 -0
- data/spec/mongo/auth/scram/conversation_spec.rb +6 -5
- data/spec/mongo/auth/scram/negotiation_spec.rb +25 -36
- data/spec/mongo/auth/scram_spec.rb +2 -2
- data/spec/mongo/auth/user_spec.rb +97 -0
- data/spec/mongo/client_construction_spec.rb +1 -1
- data/spec/mongo/error/operation_failure_spec.rb +125 -1
- data/spec/mongo/retryable_spec.rb +17 -8
- data/spec/mongo/server/connection_pool/queue_spec.rb +24 -10
- data/spec/mongo/server/connection_pool_spec.rb +30 -117
- data/spec/mongo/server/connection_spec.rb +147 -25
- data/spec/mongo/server/description_spec.rb +0 -14
- data/spec/mongo/server/monitor/connection_spec.rb +22 -0
- data/spec/mongo/server_selector_spec.rb +1 -0
- data/spec/mongo/server_spec.rb +6 -6
- data/spec/mongo/socket/ssl_spec.rb +48 -116
- data/spec/mongo/socket/tcp_spec.rb +22 -0
- data/spec/mongo/socket/unix_spec.rb +9 -9
- data/spec/mongo/socket_spec.rb +15 -3
- data/spec/spec_tests/server_selection_spec.rb +2 -0
- data/spec/support/client_registry.rb +8 -2
- data/spec/support/common_shortcuts.rb +20 -1
- data/spec/support/constraints.rb +10 -2
- data/spec/support/lite_constraints.rb +8 -0
- data/spec/support/spec_config.rb +9 -1
- metadata +14 -4
- metadata.gz.sig +0 -0
@@ -0,0 +1,115 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'SDAM error handling' do
|
4
|
+
before(:all) do
|
5
|
+
ClientRegistry.instance.close_all_clients
|
6
|
+
end
|
7
|
+
|
8
|
+
describe 'when there is an error during an operation' do
|
9
|
+
let(:client) { authorized_client }
|
10
|
+
|
11
|
+
before do
|
12
|
+
wait_for_all_servers(client.cluster)
|
13
|
+
# we also need a connection to the primary so that our error
|
14
|
+
# expectations do not get triggered during handshakes which
|
15
|
+
# have different behavior from non-handshake errors
|
16
|
+
client.database.command(ping: 1)
|
17
|
+
client.cluster.servers_list.each do |server|
|
18
|
+
server.monitor.stop!(true)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
let(:server) { client.cluster.next_primary }
|
23
|
+
|
24
|
+
let(:operation) do
|
25
|
+
expect_any_instance_of(Mongo::Server::Connection).to receive(:deliver).and_return(reply)
|
26
|
+
expect do
|
27
|
+
client.database.command(ping: 1)
|
28
|
+
end.to raise_error(Mongo::Error::OperationFailure, exception_message)
|
29
|
+
end
|
30
|
+
|
31
|
+
shared_examples_for 'marks server unknown' do
|
32
|
+
it 'marks server unknown' do
|
33
|
+
expect(server).not_to be_unknown
|
34
|
+
operation
|
35
|
+
expect(server).to be_unknown
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
shared_examples_for 'does not mark server unknown' do
|
40
|
+
it 'does not mark server unknown' do
|
41
|
+
expect(server).not_to be_unknown
|
42
|
+
operation
|
43
|
+
expect(server).not_to be_unknown
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
shared_examples_for 'requests server scan' do
|
48
|
+
it 'requests server scan' do
|
49
|
+
expect(server.monitor.scan_semaphore).to receive(:signal)
|
50
|
+
operation
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
shared_examples_for 'does not request server scan' do
|
55
|
+
it 'does not request server scan' do
|
56
|
+
expect(server.monitor.scan_semaphore).not_to receive(:signal)
|
57
|
+
operation
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context 'not master error' do
|
62
|
+
let(:exception_message) do
|
63
|
+
/not master/
|
64
|
+
end
|
65
|
+
|
66
|
+
let(:reply) do
|
67
|
+
make_not_master_reply
|
68
|
+
end
|
69
|
+
|
70
|
+
it_behaves_like 'marks server unknown'
|
71
|
+
it_behaves_like 'requests server scan'
|
72
|
+
end
|
73
|
+
|
74
|
+
context 'node is recovering error' do
|
75
|
+
let(:exception_message) do
|
76
|
+
/shutdown in progress/
|
77
|
+
end
|
78
|
+
|
79
|
+
let(:reply) do
|
80
|
+
make_node_recovering_reply
|
81
|
+
end
|
82
|
+
|
83
|
+
it_behaves_like 'marks server unknown'
|
84
|
+
it_behaves_like 'requests server scan'
|
85
|
+
end
|
86
|
+
|
87
|
+
context 'network error' do
|
88
|
+
|
89
|
+
let(:operation) do
|
90
|
+
expect_any_instance_of(Mongo::Socket).to receive(:read).and_raise(exception)
|
91
|
+
expect do
|
92
|
+
client.database.command(ping: 1)
|
93
|
+
end.to raise_error(exception)
|
94
|
+
end
|
95
|
+
|
96
|
+
context 'non-timeout network error' do
|
97
|
+
let(:exception) do
|
98
|
+
Mongo::Error::SocketError
|
99
|
+
end
|
100
|
+
|
101
|
+
it_behaves_like 'marks server unknown'
|
102
|
+
it_behaves_like 'does not request server scan'
|
103
|
+
end
|
104
|
+
|
105
|
+
context 'network timeout error' do
|
106
|
+
let(:exception) do
|
107
|
+
Mongo::Error::SocketTimeoutError
|
108
|
+
end
|
109
|
+
|
110
|
+
it_behaves_like 'does not mark server unknown'
|
111
|
+
it_behaves_like 'does not request server scan'
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
@@ -69,10 +69,12 @@ describe Mongo::Address::IPv4 do
|
|
69
69
|
end
|
70
70
|
|
71
71
|
it 'returns an ssl socket' do
|
72
|
+
allow_any_instance_of(Mongo::Socket::SSL).to receive(:connect!)
|
72
73
|
expect(socket).to be_a(Mongo::Socket::SSL)
|
73
74
|
end
|
74
75
|
|
75
76
|
it 'sets the family as ipv4' do
|
77
|
+
allow_any_instance_of(Mongo::Socket::SSL).to receive(:connect!)
|
76
78
|
expect(socket.family).to eq(Socket::PF_INET)
|
77
79
|
end
|
78
80
|
end
|
@@ -84,10 +86,12 @@ describe Mongo::Address::IPv4 do
|
|
84
86
|
end
|
85
87
|
|
86
88
|
it 'returns a tcp socket' do
|
89
|
+
allow_any_instance_of(Mongo::Socket::TCP).to receive(:connect!)
|
87
90
|
expect(socket).to be_a(Mongo::Socket::TCP)
|
88
91
|
end
|
89
92
|
|
90
93
|
it 'sets the family a ipv4' do
|
94
|
+
allow_any_instance_of(Mongo::Socket::TCP).to receive(:connect!)
|
91
95
|
expect(socket.family).to eq(Socket::PF_INET)
|
92
96
|
end
|
93
97
|
end
|
@@ -97,10 +97,12 @@ describe Mongo::Address::IPv6 do
|
|
97
97
|
end
|
98
98
|
|
99
99
|
it 'returns an ssl socket' do
|
100
|
+
allow_any_instance_of(Mongo::Socket::SSL).to receive(:connect!)
|
100
101
|
expect(socket).to be_a(Mongo::Socket::SSL)
|
101
102
|
end
|
102
103
|
|
103
104
|
it 'sets the family as ipv6' do
|
105
|
+
allow_any_instance_of(Mongo::Socket::SSL).to receive(:connect!)
|
104
106
|
expect(socket.family).to eq(Socket::PF_INET6)
|
105
107
|
end
|
106
108
|
end
|
@@ -112,10 +114,12 @@ describe Mongo::Address::IPv6 do
|
|
112
114
|
end
|
113
115
|
|
114
116
|
it 'returns a tcp socket' do
|
117
|
+
allow_any_instance_of(Mongo::Socket::TCP).to receive(:connect!)
|
115
118
|
expect(socket).to be_a(Mongo::Socket::TCP)
|
116
119
|
end
|
117
120
|
|
118
121
|
it 'sets the family a ipv6' do
|
122
|
+
allow_any_instance_of(Mongo::Socket::TCP).to receive(:connect!)
|
119
123
|
expect(socket.family).to eq(Socket::PF_INET6)
|
120
124
|
end
|
121
125
|
end
|
@@ -15,13 +15,14 @@ describe Mongo::Auth::SCRAM::Conversation, retry: 3 do
|
|
15
15
|
database: Mongo::Database::ADMIN,
|
16
16
|
user: 'user',
|
17
17
|
password: 'pencil',
|
18
|
-
# We specify SCRAM-SHA-1 so that we don't accidentally use
|
19
|
-
|
18
|
+
# We specify SCRAM-SHA-1 so that we don't accidentally use
|
19
|
+
# SCRAM-SHA-256 on newer server versions.
|
20
|
+
auth_mech: :scram,
|
20
21
|
)
|
21
22
|
end
|
22
23
|
|
23
24
|
let(:mechanism) do
|
24
|
-
|
25
|
+
:scram
|
25
26
|
end
|
26
27
|
|
27
28
|
describe '#start' do
|
@@ -216,12 +217,12 @@ describe Mongo::Auth::SCRAM::Conversation, retry: 3 do
|
|
216
217
|
database: Mongo::Database::ADMIN,
|
217
218
|
user: 'user',
|
218
219
|
password: 'pencil',
|
219
|
-
auth_mech:
|
220
|
+
auth_mech: :scram256,
|
220
221
|
)
|
221
222
|
end
|
222
223
|
|
223
224
|
let(:mechanism) do
|
224
|
-
|
225
|
+
:scram256
|
225
226
|
end
|
226
227
|
|
227
228
|
describe '#start' do
|
@@ -22,7 +22,7 @@ describe 'SCRAM-SHA auth mechanism negotiation' do
|
|
22
22
|
createUser: user.name,
|
23
23
|
pwd: password,
|
24
24
|
roles: ['root'],
|
25
|
-
mechanisms:
|
25
|
+
mechanisms: server_user_auth_mechanisms,
|
26
26
|
)
|
27
27
|
client.close
|
28
28
|
end
|
@@ -57,7 +57,7 @@ describe 'SCRAM-SHA auth mechanism negotiation' do
|
|
57
57
|
|
58
58
|
context 'when the user only can use SCRAM-SHA-1 to authenticate' do
|
59
59
|
|
60
|
-
let(:
|
60
|
+
let(:server_user_auth_mechanisms) do
|
61
61
|
['SCRAM-SHA-1']
|
62
62
|
end
|
63
63
|
|
@@ -111,7 +111,7 @@ describe 'SCRAM-SHA auth mechanism negotiation' do
|
|
111
111
|
|
112
112
|
context 'when the user only can use SCRAM-SHA-256 to authenticate' do
|
113
113
|
|
114
|
-
let(:
|
114
|
+
let(:server_user_auth_mechanisms) do
|
115
115
|
['SCRAM-SHA-256']
|
116
116
|
end
|
117
117
|
|
@@ -165,7 +165,7 @@ describe 'SCRAM-SHA auth mechanism negotiation' do
|
|
165
165
|
|
166
166
|
context 'when the user only can use either SCRAM-SHA-1 or SCRAM-SHA-256 to authenticate' do
|
167
167
|
|
168
|
-
let(:
|
168
|
+
let(:server_user_auth_mechanisms) do
|
169
169
|
['SCRAM-SHA-1', 'SCRAM-SHA-256']
|
170
170
|
end
|
171
171
|
|
@@ -200,13 +200,11 @@ describe 'SCRAM-SHA auth mechanism negotiation' do
|
|
200
200
|
create_user!
|
201
201
|
|
202
202
|
mechanism = nil
|
203
|
-
|
204
|
-
# hence may be invoked more than once here
|
205
|
-
expect(Mongo::Auth).to receive(:get).at_least(:once).and_wrap_original do |m, *args|
|
203
|
+
expect(Mongo::Auth).to receive(:get).and_wrap_original do |m, user|
|
206
204
|
# copy mechanism here rather than whole user
|
207
205
|
# in case something mutates mechanism later
|
208
|
-
mechanism =
|
209
|
-
m.call(
|
206
|
+
mechanism = user.mechanism
|
207
|
+
m.call(user)
|
210
208
|
end
|
211
209
|
|
212
210
|
expect { result }.not_to raise_error
|
@@ -224,15 +222,11 @@ describe 'SCRAM-SHA auth mechanism negotiation' do
|
|
224
222
|
create_user!
|
225
223
|
|
226
224
|
mechanism = nil
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
# in case something mutates mechanism later
|
233
|
-
mechanism = args.first.mechanism
|
234
|
-
m.call(*args)
|
235
|
-
end
|
225
|
+
expect(Mongo::Auth).to receive(:get).and_wrap_original do |m, user|
|
226
|
+
# copy mechanism here rather than whole user
|
227
|
+
# in case something mutates mechanism later
|
228
|
+
mechanism = user.mechanism
|
229
|
+
m.call(user)
|
236
230
|
end
|
237
231
|
|
238
232
|
expect { result }.not_to raise_error
|
@@ -266,7 +260,7 @@ describe 'SCRAM-SHA auth mechanism negotiation' do
|
|
266
260
|
nil
|
267
261
|
end
|
268
262
|
|
269
|
-
let(:
|
263
|
+
let(:server_user_auth_mechanisms) do
|
270
264
|
['SCRAM-SHA-256']
|
271
265
|
end
|
272
266
|
|
@@ -345,7 +339,7 @@ describe 'SCRAM-SHA auth mechanism negotiation' do
|
|
345
339
|
|
346
340
|
context 'when the user only can use SCRAM-SHA-1 to authenticate' do
|
347
341
|
|
348
|
-
let(:
|
342
|
+
let(:server_user_auth_mechanisms) do
|
349
343
|
['SCRAM-SHA-1']
|
350
344
|
end
|
351
345
|
|
@@ -398,7 +392,7 @@ describe 'SCRAM-SHA auth mechanism negotiation' do
|
|
398
392
|
|
399
393
|
context 'when the user only can use SCRAM-SHA-256 to authenticate' do
|
400
394
|
|
401
|
-
let(:
|
395
|
+
let(:server_user_auth_mechanisms) do
|
402
396
|
['SCRAM-SHA-256']
|
403
397
|
end
|
404
398
|
|
@@ -452,7 +446,7 @@ describe 'SCRAM-SHA auth mechanism negotiation' do
|
|
452
446
|
|
453
447
|
context 'when the user only can use either SCRAM-SHA-1 or SCRAM-SHA-256 to authenticate' do
|
454
448
|
|
455
|
-
let(:
|
449
|
+
let(:server_user_auth_mechanisms) do
|
456
450
|
['SCRAM-SHA-1', 'SCRAM-SHA-256']
|
457
451
|
end
|
458
452
|
|
@@ -485,15 +479,14 @@ describe 'SCRAM-SHA auth mechanism negotiation' do
|
|
485
479
|
|
486
480
|
it 'authenticates successfully' do
|
487
481
|
create_user!
|
482
|
+
expect(user.mechanism).to eq(:scram)
|
488
483
|
|
489
484
|
mechanism = nil
|
490
|
-
|
491
|
-
# hence may be invoked more than once here
|
492
|
-
expect(Mongo::Auth).to receive(:get).at_least(:once).and_wrap_original do |m, *args|
|
485
|
+
expect(Mongo::Auth).to receive(:get).and_wrap_original do |m, user|
|
493
486
|
# copy mechanism here rather than whole user
|
494
487
|
# in case something mutates mechanism later
|
495
|
-
mechanism =
|
496
|
-
m.call(
|
488
|
+
mechanism = user.mechanism
|
489
|
+
m.call(user)
|
497
490
|
end
|
498
491
|
|
499
492
|
expect { result }.not_to raise_error
|
@@ -511,15 +504,11 @@ describe 'SCRAM-SHA auth mechanism negotiation' do
|
|
511
504
|
create_user!
|
512
505
|
|
513
506
|
mechanism = nil
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
# in case something mutates mechanism later
|
520
|
-
mechanism = args.first.mechanism
|
521
|
-
m.call(*args)
|
522
|
-
end
|
507
|
+
expect(Mongo::Auth).to receive(:get).and_wrap_original do |m, user|
|
508
|
+
# copy mechanism here rather than whole user
|
509
|
+
# in case something mutates mechanism later
|
510
|
+
mechanism = user.mechanism
|
511
|
+
m.call(user)
|
523
512
|
end
|
524
513
|
|
525
514
|
expect { result }.not_to raise_error
|
@@ -50,7 +50,7 @@ describe Mongo::Auth::SCRAM do
|
|
50
50
|
database: 'driver',
|
51
51
|
user: 'notauser',
|
52
52
|
password: 'password',
|
53
|
-
auth_mech:
|
53
|
+
auth_mech: :scram,
|
54
54
|
)
|
55
55
|
end
|
56
56
|
|
@@ -118,7 +118,7 @@ describe Mongo::Auth::SCRAM do
|
|
118
118
|
database: 'driver',
|
119
119
|
user: 'notauser',
|
120
120
|
password: 'password',
|
121
|
-
auth_mech:
|
121
|
+
auth_mech: :scram256,
|
122
122
|
)
|
123
123
|
end
|
124
124
|
|
@@ -10,6 +10,68 @@ describe Mongo::Auth::User do
|
|
10
10
|
described_class.new(options)
|
11
11
|
end
|
12
12
|
|
13
|
+
describe '#initialize' do
|
14
|
+
let(:user) { Mongo::Auth::User.new(options) }
|
15
|
+
|
16
|
+
context 'no options' do
|
17
|
+
let(:options) { {} }
|
18
|
+
|
19
|
+
it 'succeeds' do
|
20
|
+
expect(user).to be_a(Mongo::Auth::User)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'invalid mechanism' do
|
25
|
+
let(:options) { {auth_mech: :invalid} }
|
26
|
+
|
27
|
+
it 'raises ArgumentError' do
|
28
|
+
expect do
|
29
|
+
user
|
30
|
+
end.to raise_error(Mongo::Auth::InvalidMechanism, ":invalid is invalid, please use one of the following mechanisms: :mongodb_cr, :mongodb_x509, :plain, :scram, :scram256")
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context 'mechanism given as string' do
|
35
|
+
let(:options) { {auth_mech: 'scram'} }
|
36
|
+
|
37
|
+
context 'not linting' do
|
38
|
+
skip_if_linting
|
39
|
+
|
40
|
+
it 'warns' do
|
41
|
+
expect(Mongo::Logger.logger).to receive(:warn)
|
42
|
+
user
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'converts mechanism to symbol' do
|
46
|
+
expect(user.mechanism).to eq(:scram)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context 'linting' do
|
51
|
+
require_linting
|
52
|
+
|
53
|
+
it 'raises LintError' do
|
54
|
+
expect do
|
55
|
+
user
|
56
|
+
end.to raise_error(Mongo::Error::LintError, "Auth mechanism \"scram\" must be specified as a symbol")
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context 'mechanism given as symbol' do
|
62
|
+
let(:options) { {auth_mech: :scram} }
|
63
|
+
|
64
|
+
it 'does not warn' do
|
65
|
+
expect(Mongo::Logger.logger).not_to receive(:warn)
|
66
|
+
user
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'stores mechanism' do
|
70
|
+
expect(user.mechanism).to eq(:scram)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
13
75
|
describe '#auth_key' do
|
14
76
|
|
15
77
|
let(:nonce) do
|
@@ -93,6 +155,41 @@ describe Mongo::Auth::User do
|
|
93
155
|
it 'returns the hashed password' do
|
94
156
|
expect(user.hashed_password).to eq(expected)
|
95
157
|
end
|
158
|
+
|
159
|
+
context 'password not given' do
|
160
|
+
let(:options) { {user: 'foo'} }
|
161
|
+
|
162
|
+
it 'raises MissingPassword' do
|
163
|
+
expect do
|
164
|
+
user.hashed_password
|
165
|
+
end.to raise_error(Mongo::Error::MissingPassword)
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
describe '#sasl_prepped_password' do
|
171
|
+
|
172
|
+
let(:expected) do
|
173
|
+
'pass'
|
174
|
+
end
|
175
|
+
|
176
|
+
it 'returns the clear text password' do
|
177
|
+
expect(user.send(:sasl_prepped_password)).to eq(expected)
|
178
|
+
end
|
179
|
+
|
180
|
+
it 'returns the password encoded in utf-8' do
|
181
|
+
expect(user.sasl_prepped_password.encoding.name).to eq('UTF-8')
|
182
|
+
end
|
183
|
+
|
184
|
+
context 'password not given' do
|
185
|
+
let(:options) { {user: 'foo'} }
|
186
|
+
|
187
|
+
it 'raises MissingPassword' do
|
188
|
+
expect do
|
189
|
+
user.sasl_prepped_password
|
190
|
+
end.to raise_error(Mongo::Error::MissingPassword)
|
191
|
+
end
|
192
|
+
end
|
96
193
|
end
|
97
194
|
|
98
195
|
describe '#mechanism' do
|