mongo 2.2.2 → 2.2.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -160,6 +160,7 @@ describe Mongo::Cluster::Topology::ReplicaSet do
160
160
  let(:description) do
161
161
  double('description').tap do |d|
162
162
  allow(d).to receive(:replica_set_member?).and_return(false)
163
+ allow(d).to receive(:primary?).and_return(false)
163
164
  end
164
165
  end
165
166
 
@@ -179,6 +180,7 @@ describe Mongo::Cluster::Topology::ReplicaSet do
179
180
  double('description').tap do |d|
180
181
  allow(d).to receive(:replica_set_member?).and_return(true)
181
182
  allow(d).to receive(:replica_set_name).and_return('testing')
183
+ allow(d).to receive(:primary?).and_return(false)
182
184
  end
183
185
  end
184
186
 
@@ -208,6 +208,21 @@ describe Mongo::Operation::Result do
208
208
  expect(result).to_not be_successful
209
209
  end
210
210
  end
211
+
212
+ context 'when the query reply has the cursor_not_found flag set' do
213
+
214
+ let(:flags) do
215
+ [ :cursor_not_found ]
216
+ end
217
+
218
+ let(:documents) do
219
+ []
220
+ end
221
+
222
+ it 'returns false' do
223
+ expect(result).to_not be_successful
224
+ end
225
+ end
211
226
  end
212
227
 
213
228
  context 'when the reply is for a write command' do
@@ -524,11 +524,19 @@ describe 'invalid uris' do
524
524
  let(:mechanism) { 'GSSAPI' }
525
525
  let(:expected) { :gssapi }
526
526
 
527
-
528
527
  it 'sets the auth mechanism to :gssapi' do
529
528
  expect(uri.uri_options[:auth_mech]).to eq(expected)
530
529
  end
531
530
  end
531
+
532
+ context 'scram-sha-1' do
533
+ let(:mechanism) { 'SCRAM-SHA-1' }
534
+ let(:expected) { :scram }
535
+
536
+ it 'sets the auth mechanism to :scram' do
537
+ expect(uri.uri_options[:auth_mech]).to eq(expected)
538
+ end
539
+ end
532
540
  end
533
541
 
534
542
  context 'auth source provided' do
@@ -0,0 +1,163 @@
1
+ description: "Primary reports a new member"
2
+
3
+ uri: "mongodb://a/?replicaSet=rs"
4
+
5
+ phases: [
6
+
7
+ # At first, a is a secondary.
8
+ {
9
+ responses: [
10
+
11
+ ["a:27017", {
12
+
13
+ ok: 1,
14
+ ismaster: false,
15
+ secondary: true,
16
+ setName: "rs",
17
+ hosts: ["a:27017", "b:27017"]
18
+ }]
19
+ ],
20
+
21
+ outcome: {
22
+
23
+ servers: {
24
+
25
+ "a:27017": {
26
+
27
+ type: "RSSecondary",
28
+ setName: "rs"
29
+ },
30
+
31
+ "b:27017": {
32
+
33
+ type: "Unknown",
34
+ setName:
35
+ }
36
+ },
37
+
38
+ topologyType: "ReplicaSetNoPrimary",
39
+ setName: "rs"
40
+ }
41
+ },
42
+
43
+ # b is the primary.
44
+ {
45
+ responses: [
46
+
47
+ ["b:27017", {
48
+
49
+ ok: 1,
50
+ ismaster: true,
51
+ setName: "rs",
52
+ hosts: ["a:27017", "b:27017"]
53
+ }]
54
+ ],
55
+
56
+ outcome: {
57
+
58
+ servers: {
59
+
60
+ "a:27017": {
61
+
62
+ type: "RSSecondary",
63
+ setName: "rs"
64
+ },
65
+
66
+ "b:27017": {
67
+
68
+ type: "RSPrimary",
69
+ setName: "rs"
70
+ }
71
+ },
72
+
73
+ topologyType: "ReplicaSetWithPrimary",
74
+ setName: "rs"
75
+ }
76
+ },
77
+
78
+ # Admin adds a secondary member c.
79
+ {
80
+ responses: [
81
+
82
+ ["b:27017", {
83
+
84
+ ok: 1,
85
+ ismaster: true,
86
+ setName: "rs",
87
+ hosts: ["a:27017", "b:27017", "c:27017"]
88
+ }]
89
+ ],
90
+
91
+ outcome: {
92
+
93
+ # c is new.
94
+ servers: {
95
+
96
+ "a:27017": {
97
+
98
+ type: "RSSecondary",
99
+ setName: "rs"
100
+ },
101
+
102
+ "b:27017": {
103
+
104
+ type: "RSPrimary",
105
+ setName: "rs"
106
+ },
107
+
108
+ "c:27017": {
109
+
110
+ type: "Unknown",
111
+ setName:
112
+ }
113
+ },
114
+
115
+ topologyType: "ReplicaSetWithPrimary",
116
+ setName: "rs"
117
+ }
118
+ },
119
+
120
+ # c becomes secondary.
121
+ {
122
+ responses: [
123
+
124
+ ["c:27017", {
125
+
126
+ ok: 1,
127
+ ismaster: false,
128
+ secondary: true,
129
+ setName: "rs",
130
+ primary: "b:27017",
131
+ hosts: ["a:27017", "b:27017", "c:27017"]
132
+ }]
133
+ ],
134
+
135
+ outcome: {
136
+
137
+ # c is a secondary.
138
+ servers: {
139
+
140
+ "a:27017": {
141
+
142
+ type: "RSSecondary",
143
+ setName: "rs"
144
+ },
145
+
146
+ "b:27017": {
147
+
148
+ type: "RSPrimary",
149
+ setName: "rs"
150
+ },
151
+
152
+ "c:27017": {
153
+
154
+ type: "RSSecondary",
155
+ setName: "rs"
156
+ }
157
+ },
158
+
159
+ topologyType: "ReplicaSetWithPrimary",
160
+ setName: "rs"
161
+ }
162
+ }
163
+ ]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongo
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.2
4
+ version: 2.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tyler Brock
@@ -32,7 +32,7 @@ cert_chain:
32
32
  EhIn2f8suSc9QAqYt7w4T+PMtjxWTVcXs+Uy2PbDtjhtEBz6ZsP6YSsOpJbrCjCV
