mongo 2.5.0 → 2.5.1

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.
Files changed (99) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/README.md +2 -0
  5. data/Rakefile +4 -1
  6. data/lib/mongo/address.rb +2 -1
  7. data/lib/mongo/client.rb +6 -51
  8. data/lib/mongo/cluster.rb +34 -4
  9. data/lib/mongo/cluster/reapers/socket_reaper.rb +1 -1
  10. data/lib/mongo/cluster/topology/replica_set.rb +3 -1
  11. data/lib/mongo/collection.rb +6 -6
  12. data/lib/mongo/collection/view.rb +2 -4
  13. data/lib/mongo/cursor.rb +9 -4
  14. data/lib/mongo/error.rb +2 -0
  15. data/lib/mongo/operation/uses_command_op_msg.rb +1 -1
  16. data/lib/mongo/server.rb +3 -0
  17. data/lib/mongo/server/description.rb +1 -1
  18. data/lib/mongo/server/description/features.rb +18 -12
  19. data/lib/mongo/server_selector/selectable.rb +5 -1
  20. data/lib/mongo/session.rb +38 -43
  21. data/lib/mongo/session/session_pool.rb +12 -30
  22. data/lib/mongo/socket.rb +24 -0
  23. data/lib/mongo/socket/tcp.rb +0 -1
  24. data/lib/mongo/uri.rb +26 -5
  25. data/lib/mongo/version.rb +1 -1
  26. data/spec/mongo/address_spec.rb +37 -2
  27. data/spec/mongo/bulk_write_spec.rb +4 -10
  28. data/spec/mongo/change_stream_examples_spec.rb +40 -0
  29. data/spec/mongo/client_spec.rb +47 -12
  30. data/spec/mongo/cluster/topology/replica_set_spec.rb +2 -0
  31. data/spec/mongo/collection/view/aggregation_spec.rb +2 -8
  32. data/spec/mongo/collection/view/change_stream_spec.rb +1 -5
  33. data/spec/mongo/collection/view/map_reduce_spec.rb +2 -8
  34. data/spec/mongo/collection/view/readable_spec.rb +1 -1
  35. data/spec/mongo/collection_spec.rb +11 -29
  36. data/spec/mongo/crud_spec.rb +6 -2
  37. data/spec/mongo/cursor_spec.rb +84 -1
  38. data/spec/mongo/database_spec.rb +2 -8
  39. data/spec/mongo/dns_seedlist_discovery_spec.rb +67 -63
  40. data/spec/mongo/max_staleness_spec.rb +1 -0
  41. data/spec/mongo/retryable_writes_spec.rb +7 -9
  42. data/spec/mongo/sdam_spec.rb +42 -24
  43. data/spec/mongo/server/description/features_spec.rb +3 -3
  44. data/spec/mongo/server_selection_spec.rb +2 -0
  45. data/spec/mongo/server_selector_spec.rb +2 -0
  46. data/spec/mongo/session/session_pool_spec.rb +16 -22
  47. data/spec/mongo/session_spec.rb +13 -8
  48. data/spec/mongo/uri/srv_protocol_spec.rb +481 -478
  49. data/spec/mongo/uri_spec.rb +1 -1
  50. data/spec/spec_helper.rb +11 -63
  51. data/spec/support/authorization.rb +35 -1
  52. data/spec/support/connection_string_tests/invalid-uris.yml +27 -11
  53. data/spec/support/event_subscriber.rb +66 -0
  54. data/spec/support/sdam/rs/compatible.yml +41 -0
  55. data/spec/support/sdam/rs/discover_arbiters.yml +3 -1
  56. data/spec/support/sdam/rs/discover_passives.yml +6 -2
  57. data/spec/support/sdam/rs/discover_primary.yml +3 -1
  58. data/spec/support/sdam/rs/discover_secondary.yml +3 -1
  59. data/spec/support/sdam/rs/discovery.yml +12 -4
  60. data/spec/support/sdam/rs/equal_electionids.yml +6 -2
  61. data/spec/support/sdam/rs/ghost_discovered.yml +3 -1
  62. data/spec/support/sdam/rs/hosts_differ_from_seeds.yml +3 -1
  63. data/spec/support/sdam/rs/ls_timeout.yml +169 -14
  64. data/spec/support/sdam/rs/member_reconfig.yml +6 -2
  65. data/spec/support/sdam/rs/member_standalone.yml +6 -2
  66. data/spec/support/sdam/rs/new_primary.yml +6 -2
  67. data/spec/support/sdam/rs/new_primary_new_electionid.yml +9 -3
  68. data/spec/support/sdam/rs/new_primary_new_setversion.yml +9 -3
  69. data/spec/support/sdam/rs/new_primary_wrong_set_name.yml +6 -2
  70. data/spec/support/sdam/rs/non_rs_member.yml +3 -2
  71. data/spec/support/sdam/rs/normalize_case.yml +3 -1
  72. data/spec/support/sdam/rs/null_election_id.yml +12 -4
  73. data/spec/support/sdam/rs/primary_becomes_standalone.yml +6 -4
  74. data/spec/support/sdam/rs/primary_changes_set_name.yml +6 -2
  75. data/spec/support/sdam/rs/primary_disconnect.yml +3 -1
  76. data/spec/support/sdam/rs/primary_disconnect_electionid.yml +15 -5
  77. data/spec/support/sdam/rs/primary_disconnect_setversion.yml +15 -5
  78. data/spec/support/sdam/rs/primary_hint_from_secondary_with_mismatched_me.yml +6 -2
  79. data/spec/support/sdam/rs/primary_mismatched_me.yml +26 -37
  80. data/spec/support/sdam/rs/primary_reports_new_member.yml +12 -4
  81. data/spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml +6 -2
  82. data/spec/support/sdam/rs/primary_wrong_set_name.yml +3 -1
  83. data/spec/support/sdam/rs/response_from_removed.yml +6 -2
  84. data/spec/support/sdam/rs/rsother_discovered.yml +6 -2
  85. data/spec/support/sdam/rs/sec_not_auth.yml +6 -2
  86. data/spec/support/sdam/rs/secondary_mismatched_me.yml +26 -37
  87. data/spec/support/sdam/rs/secondary_wrong_set_name.yml +3 -1
  88. data/spec/support/sdam/rs/secondary_wrong_set_name_with_primary.yml +6 -2
  89. data/spec/support/sdam/rs/setversion_without_electionid.yml +6 -2
  90. data/spec/support/sdam/rs/stepdown_change_set_name.yml +6 -2
  91. data/spec/support/sdam/rs/too_new.yml +41 -0
  92. data/spec/support/sdam/rs/too_old.yml +39 -0
  93. data/spec/support/sdam/rs/unexpected_mongos.yml +3 -1
  94. data/spec/support/sdam/rs/use_setversion_without_electionid.yml +9 -3
  95. data/spec/support/sdam/rs/wrong_set_name.yml +3 -1
  96. data/spec/support/server_discovery_and_monitoring.rb +13 -0
  97. data/spec/support/shared/session.rb +10 -30
  98. metadata +10 -2
  99. metadata.gz.sig +0 -0
