mongo 2.0.0.rc → 2.0.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.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +2 -1
  4. data/README.md +1 -4
  5. data/lib/mongo/client.rb +1 -1
  6. data/lib/mongo/collection.rb +1 -1
  7. data/lib/mongo/collection/view.rb +1 -1
  8. data/lib/mongo/collection/view/writable.rb +26 -10
  9. data/lib/mongo/database.rb +1 -1
  10. data/lib/mongo/grid/file.rb +12 -0
  11. data/lib/mongo/grid/file/chunk.rb +1 -1
  12. data/lib/mongo/grid/file/metadata.rb +13 -0
  13. data/lib/mongo/operation/aggregate.rb +1 -1
  14. data/lib/mongo/operation/write.rb +1 -5
  15. data/lib/mongo/operation/write/bulk.rb +17 -0
  16. data/lib/mongo/operation/write/{bulk_delete.rb → bulk/bulk_delete.rb} +1 -1
  17. data/lib/mongo/operation/{bulk_delete → write/bulk/bulk_delete}/result.rb +3 -0
  18. data/lib/mongo/operation/write/{bulk_insert.rb → bulk/bulk_insert.rb} +1 -1
  19. data/lib/mongo/operation/{bulk_insert → write/bulk/bulk_insert}/result.rb +3 -0
  20. data/lib/mongo/operation/write/{bulk_mergable.rb → bulk/bulk_mergable.rb} +0 -0
  21. data/lib/mongo/operation/write/{bulk_update.rb → bulk/bulk_update.rb} +1 -1
  22. data/lib/mongo/operation/{bulk_update → write/bulk/bulk_update}/result.rb +8 -1
  23. data/lib/mongo/operation/write/{legacy_bulk_mergable.rb → bulk/legacy_bulk_mergable.rb} +0 -0
  24. data/lib/mongo/operation/write/delete.rb +2 -0
  25. data/lib/mongo/operation/write/delete/result.rb +40 -0
  26. data/lib/mongo/operation/write/insert.rb +2 -0
  27. data/lib/mongo/operation/write/insert/result.rb +32 -0
  28. data/lib/mongo/operation/write/update.rb +9 -4
  29. data/lib/mongo/operation/write/update/result.rb +160 -0
  30. data/lib/mongo/server/connectable.rb +11 -0
  31. data/lib/mongo/server/connection.rb +1 -0
  32. data/lib/mongo/server/connection_pool.rb +1 -1
  33. data/lib/mongo/server/connection_pool/queue.rb +1 -1
  34. data/lib/mongo/server/monitor.rb +16 -0
  35. data/lib/mongo/server/monitor/connection.rb +1 -0
  36. data/lib/mongo/socket/ssl.rb +30 -8
  37. data/lib/mongo/version.rb +1 -1
  38. data/lib/mongo/write_concern/acknowledged.rb +1 -1
  39. data/lib/mongo/write_concern/unacknowledged.rb +1 -1
  40. data/spec/certificates/ca.pem +17 -0
  41. data/spec/certificates/client.pem +101 -0
  42. data/spec/certificates/crl.pem +10 -0
  43. data/spec/certificates/crl_client_revoked.pem +12 -0
  44. data/spec/certificates/password_protected.pem +51 -0
  45. data/spec/certificates/server.pem +34 -0
  46. data/spec/mongo/collection/view/writable_spec.rb +175 -0
  47. data/spec/mongo/crud_spec.rb +42 -0
  48. data/spec/mongo/grid/file/metadata_spec.rb +23 -0
  49. data/spec/mongo/grid/file_spec.rb +34 -0
  50. data/spec/mongo/operation/write/delete_spec.rb +8 -0
  51. data/spec/mongo/operation/write/insert_spec.rb +21 -8
  52. data/spec/mongo/operation/write/update_spec.rb +52 -1
  53. data/spec/mongo/server/connection_spec.rb +33 -10
  54. data/spec/mongo/server/monitor_spec.rb +14 -0
  55. data/spec/spec_helper.rb +2 -17
  56. data/spec/support/crud.rb +203 -0
  57. data/spec/support/crud/read.rb +144 -0
  58. data/spec/support/crud/write.rb +214 -0
  59. data/spec/support/crud_tests/read/aggregate.yml +43 -0
  60. data/spec/support/crud_tests/read/count.yml +37 -0
  61. data/spec/support/crud_tests/read/distinct.yml +33 -0
  62. data/spec/support/crud_tests/read/find.yml +50 -0
  63. data/spec/support/crud_tests/write/deleteMany.yml +36 -0
  64. data/spec/support/crud_tests/write/deleteOne.yml +49 -0
  65. data/spec/support/crud_tests/write/findOneAndDelete.yml +54 -0
  66. data/spec/support/crud_tests/write/findOneAndReplace.yml +153 -0
  67. data/spec/support/crud_tests/write/findOneAndUpdate.yml +161 -0
  68. data/spec/support/crud_tests/write/insertMany.yml +24 -0
  69. data/spec/support/crud_tests/write/insertOne.yml +19 -0
  70. data/spec/support/crud_tests/write/replaceOne.yml +96 -0
  71. data/spec/support/crud_tests/write/updateMany.yml +83 -0
  72. data/spec/support/crud_tests/write/updateOne.yml +80 -0
  73. metadata +64 -20
  74. metadata.gz.sig +0 -0
  75. data/spec/mongo_orchestration_spec.rb +0 -70
  76. data/spec/support/mongo_orchestration.rb +0 -61
  77. data/spec/support/mongo_orchestration/requestable.rb +0 -109
  78. data/spec/support/mongo_orchestration/standalone.rb +0 -57