33
33
  wZtXjpRUvWz86V5vjhHCTE8fqfEb85aeDwUCckPzpio=
34
34
  -----END CERTIFICATE-----
35
- date: 2016-01-25 00:00:00.000000000 Z
35
+ date: 2016-02-18 00:00:00.000000000 Z
36
36
  dependencies:
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: bson
@@ -59,6 +59,7 @@ files:
59
59
  - README.md
60
60
  - Rakefile
61
61
  - bin/mongo_console
62
+ - lib/csasl/csasl.bundle
62
63
  - lib/mongo.rb
63
64
  - lib/mongo/address.rb
64
65
  - lib/mongo/address/ipv4.rb
@@ -488,6 +489,7 @@ files:
488
489
  - spec/support/sdam/rs/primary_disconnect_electionid.yml
489
490
  - spec/support/sdam/rs/primary_disconnect_setversion.yml
490
491
  - spec/support/sdam/rs/primary_mismatched_me.yml
492
+ - spec/support/sdam/rs/primary_reports_new_member.yml
491
493
  - spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml
492
494
  - spec/support/sdam/rs/primary_wrong_set_name.yml
493
495
  - spec/support/sdam/rs/response_from_removed.yml
@@ -548,7 +550,6 @@ files:
548
550
  - spec/support/server_selection/selection/Single/read/SecondaryPreferred.yml
549
551
  - spec/support/server_selection/selection/Unknown/read/SecondaryPreferred.yml
550
552
  - spec/support/server_selection_rtt.rb
551
- - spec/support/shared/bulk_write.rb
552
553
  - spec/support/shared/cursor.rb
553
554
  - spec/support/shared/operation.rb
554
555
  - spec/support/shared/protocol.rb
@@ -575,7 +576,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
575
576
  version: '0'
576
577
  requirements: []
577
578
  rubyforge_project:
578
- rubygems_version: 2.5.1
579
+ rubygems_version: 2.4.6
579
580
  signing_key:
580
581
  specification_version: 4
581
582
  summary: Ruby driver for MongoDB
@@ -776,6 +777,7 @@ test_files:
776
777
  - spec/support/sdam/rs/primary_disconnect_electionid.yml
777
778
  - spec/support/sdam/rs/primary_disconnect_setversion.yml
778
779
  - spec/support/sdam/rs/primary_mismatched_me.yml
780
+ - spec/support/sdam/rs/primary_reports_new_member.yml
779
781
  - spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml
