diff --git a/lms/djangoapps/verify_student/services.py b/lms/djangoapps/verify_student/services.py index f1c5543e8536..34b9ed91ce95 100644 --- a/lms/djangoapps/verify_student/services.py +++ b/lms/djangoapps/verify_student/services.py @@ -11,6 +11,7 @@ from django.core.exceptions import ObjectDoesNotExist from django.utils.timezone import now from django.utils.translation import gettext as _ +from openedx_filters.learning.filters import IDVPageURLRequested from common.djangoapps.course_modes.models import CourseMode from common.djangoapps.student.models import User @@ -244,7 +245,8 @@ def get_verify_location(cls, course_id=None): location = f'{settings.ACCOUNT_MICROFRONTEND_URL}/id-verification' if course_id: location += f'?course_id={quote(str(course_id))}' - return location + + return IDVPageURLRequested.run_filter(location) @classmethod def get_verification_details_by_id(cls, attempt_id): diff --git a/lms/djangoapps/verify_student/tests/test_services.py b/lms/djangoapps/verify_student/tests/test_services.py index 5351e3ede699..d57993d368af 100644 --- a/lms/djangoapps/verify_student/tests/test_services.py +++ b/lms/djangoapps/verify_student/tests/test_services.py @@ -9,10 +9,11 @@ import ddt from django.conf import settings -from django.test import TestCase +from django.test import TestCase, override_settings from django.utils.timezone import now from django.utils.translation import gettext as _ from freezegun import freeze_time +from openedx_filters import PipelineStep from pytz import utc from common.djangoapps.student.tests.factories import UserFactory @@ -33,6 +34,16 @@ } +class TestIdvPageUrlRequestedPipelineStep(PipelineStep): + """ Utility function to test a configured pipeline step """ + TEST_URL = 'example.com/verify' + + def run_filter(self, url): # pylint: disable=arguments-differ + return { + "url": self.TEST_URL + } + + @patch.dict(settings.VERIFY_STUDENT, FAKE_SETTINGS) @ddt.ddt class TestIDVerificationService(ModuleStoreTestCase): @@ -167,6 +178,26 @@ def test_get_verify_location_from_string(self): expected_path = f'{settings.ACCOUNT_MICROFRONTEND_URL}/id-verification' assert path == (expected_path + '?course_id=course-v1%3AedX%2BDemoX%2BDemo_Course') + @override_settings( + OPEN_EDX_FILTERS_CONFIG={ + "org.openedx.learning.idv.page.url.requested.v1": { + "pipeline": [ + "lms.djangoapps.verify_student.tests.test_services.TestIdvPageUrlRequestedPipelineStep", + ], + "fail_silently": False, + }, + }, + ) + def test_get_verify_location_with_filter_step(self): + """ + Test IDV flow location can be customized with an openedx filter + """ + url = IDVerificationService.get_verify_location() + assert url == TestIdvPageUrlRequestedPipelineStep.TEST_URL + + url = IDVerificationService.get_verify_location('course-v1:edX+DemoX+Demo_Course') + assert url == TestIdvPageUrlRequestedPipelineStep.TEST_URL + def test_get_expiration_datetime(self): """ Test that the latest expiration datetime is returned if there are multiple records