mongo 2.3.1 → 2.4.0.rc0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (170) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +2 -3
  4. data/lib/mongo/bulk_write.rb +8 -7
  5. data/lib/mongo/bulk_write/combineable.rb +4 -0
  6. data/lib/mongo/bulk_write/transformable.rb +17 -5
  7. data/lib/mongo/bulk_write/validatable.rb +1 -0
  8. data/lib/mongo/client.rb +3 -0
  9. data/lib/mongo/cluster.rb +8 -0
  10. data/lib/mongo/cluster/app_metadata.rb +135 -0
  11. data/lib/mongo/collection.rb +42 -10
  12. data/lib/mongo/collection/view.rb +15 -1
  13. data/lib/mongo/collection/view/aggregation.rb +5 -0
  14. data/lib/mongo/collection/view/builder/aggregation.rb +13 -3
  15. data/lib/mongo/collection/view/builder/find_command.rb +7 -21
  16. data/lib/mongo/collection/view/builder/map_reduce.rb +22 -5
  17. data/lib/mongo/collection/view/iterable.rb +1 -0
  18. data/lib/mongo/collection/view/map_reduce.rb +5 -0
  19. data/lib/mongo/collection/view/readable.rb +35 -14
  20. data/lib/mongo/collection/view/writable.rb +54 -23
  21. data/lib/mongo/cursor/builder/get_more_command.rb +2 -3
  22. data/lib/mongo/database.rb +10 -2
  23. data/lib/mongo/error.rb +2 -0
  24. data/lib/mongo/error/invalid_application_name.rb +38 -0
  25. data/lib/mongo/error/invalid_server_preference.rb +24 -3
  26. data/lib/mongo/error/unsupported_collation.rb +51 -0
  27. data/lib/mongo/index/view.rb +28 -15
  28. data/lib/mongo/operation.rb +6 -0
  29. data/lib/mongo/operation/commands.rb +3 -0
  30. data/lib/mongo/operation/commands/aggregate.rb +10 -10
  31. data/lib/mongo/operation/commands/create.rb +45 -0
  32. data/lib/mongo/operation/commands/drop.rb +45 -0
  33. data/lib/mongo/operation/commands/drop_database.rb +45 -0
  34. data/lib/mongo/operation/commands/map_reduce.rb +12 -1
  35. data/lib/mongo/operation/commands/parallel_scan.rb +1 -0
  36. data/lib/mongo/operation/read_preference.rb +9 -9
  37. data/lib/mongo/operation/specifiable.rb +34 -0
  38. data/lib/mongo/operation/takes_write_concern.rb +35 -0
  39. data/lib/mongo/operation/write/bulk/bulkable.rb +1 -1
  40. data/lib/mongo/operation/write/command/create_index.rb +6 -0
  41. data/lib/mongo/operation/write/command/drop_index.rb +6 -0
  42. data/lib/mongo/operation/write/command/insert.rb +1 -1
  43. data/lib/mongo/operation/write/command/update.rb +1 -0
  44. data/lib/mongo/operation/write/command/writable.rb +2 -2
  45. data/lib/mongo/operation/write/create_index.rb +2 -2
  46. data/lib/mongo/operation/write/create_user.rb +1 -1
  47. data/lib/mongo/operation/write/delete.rb +5 -1
  48. data/lib/mongo/operation/write/gle.rb +1 -1
  49. data/lib/mongo/operation/write/insert.rb +2 -2
  50. data/lib/mongo/operation/write/remove_user.rb +1 -1
  51. data/lib/mongo/operation/write/update.rb +5 -1
  52. data/lib/mongo/operation/write/update_user.rb +1 -1
  53. data/lib/mongo/operation/write/write_command_enabled.rb +10 -2
  54. data/lib/mongo/protocol/insert.rb +1 -2
  55. data/lib/mongo/protocol/query.rb +3 -7
  56. data/lib/mongo/server.rb +8 -3
  57. data/lib/mongo/server/connection.rb +17 -11
  58. data/lib/mongo/server/description.rb +22 -0
  59. data/lib/mongo/server/description/features.rb +2 -0
  60. data/lib/mongo/server/monitor.rb +5 -0
  61. data/lib/mongo/server/monitor/connection.rb +11 -0
  62. data/lib/mongo/server_selector/nearest.rb +9 -6
  63. data/lib/mongo/server_selector/primary.rb +4 -0
  64. data/lib/mongo/server_selector/primary_preferred.rb +7 -1
  65. data/lib/mongo/server_selector/secondary.rb +5 -0
  66. data/lib/mongo/server_selector/secondary_preferred.rb +7 -2
  67. data/lib/mongo/server_selector/selectable.rb +57 -10
  68. data/lib/mongo/socket/ssl.rb +1 -0
  69. data/lib/mongo/uri.rb +4 -0
  70. data/lib/mongo/version.rb +1 -1
  71. data/lib/mongo/write_concern.rb +1 -0
  72. data/mongo.gemspec +1 -1
  73. data/spec/mongo/auth/cr_spec.rb +7 -1
  74. data/spec/mongo/auth/ldap_spec.rb +7 -1
  75. data/spec/mongo/auth/scram_spec.rb +7 -1
  76. data/spec/mongo/auth/x509_spec.rb +7 -1
  77. data/spec/mongo/bulk_write_spec.rb +598 -5
  78. data/spec/mongo/client_spec.rb +47 -1
  79. data/spec/mongo/cluster/app_metadata_spec.rb +104 -0
  80. data/spec/mongo/cluster/topology/replica_set_spec.rb +14 -8
  81. data/spec/mongo/cluster/topology/sharded_spec.rb +9 -3
  82. data/spec/mongo/cluster/topology/single_spec.rb +10 -4
  83. data/spec/mongo/cluster_spec.rb +29 -0
  84. data/spec/mongo/collection/view/aggregation_spec.rb +139 -0
  85. data/spec/mongo/collection/view/builder/find_command_spec.rb +6 -243
  86. data/spec/mongo/collection/view/map_reduce_spec.rb +104 -0
  87. data/spec/mongo/collection/view/readable_spec.rb +83 -0
  88. data/spec/mongo/collection/view/writable_spec.rb +447 -1
  89. data/spec/mongo/collection/view_spec.rb +57 -0
  90. data/spec/mongo/collection_spec.rb +926 -101
  91. data/spec/mongo/crud_spec.rb +4 -5
  92. data/spec/mongo/database_spec.rb +99 -1
  93. data/spec/mongo/index/view_spec.rb +360 -31
  94. data/spec/mongo/max_staleness_spec.rb +108 -0
  95. data/spec/mongo/operation/read_preference_spec.rb +8 -8
  96. data/spec/mongo/operation/write/command/delete_spec.rb +1 -1
  97. data/spec/mongo/operation/write/command/insert_spec.rb +1 -1
  98. data/spec/mongo/operation/write/command/update_spec.rb +1 -1
  99. data/spec/mongo/server/connection_pool_spec.rb +3 -1
  100. data/spec/mongo/server/connection_spec.rb +17 -7
  101. data/spec/mongo/server/description/features_spec.rb +50 -0
  102. data/spec/mongo/server/description_spec.rb +9 -3
  103. data/spec/mongo/server_selection_spec.rb +5 -3
  104. data/spec/mongo/server_selector/nearest_spec.rb +73 -0
  105. data/spec/mongo/server_selector/primary_preferred_spec.rb +73 -0
  106. data/spec/mongo/server_selector/primary_spec.rb +36 -0
  107. data/spec/mongo/server_selector/secondary_preferred_spec.rb +73 -0
  108. data/spec/mongo/server_selector/secondary_spec.rb +73 -0
  109. data/spec/mongo/server_selector_spec.rb +53 -0
  110. data/spec/mongo/server_spec.rb +3 -1
  111. data/spec/mongo/uri_spec.rb +54 -0
  112. data/spec/mongo/write_concern_spec.rb +18 -0
  113. data/spec/spec_helper.rb +10 -0
  114. data/spec/support/authorization.rb +8 -1
  115. data/spec/support/crud.rb +15 -0
  116. data/spec/support/crud/read.rb +27 -19
  117. data/spec/support/crud/write.rb +28 -3
  118. data/spec/support/crud_tests/read/aggregate.yml +15 -3
  119. data/spec/support/crud_tests/read/count.yml +14 -3
  120. data/spec/support/crud_tests/read/distinct.yml +13 -1
  121. data/spec/support/crud_tests/read/find.yml +12 -2
  122. data/spec/support/crud_tests/write/deleteMany.yml +22 -1
  123. data/spec/support/crud_tests/write/deleteOne.yml +20 -1
  124. data/spec/support/crud_tests/write/findOneAndDelete.yml +27 -2
  125. data/spec/support/crud_tests/write/findOneAndReplace.yml +43 -14
  126. data/spec/support/crud_tests/write/findOneAndUpdate.yml +50 -8
  127. data/spec/support/crud_tests/write/replaceOne.yml +34 -10
  128. data/spec/support/crud_tests/write/updateMany.yml +42 -11
  129. data/spec/support/crud_tests/write/updateOne.yml +32 -7
  130. data/spec/support/max_staleness/ReplicaSetNoPrimary/DefaultNoMaxStaleness.yml +26 -0
  131. data/spec/support/max_staleness/ReplicaSetNoPrimary/Incompatible.yml +25 -0
  132. data/spec/support/max_staleness/ReplicaSetNoPrimary/LastUpdateTime.yml +33 -0
  133. data/spec/support/max_staleness/ReplicaSetNoPrimary/Nearest.yml +33 -0
  134. data/spec/support/max_staleness/ReplicaSetNoPrimary/Nearest2.yml +33 -0
  135. data/spec/support/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred.yml +27 -0
  136. data/spec/support/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred_tags.yml +36 -0
  137. data/spec/support/max_staleness/ReplicaSetNoPrimary/Secondary.yml +51 -0
  138. data/spec/support/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred.yml +26 -0
  139. data/spec/support/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred_tags.yml +51 -0
  140. data/spec/support/max_staleness/ReplicaSetWithPrimary/DefaultNoMaxStaleness.yml +26 -0
  141. data/spec/support/max_staleness/ReplicaSetWithPrimary/Incompatible.yml +25 -0
  142. data/spec/support/max_staleness/ReplicaSetWithPrimary/LastUpdateTime.yml +35 -0
  143. data/spec/support/max_staleness/ReplicaSetWithPrimary/MaxStalenessTooSmall.yml +25 -0
  144. data/spec/support/max_staleness/ReplicaSetWithPrimary/MaxStalenessWithModePrimary.yml +23 -0
  145. data/spec/support/max_staleness/ReplicaSetWithPrimary/Nearest.yml +33 -0
  146. data/spec/support/max_staleness/ReplicaSetWithPrimary/Nearest2.yml +33 -0
  147. data/spec/support/max_staleness/ReplicaSetWithPrimary/Nearest_tags.yml +36 -0
  148. data/spec/support/max_staleness/ReplicaSetWithPrimary/PrimaryPreferred.yml +27 -0
  149. data/spec/support/max_staleness/ReplicaSetWithPrimary/PrimaryPreferred_incompatible.yml +27 -0
  150. data/spec/support/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred.yml +26 -0
  151. data/spec/support/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags.yml +59 -0
  152. data/spec/support/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags2.yml +43 -0
  153. data/spec/support/max_staleness/ReplicaSetWithPrimary/Secondary_tags.yml +59 -0
  154. data/spec/support/max_staleness/ReplicaSetWithPrimary/Secondary_tags2.yml +43 -0
  155. data/spec/support/max_staleness/ReplicaSetWithPrimary/ShortHeartbeartShortMaxStaleness.yml +29 -0
  156. data/spec/support/max_staleness/ReplicaSetWithPrimary/ShortHeartbeartShortMaxStaleness2.yml +29 -0
  157. data/spec/support/max_staleness/ReplicaSetWithPrimary/ZeroMaxStaleness.yml +27 -0
  158. data/spec/support/max_staleness/Sharded/Incompatible.yml +25 -0
  159. data/spec/support/max_staleness/Sharded/SmallMaxStaleness.yml +20 -0
  160. data/spec/support/max_staleness/Single/Incompatible.yml +18 -0
  161. data/spec/support/max_staleness/Single/SmallMaxStaleness.yml +20 -0
  162. data/spec/support/server_selection.rb +25 -0
  163. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest_multiple.yml +27 -0
  164. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary_multi_tags.yml +31 -0
  165. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary_multi_tags2.yml +31 -0
  166. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest_multiple.yml +34 -0
  167. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/SecondaryPreferred_tags.yml +28 -0
  168. data/spec/support/shared/server_selector.rb +4 -3
  169. metadata +91 -6
  170. metadata.gz.sig +0 -0