@@ -532,6 +532,7 @@ describe Mongo::Cluster::Topology::ReplicaSet do
532
532
  allow(d).to receive(:replica_set_member?).and_return(true)
533
533
  allow(d).to receive(:replica_set_name).and_return('testing')
534
534
  allow(d).to receive(:lists_server?).and_return(true)
535
+ allow(d).to receive(:servers).and_return([double('server')])
535
536
  end
536
537
  end
537
538
 
@@ -549,6 +550,7 @@ describe Mongo::Cluster::Topology::ReplicaSet do
549
550
  allow(d).to receive(:replica_set_name).and_return('testing')
550
551
  allow(d).to receive(:is_server?).and_return(false)
551
552
  allow(d).to receive(:lists_server?).and_return(false)
553
+ allow(d).to receive(:servers).and_return([double('server')])
552
554
  end
553
555
  end
554
556
 
@@ -231,26 +231,20 @@ describe Mongo::Collection::View::Aggregation do
231
231
  end
232
232
 
233
233
  let(:client) do
234
- authorized_client.with(heartbeat_frequency: 100).tap do |cl|
235
- cl.subscribe(Mongo::Monitoring::COMMAND, subscriber)
236
- end
234
+ subscribed_client
237
235
  end
238
236
 
239
237
  let(:session) do
240
238
  client.start_session
241
239
  end
242
240
 
243
- let(:subscriber) do
244
- EventSubscriber.new
245
- end
246
-
247
241
  let(:view) do
248
242
  Mongo::Collection::View.new(client[TEST_COLL], selector, view_options)
249
243
  end
250
244
 
251
245
  let(:command) do
252
246
  aggregation.explain
