mongo 2.14.1 → 2.15.0.alpha

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 (230) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +4 -1
  4. data/Rakefile +8 -15
  5. data/lib/mongo/auth/aws/conversation.rb +1 -4
  6. data/lib/mongo/auth/base.rb +13 -7
  7. data/lib/mongo/auth/conversation_base.rb +32 -0
  8. data/lib/mongo/auth/cr/conversation.rb +6 -29
  9. data/lib/mongo/auth/gssapi/conversation.rb +4 -15
  10. data/lib/mongo/auth/ldap/conversation.rb +3 -14
  11. data/lib/mongo/auth/sasl_conversation_base.rb +1 -13
  12. data/lib/mongo/auth/scram_conversation_base.rb +7 -34
  13. data/lib/mongo/auth/user/view.rb +16 -9
  14. data/lib/mongo/auth/x509/conversation.rb +4 -25
  15. data/lib/mongo/bulk_write.rb +21 -18
  16. data/lib/mongo/client.rb +82 -6
  17. data/lib/mongo/cluster/reapers/cursor_reaper.rb +6 -2
  18. data/lib/mongo/cluster.rb +19 -2
  19. data/lib/mongo/collection/view/aggregation.rb +1 -1
  20. data/lib/mongo/collection/view/change_stream.rb +1 -1
  21. data/lib/mongo/collection/view/iterable.rb +7 -17
  22. data/lib/mongo/collection/view/map_reduce.rb +2 -2
  23. data/lib/mongo/collection/view/readable.rb +42 -20
  24. data/lib/mongo/collection/view/writable.rb +14 -14
  25. data/lib/mongo/collection.rb +6 -6
  26. data/lib/mongo/cursor.rb +2 -12
  27. data/lib/mongo/database/view.rb +1 -1
  28. data/lib/mongo/database.rb +8 -3
  29. data/lib/mongo/error/bulk_write_error.rb +17 -3
  30. data/lib/mongo/error/internal_driver_error.rb +22 -0
  31. data/lib/mongo/error/operation_failure.rb +21 -2
  32. data/lib/mongo/error/parser.rb +65 -12
  33. data/lib/mongo/error/server_api_conflict.rb +23 -0
  34. data/lib/mongo/error/server_api_not_supported.rb +24 -0
  35. data/lib/mongo/error/unmet_dependency.rb +21 -0
  36. data/lib/mongo/error.rb +9 -1
  37. data/lib/mongo/index/view.rb +21 -11
  38. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +27 -16
  39. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +26 -15
  40. data/lib/mongo/monitoring.rb +13 -4
  41. data/lib/mongo/operation/collections_info/command.rb +2 -2
  42. data/lib/mongo/operation/collections_info.rb +18 -1
  43. data/lib/mongo/operation/context.rb +99 -0
  44. data/lib/mongo/operation/indexes.rb +15 -1
  45. data/lib/mongo/operation/insert/command.rb +2 -2
  46. data/lib/mongo/operation/insert/legacy.rb +2 -2
  47. data/lib/mongo/operation/insert/op_msg.rb +2 -2
  48. data/lib/mongo/operation/list_collections/result.rb +4 -1
  49. data/lib/mongo/operation/parallel_scan/command.rb +2 -1
  50. data/lib/mongo/operation/result.rb +2 -0
  51. data/lib/mongo/operation/shared/executable.rb +24 -14
  52. data/lib/mongo/operation/shared/executable_no_validate.rb +2 -2
  53. data/lib/mongo/operation/shared/op_msg_or_command.rb +1 -7
  54. data/lib/mongo/operation/shared/op_msg_or_find_command.rb +1 -7
  55. data/lib/mongo/operation/shared/polymorphic_operation.rb +39 -0
  56. data/lib/mongo/operation/shared/read_preference_supported.rb +36 -38
  57. data/lib/mongo/operation/shared/response_handling.rb +23 -23
  58. data/lib/mongo/operation/shared/sessions_supported.rb +15 -5
  59. data/lib/mongo/operation/shared/write.rb +8 -18
  60. data/lib/mongo/operation.rb +2 -2
  61. data/lib/mongo/protocol/compressed.rb +51 -5
  62. data/lib/mongo/protocol/message.rb +20 -2
  63. data/lib/mongo/protocol/msg.rb +38 -13
  64. data/lib/mongo/protocol/query.rb +11 -11
  65. data/lib/mongo/query_cache.rb +30 -0
  66. data/lib/mongo/retryable.rb +1 -1
  67. data/lib/mongo/server/app_metadata.rb +52 -18
  68. data/lib/mongo/server/connection.rb +5 -0
  69. data/lib/mongo/server/connection_base.rb +13 -10
  70. data/lib/mongo/server/connection_pool.rb +6 -2
  71. data/lib/mongo/server/description/features.rb +9 -8
  72. data/lib/mongo/server/description.rb +4 -0
  73. data/lib/mongo/server/monitor/app_metadata.rb +1 -1
  74. data/lib/mongo/server/monitor/connection.rb +9 -10
  75. data/lib/mongo/server/monitor.rb +20 -1
  76. data/lib/mongo/server/pending_connection.rb +24 -6
  77. data/lib/mongo/server/push_monitor.rb +11 -1
  78. data/lib/mongo/server.rb +7 -1
  79. data/lib/mongo/server_selector/secondary_preferred.rb +7 -2
  80. data/lib/mongo/session/session_pool.rb +4 -2
  81. data/lib/mongo/session.rb +2 -2
  82. data/lib/mongo/socket/ssl.rb +8 -0
  83. data/lib/mongo/socket.rb +29 -4
  84. data/lib/mongo/uri/options_mapper.rb +38 -0
  85. data/lib/mongo/utils.rb +15 -0
  86. data/lib/mongo/version.rb +1 -1
  87. data/lib/mongo.rb +23 -0
  88. data/spec/README.md +24 -1
  89. data/spec/integration/auth_spec.rb +25 -15
  90. data/spec/integration/bulk_write_error_message_spec.rb +41 -0
  91. data/spec/integration/change_stream_spec.rb +4 -4
  92. data/spec/integration/command_monitoring_spec.rb +2 -2
  93. data/spec/integration/connection_spec.rb +2 -0
  94. data/spec/integration/docs_examples_spec.rb +8 -1
  95. data/spec/integration/fork_reconnect_spec.rb +4 -1
  96. data/spec/integration/ocsp_verifier_spec.rb +13 -7
  97. data/spec/integration/operation_failure_code_spec.rb +1 -1
  98. data/spec/integration/operation_failure_message_spec.rb +90 -0
  99. data/spec/integration/query_cache_spec.rb +0 -45
  100. data/spec/integration/reconnect_spec.rb +1 -1
  101. data/spec/integration/snappy_compression_spec.rb +25 -0
  102. data/spec/integration/srv_monitoring_spec.rb +1 -1
  103. data/spec/integration/transactions_examples_spec.rb +6 -0
  104. data/spec/integration/zlib_compression_spec.rb +1 -1
  105. data/spec/integration/zstd_compression_spec.rb +26 -0
  106. data/spec/lite_spec_helper.rb +7 -1
  107. data/spec/mongo/address_spec.rb +15 -11
  108. data/spec/mongo/auth/ldap/conversation_spec.rb +1 -1
  109. data/spec/mongo/auth/ldap_spec.rb +5 -1
  110. data/spec/mongo/auth/scram_negotiation_spec.rb +1 -1
  111. data/spec/mongo/auth/scram_spec.rb +1 -1
  112. data/spec/mongo/auth/x509/conversation_spec.rb +3 -3
  113. data/spec/mongo/client_construction_spec.rb +207 -33
  114. data/spec/mongo/client_spec.rb +17 -0
  115. data/spec/mongo/cluster_spec.rb +1 -0
  116. data/spec/mongo/collection/view/explainable_spec.rb +1 -1
  117. data/spec/mongo/collection/view/readable_spec.rb +33 -19
  118. data/spec/mongo/collection_crud_spec.rb +4357 -0
  119. data/spec/mongo/collection_ddl_spec.rb +534 -0
  120. data/spec/mongo/collection_spec.rb +5 -4859
  121. data/spec/mongo/database_spec.rb +66 -4
  122. data/spec/mongo/error/bulk_write_error_spec.rb +3 -3
  123. data/spec/mongo/error/parser_spec.rb +37 -6
  124. data/spec/mongo/index/view_spec.rb +4 -0
  125. data/spec/mongo/monitoring/event/server_heartbeat_failed_spec.rb +1 -1
  126. data/spec/mongo/monitoring/event/server_heartbeat_succeeded_spec.rb +1 -1
  127. data/spec/mongo/operation/aggregate_spec.rb +2 -1
  128. data/spec/mongo/operation/collections_info_spec.rb +4 -1
  129. data/spec/mongo/operation/command_spec.rb +6 -3
  130. data/spec/mongo/operation/create_index_spec.rb +6 -3
  131. data/spec/mongo/operation/create_user_spec.rb +6 -3
  132. data/spec/mongo/operation/delete/bulk_spec.rb +9 -6
  133. data/spec/mongo/operation/delete_spec.rb +11 -7
  134. data/spec/mongo/operation/drop_index_spec.rb +6 -2
  135. data/spec/mongo/operation/find/legacy_spec.rb +3 -1
  136. data/spec/mongo/operation/get_more_spec.rb +3 -1
  137. data/spec/mongo/operation/indexes_spec.rb +5 -1
  138. data/spec/mongo/operation/insert/bulk_spec.rb +10 -7
  139. data/spec/mongo/operation/insert_spec.rb +15 -12
  140. data/spec/mongo/operation/map_reduce_spec.rb +5 -2
  141. data/spec/mongo/operation/read_preference_legacy_spec.rb +19 -9
  142. data/spec/mongo/operation/read_preference_op_msg_spec.rb +3 -3
  143. data/spec/mongo/operation/remove_user_spec.rb +6 -3
  144. data/spec/mongo/operation/result_spec.rb +1 -1
  145. data/spec/mongo/operation/update/bulk_spec.rb +9 -6
  146. data/spec/mongo/operation/update_spec.rb +10 -7
  147. data/spec/mongo/operation/update_user_spec.rb +4 -1
  148. data/spec/mongo/protocol/compressed_spec.rb +26 -12
  149. data/spec/mongo/query_cache_middleware_spec.rb +55 -0
  150. data/spec/mongo/retryable_spec.rb +3 -2
  151. data/spec/mongo/server/app_metadata_shared.rb +7 -33
  152. data/spec/mongo/server/app_metadata_spec.rb +2 -0
  153. data/spec/mongo/server/connection_pool/populator_spec.rb +3 -1
  154. data/spec/mongo/server/connection_pool_spec.rb +1 -1
  155. data/spec/mongo/server/connection_spec.rb +24 -17
  156. data/spec/mongo/server/monitor/connection_spec.rb +17 -7
  157. data/spec/mongo/server/monitor_spec.rb +9 -1
  158. data/spec/mongo/server_selector/secondary_preferred_spec.rb +6 -6
  159. data/spec/mongo/server_spec.rb +15 -2
  160. data/spec/mongo/socket/ssl_spec.rb +40 -0
  161. data/spec/mongo/socket_spec.rb +2 -2
  162. data/spec/mongo/tls_context_hooks_spec.rb +37 -0
  163. data/spec/runners/connection_string.rb +0 -4
  164. data/spec/runners/crud/requirement.rb +40 -3
  165. data/spec/runners/crud/verifier.rb +8 -0
  166. data/spec/runners/transactions/operation.rb +1 -1
  167. data/spec/runners/transactions/test.rb +1 -0
  168. data/spec/runners/unified/assertions.rb +249 -0
  169. data/spec/runners/unified/change_stream_operations.rb +26 -0
  170. data/spec/runners/unified/crud_operations.rb +199 -0
  171. data/spec/runners/unified/ddl_operations.rb +96 -0
  172. data/spec/runners/unified/entity_map.rb +39 -0
  173. data/spec/runners/unified/error.rb +25 -0
  174. data/spec/runners/unified/event_subscriber.rb +91 -0
  175. data/spec/runners/unified/exceptions.rb +21 -0
  176. data/spec/runners/unified/grid_fs_operations.rb +55 -0
  177. data/spec/runners/unified/support_operations.rb +250 -0
  178. data/spec/runners/unified/test.rb +393 -0
  179. data/spec/runners/unified/test_group.rb +28 -0
  180. data/spec/runners/unified/using_hash.rb +31 -0
  181. data/spec/runners/unified.rb +96 -0
  182. data/spec/shared/lib/mrss/cluster_config.rb +0 -3
  183. data/spec/shared/lib/mrss/docker_runner.rb +0 -3
  184. data/spec/shared/lib/mrss/lite_constraints.rb +0 -16
  185. data/spec/shared/lib/mrss/server_version_registry.rb +0 -3
  186. data/spec/shared/lib/mrss/spec_organizer.rb +0 -3
  187. data/spec/shared/shlib/server.sh +1 -1
  188. data/spec/spec_helper.rb +4 -1
  189. data/spec/spec_tests/crud_unified_spec.rb +10 -0
  190. data/spec/spec_tests/data/change_streams/change-streams.yml +0 -1
  191. data/spec/spec_tests/data/crud_unified/estimatedDocumentCount.yml +267 -0
  192. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-4.9.yml +60 -0
  193. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount.yml → estimatedDocumentCount-pre4.9.yml} +2 -0
  194. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors-4.9.yml +146 -0
  195. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount-serverErrors.yml → estimatedDocumentCount-serverErrors-pre4.9.yml} +2 -0
  196. data/spec/spec_tests/data/retryable_reads/listIndexNames.yml +1 -1
  197. data/spec/spec_tests/data/unified/valid-fail/operation-failure.yml +31 -0
  198. data/spec/spec_tests/data/unified/valid-pass/poc-change-streams.yml +220 -0
  199. data/spec/spec_tests/data/unified/valid-pass/poc-command-monitoring.yml +102 -0
  200. data/spec/spec_tests/data/unified/valid-pass/poc-crud.yml +184 -0
  201. data/spec/spec_tests/data/unified/valid-pass/poc-gridfs.yml +155 -0
  202. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-reads.yml +193 -0
  203. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-writes.yml +210 -0
  204. data/spec/spec_tests/data/unified/valid-pass/poc-sessions.yml +215 -0
  205. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-convenient-api.yml +235 -0
  206. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-mongos-pin-auto.yml +169 -0
  207. data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +170 -0
  208. data/spec/spec_tests/data/uri_options/compression-options.yml +1 -1
  209. data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +416 -0
  210. data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +409 -0
  211. data/spec/spec_tests/data/versioned_api/runcommand-helper-no-api-version-declared.yml +67 -0
  212. data/spec/spec_tests/data/versioned_api/test-commands-deprecation-errors.yml +47 -0
  213. data/spec/spec_tests/data/versioned_api/test-commands-strict-mode.yml +44 -0
  214. data/spec/spec_tests/data/versioned_api/transaction-handling.yml +180 -0
  215. data/spec/spec_tests/unified_spec.rb +15 -0
  216. data/spec/spec_tests/uri_options_spec.rb +16 -0
  217. data/spec/spec_tests/versioned_api_spec.rb +10 -0
  218. data/spec/support/client_registry.rb +4 -8
  219. data/spec/support/client_registry_macros.rb +4 -4
  220. data/spec/support/common_shortcuts.rb +15 -1
  221. data/spec/support/shared/session.rb +2 -2
  222. data/spec/support/spec_config.rb +42 -11
  223. data/spec/support/utils.rb +64 -3
  224. data.tar.gz.sig +0 -0
  225. metadata +1005 -915
  226. metadata.gz.sig +0 -0
  227. data/lib/mongo/operation/shared/collections_info_or_list_collections.rb +0 -58
  228. data/lib/mongo/operation/shared/op_msg_or_list_indexes_command.rb +0 -47
  229. data/spec/integration/secondary_reads_spec.rb +0 -102
  230. data/spec/support/cluster_config.rb +0 -207
