mongo 2.2.2 → 2.2.3

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.
@@ -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