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
@@ -75,6 +75,60 @@ describe Mongo::Collection::View::Writable do
75
75
  expect(document['field']).to eq('test1')
76
76
  end
77
77
  end
78
+
79
+ context 'when collation is specified' do
80
+
81
+ let(:selector) do
82
+ { name: 'BANG' }
83
+ end
84
+
85
+ let(:result) do
86
+ view.find_one_and_delete
87
+ end
88
+
89
+ before do
90
+ authorized_collection.insert_one(name: 'bang')
91
+ end
92
+
93
+ let(:options) do
94
+ { collation: { locale: 'en_US', strength: 2 } }
95
+ end
96
+
97
+ context 'when the server selected supports collations', if: collation_enabled? do
98
+
99
+ it 'applies the collation' do
100
+ expect(result['name']).to eq('bang')
101
+ end
102
+ end
103
+
104
+ context 'when the server selected does not support collations', unless: collation_enabled? do
105
+
106
+ it 'raises an exception' do
107
+ expect {
108
+ result
109
+ }.to raise_exception(Mongo::Error::UnsupportedCollation)
110
+ end
111
+ end
112
+ end
113
+
114
+ context 'when collation is not specified' do
115
+
116
+ let(:selector) do
117
+ { name: 'BANG' }
118
+ end
119
+
120
+ let(:result) do
121
+ view.find_one_and_delete
122
+ end
123
+
124
+ before do
125
+ authorized_collection.insert_one(name: 'bang')
126
+ end
127
+
128
+ it 'does not apply the collation' do
129
+ expect(result).to be_nil
130
+ end
131
+ end
78
132
  end
79
133
 
80
134
  context 'when no matching document is found' do
@@ -153,6 +207,61 @@ describe Mongo::Collection::View::Writable do
153
207
  expect(document['field']).to eq('test1')
154
208
  end
155
209
  end
210
+
211
+ context 'when collation is provided' do
212
+
213
+ let(:selector) do
214
+ { name: 'BANG' }
215
+ end
216
+
217
+ let(:result) do
218
+ view.find_one_and_replace(name: 'doink')
219
+ end
220
+
221
+ before do
222
+ authorized_collection.insert_one(name: 'bang')
223
+ end
224
+
225
+ let(:options) do
226
+ { collation: { locale: 'en_US', strength: 2 } }
227
+ end
228
+
229
+ context 'when the server selected supports collations', if: collation_enabled? do
230
+
231
+ it 'applies the collation' do
232
+ expect(result['name']).to eq('bang')
233
+ expect(authorized_collection.find({ name: 'doink' }, limit: -1).first['name']).to eq('doink')
234
+ end
235
+ end
236
+
237
+ context 'when the server selected does not support collations', unless: collation_enabled? do
238
+
239
+ it 'raises an exception' do
240
+ expect {
241
+ result
242
+ }.to raise_exception(Mongo::Error::UnsupportedCollation)
243
+ end
244
+ end
245
+ end
246
+
247
+ context 'when collation is not provided' do
248
+
249
+ let(:selector) do
250
+ { name: 'BANG' }
251
+ end
252
+
253
+ let(:result) do
254
+ view.find_one_and_replace(name: 'doink')
255
+ end
256
+
257
+ before do
258
+ authorized_collection.insert_one(name: 'bang')
259
+ end
260
+
261
+ it 'does not apply the collation' do
262
+ expect(result).to be_nil
263
+ end
264
+ end
156
265
  end
157
266
 
158
267
  context 'when no matching document is found' do
@@ -238,7 +347,7 @@ describe Mongo::Collection::View::Writable do
238
347
  context 'when a sort is provided' do
239
348
 
240
349
  let(:document) do
241
- view.sort(field: 1).find_one_and_update({ '$set' => { field: 'testing' }})
350
+ view.sort(field: 1).find_one_and_update({ '$set' => { field: 'testing' } })
242
351
  end
243
352
 
244
353
  it 'returns the original document' do
@@ -247,6 +356,61 @@ describe Mongo::Collection::View::Writable do
247
356
  end
248
357
  end
249
358
 
359
+ context 'when a collation is specified' do
360
+
361
+ let(:selector) do
362
+ { name: 'BANG' }
363
+ end
364
+
365
+ let(:result) do
366
+ view.find_one_and_update({ '$set' => { other: 'doink' } })
367
+ end
368
+
369
+ before do
370
+ authorized_collection.insert_one(name: 'bang')
371
+ end
372
+
373
+ let(:options) do
374
+ { collation: { locale: 'en_US', strength: 2 } }
375
+ end
376
+
377
+ context 'when the server selected supports collations', if: collation_enabled? do
378
+
379
+ it 'applies the collation' do
380
+ expect(result['name']).to eq('bang')
381
+ expect(authorized_collection.find({ name: 'bang' }, limit: -1).first['other']).to eq('doink')
382
+ end
383
+ end
384
+
385
+ context 'when the server selected does not support collations', unless: collation_enabled? do
386
+
387
+ it 'raises an exception' do
388
+ expect {
389
+ result
390
+ }.to raise_exception(Mongo::Error::UnsupportedCollation)
391
+ end
392
+ end
393
+ end
394
+
395
+ context 'when no collation is specified' do
396
+
397
+ let(:selector) do
398
+ { name: 'BANG' }
399
+ end
400
+
401
+ let(:result) do
402
+ view.find_one_and_update({ '$set' => { other: 'doink' } })
403
+ end
404
+
405
+ before do
406
+ authorized_collection.insert_one(name: 'bang')
407
+ end
408
+
409
+ it 'does not apply the collation' do
410
+ expect(result).to be_nil
411
+ end
412
+ end
413
+
250
414
  context 'when no matching document is found' do