@@ -0,0 +1,10 @@
1
+ -----BEGIN X509 CRL-----
2
+ MIIBazCB1QIBATANBgkqhkiG9w0BAQUFADCBkjELMAkGA1UEBhMCVVMxETAPBgNV
3
+ BAgMCE5ldyBZb3JrMRYwFAYDVQQHDA1OZXcgWW9yayBDaXR5MQ4wDAYDVQQKDAUx
4
+ MEdlbjEPMA0GA1UECwwGS2VybmVsMRowGAYDVQQDDBFNeSBDZXJ0IEF1dGhvcml0
5
+ eTEbMBkGCSqGSIb3DQEJARYMcm9vdEBsYXphcnVzFw0xMjEyMTIxODQ3NDFaFw00
6
+ MDA0MjgxODQ3NDFaoA4wDDAKBgNVHRQEAwIBCzANBgkqhkiG9w0BAQUFAAOBgQAu
7
+ PlPDGei2q6kdkoHe8vmDuts7Hm/o9LFbBmn0XUcfHisCJCPsJTyGCsgnfIiBcXJY
8
+ 1LMKsQFnYGv28rE2ZPpFg2qNxL+6qUEzCvqaHLX9q1V0F+f8hHDxucNYu52oo/h0
9
+ uNZxB1KPFI2PReG5d3oUYqJ2+EctKkrGtxSPzbN0gg==
10
+ -----END X509 CRL-----
@@ -0,0 +1,12 @@
1
+ -----BEGIN X509 CRL-----
2
+ MIIBujCCASMCAQEwDQYJKoZIhvcNAQEFBQAwgZIxCzAJBgNVBAYTAlVTMREwDwYD
3
+ VQQIDAhOZXcgWW9yazEWMBQGA1UEBwwNTmV3IFlvcmsgQ2l0eTEOMAwGA1UECgwF
4
+ MTBHZW4xDzANBgNVBAsMBktlcm5lbDEaMBgGA1UEAwwRTXkgQ2VydCBBdXRob3Jp
5
+ dHkxGzAZBgkqhkiG9w0BCQEWDHJvb3RAbGF6YXJ1cxcNMTMxMjA2MTUzMzUwWhcN
6
+ MTQwMTA1MTUzMzUwWjBMMBICAQwXDTEzMTIwNjE1MjczMFowGgIJAJGUg/wuW1KD
7
+ Fw0xMjEyMTIxODQ4MjJaMBoCCQCRlIP8LltShRcNMTIxMjEyMTg0ODUyWqAOMAww
8
+ CgYDVR0UBAMCAQ4wDQYJKoZIhvcNAQEFBQADgYEAERPfPdQnIafo1lYbFEx2ojrb
9
+ eYqvWN9ykTyUGq2bKv+STYiuaKUz6daGVjELjn/safn5wHkYr9+C/kRRoCor5HYw
10
+ N3uxHnkMpl6Xn7kgXL2b0jbdvfa44faOXdH2gbhzd8bFsOMra4QJHT6CgpYb3ei1
11
+ +ePhAd1KS7tS/dyyP4c=
12
+ -----END X509 CRL-----
@@ -0,0 +1,51 @@
1
+ -----BEGIN ENCRYPTED PRIVATE KEY-----
2
+ MIIFDjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIgWTIkEmBBfoCAggA
3
+ MBQGCCqGSIb3DQMHBAjzL6xrCrEygwSCBMihG8kg3nTnTtWAbB+d1D+HJxriqm37
4
+ 7rwjkfa+T5w5ZBRGpsTt3QB5ep0maX72H55ns6ukkeMoDBSadhDWrGWcLQ2IOGt3
5
+ E14KU6vMFe3gQkfF1fupp7F+3ma58/VNUKa4X5pzZ7OCf8inlLWejp8BRqbrPWqw
6
+ Errgw1kNN3gWfQMr7JtIt1yI1xIMEB2Z976Jn0gaGnJAtzIW4thqjkDdb8b33S9f
7
+ cb7N1Fq4cly22f9HdqNcLgVTi1zIlPXc/f/6mtsGTsJv/rMPthJ7c3Smvh3Fce2G
8
+ w8e+ypfey+9QG3fk7RslaFRe8ShgqfdR8CAalp2UzwNbX91Agyuim3TA6s4jM8N9
9
+ cF6CXlqEaA4sKhiOJmw69DfTC7QRee/gi2A8bz17pX85nKrGiLYn+Od8CEhTFxVk
10
+ lNgBLv4+RcYHVqxWlbJMdDliMN53E+hYbh0y+GDLjteEXbrxRo1aSgd/9PGiSl97
11
+ KY4F7b/OwRzRZh1F+cXY+uP5ZQMbx5EMMkhzuj3Hiy/AVlQrW2B1lXtcf11YFFJj
12
+ xWq6YcpmEjL+xRq1PgoU7ahl6K0A3ScedQA5b1rLdPE8+bkRAfoN+0r8HVkIL7M+
13
+ PorrwuWnvUmovZ0yDvm153HVvRnKZKHcelklphuUWfXvcRNITG/Rx6ssj+MVjqjb
14
+ Xy7t7wgIrk10TFWNEcunGjSSjPDkjYPazJ2dasI0rODzhlQzrnlWM+El9P5zSu2z
15
+ 1Bvet44nmAKi2WLMda5YKbJcLSNbpBFB+rTwDt/D+dfwsJeC0sjpzzatKGXNJLJQ
16
+ 7x9BZfAbBn0QrIZYGMkaxWvcpJcaVUbCKiST4DK5ze584ptrlH+Bqw4u4xLcVrdk
17
+ hu/8IBNybLrl4zahIz7bRRNmw5wo9zUVXPXEtuYak+MK+gmD3TzJ12OUKAlAj3Go
18
+ Fj3NFQoxBJJjuXM3zZRvHp+/AAOUANBYIyV2WssF6C+SH4o+jKyxWC/GawPFvx/B
19
+ gy55kdEt+ORdcOfV8L5Q2xI8Qpck6E3odmaHCvjz1bUVUWqhJcTuoewHRBfWiWgc
20
+ UCXBS/YgendUQroBOPyYIwTtk4XY9fhhKGI4LhWcx4LfzntBnM9FGmDOwhu3HqEd
21
+ HOs8p+HhB8LPjGRot63m7gkJ1T6AswSi9hTeZeSgXuSgL23zqwPGbGTwO3AmFs/M
22
+ 8luXQ4My9bk74K3d9lFdJPaxeTpeeWNodnBItbioT5aImptU+pkKWLTVmXi4V+JE
23
+ 1ootg+DSbz+bKp4A/LLOBO4Rsx5FCGAbBMnKc/n8lF86LjKq2PLRfgdPCaVfBrcd
24
+ TnOkBZYU0HwJAc++4AZQJvA/KRB4UPUzMe2atjVxcrr6r6vL8G04+7TBFoynpzJ+
25
+ 4KZPCJz0Avb4wYKu/IHkdKL7UY8WEGz1mMDbAu4/xCriLg49D2f1eY3FTEjBotBI
26
+ J9hE4ccmwqlxtl4qCVRezh0C+viJ6q2tCji2SPQviaVMNWiis9cZ52J+F9TC2p9R
27
+ PdatJg0rjuVzfoPFE8Rq8V6+zf818b19vQ4F31J+VXTz7sF8it9IO0w/3MbtfBNE
28
+ pKmMZ9h5RdSw1kXRWXbROR9XItS7gE1wkXAxw11z7jqNSNvhotkJXH/A5qGpTFBl
29
+ Z8A=
30
+ -----END ENCRYPTED PRIVATE KEY-----
31
+ -----BEGIN CERTIFICATE-----
32
+ MIIDczCCAtygAwIBAgIBCzANBgkqhkiG9w0BAQUFADCBkjELMAkGA1UEBhMCVVMx
33
+ ETAPBgNVBAgMCE5ldyBZb3JrMRYwFAYDVQQHDA1OZXcgWW9yayBDaXR5MQ4wDAYD
34
+ VQQKDAUxMEdlbjEPMA0GA1UECwwGS2VybmVsMRowGAYDVQQDDBFNeSBDZXJ0IEF1
35
+ dGhvcml0eTEbMBkGCSqGSIb3DQEJARYMcm9vdEBsYXphcnVzMB4XDTEzMTIwNjE1
36
+ MTgxMFoXDTQxMDQyMjE1MTgxMFowazELMAkGA1UEBhMCVVMxETAPBgNVBAgMCE5l
37
+ dyBZb3JrMRYwFAYDVQQHDA1OZXcgWW9yayBDaXR5MQ4wDAYDVQQKDAUxMEdlbjEP
38
+ MA0GA1UECwwGS2VybmVsMRAwDgYDVQQDDAdsYXphcnVzMIIBIjANBgkqhkiG9w0B
39
+ AQEFAAOCAQ8AMIIBCgKCAQEA0+uq+UcogTSS+BLNTwwsBU7/HnNNhNgLKnk8pdUC
40
+ UFOzAjXnXlXEravmbhWeIj5TsCElc5FPE66OvmiixFU6l27Z5P8gopjokxll7e1B
41
+ ujeJOXgy5h+K76xdeQ90JmQX4OO0K5rLXvNH3ufuhGr2NObrBz6kbF5Wdr3urPl6
42
+ pFSLH02zPLqPHhhUvO8jcbUD3RrS/5ZGHqE++F+QRMuYeCXTjECA8iLDvQsiqvT6
43
+ qK1y04V/8K0BYJd/yE31H3cvRLUu7mRAkN87lY1Aj0i3dKM/l2RAa3tsy2/kSDH3
44
+ VeUaqjoPN8PTfJaoMZz7xV7C+Zha+JZh3E7pq6viMR6bkwIDAQABo3sweTAJBgNV
45
+ HRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZp
46
+ Y2F0ZTAdBgNVHQ4EFgQUbw3OWXLJpkDMpGnLWM4vxSbwUSAwHwYDVR0jBBgwFoAU
47
+ B0EZOp9+xbciTre81d/k/Am4ZBYwDQYJKoZIhvcNAQEFBQADgYEAL+OC9x0P7Ql+
48
+ 8NbONrIeOIoJD++K5rUM0vI+u9RDAxTm9TO6cP7Cl6H4zzvlzJ3w9DL66c2r+ZTy
49
+ BxzFO1wtDKUo5RJKneC0tMz0rJQIWTqo45fDLs8UIDB5t4xp6zed34nvct+wIRaV
50
+ hCjHBaVmILlBWb6OF9/kl1JhLtElyDs=
51
+ -----END CERTIFICATE-----
@@ -0,0 +1,34 @@
1
+ -----BEGIN PRIVATE KEY-----
2
+ MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAK53miP9GczBWXnq
3
+ NxHwQkgVqsDuesjwJbWilMK4gf3fjnf2PN3qDpnGbZbPD0ij8975pIKtSPoDycFm
4
+ A8Mogip0yU2Lv2lL56CWthSBftOFDL2CWIsmuuURFXZPiVLtLytfI9oLASZFlywW
5
+ Cs83qEDTvdW8VoVhVsxV1JFDnpXLAgMBAAECgYBoGBgxrMt97UazhNkCrPT/CV5t
6
+ 6lv8E7yMGMrlOyzkCkR4ssQyK3o2qbutJTGbR6czvIM5LKbD9Qqlh3ZrNHokWmTR
7
+ VQQpJxt8HwP5boQvwRHg9+KSGr4JvRko1qxFs9C7Bzjt4r9VxdjhwZPdy0McGI/z
8
+ yPXyQHjqBayrHV1EwQJBANorfCKeIxLhH3LAeUZuRS8ACldJ2N1kL6Ov43/v+0S/
9
+ OprQeBTODuTds3sv7FCT1aYDTOe6JLNOwN2i4YVOMBsCQQDMuCozrwqftD17D06P
10
+ 9+lRXUekY5kFBs5j28Xnl8t8jnuxsXtQUTru660LD0QrmDNSauhpEmlpJknicnGt
11
+ hmwRAkEA12MI6bBPlir0/jgxQqxI1w7mJqj8Vg27zpEuO7dzzLoyJHddpcSNBbwu
12
+ npaAakiZK42klj26T9+XHvjYRuAbMwJBAJ5WnwWEkGH/pUHGEAyYQdSVojDKe/MA
13
+ Vae0tzguFswK5C8GyArSGRPsItYYA7D4MlG/sGx8Oh2C6MiFndkJzBECQDcP1y4r
14
+ Qsek151t1zArLKH4gG5dQAeZ0Lc2VeC4nLMUqVwrHcZDdd1RzLlSaH3j1MekFVfT
15
+ 6v6rrcNLEVbeuk4=
16
+ -----END PRIVATE KEY-----
17
+ -----BEGIN CERTIFICATE-----
18
+ MIIC7jCCAlegAwIBAgIBCjANBgkqhkiG9w0BAQUFADCBkjELMAkGA1UEBhMCVVMx
19
+ ETAPBgNVBAgMCE5ldyBZb3JrMRYwFAYDVQQHDA1OZXcgWW9yayBDaXR5MQ4wDAYD
20
+ VQQKDAUxMEdlbjEPMA0GA1UECwwGS2VybmVsMRowGAYDVQQDDBFNeSBDZXJ0IEF1
21
+ dGhvcml0eTEbMBkGCSqGSIb3DQEJARYMcm9vdEBsYXphcnVzMB4XDTEzMTIwNTEz
22
+ MjU0MFoXDTQxMDQyMTEzMjU0MFowajELMAkGA1UEBhMCVVMxETAPBgNVBAgMCE5l
23
+ dyBZb3JrMRYwFAYDVQQHDA1OZXcgWW9yayBDaXR5MQ4wDAYDVQQKDAUxMEdlbjEP
24
+ MA0GA1UECwwGS2VybmVsMQ8wDQYDVQQDDAZzZXJ2ZXIwgZ8wDQYJKoZIhvcNAQEB
25
+ BQADgY0AMIGJAoGBAK53miP9GczBWXnqNxHwQkgVqsDuesjwJbWilMK4gf3fjnf2
26
+ PN3qDpnGbZbPD0ij8975pIKtSPoDycFmA8Mogip0yU2Lv2lL56CWthSBftOFDL2C
27
+ WIsmuuURFXZPiVLtLytfI9oLASZFlywWCs83qEDTvdW8VoVhVsxV1JFDnpXLAgMB
28
+ AAGjezB5MAkGA1UdEwQCMAAwLAYJYIZIAYb4QgENBB8WHU9wZW5TU0wgR2VuZXJh
29
+ dGVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBQgCkKiZhUV9/Zo7RwYYwm2cNK6tzAf
30
+ BgNVHSMEGDAWgBQHQRk6n37FtyJOt7zV3+T8CbhkFjANBgkqhkiG9w0BAQUFAAOB
31
+ gQCbsfr+Q4pty4Fy38lSxoCgnbB4pX6+Ex3xyw5zxDYR3xUlb/uHBiNZ1dBrXBxU
32
+ ekU8dEvf+hx4iRDSW/C5N6BGnBBhCHcrPabo2bEEWKVsbUC3xchTB5rNGkvnMt9t
33
+ G9ol7vanuzjL3S8/2PB33OshkBH570CxqqPflQbdjwt9dg==
34
+ -----END CERTIFICATE-----
@@ -392,6 +392,63 @@ describe Mongo::Collection::View::Writable do
392
392
  expect(updated[:field]).to eq('testing')
