From 131c8cbf101151ad2f5072ba34255aa4a1bf6f0f Mon Sep 17 00:00:00 2001 From: Usman Khalid <2200617@gmail.com> Date: Thu, 7 Aug 2014 20:05:59 +0500 Subject: [PATCH 1/2] Catch InvalidKeyError in course_id_from_url(). LMS-9663 --- common/djangoapps/util/request.py | 7 +++++- common/djangoapps/util/tests/test_request.py | 24 ++++++++++++++++---- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/common/djangoapps/util/request.py b/common/djangoapps/util/request.py index d99962a76d..ed46d48b8f 100644 --- a/common/djangoapps/util/request.py +++ b/common/djangoapps/util/request.py @@ -2,7 +2,9 @@ import re from django.conf import settings + from microsite_configuration import microsite +from opaque_keys import InvalidKeyError from opaque_keys.edx.locations import SlashSeparatedCourseKey @@ -41,4 +43,7 @@ def course_id_from_url(url): if course_id is None: return None - return SlashSeparatedCourseKey.from_deprecated_string(course_id) + try: + return SlashSeparatedCourseKey.from_deprecated_string(course_id) + except InvalidKeyError: + return None diff --git a/common/djangoapps/util/tests/test_request.py b/common/djangoapps/util/tests/test_request.py index 76bd9b527f..b023d03ad9 100644 --- a/common/djangoapps/util/tests/test_request.py +++ b/common/djangoapps/util/tests/test_request.py @@ -1,9 +1,13 @@ -from django.test.client import RequestFactory -from django.conf import settings -from util.request import safe_get_host -from django.core.exceptions import SuspiciousOperation +"""Tests for util.request module.""" + import unittest +from django.conf import settings +from django.core.exceptions import SuspiciousOperation +from django.test.client import RequestFactory + +from util.request import course_id_from_url, safe_get_host + class ResponseTestCase(unittest.TestCase): """ Tests for response-related utility functions """ @@ -37,3 +41,15 @@ class ResponseTestCase(unittest.TestCase): settings.ALLOWED_HOSTS = ["the_valid_website.com"] with self.assertRaises(SuspiciousOperation): safe_get_host(request) + + def test_course_id_from_url(self): + """ Test course_id_from_url(). """ + + self.assertIsNone(course_id_from_url('/login')) + self.assertIsNone(course_id_from_url('/course/edX/maths/2020')) + self.assertIsNone(course_id_from_url('/courses/edX/maths/')) + + course_id = course_id_from_url('/courses/edX/maths/2020') + self.assertEqual(course_id.org, 'edX') + self.assertEqual(course_id.course, 'maths') + self.assertEqual(course_id.run, '2020') From f9ee21f4340c78ff4220820a60ac5e9d317728bf Mon Sep 17 00:00:00 2001 From: Usman Khalid <2200617@gmail.com> Date: Fri, 8 Aug 2014 20:34:44 +0500 Subject: [PATCH 2/2] Incomplete course ids should return a 404. --- lms/djangoapps/courseware/tests/test_views.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lms/djangoapps/courseware/tests/test_views.py b/lms/djangoapps/courseware/tests/test_views.py index 4906d4c8d8..b1e066e08e 100644 --- a/lms/djangoapps/courseware/tests/test_views.py +++ b/lms/djangoapps/courseware/tests/test_views.py @@ -148,6 +148,10 @@ class ViewsTestCase(TestCase): self.assertRaises(Http404, views.redirect_to_course_position, mock_module, views.CONTENT_DEPTH) + def test_invalid_course_id(self): + response = self.client.get('/courses/MITx/3.091X/') + self.assertEqual(response.status_code, 404) + def test_index_invalid_position(self): request_url = '/'.join([ '/courses',