251
415
 
252
416
  let(:selector) do
@@ -298,6 +462,64 @@ describe Mongo::Collection::View::Writable do
298
462
  expect(response.written_count).to eq(2)
299
463
  end
300
464
  end
465
+
466
+ context 'when a collation is specified' do
467
+
468
+ let(:selector) do
469
+ { name: 'BANG' }
470
+ end
471
+
472
+ let(:result) do
473
+ view.delete_many(options)
474
+ end
475
+
476
+ before do
477
+ authorized_collection.insert_one(name: 'bang')
478
+ authorized_collection.insert_one(name: 'bang')
479
+ end
480
+
481
+ let(:options) do
482
+ { collation: { locale: 'en_US', strength: 2 } }
483
+ end
484
+
485
+ context 'when the server selected supports collations', if: collation_enabled? do
486
+
487
+ it 'applies the collation' do
488
+ expect(result.written_count).to eq(2)
489
+ expect(authorized_collection.find(name: 'bang').to_a.size).to eq(0)
490
+ end
491
+ end
492
+
493
+ context 'when the server selected does not support collations', unless: collation_enabled? do
494
+
495
+ it 'raises an exception' do
496
+ expect {
497
+ result
498
+ }.to raise_exception(Mongo::Error::UnsupportedCollation)
499
+ end
500
+ end
501
+ end
502
+
503
+ context 'when a collation is not specified' do
504
+
505
+ let(:selector) do
506
+ { name: 'BANG' }
507
+ end
508
+
509
+ let(:result) do
510
+ view.delete_many
511
+ end
512
+
513
+ before do
514
+ authorized_collection.insert_one(name: 'bang')
515
+ authorized_collection.insert_one(name: 'bang')
516
+ end
517
+
518
+ it 'does not apply the collation' do
519
+ expect(result.written_count).to eq(0)
520
+ expect(authorized_collection.find(name: 'bang').to_a.size).to eq(2)
521
+ end
522
+ end
301
523
  end
302
524
 
303
525
  describe '#delete_one' do
@@ -339,6 +561,62 @@ describe Mongo::Collection::View::Writable do
339
561
  expect(response.written_count).to eq(1)
340
562
  end
341
563
  end
564
+
565
+ context 'when a collation is provided' do
566
+
567
+ let(:selector) do
568
+ { name: 'BANG' }
569
+ end
570
+
571
+ let(:result) do
572
+ view.delete_one(options)
573
+ end
574
+
575
+ before do
576
+ authorized_collection.insert_one(name: 'bang')
577
+ end
578
+
579
+ let(:options) do
580
+ { collation: { locale: 'en_US', strength: 2 } }
581
+ end
582
+
583
+ context 'when the server selected supports collations', if: collation_enabled? do
584
+
585
+ it 'applies the collation' do
586
+ expect(result.written_count).to eq(1)
587
+ expect(authorized_collection.find(name: 'bang').to_a.size).to eq(0)
588
+ end
589
+ end
590
+
591
+ context 'when the server selected does not support collations', unless: collation_enabled? do
592
+
593
+ it 'raises an exception' do
594
+ expect {
595
+ result
596
+ }.to raise_exception(Mongo::Error::UnsupportedCollation)
597
+ end
598
+ end
599
+ end
600
+
601
+ context 'when a collation is not specified' do
602
+
603
+ let(:selector) do
604
+ {name: 'BANG'}
605
+ end
606
+
607
+ let(:result) do
608
+ view.delete_one
609
+ end
610
+
611
+ before do
612
+ authorized_collection.insert_one(name: 'bang')
613
+ end
614
+
615
+ it 'does not apply the collation' do
616
+ expect(result.written_count).to eq(0)
617
+ expect(authorized_collection.find(name: 'bang').to_a.size).to eq(1)
618
+ end
619
+ end
342
620
  end
343
621
 
344
622
  describe '#replace_one' do
@@ -449,6 +727,62 @@ describe Mongo::Collection::View::Writable do
449
727
  expect(updated).to be_empty
450
728
  end
451
729
  end