393
393
  end
394
394
  end
395
+
396
+ context 'when upsert is false' do
397
+
398
+ let!(:response) do
399
+ view.replace_one({ field: 'test1' }, upsert: false)
400
+ end
401
+
402
+ let(:updated) do
403
+ authorized_collection.find(field: 'test1').to_a
404
+ end
405
+
406
+ it 'reports that no documents were written' do
407
+ expect(response.written_count).to eq(0)
408
+ end
409
+
410
+ it 'does not insert the document' do
411
+ expect(updated).to be_empty
412
+ end
413
+ end
414
+
415
+ context 'when upsert is true' do
416
+
417
+ let!(:response) do
418
+ view.replace_one({ field: 'test1' }, upsert: true)
419
+ end
420
+
421
+ let(:updated) do
422
+ authorized_collection.find(field: 'test1').first
423
+ end
424
+
425
+ it 'reports that a document was written' do
426
+ expect(response.written_count).to eq(1)
427
+ end
428
+
429
+ it 'inserts the document' do
430
+ expect(updated[:field]).to eq('test1')
431
+ end
432
+ end
433
+
434
+ context 'when upsert is not specified' do
435
+
436
+ let!(:response) do
437
+ view.replace_one({ field: 'test1' })
438
+ end
439
+
440
+ let(:updated) do
441
+ authorized_collection.find(field: 'test1').to_a
442
+ end
443
+
444
+ it 'reports that no documents were written' do
445
+ expect(response.written_count).to eq(0)
446
+ end
447
+
448
+ it 'does not insert the document' do
449
+ expect(updated).to be_empty
450
+ end
451
+ end
395
452
  end