@@ -14,8 +14,14 @@ describe Mongo::Auth::LDAP do
14
14
  Mongo::Event::Listeners.new
15
15
  end
16
16
 
17
+ let(:cluster) do
18
+ double('cluster').tap do |cl|
19
+ allow(cl).to receive(:app_metadata).and_return(app_metadata)
20
+ end
21
+ end
22
+
17
23
  let(:server) do
18
- Mongo::Server.new(address, double('cluster'), monitoring, listeners, TEST_OPTIONS)
24
+ Mongo::Server.new(address, cluster, monitoring, listeners, TEST_OPTIONS)
19
25
  end
20
26
 
21
27
  let(:connection) do
@@ -14,8 +14,14 @@ describe Mongo::Auth::SCRAM do
14
14
  Mongo::Event::Listeners.new
15
15
  end
16
16
 
17
+ let(:cluster) do
18
+ double('cluster').tap do |cl|
19
+ allow(cl).to receive(:app_metadata).and_return(app_metadata)
20
+ end
21
+ end
22
+
17
23
  let(:server) do
18
- Mongo::Server.new(address, double('cluster'), monitoring, listeners, TEST_OPTIONS)
24
+ Mongo::Server.new(address, cluster, monitoring, listeners, TEST_OPTIONS)
19
25
  end