253
- subscriber.started_events.find { |c| c.command_name == 'aggregate'}.command
247
+ EventSubscriber.started_events.find { |c| c.command_name == 'aggregate'}.command
254
248
  end
255
249
 
256
250
  it 'sends the session id' do
@@ -314,11 +314,7 @@ describe Mongo::Collection::View::ChangeStream, if: test_change_streams? do
314
314
  context 'when a session from another client is provided' do
315
315
 
316
316
  let(:session) do
317
- client.start_session
318
- end
319
-
320
- let(:client) do
321
- authorized_client.with(read: { mode: :secondary })
317
+ authorized_client_with_retry_writes.start_session
322
318
  end
323
319
 
324
320
  let(:operation_result) do
@@ -240,17 +240,11 @@ describe Mongo::Collection::View::MapReduce do
240
240
  end
241
241
 
242
242
  let(:client) do
243
- authorized_client.with(monitoring: true).tap do |cl|
244
- cl.subscribe(Mongo::Monitoring::COMMAND, subscriber)
245
- end
246
- end
247
-
248
- let(:subscriber) do
249
- EventSubscriber.new
243
+ subscribed_client
250
244
  end
251
245
 
252
246
  let(:find_command) do
253
- subscriber.started_events[-1].command
247
+ EventSubscriber.started_events[-1].command
254
248
  end
255
249
 
256
250
  before do
@@ -191,7 +191,7 @@ describe Mongo::Collection::View::Readable do
191
191
 
192
192
  let(:command) do
193
193
  operation
194
- subscriber.started_events.find { |cmd| cmd.command_name == 'mapreduce' }.command
194
+ EventSubscriber.started_events.find { |cmd| cmd.command_name == 'mapreduce' }.command
195
195
  end
196
196
 
197
197
  it_behaves_like 'an operation supporting causally consistent reads'
@@ -900,26 +900,20 @@ describe Mongo::Collection do
900
900
  end
901
901
 
902
902
  let(:client) do
903
- authorized_client.with(heartbeat_frequency: 100).tap do |cl|
904
- cl.subscribe(Mongo::Monitoring::COMMAND, subscriber)
905
- end
903
+ subscribed_client
906
904
  end
907
905
 
908
906
  let(:session) do
909
907
  client.start_session
910
908
  end
911
909
 
912
- let(:subscriber) do
913
- EventSubscriber.new
914
- end
915
-
916
910
  let(:view) do
917
911
  Mongo::Collection::View.new(client[TEST_COLL], selector, view_options)
918
912
  end
919
913
 
920
914
  let(:command) do
921
915
  client[TEST_COLL].find({}, session: session).explain
922
- subscriber.started_events.find { |c| c.command_name == :explain }.command
916
+ EventSubscriber.started_events.find { |c| c.command_name == :explain }.command
923
917
  end
924
918
 
925
919
  it 'sends the session id' do
@@ -935,7 +929,7 @@ describe Mongo::Collection do
935
929
 
936
930
  let(:command) do
937
931
  operation
938
- subscriber.started_events.find { |cmd| cmd.command_name == 'find' }.command
932
+ EventSubscriber.started_events.find { |cmd| cmd.command_name == 'find' }.command
939
933
  end
940
934
 
941
935
  it_behaves_like 'an operation supporting causally consistent reads'
@@ -1205,13 +1199,7 @@ describe Mongo::Collection do
1205
1199
  context 'when the documents are sent with OP_MSG', if: op_msg_enabled? do
1206
1200
 
1207
1201
  let(:client) do
1208
- authorized_client.with(heartbeat_frequency: 100).tap do |cl|
1209
- cl.subscribe(Mongo::Monitoring::COMMAND, subscriber)
1210
- end
1211
- end
1212
-
1213
- let(:subscriber) do
1214
- EventSubscriber.new
1202
+ subscribed_client
1215
1203
  end
1216
1204
 
1217
1205
  let(:documents) do
@@ -1227,7 +1215,7 @@ describe Mongo::Collection do
1227
1215
  end
1228
1216
 
1229
1217
  let(:insert_events) do
1230
- subscriber.started_events.select { |e| e.command_name == :insert }
1218
+ EventSubscriber.started_events.select { |e| e.command_name == :insert }
1231
1219
  end
1232
1220
 
1233
1221
  it 'sends the documents in one OP_MSG' do
@@ -1574,7 +1562,7 @@ describe Mongo::Collection do
1574
1562
 
1575
1563
  let(:command) do
1576
1564
  operation