396
453
 
397
454
  describe '#update_many' do
@@ -447,6 +504,65 @@ describe Mongo::Collection::View::Writable do
447
504
  end
448
505
  end
449
506
  end
507
+
508
+ context 'when upsert is false' do
509
+
510
+ let(:response) do
511
+ view.update_many({ '$set'=> { field: 'testing' } },
512
+ upsert: false)
513
+ end
514
+
515
+ let(:updated) do
516
+ authorized_collection.find.to_a
517
+ end
518
+
519
+ it 'reports that no documents were updated' do
520
+ expect(response.written_count).to eq(0)
521
+ end
522
+
523
+ it 'updates no documents in the collection' do
524
+ expect(updated).to be_empty
525
+ end
526
+ end
527
+
528
+ context 'when upsert is true' do
529
+
530
+ let!(:response) do
531
+ view.update_many({ '$set'=> { field: 'testing' } },
532
+ upsert: true)
533
+ end
534
+
535
+ let(:updated) do
536
+ authorized_collection.find.first
537
+ end
538
+
539
+ it 'reports that a document was written' do
540
+ expect(response.written_count).to eq(1)
541
+ end
542
+
543
+ it 'inserts a document into the collection' do
544
+ expect(updated[:field]).to eq('testing')
545
+ end
546
+ end
547
+
548
+ context 'when upsert is not specified' do
549
+
550
+ let(:response) do
551
+ view.update_many({ '$set'=> { field: 'testing' } })
552
+ end
553
+
554
+ let(:updated) do
555
+ authorized_collection.find.to_a
556
+ end
557
+
558
+ it 'reports that no documents were updated' do
559
+ expect(response.written_count).to eq(0)
560
+ end
561
+
562
+ it 'updates no documents in the collection' do
563
+ expect(updated).to be_empty
564
+ end
565
+ end
450
566
  end