20
26
 
21
27
  let(:connection) do
@@ -14,8 +14,14 @@ describe Mongo::Auth::X509 do
14
14
  Mongo::Event::Listeners.new
15
15
  end
16
16
 
17
+ let(:cluster) do
18
+ double('cluster').tap do |cl|
19
+ allow(cl).to receive(:app_metadata).and_return(app_metadata)
20
+ end
21
+ end
22
+
17
23
  let(:server) do
18
- Mongo::Server.new(address, double('cluster'), monitoring, listeners, TEST_OPTIONS)
24
+ Mongo::Server.new(address, cluster, monitoring, listeners, TEST_OPTIONS)
19
25
  end
20
26
 
21
27
  let(:connection) do
@@ -12,6 +12,7 @@ describe Mongo::BulkWrite do
12
12
  end
13
13
 
14
14
  let(:collection_with_validator) do
15
+ begin; authorized_client[:validating].drop; rescue; end
15
16
  authorized_client[:validating,
16
17
  :validator => { :a => { '$exists' => true } }].tap do |c|
17
18
  c.create
@@ -22,6 +23,10 @@ describe Mongo::BulkWrite do
22
23
  authorized_collection.client.with(write: { w: (WRITE_CONCERN[:w] + 1) })[authorized_collection.name]