780
782
  - spec/support/sdam/rs/primary_wrong_set_name.yml
781
783
  - spec/support/sdam/rs/response_from_removed.yml
@@ -836,7 +838,6 @@ test_files:
836
838
  - spec/support/server_selection/selection/Unknown/read/SecondaryPreferred.yml
837
839
  - spec/support/server_selection.rb
838
840
  - spec/support/server_selection_rtt.rb
839
- - spec/support/shared/bulk_write.rb
840
841
  - spec/support/shared/cursor.rb
841
842
  - spec/support/shared/operation.rb
842
843
  - spec/support/shared/protocol.rb
metadata.gz.sig CHANGED
Binary file
@@ -1,731 +0,0 @@
1
- shared_examples 'a bulk write object' do
2
-
3
- context 'when no operations are provided' do
4
-
5
- let(:operations) do
6
- []
7
- end
8
-
9
- it 'raises an error' do
10
- expect {
11
- bulk.execute
12
- }.to raise_error(ArgumentError)
13
- end
14
- end
15
-
16
- context 'when invalid operations are provided' do
17
-
18
- let(:operations) do
19
- [{ :not_an_op => {}}]
20
- end
21
-
22
- it 'raises an error' do
23
- expect {
24
- bulk.execute
25
- }.to raise_error(Mongo::Error::InvalidBulkOperationType)
26
- end
27
- end
28
-
29
- context 'when an insert_one operation is provided' do
30
-
31
- context 'when there is a write failure' do
32
-
33
- let(:operations) do
34
- [{ insert_one: { _id: 1 }}, { insert_one: { _id: 1 }}]
35
- end
36
-
37
- it 'raises a BulkWriteError' do
38
- expect {
39
- bulk.execute
40
- }.to raise_error(Mongo::Error::BulkWriteError)
41
- end
42
- end
43
-
44
- context 'when a document is provided' do
45
-
46
- let(:operations) do
47
- [{ insert_one: { name: 'test' }}]
48
- end
49
-
50
- it 'returns n_inserted of 1' do
51
- expect(bulk.execute.inserted_count).to eq(1)
52
- end
53
-
54
- it 'only inserts that document' do
55
- bulk.execute
56
- expect(authorized_collection.find.first['name']).to eq('test')
57
- end
58
-
59
- context 'when there is a write concern error' do
60
-
61
- context 'when the server version is < 2.6' do
62
-
63
- it 'raises a BulkWriteError', if: !write_command_enabled? && standalone? do
64
- expect {
65
- bulk_invalid_write_concern.execute
66
- }.to raise_error(Mongo::Error::BulkWriteError)
67
- end
68
- end
69
-
70
- context 'when the server version has write commands enabled' do
71
-
72
- it 'raises an OperationFailure', if: write_command_enabled? && standalone? do
73
- expect {
74
- bulk_invalid_write_concern.execute
75
- }.to raise_error(Mongo::Error::OperationFailure)
76
- end
77
- end
78
- end
79
- end
80
-
81
- context 'when an invalid object is provided' do
82
-
83
- let(:operations) do
84
- [{ insert_one: [] }]
85
- end
86
-
87
- it 'raises an exception' do
88
- expect {
89
- bulk.execute
90
- }.to raise_error(Mongo::Error::InvalidBulkOperation)
91
- end
92
- end
93
- end
94
-
95
- context 'delete_one' do
96
-
97
- let(:docs) do
98
- [ { a: 1 }, { a: 1 } ]
99
- end
100
-
101
- let(:expected) do
102
- [{ 'a' => 1 }]
103
- end
104
-
105
- before do
106
- authorized_collection.insert_many(docs)
107
- end
108
-
109
- let(:operations) do
110
- [ { delete_one: { a: 1 }},
111
- { delete_one: { a: 2 }}
112
- ]
113
- end
114
-
115
- context 'when no selector is specified' do
116
-
117
- let(:operations) do
118
- [{ delete_one: nil }]
119
- end
120
-
121
- it 'raises an exception' do
122
- expect {
123
- bulk.execute
124
- }.to raise_exception(Mongo::Error::InvalidBulkOperation)
125
- end
126
- end
127
-
128
- context 'when multiple documents match delete selector' do
129
-
130
- it 'reports n_removed correctly' do
131
- expect(bulk.execute.deleted_count).to eq(1)
132
- end
133
-
134
- it 'deletes only matching documents' do
135
- bulk.execute
136
- expect(authorized_collection.find.projection(_id: 0).to_a).to eq(expected)
137
- end
138
-
139
- context 'when there is a write concern error' do
140
-
141
- context 'when the server version is < 2.6' do
142
-
143
- it 'raises a BulkWriteError', if: !write_command_enabled? && standalone? do
144
- expect {
145
- bulk_invalid_write_concern.execute
146
- }.to raise_error(Mongo::Error::BulkWriteError)
147
- end
148
- end
149
-
150
- context 'when the server version has write commands enabled' do
151
-
152
- it 'raises an OperationFailure', if: write_command_enabled? && standalone? do
153
- expect {
154
- bulk_invalid_write_concern.execute
155
- }.to raise_error(Mongo::Error::OperationFailure)
156
- end
157
- end
158
- end
159
- end
160
- end
161
-
162
- context 'when a delete_many operation is provided' do
163
-
164
- let(:docs) do
165
- [{ a: 1 }, { a: 1 }]
166
- end
167
-
168
- before do
169
- authorized_collection.insert_many(docs)
170
- end
171
-
172
- let(:operations) do
173
- [{ delete_many: { a: 1 }}]
174
- end
175
-
176
- context 'when no selector is specified' do
177
-
178
- let(:operations) do
179
- [{ delete_many: nil }]
180
- end
181
-
182
- it 'raises an exception' do
183
- expect {
184
- bulk.execute
185
- }.to raise_exception(Mongo::Error::InvalidBulkOperation)
186
- end
187
- end
188
-
189
- context 'when a selector is specified' do
190
-
191
- context 'when multiple documents match delete selector' do
192
-
193
- it 'reports n_removed correctly' do
194
- expect(bulk.execute.deleted_count).to eq(2)
195
- end
196
-
197
- it 'deletes all matching documents' do
198
- bulk.execute
199
- expect(authorized_collection.find.to_a).to be_empty
200
- end
201
-
202
- context 'when there is a write concern error' do
203
-
204
- context 'when the server version is < 2.6' do
205
-
206
- it 'raises a BulkWriteError', if: !write_command_enabled? && standalone? do
207
- expect {
208
- bulk_invalid_write_concern.execute
209
- }.to raise_error(Mongo::Error::BulkWriteError)
210
- end
211
- end
212
-
213
- context 'when the server version has write commands enabled' do
214
-
215
- it 'raises an OperationFailure', if: write_command_enabled? && standalone? do
216
- expect {
217
- bulk_invalid_write_concern.execute
218
- }.to raise_error(Mongo::Error::OperationFailure)
219
- end
220
- end
221
- end
222
- end
223
-
224
- context 'when only one document matches delete selector' do
225
-
226
- let(:docs) do
227
- [{ a: 1 }, { a: 2 }]
228
- end
229
-
230
- let(:expected) do
231
- [{ 'a' => 2 }]
232
- end
233
-
234
- it 'reports n_removed correctly' do
235
- expect(bulk.execute.deleted_count).to eq(1)
236
- end
237
-
238
- it 'deletes all matching documents' do
239
- bulk.execute
240
- expect(authorized_collection.find.projection(_id: 0).to_a).to eq(expected)
241
- end
242
- end
243
- end
244
- end
245
-
246
- context 'when a replace_one operation is provided' do
247
-
248
- let(:docs) do
249
- [{ a: 1 }, { a: 1 }]
250
- end
251
-
252
- let(:expected) do
253
- [{ 'a' => 2 }, { 'a' => 1 }]
254
- end
255
-
256
- before do
257
- authorized_collection.insert_many(docs)
258
- end
259
-
260
- let(:replacement) do
261
- { a: 2 }
262
- end
263
-
264
- let(:operations) do
265
- [{ replace_one: { find: { a: 1 },
266
- replacement: replacement,
267
- upsert: false }
268
- }]
269
- end
270
-
271
- context 'when a replace document is not specified' do
272
-
273
- let(:operations) do
274
- [{ replace_one: { find: { a: 1 },
275
- replacement: nil,
276
- upsert: false }
277
- }]
278
- end
279
-
280
- it 'raises an exception' do
281
- expect {
282
- bulk.execute
283
- }.to raise_exception(Mongo::Error::InvalidBulkOperation)
284
- end
285
- end
286
-
287
- context 'when there are $-operator top-level keys' do
288
-
289
- let(:operations) do
290
- [{ replace_one: { find: { a: 1 },
291
- replacement: { :$set => { a: 3 }},
292
- upsert: false }
293
- }]
294
- end
295
-
296
- it 'raises an exception' do
297
- expect {
298
- bulk.execute
299
- }.to raise_exception(Mongo::Error::InvalidBulkOperation)
300
- end
301
-
302
- end
303
-
304
- context 'when a replace document is specified' do
305
-
306
- it 'applies the replacement to only one matching document' do
307
- bulk.execute
308
- expect(authorized_collection.find(replacement).count).to eq(1)
309
- end
310
-
311
- it 'reports n_matched correctly' do
312
- expect(bulk.execute.matched_count).to eq(1)
313
- end
314
-
315
- it 'only applies the replacement to one matching document' do
316
- bulk.execute
317
- expect(authorized_collection.find.projection(_id: 0).to_a).to eq(expected)
318
- end
319
-
320
- context 'when there is a write concern error' do
321
-
322
- context 'when the server version is < 2.6' do
323
-
324
- it 'raises a BulkWriteError', if: !write_command_enabled? && standalone? do
325
- expect {
326
- bulk_invalid_write_concern.execute
327
- }.to raise_error(Mongo::Error::BulkWriteError)
328
- end
329
- end
330
-
331
- context 'when the server version has write commands enabled' do
332
-
333
- it 'raises an OperationFailure', if: write_command_enabled? && standalone? do
334
- expect {
335
- bulk_invalid_write_concern.execute
336
- }.to raise_error(Mongo::Error::OperationFailure)
337
- end
338
- end
339
- end
340
-
341
- context 'when upsert is true' do
342
-
343
- let(:operations) do
344
- [{ replace_one: { find: { a: 4 },
345
- replacement: replacement,
346
- upsert: true }
347
- }]
348
- end
349
-
350
- let(:expected) do
351
- [{ 'a' => 1 }, { 'a' => 1 }, { 'a' => 2 }]
352
- end
353
-
354
- it 'upserts the replacement document' do
355
- bulk.execute
356
- expect(authorized_collection.find(replacement).count).to eq(1)
357
- end
358
-
359
- it 'reports n_matched correctly' do
360
- expect(bulk.execute.matched_count).to eq(0)
361
- end
362
-
363
- it 'does not replace any documents' do
364
- bulk.execute
365
- expect(authorized_collection.find.projection(_id: 0).to_a).to eq(expected)
366
- end
367
- end
368
- end
369
- end
370
-
371
- context 'when an update_one operation is provided' do
372
-
373
- let(:docs) do
374
- [{ a: 1 }, { a: 1 }]
375
- end
376
-
377
- let(:update) do
378
- { :$set => { a: 2 }}
379
- end
380
-
381
- let(:operations) do
382
- [{ update_one: { find: { a: 1 },
383
- update: update,
384
- upsert: false }
385
- }]
386
- end
387
-
388
- before do
389
- authorized_collection.insert_many(docs)
390
- end
391
-
392
- let(:expected) do
393
- [{ 'a' => 2 }, { 'a' => 1 }]
394
- end
395
-
396
- context 'when there is a write failure' do
397
-
398
- let(:operations) do
399
- [{ update_one: { find: { a: 1 },
400
- update: { '$st' => { field: 'blah' } },
401
- upsert: false }
402
- }]
403
- end
404
-
405
- it 'raises a BulkWriteError' do
406
- expect {
407
- bulk.execute
408
- }.to raise_error(Mongo::Error::BulkWriteError)
409
- end
410
- end
411
-
412
- context 'when an update document is not specified' do
413
-
414
- let(:operations) do
415
- [{ update_one: [{ a: 1 }]}]
416
- end
417
-
418
- let(:operations) do
419
- [{ update_one: { find: { a: 1 },
420
- upsert: false }
421
- }]
422
- end
423
-
424
- it 'raises an exception' do
425
- expect {
426
- bulk.execute
427
- }.to raise_exception(Mongo::Error::InvalidBulkOperation)
428
- end
429
- end
430
-
431
- context 'when an invalid update document is specified' do
432
-
433
- let(:update) do
434
- { a: 2 }
435
- end
436
-
437
- it 'raises an exception' do
438
- expect {
439
- bulk.execute
440
- }.to raise_exception(Mongo::Error::InvalidBulkOperation)
441
- end
442
- end
443
-
444
- context 'when a valid update document is specified' do
445
-
446
- it 'reports n_modified correctly', if: write_command_enabled? do
447
- expect(bulk.execute.modified_count).to eq(1)
448
- end
449
-
450
- it 'reports n_modified correctly', unless: write_command_enabled? do
451
- expect(bulk.execute.modified_count).to eq(nil)
452
- end
453
-
454
- it 'reports n_upserted correctly' do
455
- expect(bulk.execute.upserted_count).to eq(0)
456
- end
457
-
458
- it 'reports n_matched correctly' do
459
- expect(bulk.execute.matched_count).to eq(1)
460
- end
461
-
462
- it 'applies the correct writes' do
463
- bulk.execute
464
- expect(authorized_collection.find.projection(_id: 0).to_a).to eq(expected)
465
- end
466
-
467
- context 'when there is a write concern error' do
468
-
469
- context 'when the server version is < 2.6' do
470
-
471
- it 'raises a BulkWriteError', if: !write_command_enabled? && standalone? do
472
- expect {
473
- bulk_invalid_write_concern.execute
474
- }.to raise_error(Mongo::Error::BulkWriteError)
475
- end
476
- end
477
-
478
- context 'when the server version has write commands enabled' do
479
-
480
- it 'raises an OperationFailure', if: write_command_enabled? && standalone? do
481
- expect {
482
- bulk_invalid_write_concern.execute
483
- }.to raise_error(Mongo::Error::OperationFailure)
484
- end
485
- end
486
- end
487
-
488
- context 'when upsert is true' do
489
-
490
- let(:operations) do
491
- [{ update_one: { find: { a: 3 },
492
- update: update,
493
- upsert: true }
494
- }]
495
- end
496
-
497
- let(:expected) do
498
- [{ 'a' => 1 }, { 'a' => 1 }, { 'a' => 2 }]
499
- end
500
-
501
- it 'reports n_modified correctly', if: write_command_enabled? do
502
- expect(bulk.execute.modified_count).to eq(0)
503
- end
504
-
505
- it 'reports n_modified correctly', unless: write_command_enabled? do
506
- expect(bulk.execute.modified_count).to eq(nil)
507
- end
508
-
509
- it 'reports n_upserted correctly' do
510
- expect(bulk.execute.upserted_count).to eq(1)
511
- end
512
-
513
- it 'returns the upserted ids', if: write_command_enabled? do
514
- expect(bulk.execute.upserted_ids.size).to eq(1)
515
- end
516
-
517
- it 'reports n_matched correctly' do
518
- expect(bulk.execute.matched_count).to eq(0)
519
- end
520
-
521
- it 'applies the correct writes' do
522
- bulk.execute
523
- expect(authorized_collection.find.projection(_id: 0).to_a).to eq(expected)
524
- end
525
- end
526
- end
527
- end
528
-
529
- context 'when an update_many operation is provided' do
530
-
531
- let(:docs) do
532
- [{ a: 1 }, { a: 1 }]
533
- end
534
-
535
- let(:update) do
536
- { :$set => { a: 2 }}
537
- end
538
-
539
- let(:operations) do
540
- [{ update_many: { find: { a: 1 },
541
- update: update,
542
- upsert: false }
543
- }]
544
- end
545
-
546
- let(:expected) do
547
- [{ 'a' => 2 }, { 'a' => 2 }]
548
- end
549
-
550
- before do
551
- authorized_collection.insert_many(docs)
552
- end
553
-
554
- context 'when there is a write failure' do
555
-
556
- let(:operations) do
557
- [{ update_many: { find: { a: 1 },
558
- update: { '$st' => { field: 'blah' } },
559
- upsert: false }
560
- }]
561
- end
562
-
563
- it 'raises an BulkWriteError' do
564
- expect {
565
- bulk.execute
566
- }.to raise_error(Mongo::Error::BulkWriteError)
567
- end
568
- end
569
-
570
- context 'when an update document is not specified' do
571
-
572
- let(:operations) do
573
- [{ update_many: { find: { a: 1 },
574
- upsert: false }
575
- }]
576
- end
577
-
578
- it 'raises an exception' do
579
- expect do
580
- bulk.execute
581
- end.to raise_exception(Mongo::Error::InvalidBulkOperation)
582
- end
583
- end
584
-
585
- context 'when an invalid update document is specified' do
586
-
587
- let(:update) do
588
- { a: 2 }
589
- end
590
-
591
- it 'raises an exception' do
592
- expect do
593
- bulk.execute
594
- end.to raise_exception(Mongo::Error::InvalidBulkOperation)
595
- end
596
- end
597
-
598
- context 'when a valid update document is specified' do
599
-
600
- it 'reports n_modified correctly', if: write_command_enabled? do
601
- expect(bulk.execute.modified_count).to eq(2)
602
- end
603
-
604
- it 'reports n_modified correctly', unless: write_command_enabled? do
605
- expect(bulk.execute.modified_count).to eq(nil)
606
- end
607
-
608
- it 'reports n_upserted correctly' do
609
- expect(bulk.execute.upserted_count).to eq(0)
610
- end
611
-
612
- it 'reports n_matched correctly' do
613
- expect(bulk.execute.matched_count).to eq(2)
614
- end
615
-
616
- it 'applies the correct writes' do
617
- bulk.execute
618
- expect(authorized_collection.find.projection(_id: 0).to_a).to eq(expected)
619
- end
620
-
621
- context 'when there is a write concern error' do
622
-
623
- context 'when the server version is < 2.6' do
624
-
625
- it 'raises a BulkWriteError', if: !write_command_enabled? && standalone? do
626
- expect {
627
- bulk_invalid_write_concern.execute
628
- }.to raise_error(Mongo::Error::BulkWriteError)
629
- end
630
- end
631
-
632
- context 'when the server version has write commands enabled' do
633
-
634
- it 'raises an OperationFailure', if: write_command_enabled? && standalone? do
635
- expect {
636
- bulk_invalid_write_concern.execute
637
- }.to raise_error(Mongo::Error::OperationFailure)
638
- end
639
- end
640
- end
641
-
642
- context 'when upsert is true' do
643
-
644
- let(:operations) do
645
- [{ update_many: { find: { a: 3 },
646
- update: update,
647
- upsert: true }
648
- }]
649
- end
650
-
651
- let(:expected) do
652
- [ { 'a' => 1 }, { 'a' => 1 }, { 'a' => 2 } ]
653
- end
654
-
655
- it 'reports n_modified correctly', if: write_command_enabled? do
656
- expect(bulk.execute.modified_count).to eq(0)
657
- end
658
-
659
- it 'reports n_modified correctly', unless: write_command_enabled? do
660
- expect(bulk.execute.modified_count).to eq(nil)
661
- end
662
-
663
- it 'reports n_upserted correctly' do
664
- expect(bulk.execute.upserted_count).to eq(1)
665
- end
666
-
667
- it 'reports n_matched correctly' do
668
- expect(bulk.execute.matched_count).to eq(0)
669
- end
670
-
671
- it 'applies the correct writes' do
672
- bulk.execute
673
- expect(authorized_collection.find.projection(_id: 0).to_a).to eq(expected)
674
- end
675
- end
676
- end
677
- end
678
-
679
- context 'when the operations need to be split' do
680
-
681
- before do
682
- 6000.times do |i|
683
- authorized_collection.insert_one(x: i)
684
- end
685
- end
686
-
687
- let(:operations) do
688
- [].tap do |ops|
689
- 3000.times do |i|
690
- ops << { update_one: { find: { x: i },
691
- update: { '$set' => { x: 6000-i } },
692
- upsert: false }
693
- }
694
- end
695
- ops << { :insert_one => { test: 'emily' } }
696
- 3000.times do |i|
697
- ops << { update_one: { find: { x: 3000+i },
698
- update: { '$set' => { x: 3000-i } },
699
- upsert: false }
700
- }
701
- end
702
- end
703
- end
704
-
705
- it 'completes all operations' do
706
- bulk.execute
707
- expect(authorized_collection.find(x: { '$lte' => 3000 }).to_a.size).to eq(3000)
708
- end
709
-
710
- context 'when there is a write concern error' do
711
-
712
- context 'when the server version is < 2.6' do
713
-
714
- it 'raises a BulkWriteError', if: !write_command_enabled? && standalone? do
715
- expect {
716
- bulk_invalid_write_concern.execute
717
- }.to raise_error(Mongo::Error::BulkWriteError)
718
- end
719
- end
720
-
721
- context 'when the server version has write commands enabled' do
722
-
723
- it 'raises an OperationFailure', if: write_command_enabled? && standalone? do
724
- expect {
725
- bulk_invalid_write_concern.execute
726
- }.to raise_error(Mongo::Error::OperationFailure)
727
- end
728
- end
729
- end
730
- end
731
- end