451
567
 
452
568
  describe '#update_one' do
@@ -500,5 +616,64 @@ describe Mongo::Collection::View::Writable do
500
616
  expect(updated[:field]).to eq('testing')
501
617
  end
502
618
  end
619
+
620
+ context 'when upsert is false' do
621
+
622
+ let(:response) do
623
+ view.update_one({ '$set'=> { field: 'testing' } },
624
+ upsert: false)
625
+ end
626
+
627
+ let(:updated) do
628
+ authorized_collection.find.to_a
629
+ end
630
+
631
+ it 'reports that no documents were updated' do
632
+ expect(response.written_count).to eq(0)
633
+ end
634
+
635
+ it 'updates no documents in the collection' do
636
+ expect(updated).to be_empty
637
+ end
638
+ end
639
+
640
+ context 'when upsert is true' do
641
+
642
+ let!(:response) do
643
+ view.update_one({ '$set'=> { field: 'testing' } },
644
+ upsert: true)
645
+ end
646
+
647
+ let(:updated) do
648
+ authorized_collection.find.first
649
+ end
650
+
651
+ it 'reports that a document was written' do
652
+ expect(response.written_count).to eq(1)
653
+ end
654
+
655
+ it 'inserts a document into the collection' do
656
+ expect(updated[:field]).to eq('testing')
657
+ end
658
+ end
659
+
660
+ context 'when upsert is not specified' do
661
+
662
+ let(:response) do
663
+ view.update_one({ '$set'=> { field: 'testing' } })
664
+ end
665
+
666
+ let(:updated) do
667
+ authorized_collection.find.to_a
668
+ end
669
+
670
+ it 'reports that no documents were updated' do
671
+ expect(response.written_count).to eq(0)
672
+ end
673
+
674
+ it 'updates no documents in the collection' do
675
+ expect(updated).to be_empty
676
+ end
677
+ end
503
678
  end