23
24
  end
24
25
 
26
+ let(:collation) do
27
+ { locale: 'en_US', strength: 2 }
28
+ end
29
+
25
30
  describe '#execute' do
26
31
 
27
32
  shared_examples_for 'an executable bulk write' do
@@ -205,6 +210,64 @@ describe Mongo::BulkWrite do
205
210
  }.to raise_error(Mongo::Error::OperationFailure)
206
211
  end
207
212
  end
213
+
214
+ context 'when the write has a collation specified' do
215
+
216
+ before do
217
+ authorized_collection.insert_one(name: 'bang')
218
+ end
219
+
220
+ let(:requests) do
221
+ [{ delete_one: { filter: { name: 'BANG' }, collation: collation } }]
222
+ end
223
+
224
+ context 'when the server selected supports collations', if: collation_enabled? do
225
+
226
+ let!(:result) do
227
+ bulk_write.execute
228
+ end
229
+
230
+ it 'applies the collation' do
231
+ expect(authorized_collection.find(name: 'bang').count).to eq(0)
232
+ end
233
+
234
+ it 'reports the deleted count' do
235
+ expect(result.deleted_count).to eq(1)
236
+ end
237
+ end
238
+
239
+ context 'when the server selected does not support collations', unless: collation_enabled? do
240
+
241
+ it 'raises an exception' do
242
+ expect {
243
+ bulk_write.execute
244
+ }.to raise_exception(Mongo::Error::UnsupportedCollation)
245
+ end
246
+ end
247
+ end
248
+
249
+ context 'when a collation is not specified' do
250
+
251
+ before do
252
+ authorized_collection.insert_one(name: 'bang')
253
+ end
254
+
255
+ let(:requests) do
256
+ [{ delete_one: { filter: { name: 'BANG' }}}]
257
+ end
258
+
259
+ let!(:result) do
260
+ bulk_write.execute
261
+ end
262
+
263
+ it 'does not apply the collation' do
264
+ expect(authorized_collection.find(name: 'bang').count).to eq(1)
265
+ end
266
+
267
+ it 'reports the deleted count' do
268
+ expect(result.deleted_count).to eq(0)
269
+ end
270
+ end
208
271
  end
209
272
 
210
273
  context 'when multiple documents match delete selector' do
@@ -273,6 +336,68 @@ describe Mongo::BulkWrite do
273
336
  end
274
337
  end
275
338
  end
