Commit d925f797 by Tyler Hallada Committed by Dennis Jen

Add tests for CourseSummariesView, add count, generate fake summaries, progress bars

parent 6596d90f
......@@ -2,8 +2,10 @@
import datetime
import logging
from optparse import make_option
import math
import random
from optparse import make_option
from tqdm import tqdm
from django.core.management.base import BaseCommand
from django.utils import timezone
......@@ -87,7 +89,8 @@ class Command(BaseCommand):
models.CourseEnrollmentByGender,
models.CourseEnrollmentByEducation,
models.CourseEnrollmentByBirthYear,
models.CourseEnrollmentByCountry]:
models.CourseEnrollmentByCountry,
models.CourseMetaSummaryEnrollment]:
model.objects.all().delete()
logger.info("Deleted all daily course enrollment data.")
......@@ -98,6 +101,7 @@ class Command(BaseCommand):
date = start_date
cumulative_count = 0
progress = tqdm(total=(end_date - date).days + 2)
while date <= end_date:
daily_total = get_count(daily_total)
models.CourseEnrollmentDaily.objects.create(course_id=course_id, date=date, count=daily_total)
......@@ -128,8 +132,21 @@ class Command(BaseCommand):
models.CourseEnrollmentByBirthYear.objects.create(course_id=course_id, date=date, count=count,
birth_year=birth_year)
progress.update(1)
date = date + datetime.timedelta(days=1)
for mode, ratio in enrollment_mode_ratios.iteritems():
count = int(ratio * daily_total)
cumulative_count = count + random.randint(0, 100)
models.CourseMetaSummaryEnrollment.objects.create(
course_id=course_id, catalog_course_title='Demo Course', catalog_course='Demo_Course',
start_date=timezone.now() - datetime.timedelta(weeks=6),
end_date=timezone.now() + datetime.timedelta(weeks=10),
pacing_type='self_paced', availability='Current', mode=mode, count=count,
cumulative_count=cumulative_count, count_change_7_days=random.randint(-50, 50))
progress.update(1)
progress.close()
logger.info("Done!")
def generate_weekly_data(self, course_id, start_date, end_date):
......@@ -144,6 +161,7 @@ class Command(BaseCommand):
logger.info("Generating new weekly course activity data...")
progress = tqdm(total=math.ceil((end_date - start).days / 7.0) + 1)
while start < end_date:
active_students = random.randint(100, 4000)
# End date should occur on Saturday at 23:59:59
......@@ -159,8 +177,10 @@ class Command(BaseCommand):
count=active_students,
interval_start=start, interval_end=end)
progress.update(1)
start = end
progress.close()
logger.info("Done!")
def generate_video_timeline_data(self, video_id):
......@@ -193,6 +213,7 @@ class Command(BaseCommand):
logger.info("Generating learner engagement module data...")
current = start_date
progress = tqdm(total=(end_date - start_date).days + 1)
while current < end_date:
current = current + datetime.timedelta(days=1)
for metric in engagement_events.INDIVIDUAL_EVENTS:
......@@ -206,7 +227,9 @@ class Command(BaseCommand):
models.ModuleEngagement.objects.create(
course_id=course_id, username=username, date=current,
entity_type=entity_type, entity_id=entity_id, event=event, count=count)
logger.info("Done!")
progress.update(1)
progress.close()
logger.info("Done!")
def generate_learner_engagement_range_data(self, course_id, start_date, end_date, max_value=100):
logger.info("Deleting engagement range data...")
......@@ -256,7 +279,7 @@ class Command(BaseCommand):
username = options['username']
video_id = '0fac49ba'
video_module_id = 'i4x-edX-DemoX-video-5c90cffecd9b48b188cbfea176bf7fe9'
start_date = datetime.datetime(year=2016, month=1, day=1, tzinfo=timezone.utc)
start_date = timezone.now() - datetime.timedelta(weeks=10)
num_weeks = options['num_weeks']
if num_weeks:
......
......@@ -75,6 +75,7 @@ class CourseMetaSummaryEnrollment(BaseCourseModel):
pacing_type = models.CharField(db_index=True, max_length=255)
availability = models.CharField(db_index=True, max_length=255)
mode = models.CharField(max_length=255)
count = models.IntegerField(null=False)
cumulative_count = models.IntegerField(null=False)
count_change_7_days = models.IntegerField(default=0)
......
......@@ -521,8 +521,10 @@ class CourseMetaSummaryEnrollmentSerializer(ModelSerializerWithCreatedField):
pacing_type = serializers.CharField()
availability = serializers.CharField()
mode = serializers.CharField()
count = serializers.IntegerField(default=0)
cumulative_count = serializers.IntegerField(default=0)
count_change_7_days = serializers.IntegerField(default=0) # TODO: 0 as default?
class Meta(object):
model = models.CourseMetaSummaryEnrollment
exclude = ('id',)
......@@ -16,7 +16,7 @@ from mock import patch, Mock
from analytics_data_api.constants import country, enrollment_modes, genders
from analytics_data_api.constants.country import get_country
from analytics_data_api.v0 import models
from analytics_data_api.v0 import models, serializers
from analytics_data_api.v0.tests.views import CourseSamples, VerifyCsvResponseMixin
from analytics_data_api.utils import get_filename_safe_course_id
from analyticsdataserver.tests import TestCaseWithAuthentication
......@@ -889,3 +889,31 @@ class CourseReportDownloadViewTests(TestCaseWithAuthentication):
'expiration_date': datetime.datetime(2014, 1, 1, tzinfo=pytz.utc).strftime(settings.DATETIME_FORMAT)
}
self.assertEqual(response.data, expected)
class CourseSummariesViewTests(TestCaseWithAuthentication):
model = models.CourseMetaSummaryEnrollment
serializer = serializers.CourseMetaSummaryEnrollmentSerializer
path = '/course_summaries'
expected_summaries = []
fake_course_ids = ['edX/DemoX/Demo_Course', 'edX/DemoX/2', 'edX/DemoX/3', 'edX/DemoX/4']
# csv_filename_slug = u'course_summaries'
def setUp(self):
super(CourseSummariesViewTests, self).setUp()
self.generate_data()
def generate_data(self):
for course_id in self.fake_course_ids:
self.expected_summaries.append(self.serializer(
G(self.model, course_id=course_id, count=10, cumulative_count=15)).data)
def test_get(self):
response = self.authenticated_get(u'/api/v0/course_summaries/?course_ids=%s' % ','.join(self.fake_course_ids))
self.assertEquals(response.status_code, 200)
self.assertItemsEqual(response.data, self.expected_summaries)
def test_no_summaries(self):
self.model.objects.all().delete()
response = self.authenticated_get(u'/api/v0/course_summaries/?course_ids=%s' % ','.join(self.fake_course_ids))
self.assertEquals(response.status_code, 404)
# Local development dependencies go here
-r base.txt
tqdm==4.10.0 # MIT
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment