mongo 1.10.0.rc0 → 1.10.0.rc1
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 +0 -0
- data/VERSION +1 -1
- data/lib/mongo/bulk_write_collection_view.rb +31 -3
- data/lib/mongo/collection.rb +69 -25
- data/lib/mongo/collection_writer.rb +3 -2
- data/lib/mongo/connection/node.rb +5 -0
- data/lib/mongo/cursor.rb +4 -1
- data/lib/mongo/db.rb +23 -41
- data/lib/mongo/functional.rb +2 -0
- data/lib/mongo/functional/authentication.rb +18 -3
- data/lib/mongo/functional/sasl_java.rb +48 -0
- data/lib/mongo/functional/uri_parser.rb +62 -50
- data/lib/mongo/mongo_client.rb +24 -9
- data/lib/mongo/mongo_replica_set_client.rb +16 -5
- data/lib/mongo/networking.rb +3 -3
- data/lib/mongo/utils/conversions.rb +2 -1
- data/test/functional/authentication_test.rb +6 -1
- data/test/functional/bulk_api_stress_test.rb +133 -0
- data/test/functional/bulk_write_collection_view_test.rb +573 -226
- data/test/functional/client_test.rb +3 -1
- data/test/functional/collection_test.rb +336 -17
- data/test/functional/conversions_test.rb +32 -0
- data/test/functional/cursor_test.rb +3 -3
- data/test/functional/db_api_test.rb +2 -2
- data/test/functional/db_test.rb +24 -0
- data/test/functional/uri_test.rb +49 -32
- data/test/helpers/test_unit.rb +8 -0
- data/test/replica_set/authentication_test.rb +5 -1
- data/test/replica_set/client_test.rb +5 -4
- data/test/replica_set/max_values_test.rb +6 -0
- data/test/shared/authentication/basic_auth_shared.rb +101 -30
- data/test/shared/authentication/bulk_api_auth_shared.rb +259 -0
- data/test/shared/authentication/gssapi_shared.rb +164 -0
- data/test/shared/ssl_shared.rb +49 -27
- data/test/unit/client_test.rb +4 -2
- data/test/unit/connection_test.rb +4 -2
- data/test/unit/cursor_test.rb +12 -0
- data/test/unit/db_test.rb +6 -0
- metadata +27 -20
- metadata.gz.sig +0 -0
@@ -103,7 +103,7 @@ class CursorTest < Test::Unit::TestCase
|
|
103
103
|
end
|
104
104
|
end
|
105
105
|
|
106
|
-
def
|
106
|
+
def test_max_time_ms_error
|
107
107
|
cursor = @@coll.find
|
108
108
|
cursor.stubs(:send_initial_query).returns(true)
|
109
109
|
|
@@ -117,10 +117,10 @@ class CursorTest < Test::Unit::TestCase
|
|
117
117
|
end
|
118
118
|
end
|
119
119
|
|
120
|
-
def
|
120
|
+
def test_max_time_ms
|
121
121
|
with_forced_timeout(@@connection) do
|
122
122
|
assert_raise ExecutionTimeout do
|
123
|
-
cursor = @@coll.find.
|
123
|
+
cursor = @@coll.find.max_time_ms(100)
|
124
124
|
cursor.to_a
|
125
125
|
end
|
126
126
|
end
|
@@ -325,11 +325,11 @@ class DBAPITest < Test::Unit::TestCase
|
|
325
325
|
@@db.strict = true
|
326
326
|
|
327
327
|
begin
|
328
|
-
coll = @@db.create_collection('foobar', :capped => true, :size =>
|
328
|
+
coll = @@db.create_collection('foobar', :capped => true, :size => 4096)
|
329
329
|
options = coll.options
|
330
330
|
assert_equal 'foobar', options['create'] if @@client.server_version < '2.5.5'
|
331
331
|
assert_equal true, options['capped']
|
332
|
-
assert_equal
|
332
|
+
assert_equal 4096, options['size']
|
333
333
|
rescue => ex
|
334
334
|
@@db.drop_collection('foobar')
|
335
335
|
fail "did not expect exception \"#{ex.inspect}\""
|
data/test/functional/db_test.rb
CHANGED
@@ -260,6 +260,30 @@ class DBTest < Test::Unit::TestCase
|
|
260
260
|
@@db.eval(function, 'hello', :nolock => true)
|
261
261
|
end
|
262
262
|
|
263
|
+
if @@version >= '2.5.3'
|
264
|
+
def test_default_admin_roles
|
265
|
+
# admin user
|
266
|
+
db = Mongo::MongoClient.new()['admin']
|
267
|
+
db.logout
|
268
|
+
silently { db.add_user('admin', 'pass') }
|
269
|
+
db.authenticate('admin', 'pass')
|
270
|
+
info = db.command(:usersInfo => 'admin')['users'].first
|
271
|
+
assert_equal 'root', info['roles'].first['role']
|
272
|
+
|
273
|
+
# read-only admin user
|
274
|
+
silently { db.add_user('ro-admin', 'pass', true) }
|
275
|
+
db.logout
|
276
|
+
db.authenticate('ro-admin', 'pass')
|
277
|
+
info = db.command(:usersInfo => 'ro-admin')['users'].first
|
278
|
+
assert_equal 'readAnyDatabase', info['roles'].first['role']
|
279
|
+
db.logout
|
280
|
+
|
281
|
+
db.authenticate('admin', 'pass')
|
282
|
+
db.command(:dropAllUsersFromDatabase => 1)
|
283
|
+
db.logout
|
284
|
+
end
|
285
|
+
end
|
286
|
+
|
263
287
|
if @@version >= "1.3.5"
|
264
288
|
def test_db_stats
|
265
289
|
stats = @@db.stats
|
data/test/functional/uri_test.rb
CHANGED
@@ -31,39 +31,39 @@ class URITest < Test::Unit::TestCase
|
|
31
31
|
assert_equal 27018, parser.nodes[0][1]
|
32
32
|
end
|
33
33
|
|
34
|
-
def test_ipv6_format
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
parser = Mongo::URIParser.new('mongodb://[::1]')
|
41
|
-
assert_equal 1, parser.nodes.length
|
42
|
-
assert_equal '::1', parser.nodes[0][0]
|
43
|
-
end
|
34
|
+
def test_ipv6_format
|
35
|
+
parser = Mongo::URIParser.new('mongodb://[::1]:27018')
|
36
|
+
assert_equal 1, parser.nodes.length
|
37
|
+
assert_equal '::1', parser.nodes[0][0]
|
38
|
+
assert_equal 27018, parser.nodes[0][1]
|
44
39
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
40
|
+
parser = Mongo::URIParser.new('mongodb://[::1]')
|
41
|
+
assert_equal 1, parser.nodes.length
|
42
|
+
assert_equal '::1', parser.nodes[0][0]
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_ipv6_format_multi
|
46
|
+
parser = Mongo::URIParser.new('mongodb://[::1]:27017,[::1]:27018')
|
47
|
+
assert_equal 2, parser.nodes.length
|
48
|
+
assert_equal '::1', parser.nodes[0][0]
|
49
|
+
assert_equal 27017, parser.nodes[0][1]
|
50
|
+
assert_equal '::1', parser.nodes[1][0]
|
51
|
+
assert_equal 27018, parser.nodes[1][1]
|
52
|
+
|
53
|
+
parser = Mongo::URIParser.new('mongodb://[::1]:27017,localhost:27018')
|
54
|
+
assert_equal 2, parser.nodes.length
|
55
|
+
assert_equal '::1', parser.nodes[0][0]
|
56
|
+
assert_equal 27017, parser.nodes[0][1]
|
57
|
+
assert_equal 'localhost', parser.nodes[1][0]
|
58
|
+
assert_equal 27018, parser.nodes[1][1]
|
59
|
+
|
60
|
+
parser = Mongo::URIParser.new('mongodb://localhost:27017,[::1]:27018')
|
61
|
+
assert_equal 2, parser.nodes.length
|
62
|
+
assert_equal 'localhost', parser.nodes[0][0]
|
63
|
+
assert_equal 27017, parser.nodes[0][1]
|
64
|
+
assert_equal '::1', parser.nodes[1][0]
|
65
|
+
assert_equal 27018, parser.nodes[1][1]
|
66
|
+
end
|
67
67
|
|
68
68
|
def test_multiple_uris
|
69
69
|
parser = Mongo::URIParser.new('mongodb://a.example.com:27018,b.example.com')
|
@@ -310,4 +310,21 @@ end
|
|
310
310
|
Mongo::URIParser.new("mongodb://user@localhost/some_db?authMechanism=PLAIN")
|
311
311
|
end
|
312
312
|
end
|
313
|
+
|
314
|
+
def test_gssapi
|
315
|
+
uri = "mongodb://foo%2Fbar%40example.net@localhost?authMechanism=GSSAPI;"
|
316
|
+
parser = Mongo::URIParser.new(uri)
|
317
|
+
assert_equal 'GSSAPI', parser.auths.first[:mechanism]
|
318
|
+
assert_equal 'foo/bar@example.net', parser.auths.first[:username]
|
319
|
+
|
320
|
+
|
321
|
+
uri = "mongodb://foo%2Fbar%40example.net@localhost?authMechanism=GSSAPI;" +
|
322
|
+
"gssapiServiceName=mongodb;canonicalizeHostName=true"
|
323
|
+
parser = Mongo::URIParser.new(uri)
|
324
|
+
assert_equal 'GSSAPI', parser.auths.first[:mechanism]
|
325
|
+
assert_equal 'foo/bar@example.net', parser.auths.first[:username]
|
326
|
+
assert_equal 'mongodb', parser.auths.first[:extra][:gssapi_service_name]
|
327
|
+
assert_equal true, parser.auths.first[:extra][:canonicalize_host_name]
|
328
|
+
end
|
329
|
+
|
313
330
|
end
|
data/test/helpers/test_unit.rb
CHANGED
@@ -233,6 +233,11 @@ class Test::Unit::TestCase
|
|
233
233
|
end
|
234
234
|
end
|
235
235
|
|
236
|
+
def with_auth(client, &block)
|
237
|
+
cmd_line_args = client['admin'].command({ :getCmdLineOpts => 1 })['parsed']
|
238
|
+
yield if cmd_line_args.include?('auth')
|
239
|
+
end
|
240
|
+
|
236
241
|
def with_default_journaling(client, &block)
|
237
242
|
cmd_line_args = client['admin'].command({ :getCmdLineOpts => 1 })['parsed']
|
238
243
|
unless client.server_version < "2.0" || cmd_line_args.include?('nojournal')
|
@@ -298,6 +303,9 @@ class Test::Unit::TestCase
|
|
298
303
|
with_write_operations(client, &block)
|
299
304
|
end
|
300
305
|
|
306
|
+
def batch_commands?(wire_version)
|
307
|
+
wire_version >= Mongo::MongoClient::BATCH_COMMANDS
|
308
|
+
end
|
301
309
|
end
|
302
310
|
|
303
311
|
# Before and after hooks for the entire test run
|
@@ -15,17 +15,21 @@
|
|
15
15
|
require 'test_helper'
|
16
16
|
require 'shared/authentication/basic_auth_shared'
|
17
17
|
require 'shared/authentication/sasl_plain_shared'
|
18
|
+
require 'shared/authentication/bulk_api_auth_shared'
|
19
|
+
require 'shared/authentication/gssapi_shared'
|
18
20
|
|
19
21
|
class ReplicaSetAuthenticationTest < Test::Unit::TestCase
|
20
22
|
include Mongo
|
21
23
|
include BasicAuthTests
|
22
24
|
include SASLPlainTests
|
25
|
+
include BulkAPIAuthTests
|
26
|
+
include GSSAPITests
|
23
27
|
|
24
28
|
def setup
|
25
29
|
ensure_cluster(:rs)
|
26
30
|
@client = MongoReplicaSetClient.new(@rs.repl_set_seeds)
|
31
|
+
@version = @client.server_version
|
27
32
|
@db = @client[TEST_DB]
|
28
33
|
@host_info = @rs.repl_set_seeds.join(',')
|
29
|
-
init_auth
|
30
34
|
end
|
31
35
|
end
|
@@ -329,12 +329,13 @@ class ReplicaSetClientTest < Test::Unit::TestCase
|
|
329
329
|
def test_find_and_modify_with_secondary_read_preference
|
330
330
|
@client = MongoReplicaSetClient.new @rs.repl_set_seeds
|
331
331
|
collection = @client[TEST_DB].collection('test', :read => :secondary)
|
332
|
-
|
332
|
+
id = BSON::ObjectId.new
|
333
|
+
collection << { :a => id, :processed => false }
|
333
334
|
|
334
335
|
collection.find_and_modify(
|
335
|
-
:query => {},
|
336
|
-
:update => {"$set" => {:processed => true}}
|
336
|
+
:query => { 'a' => id },
|
337
|
+
:update => { "$set" => { :processed => true }}
|
337
338
|
)
|
338
|
-
assert_equal collection.find_one({
|
339
|
+
assert_equal true, collection.find_one({ 'a' => id }, :read => :primary)['processed']
|
339
340
|
end
|
340
341
|
end
|
@@ -135,5 +135,11 @@ class MaxValuesTest < Test::Unit::TestCase
|
|
135
135
|
assert_true @client.use_write_command?({:w => 1})
|
136
136
|
assert_false @client.use_write_command?({:w => 0})
|
137
137
|
end
|
138
|
+
|
139
|
+
def test_max_write_batch_size
|
140
|
+
assert_equal Mongo::MongoClient::DEFAULT_MAX_WRITE_BATCH_SIZE, @client.max_write_batch_size
|
141
|
+
@client.local_manager.primary_pool.node.stubs(:max_write_batch_size).returns(999)
|
142
|
+
assert_equal 999, @client.max_write_batch_size
|
143
|
+
end
|
138
144
|
end
|
139
145
|
|
@@ -14,7 +14,7 @@
|
|
14
14
|
|
15
15
|
module BasicAuthTests
|
16
16
|
|
17
|
-
def
|
17
|
+
def init_auth_basic
|
18
18
|
# enable authentication by creating and logging in as admin user
|
19
19
|
@admin = @client['admin']
|
20
20
|
@admin.add_user('admin', 'password', nil, :roles => ['readAnyDatabase',
|
@@ -28,7 +28,7 @@ module BasicAuthTests
|
|
28
28
|
@db.add_user('admin', 'cleanup', nil, :roles => [])
|
29
29
|
end
|
30
30
|
|
31
|
-
def
|
31
|
+
def teardown_basic
|
32
32
|
remove_all_users(@db, 'admin', 'cleanup')
|
33
33
|
remove_all_users(@admin, 'admin', 'password') if has_auth?(@admin.name)
|
34
34
|
end
|
@@ -48,15 +48,21 @@ module BasicAuthTests
|
|
48
48
|
end
|
49
49
|
|
50
50
|
def test_add_remove_user
|
51
|
+
init_auth_basic
|
52
|
+
|
51
53
|
# add user
|
52
54
|
silently { @db.add_user('bob','user') }
|
53
55
|
assert @db.authenticate('bob', 'user')
|
54
56
|
|
55
57
|
# remove user
|
56
58
|
assert @db.remove_user('bob')
|
59
|
+
|
60
|
+
teardown_basic
|
57
61
|
end
|
58
62
|
|
59
63
|
def test_update_user
|
64
|
+
init_auth_basic
|
65
|
+
|
60
66
|
# add user
|
61
67
|
silently { @db.add_user('bob', 'user') }
|
62
68
|
assert @db.authenticate('bob', 'user')
|
@@ -68,9 +74,13 @@ module BasicAuthTests
|
|
68
74
|
@db.authenticate('bob', 'user')
|
69
75
|
end
|
70
76
|
assert @db.authenticate('bob', 'updated')
|
77
|
+
|
78
|
+
teardown_basic
|
71
79
|
end
|
72
80
|
|
73
81
|
def test_remove_non_existent_user
|
82
|
+
init_auth_basic
|
83
|
+
|
74
84
|
if @client.server_version < '2.5'
|
75
85
|
assert_equal false, @db.remove_user('joe')
|
76
86
|
else
|
@@ -78,37 +88,49 @@ module BasicAuthTests
|
|
78
88
|
assert @db.remove_user('joe')
|
79
89
|
end
|
80
90
|
end
|
91
|
+
teardown_basic
|
81
92
|
end
|
82
93
|
|
83
94
|
def test_authenticate
|
95
|
+
init_auth_basic
|
84
96
|
silently { @db.add_user('peggy', 'user') }
|
85
97
|
assert @db.authenticate('peggy', 'user')
|
86
98
|
@db.remove_user('peggy')
|
99
|
+
teardown_basic
|
87
100
|
end
|
88
101
|
|
89
102
|
def test_authenticate_non_existent_user
|
103
|
+
init_auth_basic
|
90
104
|
assert_raise Mongo::AuthenticationError do
|
91
105
|
@db.authenticate('frank', 'thetank')
|
92
106
|
end
|
107
|
+
teardown_basic
|
93
108
|
end
|
94
109
|
|
95
110
|
def test_logout
|
111
|
+
init_auth_basic
|
96
112
|
silently { @db.add_user('peggy', 'user') }
|
97
113
|
assert @db.authenticate('peggy', 'user')
|
98
114
|
assert @db.logout
|
115
|
+
teardown_basic
|
99
116
|
end
|
100
117
|
|
101
118
|
def test_authenticate_with_special_characters
|
119
|
+
init_auth_basic
|
102
120
|
silently { assert @db.add_user('foo:bar','@foo') }
|
103
121
|
assert @db.authenticate('foo:bar','@foo')
|
122
|
+
teardown_basic
|
104
123
|
end
|
105
124
|
|
106
125
|
def test_authenticate_read_only
|
126
|
+
init_auth_basic
|
107
127
|
silently { @db.add_user('randy', 'readonly', true) }
|
108
128
|
assert @db.authenticate('randy', 'readonly')
|
129
|
+
teardown_basic
|
109
130
|
end
|
110
131
|
|
111
132
|
def test_authenticate_with_connection_uri
|
133
|
+
init_auth_basic
|
112
134
|
silently { @db.add_user('eunice', 'uritest') }
|
113
135
|
|
114
136
|
uri = "mongodb://eunice:uritest@#{@host_info}/#{@db.name}"
|
@@ -122,9 +144,11 @@ module BasicAuthTests
|
|
122
144
|
assert_equal @db.name, auth[:db_name]
|
123
145
|
assert_equal 'eunice', auth[:username]
|
124
146
|
assert_equal 'uritest', auth[:password]
|
147
|
+
teardown_basic
|
125
148
|
end
|
126
149
|
|
127
150
|
def test_socket_auths
|
151
|
+
init_auth_basic
|
128
152
|
# setup
|
129
153
|
db_a = @client[TEST_DB + '_a']
|
130
154
|
silently { db_a.add_user('user_a', 'password') }
|
@@ -156,47 +180,70 @@ module BasicAuthTests
|
|
156
180
|
remove_all_users(db_a, 'user_a', 'password')
|
157
181
|
remove_all_users(db_b, 'user_b', 'password')
|
158
182
|
remove_all_users(db_c, 'user_c', 'password')
|
183
|
+
teardown_basic
|
184
|
+
end
|
185
|
+
|
186
|
+
def test_default_roles_non_admin
|
187
|
+
return unless @client.server_version >= '2.5.3'
|
188
|
+
init_auth_basic
|
189
|
+
silently { @db.add_user('user', 'pass') }
|
190
|
+
silently { @db.authenticate('user', 'pass') }
|
191
|
+
info = @db.command(:usersInfo => 'user')['users'].first
|
192
|
+
assert_equal 'dbOwner', info['roles'].first['role']
|
193
|
+
|
194
|
+
# read-only
|
195
|
+
silently { @db.add_user('ro-user', 'pass', true) }
|
196
|
+
@db.logout
|
197
|
+
@db.authenticate('ro-user', 'pass')
|
198
|
+
info = @db.command(:usersInfo => 'ro-user')['users'].first
|
199
|
+
assert_equal 'read', info['roles'].first['role']
|
200
|
+
@db.logout
|
201
|
+
teardown_basic
|
159
202
|
end
|
160
203
|
|
161
204
|
def test_delegated_authentication
|
162
205
|
return unless @client.server_version >= '2.4' && @client.server_version < '2.5'
|
206
|
+
with_auth(@client) do
|
207
|
+
init_auth_basic
|
208
|
+
# create user in test databases
|
209
|
+
accounts = @client[TEST_DB + '_accounts']
|
210
|
+
silently do
|
211
|
+
accounts.add_user('debbie', 'delegate')
|
212
|
+
@db.add_user('debbie', nil, nil, :roles => ['read'], :userSource => accounts.name)
|
213
|
+
end
|
214
|
+
@admin.logout
|
163
215
|
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
@db.add_user('debbie', nil, nil, :roles => ['read'], :userSource => accounts.name)
|
169
|
-
end
|
170
|
-
@admin.logout
|
216
|
+
# validate that direct authentication is not allowed
|
217
|
+
assert_raise Mongo::AuthenticationError do
|
218
|
+
@db.authenticate('debbie', 'delegate')
|
219
|
+
end
|
171
220
|
|
172
|
-
|
173
|
-
|
174
|
-
@db.
|
175
|
-
|
221
|
+
# validate delegated authentication
|
222
|
+
assert accounts.authenticate('debbie', 'delegate')
|
223
|
+
assert @db.collection_names
|
224
|
+
accounts.logout
|
225
|
+
assert_raise Mongo::OperationFailure do
|
226
|
+
@db.collection_names
|
227
|
+
end
|
176
228
|
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
229
|
+
# validate auth using source database
|
230
|
+
@db.authenticate('debbie', 'delegate', nil, accounts.name)
|
231
|
+
assert @db.collection_names
|
232
|
+
accounts.logout
|
233
|
+
assert_raise Mongo::OperationFailure do
|
234
|
+
@db.collection_names
|
235
|
+
end
|
184
236
|
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
assert_raise Mongo::OperationFailure do
|
190
|
-
@db.collection_names
|
237
|
+
# clean-up
|
238
|
+
@admin.authenticate('admin', 'password')
|
239
|
+
remove_all_users(accounts, 'debbie', 'delegate')
|
240
|
+
teardown_basic
|
191
241
|
end
|
192
|
-
|
193
|
-
# clean-up
|
194
|
-
@admin.authenticate('admin', 'password')
|
195
|
-
remove_all_users(accounts, 'debbie', 'delegate')
|
196
242
|
end
|
197
243
|
|
198
244
|
def test_non_admin_default_roles
|
199
245
|
return if @client.server_version < '2.5'
|
246
|
+
init_auth_basic
|
200
247
|
|
201
248
|
# add read-only user and verify that role is 'read'
|
202
249
|
@db.add_user('randy', 'password', nil, :roles => ['read'])
|
@@ -210,6 +257,30 @@ module BasicAuthTests
|
|
210
257
|
@db.authenticate('emily', 'password')
|
211
258
|
users = @db.command(:usersInfo => 'emily')['users']
|
212
259
|
assert_equal 'dbOwner', users.first['roles'].first['role']
|
260
|
+
teardown_basic
|
261
|
+
end
|
262
|
+
|
263
|
+
def test_update_user_to_read_only
|
264
|
+
with_auth(@client) do
|
265
|
+
init_auth_basic
|
266
|
+
silently { @db.add_user('emily', 'password') }
|
267
|
+
@admin.logout
|
268
|
+
@db.authenticate('emily', 'password')
|
269
|
+
@db['test'].insert({})
|
270
|
+
@db.logout
|
271
|
+
|
272
|
+
@admin.authenticate('admin', 'password')
|
273
|
+
silently { @db.add_user('emily', 'password', true) }
|
274
|
+
@admin.logout
|
275
|
+
|
276
|
+
silently { @db.authenticate('emily', 'password') }
|
277
|
+
assert_raise Mongo::OperationFailure do
|
278
|
+
@db['test'].insert({})
|
279
|
+
end
|
280
|
+
@db.logout
|
281
|
+
@admin.authenticate('admin', 'password')
|
282
|
+
teardown_basic
|
283
|
+
end
|
213
284
|
end
|
214
285
|
|
215
286
|
end
|