504
679
  end
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'CRUD' do
4
+
5
+ CRUD_TESTS.each do |file|
6
+
7
+ spec = Mongo::CRUD::Spec.new(file)
8
+
9
+ context(spec.description) do
10
+
11
+ spec.tests.each do |test|
12
+
13
+ context(test.description) do
14
+
15
+ before(:each) do
16
+ authorized_collection.find.delete_many
17
+ end
18
+
19
+ after(:each) do
20
+ authorized_collection.find.delete_many
21
+ end
22
+
23
+ let(:results) do
24
+ test.run(authorized_collection)
25
+ end
26
+
27
+ it "returns the correct result" do
28
+ skip 'Test results only match with server version >= 2.6' if test.requires_2_6?(write_command_enabled?,
29
+ authorized_collection)
30
+ expect(results).to eq(test.result)
31
+ end
32
+
33
+ it 'has the correct data in the collection' do
34
+ skip 'Test results only match with server version >= 2.6' if test.requires_2_6?(write_command_enabled?,
35
+ authorized_collection)
36
+ expect(test.run(authorized_collection)).to match_collection_data(test)
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -66,4 +66,27 @@ describe Mongo::Grid::File::Metadata do
66
66
  end
67
67
  end
68
68
  end
69
+
70
+ describe '#inspect' do
71
+
72
+ let(:metadata) do
73
+ described_class.new(:filename => 'test.txt', :length => 7)
74
+ end
75
+
76
+ it 'includes the chunk size' do
77
+ expect(metadata.inspect).to include(metadata.chunk_size.to_s)
78
+ end
79
+
80
+ it 'includes the filename' do
81
+ expect(metadata.inspect).to include(metadata.filename)
82
+ end
83
+
84
+ it 'includes the md5' do
85
+ expect(metadata.inspect).to include(metadata.md5.to_s)
86
+ end
87
+
88
+ it 'includes the id' do
89
+ expect(metadata.inspect).to include(metadata.id.to_s)
90
+ end
91
+ end
69
92
  end
