From 837d760c27778758e71dc54d89eef9a827c01956 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Wed, 25 Mar 2015 19:15:56 +0200 Subject: Check that failed writerow() doesn't produce change a file. --- Lib/test/test_csv.py | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/Lib/test/test_csv.py b/Lib/test/test_csv.py index e031170..e2eec70 100644 --- a/Lib/test/test_csv.py +++ b/Lib/test/test_csv.py @@ -130,12 +130,24 @@ class Test_Csv(unittest.TestCase): fileobj.close() os.unlink(name) + def _write_error_test(self, exc, fields, **kwargs): + fd, name = tempfile.mkstemp() + fileobj = os.fdopen(fd, "w+b") + try: + writer = csv.writer(fileobj, **kwargs) + with self.assertRaises(exc): + writer.writerow(fields) + fileobj.seek(0) + self.assertEqual(fileobj.read(), '') + finally: + fileobj.close() + os.unlink(name) + def test_write_arg_valid(self): - self.assertRaises(csv.Error, self._write_test, None, '') + self._write_error_test(csv.Error, None) self._write_test((), '') self._write_test([None], '""') - self.assertRaises(csv.Error, self._write_test, - [None], None, quoting = csv.QUOTE_NONE) + self._write_error_test(csv.Error, [None], quoting = csv.QUOTE_NONE) # Check that exceptions are passed up the chain class BadList: def __len__(self): @@ -143,11 +155,11 @@ class Test_Csv(unittest.TestCase): def __getitem__(self, i): if i > 2: raise IOError - self.assertRaises(IOError, self._write_test, BadList(), '') + self._write_error_test(IOError, BadList()) class BadItem: def __str__(self): raise IOError - self.assertRaises(IOError, self._write_test, [BadItem()], '') + self._write_error_test(IOError, [BadItem()]) def test_write_bigfield(self): # This exercises the buffer realloc functionality @@ -157,10 +169,8 @@ class Test_Csv(unittest.TestCase): def test_write_quoting(self): self._write_test(['a',1,'p,q'], 'a,1,"p,q"') - self.assertRaises(csv.Error, - self._write_test, - ['a',1,'p,q'], 'a,1,p,q', - quoting = csv.QUOTE_NONE) + self._write_error_test(csv.Error, ['a',1,'p,q'], + quoting = csv.QUOTE_NONE) self._write_test(['a',1,'p,q'], 'a,1,"p,q"', quoting = csv.QUOTE_MINIMAL) self._write_test(['a',1,'p,q'], '"a",1,"p,q"', @@ -173,10 +183,8 @@ class Test_Csv(unittest.TestCase): def test_write_escape(self): self._write_test(['a',1,'p,q'], 'a,1,"p,q"', escapechar='\\') - self.assertRaises(csv.Error, - self._write_test, - ['a',1,'p,"q"'], 'a,1,"p,\\"q\\""', - escapechar=None, doublequote=False) + self._write_error_test(csv.Error, ['a',1,'p,"q"'], + escapechar=None, doublequote=False) self._write_test(['a',1,'p,"q"'], 'a,1,"p,\\"q\\""', escapechar='\\', doublequote = False) self._write_test(['"'], '""""', -- cgit v0.12