@@ -463,7 +463,56 @@ describe Mongo::Client do
463
463
  SpecConfig.instance.all_test_options.merge(options))
464
464
  end
465
465
 
466
- context 'when the compressor is supported' do
466
+ context 'when the compressor is not supported by the driver' do
467
+ require_warning_clean
468
+
469
+ let(:options) do
470
+ { compressors: ['snoopy'] }
471
+ end
472
+
473
+ it 'does not set the compressor and warns' do
474
+ expect(Mongo::Logger.logger).to receive(:warn)
475
+ expect(client.options['compressors']).to be_nil
476
+ end
477
+
478
+ it 'sets the compression key of the handshake document to an empty array' do
479
+ expect(client.cluster.app_metadata.send(:document)[:compression]).to eq([])
480
+ end
481
+
482
+ context 'when one supported compressor and one unsupported compressor are provided' do
483
+ require_compression
484
+ min_server_fcv '3.6'
485
+
486
+ let(:options) do
487
+ { compressors: ['zlib', 'snoopy'] }
488
+ end
489
+
490
+ it 'does not set the unsupported compressor and warns' do
491
+ expect(Mongo::Logger.logger).to receive(:warn).at_least(:once)
492
+ expect(client.options['compressors']).to eq(['zlib'])
493
+ end
494
+
495
+ it 'sets the compression key of the handshake document to the list of supported compressors' do
496
+ expect(client.cluster.app_metadata.send(:document)[:compression]).to eq(['zlib'])
497
+ end
498
+ end
499
+ end
500
+
501
+ context 'when the compressor is not supported by the server' do
502
+ max_server_version '3.4'
503
+
504
+ let(:options) do
505
+ { compressors: ['zlib'] }
506
+ end
507
+
508
+ it 'does not set the compressor and warns' do
509
+ expect(Mongo::Logger.logger).to receive(:warn).at_least(:once)
510
+ expect(client.cluster.next_primary.monitor.compressor).to be_nil
511
+ end
512
+ end
513
+
514
+ context 'when zlib compression is requested' do
515
+ require_zlib_compression
467
516
 
