1*9c5db199SXin Li#!/usr/bin/python3 2*9c5db199SXin Li 3*9c5db199SXin Liimport unittest 4*9c5db199SXin Liimport common 5*9c5db199SXin Lifrom autotest_lib.frontend import setup_django_environment 6*9c5db199SXin Lifrom autotest_lib.frontend import setup_test_environment 7*9c5db199SXin Lifrom autotest_lib.frontend.tko import csv_encoder 8*9c5db199SXin Li 9*9c5db199SXin Liclass CsvEncodingTest(unittest.TestCase): 10*9c5db199SXin Li def _make_request(self, method, columns=None): 11*9c5db199SXin Li request = dict(method=method) 12*9c5db199SXin Li if columns: 13*9c5db199SXin Li request['columns'] = columns 14*9c5db199SXin Li return request 15*9c5db199SXin Li 16*9c5db199SXin Li 17*9c5db199SXin Li def _make_group(self, header_indices, pass_count, complete_count, 18*9c5db199SXin Li incomplete_count=0): 19*9c5db199SXin Li return dict(header_indices=header_indices, pass_count=pass_count, 20*9c5db199SXin Li complete_count=complete_count, 21*9c5db199SXin Li incomplete_count=incomplete_count) 22*9c5db199SXin Li 23*9c5db199SXin Li 24*9c5db199SXin Li def _encode_and_check_result(self, request, result, *expected_csv_rows): 25*9c5db199SXin Li encoder = csv_encoder.encoder(request, result) 26*9c5db199SXin Li response = encoder.encode() 27*9c5db199SXin Li csv_result = response.content 28*9c5db199SXin Li expected_csv = '\r\n'.join(expected_csv_rows) + '\r\n' 29*9c5db199SXin Li self.assertEquals(csv_result, expected_csv.encode()) 30*9c5db199SXin Li 31*9c5db199SXin Li 32*9c5db199SXin Li def test_spreadsheet_encoder(self): 33*9c5db199SXin Li request = self._make_request('get_status_counts') 34*9c5db199SXin Li response = {'header_values' : 35*9c5db199SXin Li [[('row1',), ('row2',), ('comma,header',)], 36*9c5db199SXin Li [('col1', 'sub1'), ('col1', 'sub2'), 37*9c5db199SXin Li ('col2', 'sub1')]], 38*9c5db199SXin Li 'groups' : [self._make_group((0, 0), 1, 2), 39*9c5db199SXin Li self._make_group((1, 2), 3, 4, 5)]} 40*9c5db199SXin Li 41*9c5db199SXin Li self._encode_and_check_result(request, response, 42*9c5db199SXin Li ',col1/sub1,col1/sub2,col2/sub1', 43*9c5db199SXin Li 'row1,1 / 2,,', 44*9c5db199SXin Li 'row2,,,3 / 4 (5 incomplete)', 45*9c5db199SXin Li '"comma,header",,,') 46*9c5db199SXin Li 47*9c5db199SXin Li 48*9c5db199SXin Li def test_table_encoder(self): 49*9c5db199SXin Li request = self._make_request('get_test_views', [['col1', 'Column 1'], 50*9c5db199SXin Li ['col2', 'Column 2']]) 51*9c5db199SXin Li response = [{'col1' : 'foo', 'col2' : 'bar'}, 52*9c5db199SXin Li {'col1' : 'baz', 'col2' : 'asdf'}] 53*9c5db199SXin Li self._encode_and_check_result(request, response, 54*9c5db199SXin Li 'Column 1,Column 2', 55*9c5db199SXin Li 'foo,bar', 56*9c5db199SXin Li 'baz,asdf') 57*9c5db199SXin Li 58*9c5db199SXin Li 59*9c5db199SXin Li def test_grouped_table_encoder(self): 60*9c5db199SXin Li request = self._make_request('get_group_counts', 61*9c5db199SXin Li [['col1', 'Column 1'], 62*9c5db199SXin Li ['group_count', 'Count in group']]) 63*9c5db199SXin Li response = {'header_values' : 'unused', 64*9c5db199SXin Li 'groups' : [{'col1' : 'foo', 'group_count' : 1}, 65*9c5db199SXin Li {'col1' : 'baz', 'group_count' : 3}]} 66*9c5db199SXin Li self._encode_and_check_result(request, response, 67*9c5db199SXin Li 'Column 1,Count in group', 68*9c5db199SXin Li 'foo,1', 69*9c5db199SXin Li 'baz,3') 70*9c5db199SXin Li 71*9c5db199SXin Li 72*9c5db199SXin Li def _status_count_dict(self, col1_value, pass_count, complete_count, 73*9c5db199SXin Li incomplete_count): 74*9c5db199SXin Li return dict(col1=col1_value, pass_count=pass_count, 75*9c5db199SXin Li complete_count=complete_count, 76*9c5db199SXin Li incomplete_count=incomplete_count) 77*9c5db199SXin Li 78*9c5db199SXin Li 79*9c5db199SXin Li def test_status_count_table_encoder(self): 80*9c5db199SXin Li request = self._make_request('get_status_counts', 81*9c5db199SXin Li [['col1', 'Column 1'], 82*9c5db199SXin Li ['_unused_', 'Test pass rate']]) 83*9c5db199SXin Li response = {'header_values' : 'unused', 84*9c5db199SXin Li 'groups' : [self._status_count_dict('foo', 1, 2, 0), 85*9c5db199SXin Li self._status_count_dict('baz', 4, 5, 6)]} 86*9c5db199SXin Li self._encode_and_check_result(request, response, 87*9c5db199SXin Li 'Column 1,Test pass rate', 88*9c5db199SXin Li 'foo,1 / 2', 89*9c5db199SXin Li 'baz,4 / 5 (6 incomplete)') 90*9c5db199SXin Li 91*9c5db199SXin Li 92*9c5db199SXin Li def test_extra_info_spreadsheet_encoder(self): 93*9c5db199SXin Li request = self._make_request('get_latest_tests') 94*9c5db199SXin Li 95*9c5db199SXin Li 96*9c5db199SXin Li group1 = self._make_group((0, 0), 1, 1) 97*9c5db199SXin Li group2 = self._make_group((1, 0), 1, 1) 98*9c5db199SXin Li 99*9c5db199SXin Li group1['extra_info'] = ['info1', 'info2'] 100*9c5db199SXin Li group2['extra_info'] = ['', 'info3'] 101*9c5db199SXin Li 102*9c5db199SXin Li response = {'header_values' : 103*9c5db199SXin Li [[('row1',), ('row2',)], 104*9c5db199SXin Li [('col1',), ('col2',)]], 105*9c5db199SXin Li 'groups' : [group1, group2]} 106*9c5db199SXin Li 107*9c5db199SXin Li self._encode_and_check_result(request, response, 108*9c5db199SXin Li ',col1,col2', 109*9c5db199SXin Li 'row1,"1 / 1\ninfo1\ninfo2",', 110*9c5db199SXin Li 'row2,"1 / 1\n\ninfo3",') 111*9c5db199SXin Li 112*9c5db199SXin Li 113*9c5db199SXin Li def test_unhandled_method(self): 114*9c5db199SXin Li request = self._make_request('foo') 115*9c5db199SXin Li self._encode_and_check_result(request, None, 116*9c5db199SXin Li 'Unhandled method foo (this indicates a ' 117*9c5db199SXin Li 'bug)') 118*9c5db199SXin Li 119*9c5db199SXin Li 120*9c5db199SXin Liif __name__ == '__main__': 121*9c5db199SXin Li unittest.main() 122