1577
- subscriber.started_events.find { |cmd| cmd.command_name == 'aggregate' }.command
1565
+ EventSubscriber.started_events.find { |cmd| cmd.command_name == 'aggregate' }.command
1578
1566
  end
1579
1567
 
1580
1568
  it_behaves_like 'an operation supporting causally consistent reads'
@@ -1738,7 +1726,7 @@ describe Mongo::Collection do
1738
1726
 
1739
1727
  let(:command) do
1740
1728
  operation
1741
- subscriber.started_events.find { |cmd| cmd.command_name == :count }.command
1729
+ EventSubscriber.started_events.find { |cmd| cmd.command_name == :count }.command
1742
1730
  end
1743
1731
 
1744
1732
  it_behaves_like 'an operation supporting causally consistent reads'
@@ -1852,7 +1840,7 @@ describe Mongo::Collection do
1852
1840
 
1853
1841
  let(:command) do
1854
1842
  operation
1855
- subscriber.started_events.find { |cmd| cmd.command_name == :distinct }.command
1843
+ EventSubscriber.started_events.find { |cmd| cmd.command_name == :distinct }.command
1856
1844
  end
1857
1845
 
1858
1846
  it_behaves_like 'an operation supporting causally consistent reads'
@@ -2344,7 +2332,7 @@ describe Mongo::Collection do
2344
2332
 
2345
2333
  let(:command) do
2346
2334
  operation
2347
- subscriber.started_events.find { |cmd| cmd.command_name == :parallelCollectionScan }.command
2335
+ EventSubscriber.started_events.find { |cmd| cmd.command_name == :parallelCollectionScan }.command
2348
2336
  end
2349
2337
 
2350
2338
  it_behaves_like 'an operation supporting causally consistent reads'
@@ -3486,13 +3474,7 @@ describe Mongo::Collection do
3486
3474
  context 'when the documents are sent with OP_MSG', if: op_msg_enabled? do
3487
3475
 
3488
3476
  let(:client) do
3489
- authorized_client.with(heartbeat_frequency: 100).tap do |cl|
3490
- cl.subscribe(Mongo::Monitoring::COMMAND, subscriber)
3491
- end
3492
- end
3493
-
3494
- let(:subscriber) do
3495
- EventSubscriber.new
3477
+ subscribed_client
3496
3478
  end
3497
3479
 
3498
3480
  let(:documents) do
@@ -3509,7 +3491,7 @@ describe Mongo::Collection do
3509
3491
  end
3510
3492
 
3511
3493
  let(:update_events) do
3512
- subscriber.started_events.select { |e| e.command_name == :update }
3494
+ EventSubscriber.started_events.select { |e| e.command_name == :update }
3513
3495
  end
3514
3496
 
3515
3497
  it 'sends the documents in one OP_MSG' do
@@ -10,6 +10,12 @@ describe 'CRUD' do
10
10
 
11
11
  spec.tests.each do |test|
12
12
 
13
+ around do |example|
14
+ if spec.server_version_satisfied?(authorized_client)
15
+ example.run
16
+ end
17
+ end
18
+
13
19
  context(test.description) do
14
20
 
15
21
  before(:each) do
@@ -25,12 +31,10 @@ describe 'CRUD' do
25
31
  end
26
32
 
27
33
  it 'returns the correct result' do
28
- skip 'Test cannot be run on this server version' unless spec.server_version_satisfied?(authorized_client)
29
34
  expect(results).to match_operation_result(test)
30
35
  end
31
36
 
32
37
  it 'has the correct data in the collection', if: test.outcome_collection_data do
33
- skip 'Test cannot be run on this server version' unless spec.server_version_satisfied?(authorized_client)
34
38
  results
35
39
  expect(authorized_collection.find.to_a).to match_collection_data(test)
36
40
  end
@@ -301,10 +301,14 @@ describe Mongo::Cursor do
301
301
  authorized_collection.find({}, batch_size: 2)
302
302
  end
303
303
 
304
+ let(:cursor) do
305
+ view.instance_variable_get(:@cursor)
306
+ end
307
+
304
308
  let!(:cursor_id) do
305
309
  enum.next
306
310
  enum.next
307
- view.instance_variable_get(:@cursor).id
311
+ cursor.id
308
312
  end
309
313
 
310
314
  let(:enum) do
@@ -322,6 +326,85 @@ describe Mongo::Cursor do
322
326
  end
323
327
  end
324
328
 
