test_distributions.py 4.96 KB
Newer Older
1 2
""" Tests for analytics.distributions """

Miles Steele committed
3 4
from django.test import TestCase
from nose.tools import raises
5
from opaque_keys.edx.locator import CourseLocator
Miles Steele committed
6

7 8 9
from instructor_analytics.distributions import AVAILABLE_PROFILE_FEATURES, profile_distribution
from student.models import CourseEnrollment
from student.tests.factories import UserFactory
Miles Steele committed
10 11 12 13 14 15


class TestAnalyticsDistributions(TestCase):
    '''Test analytics distribution gathering.'''

    def setUp(self):
16
        super(TestAnalyticsDistributions, self).setUp()
17
        self.course_id = CourseLocator('robot', 'course', 'id')
Miles Steele committed
18

19
        self.users = [UserFactory(
Miles Steele committed
20
            profile__gender=['m', 'f', 'o'][i % 3],
21
            profile__level_of_education=['a', 'hs', 'el'][i % 3],
Miles Steele committed
22
            profile__year_of_birth=i + 1930
23
        ) for i in xrange(30)]
Miles Steele committed
24

25 26
        self.ces = [CourseEnrollment.enroll(user, self.course_id)
                    for user in self.users]
Miles Steele committed
27 28 29 30 31 32 33 34 35 36 37

    @raises(ValueError)
    def test_profile_distribution_bad_feature(self):
        feature = 'robot-not-a-real-feature'
        self.assertNotIn(feature, AVAILABLE_PROFILE_FEATURES)
        profile_distribution(self.course_id, feature)

    def test_profile_distribution_easy_choice(self):
        feature = 'gender'
        self.assertIn(feature, AVAILABLE_PROFILE_FEATURES)
        distribution = profile_distribution(self.course_id, feature)
38 39 40 41
        self.assertEqual(distribution.type, 'EASY_CHOICE')
        self.assertEqual(distribution.data['no_data'], 0)
        self.assertEqual(distribution.data['m'], len(self.users) / 3)
        self.assertEqual(distribution.choices_display_names['m'], 'Male')
Miles Steele committed
42 43 44 45 46 47

    def test_profile_distribution_open_choice(self):
        feature = 'year_of_birth'
        self.assertIn(feature, AVAILABLE_PROFILE_FEATURES)
        distribution = profile_distribution(self.course_id, feature)
        print distribution
48
        self.assertEqual(distribution.type, 'OPEN_CHOICE')
Miles Steele committed
49 50
        self.assertTrue(hasattr(distribution, 'choices_display_names'))
        self.assertEqual(distribution.choices_display_names, None)
51 52
        self.assertNotIn('no_data', distribution.data)
        self.assertEqual(distribution.data[1930], 1)
Miles Steele committed
53

54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
    def test_gender_count(self):
        course_enrollments = CourseEnrollment.objects.filter(
            course_id=self.course_id, user__profile__gender='m'
        )
        distribution = profile_distribution(self.course_id, "gender")
        self.assertEqual(distribution.data['m'], len(course_enrollments))
        course_enrollments[0].deactivate()
        distribution = profile_distribution(self.course_id, "gender")
        self.assertEqual(distribution.data['m'], len(course_enrollments) - 1)

    def test_level_of_education_count(self):
        course_enrollments = CourseEnrollment.objects.filter(
            course_id=self.course_id, user__profile__level_of_education='hs'
        )
        distribution = profile_distribution(self.course_id, "level_of_education")
        self.assertEqual(distribution.data['hs'], len(course_enrollments))
        course_enrollments[0].deactivate()
        distribution = profile_distribution(self.course_id, "level_of_education")
        self.assertEqual(distribution.data['hs'], len(course_enrollments) - 1)

Miles Steele committed
74 75 76 77 78

class TestAnalyticsDistributionsNoData(TestCase):
    '''Test analytics distribution gathering.'''

    def setUp(self):
79
        super(TestAnalyticsDistributionsNoData, self).setUp()
80
        self.course_id = CourseLocator('robot', 'course', 'id')
Miles Steele committed
81

82
        self.users = [UserFactory(
Miles Steele committed
83
            profile__year_of_birth=i + 1930,
84
        ) for i in xrange(5)]
Miles Steele committed
85

86
        self.nodata_users = [UserFactory(
Miles Steele committed
87
            profile__year_of_birth=None,
88 89
            profile__gender=[None, ''][i % 2]
        ) for i in xrange(4)]
Miles Steele committed
90 91 92

        self.users += self.nodata_users

93 94
        self.ces = tuple(CourseEnrollment.enroll(user, self.course_id)
                         for user in self.users)
Miles Steele committed
95

96 97 98 99 100 101 102
    def test_profile_distribution_easy_choice_nodata(self):
        feature = 'gender'
        self.assertIn(feature, AVAILABLE_PROFILE_FEATURES)
        distribution = profile_distribution(self.course_id, feature)
        print distribution
        self.assertEqual(distribution.type, 'EASY_CHOICE')
        self.assertTrue(hasattr(distribution, 'choices_display_names'))
Miles Steele committed
103
        self.assertNotEqual(distribution.choices_display_names, None)
104 105 106
        self.assertIn('no_data', distribution.data)
        self.assertEqual(distribution.data['no_data'], len(self.nodata_users))

Miles Steele committed
107 108 109 110 111
    def test_profile_distribution_open_choice_nodata(self):
        feature = 'year_of_birth'
        self.assertIn(feature, AVAILABLE_PROFILE_FEATURES)
        distribution = profile_distribution(self.course_id, feature)
        print distribution
112
        self.assertEqual(distribution.type, 'OPEN_CHOICE')
Miles Steele committed
113 114
        self.assertTrue(hasattr(distribution, 'choices_display_names'))
        self.assertEqual(distribution.choices_display_names, None)
115 116
        self.assertIn('no_data', distribution.data)
        self.assertEqual(distribution.data['no_data'], len(self.nodata_users))