1d56e8d2d80f3f877b97da601ba90ca5233743c2clmr#!/usr/bin/python
23d6ae118f69717e68bc15b9aed7b6a6c7dd9bab0showard
33d6ae118f69717e68bc15b9aed7b6a6c7dd9bab0showardimport unittest
43d6ae118f69717e68bc15b9aed7b6a6c7dd9bab0showardimport common
53d6ae118f69717e68bc15b9aed7b6a6c7dd9bab0showardfrom autotest_lib.frontend import setup_django_environment
63d6ae118f69717e68bc15b9aed7b6a6c7dd9bab0showardfrom autotest_lib.frontend import setup_test_environment
7250d84d0a9716ece8ec4eb50b3702a167cda038dshowardfrom autotest_lib.frontend.tko import csv_encoder
83d6ae118f69717e68bc15b9aed7b6a6c7dd9bab0showard
93d6ae118f69717e68bc15b9aed7b6a6c7dd9bab0showardclass CsvEncodingTest(unittest.TestCase):
1037059dfb50063124bce014d3217e3610499d917fshoward    def _make_request(self, method, columns=None):
1137059dfb50063124bce014d3217e3610499d917fshoward        request = dict(method=method)
1237059dfb50063124bce014d3217e3610499d917fshoward        if columns:
1337059dfb50063124bce014d3217e3610499d917fshoward            request['columns'] = columns
1437059dfb50063124bce014d3217e3610499d917fshoward        return request
153d6ae118f69717e68bc15b9aed7b6a6c7dd9bab0showard
163d6ae118f69717e68bc15b9aed7b6a6c7dd9bab0showard
173d6ae118f69717e68bc15b9aed7b6a6c7dd9bab0showard    def _make_group(self, header_indices, pass_count, complete_count,
183d6ae118f69717e68bc15b9aed7b6a6c7dd9bab0showard                    incomplete_count=0):
193d6ae118f69717e68bc15b9aed7b6a6c7dd9bab0showard        return dict(header_indices=header_indices, pass_count=pass_count,
203d6ae118f69717e68bc15b9aed7b6a6c7dd9bab0showard                    complete_count=complete_count,
213d6ae118f69717e68bc15b9aed7b6a6c7dd9bab0showard                    incomplete_count=incomplete_count)
223d6ae118f69717e68bc15b9aed7b6a6c7dd9bab0showard
233d6ae118f69717e68bc15b9aed7b6a6c7dd9bab0showard
2437059dfb50063124bce014d3217e3610499d917fshoward    def _encode_and_check_result(self, request, result, *expected_csv_rows):
253d6ae118f69717e68bc15b9aed7b6a6c7dd9bab0showard        encoder = csv_encoder.encoder(request, result)
263d6ae118f69717e68bc15b9aed7b6a6c7dd9bab0showard        response = encoder.encode()
273d6ae118f69717e68bc15b9aed7b6a6c7dd9bab0showard        csv_result = response.content
2837059dfb50063124bce014d3217e3610499d917fshoward        expected_csv = '\r\n'.join(expected_csv_rows) + '\r\n'
293d6ae118f69717e68bc15b9aed7b6a6c7dd9bab0showard        self.assertEquals(csv_result, expected_csv)
303d6ae118f69717e68bc15b9aed7b6a6c7dd9bab0showard
313d6ae118f69717e68bc15b9aed7b6a6c7dd9bab0showard
323d6ae118f69717e68bc15b9aed7b6a6c7dd9bab0showard    def test_spreadsheet_encoder(self):
333d6ae118f69717e68bc15b9aed7b6a6c7dd9bab0showard        request = self._make_request('get_status_counts')
343d6ae118f69717e68bc15b9aed7b6a6c7dd9bab0showard        response = {'header_values' :
353d6ae118f69717e68bc15b9aed7b6a6c7dd9bab0showard                        [[('row1',), ('row2',), ('comma,header',)],
363d6ae118f69717e68bc15b9aed7b6a6c7dd9bab0showard                         [('col1', 'sub1'), ('col1', 'sub2'),
373d6ae118f69717e68bc15b9aed7b6a6c7dd9bab0showard                          ('col2', 'sub1')]],
383d6ae118f69717e68bc15b9aed7b6a6c7dd9bab0showard                    'groups' : [self._make_group((0, 0), 1, 2),
393d6ae118f69717e68bc15b9aed7b6a6c7dd9bab0showard                                self._make_group((1, 2), 3, 4, 5)]}
403d6ae118f69717e68bc15b9aed7b6a6c7dd9bab0showard
413d6ae118f69717e68bc15b9aed7b6a6c7dd9bab0showard        self._encode_and_check_result(request, response,
4237059dfb50063124bce014d3217e3610499d917fshoward                                      ',col1/sub1,col1/sub2,col2/sub1',
4337059dfb50063124bce014d3217e3610499d917fshoward                                      'row1,1 / 2,,',
4437059dfb50063124bce014d3217e3610499d917fshoward                                      'row2,,,3 / 4 (5 incomplete)',
4537059dfb50063124bce014d3217e3610499d917fshoward                                      '"comma,header",,,')
4637059dfb50063124bce014d3217e3610499d917fshoward
4737059dfb50063124bce014d3217e3610499d917fshoward
4837059dfb50063124bce014d3217e3610499d917fshoward    def test_table_encoder(self):
4937059dfb50063124bce014d3217e3610499d917fshoward        request = self._make_request('get_test_views', [['col1', 'Column 1'],
5037059dfb50063124bce014d3217e3610499d917fshoward                                                        ['col2', 'Column 2']])
5137059dfb50063124bce014d3217e3610499d917fshoward        response = [{'col1' : 'foo', 'col2' : 'bar'},
5237059dfb50063124bce014d3217e3610499d917fshoward                    {'col1' : 'baz', 'col2' : 'asdf'}]
5337059dfb50063124bce014d3217e3610499d917fshoward        self._encode_and_check_result(request, response,
5437059dfb50063124bce014d3217e3610499d917fshoward                                      'Column 1,Column 2',
5537059dfb50063124bce014d3217e3610499d917fshoward                                      'foo,bar',
5637059dfb50063124bce014d3217e3610499d917fshoward                                      'baz,asdf')
5737059dfb50063124bce014d3217e3610499d917fshoward
5837059dfb50063124bce014d3217e3610499d917fshoward
5937059dfb50063124bce014d3217e3610499d917fshoward    def test_grouped_table_encoder(self):
6037059dfb50063124bce014d3217e3610499d917fshoward        request = self._make_request('get_group_counts',
6137059dfb50063124bce014d3217e3610499d917fshoward                                     [['col1', 'Column 1'],
6237059dfb50063124bce014d3217e3610499d917fshoward                                      ['group_count', 'Count in group']])
6337059dfb50063124bce014d3217e3610499d917fshoward        response = {'header_values' : 'unused',
6437059dfb50063124bce014d3217e3610499d917fshoward                    'groups' : [{'col1' : 'foo', 'group_count' : 1},
6537059dfb50063124bce014d3217e3610499d917fshoward                                {'col1' : 'baz', 'group_count' : 3}]}
6637059dfb50063124bce014d3217e3610499d917fshoward        self._encode_and_check_result(request, response,
6737059dfb50063124bce014d3217e3610499d917fshoward                                      'Column 1,Count in group',
6837059dfb50063124bce014d3217e3610499d917fshoward                                      'foo,1',
6937059dfb50063124bce014d3217e3610499d917fshoward                                      'baz,3')
7037059dfb50063124bce014d3217e3610499d917fshoward
7137059dfb50063124bce014d3217e3610499d917fshoward
7237059dfb50063124bce014d3217e3610499d917fshoward    def _status_count_dict(self, col1_value, pass_count, complete_count,
7337059dfb50063124bce014d3217e3610499d917fshoward                                  incomplete_count):
7437059dfb50063124bce014d3217e3610499d917fshoward        return dict(col1=col1_value, pass_count=pass_count,
7537059dfb50063124bce014d3217e3610499d917fshoward                    complete_count=complete_count,
7637059dfb50063124bce014d3217e3610499d917fshoward                    incomplete_count=incomplete_count)
7737059dfb50063124bce014d3217e3610499d917fshoward
7837059dfb50063124bce014d3217e3610499d917fshoward
7937059dfb50063124bce014d3217e3610499d917fshoward    def test_status_count_table_encoder(self):
8037059dfb50063124bce014d3217e3610499d917fshoward        request = self._make_request('get_status_counts',
8137059dfb50063124bce014d3217e3610499d917fshoward                                     [['col1', 'Column 1'],
8237059dfb50063124bce014d3217e3610499d917fshoward                                      ['_unused_', 'Test pass rate']])
8337059dfb50063124bce014d3217e3610499d917fshoward        response = {'header_values' : 'unused',
8437059dfb50063124bce014d3217e3610499d917fshoward                    'groups' : [self._status_count_dict('foo', 1, 2, 0),
8537059dfb50063124bce014d3217e3610499d917fshoward                                self._status_count_dict('baz', 4, 5, 6)]}
8637059dfb50063124bce014d3217e3610499d917fshoward        self._encode_and_check_result(request, response,
8737059dfb50063124bce014d3217e3610499d917fshoward                                      'Column 1,Test pass rate',
8837059dfb50063124bce014d3217e3610499d917fshoward                                      'foo,1 / 2',
8937059dfb50063124bce014d3217e3610499d917fshoward                                      'baz,4 / 5 (6 incomplete)')
903d6ae118f69717e68bc15b9aed7b6a6c7dd9bab0showard
913d6ae118f69717e68bc15b9aed7b6a6c7dd9bab0showard
92194a59d6976a5dbd5b464fb2b14ceb089f91c050showard    def test_extra_info_spreadsheet_encoder(self):
93194a59d6976a5dbd5b464fb2b14ceb089f91c050showard        request = self._make_request('get_latest_tests')
94194a59d6976a5dbd5b464fb2b14ceb089f91c050showard
95194a59d6976a5dbd5b464fb2b14ceb089f91c050showard
96194a59d6976a5dbd5b464fb2b14ceb089f91c050showard        group1 = self._make_group((0, 0), 1, 1)
97194a59d6976a5dbd5b464fb2b14ceb089f91c050showard        group2 = self._make_group((1, 0), 1, 1)
98194a59d6976a5dbd5b464fb2b14ceb089f91c050showard
99194a59d6976a5dbd5b464fb2b14ceb089f91c050showard        group1['extra_info'] = ['info1', 'info2']
100194a59d6976a5dbd5b464fb2b14ceb089f91c050showard        group2['extra_info'] = ['', 'info3']
101194a59d6976a5dbd5b464fb2b14ceb089f91c050showard
102194a59d6976a5dbd5b464fb2b14ceb089f91c050showard        response = {'header_values' :
103194a59d6976a5dbd5b464fb2b14ceb089f91c050showard                        [[('row1',), ('row2',)],
104194a59d6976a5dbd5b464fb2b14ceb089f91c050showard                         [('col1',), ('col2',)]],
105194a59d6976a5dbd5b464fb2b14ceb089f91c050showard                    'groups' : [group1, group2]}
106194a59d6976a5dbd5b464fb2b14ceb089f91c050showard
107194a59d6976a5dbd5b464fb2b14ceb089f91c050showard        self._encode_and_check_result(request, response,
108194a59d6976a5dbd5b464fb2b14ceb089f91c050showard                                      ',col1,col2',
109194a59d6976a5dbd5b464fb2b14ceb089f91c050showard                                      'row1,"1 / 1\ninfo1\ninfo2",',
110194a59d6976a5dbd5b464fb2b14ceb089f91c050showard                                      'row2,"1 / 1\n\ninfo3",')
111194a59d6976a5dbd5b464fb2b14ceb089f91c050showard
112194a59d6976a5dbd5b464fb2b14ceb089f91c050showard
1133d6ae118f69717e68bc15b9aed7b6a6c7dd9bab0showard    def test_unhandled_method(self):
1143d6ae118f69717e68bc15b9aed7b6a6c7dd9bab0showard        request = self._make_request('foo')
1153d6ae118f69717e68bc15b9aed7b6a6c7dd9bab0showard        self._encode_and_check_result(request, None,
1163d6ae118f69717e68bc15b9aed7b6a6c7dd9bab0showard                                      'Unhandled method foo (this indicates a '
11737059dfb50063124bce014d3217e3610499d917fshoward                                      'bug)')
1183d6ae118f69717e68bc15b9aed7b6a6c7dd9bab0showard
1193d6ae118f69717e68bc15b9aed7b6a6c7dd9bab0showard
1203d6ae118f69717e68bc15b9aed7b6a6c7dd9bab0showardif __name__ == '__main__':
1213d6ae118f69717e68bc15b9aed7b6a6c7dd9bab0showard    unittest.main()
122