339
+
340
+ context 'when the write has a collation specified' do
341
+
342
+ before do
343
+ authorized_collection.insert_one(name: 'bang')
344
+ authorized_collection.insert_one(name: 'doink')
345
+ end
346
+
347
+ let(:requests) do
348
+ [{ delete_one: { filter: { name: 'BANG' }, collation: collation }},
349
+ { delete_one: { filter: { name: 'DOINK' }, collation: collation }}]
350
+ end
351
+
352
+ context 'when the server selected supports collations', if: collation_enabled? do
353
+
354
+ let!(:result) do
355
+ bulk_write.execute
356
+ end
357
+
358
+ it 'applies the collation' do
359
+ expect(authorized_collection.find(name: { '$in' => ['bang', 'doink']}).count).to eq(0)
360
+ end
361
+
362
+ it 'reports the deleted count' do
363
+ expect(result.deleted_count).to eq(2)
364
+ end
365
+ end
366
+
367
+ context 'when the server selected does not support collations', unless: collation_enabled? do
368
+
369
+ it 'raises an exception' do
370
+ expect {
371
+ bulk_write.execute
372
+ }.to raise_exception(Mongo::Error::UnsupportedCollation)
373
+ end
374
+ end
375
+ end
376
+
377
+ context 'when the write does not have a collation specified' do
378
+
379
+ before do
380
+ authorized_collection.insert_one(name: 'bang')
381
+ authorized_collection.insert_one(name: 'doink')
382
+ end
383
+
384
+ let(:requests) do
385
+ [{ delete_one: { filter: { name: 'BANG' }}},
386
+ { delete_one: { filter: { name: 'DOINK' }}}]
387
+ end
388
+
389
+ let!(:result) do
390
+ bulk_write.execute
391
+ end
392
+
393
+ it 'does not apply the collation' do
394
+ expect(authorized_collection.find(name: { '$in' => ['bang', 'doink']}).count).to eq(2)
395
+ end
396
+
397
+ it 'reports the deleted count' do
398
+ expect(result.deleted_count).to eq(0)
399
+ end
400
+ end
276
401
  end
277
402
 
278
403
  context 'when provided a single delete many' do
@@ -314,6 +439,66 @@ describe Mongo::BulkWrite do
314
439
  end
315
440
  end
316
441
  end
442
+
443
+ context 'when the write has a collation specified' do
444
+
445
+ before do
446
+ authorized_collection.insert_one(name: 'bang')
447
+ authorized_collection.insert_one(name: 'bang')
448
+ end
449
+
450
+ let(:requests) do
451
+ [{ delete_many: { filter: { name: 'BANG' }, collation: collation }}]
452
+ end
453
+
454
+ context 'when the server selected supports collations', if: collation_enabled? do
455
+
456
+ let!(:result) do
457
+ bulk_write.execute
458
+ end
459
+
460
+ it 'applies the collation' do
461
+ expect(authorized_collection.find(name: 'bang').count).to eq(0)
462
+ end
463
+
464
+ it 'reports the deleted count' do
465
+ expect(result.deleted_count).to eq(2)
466
+ end
467
+ end
468
+
469
+ context 'when the server selected does not support collations', unless: collation_enabled? do
470
+
471
+ it 'raises an exception' do
472
+ expect {
473
+ bulk_write.execute
474
+ }.to raise_exception(Mongo::Error::UnsupportedCollation)
475
+ end
476
+ end
477
+ end
478
+
479
+ context 'when a collation is not specified' do
480
+
481
+ before do
482
+ authorized_collection.insert_one(name: 'bang')
483
+ authorized_collection.insert_one(name: 'bang')
484
+ end
485
+
486
+ let(:requests) do
487
+ [{ delete_many: { filter: { name: 'BANG' }}}]
488
+ end
489
+
490
+ let!(:result) do
491
+ bulk_write.execute
492
+ end
493
+
494
+ it 'does not apply the collation' do
495
+ expect(authorized_collection.find(name: 'bang').count).to eq(2)
496
+ end
497
+
498
+ it 'reports the deleted count' do
499
+ expect(result.deleted_count).to eq(0)
500
+ end
501
+ end
317
502
  end
318
503
 
319
504
  context 'when provided multiple delete many ops' do
@@ -361,6 +546,70 @@ describe Mongo::BulkWrite do
361
546
  end
362
547
  end
363
548
  end
549
+
550
+ context 'when the write has a collation specified' do
551
+
552
+ before do
553
+ authorized_collection.insert_one(name: 'bang')
554
+ authorized_collection.insert_one(name: 'bang')
555
+ authorized_collection.insert_one(name: 'doink')
556
+ end
557
+
558
+ let(:requests) do
559
+ [{ delete_many: { filter: { name: 'BANG' }, collation: collation }},
560
+ { delete_many: { filter: { name: 'DOINK' }, collation: collation }}]
561
+ end
562
+
563
+ context 'when the server selected supports collations', if: collation_enabled? do
564
+
565
+ let!(:result) do
566
+ bulk_write.execute
567
+ end
568
+
569
+ it 'applies the collation' do
570
+ expect(authorized_collection.find(name: { '$in' => ['bang', 'doink'] }).count).to eq(0)
571
+ end
572
+
573
+ it 'reports the deleted count' do
574
+ expect(result.deleted_count).to eq(3)
575
+ end
576
+ end
577
+
578
+ context 'when the server selected does not support collations', unless: collation_enabled? do
579
+
580
+ it 'raises an exception' do
581
+ expect {
582
+ bulk_write.execute
583
+ }.to raise_exception(Mongo::Error::UnsupportedCollation)
584
+ end
585
+ end
586
+ end
587
+
588
+ context 'when a collation is not specified' do
589
+
590
+ before do
591
+ authorized_collection.insert_one(name: 'bang')
592
+ authorized_collection.insert_one(name: 'bang')
593
+ authorized_collection.insert_one(name: 'doink')
594
+ end
595
+
596
+ let(:requests) do
597
+ [{ delete_many: { filter: { name: 'BANG' }}},
598
+ { delete_many: { filter: { name: 'DOINK' }}}]
599
+ end
600
+
601
+ let!(:result) do
602
+ bulk_write.execute
603
+ end
604
+
605
+ it 'does not apply the collation' do
606
+ expect(authorized_collection.find(name: { '$in' => ['bang', 'doink'] }).count).to eq(3)
607
+ end
608
+
609
+ it 'reports the deleted count' do
610
+ expect(result.deleted_count).to eq(0)
611
+ end
612
+ end
364
613
  end