468
517
  let(:options) do
469
518
  { compressors: ['zlib'] }
@@ -478,7 +527,6 @@ describe Mongo::Client do
478
527
  end
479
528
 
480
529
  context 'when server supports compression' do
481
- require_compression
482
530
  min_server_fcv '3.6'
483
531
 
484
532
  it 'uses compression for messages' do
@@ -495,51 +543,55 @@ describe Mongo::Client do
495
543
  end
496
544
  end
497
545
 
498
- context 'when the compressor is not supported by the driver' do
499
- require_warning_clean
546
+ context 'when snappy compression is requested and supported by the server' do
547
+ min_server_version '3.6'
500
548
 
501
549
  let(:options) do
502
- { compressors: ['snoopy'] }
550
+ { compressors: ['snappy'] }
503
551
  end
504
552
 
505
- it 'does not set the compressor and warns' do
506
- expect(Mongo::Logger.logger).to receive(:warn)
507
- expect(client.options['compressors']).to be_nil
508
- end
509
-
510
- it 'sets the compression key of the handshake document to an empty array' do
511
- expect(client.cluster.app_metadata.send(:document)[:compression]).to eq([])
512
- end
553
+ context 'when snappy gem is installed' do
554
+ require_snappy_compression
513
555
 
514
- context 'when one supported compressor and one unsupported compressor are provided' do
515
- require_compression
516
- min_server_fcv '3.6'
517
-
518
- let(:options) do
519
- { compressors: ['zlib', 'snoopy'] }
556
+ it 'creates the client' do
557
+ expect(client.options['compressors']).to eq(['snappy'])
520
558
  end
