Skip to content

Commit 0e88be6

Browse files
JanEricNitschkepicnixzgpshead
authored
pythongh-138621: Increase test coverage for csv.DictReader and csv.Sniffer (pythonGH-138622)
* Increase test coverage for csv.DictReader and csv.Sniffer Previously there were no tests for the DictReader fieldnames setter, the case where a StopIteration was encountered when trying to determine the fieldnames from the content or the case where Sniffer could not find a delimiter. * Revert whitespace change to comment * Add a test that csv.Sniffer.has_header checks up to 20 rows * Replace name and age with letter and offset Co-authored-by: Bénédikt Tran <[email protected]> * Address review comment --------- Co-authored-by: Bénédikt Tran <[email protected]> Co-authored-by: Gregory P. Smith <[email protected]>
1 parent 0d7b48a commit 0e88be6

File tree

1 file changed

+31
-0
lines changed

1 file changed

+31
-0
lines changed

Lib/test/test_csv.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -918,6 +918,14 @@ def test_dict_reader_fieldnames_accepts_list(self):
918918
reader = csv.DictReader(f, fieldnames)
919919
self.assertEqual(reader.fieldnames, fieldnames)
920920

921+
def test_dict_reader_set_fieldnames(self):
922+
fieldnames = ["a", "b", "c"]
923+
f = StringIO()
924+
reader = csv.DictReader(f)
925+
self.assertIsNone(reader.fieldnames)
926+
reader.fieldnames = fieldnames
927+
self.assertEqual(reader.fieldnames, fieldnames)
928+
921929
def test_dict_writer_fieldnames_rejects_iter(self):
922930
fieldnames = ["a", "b", "c"]
923931
f = StringIO()
@@ -933,6 +941,7 @@ def test_dict_writer_fieldnames_accepts_list(self):
933941
def test_dict_reader_fieldnames_is_optional(self):
934942
f = StringIO()
935943
reader = csv.DictReader(f, fieldnames=None)
944+
self.assertIsNone(reader.fieldnames)
936945

937946
def test_read_dict_fields(self):
938947
with TemporaryFile("w+", encoding="utf-8") as fileobj:
@@ -1353,6 +1362,19 @@ class TestSniffer(unittest.TestCase):
13531362
ghi\0jkl
13541363
"""
13551364

1365+
sample15 = "\n\n\n"
1366+
sample16 = "abc\ndef\nghi"
1367+
1368+
sample17 = ["letter,offset"]
1369+
sample17.extend(f"{chr(ord('a') + i)},{i}" for i in range(20))
1370+
sample17.append("v,twenty_one") # 'u' was skipped
1371+
sample17 = '\n'.join(sample17)
1372+
1373+
sample18 = ["letter,offset"]
1374+
sample18.extend(f"{chr(ord('a') + i)},{i}" for i in range(21))
1375+
sample18.append("v,twenty_one") # 'u' was not skipped
1376+
sample18 = '\n'.join(sample18)
1377+
13561378
def test_issue43625(self):
13571379
sniffer = csv.Sniffer()
13581380
self.assertTrue(sniffer.has_header(self.sample12))
@@ -1374,6 +1396,11 @@ def test_has_header_regex_special_delimiter(self):
13741396
self.assertIs(sniffer.has_header(self.sample8), False)
13751397
self.assertIs(sniffer.has_header(self.header2 + self.sample8), True)
13761398

1399+
def test_has_header_checks_20_rows(self):
1400+
sniffer = csv.Sniffer()
1401+
self.assertFalse(sniffer.has_header(self.sample17))
1402+
self.assertTrue(sniffer.has_header(self.sample18))
1403+
13771404
def test_guess_quote_and_delimiter(self):
13781405
sniffer = csv.Sniffer()
13791406
for header in (";'123;4';", "'123;4';", ";'123;4'", "'123;4'"):
@@ -1423,6 +1450,10 @@ def test_delimiters(self):
14231450
self.assertEqual(dialect.quotechar, "'")
14241451
dialect = sniffer.sniff(self.sample14)
14251452
self.assertEqual(dialect.delimiter, '\0')
1453+
self.assertRaisesRegex(csv.Error, "Could not determine delimiter",
1454+
sniffer.sniff, self.sample15)
1455+
self.assertRaisesRegex(csv.Error, "Could not determine delimiter",
1456+
sniffer.sniff, self.sample16)
14261457

14271458
def test_doublequote(self):
14281459
sniffer = csv.Sniffer()

0 commit comments

Comments
 (0)