365
614
 
366
615
  context 'when providing a single replace one' do
@@ -402,6 +651,90 @@ describe Mongo::BulkWrite do
402
651
  end
403
652
  end
404
653
  end
654
+
655
+ context 'when the write has a collation specified' do
656
+
657
+ before do
658
+ authorized_collection.insert_one(name: 'bang')
659
+ end
660
+
661
+ let(:requests) do
662
+ [{ replace_one: { filter: { name: 'BANG' },
663
+ replacement: { other: 'pong' },
664
+ collation: collation }}]
665
+ end
666
+
667
+ context 'when the server selected supports collations', if: collation_enabled? do
668
+
669
+ let!(:result) do
670
+ bulk_write.execute
671
+ end
672
+
673
+ it 'applies the collation' do
674
+ expect(authorized_collection.find(other: 'pong').count).to eq(1)
675
+ end
676
+
677
+ it 'reports the upserted id' do
678
+ expect(result.upserted_ids).to eq([])
679
+ end
680
+
681
+ it 'reports the upserted count' do
682
+ expect(result.upserted_count).to eq(0)
683
+ end
684
+
685
+ it 'reports the modified count' do
686
+ expect(result.modified_count).to eq(1)
687
+ end
688
+
689
+ it 'reports the matched count' do
690
+ expect(result.matched_count).to eq(1)
691
+ end
692
+ end
693
+
694
+ context 'when the server selected does not support collations', unless: collation_enabled? do
695
+
696
+ it 'raises an exception' do
697
+ expect {
698
+ bulk_write.execute
699
+ }.to raise_exception(Mongo::Error::UnsupportedCollation)
700
+ end
701
+ end
702
+ end
703
+
704
+ context 'when the write does not have a collation specified' do
705
+
706
+ before do
707
+ authorized_collection.insert_one(name: 'bang')
708
+ end
709
+
710
+ let(:requests) do
711
+ [{ replace_one: { filter: { name: 'BANG' }, replacement: { other: 'pong' }}}]
712
+ end
713
+
714
+ let!(:result) do
715
+ bulk_write.execute
716
+ end
717
+
718
+ it 'does not apply the collation' do
719
+ expect(authorized_collection.find(other: 'pong').count).to eq(0)
720
+ end
721
+
722
+ it 'reports the upserted id' do
723
+ expect(result.upserted_ids).to eq([])
724
+ end
725
+
726
+ it 'reports the upserted count' do
727
+ expect(result.upserted_count).to eq(0)
728
+ end
729
+
730
+ it 'reports the modified count' do
731
+ expect(result.modified_count).to eq(0)
732
+ end
733
+
734
+ it 'reports the matched count' do
735
+ expect(result.matched_count).to eq(0)
736
+ end
737
+ end
405
738
  end
406
739
 
407
740
  context 'when providing a single update one' do
@@ -523,12 +856,12 @@ describe Mongo::BulkWrite do
523
856
  expect(result.upserted_count).to eq(1)
524
857
  end
525
858
 
526
- it 'reports the matched count' do
859
+ it 'reports the modified_count count' do
527
860
  expect(result.modified_count).to eq(0)
528
861
  end
529
862
 
530
- it 'reports the modified count' do
531
- expect(result.modified_count).to eq(0)
863
+ it 'reports the matched count' do
864
+ expect(result.matched_count).to eq(0)
532
865
  end
533
866
 
534
867
  it 'reports the upserted id', if: write_command_enabled? do
@@ -556,10 +889,184 @@ describe Mongo::BulkWrite do
556
889
  end
557
890
  end
558
891
  end
