mongo 2.4.0.rc0 → 2.4.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +1 -2
- data/lib/mongo/bulk_write/validatable.rb +3 -1
- data/lib/mongo/client.rb +30 -3
- data/lib/mongo/cluster/app_metadata.rb +7 -2
- data/lib/mongo/collection.rb +3 -1
- data/lib/mongo/collection/view.rb +3 -1
- data/lib/mongo/collection/view/aggregation.rb +3 -1
- data/lib/mongo/collection/view/builder/find_command.rb +20 -5
- data/lib/mongo/collection/view/map_reduce.rb +3 -1
- data/lib/mongo/collection/view/writable.rb +12 -2
- data/lib/mongo/cursor/builder/get_more_command.rb +3 -2
- data/lib/mongo/error/closed_stream.rb +1 -1
- data/lib/mongo/error/invalid_server_preference.rb +1 -1
- data/lib/mongo/index/view.rb +3 -1
- data/lib/mongo/operation/write/bulk/mergable.rb +1 -1
- data/lib/mongo/operation/write/create_index.rb +1 -1
- data/lib/mongo/operation/write/delete.rb +1 -1
- data/lib/mongo/operation/write/update.rb +1 -1
- data/lib/mongo/protocol/delete.rb +4 -1
- data/lib/mongo/protocol/get_more.rb +4 -1
- data/lib/mongo/protocol/insert.rb +7 -3
- data/lib/mongo/protocol/kill_cursors.rb +4 -1
- data/lib/mongo/protocol/message.rb +5 -1
- data/lib/mongo/protocol/query.rb +11 -4
- data/lib/mongo/protocol/update.rb +4 -1
- data/lib/mongo/server/connectable.rb +8 -2
- data/lib/mongo/server/connection_pool.rb +3 -1
- data/lib/mongo/server/monitor.rb +1 -0
- data/lib/mongo/socket.rb +16 -8
- data/lib/mongo/socket/ssl.rb +24 -9
- data/lib/mongo/uri.rb +6 -6
- data/lib/mongo/version.rb +1 -1
- data/mongo.gemspec +1 -1
- data/spec/mongo/bulk_write_spec.rb +117 -0
- data/spec/mongo/collection/view/aggregation_spec.rb +26 -0
- data/spec/mongo/collection/view/builder/find_command_spec.rb +244 -2
- data/spec/mongo/collection/view/map_reduce_spec.rb +13 -0
- data/spec/mongo/collection/view/readable_spec.rb +26 -0
- data/spec/mongo/collection/view/writable_spec.rb +104 -0
- data/spec/mongo/collection/view_spec.rb +13 -0
- data/spec/mongo/collection_spec.rb +226 -7
- data/spec/mongo/crud_spec.rb +5 -5
- data/spec/mongo/index/view_spec.rb +53 -0
- data/spec/mongo/server/connection_spec.rb +45 -26
- data/spec/mongo/socket/ssl_spec.rb +358 -22
- data/spec/spec_helper.rb +4 -0
- data/spec/support/authorization.rb +3 -3
- data/spec/support/certificates/client_cert.pem +21 -0
- data/spec/support/certificates/client_key.pem +28 -0
- data/spec/support/certificates/client_key_encrypted.pem +30 -0
- data/spec/support/crud.rb +67 -22
- data/spec/support/crud/read.rb +18 -36
- data/spec/support/crud/write.rb +0 -44
- data/spec/support/crud_tests/read/aggregate-collation.yml +17 -0
- data/spec/support/crud_tests/read/aggregate-out.yml +28 -0
- data/spec/support/crud_tests/read/aggregate.yml +1 -35
- data/spec/support/crud_tests/read/count-collation.yml +15 -0
- data/spec/support/crud_tests/read/count.yml +3 -15
- data/spec/support/crud_tests/read/distinct-collation.yml +17 -0
- data/spec/support/crud_tests/read/distinct.yml +1 -14
- data/spec/support/crud_tests/read/find-collation.yml +15 -0
- data/spec/support/crud_tests/read/find.yml +1 -12
- data/spec/support/crud_tests/write/deleteMany-collation.yml +22 -0
- data/spec/support/crud_tests/write/deleteMany.yml +1 -23
- data/spec/support/crud_tests/write/deleteOne-collation.yml +22 -0
- data/spec/support/crud_tests/write/deleteOne.yml +1 -21
- data/spec/support/crud_tests/write/findOneAndDelete-collation.yml +23 -0
- data/spec/support/crud_tests/write/findOneAndDelete.yml +2 -28
- data/spec/support/crud_tests/write/findOneAndReplace-collation.yml +24 -0
- data/spec/support/crud_tests/write/findOneAndReplace-upsert.yml +47 -0
- data/spec/support/crud_tests/write/findOneAndReplace.yml +13 -53
- data/spec/support/crud_tests/write/findOneAndUpdate-collation.yml +27 -0
- data/spec/support/crud_tests/write/findOneAndUpdate.yml +8 -51
- data/spec/support/crud_tests/write/insertMany.yml +1 -2
- data/spec/support/crud_tests/write/insertOne.yml +1 -2
- data/spec/support/crud_tests/write/replaceOne-collation.yml +23 -0
- data/spec/support/crud_tests/write/replaceOne-upsert.yml +48 -0
- data/spec/support/crud_tests/write/replaceOne.yml +11 -45
- data/spec/support/crud_tests/write/updateMany-collation.yml +27 -0
- data/spec/support/crud_tests/write/updateMany.yml +10 -42
- data/spec/support/crud_tests/write/updateOne-collation.yml +24 -0
- data/spec/support/crud_tests/write/updateOne.yml +7 -33
- data/spec/support/sdam/rs/new_primary_new_setversion.yml +1 -1
- data/spec/support/sdam/rs/null_election_id.yml +1 -0
- data/spec/support/sdam/rs/primary_disconnect_electionid.yml +2 -3
- data/spec/support/sdam/rs/primary_disconnect_setversion.yml +1 -2
- 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
- metadata +40 -4
- metadata.gz.sig +0 -0
data/spec/spec_helper.rb
CHANGED
@@ -15,6 +15,10 @@ CLIENT_PEM = "#{SSL_CERTS_DIR}/client.pem"
|
|
15
15
|
CLIENT_PASSWORD_PEM = "#{SSL_CERTS_DIR}/password_protected.pem"
|
16
16
|
CA_PEM = "#{SSL_CERTS_DIR}/ca.pem"
|
17
17
|
CRL_PEM = "#{SSL_CERTS_DIR}/crl.pem"
|
18
|
+
CLIENT_KEY_PEM = "#{SSL_CERTS_DIR}/client_key.pem"
|
19
|
+
CLIENT_CERT_PEM = "#{SSL_CERTS_DIR}/client_cert.pem"
|
20
|
+
CLIENT_KEY_ENCRYPTED_PEM = "#{SSL_CERTS_DIR}/client_key_encrypted.pem"
|
21
|
+
CLIENT_KEY_PASSPHRASE = "passphrase"
|
18
22
|
|
19
23
|
require 'mongo'
|
20
24
|
|
@@ -51,8 +51,8 @@ SSL = ENV['SSL_ENABLED'] == 'true'
|
|
51
51
|
SSL_OPTIONS = {
|
52
52
|
ssl: SSL,
|
53
53
|
ssl_verify: false,
|
54
|
-
ssl_cert:
|
55
|
-
ssl_key:
|
54
|
+
ssl_cert: CLIENT_CERT_PEM,
|
55
|
+
ssl_key: CLIENT_KEY_PEM
|
56
56
|
}
|
57
57
|
|
58
58
|
# Base test options.
|
@@ -61,7 +61,7 @@ SSL_OPTIONS = {
|
|
61
61
|
BASE_OPTIONS = {
|
62
62
|
max_pool_size: 1,
|
63
63
|
write: WRITE_CONCERN,
|
64
|
-
heartbeat_frequency:
|
64
|
+
heartbeat_frequency: 20,
|
65
65
|
max_read_retries: 5
|
66
66
|
}
|
67
67
|
|
@@ -0,0 +1,21 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIDdjCCAt+gAwIBAgIBBzANBgkqhkiG9w0BAQUFADCBkjELMAkGA1UEBhMCVVMx
|
3
|
+
ETAPBgNVBAgMCE5ldyBZb3JrMRYwFAYDVQQHDA1OZXcgWW9yayBDaXR5MQ4wDAYD
|
4
|
+
VQQKDAUxMEdlbjEPMA0GA1UECwwGS2VybmVsMRowGAYDVQQDDBFNeSBDZXJ0IEF1
|
5
|
+
dGhvcml0eTEbMBkGCSqGSIb3DQEJARYMcm9vdEBsYXphcnVzMB4XDTEzMDgyMzE0
|
6
|
+
NTUzMloXDTQxMDEwNzE0NTUzMlowbjELMAkGA1UEBhMCVVMxETAPBgNVBAgMCE5l
|
7
|
+
dyBZb3JrMRYwFAYDVQQHDA1OZXcgWW9yayBDaXR5MQ4wDAYDVQQKDAUxMEdlbjET
|
8
|
+
MBEGA1UECwwKa2VybmVsdXNlcjEPMA0GA1UEAwwGY2xpZW50MIIBIjANBgkqhkiG
|
9
|
+
9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuhZC1Is9XopnnqfAzUqcnP2VuYO/9M8DjC7b
|
10
|
+
qcE1WID24umHKITj0JtoYFEOQoTYb+g0zBiXedON2C8jESVvaXo4u4yyKemRvnmM
|
11
|
+
zBtWmJjTgyrF+ZyGDCwkDlxGO6mVRGzF4HydA64NI5lJpEjdDjWi5bSLhr3AyM7V
|
12
|
+
rMQ2855fFwAjjVOhQxujYZY2gE01ULWLaTE5tGOLlllc0eqS6+v6GzVkRLP286ad
|
13
|
+
STpZ5eHCy5i+KbMi3TOX11BP28JYZBi1jDxrLSH2vY3l0tqNef6ngHWoFbnueX8B
|
14
|
+
MR3l5xV2U2X2/vCTfSA9zP+byrJQLBs6adXmcM+svn5cM8RupwIDAQABo3sweTAJ
|
15
|
+
BgNVHRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0
|
16
|
+
aWZpY2F0ZTAdBgNVHQ4EFgQUSovuIkLm+GJMhjiNxXiVmMEQBXwwHwYDVR0jBBgw
|
17
|
+
FoAUB0EZOp9+xbciTre81d/k/Am4ZBYwDQYJKoZIhvcNAQEFBQADgYEAExOo8N54
|
18
|
+
xrHghcwn5gQoRJMd8f9egWkzH/N24EnK2a2q2/Wl+KZQu6GnQBTkL424IX81BGDb
|
19
|
+
r/Ce3aHKC38DLi8ZHjJuHi2HaOM3R6hbk9GIQXPaiCFZJ9Q1HGontcDGF7rzh8jh
|
20
|
+
9I9DErz6jZDVhoPfUaXJ4JLwZtA3YW+FJBg=
|
21
|
+
-----END CERTIFICATE-----
|
@@ -0,0 +1,28 @@
|
|
1
|
+
-----BEGIN PRIVATE KEY-----
|
2
|
+
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC6FkLUiz1eimee
|
3
|
+
p8DNSpyc/ZW5g7/0zwOMLtupwTVYgPbi6YcohOPQm2hgUQ5ChNhv6DTMGJd5043Y
|
4
|
+
LyMRJW9peji7jLIp6ZG+eYzMG1aYmNODKsX5nIYMLCQOXEY7qZVEbMXgfJ0Drg0j
|
5
|
+
mUmkSN0ONaLltIuGvcDIztWsxDbznl8XACONU6FDG6NhljaATTVQtYtpMTm0Y4uW
|
6
|
+
WVzR6pLr6/obNWREs/bzpp1JOlnl4cLLmL4psyLdM5fXUE/bwlhkGLWMPGstIfa9
|
7
|
+
jeXS2o15/qeAdagVue55fwExHeXnFXZTZfb+8JN9ID3M/5vKslAsGzpp1eZwz6y+
|
8
|
+
flwzxG6nAgMBAAECggEBALYw92urjAFVFxCiA8W7aEzYhtAkaztft4R3mD/C19z4
|
9
|
+
H0CZDeig+3+RuIactY5xDIu8WHz/EseHVlg0BmxSL5ugu4z8uq8IbNaFoVFw7r7m
|
10
|
+
2ieRKFY0ZpXiXcbllynw5iEhMjeRKhWhQmH5Qb2kTTINV5j4xKa+f9Lblx7Y2Uh4
|
11
|
+
tsaOtlMwb98D2/KYJdTv5Nj1nyuSqRVhECsd00Cb6JUBGQBx8Ja0wFy9gEygq6kU
|
12
|
+
w3s1XNOSnYNEo4FaVZwp5KZyCyBENcKpNUq4nXt/7ncEfVYdJck0Li3wN4Jr2J9S
|
13
|
+
eHqRzh8QkHxc1Ro8ktcXaUSs9kFuwvVvb4rcGUpOMWkCgYEA9xxp8yDtFVgzMtc/
|
14
|
+
vS8xgM1Wj4SrgKKYhE2wS05BJh/41oFMzfH1FpZ1GCM983r4QgYWoT71XsBgiOMC
|
15
|
+
yN2p2IbV4V44bMGKJqaVMkB91CVCUWI6piaCQb/1CJTwaXE7zPim6dlUSxxBBnRn
|
16
|
+
LP50NTscRLFcCZELD3Yl7jR8XFUCgYEAwMfkNFmGtBKAwlHZ3Y3XOwPWg+jCll7s
|
17
|
+
9nhv8TU2IB9pcCRGqyOT7k1YymvYkDT2Je4JUPWEBs4cW7yD61LrQ8w8+DrE9dGo
|
18
|
+
czzGPyjOAANSX0asG74UjkNIQThmyEOltVHIxYMaSqowjHRSPdA+R4Od9EdcDdfS
|
19
|
+
q5SfSVFxmwsCgYBtl1thqUOcCL7EGHQ7KdfxgJ+YDMWmyfWMD4xVCYKZLurD7xop
|
20
|
+
59nDR7zslIygE/RQC7Uzk+FsQTNO4ibVAIGX9syaI5gwm3DyjURzwehMEq4ju8W4
|
21
|
+
9DEmicRZJvysNrzHvasA4RKiMQihnTQ43yyYgvuZd3MTBxF5rPNLfll89QKBgQC9
|
22
|
+
SsmiOZIR+OUjaTmS2bbQBNm7Fm8TNcxZyzKn1wb5jb57VbNqUfnskVgxEqpIFyjn
|
23
|
+
X48YRqtH/1RLI5UpGXdXUBFB8Hr7oM1VsgQ7ejakPp7AXOWcLA2FDz3AhMAvvnTU
|
24
|
+
0KRihHPpgqk/EOy8M2Ej2XHcrcEO+q+quLmbRXRWtwKBgHacQiwci/2J+v0e9i52
|
25
|
+
re/2AJHKP5MwNHFe1e01iNc5EEN0G+/Ut8XW19DWf6bsxqie0ChC+xN8TUst8alT
|
26
|
+
F+tXTsHHmt/lRcjTROjT5XVuoqjtU2Q0QeVeGLgvObso+fZy3ZNeQuSJjWukdMZ3
|
27
|
+
57rGT6p0OuM8qbrTzpv3JMrm
|
28
|
+
-----END PRIVATE KEY-----
|
@@ -0,0 +1,30 @@
|
|
1
|
+
-----BEGIN RSA PRIVATE KEY-----
|
2
|
+
Proc-Type: 4,ENCRYPTED
|
3
|
+
DEK-Info: DES-EDE3-CBC,10EC04AAF2B5AC93
|
4
|
+
|
5
|
+
o8wl+xljXAiT+wCc0trCSaQ+0vktQXCXDQj2x/pEMwS5+GxhPaQmpQjtc2gsjher
|
6
|
+
PGu5rSG0eqIGROv530ZbtdWdMeRRbiDfcVrbjr2hg9MdasV4/7llVCNnZx2NuuuU
|
7
|
+
0ToH6a1JtnnPLqocdJfwJu/w+AMpJBCR9im+L4QeVJ0My4nS9VzL214ioxfmKtiS
|
8
|
+
/DPRm9NQxIRbOFzPLT4Wp2kaGyq6z4MyW7I16MEIjxNfg7MoojkOosp2ru7QEO5N
|
9
|
+
CjlsInC3kJjSimRh479Ba5rnFLY6ekwRkFzbzPNnPz1Mbpv86Btqx8dNERfOGRMd
|
10
|
+
JLjLSWbeO6nZmRIBuItChVfpbiVV+3eQvQHIsTFN/pD0hbDmI0FQ8TiEwxe4dNGu
|
11
|
+
LGgQwI9BIVT9ZDTahe0182Cb7WS1KA7VrixRV3zm2NSgrP8D9yH6/BlogdRtjCc4
|
12
|
+
ktGjZJtqojEAdeYM7qofGhZjq50Pwy2EAyV0UXGwg3MblrobanAq6mezmPRDPFzb
|
13
|
+
iEHLK9N5xqddcl8dIhd5vk84MI7Ih7kc7E3MdbRAyWrSPRk+eFqy6Bfuz6JSrHMO
|
14
|
+
6Beyfz6dzU5XUCo/feh6qmDEA5COuP1JHE8UhSC8s/wRk94qZdLz2jIglPSJ2Zm7
|
15
|
+
VrP1vHIU8rghO4JWE2K3HPAASBacYhfoW6Po+vmxeRttAao9xhFBhM+OjUszh+1w
|
16
|
+
YSkv6TXpHZTfE0ai2Sm1yYuB5FuCco1ehPGFLf+a9dSv5xT+3qAqM9pkbYDPDSyS
|
17
|
+
RAfSiy/cIzjIfk/a/2A7F56b/clZV3V/DRfgCMdcCHSrjJ/DXmg7s5pCqNh3Y2RM
|
18
|
+
Izyb7XAWXQh+VrvrLSFolY6CFTAYq2bnqkMIel1t/MusF8P2Cpf+1YFQOz/KhtqS
|
19
|
+
S51JZw4wA8Hq/LOOsmB1BzPl63Yu8rj+hCMN8yEodY1yOwrLX1c6/c+4A6U8JioL
|
20
|
+
dya58byVF5Fov+moO5PgkD5QsuHDZpkdQeWjZXtK9ZoG6HG5godFip6hxIrV8LTl
|
21
|
+
Fy9TEURPPYfM9Kt3zucL1KOljBu268tBfezqwPLpFVYuIDSUdTHdCBIRJvJwBfrU
|
22
|
+
9gZXFik0ZgP2WSlGJbrUTGfCv7EcdPfDS3h6dPfh8Z33Kr9g+yKp2Gxm6ynQi2EU
|
23
|
+
T86tMUFaeIZ5VD14ruihlQyazPePYa95FUoVWRnnoxXrCEGo3PU2sL5vXOjr1zr3
|
24
|
+
dnZheTNH7UW+O4nLwpZ8WI+IYqIOh6s5Aj9ZQpuPfhgFOOqqwrEbCh88W6q5Qz82
|
25
|
+
J2U9ok/RWTgc433tW4xKoN10p6IdF/MxMrPSV+LdVnYf1HBl5I1A/iZRHxdXkJpZ
|
26
|
+
KcQ6VAQylmPGHHacxWodn2R9aFxy/LoSDSzivhxE+CDF6Ggr+DwyWPa6dHLP9S0n
|
27
|
+
H9PfOPQLIu2uigpQc4GJoAZOljNaYDee/IekJ+vR6vzg09Uc1YDIVWfGmNJpYuVr
|
28
|
+
rz383c+sGC3RX2cPyxuzENLo1tGYvjH0Rfvzjfkvali2Tfk3kjha0GhTw7CH7U3L
|
29
|
+
5rb5GQj16tDX/Oqa2DluESH3tzDJ7Rgdwda0Dk3iceVEsSHArt6TOz/qa+Ycm/EC
|
30
|
+
-----END RSA PRIVATE KEY-----
|
data/spec/support/crud.rb
CHANGED
@@ -23,11 +23,18 @@
|
|
23
23
|
# @since 2.0.0
|
24
24
|
RSpec::Matchers.define :match_collection_data do |test|
|
25
25
|
|
26
|
-
match do
|
26
|
+
match do
|
27
27
|
test.compare_collection_data
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
|
+
RSpec::Matchers.define :match_operation_result do |test|
|
32
|
+
|
33
|
+
match do |actual|
|
34
|
+
test.compare_operation_result(actual)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
31
38
|
require 'support/crud/read'
|
32
39
|
require 'support/crud/write'
|
33
40
|
|
@@ -59,6 +66,31 @@ module Mongo
|
|
59
66
|
@description = File.basename(file)
|
60
67
|
@data = @spec['data']
|
61
68
|
@crud_tests = @spec['tests']
|
69
|
+
@min_server_version = @spec['minServerVersion']
|
70
|
+
@max_server_version = @spec['maxServerVersion']
|
71
|
+
end
|
72
|
+
|
73
|
+
|
74
|
+
# Whether the test can be run on a given server version.
|
75
|
+
#
|
76
|
+
# @example Can the test run on this server version?
|
77
|
+
# spec.server_version_satisfied?(client)
|
78
|
+
#
|
79
|
+
# @param [ Mongo::Client ] client The client to check.
|
80
|
+
#
|
81
|
+
# @return [ true, false ] Whether the test can be run on the given
|
82
|
+
# server version.
|
83
|
+
#
|
84
|
+
# @since 2.4.0
|
85
|
+
def server_version_satisfied?(client)
|
86
|
+
case @min_server_version
|
87
|
+
when '2.6'
|
88
|
+
client.cluster.servers.first.features.write_command_enabled?
|
89
|
+
when '3.4'
|
90
|
+
client.cluster.servers.first.features.collation_enabled?
|
91
|
+
else
|
92
|
+
true
|
93
|
+
end
|
62
94
|
end
|
63
95
|
|
64
96
|
# Get a list of CRUDTests for each test definition.
|
@@ -146,6 +178,8 @@ module Mongo
|
|
146
178
|
def compare_collection_data
|
147
179
|
if actual_collection_data.nil?
|
148
180
|
outcome_collection_data.nil?
|
181
|
+
elsif actual_collection_data.empty?
|
182
|
+
outcome_collection_data.empty?
|
149
183
|
else
|
150
184
|
actual_collection_data.all? do |doc|
|
151
185
|
outcome_collection_data.include?(doc)
|
@@ -153,41 +187,52 @@ module Mongo
|
|
153
187
|
end
|
154
188
|
end
|
155
189
|
|
156
|
-
#
|
157
|
-
# the expected results.
|
190
|
+
# Compare the actual operation result to the expected operation result.
|
158
191
|
#
|
159
|
-
# @example
|
160
|
-
# test.
|
192
|
+
# @example Compare the existing and expected operation results.
|
193
|
+
# test.compare_operation_result(actual_results)
|
161
194
|
#
|
162
|
-
# @
|
163
|
-
# @param [ Collection ] The collection the test is run on.
|
195
|
+
# @params [ Object ] actual The actual test results.
|
164
196
|
#
|
165
|
-
# @return [ true, false ]
|
197
|
+
# @return [ true, false ] The result of comparing the expected and actual operation result.
|
166
198
|
#
|
167
|
-
# @since 2.
|
168
|
-
def
|
169
|
-
|
199
|
+
# @since 2.4.0
|
200
|
+
def compare_operation_result(actual)
|
201
|
+
if actual.is_a?(Array)
|
202
|
+
actual.empty? || @outcome['result'].each_with_index do |expected, i|
|
203
|
+
compare_result(expected, actual[i])
|
204
|
+
end
|
205
|
+
else
|
206
|
+
compare_result(@outcome['result'], actual)
|
207
|
+
end
|
170
208
|
end
|
171
209
|
|
172
|
-
#
|
210
|
+
# The expected data in the collection as an outcome after running this test.
|
173
211
|
#
|
174
|
-
# @example
|
175
|
-
#
|
212
|
+
# @example Get the outcome collection data
|
213
|
+
# test.outcome_collection_data
|
176
214
|
#
|
177
|
-
# @
|
178
|
-
#
|
179
|
-
#
|
180
|
-
# @return [ true, false ] Whether this operation requires a certain server version.
|
215
|
+
# @return [ Array<Hash> ] The list of documents expected to be in the collection
|
216
|
+
# after running this test.
|
181
217
|
#
|
182
218
|
# @since 2.4.0
|
183
|
-
def
|
184
|
-
@
|
219
|
+
def outcome_collection_data
|
220
|
+
@outcome['collection']['data'] if @outcome['collection']
|
185
221
|
end
|
186
222
|
|
187
223
|
private
|
188
224
|
|
189
|
-
def
|
190
|
-
|
225
|
+
def compare_result(expected, actual)
|
226
|
+
case expected
|
227
|
+
when nil
|
228
|
+
actual.nil?
|
229
|
+
when Hash
|
230
|
+
actual.each do |k, v|
|
231
|
+
expected[k] == v
|
232
|
+
end
|
233
|
+
when Integer
|
234
|
+
expected == actual
|
235
|
+
end
|
191
236
|
end
|
192
237
|
|
193
238
|
def actual_collection_data
|
data/spec/support/crud/read.rb
CHANGED
@@ -32,6 +32,16 @@ module Mongo
|
|
32
32
|
:collation => 'collation'
|
33
33
|
}
|
34
34
|
|
35
|
+
# Map of read preference mode names to their equivalent Ruby-formatted symbols.
|
36
|
+
#
|
37
|
+
# @since 2.4.0
|
38
|
+
READ_PREFERENCE_MAP = { 'primary' => :primary,
|
39
|
+
'secondary' => :secondary,
|
40
|
+
'primaryPreferred' => :primary_preferred,
|
41
|
+
'secondaryPreferred' => :secondary_preferred,
|
42
|
+
'nearest' => :nearest
|
43
|
+
}
|
44
|
+
|
35
45
|
# The operation name.
|
36
46
|
#
|
37
47
|
# @return [ String ] name The operation name.
|
@@ -76,41 +86,6 @@ module Mongo
|
|
76
86
|
pipeline.find {|op| op.keys.include?('$out') })
|
77
87
|
end
|
78
88
|
|
79
|
-
# Whether the operation requires server version >= 2.6 for its results to
|
80
|
-
# match expected results.
|
81
|
-
#
|
82
|
-
# @example Whether the operation requires >= 2.6 for its results to match.
|
83
|
-
# operation.requires_2_6?(collection)
|
84
|
-
#
|
85
|
-
# @param [ Collection ] collection The collection the operation is executed on.
|
86
|
-
#
|
87
|
-
# @return [ true, false ] If the operation requires 2.6 for its results to match.
|
88
|
-
#
|
89
|
-
# @since 2.0.0
|
90
|
-
def requires_2_6?(collection)
|
91
|
-
name == 'aggregate' && pipeline.find {|op| op.keys.include?('$out') }
|
92
|
-
end
|
93
|
-
|
94
|
-
# Whether this operation requires a certain server version to be run.
|
95
|
-
#
|
96
|
-
# @example Determine whether this operation requires a certain server feature.
|
97
|
-
# operation.feature_enabled?(collection)
|
98
|
-
#
|
99
|
-
# @param [ Collection ] collection The collection the operation
|
100
|
-
# should be executed on.
|
101
|
-
#
|
102
|
-
# @return [ true, false ] Whether this operation requires a certain server version.
|
103
|
-
#
|
104
|
-
# @since 2.4.0
|
105
|
-
def feature_enabled?(collection)
|
106
|
-
if collation
|
107
|
-
return $mongo_client.cluster.servers.first.features.collation_enabled?
|
108
|
-
elsif requires_2_6?(collection)
|
109
|
-
return $mongo_client.cluster.servers.first.features.write_command_enabled?
|
110
|
-
end
|
111
|
-
true
|
112
|
-
end
|
113
|
-
|
114
89
|
private
|
115
90
|
|
116
91
|
def count(collection)
|
@@ -130,7 +105,8 @@ module Mongo
|
|
130
105
|
end
|
131
106
|
|
132
107
|
def find(collection)
|
133
|
-
|
108
|
+
opts = modifiers ? options.merge(modifiers: BSON::Document.new(modifiers)) : options
|
109
|
+
(read_preference ? collection.with(read: read_preference) : collection).find(filter, opts).to_a
|
134
110
|
end
|
135
111
|
|
136
112
|
def options
|
@@ -166,6 +142,12 @@ module Mongo
|
|
166
142
|
def arguments
|
167
143
|
@spec['arguments']
|
168
144
|
end
|
145
|
+
|
146
|
+
def read_preference
|
147
|
+
if @spec['read_preference'] && @spec['read_preference']['mode']
|
148
|
+
{ mode: READ_PREFERENCE_MAP[@spec['read_preference']['mode']] }
|
149
|
+
end
|
150
|
+
end
|
169
151
|
end
|
170
152
|
end
|
171
153
|
end
|
data/spec/support/crud/write.rb
CHANGED
@@ -51,14 +51,6 @@ module Mongo
|
|
51
51
|
:collation => 'collation'
|
52
52
|
}
|
53
53
|
|
54
|
-
# Operations that need a check if results on < 2.6 will match.
|
55
|
-
#
|
56
|
-
# @since 2.0.0
|
57
|
-
REQUIRES_2_6 = ['findOneAndReplace',
|
58
|
-
'updateMany',
|
59
|
-
'updateOne',
|
60
|
-
'replaceOne']
|
61
|
-
|
62
54
|
# The operation name.
|
63
55
|
#
|
64
56
|
# @return [ String ] name The operation name.
|
@@ -98,42 +90,6 @@ module Mongo
|
|
98
90
|
send(OPERATIONS[name], collection)
|
99
91
|
end
|
100
92
|
|
101
|
-
# Whether this operation requires >= 2.6 to be tested.
|
102
|
-
#
|
103
|
-
# @example Determine whether this operation requires >= 2.6.
|
104
|
-
# operation.requires_2_6?(collection)
|
105
|
-
#
|
106
|
-
# @param [ Collection ] collection The collection the operation
|
107
|
-
# should be executed on.
|
108
|
-
#
|
109
|
-
# @return [ true, false ] Whether this operation requires 2.6
|
110
|
-
# to be tested.
|
111
|
-
#
|
112
|
-
# @since 2.0.0
|
113
|
-
def requires_2_6?(collection)
|
114
|
-
REQUIRES_2_6.include?(name) && upsert
|
115
|
-
end
|
116
|
-
|
117
|
-
# Whether this operation requires a certain server version to be run.
|
118
|
-
#
|
119
|
-
# @example Determine whether this operation requires a certain server feature.
|
120
|
-
# operation.feature_enabled?(collection)
|
121
|
-
#
|
122
|
-
# @param [ Collection ] collection The collection the operation
|
123
|
-
# should be executed on.
|
124
|
-
#
|
125
|
-
# @return [ true, false ] Whether this operation requires a certain server version.
|
126
|
-
#
|
127
|
-
# @since 2.4.0
|
128
|
-
def feature_enabled?(collection)
|
129
|
-
if collation
|
130
|
-
return $mongo_client.cluster.servers.first.features.collation_enabled?
|
131
|
-
elsif requires_2_6?(collection)
|
132
|
-
return $mongo_client.cluster.servers.first.features.write_command_enabled?
|
133
|
-
end
|
134
|
-
true
|
135
|
-
end
|
136
|
-
|
137
93
|
private
|
138
94
|
|
139
95
|
def bulk_write(collection)
|
@@ -0,0 +1,17 @@
|
|
1
|
+
data:
|
2
|
+
- {_id: 1, x: 'ping'}
|
3
|
+
minServerVersion: '3.4'
|
4
|
+
|
5
|
+
tests:
|
6
|
+
-
|
7
|
+
description: "Aggregate with collation"
|
8
|
+
operation:
|
9
|
+
name: aggregate
|
10
|
+
arguments:
|
11
|
+
pipeline:
|
12
|
+
- $match:
|
13
|
+
x: 'PING'
|
14
|
+
collation: { locale: 'en_US', strength: 2 } # https://docs.mongodb.com/master/reference/collation/#collation-document
|
15
|
+
outcome:
|
16
|
+
result:
|
17
|
+
- {_id: 1, x: 'ping'}
|
@@ -0,0 +1,28 @@
|
|
1
|
+
data:
|
2
|
+
- {_id: 1, x: 11}
|
3
|
+
- {_id: 2, x: 22}
|
4
|
+
- {_id: 3, x: 33}
|
5
|
+
minServerVersion: '2.6'
|
6
|
+
|
7
|
+
tests:
|
8
|
+
-
|
9
|
+
description: "Aggregate with $out"
|
10
|
+
operation:
|
11
|
+
name: aggregate
|
12
|
+
arguments:
|
13
|
+
pipeline:
|
14
|
+
- $sort: {x: 1}
|
15
|
+
- $match:
|
16
|
+
_id: {$gt: 1}
|
17
|
+
- $out: "other_test_collection"
|
18
|
+
batchSize: 2
|
19
|
+
|
20
|
+
outcome:
|
21
|
+
result:
|
22
|
+
- {_id: 2, x: 22}
|
23
|
+
- {_id: 3, x: 33}
|
24
|
+
collection:
|
25
|
+
name: "other_test_collection"
|
26
|
+
data:
|
27
|
+
- {_id: 2, x: 22}
|
28
|
+
- {_id: 3, x: 33}
|
@@ -2,7 +2,6 @@ data:
|
|
2
2
|
- {_id: 1, x: 11}
|
3
3
|
- {_id: 2, x: 22}
|
4
4
|
- {_id: 3, x: 33}
|
5
|
-
- {_id: 4, x: 'ping'}
|
6
5
|
|
7
6
|
tests:
|
8
7
|
-
|
@@ -13,43 +12,10 @@ tests:
|
|
13
12
|
pipeline:
|
14
13
|
- $sort: {x: 1}
|
15
14
|
- $match:
|
16
|
-
_id: {$gt: 1
|
15
|
+
_id: {$gt: 1}
|
17
16
|
batchSize: 2
|
18
17
|
|
19
18
|
outcome:
|
20
19
|
result:
|
21
20
|
- {_id: 2, x: 22}
|
22
21
|
- {_id: 3, x: 33}
|
23
|
-
-
|
24
|
-
description: "Aggregate with $out"
|
25
|
-
operation:
|
26
|
-
name: aggregate
|
27
|
-
arguments:
|
28
|
-
pipeline:
|
29
|
-
- $sort: {x: 1}
|
30
|
-
- $match:
|
31
|
-
_id: {$gt: 1, $lt: 4}
|
32
|
-
- $out: "other_test_collection"
|
33
|
-
batchSize: 2
|
34
|
-
|
35
|
-
outcome:
|
36
|
-
result:
|
37
|
-
- {_id: 2, x: 22}
|
38
|
-
- {_id: 3, x: 33}
|
39
|
-
collection:
|
40
|
-
name: "other_test_collection"
|
41
|
-
data:
|
42
|
-
- {_id: 2, x: 22}
|
43
|
-
- {_id: 3, x: 33}
|
44
|
-
-
|
45
|
-
description: "Aggregate with collation"
|
46
|
-
operation:
|
47
|
-
name: aggregate
|
48
|
-
arguments:
|
49
|
-
pipeline:
|
50
|
-
- $match:
|
51
|
-
x: 'PING'
|
52
|
-
collation: { locale: 'en_US', strength: 2 }
|
53
|
-
outcome:
|
54
|
-
result:
|
55
|
-
- {_id: 4, x: 'ping'}
|