""" Tests for analytics.distributions """ from django.test import TestCase from nose.tools import raises from student.models import CourseEnrollment from student.tests.factories import UserFactory from analytics.distributions import profile_distribution, AVAILABLE_PROFILE_FEATURES class TestAnalyticsDistributions(TestCase): '''Test analytics distribution gathering.''' def setUp(self): self.course_id = 'some/robot/course/id' self.users = [UserFactory( profile__gender=['m', 'f', 'o'][i % 3], profile__year_of_birth=i + 1930 ) for i in xrange(30)] self.ces = [CourseEnrollment.enroll(user, self.course_id) for user in self.users] @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) 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') 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 self.assertEqual(distribution.type, 'OPEN_CHOICE') self.assertTrue(hasattr(distribution, 'choices_display_names')) self.assertEqual(distribution.choices_display_names, None) self.assertNotIn('no_data', distribution.data) self.assertEqual(distribution.data[1930], 1) class TestAnalyticsDistributionsNoData(TestCase): '''Test analytics distribution gathering.''' def setUp(self): self.course_id = 'some/robot/course/id' self.users = [UserFactory( profile__year_of_birth=i + 1930, ) for i in xrange(5)] self.nodata_users = [UserFactory( profile__year_of_birth=None, profile__gender=[None, ''][i % 2] ) for i in xrange(4)] self.users += self.nodata_users self.ces = tuple(CourseEnrollment.enroll(user, self.course_id) for user in self.users) 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')) self.assertNotEqual(distribution.choices_display_names, None) self.assertIn('no_data', distribution.data) self.assertEqual(distribution.data['no_data'], len(self.nodata_users)) 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 self.assertEqual(distribution.type, 'OPEN_CHOICE') self.assertTrue(hasattr(distribution, 'choices_display_names')) self.assertEqual(distribution.choices_display_names, None) self.assertIn('no_data', distribution.data) self.assertEqual(distribution.data['no_data'], len(self.nodata_users))