test_csvs.py 4.58 KB
Newer Older
1 2
""" Tests for analytics.csvs """

Miles Steele committed
3
from django.test import TestCase
4
from nose.tools import raises
Miles Steele committed
5

6
from analytics.csvs import create_csv_response, format_dictlist, format_instances
Miles Steele committed
7 8 9


class TestAnalyticsCSVS(TestCase):
10
    """ Test analytics rendering of csv files."""
Miles Steele committed
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38

    def test_create_csv_response_nodata(self):
        header = ['Name', 'Email']
        datarows = []

        res = create_csv_response('robot.csv', header, datarows)
        self.assertEqual(res['Content-Type'], 'text/csv')
        self.assertEqual(res['Content-Disposition'], 'attachment; filename={0}'.format('robot.csv'))
        self.assertEqual(res.content.strip(), '"Name","Email"')

    def test_create_csv_response(self):
        header = ['Name', 'Email']
        datarows = [['Jim', 'jim@edy.org'], ['Jake', 'jake@edy.org'], ['Jeeves', 'jeeves@edy.org']]

        res = create_csv_response('robot.csv', header, datarows)
        self.assertEqual(res['Content-Type'], 'text/csv')
        self.assertEqual(res['Content-Disposition'], 'attachment; filename={0}'.format('robot.csv'))
        self.assertEqual(res.content.strip(), '"Name","Email"\r\n"Jim","jim@edy.org"\r\n"Jake","jake@edy.org"\r\n"Jeeves","jeeves@edy.org"')

    def test_create_csv_response_empty(self):
        header = []
        datarows = []

        res = create_csv_response('robot.csv', header, datarows)
        self.assertEqual(res['Content-Type'], 'text/csv')
        self.assertEqual(res['Content-Disposition'], 'attachment; filename={0}'.format('robot.csv'))
        self.assertEqual(res.content.strip(), '')

39 40 41 42

class TestAnalyticsFormatDictlist(TestCase):
    """ Test format_dictlist method """

Miles Steele committed
43
    def test_format_dictlist(self):
44
        dictlist = [
Miles Steele committed
45 46 47 48 49 50 51 52 53 54 55
            {
                'label1': 'value-1,1',
                'label2': 'value-1,2',
                'label3': 'value-1,3',
                'label4': 'value-1,4',
            },
            {
                'label1': 'value-2,1',
                'label2': 'value-2,2',
                'label3': 'value-2,3',
                'label4': 'value-2,4',
56
            }
Miles Steele committed
57 58
        ]

59 60 61 62 63 64
        features = ['label1', 'label4']
        header, datarows = format_dictlist(dictlist, features)

        ideal_header = ['label1', 'label4']
        ideal_datarows = [['value-1,1', 'value-1,4'],
                          ['value-2,1', 'value-2,4']]
Miles Steele committed
65

66 67
        self.assertEqual(header, ideal_header)
        self.assertEqual(datarows, ideal_datarows)
Miles Steele committed
68 69

    def test_format_dictlist_empty(self):
70 71 72
        header, datarows = format_dictlist([], [])
        self.assertEqual(header, [])
        self.assertEqual(datarows, [])
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124

    def test_create_csv_response(self):
        header = ['Name', 'Email']
        datarows = [['Jim', 'jim@edy.org'], ['Jake', 'jake@edy.org'], ['Jeeves', 'jeeves@edy.org']]

        res = create_csv_response('robot.csv', header, datarows)
        self.assertEqual(res['Content-Type'], 'text/csv')
        self.assertEqual(res['Content-Disposition'], 'attachment; filename={0}'.format('robot.csv'))
        self.assertEqual(res.content.strip(), '"Name","Email"\r\n"Jim","jim@edy.org"\r\n"Jake","jake@edy.org"\r\n"Jeeves","jeeves@edy.org"')


class TestAnalyticsFormatInstances(TestCase):
    """ test format_instances method """
    class TestDataClass(object):
        """ Test class to generate objects for format_instances """
        def __init__(self):
            self.a_var = 'aval'
            self.b_var = 'bval'
            self.c_var = 'cval'

        @property
        def d_var(self):
            """ accessor to see if they work too """
            return 'dval'

    def setUp(self):
        self.instances = [self.TestDataClass() for _ in xrange(5)]

    def test_format_instances_response(self):
        features = ['a_var', 'c_var', 'd_var']
        header, datarows = format_instances(self.instances, features)
        self.assertEqual(header, ['a_var', 'c_var', 'd_var'])
        self.assertEqual(datarows, [[
            'aval',
            'cval',
            'dval',
        ] for _ in xrange(len(self.instances))])

    def test_format_instances_response_noinstances(self):
        features = ['a_var']
        header, datarows = format_instances([], features)
        self.assertEqual(header, features)
        self.assertEqual(datarows, [])

    def test_format_instances_response_nofeatures(self):
        header, datarows = format_instances(self.instances, [])
        self.assertEqual(header, [])
        self.assertEqual(datarows, [[] for _ in xrange(len(self.instances))])

    @raises(AttributeError)
    def test_format_instances_response_nonexistantfeature(self):
        format_instances(self.instances, ['robot_not_a_real_feature'])