@@ -66,6 +66,29 @@ describe Mongo::Grid::File do
66
66
  end
67
67
  end
68
68
 
69
+ context 'when data is a ruby file' do
70
+
71
+ let(:ruby_file) do
72
+ File.open(__FILE__)
73
+ end
74
+
75
+ let(:data) do
76
+ ruby_file.read
77
+ end
78
+
79
+ let(:file) do
80
+ described_class.new(data, :filename => File.basename(ruby_file.path))
81
+ end
82
+
83
+ it 'sets the data' do
84
+ expect(file.data).to eq(data)
85
+ end
86
+
87
+ it 'creates the chunks' do
88
+ expect(file.chunks.size).to eq(4)
89
+ end
90
+ end
91
+
69
92
  context 'when using idiomatic ruby field names' do
70
93
 
71
94
  let(:time) do
@@ -135,4 +158,15 @@ describe Mongo::Grid::File do
135
158
  end
136
159
  end
137
160
  end
161
+
162
+ describe '#inspect' do
163
+
164
+ let(:file) do
165
+ described_class.new('Hi', :filename => 'test.txt')
166
+ end
167
+
168
+ it 'includes the filename' do
169
+ expect(file.inspect).to include('test.txt')
170
+ end
171
+ end
138
172
  end
@@ -99,6 +99,10 @@ describe Mongo::Operation::Write::Delete do
99
99
  it 'deletes the documents from the database' do