559
+ end
521
560
 
522
- it 'does not set the unsupported compressor and warns' do
523
- expect(Mongo::Logger.logger).to receive(:warn).at_least(:once)
524
- expect(client.options['compressors']).to eq(['zlib'])
525
- end
561
+ context 'when snappy gem is not installed' do
562
+ require_no_snappy_compression
526
563
 
527
- it 'sets the compression key of the handshake document to the list of supported compressors' do
528
- expect(client.cluster.app_metadata.send(:document)[:compression]).to eq(['zlib'])
564
+ it 'raises an exception' do
565
+ expect do
566
+ client
567
+ end.to raise_error(Mongo::Error::UnmetDependency, /Cannot enable snappy compression/)
529
568
  end
530
569
  end
531
570
  end
532
571
 
533
- context 'when the compressor is not supported by the server' do
534
- max_server_version '3.4'
572
+ context 'when zstd compression is requested and supported by the server' do
573
+ min_server_version '4.2'
535
574
 
536
575
  let(:options) do
537
- { compressors: ['zlib'] }
576
+ { compressors: ['zstd'] }
538
577
  end
539
578
 
540
- it 'does not set the compressor and warns' do
541
- expect(Mongo::Logger.logger).to receive(:warn).at_least(:once)
542
- expect(client.cluster.next_primary.monitor.compressor).to be_nil
579
+ context 'when zstd gem is installed' do
580
+ require_zstd_compression
581
+
582
+ it 'creates the client' do
583
+ expect(client.options['compressors']).to eq(['zstd'])
584
+ end
585
+ end
586
+
587
+ context 'when zstd gem is not installed' do
588
+ require_no_zstd_compression
589
+
590
+ it 'raises an exception' do
591
+ expect do
592
+ client
593
+ end.to raise_error(Mongo::Error::UnmetDependency, /Cannot enable zstd compression/)
594
+ end
543
595
  end