892
+
893
+ context 'when the write has a collation specified' do
894
+
895
+ before do
896
+ authorized_collection.insert_one(name: 'bang')
897
+ end
898
+
899
+ let(:requests) do
900
+ [{ update_one: { filter: { name: 'BANG' },
901
+ update: { "$set" => { name: 'pong' }},
902
+ collation: collation }}]
903
+ end
904
+
905
+ context 'when the server selected supports collations', if: collation_enabled? do
906
+
907
+ let!(:result) do
908
+ bulk_write.execute
909
+ end
910
+
911
+ it 'applies the collation' do
912
+ expect(authorized_collection.find(name: 'pong').count).to eq(1)
913
+ end
914
+
915
+ it 'reports the upserted id' do
916
+ expect(result.upserted_ids).to eq([])
917
+ end
918
+
919
+ it 'reports the upserted count' do
920
+ expect(result.upserted_count).to eq(0)
921
+ end
922
+
923
+ it 'reports the modified count' do
924
+ expect(result.modified_count).to eq(1)
925
+ end
926
+
927
+ it 'reports the matched count' do
928
+ expect(result.matched_count).to eq(1)
929
+ end
930
+ end
931
+
932
+ context 'when the server selected does not support collations', unless: collation_enabled? do
933
+
934
+ it 'raises an exception' do
935
+ expect {
936
+ bulk_write.execute
937
+ }.to raise_exception(Mongo::Error::UnsupportedCollation)
938
+ end
939
+ end
940
+ end
941
+
942
+ context 'when the write does not have a collation specified' do
943
+
944
+ before do
945
+ authorized_collection.insert_one(name: 'bang')
946
+ end
947
+
948
+ let(:requests) do
949
+ [{ update_one: { filter: { name: 'BANG' }, update: { "$set" => { name: 'pong' }}}}]
950
+ end
951
+
952
+ let!(:result) do
953
+ bulk_write.execute
954
+ end
955
+
956
+ it 'does not apply the collation' do
957
+ expect(authorized_collection.find(name: 'pong').count).to eq(0)
958
+ end
959
+
960
+ it 'reports the upserted id' do
961
+ expect(result.upserted_ids).to eq([])
962
+ end
963
+
964
+ it 'reports the upserted count' do
965
+ expect(result.upserted_count).to eq(0)
966
+ end
967
+
968
+ it 'reports the modified count' do
969
+ expect(result.modified_count).to eq(0)
970
+ end
971
+
972
+ it 'reports the matched count' do
973
+ expect(result.matched_count).to eq(0)
974
+ end
975
+ end
559
976
  end
560
977
 
561
978
  context 'when providing multiple update ones' do
562
979
 
980
+ context 'when the write has a collation specified' do
981
+
982
+ before do
983
+ authorized_collection.insert_one(name: 'bang')
984
+ authorized_collection.insert_one(name: 'doink')
985
+ end
986
+
987
+ let(:requests) do
988
+ [{ update_one: { filter: { name: 'BANG' },
989
+ update: { "$set" => { name: 'pong' }},
990
+ collation: collation }},
991
+ { update_one: { filter: { name: 'DOINK' },
992
+ update: { "$set" => { name: 'pong' }},
993
+ collation: collation }}]
994
+ end
995
+
996
+ context 'when the server selected supports collations', if: collation_enabled? do
997
+
998
+ let!(:result) do
999
+ bulk_write.execute
1000
+ end
1001
+
1002
+ it 'applies the collation' do
1003
+ expect(authorized_collection.find(name: 'pong').count).to eq(2)
1004
+ end
1005
+
1006
+ it 'reports the upserted id' do
1007
+ expect(result.upserted_ids).to eq([])
1008
+ end
1009
+
1010
+ it 'reports the upserted count' do
1011
+ expect(result.upserted_count).to eq(0)
1012
+ end
1013
+
1014
+ it 'reports the modified count' do
1015
+ expect(result.modified_count).to eq(2)
1016
+ end
1017
+
1018
+ it 'reports the matched count' do
1019
+ expect(result.matched_count).to eq(2)
1020
+ end
1021
+ end
1022
+
1023
+ context 'when the server selected does not support collations', unless: collation_enabled? do
1024
+
1025
+ it 'raises an exception' do
1026
+ expect {
1027
+ bulk_write.execute
1028
+ }.to raise_exception(Mongo::Error::UnsupportedCollation)
1029
+ end
1030
+ end
1031
+ end
1032
+
1033
+ context 'when the write does not have a collation specified' do
1034
+
1035
+ before do
1036
+ authorized_collection.insert_one(name: 'bang')
1037
+ authorized_collection.insert_one(name: 'doink')
1038
+ end
1039
+
1040
+ let(:requests) do
1041
+ [{ update_one: { filter: { name: 'BANG' }, update: { "$set" => { name: 'pong' }}}},
1042
+ { update_one: { filter: { name: 'DOINK' }, update: { "$set" => { name: 'pong' }}}}]
1043
+ end
1044
+
1045
+ let!(:result) do
1046
+ bulk_write.execute
1047
+ end
1048
+
1049
+ it 'does not apply the collation' do
1050
+ expect(authorized_collection.find(name: 'pong').count).to eq(0)
1051
+ end
1052
+
1053
+ it 'reports the upserted id' do
1054
+ expect(result.upserted_ids).to eq([])
1055
+ end
1056
+
1057
+ it 'reports the upserted count' do
1058
+ expect(result.upserted_count).to eq(0)
1059
+ end
1060
+
1061
+ it 'reports the modified count' do
1062
+ expect(result.modified_count).to eq(0)
1063
+ end
1064
+
1065
+ it 'reports the matched count' do
1066
+ expect(result.matched_count).to eq(0)
1067
+ end
1068
+ end
1069
+
563
1070
  context 'when upsert is false' do
