@@ -84,6 +84,7 @@ async def test_formats_write_error_correctly(self):
84
84
85
85
86
86
# https://github.com/mongodb/specifications/tree/master/source/crud/tests
87
+ # Note: tests 1 and 2 are in test_read_write_concern_spec.py
87
88
class TestClientBulkWriteCRUD (AsyncIntegrationTest ):
88
89
async def asyncSetUp (self ):
89
90
await super ().asyncSetUp ()
@@ -92,7 +93,7 @@ async def asyncSetUp(self):
92
93
self .max_message_size_bytes = await async_client_context .max_message_size_bytes
93
94
94
95
@async_client_context .require_version_min (8 , 0 , 0 , - 24 )
95
- async def test_batch_splits_if_num_operations_too_large (self ):
96
+ async def test_3_batch_splits_if_num_operations_too_large (self ):
96
97
listener = OvertCommandListener ()
97
98
client = await self .async_rs_or_single_client (event_listeners = [listener ])
98
99
@@ -116,7 +117,7 @@ async def test_batch_splits_if_num_operations_too_large(self):
116
117
self .assertEqual (first_event .operation_id , second_event .operation_id )
117
118
118
119
@async_client_context .require_version_min (8 , 0 , 0 , - 24 )
119
- async def test_batch_splits_if_ops_payload_too_large (self ):
120
+ async def test_4_batch_splits_if_ops_payload_too_large (self ):
120
121
listener = OvertCommandListener ()
121
122
client = await self .async_rs_or_single_client (event_listeners = [listener ])
122
123
@@ -148,7 +149,7 @@ async def test_batch_splits_if_ops_payload_too_large(self):
148
149
149
150
@async_client_context .require_version_min (8 , 0 , 0 , - 24 )
150
151
@async_client_context .require_failCommand_fail_point
151
- async def test_collects_write_concern_errors_across_batches (self ):
152
+ async def test_5_collects_write_concern_errors_across_batches (self ):
152
153
listener = OvertCommandListener ()
153
154
client = await self .async_rs_or_single_client (
154
155
event_listeners = [listener ],
@@ -189,7 +190,7 @@ async def test_collects_write_concern_errors_across_batches(self):
189
190
self .assertEqual (len (bulk_write_events ), 2 )
190
191
191
192
@async_client_context .require_version_min (8 , 0 , 0 , - 24 )
192
- async def test_collects_write_errors_across_batches_unordered (self ):
193
+ async def test_6_collects_write_errors_across_batches_unordered (self ):
193
194
listener = OvertCommandListener ()
194
195
client = await self .async_rs_or_single_client (event_listeners = [listener ])
195
196
@@ -218,7 +219,7 @@ async def test_collects_write_errors_across_batches_unordered(self):
218
219
self .assertEqual (len (bulk_write_events ), 2 )
219
220
220
221
@async_client_context .require_version_min (8 , 0 , 0 , - 24 )
221
- async def test_collects_write_errors_across_batches_ordered (self ):
222
+ async def test_6_collects_write_errors_across_batches_ordered (self ):
222
223
listener = OvertCommandListener ()
223
224
client = await self .async_rs_or_single_client (event_listeners = [listener ])
224
225
@@ -247,7 +248,7 @@ async def test_collects_write_errors_across_batches_ordered(self):
247
248
self .assertEqual (len (bulk_write_events ), 1 )
248
249
249
250
@async_client_context .require_version_min (8 , 0 , 0 , - 24 )
250
- async def test_handles_cursor_requiring_getMore (self ):
251
+ async def test_7_handles_cursor_requiring_getMore (self ):
251
252
listener = OvertCommandListener ()
252
253
client = await self .async_rs_or_single_client (event_listeners = [listener ])
253
254
@@ -287,7 +288,7 @@ async def test_handles_cursor_requiring_getMore(self):
287
288
288
289
@async_client_context .require_version_min (8 , 0 , 0 , - 24 )
289
290
@async_client_context .require_no_standalone
290
- async def test_handles_cursor_requiring_getMore_within_transaction (self ):
291
+ async def test_8_handles_cursor_requiring_getMore_within_transaction (self ):
291
292
listener = OvertCommandListener ()
292
293
client = await self .async_rs_or_single_client (event_listeners = [listener ])
293
294
@@ -329,7 +330,7 @@ async def test_handles_cursor_requiring_getMore_within_transaction(self):
329
330
330
331
@async_client_context .require_version_min (8 , 0 , 0 , - 24 )
331
332
@async_client_context .require_failCommand_fail_point
332
- async def test_handles_getMore_error (self ):
333
+ async def test_9_handles_getMore_error (self ):
333
334
listener = OvertCommandListener ()
334
335
client = await self .async_rs_or_single_client (event_listeners = [listener ])
335
336
@@ -382,7 +383,7 @@ async def test_handles_getMore_error(self):
382
383
self .assertTrue (kill_cursors_event )
383
384
384
385
@async_client_context .require_version_min (8 , 0 , 0 , - 24 )
385
- async def test_returns_error_if_unacknowledged_too_large_insert (self ):
386
+ async def test_10_returns_error_if_unacknowledged_too_large_insert (self ):
386
387
listener = OvertCommandListener ()
387
388
client = await self .async_rs_or_single_client (event_listeners = [listener ])
388
389
@@ -441,7 +442,7 @@ async def _setup_namespace_test_models(self):
441
442
return num_models , models
442
443
443
444
@async_client_context .require_version_min (8 , 0 , 0 , - 24 )
444
- async def test_no_batch_splits_if_new_namespace_is_not_too_large (self ):
445
+ async def test_11_no_batch_splits_if_new_namespace_is_not_too_large (self ):
445
446
listener = OvertCommandListener ()
446
447
client = await self .async_rs_or_single_client (event_listeners = [listener ])
447
448
@@ -471,7 +472,7 @@ async def test_no_batch_splits_if_new_namespace_is_not_too_large(self):
471
472
self .assertEqual (event .command ["nsInfo" ][0 ]["ns" ], "db.coll" )
472
473
473
474
@async_client_context .require_version_min (8 , 0 , 0 , - 24 )
474
- async def test_batch_splits_if_new_namespace_is_too_large (self ):
475
+ async def test_11_batch_splits_if_new_namespace_is_too_large (self ):
475
476
listener = OvertCommandListener ()
476
477
client = await self .async_rs_or_single_client (event_listeners = [listener ])
477
478
@@ -508,25 +509,27 @@ async def test_batch_splits_if_new_namespace_is_too_large(self):
508
509
self .assertEqual (second_event .command ["nsInfo" ][0 ]["ns" ], namespace )
509
510
510
511
@async_client_context .require_version_min (8 , 0 , 0 , - 24 )
511
- async def test_returns_error_if_no_writes_can_be_added_to_ops (self ):
512
+ async def test_12_returns_error_if_no_writes_can_be_added_to_ops (self ):
512
513
client = await self .async_rs_or_single_client ()
513
514
514
515
# Document too large.
515
516
b_repeated = "b" * self .max_message_size_bytes
516
517
models = [InsertOne (namespace = "db.coll" , document = {"a" : b_repeated })]
517
- with self .assertRaises (DocumentTooLarge ):
518
+ with self .assertRaises (DocumentTooLarge ) as context :
518
519
await client .bulk_write (models = models )
520
+ self .assertIsNone (context .exception .partial_result )
519
521
520
522
# Namespace too large.
521
523
c_repeated = "c" * self .max_message_size_bytes
522
524
namespace = f"db.{ c_repeated } "
523
525
models = [InsertOne (namespace = namespace , document = {"a" : "b" })]
524
- with self .assertRaises (DocumentTooLarge ):
526
+ with self .assertRaises (DocumentTooLarge ) as context :
525
527
await client .bulk_write (models = models )
528
+ self .assertIsNone (context .exception .partial_result )
526
529
527
530
@async_client_context .require_version_min (8 , 0 , 0 , - 24 )
528
531
@unittest .skipUnless (_HAVE_PYMONGOCRYPT , "pymongocrypt is not installed" )
529
- async def test_returns_error_if_auto_encryption_configured (self ):
532
+ async def test_13_returns_error_if_auto_encryption_configured (self ):
530
533
opts = AutoEncryptionOpts (
531
534
key_vault_namespace = "db.coll" ,
532
535
kms_providers = {"aws" : {"accessKeyId" : "foo" , "secretAccessKey" : "bar" }},
@@ -536,6 +539,7 @@ async def test_returns_error_if_auto_encryption_configured(self):
536
539
models = [InsertOne (namespace = "db.coll" , document = {"a" : "b" })]
537
540
with self .assertRaises (InvalidOperation ) as context :
538
541
await client .bulk_write (models = models )
542
+ self .assertIsNone (context .exception .partial_result )
539
543
self .assertIn (
540
544
"bulk_write does not currently support automatic encryption" , context .exception ._message
541
545
)
@@ -579,6 +583,8 @@ async def test_upserted_result(self):
579
583
self .assertEqual (result .update_results [1 ].did_upsert , True )
580
584
self .assertEqual (result .update_results [2 ].did_upsert , False )
581
585
586
+ # Note: test 14 is optional and intentionally not implemented because we provide multiple APIs to specify explain.
587
+
582
588
@async_client_context .require_version_min (8 , 0 , 0 , - 24 )
583
589
async def test_15_unacknowledged_write_across_batches (self ):
584
590
listener = OvertCommandListener ()
0 commit comments