diff --git a/common/djangoapps/student/tests/tests.py b/common/djangoapps/student/tests/tests.py index c640462acf10..c2e6d3b2aa9c 100644 --- a/common/djangoapps/student/tests/tests.py +++ b/common/djangoapps/student/tests/tests.py @@ -47,6 +47,7 @@ from openedx.core.djangoapps.programs.tests.mixins import ProgramsApiConfigMixin from openedx.core.djangoapps.site_configuration.tests.mixins import SiteMixin from openedx.core.djangolib.testing.utils import CacheIsolationTestCase, skip_unless_lms +from openedx.features.course_experience.url_helpers import make_learning_mfe_courseware_url from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase, SharedModuleStoreTestCase # lint-amnesty, pylint: disable=wrong-import-order from xmodule.modulestore.tests.factories import CourseFactory, check_mongo_calls # lint-amnesty, pylint: disable=wrong-import-order from xmodule.data import CertificatesDisplayBehaviors # lint-amnesty, pylint: disable=wrong-import-order @@ -907,15 +908,15 @@ def _enroll_through_view(self, course): ) return response - @ddt.data( - (True, 'courseware'), - (False, None), - ) - @ddt.unpack - def test_enrollment_url(self, waffle_flag_enabled, returned_view): - with override_waffle_switch(REDIRECT_TO_COURSEWARE_AFTER_ENROLLMENT, waffle_flag_enabled): + def test_enrollment_url_without_redirect(self): + with override_waffle_switch(REDIRECT_TO_COURSEWARE_AFTER_ENROLLMENT, False): + response = self._enroll_through_view(self.course) + assert response.content.decode('utf8') == '' + + def test_enrollment_with_redirect(self): + with override_waffle_switch(REDIRECT_TO_COURSEWARE_AFTER_ENROLLMENT, True): response = self._enroll_through_view(self.course) - data = reverse(returned_view, args=[str(self.course.id)]) if returned_view else '' + data = make_learning_mfe_courseware_url(self.course.id) assert response.content.decode('utf8') == data def test_enroll_as_default(self): diff --git a/common/djangoapps/student/views/management.py b/common/djangoapps/student/views/management.py index 02940da78f3b..4cf8fad8aea5 100644 --- a/common/djangoapps/student/views/management.py +++ b/common/djangoapps/student/views/management.py @@ -62,6 +62,7 @@ ) from openedx.core.djangolib.markup import HTML, Text from openedx.core.lib.api.authentication import BearerAuthenticationAllowInactiveUser +from openedx.features.course_experience.url_helpers import make_learning_mfe_courseware_url from openedx.features.discounts.applicability import FIRST_PURCHASE_DISCOUNT_OVERRIDE_FLAG from openedx.features.enterprise_support.utils import is_enterprise_learner from common.djangoapps.student.email_helpers import generate_activation_email_context @@ -408,7 +409,7 @@ def change_enrollment(request, check_access=True): return HttpResponse(redirect_url) if CourseEntitlement.check_for_existing_entitlement_and_enroll(user=user, course_run_key=course_id): - return HttpResponse(reverse('courseware', args=[str(course_id)])) + return HttpResponse(make_learning_mfe_courseware_url(course_id)) # Check that auto enrollment is allowed for this course # (= the course is NOT behind a paywall) @@ -438,7 +439,7 @@ def change_enrollment(request, check_access=True): ) if should_redirect_to_courseware_after_enrollment(): - return HttpResponse(reverse('courseware', args=[str(course_id)])) + return HttpResponse(make_learning_mfe_courseware_url(course_id)) else: return HttpResponse() elif action == "unenroll": diff --git a/lms/djangoapps/commerce/api/v0/views.py b/lms/djangoapps/commerce/api/v0/views.py index 102217350354..5238b842e9f7 100644 --- a/lms/djangoapps/commerce/api/v0/views.py +++ b/lms/djangoapps/commerce/api/v0/views.py @@ -4,7 +4,6 @@ import logging from urllib.parse import urljoin -from django.urls import reverse from edx_rest_framework_extensions.auth.jwt.authentication import JwtAuthentication from opaque_keys import InvalidKeyError from opaque_keys.edx.keys import CourseKey @@ -24,6 +23,7 @@ from openedx.core.djangoapps.enrollments.views import EnrollmentCrossDomainSessionAuth from openedx.core.djangoapps.user_api.preferences.api import update_email_opt_in from openedx.core.lib.api.authentication import BearerAuthenticationAllowInactiveUser +from openedx.features.course_experience.url_helpers import make_learning_mfe_courseware_url from ...constants import Messages from ...http import DetailResponse @@ -122,7 +122,7 @@ def post(self, request, *args, **kwargs): # lint-amnesty, pylint: disable=unuse if CourseEntitlement.check_for_existing_entitlement_and_enroll(user=user, course_run_key=course_key): return JsonResponse( { - 'redirect_destination': reverse('courseware', args=[str(course_id)]), + 'redirect_destination': make_learning_mfe_courseware_url(course_id), }, ) diff --git a/lms/djangoapps/course_wiki/tests/tests.py b/lms/djangoapps/course_wiki/tests/tests.py index 7fc86947d4fa..7821f659d983 100644 --- a/lms/djangoapps/course_wiki/tests/tests.py +++ b/lms/djangoapps/course_wiki/tests/tests.py @@ -7,6 +7,7 @@ from django.urls import reverse from lms.djangoapps.courseware.tests.tests import LoginEnrollmentTestCase +from openedx.features.course_experience.url_helpers import make_learning_mfe_courseware_url from openedx.features.enterprise_support.tests.mixins.enterprise import EnterpriseTestConsentRequired from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase # lint-amnesty, pylint: disable=wrong-import-order from xmodule.modulestore.tests.factories import CourseFactory # lint-amnesty, pylint: disable=wrong-import-order @@ -121,7 +122,7 @@ def test_course_navigator(self): self.create_course_page(self.toy) course_wiki_page = reverse('wiki:get', kwargs={'path': self.toy.wiki_slug + '/'}) - referer = reverse("courseware", kwargs={'course_id': str(self.toy.id)}) + referer = make_learning_mfe_courseware_url(self.toy.id) resp = self.client.get(course_wiki_page, follow=True, HTTP_REFERER=referer) @@ -141,7 +142,7 @@ def test_wiki_not_accessible_when_not_enrolled(self): self.login(self.student, self.password) course_wiki_page = reverse('wiki:get', kwargs={'path': self.toy.wiki_slug + '/'}) - referer = reverse("courseware", kwargs={'course_id': str(self.toy.id)}) + referer = make_learning_mfe_courseware_url(self.toy.id) # When not enrolled, we should get a 302 resp = self.client.get(course_wiki_page, follow=False, HTTP_REFERER=referer) @@ -195,7 +196,7 @@ def test_create_wiki_with_long_course_id(self): self.create_course_page(course) course_wiki_page = reverse('wiki:get', kwargs={'path': course.wiki_slug + '/'}) - referer = reverse("courseware", kwargs={'course_id': str(course.id)}) + referer = make_learning_mfe_courseware_url(self.toy.id) resp = self.client.get(course_wiki_page, follow=True, HTTP_REFERER=referer) assert resp.status_code == 200 diff --git a/lms/djangoapps/courseware/tests/test_navigation.py b/lms/djangoapps/courseware/tests/test_navigation.py index 82b27a5bd6ec..7d6e8cf04365 100644 --- a/lms/djangoapps/courseware/tests/test_navigation.py +++ b/lms/djangoapps/courseware/tests/test_navigation.py @@ -17,6 +17,7 @@ from common.djangoapps.student.tests.factories import GlobalStaffFactory from lms.djangoapps.courseware.tests.helpers import LoginEnrollmentTestCase, set_preview_mode from openedx.features.course_experience import DISABLE_COURSE_OUTLINE_PAGE_FLAG +from openedx.features.course_experience.url_helpers import make_learning_mfe_courseware_url @set_preview_mode(True) @@ -111,7 +112,7 @@ def test_chrome_settings(self): assert ('course-navigation' in response.content.decode('utf-8')) == accordion self.assertTabInactive('progress', response) - self.assertTabActive('courseware', response) + self.assertTabActive(make_learning_mfe_courseware_url(self.course.id), response) response = self.client.get(reverse('courseware_section', kwargs={ 'course_id': str(self.course.id), @@ -120,7 +121,7 @@ def test_chrome_settings(self): })) self.assertTabActive('progress', response) - self.assertTabInactive('courseware', response) + self.assertTabInactive(make_learning_mfe_courseware_url(self.course.id), response) @override_settings(SESSION_INACTIVITY_TIMEOUT_IN_SECONDS=1) def test_inactive_session_timeout(self): diff --git a/openedx/core/djangoapps/user_api/tests/test_middleware.py b/openedx/core/djangoapps/user_api/tests/test_middleware.py index 836e6d9465d7..04b5b4104971 100644 --- a/openedx/core/djangoapps/user_api/tests/test_middleware.py +++ b/openedx/core/djangoapps/user_api/tests/test_middleware.py @@ -5,13 +5,18 @@ from django.http import HttpResponse from django.test import TestCase from django.test.client import RequestFactory +from django.urls import reverse from common.djangoapps.student.tests.factories import AnonymousUserFactory, UserFactory +from openedx.core.djangolib.testing.utils import skip_unless_lms from ..middleware import UserTagsEventContextMiddleware from ..tests.factories import UserCourseTagFactory +# This middleware only gets installed in the LMS so no need to test +# it in the CMS context. +@skip_unless_lms class TagsMiddlewareTest(TestCase): """ Test the UserTagsEventContextMiddleware @@ -25,9 +30,7 @@ def setUp(self): self.course_id = 'mock/course/id' self.request_factory = RequestFactory() - # TODO: Make it so we can use reverse. Appears to fail depending on the order in which tests are run - #self.request = RequestFactory().get(reverse('courseware', kwargs={'course_id': self.course_id})) - self.request = RequestFactory().get(f'/courses/{self.course_id}/courseware') + self.request = RequestFactory().get(reverse('progress', kwargs={'course_id': self.course_id})) self.request.user = self.user self.response = Mock(spec=HttpResponse) diff --git a/openedx/features/course_experience/__init__.py b/openedx/features/course_experience/__init__.py index a45d863e09c5..3f4c4d3fefd1 100644 --- a/openedx/features/course_experience/__init__.py +++ b/openedx/features/course_experience/__init__.py @@ -104,7 +104,9 @@ def default_course_url(course_key): from .url_helpers import get_learning_mfe_home_url if DISABLE_COURSE_OUTLINE_PAGE_FLAG.is_enabled(course_key): - return reverse('courseware', args=[str(course_key)]) + # Prevent a circular dependency + from openedx.features.course_experience.url_helpers import make_learning_mfe_courseware_url + return make_learning_mfe_courseware_url(course_key) return get_learning_mfe_home_url(course_key, url_fragment='home')