730
+
731
+ context 'when a collation is specified' do
732
+
733
+ let(:selector) do
734
+ { name: 'BANG' }
735
+ end
736
+
737
+ let(:result) do
738
+ view.replace_one({ name: 'doink' }, options)
739
+ end
740
+
741
+ before do
742
+ authorized_collection.insert_one(name: 'bang')
743
+ end
744
+
745
+ let(:options) do
746
+ { collation: { locale: 'en_US', strength: 2 } }
747
+ end
748
+
749
+ context 'when the server selected supports collations', if: collation_enabled? do
750
+
751
+ it 'applies the collation' do
752
+ expect(result.written_count).to eq(1)
753
+ expect(authorized_collection.find(name: 'doink').to_a.size).to eq(1)
754
+ end
755
+ end
756
+
757
+ context 'when the server selected does not support collations', unless: collation_enabled? do
758
+
759
+ it 'raises an exception' do
760
+ expect {
761
+ result
762
+ }.to raise_exception(Mongo::Error::UnsupportedCollation)
763
+ end
764
+ end
765
+ end
766
+
767
+ context 'when a collation is not specified' do
768
+
769
+ let(:selector) do
770
+ { name: 'BANG' }
771
+ end
772
+
773
+ let(:result) do
774
+ view.replace_one(name: 'doink')
775
+ end
776
+
777
+ before do
778
+ authorized_collection.insert_one(name: 'bang')
779
+ end
780
+
781
+ it 'does not apply the collation' do
782
+ expect(result.written_count).to eq(0)
783
+ expect(authorized_collection.find(name: 'bang').to_a.size).to eq(1)
784
+ end
785
+ end
452
786
  end
453
787
 
454
788
  describe '#update_many' do
@@ -563,6 +897,63 @@ describe Mongo::Collection::View::Writable do
563
897
  expect(updated).to be_empty
564
898
  end
565
899
  end
900
+
901
+ context 'when a collation is specified' do
902
+
903
+ let(:selector) do
904
+ { name: 'BANG' }
905
+ end
906
+
907
+ let(:result) do
908
+ view.update_many({ '$set' => { other: 'doink' } }, options)
909
+ end
910
+
911
+ before do
912
+ authorized_collection.insert_one(name: 'bang')
913
+ authorized_collection.insert_one(name: 'baNG')
914
+ end
915
+
916
+ let(:options) do
917
+ { collation: { locale: 'en_US', strength: 2 } }
918
+ end
919
+
920
+ context 'when the server selected supports collations', if: collation_enabled? do
921
+
922
+ it 'applies the collation' do
923
+ expect(result.written_count).to eq(2)
924
+ expect(authorized_collection.find(other: 'doink').to_a.size).to eq(2)
925
+ end
926
+ end
927
+
928
+ context 'when the server selected does not support collations', unless: collation_enabled? do
929
+
930
+ it 'raises an exception' do
931
+ expect {
932
+ result
933
+ }.to raise_exception(Mongo::Error::UnsupportedCollation)
934
+ end
935
+ end
936
+ end
937
+
938
+ context 'when collation is not specified' do
939
+
940
+ let(:selector) do
941
+ {name: 'BANG'}
942
+ end
943
+
944
+ let(:result) do
945
+ view.update_many('$set' => {other: 'doink'})
946
+ end
947
+
948
+ before do
949
+ authorized_collection.insert_one(name: 'bang')
950
+ authorized_collection.insert_one(name: 'baNG')
951
+ end
952
+
953
+ it 'does not apply the collation' do
954
+ expect(result.written_count).to eq(0)
955
+ end
956
+ end
566
957
  end
567
958
 
568
959
  describe '#update_one' do
@@ -675,5 +1066,60 @@ describe Mongo::Collection::View::Writable do
675
1066
  expect(updated).to be_empty
676
1067
  end
677
1068
  end
1069
+
1070
+ context 'when there is a collation specified' do
1071
+
1072
+ let(:selector) do
1073
+ { name: 'BANG' }
1074
+ end
1075
+
1076
+ let(:result) do
1077
+ view.update_one({ '$set' => { other: 'doink' } }, options)
1078
+ end
1079
+
1080
+ before do
1081
+ authorized_collection.insert_one(name: 'bang')
1082
+ end
1083
+
1084
+ let(:options) do
1085
+ { collation: { locale: 'en_US', strength: 2 } }
1086
+ end
1087
+
1088
+ context 'when the server selected supports collations', if: collation_enabled? do
1089
+
1090
+ it 'applies the collation' do
1091
+ expect(result.written_count).to eq(1)
1092
+ expect(authorized_collection.find(other: 'doink').to_a.size).to eq(1)
1093
+ end
1094
+ end
1095
+
1096
+ context 'when the server selected does not support collations', unless: collation_enabled? do
1097
+
1098
+ it 'raises an exception' do
1099
+ expect {
1100
+ result
1101
+ }.to raise_exception(Mongo::Error::UnsupportedCollation)
1102
+ end
1103
+ end
1104
+ end
1105
+
1106
+ context 'when a collation is not specified' do
1107
+
1108
+ let(:selector) do
1109
+ { name: 'BANG' }
1110
+ end
1111
+
1112
+ let(:result) do
1113
+ view.update_one('$set' => { other: 'doink' })
1114
+ end
1115
+
1116
+ before do
1117
+ authorized_collection.insert_one(name: 'bang')
1118
+ end
1119
+
1120
+ it 'does not apply the collation' do
1121
+ expect(result.written_count).to eq(0)
1122
+ end
1123
+ end
678
1124
  end
679
1125
  end