544
596
  end
545
597
  end
@@ -851,7 +903,8 @@ describe Mongo::Client do
851
903
  [
852
904
  "Ruby #{RUBY_VERSION}",
853
905
  RUBY_PLATFORM,
854
- RbConfig::CONFIG['build']
906
+ RbConfig::CONFIG['build'],
907
+ 'A',
855
908
  ].join(', ')
856
909
  end
857
910
 
@@ -869,7 +922,8 @@ describe Mongo::Client do
869
922
  "like Ruby #{RUBY_VERSION}",
870
923
  RUBY_PLATFORM,
871
924
  "JVM #{java.lang.System.get_property('java.version')}",
872
- RbConfig::CONFIG['build']
925
+ RbConfig::CONFIG['build'],
926
+ 'A',
873
927
  ].join(', ')
874
928
  end
875
929
 
@@ -1547,6 +1601,95 @@ describe Mongo::Client do
1547
1601
  end
1548
1602
  end
1549
1603
  end
1604
+
1605
+ context ':server_api parameter' do
1606
+ context 'is a hash with symbol keys' do
1607
+ context 'using known keys' do
1608
+ let(:options) do
1609
+ {server_api: {
1610
+ version: '1',
1611
+ strict: true,
1612
+ deprecation_errors: false,
1613
+ }}
1614
+ end
1615
+
1616
+ it 'is accepted' do
1617
+ client.options[:server_api].should == {
1618
+ 'version' => '1',
1619
+ 'strict' => true,
1620
+ 'deprecation_errors' => false,
1621
+ }
1622
+ end
1623
+ end
1624
+
1625
+ context 'using an unknown version' do
1626
+ let(:options) do
1627
+ {server_api: {
1628
+ version: '42',
1629
+ }}
1630
+ end
1631
+
1632
+ it 'is rejected' do
1633
+ lambda do
1634
+ client
1635
+ end.should raise_error(ArgumentError, 'Unknown server API version: 42')
1636
+ end
1637
+ end
1638
+
1639
+ context 'using an unknown option' do
1640
+ let(:options) do
1641
+ {server_api: {
1642
+ vversion: '1',
1643
+ }}
1644
+ end
1645
+
1646
+ it 'is rejected' do
1647
+ lambda do
1648
+ client
1649
+ end.should raise_error(ArgumentError, 'Unknown keys under :server_api: "vversion"')
1650
+ end
1651
+ end
1652
+
1653
+ context 'using a value which is not a hash' do
1654
+ let(:options) do
1655
+ {server_api: 42}
1656
+ end
1657
+
1658
+ it 'is rejected' do
1659
+ lambda do
1660
+ client
1661
+ end.should raise_error(ArgumentError, ':server_api value must be a hash: 42')
1662
+ end
1663
+ end
1664
+ end
1665
+
1666
+ context 'when connected to a pre-OP_MSG server' do
1667
+ max_server_version '3.4'
1668
+
1669
+ let(:options) do
1670
+ {server_api: {version: 1}}
1671
+ end
1672
+
1673
+ let(:client) do
1674
+ new_local_client(SpecConfig.instance.addresses,
1675
+ SpecConfig.instance.all_test_options.merge(options))
1676
+ end
1677
+
1678
+ it 'constructs the client' do
1679
+ client.should be_a(Mongo::Client)
1680
+ end
1681
+
1682
+ it 'discovers servers' do
1683
+ client.summary.should_not =~ /UNKNOWN/
1684
+ end
1685
+
1686
+ it 'fails operations' do
1687
+ lambda do
1688
+ client.command(ping: 1)
1689
+ end.should raise_error(Mongo::Error::ServerApiNotSupported)
1690
+ end
1691
+ end
1692
+ end
1550
1693
  end
