xref: /aosp_15_r20/external/autotest/frontend/tko/csv_encoder_unittest.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
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