From 96ca1da054fcc050adc0cde9c9150ee956e5948c Mon Sep 17 00:00:00 2001 From: cewing Date: Tue, 13 Jan 2015 10:45:55 -0800 Subject: [PATCH] MIT: CCX. Increase test coverage Improve testing of views and utils Test api methods added to models. --- lms/djangoapps/pocs/tests/test_models.py | 109 +++++++++++++++++++++++ lms/djangoapps/pocs/tests/test_utils.py | 4 +- lms/djangoapps/pocs/tests/test_views.py | 23 +++++ 3 files changed, 134 insertions(+), 2 deletions(-) create mode 100644 lms/djangoapps/pocs/tests/test_models.py diff --git a/lms/djangoapps/pocs/tests/test_models.py b/lms/djangoapps/pocs/tests/test_models.py new file mode 100644 index 0000000000..b12303fae2 --- /dev/null +++ b/lms/djangoapps/pocs/tests/test_models.py @@ -0,0 +1,109 @@ +from student.models import CourseEnrollment +from student.roles import CoursePocCoachRole +from student.tests.factories import ( + AdminFactory, + CourseEnrollmentFactory, + UserFactory, +) +from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase +from xmodule.modulestore.tests.factories import CourseFactory + +from .factories import ( + PocFactory, + PocMembershipFactory, + PocFutureMembershipFactory, +) +from ..models import ( + PocMembership, + PocFutureMembership, +) + + +class TestPocMembership(ModuleStoreTestCase): + """Unit tests for the PocMembership model + """ + + def setUp(self): + """common setup for all tests""" + self.course = course = CourseFactory.create() + coach = AdminFactory.create() + role = CoursePocCoachRole(course.id) + role.add_users(coach) + self.poc = PocFactory(course_id=course.id, coach=coach) + enrollment = CourseEnrollmentFactory.create(course_id=course.id) + self.enrolled_user = enrollment.user + self.unenrolled_user = UserFactory.create() + + def create_future_enrollment(self, user, auto_enroll=True): + pfm = PocFutureMembershipFactory.create( + poc=self.poc, + email=user.email, + auto_enroll=auto_enroll + ) + return pfm + + def has_course_enrollment(self, user): + enrollment = CourseEnrollment.objects.filter( + user=user, course_id=self.course.id + ) + return enrollment.exists() + + def has_poc_membership(self, user): + membership = PocMembership.objects.filter( + student=user, poc=self.poc, active=True + ) + return membership.exists() + + def has_poc_future_membership(self, user): + future_membership = PocFutureMembership.objects.filter( + email=user.email, poc=self.poc + ) + return future_membership.exists() + + def call_MUT(self, student, future_membership): + PocMembership.auto_enroll(student, future_membership) + + def test_poc_auto_enroll_unregistered_user(self): + """verify auto_enroll works when user is not enrolled in the MOOC + + n.b. After auto_enroll, user will have both a MOOC enrollment and a + POC membership + """ + user = self.unenrolled_user + pfm = self.create_future_enrollment(user) + self.assertTrue(self.has_poc_future_membership(user)) + self.assertFalse(self.has_course_enrollment(user)) + # auto_enroll user + self.call_MUT(user, pfm) + + self.assertTrue(self.has_course_enrollment(user)) + self.assertTrue(self.has_poc_membership(user)) + self.assertFalse(self.has_poc_future_membership(user)) + + def test_poc_auto_enroll_registered_user(self): + """verify auto_enroll works when user is enrolled in the MOOC + """ + user = self.enrolled_user + pfm = self.create_future_enrollment(user) + self.assertTrue(self.has_poc_future_membership(user)) + self.assertTrue(self.has_course_enrollment(user)) + + self.call_MUT(user, pfm) + + self.assertTrue(self.has_course_enrollment(user)) + self.assertTrue(self.has_poc_membership(user)) + self.assertFalse(self.has_poc_future_membership(user)) + + def test_future_membership_disallows_auto_enroll(self): + """verify that the PocFutureMembership can veto auto_enroll + """ + user = self.unenrolled_user + pfm = self.create_future_enrollment(user, auto_enroll=False) + self.assertTrue(self.has_poc_future_membership(user)) + self.assertFalse(self.has_course_enrollment(user)) + + self.assertRaises(ValueError, self.call_MUT, user, pfm) + + self.assertFalse(self.has_course_enrollment(user)) + self.assertFalse(self.has_poc_membership(user)) + self.assertTrue(self.has_poc_future_membership(user)) diff --git a/lms/djangoapps/pocs/tests/test_utils.py b/lms/djangoapps/pocs/tests/test_utils.py index 242c5b98cd..148f75a377 100644 --- a/lms/djangoapps/pocs/tests/test_utils.py +++ b/lms/djangoapps/pocs/tests/test_utils.py @@ -544,5 +544,5 @@ class TestUserPocList(ModuleStoreTestCase): # all parts of the poc url are present for part in url_parts: self.assertTrue(part in this_membership['poc_url']) - actual_name = self.get_course_title() - self.assertTrue(actual_name in this_membership['poc_name']) + actual_name = self.poc.display_name + self.assertEqual(actual_name, this_membership['poc_name']) diff --git a/lms/djangoapps/pocs/tests/test_views.py b/lms/djangoapps/pocs/tests/test_views.py index 4f2edccffb..47cb356f93 100644 --- a/lms/djangoapps/pocs/tests/test_views.py +++ b/lms/djangoapps/pocs/tests/test_views.py @@ -564,6 +564,13 @@ class TestSwitchActivePoc(ModuleStoreTestCase, LoginEnrollmentTestCase): """ PocMembershipFactory(poc=self.poc, student=self.user, active=active) + def revoke_poc_registration(self): + from ..models import PocMembership + membership = PocMembership.objects.filter( + poc=self.poc, student=self.user + ) + membership.delete() + def verify_active_poc(self, request, id=None): if id: id = str(id) @@ -689,6 +696,22 @@ class TestSwitchActivePoc(ModuleStoreTestCase, LoginEnrollmentTestCase): # switched back to the mooc view self.verify_active_poc(self.client) + def test_revoking_poc_membership_revokes_active_poc(self): + self.register_user_in_poc(active=True) + self.client.login(username=self.user.username, password="test") + # ensure poc is active in the request session + switch_url = reverse( + 'switch_active_poc', + args=[self.course.id.to_deprecated_string(), self.poc.id] + ) + self.client.get(switch_url) + self.verify_active_poc(self.client, self.poc.id) + # unenroll the user from the poc + self.revoke_poc_registration() + # request the course root and verify that the poc is not active + self.client.get(self.target_url) + self.verify_active_poc(self.client) + def flatten(seq): """