329
+ context 'when an implicit session is used', if: sessions_enabled? do
330
+
331
+ let(:collection) do
332
+ subscribed_client[TEST_COLL]
333
+ end
334
+
335
+ before do
336
+ collection.insert_many(documents)
337
+ end
338
+
339
+ after do
340
+ collection.delete_many
341
+ end
342
+
343
+ let(:cursor) do
344
+ view.instance_variable_get(:@cursor)
345
+ end
346
+
347
+ let(:enum) do
348
+ view.to_enum
349
+ end
350
+
351
+ let(:session_pool_ids) do
352
+ queue = view.client.cluster.session_pool.instance_variable_get(:@queue)
353
+ queue.collect { |s| s.session_id }
354
+ end
355
+
356
+ let(:find_events) do
357
+ EventSubscriber.started_events.select { |e| e.command_name == "find" }
358
+ end
359
+
360
+ context 'when all results are retrieved in the first response' do
361
+
362
+ let(:documents) do
363
+ (1..2).map{ |i| { field: "test#{i}" }}
364
+ end
365
+
366
+ let(:view) do
367
+ collection.find
368
+ end
369
+
370
+ it 'returns the session to the cluster session pool' do
371
+ 1.times { enum.next }
372
+ expect(find_events.collect { |event| event.command['lsid'] }.uniq.size).to eq(1)
373
+ expect(session_pool_ids).to include(find_events.collect { |event| event.command['lsid'] }.uniq.first)
374
+ end
375
+ end
376
+
377
+ context 'when a getmore is needed to retrieve all results', if: sessions_enabled? && !sharded? do
378
+
379
+ let(:documents) do
380
+ (1..4).map{ |i| { field: "test#{i}" }}
381
+ end
382
+
383
+ let(:view) do
384
+ collection.find({}, batch_size: 2, limit: 4)
385
+ end
386
+
387
+
388
+ context 'when not all documents are iterated' do
389
+
390
+ it 'returns the session to the cluster session pool' do
391
+ 3.times { enum.next }
392
+ expect(find_events.collect { |event| event.command['lsid'] }.uniq.size).to eq(1)
393
+ expect(session_pool_ids).to include(find_events.collect { |event| event.command['lsid'] }.uniq.first)
394
+ end
395
+ end
396
+
397
+ context 'when all documents are iterated' do
398
+
399
+ it 'returns the session to the cluster session pool' do
400
+ 4.times { enum.next }
401
+ expect(find_events.collect { |event| event.command['lsid'] }.uniq.size).to eq(1)
402
+ expect(session_pool_ids).to include(find_events.collect { |event| event.command['lsid'] }.uniq.first)
403
+ end
404
+ end
405
+ end
406
+ end
407
+
325
408
  describe '#inspect' do
326
409
 
327
410
  let(:view) do
@@ -256,13 +256,7 @@ describe Mongo::Database do
256
256
  end
257
257
 
258
258
  let(:client) do
259
- authorized_client.with(heartbeat_frequency: 100).tap do |cl|
260
- cl.subscribe(Mongo::Monitoring::COMMAND, subscriber)
261
- end
262
- end
263
-
264
- let(:subscriber) do
265
- EventSubscriber.new
259
+ subscribed_client
266
260
  end
267
261
 
268
262
  it_behaves_like 'an operation using a session'
@@ -270,7 +264,7 @@ describe Mongo::Database do
270
264
 
271
265
 
272
266
  let(:full_command) do
273
- subscriber.started_events.find { |cmd| cmd.command_name == :ismaster }.command
267
+ EventSubscriber.started_events.find { |cmd| cmd.command_name == :ismaster }.command
274
268
  end
275
269
 
276
270
  it 'does not add a afterClusterTime field' do
@@ -1,92 +1,96 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'DNS Seedlist Discovery' do
4
- include Mongo::ConnectionString
5
-
6
- before(:all) do
7
-
8
- module Mongo
9
- class Server
10
- # The constructor keeps the same API, but does not instantiate a
11
- # monitor and run it.
12
- alias :original_initialize :initialize
13
-
14
- def initialize(address, cluster, monitoring, event_listeners, options = {})
15
- @address = address
16
- @cluster = cluster
17
- @monitoring = monitoring
18
- @options = options.freeze
19
- @monitor = Monitor.new(address, event_listeners, options)
20
- end
21
4
 