1551
1694
 
1552
1695
  context 'when making a block client' do
@@ -2187,6 +2330,37 @@ describe Mongo::Client do
2187
2330
  new_client.cluster.topology.class.should_not be Mongo::Cluster::Topology::Unknown
2188
2331
  end
2189
2332
  end
2333
+
2334
+ context 'when :server_api is changed' do
2335
+
2336
+ let(:client) do
2337
+ new_local_client_nmio(['127.0.0.1:27017'])
2338
+ end
2339
+
2340
+ let(:new_client) do
2341
+ client.with(server_api: {version: '1'})
2342
+ end
2343
+
2344
+ it 'changes :server_api' do
2345
+ new_client.options[:server_api].should == {'version' => '1'}
2346
+ end
2347
+ end
2348
+
2349
+ context 'when :server_api is cleared' do
2350
+
2351
+ let(:client) do
2352
+ new_local_client_nmio(['127.0.0.1:27017'], server_api: {version: '1'})
2353
+ end
2354
+
2355
+ let(:new_client) do
2356
+ client.with(server_api: nil)
2357
+ end
2358
+
2359
+ it 'clears :server_api' do
2360
+ new_client.options[:server_api].should be nil
2361
+ end
2362
+ end
2363
+
2190
2364
  end
2191
2365
 