100
100
  expect(result.written_count).to eq(1)
101
101
  end
102
+
103
+ it 'reports the correct deleted count' do
104
+ expect(result.deleted_count).to eq(1)
105
+ end
102
106
  end
103
107
 
104
108
  context 'when the delete fails' do
@@ -139,6 +143,10 @@ describe Mongo::Operation::Write::Delete do
139
143
  it 'deletes the documents from the database' do
140
144
  expect(result.written_count).to eq(2)
141
145
  end
146
+
147
+ it 'reports the correct deleted count' do
148
+ expect(result.deleted_count).to eq(2)
149
+ end
142
150
  end
143
151
 
144
152
  context 'when a delete fails' do
@@ -3,7 +3,8 @@ require 'spec_helper'
3
3
  describe Mongo::Operation::Write::Insert do
4
4
 
5
5
  let(:documents) do
6
- [{ :name => 'test' }]
6
+ [{ '_id' => 1,
7
+ 'name' => 'test' }]
7
8
  end
8
9
 
9
10
  let(:spec) do
@@ -94,17 +95,21 @@ describe Mongo::Operation::Write::Insert do
94
95
 
95
96
  context 'when the insert succeeds' do
96
97
 
97
- let(:response) do
98
+ let!(:response) do
98
99
  insert.execute(authorized_primary.context)
99
100
  end
100
101
 
101
- it 'inserts the documents into the database', if: write_command_enabled? do
102
+ it 'reports the correct written count', if: write_command_enabled? do
102
103
  expect(response.written_count).to eq(1)
103
104
  end
104
105
 
105
- it 'inserts the documents into the database', unless: write_command_enabled? do
106
+ it 'reports the correct written count', unless: write_command_enabled? do
106
107
  expect(response.written_count).to eq(0)
107
108
  end
109
+
110
+ it 'inserts the document into the collection' do
111
+ expect(authorized_collection.find(_id: 1).to_a). to eq(documents)
112
+ end
108
113
  end
109
114
 
110
115
  context 'when the insert fails' do
@@ -139,20 +144,27 @@ describe Mongo::Operation::Write::Insert do
139
144
  context 'when the insert succeeds' do
140
145
 
141
146
  let(:documents) do
142
- [{ name: 'test1' }, { name: 'test2' }]
147
+ [{ '_id' => 1,
148
+ 'name' => 'test1' },
149
+ { '_id' => 2,
150
+ 'name' => 'test2' }]
143
151
  end
144
152
 
145
- let(:response) do
153
+ let!(:response) do
146
154
  insert.execute(authorized_primary.context)
147
155
  end
148
156
 
149
- it 'inserts the documents into the database', if: write_command_enabled? do
157
+ it 'reports the correct written count', if: write_command_enabled? do
150
158
  expect(response.written_count).to eq(2)
151
159
  end
152
160
 
153
- it 'inserts the documents into the database', unless: write_command_enabled? do
161
+ it 'reports the correct written count', unless: write_command_enabled? do
154
162
  expect(response.written_count).to eq(0)
155
163
  end
164
+
165
+ it 'inserts the documents into the collection' do
166
+ expect(authorized_collection.find.to_a). to eq(documents)
167
+ end
156
168
  end
157
169
 
158
170
  context 'when the insert fails on the last document' do
@@ -205,6 +217,7 @@ describe Mongo::Operation::Write::Insert do
205
217
  failing_insert.execute(authorized_primary.context)
206
218
  }.to raise_error(Mongo::Error::OperationFailure)
207
219
  end
220
+
208
221
  end
209
222
 
210
223
  context 'when a document exceeds max bson size' do