22
- # Disconnect simply needs to return true since we have no monitor and
23
- # no connection.
24
- alias :original_disconnect! :disconnect!
5
+ if test_connecting_externally?
6
+
7
+ include Mongo::ConnectionString
8
+
9
+ before(:all) do
10
+
11
+ module Mongo
12
+ class Server
13
+ # The constructor keeps the same API, but does not instantiate a
14
+ # monitor and run it.
15
+ alias :original_initialize :initialize
25
16
 
26
- def disconnect!;
27
- true;
17
+ def initialize(address, cluster, monitoring, event_listeners, options = {})
18
+ @address = address
19
+ @cluster = cluster
20
+ @monitoring = monitoring
21
+ @options = options.freeze
22
+ @monitor = Monitor.new(address, event_listeners, options)
23
+ end
24
+
25
+ # Disconnect simply needs to return true since we have no monitor and
26
+ # no connection.
27
+ alias :original_disconnect! :disconnect!
28
+
29
+ def disconnect!;
30
+ true;
31
+ end
28
32
  end
29
33
  end
30
34
  end
31
- end
32
35
 
33
- after(:all) do
36
+ after(:all) do
34
37
 
35
- module Mongo
36
- class Server
37
- alias :initialize :original_initialize
38
- remove_method(:original_initialize)
38
+ module Mongo
39
+ class Server
40
+ alias :initialize :original_initialize
41
+ remove_method(:original_initialize)
39
42
 
40
- alias :disconnect! :original_disconnect!
41
- remove_method(:original_disconnect!)
43
+ alias :disconnect! :original_disconnect!
44
+ remove_method(:original_disconnect!)
45
+ end
42
46
  end
43
47
  end
44
- end
45
48
 
46
- DNS_SEEDLIST_DISCOVERY_TESTS.each do |file_name|
49
+ DNS_SEEDLIST_DISCOVERY_TESTS.each do |file_name|
47
50
 
48
- file = File.new(file_name)
49
- spec = YAML.load(ERB.new(file.read).result)
50
- file.close
51
+ file = File.new(file_name)
52
+ spec = YAML.load(ERB.new(file.read).result)
53
+ file.close
51
54
 
52
- test = Mongo::ConnectionString::Test.new(spec)
55
+ test = Mongo::ConnectionString::Test.new(spec)
53
56
 
54
- context(File.basename(file_name)) do
57
+ context(File.basename(file_name), if: test_connecting_externally?) do
55
58
 
56
- context 'when the uri is invalid', if: test.raise_error? do
59
+ context 'when the uri is invalid', if: test.raise_error? do
57
60
 
58
- let(:valid_errors) do
59
- [
60
- Mongo::Error::InvalidTXTRecord,
61
- Mongo::Error::NoSRVRecords,
62
- Mongo::Error::InvalidURI,
63
- Mongo::Error::MismatchedDomain,
64
- ]
65
- end
61
+ let(:valid_errors) do
62
+ [
63
+ Mongo::Error::InvalidTXTRecord,
64
+ Mongo::Error::NoSRVRecords,
65
+ Mongo::Error::InvalidURI,
66
+ Mongo::Error::MismatchedDomain,
67
+ ]
68
+ end
66
69
 
67
- let(:error) do
68
- e = nil
69
- begin; test.uri; rescue => ex; e = ex; end
70
- e
71
- end
70
+ let(:error) do
71
+ e = nil
72
+ begin; test.uri; rescue => ex; e = ex; end
73
+ e
74
+ end
72
75
 
73
- it 'raises an error' do
74
- expect(valid_errors).to include(error.class)
76
+ it 'raises an error' do
77
+ expect(valid_errors).to include(error.class)
78
+ end
75
79
  end
76
- end
77
80
 
78
- context 'when the uri is valid', unless: test.raise_error? do
81
+ context 'when the uri is valid', unless: test.raise_error? do
79
82
 
80
- it 'does not raise an exception' do
81
- expect(test.uri).to be_a(Mongo::URI::SRVProtocol)
82
- end
83
+ it 'does not raise an exception' do
84
+ expect(test.uri).to be_a(Mongo::URI::SRVProtocol)
85
+ end
83
86
 
84
- it 'creates a client with the correct hosts' do
85
- expect(test.client).to have_hosts(test)
86
- end
87
+ it 'creates a client with the correct hosts' do
88
+ expect(test.client).to have_hosts(test)
89
+ end
87
90
 
88
- it 'creates a client with the correct options' do
89
- expect(test.client).to match_options(test)
91
+ it 'creates a client with the correct options' do
92
+ expect(test.client).to match_options(test)
93
+ end
90
94
  end
91
95
  end
92
96
  end