def test_extra_select(self): csv_with_extra = SELECT(self.BASE_CSV, AS('id', 'ID'), AS('name', "Person's name"), 'address', AS('info', 'Info on Person'), 'hobby_id', 'born', 'Most Powerful') self.assertQuerySetBecomesCsv(self.qs, csv_with_extra)
def test_extra_select_header_map(self): csv_with_extra = SELECT(self.BASE_CSV, AS('id', 'ID'), AS('name', "Person's name"), 'address', AS('info', 'Info on Person'), 'hobby_id', 'born', AS('Most Powerful', 'Sturdiest')) self.assertQuerySetBecomesCsv( self.qs, csv_with_extra, field_header_map={'Most Powerful': 'Sturdiest'})
def test_extra_select_ordering(self): custom_order_csv = SELECT(self.BASE_CSV, AS('id', 'ID'), 'Most Powerful', AS('name', "Person's name"), 'address', AS('info', 'Info on Person'), 'hobby_id', 'born') self.assertQuerySetBecomesCsv(self.qs, custom_order_csv, field_order=['id', 'Most Powerful'])
def test_write_csv_with_related_custom_headers(self): overridden_csv = SELECT(self.FULL_PERSON_CSV_WITH_RELATED, 'ID', "Person's name", AS('hobby__name', 'Name of Activity')) qs = self.qs.values('id', 'name', 'hobby__name') self.assertQuerySetBecomesCsv( qs, overridden_csv, field_header_map={'hobby__name': 'Name of Activity'})
def test_write_csv_limited_custom_headers(self): overridden_info_csv = SELECT(self.LIMITED_PERSON_CSV, "Person's name", 'address', AS('Info on Person', 'INFORMATION')) qs = self.qs.values('name', 'address', 'info') self.assertQuerySetBecomesCsv( qs, overridden_info_csv, field_header_map={'info': 'INFORMATION'})
def test_write_csv_full_custom_headers(self): overridden_info_csv = SELECT(self.FULL_PERSON_CSV, 'ID', "Person's name", 'address', AS('Info on Person', 'INFORMATION'), 'hobby_id', 'born') self.assertQuerySetBecomesCsv(self.qs, overridden_info_csv, field_header_map={'info': 'INFORMATION'})
class CSVTestCase(TestCase): def setUp(self): self.qs = create_people_and_get_queryset() def csv_match(self, csv_file, expected_data, **csv_kwargs): assertion_results = [] csv_data = csv.reader(csv_file, encoding='utf-8', **csv_kwargs) iteration_happened = False is_first = True test_pairs = list(zip_longest(csv_data, expected_data, fillvalue=[])) for csv_row, expected_row in test_pairs: if is_first: # add the BOM to the data expected_row = ([u'\ufeff' + expected_row[0]] + expected_row[1:]) is_first = False iteration_happened = True assertion_results.append(csv_row == expected_row) assertion_results.append(iteration_happened is True) return assertion_results def assertMatchesCsv(self, *args, **kwargs): assertion_results = self.csv_match(*args, **kwargs) self.assertTrue(all(assertion_results)) def assertNotMatchesCsv(self, *args, **kwargs): assertion_results = self.csv_match(*args, **kwargs) self.assertFalse(all(assertion_results)) def assertQuerySetBecomesCsv(self, qs, expected_data, **kwargs): obj = BytesIO() djqscsv.write_csv(qs, obj, **kwargs) csv_file = filter(None, obj.getvalue().splitlines()) self.assertMatchesCsv(csv_file, expected_data) def assertEmptyQuerySetMatches(self, expected_data, **kwargs): qs = self.qs.none() obj = BytesIO() if DJANGO_VERSION[:2] == (1, 5): with self.assertRaises(djqscsv.CSVException): djqscsv.write_csv(qs, obj) else: djqscsv.write_csv(qs, obj, **kwargs) self.assertEqual(obj.getvalue(), expected_data) # the csv data that is returned by the most inclusive query under test. # use this data structure to build smaller data sets BASE_CSV = [ ['id', 'name', 'address', 'info', 'hobby_id', 'born', 'hobby__name', 'Most Powerful'], ['1', 'vetch', 'iffish', 'wizard', '1', '2001-01-01T01:01:00', 'Doing Magic', '0'], ['2', 'nemmerle', 'roke', 'deceased arch mage', '2', '2001-01-01T01:01:00', 'Resting', '1'], ['3', 'ged', 'gont', 'former arch mage', '2', '2001-01-01T01:01:00', 'Resting', '1']] FULL_PERSON_CSV_WITH_RELATED = SELECT(BASE_CSV, AS('id', 'ID'), AS('name', 'Person\'s name'), 'address', AS('info', 'Info on Person'), 'hobby_id', 'born', 'hobby__name') FULL_PERSON_CSV = EXCLUDE(FULL_PERSON_CSV_WITH_RELATED, 'hobby__name') FULL_PERSON_CSV_NO_VERBOSE = EXCLUDE(BASE_CSV, 'hobby__name', 'Most Powerful') LIMITED_PERSON_CSV = SELECT(FULL_PERSON_CSV, 'Person\'s name', 'address', 'Info on Person') LIMITED_PERSON_CSV_NO_VERBOSE = SELECT(BASE_CSV, 'name', 'address', 'info')