2192
2366
  describe '#dup' do
@@ -538,6 +538,23 @@ describe Mongo::Client do
538
538
  end
539
539
  end
540
540
 
541
+ describe '#database' do
542
+
543
+ let(:database) { client.database }
544
+
545
+ context 'when client has :server_api option' do
546
+
547
+ let(:client) do
548
+ new_local_client_nmio(['localhost'], server_api: {version: '1'})
549
+ end
550
+
551
+ it 'is not transfered to the collection' do
552
+ database.options[:server_api].should be nil
553
+ end
554
+ end
555
+
556
+ end
557
+
541
558
  describe '#database_names' do
542
559
 
543
560
  it 'returns a list of database names' do
@@ -352,6 +352,7 @@ describe Mongo::Cluster do
352
352
  end
353
353
 
354
354
  before do
355
+ cluster.next_primary
355
356
  cluster.servers.each do |server|
356
357
  expect(server).to receive(:reconnect!).and_call_original
357
358
  end
@@ -82,7 +82,7 @@ describe Mongo::Collection::View::Explainable do
82
82
  it 'triggers server error' do
83
83
  lambda do
84
84
  explain
85
- end.should raise_error(Mongo::Error::OperationFailure, /verbosity string must be/)
85
+ end.should raise_error(Mongo::Error::OperationFailure, /verbosity string must be|value .* for field .*verbosity.* is not a valid value/)
86
86
  end
87
87
  end
88
88
 
@@ -604,36 +604,50 @@ describe Mongo::Collection::View::Readable do
604
604
 
605
605
  describe "#estimated_document_count" do
606
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
607
  let(:result) do
617
608
  view.estimated_document_count(options)
618
609
  end
619
610
 
620
- context 'when a selector is provided' do
611
+ context 'when collection has documents' do
612
+ let(:documents) do
613
+ (1..10).map{ |i| { field: "test#{i}" }}
614
+ end
621
615
 
622
- let(:selector) do
623
- { field: 'test1' }
616
+ before do
617
+ authorized_collection.delete_many
618
+ authorized_collection.insert_many(documents)
624
619
  end
625
620
 
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")
621
+ context 'when a selector is provided' do
622
+
623
+ let(:selector) do
624
+ { field: 'test1' }
625
+ end
626
+
627
+ it 'raises an error' do
628
+ expect {
629
+ result
630
+ }.to raise_error(ArgumentError, "Cannot call estimated_document_count when querying with a filter")
631
+ end
632
+ end
633
+
634
+ context 'when no selector is provided' do
635
+
636
+ it 'returns the estimated count of matching documents' do
637
+ expect(view.estimated_document_count).to eq(10)
638
+ end
630
639
  end
631
640
  end
632
641
 
633
- context 'when no selector is provided' do
642
+ context 'when collection does not exist' do
643
+
644
+ let(:view) do
645
+ Mongo::Collection::View.new(
646
+ authorized_client['nonexistent-collection-for-estimated-document-count'], selector, options)
647
+ end
634
648
 
635
- it 'returns the estimated count of matching documents' do
636
- expect(view.estimated_document_count).to eq(10)
649
+ it 'returns 0' do
650
+ view.estimated_document_count.should == 0
637
651
  end
638
652
  end
639
653
  end