Skip to content

Commit a4f38d7

Browse files
committed
PYTHON-2168 Ensure that the WriteConcernError "errInfo" object is propagated
1 parent 9f8468f commit a4f38d7

File tree

1 file changed

+42
-3
lines changed

1 file changed

+42
-3
lines changed

test/test_read_write_concern_spec.py

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@
3030
from pymongo.operations import IndexModel, InsertOne
3131
from pymongo.read_concern import ReadConcern
3232
from pymongo.write_concern import WriteConcern
33-
from test import client_context, unittest
33+
from test import (client_context,
34+
IntegrationTest,
35+
unittest)
3436
from test.utils import (EventListener,
3537
disable_replication,
3638
enable_replication,
@@ -43,9 +45,8 @@
4345
os.path.dirname(os.path.realpath(__file__)), 'read_write_concern')
4446

4547

46-
class TestReadWriteConcernSpec(unittest.TestCase):
48+
class TestReadWriteConcernSpec(IntegrationTest):
4749

48-
@client_context.require_connection
4950
def test_omit_default_read_write_concern(self):
5051
listener = EventListener()
5152
# Client with default readConcern and writeConcern
@@ -171,6 +172,44 @@ def test_raise_wtimeout(self):
171172
self.assertWriteOpsRaise(WriteConcern(w=client_context.w, wtimeout=1),
172173
WTimeoutError)
173174

175+
@client_context.require_failCommand_fail_point
176+
def test_error_includes_errInfo(self):
177+
expected_wce = {
178+
"code": 100,
179+
"codeName": "UnsatisfiableWriteConcern",
180+
"errmsg": "Not enough data-bearing nodes",
181+
"errInfo": {
182+
"writeConcern": {
183+
"w": 2,
184+
"wtimeout": 0,
185+
"provenance": "clientSupplied"
186+
}
187+
}
188+
}
189+
cause_wce = {
190+
"configureFailPoint": "failCommand",
191+
"mode": {"times": 2},
192+
"data": {
193+
"failCommands": ["insert"],
194+
"writeConcernError": expected_wce
195+
},
196+
}
197+
with self.fail_point(cause_wce):
198+
# Write concern error on insert includes errInfo.
199+
with self.assertRaises(WriteConcernError) as ctx:
200+
self.db.test.insert_one({})
201+
self.assertEqual(ctx.exception.details, expected_wce)
202+
203+
# Test bulk_write as well.
204+
with self.assertRaises(BulkWriteError) as ctx:
205+
self.db.test.bulk_write([InsertOne({})])
206+
expected_details = {
207+
'writeErrors': [],
208+
'writeConcernErrors': [expected_wce],
209+
'nInserted': 1, 'nUpserted': 0, 'nMatched': 0, 'nModified': 0,
210+
'nRemoved': 0, 'upserted': []}
211+
self.assertEqual(ctx.exception.details, expected_details)
212+
174213

175214
def normalize_write_concern(concern):
176215
result = {}

0 commit comments

Comments
 (0)