diff options
Diffstat (limited to 'test_tablib.py')
| -rwxr-xr-x | test_tablib.py | 214 |
1 files changed, 206 insertions, 8 deletions
diff --git a/test_tablib.py b/test_tablib.py index 1c160d2..d4127b0 100755 --- a/test_tablib.py +++ b/test_tablib.py @@ -1,13 +1,14 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- - """Tests for Tablib.""" +import json import unittest import sys import os import tablib -from tablib.compat import markup, unicode +from tablib.compat import markup, unicode, is_py3 +from tablib.core import Row @@ -206,6 +207,18 @@ class TablibTestCase(unittest.TestCase): self.assertEqual(self.founders[2:], [self.tom]) + def test_row_slicing(self): + """Verify Row's __getslice__ method. Issue #184.""" + + john = Row(self.john) + + self.assertEqual(john[:], list(self.john[:])) + self.assertEqual(john[0:], list(self.john[0:])) + self.assertEqual(john[:2], list(self.john[:2])) + self.assertEqual(john[0:2], list(self.john[0:2])) + self.assertEqual(john[0:-1], list(self.john[0:-1])) + + def test_delete(self): """Verify deleting from dataset works.""" @@ -306,10 +319,76 @@ class TablibTestCase(unittest.TestCase): self.assertEqual(html, d.html) + def test_latex_export(self): + """LaTeX export""" + + expected = """\ +% Note: add \\usepackage{booktabs} to your preamble +% +\\begin{table}[!htbp] + \\centering + \\caption{Founders} + \\begin{tabular}{lrr} + \\toprule + first\\_name & last\\_name & gpa \\\\ + \\cmidrule(r){1-1} \\cmidrule(lr){2-2} \\cmidrule(l){3-3} + John & Adams & 90 \\\\ + George & Washington & 67 \\\\ + Thomas & Jefferson & 50 \\\\ + \\bottomrule + \\end{tabular} +\\end{table} +""" + output = self.founders.latex + self.assertEqual(output, expected) + + + def test_latex_export_empty_dataset(self): + self.assertTrue(tablib.Dataset().latex is not None) + + + def test_latex_export_no_headers(self): + d = tablib.Dataset() + d.append(('one', 'two', 'three')) + self.assertTrue('one' in d.latex) + + + def test_latex_export_caption(self): + d = tablib.Dataset() + d.append(('one', 'two', 'three')) + self.assertFalse('caption' in d.latex) + + d.title = 'Title' + self.assertTrue('\\caption{Title}' in d.latex) + + + def test_latex_export_none_values(self): + headers = ['foo', None, 'bar'] + d = tablib.Dataset(['foo', None, 'bar'], headers=headers) + output = d.latex + self.assertTrue('foo' in output) + self.assertFalse('None' in output) + + + def test_latex_escaping(self): + d = tablib.Dataset(['~', '^']) + output = d.latex + + self.assertFalse('~' in output) + self.assertTrue('textasciitilde' in output) + self.assertFalse('^' in output) + self.assertTrue('textasciicircum' in output) + + def test_unicode_append(self): """Passes in a single unicode character and exports.""" - new_row = (u'å', u'é') + if is_py3: + new_row = ('å', 'é') + else: + exec("new_row = (u'å', u'é')") + + data.append(new_row) data.json @@ -320,6 +399,7 @@ class TablibTestCase(unittest.TestCase): data.xlsx data.ods data.html + data.latex def test_book_export_no_exceptions(self): @@ -345,7 +425,7 @@ class TablibTestCase(unittest.TestCase): data.json = _json - self.assertEqual(_json, data.json) + self.assertEqual(json.loads(_json), json.loads(data.json)) def test_json_import_book(self): @@ -359,7 +439,7 @@ class TablibTestCase(unittest.TestCase): book.json = _json - self.assertEqual(_json, book.json) + self.assertEqual(json.loads(_json), json.loads(book.json)) def test_yaml_import_set(self): @@ -440,6 +520,22 @@ class TablibTestCase(unittest.TestCase): self.assertEqual(_csv, data.get_csv(delimiter=';')) + def test_csv_import_set_with_newlines(self): + """Generate and import CSV set serialization when row values have + newlines.""" + data.append(('Markdown\n=======', + 'A cool language\n\nwith paragraphs')) + data.append(('reStructedText\n==============', + 'Another cool language\n\nwith paragraphs')) + data.headers = ('title', 'body') + + _csv = data.csv + + data.csv = _csv + + self.assertEqual(_csv, data.csv) + + def test_tsv_import_set(self): """Generate and import TSV set serialization.""" data.append(self.john) @@ -453,6 +549,108 @@ class TablibTestCase(unittest.TestCase): self.assertEqual(_tsv, data.tsv) + def test_dbf_import_set(self): + data.append(self.john) + data.append(self.george) + data.headers = self.headers + + _dbf = data.dbf + data.dbf = _dbf + + #self.assertEqual(_dbf, data.dbf) + try: + self.assertEqual(_dbf, data.dbf) + except AssertionError: + index = 0 + so_far = '' + for reg_char, data_char in zip(_dbf, data.dbf): + so_far += chr(data_char) + if reg_char != data_char and index not in [1, 2, 3]: + raise AssertionError('Failing at char %s: %s vs %s %s' % ( + index, reg_char, data_char, so_far)) + index += 1 + + def test_dbf_export_set(self): + """Test DBF import.""" + data.append(self.john) + data.append(self.george) + data.append(self.tom) + data.headers = self.headers + + _regression_dbf = (b'\x03r\x06\x06\x03\x00\x00\x00\x81\x00\xab\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00FIRST_NAME\x00C\x00\x00\x00\x00P\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LAST_NAME\x00\x00C\x00' + b'\x00\x00\x00P\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00GPA\x00\x00\x00\x00\x00\x00\x00\x00N\x00\x00\x00\x00\n' + b'\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\r' + ) + _regression_dbf += b' John' + (b' ' * 75) + _regression_dbf += b' Adams' + (b' ' * 74) + _regression_dbf += b' 90.0000000' + _regression_dbf += b' George' + (b' ' * 73) + _regression_dbf += b' Washington' + (b' ' * 69) + _regression_dbf += b' 67.0000000' + _regression_dbf += b' Thomas' + (b' ' * 73) + _regression_dbf += b' Jefferson' + (b' ' * 70) + _regression_dbf += b' 50.0000000' + _regression_dbf += b'\x1a' + + if is_py3: + # If in python3, decode regression string to binary. + #_regression_dbf = bytes(_regression_dbf, 'utf-8') + #_regression_dbf = _regression_dbf.replace(b'\n', b'\r') + pass + + try: + self.assertEqual(_regression_dbf, data.dbf) + except AssertionError: + index = 0 + found_so_far = '' + for reg_char, data_char in zip(_regression_dbf, data.dbf): + #found_so_far += chr(data_char) + if reg_char != data_char and index not in [1, 2, 3]: + raise AssertionError( + 'Failing at char %s: %s vs %s (found %s)' % ( + index, reg_char, data_char, found_so_far)) + index += 1 + + def test_dbf_format_detect(self): + """Test the DBF format detection.""" + _dbf = (b'\x03r\x06\x03\x03\x00\x00\x00\x81\x00\xab\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00FIRST_NAME\x00C\x00\x00\x00\x00P\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LAST_NAME\x00\x00C\x00' + b'\x00\x00\x00P\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00GPA\x00\x00\x00\x00\x00\x00\x00\x00N\x00\x00\x00\x00\n' + b'\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\r' + ) + _dbf += b' John' + (b' ' * 75) + _dbf += b' Adams' + (b' ' * 74) + _dbf += b' 90.0000000' + _dbf += b' George' + (b' ' * 73) + _dbf += b' Washington' + (b' ' * 69) + _dbf += b' 67.0000000' + _dbf += b' Thomas' + (b' ' * 73) + _dbf += b' Jefferson' + (b' ' * 70) + _dbf += b' 50.0000000' + _dbf += b'\x1a' + + _yaml = '- {age: 90, first_name: John, last_name: Adams}' + _tsv = 'foo\tbar' + _csv = '1,2,3\n4,5,6\n7,8,9\n' + _json = '[{"last_name": "Adams","age": 90,"first_name": "John"}]' + + _bunk = ( + '¡¡¡¡¡¡¡¡£™∞¢£§∞§¶•¶ª∞¶•ªº••ª–º§•†•§º¶•†¥ª–º•§ƒø¥¨©πƒø†ˆ¥ç©¨√øˆ¥≈†ƒ¥ç©ø¨çˆ¥ƒçø¶' + ) + self.assertTrue(tablib.formats.dbf.detect(_dbf)) + self.assertFalse(tablib.formats.dbf.detect(_yaml)) + self.assertFalse(tablib.formats.dbf.detect(_tsv)) + self.assertFalse(tablib.formats.dbf.detect(_csv)) + self.assertFalse(tablib.formats.dbf.detect(_json)) + self.assertFalse(tablib.formats.dbf.detect(_bunk)) + def test_csv_format_detect(self): """Test CSV format detection.""" @@ -649,7 +847,7 @@ class TablibTestCase(unittest.TestCase): orig_first_name = self.founders[self.headers[0]] csv_first_name = data[headers[0]] - self.assertEquals(orig_first_name, csv_first_name) + self.assertEqual(orig_first_name, csv_first_name) def test_csv_column_delete(self): @@ -677,14 +875,14 @@ class TablibTestCase(unittest.TestCase): self.founders.sort(orig_target_header) data.sort(target_header) - self.assertEquals(self.founders[orig_target_header], data[target_header]) + self.assertEqual(self.founders[orig_target_header], data[target_header]) def test_unicode_renders_markdown_table(self): # add another entry to test right field width for # integer self.founders.append(('Old', 'Man', 100500)) - self.assertEquals( + self.assertEqual( """ first_name|last_name |gpa ----------|----------|------ |
