mongo 2.0.6 → 2.1.0
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 +5 -2
- data/lib/mongo/address/ipv4.rb +6 -1
- data/lib/mongo/address/unix.rb +2 -2
- data/lib/mongo/address.rb +18 -10
- data/lib/mongo/auth/cr/conversation.rb +1 -1
- data/lib/mongo/auth/ldap/conversation.rb +7 -3
- data/lib/mongo/auth/scram/conversation.rb +9 -3
- data/lib/mongo/auth/user/view.rb +23 -2
- data/lib/mongo/auth/x509/conversation.rb +1 -1
- data/lib/mongo/bulk_write/combineable.rb +51 -0
- data/lib/mongo/bulk_write/ordered_combiner.rb +55 -0
- data/lib/mongo/bulk_write/result.rb +191 -0
- data/lib/mongo/bulk_write/result_combiner.rb +117 -0
- data/lib/mongo/bulk_write/transformable.rb +132 -0
- data/lib/mongo/bulk_write/unordered_combiner.rb +52 -0
- data/lib/mongo/bulk_write/validatable.rb +62 -0
- data/lib/mongo/bulk_write.rb +159 -23
- data/lib/mongo/client.rb +52 -16
- data/lib/mongo/cluster/topology/replica_set.rb +27 -9
- data/lib/mongo/cluster/topology/sharded.rb +1 -1
- data/lib/mongo/cluster/topology/unknown.rb +5 -2
- data/lib/mongo/cluster.rb +42 -7
- data/lib/mongo/collection/view/aggregation.rb +48 -9
- data/lib/mongo/collection/view/immutable.rb +6 -6
- data/lib/mongo/collection/view/iterable.rb +18 -4
- data/lib/mongo/collection/view/map_reduce.rb +58 -17
- data/lib/mongo/collection/view/readable.rb +173 -42
- data/lib/mongo/collection/view/writable.rb +37 -23
- data/lib/mongo/collection/view.rb +2 -2
- data/lib/mongo/collection.rb +370 -33
- data/lib/mongo/cursor.rb +15 -3
- data/lib/mongo/database/view.rb +5 -4
- data/lib/mongo/database.rb +14 -4
- data/lib/mongo/dbref.rb +113 -0
- data/lib/mongo/error/closed_stream.rb +34 -0
- data/lib/mongo/error/extra_file_chunk.rb +34 -0
- data/lib/mongo/error/{invalid_uri_option.rb → file_not_found.rb} +11 -12
- data/lib/mongo/error/invalid_file.rb +2 -2
- data/lib/mongo/error/invalid_file_revision.rb +37 -0
- data/lib/mongo/error/invalid_uri.rb +5 -4
- data/lib/mongo/error/missing_file_chunk.rb +38 -0
- data/lib/mongo/error/operation_failure.rb +1 -1
- data/lib/mongo/error/parser.rb +1 -1
- data/lib/mongo/error/unchangeable_collection_option.rb +38 -0
- data/lib/mongo/error/unexpected_chunk_length.rb +39 -0
- data/lib/mongo/error.rb +13 -2
- data/lib/mongo/event/description_changed.rb +1 -1
- data/lib/mongo/grid/file/chunk.rb +6 -6
- data/lib/mongo/grid/file/{metadata.rb → info.rb} +41 -39
- data/lib/mongo/grid/file.rb +13 -10
- data/lib/mongo/grid/fs_bucket.rb +448 -0
- data/lib/mongo/grid/stream/read.rb +208 -0
- data/lib/mongo/grid/stream/write.rb +187 -0
- data/lib/mongo/grid/stream.rb +64 -0
- data/lib/mongo/grid.rb +2 -1
- data/lib/mongo/index/view.rb +3 -3
- data/lib/mongo/index.rb +5 -0
- data/lib/mongo/loggable.rb +34 -57
- data/lib/mongo/logger.rb +16 -78
- data/lib/mongo/monitoring/command_log_subscriber.rb +112 -0
- data/lib/mongo/monitoring/event/command_failed.rb +96 -0
- data/lib/mongo/monitoring/event/command_started.rb +89 -0
- data/lib/mongo/monitoring/event/command_succeeded.rb +118 -0
- data/lib/mongo/monitoring/event/secure.rb +58 -0
- data/lib/mongo/monitoring/event.rb +18 -0
- data/lib/mongo/monitoring/publishable.rb +106 -0
- data/lib/mongo/monitoring.rb +195 -0
- data/lib/mongo/operation/{aggregate.rb → commands/aggregate.rb} +3 -41
- data/lib/mongo/operation/commands/collections_info/result.rb +39 -0
- data/lib/mongo/operation/commands/collections_info.rb +68 -0
- data/lib/mongo/operation/{command.rb → commands/command.rb} +2 -18
- data/lib/mongo/operation/commands/indexes.rb +70 -0
- data/lib/mongo/operation/commands/list_collections/result.rb +112 -0
- data/lib/mongo/operation/commands/list_collections.rb +54 -0
- data/lib/mongo/operation/commands/list_indexes/result.rb +116 -0
- data/lib/mongo/operation/commands/list_indexes.rb +56 -0
- data/lib/mongo/operation/{map_reduce → commands/map_reduce}/result.rb +1 -1
- data/lib/mongo/operation/{map_reduce.rb → commands/map_reduce.rb} +3 -41
- data/lib/mongo/operation/commands/parallel_scan/result.rb +72 -0
- data/lib/mongo/operation/commands/parallel_scan.rb +56 -0
- data/lib/mongo/operation/commands/user_query.rb +69 -0
- data/lib/mongo/{bulk_write/ordered_bulk_write.rb → operation/commands/users_info/result.rb} +18 -30
- data/lib/mongo/operation/commands/users_info.rb +53 -0
- data/lib/mongo/operation/commands.rb +24 -0
- data/lib/mongo/operation/executable.rb +4 -68
- data/lib/mongo/operation/kill_cursors.rb +3 -3
- data/lib/mongo/operation/read/get_more.rb +2 -22
- data/lib/mongo/{bulk_write/unordered_bulk_write.rb → operation/read/query/result.rb} +20 -26
- data/lib/mongo/operation/read/query.rb +4 -21
- data/lib/mongo/operation/read.rb +0 -4
- data/lib/mongo/operation/{read_preferrable.rb → read_preference.rb} +3 -2
- data/lib/mongo/operation/result.rb +13 -1
- data/lib/mongo/operation/specifiable.rb +42 -0
- data/lib/mongo/operation/write/bulk/bulkable.rb +82 -0
- data/lib/mongo/operation/write/bulk/delete/result.rb +74 -0
- data/lib/mongo/operation/write/bulk/delete.rb +71 -0
- data/lib/mongo/operation/write/bulk/insert/result.rb +129 -0
- data/lib/mongo/operation/write/bulk/insert.rb +96 -0
- data/lib/mongo/operation/write/bulk/legacy_mergable.rb +87 -0
- data/lib/mongo/operation/write/bulk/mergable.rb +71 -0
- data/lib/mongo/operation/write/bulk/update/result.rb +174 -0
- data/lib/mongo/operation/write/bulk/update.rb +81 -0
- data/lib/mongo/operation/write/bulk.rb +6 -3
- data/lib/mongo/operation/write/command/create_index.rb +0 -1
- data/lib/mongo/operation/write/command/create_user.rb +0 -1
- data/lib/mongo/operation/write/command/delete.rb +0 -1
- data/lib/mongo/operation/write/command/drop_index.rb +0 -1
- data/lib/mongo/operation/write/command/insert.rb +0 -1
- data/lib/mongo/operation/write/command/remove_user.rb +0 -1
- data/lib/mongo/operation/write/command/update.rb +0 -1
- data/lib/mongo/operation/write/command/update_user.rb +0 -1
- data/lib/mongo/operation/write/command/writable.rb +13 -18
- data/lib/mongo/operation/write/create_index.rb +4 -27
- data/lib/mongo/operation/write/create_user.rb +4 -30
- data/lib/mongo/operation/write/delete.rb +6 -29
- data/lib/mongo/operation/write/drop_index.rb +3 -3
- data/lib/mongo/operation/write/gle.rb +48 -0
- data/lib/mongo/operation/write/idable.rb +5 -0
- data/lib/mongo/operation/write/insert.rb +2 -24
- data/lib/mongo/operation/write/remove_user.rb +4 -27
- data/lib/mongo/operation/write/update.rb +13 -36
- data/lib/mongo/operation/write/update_user.rb +4 -30
- data/lib/mongo/operation/write/write_command_enabled.rb +53 -0
- data/lib/mongo/operation/write.rb +2 -0
- data/lib/mongo/operation.rb +32 -4
- data/lib/mongo/options/mapper.rb +4 -2
- data/lib/mongo/options/redacted.rb +156 -0
- data/lib/mongo/options.rb +1 -0
- data/lib/mongo/protocol/delete.rb +75 -15
- data/lib/mongo/protocol/get_more.rb +65 -13
- data/lib/mongo/protocol/insert.rb +85 -13
- data/lib/mongo/protocol/kill_cursors.rb +59 -14
- data/lib/mongo/protocol/message.rb +12 -12
- data/lib/mongo/protocol/query.rb +163 -37
- data/lib/mongo/protocol/reply.rb +103 -0
- data/lib/mongo/protocol/serializers.rb +1 -1
- data/lib/mongo/protocol/update.rb +82 -14
- data/lib/mongo/retryable.rb +83 -0
- data/lib/mongo/server/connectable.rb +21 -25
- data/lib/mongo/server/connection.rb +75 -4
- data/lib/mongo/server/connection_pool/queue.rb +15 -0
- data/lib/mongo/server/connection_pool.rb +12 -0
- data/lib/mongo/server/description/features.rb +2 -1
- data/lib/mongo/server/description.rb +52 -1
- data/lib/mongo/server/monitor/connection.rb +26 -2
- data/lib/mongo/server/monitor.rb +19 -3
- data/lib/mongo/server.rb +39 -5
- data/lib/mongo/server_selector/selectable.rb +40 -31
- data/lib/mongo/server_selector.rb +19 -10
- data/lib/mongo/socket/ssl.rb +28 -16
- data/lib/mongo/socket/tcp.rb +3 -3
- data/lib/mongo/socket/unix.rb +5 -8
- data/lib/mongo/socket.rb +11 -4
- data/lib/mongo/uri.rb +248 -137
- data/lib/mongo/version.rb +1 -1
- data/lib/mongo.rb +5 -3
- data/spec/mongo/address/unix_spec.rb +1 -1
- data/spec/mongo/address_spec.rb +25 -0
- data/spec/mongo/auth/cr_spec.rb +9 -1
- data/spec/mongo/auth/ldap/conversation_spec.rb +43 -0
- data/spec/mongo/auth/ldap_spec.rb +9 -1
- data/spec/mongo/auth/scram_spec.rb +9 -1
- data/spec/mongo/auth/user/view_spec.rb +26 -1
- data/spec/mongo/auth/x509_spec.rb +9 -1
- data/spec/mongo/bulk_write/ordered_combiner_spec.rb +271 -0
- data/spec/mongo/bulk_write/unordered_combiner_spec.rb +239 -0
- data/spec/mongo/bulk_write_spec.rb +428 -0
- data/spec/mongo/client_spec.rb +167 -17
- data/spec/mongo/cluster/topology/replica_set_spec.rb +18 -9
- data/spec/mongo/cluster/topology/sharded_spec.rb +11 -3
- data/spec/mongo/cluster/topology/single_spec.rb +12 -4
- data/spec/mongo/cluster_spec.rb +55 -10
- data/spec/mongo/collection/view/aggregation_spec.rb +188 -1
- data/spec/mongo/collection/view/explainable_spec.rb +1 -1
- data/spec/mongo/collection/view/immutable_spec.rb +103 -0
- data/spec/mongo/collection/view/map_reduce_spec.rb +99 -4
- data/spec/mongo/collection/view/readable_spec.rb +238 -6
- data/spec/mongo/collection/view/writable_spec.rb +4 -4
- data/spec/mongo/collection/view_spec.rb +459 -71
- data/spec/mongo/collection_spec.rb +1291 -9
- data/spec/mongo/command_monitoring_spec.rb +51 -0
- data/spec/mongo/connection_string_spec.rb +115 -0
- data/spec/mongo/crud_spec.rb +2 -2
- data/spec/mongo/cursor_spec.rb +3 -3
- data/spec/mongo/database_spec.rb +47 -11
- data/spec/mongo/dbref_spec.rb +149 -0
- data/spec/mongo/grid/file/chunk_spec.rb +5 -5
- data/spec/mongo/grid/file/{metadata_spec.rb → info_spec.rb} +29 -17
- data/spec/mongo/grid/file_spec.rb +8 -8
- data/spec/mongo/grid/fs_bucket_spec.rb +1020 -0
- data/spec/mongo/grid/stream/read_spec.rb +275 -0
- data/spec/mongo/grid/stream/write_spec.rb +440 -0
- data/spec/mongo/grid/stream_spec.rb +48 -0
- data/spec/mongo/gridfs_spec.rb +50 -0
- data/spec/mongo/logger_spec.rb +0 -40
- data/spec/mongo/monitoring/command_log_subscriber_spec.rb +76 -0
- data/spec/mongo/monitoring/event/command_started_spec.rb +26 -0
- data/spec/mongo/monitoring/event/command_succeeded_spec.rb +26 -0
- data/spec/mongo/monitoring/event/secure_spec.rb +57 -0
- data/spec/mongo/monitoring_spec.rb +168 -0
- data/spec/mongo/operation/commands/aggregate_spec.rb +69 -0
- data/spec/mongo/operation/{read → commands}/collections_info_spec.rb +1 -1
- data/spec/mongo/operation/{command_spec.rb → commands/command_spec.rb} +0 -18
- data/spec/mongo/operation/{read → commands}/indexes_spec.rb +1 -1
- data/spec/mongo/operation/{map_reduce_spec.rb → commands/map_reduce_spec.rb} +1 -19
- data/spec/mongo/operation/kill_cursors_spec.rb +1 -17
- data/spec/mongo/operation/read/get_more_spec.rb +0 -16
- data/spec/mongo/operation/read/query_spec.rb +19 -16
- data/spec/mongo/operation/{read_preferrable_spec.rb → read_preference_spec.rb} +11 -11
- data/spec/mongo/operation/write/bulk/{bulk_delete_spec.rb → delete_spec.rb} +18 -29
- data/spec/mongo/operation/write/bulk/{bulk_insert_spec.rb → insert_spec.rb} +3 -14
- data/spec/mongo/operation/write/bulk/{bulk_update_spec.rb → update_spec.rb} +8 -19
- data/spec/mongo/operation/write/command/delete_spec.rb +0 -16
- data/spec/mongo/operation/write/command/insert_spec.rb +0 -16
- data/spec/mongo/operation/write/command/update_spec.rb +0 -16
- data/spec/mongo/operation/write/delete_spec.rb +4 -4
- data/spec/mongo/operation/write/insert_spec.rb +2 -13
- data/spec/mongo/operation/write/update_spec.rb +7 -7
- data/spec/mongo/options/redacted_spec.rb +350 -0
- data/spec/mongo/protocol/kill_cursors_spec.rb +5 -3
- data/spec/mongo/protocol/query_spec.rb +15 -30
- data/spec/mongo/retryable_spec.rb +147 -0
- data/spec/mongo/server/connection_pool/queue_spec.rb +16 -0
- data/spec/mongo/server/connection_pool_spec.rb +50 -6
- data/spec/mongo/server/connection_spec.rb +49 -4
- data/spec/mongo/server/description_spec.rb +49 -3
- data/spec/mongo/server/monitor_spec.rb +51 -0
- data/spec/mongo/server_discovery_and_monitoring_spec.rb +32 -59
- data/spec/mongo/server_selection_rtt_spec.rb +37 -57
- data/spec/mongo/server_selection_spec.rb +19 -9
- data/spec/mongo/server_selector/nearest_spec.rb +35 -27
- data/spec/mongo/server_selector/primary_preferred_spec.rb +32 -30
- data/spec/mongo/server_selector/primary_spec.rb +21 -14
- data/spec/mongo/server_selector/secondary_preferred_spec.rb +28 -26
- data/spec/mongo/server_selector/secondary_spec.rb +24 -22
- data/spec/mongo/server_selector_spec.rb +87 -24
- data/spec/mongo/server_spec.rb +94 -8
- data/spec/mongo/socket/ssl_spec.rb +123 -13
- data/spec/mongo/socket/unix_spec.rb +52 -0
- data/spec/mongo/uri_spec.rb +295 -67
- data/spec/spec_helper.rb +40 -24
- data/spec/support/authorization.rb +23 -9
- data/spec/support/certificates/client.pem +4 -4
- data/spec/support/command_monitoring/bulkWrite.yml +73 -0
- data/spec/support/command_monitoring/command.yml +42 -0
- data/spec/support/command_monitoring/deleteMany.yml +55 -0
- data/spec/support/command_monitoring/deleteOne.yml +55 -0
- data/spec/support/command_monitoring/find.yml +219 -0
- data/spec/support/command_monitoring/insertMany.yml +81 -0
- data/spec/support/command_monitoring/insertOne.yml +51 -0
- data/spec/support/command_monitoring/updateMany.yml +67 -0
- data/spec/support/command_monitoring/updateOne.yml +95 -0
- data/spec/support/command_monitoring.rb +365 -0
- data/spec/support/connection_string.rb +228 -0
- data/spec/support/connection_string_tests/invalid-uris.yml +193 -0
- data/spec/support/connection_string_tests/valid-auth.yml +256 -0
- data/spec/support/connection_string_tests/valid-host_identifiers.yml +121 -0
- data/spec/support/connection_string_tests/valid-options.yml +30 -0
- data/spec/support/connection_string_tests/valid-unix_socket-absolute.yml +197 -0
- data/spec/support/connection_string_tests/valid-unix_socket-relative.yml +213 -0
- data/spec/support/connection_string_tests/valid-warnings.yml +55 -0
- data/spec/support/crud/read.rb +22 -19
- data/spec/support/crud/write.rb +58 -27
- data/spec/support/crud.rb +10 -2
- data/spec/support/gridfs.rb +637 -0
- data/spec/support/gridfs_tests/delete.yml +157 -0
- data/spec/support/gridfs_tests/download.yml +210 -0
- data/spec/support/gridfs_tests/download_by_name.yml +113 -0
- data/spec/support/gridfs_tests/upload.yml +158 -0
- data/spec/support/matchers.rb +1 -1
- data/spec/support/sdam/rs/equal_electionids.yml +44 -0
- data/spec/support/sdam/rs/new_primary_new_electionid.yml +95 -0
- data/spec/support/sdam/rs/null_election_id.yml +144 -0
- data/spec/support/sdam/rs/primary_disconnect_electionid.yml +124 -0
- data/spec/support/sdam/rs/primary_mismatched_me.yml +37 -0
- data/spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml +75 -0
- data/spec/support/sdam/rs/secondary_mismatched_me.yml +37 -0
- data/spec/support/sdam/sharded/mongos_disconnect.yml +104 -0
- data/spec/support/sdam/single/direct_connection_rsarbiter.yml +1 -1
- data/spec/support/sdam/single/direct_connection_rsprimary.yml +1 -1
- data/spec/support/sdam/single/direct_connection_rssecondary.yml +1 -1
- data/spec/support/sdam/single/direct_connection_slave.yml +1 -1
- data/spec/support/sdam/single/direct_connection_standalone.yml +1 -1
- data/spec/support/sdam/single/not_ok_response.yml +0 -1
- data/spec/support/server_discovery_and_monitoring.rb +22 -3
- data/spec/support/server_selection.rb +3 -1
- data/spec/support/shared/bulk_write.rb +218 -22
- data/spec/support/shared/server_selector.rb +80 -14
- data.tar.gz.sig +0 -0
- metadata +188 -59
- metadata.gz.sig +0 -0
- data/lib/mongo/bulk_write/bulk_writable.rb +0 -196
- data/lib/mongo/bulk_write/deletable.rb +0 -56
- data/lib/mongo/bulk_write/insertable.rb +0 -48
- data/lib/mongo/bulk_write/replacable.rb +0 -57
- data/lib/mongo/bulk_write/updatable.rb +0 -68
- data/lib/mongo/grid/fs.rb +0 -149
- data/lib/mongo/operation/list_collections/result.rb +0 -114
- data/lib/mongo/operation/list_indexes/result.rb +0 -118
- data/lib/mongo/operation/read/collections_info.rb +0 -68
- data/lib/mongo/operation/read/indexes.rb +0 -69
- data/lib/mongo/operation/read/list_collections.rb +0 -76
- data/lib/mongo/operation/read/list_indexes.rb +0 -78
- data/lib/mongo/operation/write/bulk/bulk_delete/result.rb +0 -75
- data/lib/mongo/operation/write/bulk/bulk_delete.rb +0 -145
- data/lib/mongo/operation/write/bulk/bulk_insert/result.rb +0 -130
- data/lib/mongo/operation/write/bulk/bulk_insert.rb +0 -132
- data/lib/mongo/operation/write/bulk/bulk_mergable.rb +0 -67
- data/lib/mongo/operation/write/bulk/bulk_update/result.rb +0 -162
- data/lib/mongo/operation/write/bulk/bulk_update.rb +0 -154
- data/lib/mongo/operation/write/bulk/legacy_bulk_mergable.rb +0 -83
- data/spec/mongo/bulk/bulk_write_spec.rb +0 -262
- data/spec/mongo/grid/fs_spec.rb +0 -160
- data/spec/mongo/loggable_spec.rb +0 -63
- data/spec/mongo/operation/aggregate_spec.rb +0 -127
- /data/lib/mongo/operation/{aggregate → commands/aggregate}/result.rb +0 -0
@@ -0,0 +1,350 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Mongo::Options::Redacted do
|
4
|
+
|
5
|
+
let(:options) do
|
6
|
+
described_class.new(original_opts)
|
7
|
+
end
|
8
|
+
|
9
|
+
describe '#to_s' do
|
10
|
+
|
11
|
+
context 'when the hash contains a sensitive key' do
|
12
|
+
|
13
|
+
let(:original_opts) do
|
14
|
+
{ password: 'sensitive_data' }
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'replaces the value with the redacted string' do
|
18
|
+
expect(options.to_s).not_to match(original_opts[:password])
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'replaces the value with the redacted string' do
|
22
|
+
expect(options.to_s).to match(Mongo::Options::Redacted::STRING_REPLACEMENT)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
context 'when the hash does not contain a sensitive key' do
|
27
|
+
|
28
|
+
let(:original_opts) do
|
29
|
+
{ user: 'emily' }
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'prints all the values' do
|
33
|
+
expect(options.to_s).to match(original_opts[:user])
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe '#inspect' do
|
39
|
+
|
40
|
+
context 'when the hash contains a sensitive key' do
|
41
|
+
|
42
|
+
let(:original_opts) do
|
43
|
+
{ password: 'sensitive_data' }
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'replaces the value with the redacted string' do
|
47
|
+
expect(options.inspect).not_to match(original_opts[:password])
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'replaces the value with the redacted string' do
|
51
|
+
expect(options.inspect).to match(Mongo::Options::Redacted::STRING_REPLACEMENT)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context 'when the hash does not contain a sensitive key' do
|
56
|
+
|
57
|
+
let(:original_opts) do
|
58
|
+
{ name: 'some_name' }
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'does not replace the value with the redacted string' do
|
62
|
+
expect(options.inspect).to match(original_opts[:name])
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'does not replace the value with the redacted string' do
|
66
|
+
expect(options.inspect).not_to match(Mongo::Options::Redacted::STRING_REPLACEMENT)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
describe '#has_key?' do
|
72
|
+
|
73
|
+
context 'when the original key is a String' do
|
74
|
+
|
75
|
+
let(:original_opts) do
|
76
|
+
{ 'name' => 'Emily' }
|
77
|
+
end
|
78
|
+
|
79
|
+
context 'when the method argument is a String' do
|
80
|
+
|
81
|
+
it 'returns true' do
|
82
|
+
expect(options.has_key?('name')).to be(true)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
context 'when method argument is a Symbol' do
|
87
|
+
|
88
|
+
it 'returns true' do
|
89
|
+
expect(options.has_key?(:name)).to be(true)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
context 'when the original key is a Symbol' do
|
95
|
+
|
96
|
+
let(:original_opts) do
|
97
|
+
{ name: 'Emily' }
|
98
|
+
end
|
99
|
+
|
100
|
+
context 'when the method argument is a String' do
|
101
|
+
|
102
|
+
it 'returns true' do
|
103
|
+
expect(options.has_key?('name')).to be(true)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
context 'when method argument is a Symbol' do
|
108
|
+
|
109
|
+
it 'returns true' do
|
110
|
+
expect(options.has_key?(:name)).to be(true)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
context 'when the hash does not contain the key' do
|
116
|
+
|
117
|
+
let(:original_opts) do
|
118
|
+
{ other: 'Emily' }
|
119
|
+
end
|
120
|
+
|
121
|
+
context 'when the method argument is a String' do
|
122
|
+
|
123
|
+
it 'returns false' do
|
124
|
+
expect(options.has_key?('name')).to be(false)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
context 'when method argument is a Symbol' do
|
129
|
+
|
130
|
+
it 'returns false' do
|
131
|
+
expect(options.has_key?(:name)).to be(false)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
describe '#reject' do
|
138
|
+
|
139
|
+
let(:options) do
|
140
|
+
described_class.new(a: 1, b: 2, c: 3)
|
141
|
+
end
|
142
|
+
|
143
|
+
context 'when no block is provided' do
|
144
|
+
|
145
|
+
it 'returns an enumerable' do
|
146
|
+
expect(options.reject).to be_a(Enumerator)
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
context 'when a block is provided' do
|
151
|
+
|
152
|
+
context 'when the block evaluates to true for some pairs' do
|
153
|
+
|
154
|
+
let(:result) do
|
155
|
+
options.reject { |k,v| k == 'a' }
|
156
|
+
end
|
157
|
+
|
158
|
+
it 'returns an object consisting of only the remaining pairs' do
|
159
|
+
expect(result).to eq(described_class.new(b: 2, c: 3))
|
160
|
+
end
|
161
|
+
|
162
|
+
it 'returns a new object' do
|
163
|
+
expect(result).not_to be(options)
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
context 'when the block does not evaluate to true for any pairs' do
|
168
|
+
|
169
|
+
let(:result) do
|
170
|
+
options.reject { |k,v| k == 'd' }
|
171
|
+
end
|
172
|
+
|
173
|
+
it 'returns an object with all pairs intact' do
|
174
|
+
expect(result).to eq(described_class.new(a: 1, b: 2, c: 3))
|
175
|
+
end
|
176
|
+
|
177
|
+
it 'returns a new object' do
|
178
|
+
expect(result).not_to be(options)
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
describe '#reject!' do
|
185
|
+
|
186
|
+
let(:options) do
|
187
|
+
described_class.new(a: 1, b: 2, c: 3)
|
188
|
+
end
|
189
|
+
|
190
|
+
context 'when no block is provided' do
|
191
|
+
|
192
|
+
it 'returns an enumerable' do
|
193
|
+
expect(options.reject).to be_a(Enumerator)
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
context 'when a block is provided' do
|
198
|
+
|
199
|
+
context 'when the block evaluates to true for some pairs' do
|
200
|
+
|
201
|
+
let(:result) do
|
202
|
+
options.reject! { |k,v| k == 'a' }
|
203
|
+
end
|
204
|
+
|
205
|
+
it 'returns an object consisting of only the remaining pairs' do
|
206
|
+
expect(result).to eq(described_class.new(b: 2, c: 3))
|
207
|
+
end
|
208
|
+
|
209
|
+
it 'returns the same object' do
|
210
|
+
expect(result).to be(options)
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
context 'when the block does not evaluate to true for any pairs' do
|
215
|
+
|
216
|
+
let(:result) do
|
217
|
+
options.reject! { |k,v| k == 'd' }
|
218
|
+
end
|
219
|
+
|
220
|
+
it 'returns nil' do
|
221
|
+
expect(result).to be(nil)
|
222
|
+
end
|
223
|
+
end
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
describe '#select' do
|
228
|
+
|
229
|
+
let(:options) do
|
230
|
+
described_class.new(a: 1, b: 2, c: 3)
|
231
|
+
end
|
232
|
+
|
233
|
+
context 'when no block is provided' do
|
234
|
+
|
235
|
+
it 'returns an enumerable' do
|
236
|
+
expect(options.reject).to be_a(Enumerator)
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
240
|
+
context 'when a block is provided' do
|
241
|
+
|
242
|
+
context 'when the block evaluates to true for some pairs' do
|
243
|
+
|
244
|
+
let(:result) do
|
245
|
+
options.select { |k,v| k == 'a' }
|
246
|
+
end
|
247
|
+
|
248
|
+
it 'returns an object consisting of those pairs' do
|
249
|
+
expect(result).to eq(described_class.new(a: 1))
|
250
|
+
end
|
251
|
+
|
252
|
+
it 'returns a new object' do
|
253
|
+
expect(result).not_to be(options)
|
254
|
+
end
|
255
|
+
end
|
256
|
+
|
257
|
+
context 'when the block does not evaluate to true for any pairs' do
|
258
|
+
|
259
|
+
let(:result) do
|
260
|
+
options.select { |k,v| k == 'd' }
|
261
|
+
end
|
262
|
+
|
263
|
+
it 'returns an object with no pairs' do
|
264
|
+
expect(result).to eq(described_class.new)
|
265
|
+
end
|
266
|
+
|
267
|
+
it 'returns a new object' do
|
268
|
+
expect(result).not_to be(options)
|
269
|
+
end
|
270
|
+
end
|
271
|
+
|
272
|
+
context 'when the object is unchanged' do
|
273
|
+
|
274
|
+
let(:options) do
|
275
|
+
described_class.new(a: 1, b: 2, c: 3)
|
276
|
+
end
|
277
|
+
|
278
|
+
let(:result) do
|
279
|
+
options.select { |k,v| ['a', 'b', 'c'].include?(k) }
|
280
|
+
end
|
281
|
+
|
282
|
+
it 'returns a new object' do
|
283
|
+
expect(result).to eq(described_class.new(a: 1, b: 2, c: 3))
|
284
|
+
end
|
285
|
+
end
|
286
|
+
end
|
287
|
+
end
|
288
|
+
|
289
|
+
describe '#select!' do
|
290
|
+
|
291
|
+
let(:options) do
|
292
|
+
described_class.new(a: 1, b: 2, c: 3)
|
293
|
+
end
|
294
|
+
|
295
|
+
context 'when no block is provided' do
|
296
|
+
|
297
|
+
it 'returns an enumerable' do
|
298
|
+
expect(options.reject).to be_a(Enumerator)
|
299
|
+
end
|
300
|
+
end
|
301
|
+
|
302
|
+
context 'when a block is provided' do
|
303
|
+
|
304
|
+
context 'when the block evaluates to true for some pairs' do
|
305
|
+
|
306
|
+
let(:result) do
|
307
|
+
options.select! { |k,v| k == 'a' }
|
308
|
+
end
|
309
|
+
|
310
|
+
it 'returns an object consisting of those pairs' do
|
311
|
+
expect(result).to eq(described_class.new(a: 1))
|
312
|
+
end
|
313
|
+
|
314
|
+
it 'returns the same object' do
|
315
|
+
expect(result).to be(options)
|
316
|
+
end
|
317
|
+
end
|
318
|
+
|
319
|
+
context 'when the block does not evaluate to true for any pairs' do
|
320
|
+
|
321
|
+
let(:result) do
|
322
|
+
options.select! { |k,v| k == 'd' }
|
323
|
+
end
|
324
|
+
|
325
|
+
it 'returns an object with no pairs' do
|
326
|
+
expect(result).to eq(described_class.new)
|
327
|
+
end
|
328
|
+
|
329
|
+
it 'returns the same object' do
|
330
|
+
expect(result).to be(options)
|
331
|
+
end
|
332
|
+
end
|
333
|
+
|
334
|
+
context 'when the object is unchanged' do
|
335
|
+
|
336
|
+
let(:options) do
|
337
|
+
described_class.new(a: 1, b: 2, c: 3)
|
338
|
+
end
|
339
|
+
|
340
|
+
let(:result) do
|
341
|
+
options.select! { |k,v| ['a', 'b', 'c'].include?(k) }
|
342
|
+
end
|
343
|
+
|
344
|
+
it 'returns nil' do
|
345
|
+
expect(result).to be(nil)
|
346
|
+
end
|
347
|
+
end
|
348
|
+
end
|
349
|
+
end
|
350
|
+
end
|
@@ -5,8 +5,10 @@ describe Mongo::Protocol::KillCursors do
|
|
5
5
|
let(:opcode) { 2007 }
|
6
6
|
let(:cursor_ids) { [123, 456, 789] }
|
7
7
|
let(:id_count) { cursor_ids.size }
|
8
|
+
let(:collection) { TEST_COLL }
|
9
|
+
let(:database) { TEST_DB }
|
8
10
|
let(:message) do
|
9
|
-
described_class.new(cursor_ids)
|
11
|
+
described_class.new(collection, database, cursor_ids)
|
10
12
|
end
|
11
13
|
|
12
14
|
describe '#initialize' do
|
@@ -26,7 +28,7 @@ describe Mongo::Protocol::KillCursors do
|
|
26
28
|
|
27
29
|
context 'when the cursor ids are equal' do
|
28
30
|
let(:other) do
|
29
|
-
described_class.new(cursor_ids)
|
31
|
+
described_class.new(collection, database, cursor_ids)
|
30
32
|
end
|
31
33
|
|
32
34
|
it 'returns true' do
|
@@ -36,7 +38,7 @@ describe Mongo::Protocol::KillCursors do
|
|
36
38
|
|
37
39
|
context 'when the cursor ids are not equal' do
|
38
40
|
let(:other) do
|
39
|
-
described_class.new([123, 456])
|
41
|
+
described_class.new(collection, database, [123, 456])
|
40
42
|
end
|
41
43
|
|
42
44
|
it 'returns false' do
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# encoding: UTF-8
|
1
2
|
require 'spec_helper'
|
2
3
|
|
3
4
|
describe Mongo::Protocol::Query do
|
@@ -15,7 +16,7 @@ describe Mongo::Protocol::Query do
|
|
15
16
|
|
16
17
|
describe '#initialize' do
|
17
18
|
|
18
|
-
it 'sets the
|
19
|
+
it 'sets the namespace' do
|
19
20
|
expect(message.namespace).to eq(ns)
|
20
21
|
end
|
21
22
|
|
@@ -220,6 +221,19 @@ describe Mongo::Protocol::Query do
|
|
220
221
|
it 'serializes the namespace' do
|
221
222
|
expect(field).to be_cstring(ns)
|
222
223
|
end
|
224
|
+
|
225
|
+
context 'when the namespace contains unicode characters' do
|
226
|
+
let(:field) { bytes[20..40] }
|
227
|
+
|
228
|
+
let(:coll) do
|
229
|
+
'områder'
|
230
|
+
end
|
231
|
+
|
232
|
+
it 'serializes the namespace' do
|
233
|
+
expect(field).to be_cstring(ns)
|
234
|
+
end
|
235
|
+
|
236
|
+
end
|
223
237
|
end
|
224
238
|
|
225
239
|
describe 'skip' do
|
@@ -282,33 +296,4 @@ describe Mongo::Protocol::Query do
|
|
282
296
|
end
|
283
297
|
end
|
284
298
|
end
|
285
|
-
|
286
|
-
describe '#log_message' do
|
287
|
-
|
288
|
-
context 'when the selector is greater than LOG_STRING_LIMIT characters' do
|
289
|
-
|
290
|
-
let(:selector) do
|
291
|
-
'z'*260
|
292
|
-
end
|
293
|
-
|
294
|
-
it 'Only prints LOG_STRING_LIMIT number of characters' do
|
295
|
-
expect(message.log_message.scan(/z/).length).to eq(Mongo::Protocol::Query::LOG_STRING_LIMIT)
|
296
|
-
end
|
297
|
-
end
|
298
|
-
|
299
|
-
context 'when the selector cannot be inspected' do
|
300
|
-
|
301
|
-
let(:selector) do
|
302
|
-
'invalid string'
|
303
|
-
end
|
304
|
-
|
305
|
-
before do
|
306
|
-
allow(selector).to receive(:inspect).and_raise(ArgumentError)
|
307
|
-
end
|
308
|
-
|
309
|
-
it 'Does not include the selector in the log message' do
|
310
|
-
expect(message.log_message.scan(/invalid string/).length).to eq(0)
|
311
|
-
end
|
312
|
-
end
|
313
|
-
end
|
314
299
|
end
|
@@ -0,0 +1,147 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Mongo::Retryable do
|
4
|
+
|
5
|
+
let(:klass) do
|
6
|
+
Class.new do
|
7
|
+
include Mongo::Retryable
|
8
|
+
|
9
|
+
attr_reader :cluster
|
10
|
+
attr_reader :operation
|
11
|
+
|
12
|
+
def initialize(operation, cluster)
|
13
|
+
@operation = operation
|
14
|
+
@cluster = cluster
|
15
|
+
end
|
16
|
+
|
17
|
+
def read
|
18
|
+
read_with_retry do
|
19
|
+
operation.execute
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def write
|
24
|
+
write_with_retry do
|
25
|
+
operation.execute
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe '#read_with_retry' do
|
32
|
+
|
33
|
+
let(:operation) do
|
34
|
+
double('operation')
|
35
|
+
end
|
36
|
+
|
37
|
+
let(:cluster) do
|
38
|
+
double('cluster')
|
39
|
+
end
|
40
|
+
|
41
|
+
let(:retryable) do
|
42
|
+
klass.new(operation, cluster)
|
43
|
+
end
|
44
|
+
|
45
|
+
context 'when no exception occurs' do
|
46
|
+
|
47
|
+
before do
|
48
|
+
expect(operation).to receive(:execute).and_return(true)
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'executes the operation once' do
|
52
|
+
expect(retryable.read).to be true
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
context 'when a socket error occurs' do
|
57
|
+
|
58
|
+
before do
|
59
|
+
expect(operation).to receive(:execute).and_raise(Mongo::Error::SocketError).ordered
|
60
|
+
expect(cluster).to receive(:scan!).and_return(true).ordered
|
61
|
+
expect(operation).to receive(:execute).and_return(true).ordered
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'executes the operation twice' do
|
65
|
+
expect(retryable.read).to be true
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
context 'when a socket timeout error occurs' do
|
70
|
+
|
71
|
+
before do
|
72
|
+
expect(operation).to receive(:execute).and_raise(Mongo::Error::SocketTimeoutError).ordered
|
73
|
+
expect(cluster).to receive(:scan!).and_return(true).ordered
|
74
|
+
expect(operation).to receive(:execute).and_return(true).ordered
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'executes the operation twice' do
|
78
|
+
expect(retryable.read).to be true
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
context 'when an operation failure occurs' do
|
83
|
+
|
84
|
+
before do
|
85
|
+
expect(operation).to receive(:execute).and_raise(Mongo::Error::OperationFailure).ordered
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'raises an exception' do
|
89
|
+
expect {
|
90
|
+
retryable.read
|
91
|
+
}.to raise_error(Mongo::Error::OperationFailure)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
describe '#write_with_retry' do
|
97
|
+
|
98
|
+
let(:operation) do
|
99
|
+
double('operation')
|
100
|
+
end
|
101
|
+
|
102
|
+
let(:cluster) do
|
103
|
+
double('cluster')
|
104
|
+
end
|
105
|
+
|
106
|
+
let(:retryable) do
|
107
|
+
klass.new(operation, cluster)
|
108
|
+
end
|
109
|
+
|
110
|
+
context 'when no exception occurs' do
|
111
|
+
|
112
|
+
before do
|
113
|
+
expect(operation).to receive(:execute).and_return(true)
|
114
|
+
end
|
115
|
+
|
116
|
+
it 'executes the operation once' do
|
117
|
+
expect(retryable.write).to be true
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
context 'when a not master error occurs' do
|
122
|
+
|
123
|
+
before do
|
124
|
+
expect(operation).to receive(:execute).and_raise(Mongo::Error::OperationFailure.new('not master')).ordered
|
125
|
+
expect(cluster).to receive(:scan!).and_return(true).ordered
|
126
|
+
expect(operation).to receive(:execute).and_return(true).ordered
|
127
|
+
end
|
128
|
+
|
129
|
+
it 'executes the operation twice' do
|
130
|
+
expect(retryable.write).to be true
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
context 'when a normal operation failure occurs' do
|
135
|
+
|
136
|
+
before do
|
137
|
+
expect(operation).to receive(:execute).and_raise(Mongo::Error::OperationFailure).ordered
|
138
|
+
end
|
139
|
+
|
140
|
+
it 'raises an exception' do
|
141
|
+
expect {
|
142
|
+
retryable.write
|
143
|
+
}.to raise_error(Mongo::Error::OperationFailure)
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
@@ -47,6 +47,22 @@ describe Mongo::Server::ConnectionPool::Queue do
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
+
describe '#disconnect!' do
|
51
|
+
|
52
|
+
let(:connection) do
|
53
|
+
double('connection')
|
54
|
+
end
|
55
|
+
|
56
|
+
let(:queue) do
|
57
|
+
described_class.new(:max_pool_size => 1) { connection }
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'disconnects all connections in the queue' do
|
61
|
+
expect(connection).to receive(:disconnect!)
|
62
|
+
queue.disconnect!
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
50
66
|
describe '#enqueue' do
|
51
67
|
|
52
68
|
let(:connection) do
|