564
1071
 
565
1072
  let(:requests) do
@@ -593,7 +1100,7 @@ describe Mongo::BulkWrite do
593
1100
  end
594
1101
 
595
1102
  it 'reports the matched count' do
596
- expect(result.modified_count).to eq(2)
1103
+ expect(result.matched_count).to eq(2)
597
1104
  end
598
1105
 
599
1106
 
@@ -760,6 +1267,92 @@ describe Mongo::BulkWrite do
760
1267
 
761
1268
  context 'when providing a single update many' do
762
1269
 
1270
+ context 'when the write has a collation specified' do
1271
+
1272
+ before do
1273
+ authorized_collection.insert_one(name: 'bang')
1274
+ authorized_collection.insert_one(name: 'bang')
1275
+ end
1276
+
1277
+ let(:requests) do
1278
+ [{ update_many: { filter: { name: 'BANG' },
1279
+ update: { "$set" => { name: 'pong' }},
1280
+ collation: collation }}]
1281
+ end
1282
+
1283
+ context 'when the server selected supports collations', if: collation_enabled? do
1284
+
1285
+ let!(:result) do
1286
+ bulk_write.execute
1287
+ end
1288
+
1289
+ it 'applies the collation' do
1290
+ expect(authorized_collection.find(name: 'pong').count).to eq(2)
1291
+ end
1292
+
1293
+ it 'reports the upserted id' do
1294
+ expect(result.upserted_ids).to eq([])
1295
+ end
1296
+
1297
+ it 'reports the upserted count' do
1298
+ expect(result.upserted_count).to eq(0)
1299
+ end
1300
+
1301
+ it 'reports the modified count' do
1302
+ expect(result.modified_count).to eq(2)
1303
+ end
1304
+
1305
+ it 'reports the matched count' do
1306
+ expect(result.matched_count).to eq(2)
1307
+ end
1308
+ end
1309
+
1310
+ context 'when the server selected does not support collations', unless: collation_enabled? do
1311
+
1312
+ it 'raises an exception' do
1313
+ expect {
1314
+ bulk_write.execute
1315
+ }.to raise_exception(Mongo::Error::UnsupportedCollation)
1316
+ end
1317
+ end
1318
+ end
1319
+
1320
+ context 'when the write does not have a collation specified' do
1321
+
1322
+ before do
1323
+ authorized_collection.insert_one(name: 'bang')
1324
+ authorized_collection.insert_one(name: 'bang')
1325
+ end
1326
+
1327
+ let(:requests) do
1328
+ [{ update_many: { filter: { name: 'BANG' }, update: { "$set" => { name: 'pong' }}}}]
1329
+ end
1330
+
1331
+ let!(:result) do
1332
+ bulk_write.execute
1333
+ end
1334
+
1335
+ it 'does not apply the collation' do
1336
+ expect(authorized_collection.find(name: 'pong').count).to eq(0)
1337
+ end
1338
+
1339
+ it 'reports the upserted id' do
1340
+ expect(result.upserted_ids).to eq([])
1341
+ end
1342
+
1343
+ it 'reports the upserted count' do
1344
+ expect(result.upserted_count).to eq(0)
1345
+ end
1346
+
1347
+ it 'reports the modified count' do
1348
+ expect(result.modified_count).to eq(0)
1349
+ end
1350
+
1351
+ it 'reports the matched count' do
1352
+ expect(result.matched_count).to eq(0)
1353
+ end
1354
+ end
1355
+
763
1356
  context 'when upsert is false' do
764
1357
 
765
1358
  let(:requests) do
@@ -791,7 +1384,7 @@ describe Mongo::BulkWrite do
791
1384
  end
792
1385
 
793
1386
  it 'reports the matched count' do
794
- expect(result.modified_count).to eq(2)
1387
+ expect(result.matched_count).to eq(2)
795
1388
  end
796
1389
 
797
1390
  context 'when there is a write concern error' do