From 4b81f0bb3cbb9740c40ee47523a990aa50888723 Mon Sep 17 00:00:00 2001 From: Ayub-khan Date: Tue, 9 Feb 2016 15:19:47 +0500 Subject: [PATCH] Fix progress exception for credit courses and add unit test. --- lms/djangoapps/courseware/tests/test_views.py | 40 ++++++++++++++++++- lms/djangoapps/courseware/views.py | 6 +-- 2 files changed, 40 insertions(+), 6 deletions(-) mode change 100644 => 100755 lms/djangoapps/courseware/tests/test_views.py diff --git a/lms/djangoapps/courseware/tests/test_views.py b/lms/djangoapps/courseware/tests/test_views.py old mode 100644 new mode 100755 index e26f4470a1..49459f9408 --- a/lms/djangoapps/courseware/tests/test_views.py +++ b/lms/djangoapps/courseware/tests/test_views.py @@ -53,6 +53,8 @@ from xmodule.modulestore.django import modulestore from xmodule.modulestore.tests.django_utils import TEST_DATA_MIXED_TOY_MODULESTORE from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory, check_mongo_calls +from openedx.core.djangoapps.credit.api import set_credit_requirements +from openedx.core.djangoapps.credit.models import CreditCourse, CreditProvider @attr('shard_1') @@ -907,9 +909,43 @@ class ProgressPageTests(ModuleStoreTestCase): # Assert that valid 'student_id' returns 200 status self.assertEqual(resp.status_code, 200) - def test_non_asci_grade_cutoffs(self): - resp = views.progress(self.request, course_id=unicode(self.course.id)) + @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split) + def test_unenrolled_student_progress_for_credit_course(self, default_store): + """ + Test that student progress page does not break while checking for an unenrolled student. + Scenario: When instructor checks the progress of a student who is not enrolled in credit course. + It should return 200 response. + """ + # Create a new course, a user which will not be enrolled in course, admin user for staff access + course = CourseFactory.create(default_store=default_store) + not_enrolled_user = UserFactory.create() + self.request.user = AdminFactory.create() + + # Create and enable Credit course + CreditCourse.objects.create(course_key=course.id, enabled=True) + + # Configure a credit provider for the course + CreditProvider.objects.create( + provider_id="ASU", + enable_integration=True, + provider_url="https://credit.example.com/request" + ) + + requirements = [{ + "namespace": "grade", + "name": "grade", + "display_name": "Grade", + "criteria": {"min_grade": 0.52}, + }] + # Add a single credit requirement (final grade) + set_credit_requirements(course.id, requirements) + + resp = views.progress(self.request, course_id=unicode(course.id), student_id=not_enrolled_user.id) + self.assertEqual(resp.status_code, 200) + + def test_non_ascii_grade_cutoffs(self): + resp = views.progress(self.request, course_id=unicode(self.course.id)) self.assertEqual(resp.status_code, 200) def test_generate_cert_config(self): diff --git a/lms/djangoapps/courseware/views.py b/lms/djangoapps/courseware/views.py index 73a43345c1..a0fa7555f2 100644 --- a/lms/djangoapps/courseware/views.py +++ b/lms/djangoapps/courseware/views.py @@ -1091,11 +1091,9 @@ def _credit_course_requirements(course_key, student): if not (settings.FEATURES.get("ENABLE_CREDIT_ELIGIBILITY", False) and is_credit_course(course_key)): return None - # If student is enrolled not enrolled in verified or credit mode, - # short-circuit and return None. This indicates that - # credit requirements should NOT be displayed on the progress page. + # This indicates that credit requirements should NOT be displayed on the progress page. enrollment = CourseEnrollment.get_enrollment(student, course_key) - if enrollment.mode not in REQUIREMENTS_DISPLAY_MODES: + if enrollment and enrollment.mode not in REQUIREMENTS_DISPLAY_MODES: return None # Credit requirement statuses for which user does not remain eligible to get credit.