From 2bc44f6297d61f96b551b898f4b8044ef65b301e Mon Sep 17 00:00:00 2001
From: Fateme Khodayari <fateme.khodayari97@gmail.com>
Date: Sun, 21 Jul 2024 19:30:41 +0330
Subject: [PATCH] fix: course progress url returned based on
 course_home_mfe_progress_tab_is_active

---
 lms/djangoapps/learner_home/serializers.py    |  3 ++-
 .../learner_home/test_serializers.py          | 26 ++++++++++++++++++-
 lms/djangoapps/learner_home/utils.py          | 16 ++++++++++++
 3 files changed, 43 insertions(+), 2 deletions(-)

diff --git a/lms/djangoapps/learner_home/serializers.py b/lms/djangoapps/learner_home/serializers.py
index 0ce7bf9c6977..b3471715b9dc 100644
--- a/lms/djangoapps/learner_home/serializers.py
+++ b/lms/djangoapps/learner_home/serializers.py
@@ -15,6 +15,7 @@
 from common.djangoapps.course_modes.models import CourseMode
 from openedx.features.course_experience import course_home_url
 from xmodule.data import CertificatesDisplayBehaviors
+from lms.djangoapps.learner_home.utils import course_progress_url
 
 
 class LiteralField(serializers.Field):
@@ -116,7 +117,7 @@ def get_homeUrl(self, instance):
         return course_home_url(instance.course_id)
 
     def get_progressUrl(self, instance):
-        return reverse("progress", kwargs={"course_id": instance.course_id})
+        return course_progress_url(instance.course_id)
 
     def get_unenrollUrl(self, instance):
         return reverse("course_run_refund_status", args=[instance.course_id])
diff --git a/lms/djangoapps/learner_home/test_serializers.py b/lms/djangoapps/learner_home/test_serializers.py
index f588af58aee4..ac11a8b2990d 100644
--- a/lms/djangoapps/learner_home/test_serializers.py
+++ b/lms/djangoapps/learner_home/test_serializers.py
@@ -51,7 +51,7 @@
     SuggestedCourseSerializer,
     UnfulfilledEntitlementSerializer,
 )
-
+from lms.djangoapps.learner_home.utils import course_progress_url
 from lms.djangoapps.learner_home.test_utils import (
     datetime_to_django_format,
     random_bool,
@@ -224,6 +224,30 @@ def test_missing_resume_url(self):
         # Then the resumeUrl is None, which is allowed
         self.assertIsNone(output_data["resumeUrl"])
 
+    def is_progress_url_matching_course_home_mfe_progress_tab_is_active(self):
+        """
+        Compares the progress URL generated by CourseRunSerializer to the expected progress URL.
+
+        :return: True if the generated progress URL matches the expected, False otherwise.
+        """
+        input_data = self.create_test_enrollment()
+        input_context = self.create_test_context(input_data.course.id)
+        output_data = CourseRunSerializer(input_data, context=input_context).data
+        return output_data['progressUrl'] == course_progress_url(input_data.course.id)
+
+    @mock.patch('lms.djangoapps.learner_home.utils.course_home_mfe_progress_tab_is_active')
+    def test_progress_url(self, mock_course_home_mfe_progress_tab_is_active):
+        """
+        Tests the progress URL generated by the CourseRunSerializer. When course_home_mfe_progress_tab_is_active
+        is true, the generated progress URL must point to the progress page of the course home (learning) MFE.
+        Otherwise, it must point to the legacy progress page.
+        """
+        mock_course_home_mfe_progress_tab_is_active.return_value = True
+        self.assertTrue(self.is_progress_url_matching_course_home_mfe_progress_tab_is_active())
+
+        mock_course_home_mfe_progress_tab_is_active.return_value = False
+        self.assertTrue(self.is_progress_url_matching_course_home_mfe_progress_tab_is_active())
+
 
 @ddt.ddt
 class TestCoursewareAccessSerializer(LearnerDashboardBaseTest):
diff --git a/lms/djangoapps/learner_home/utils.py b/lms/djangoapps/learner_home/utils.py
index 28e4479f9439..96af6a64452b 100644
--- a/lms/djangoapps/learner_home/utils.py
+++ b/lms/djangoapps/learner_home/utils.py
@@ -4,6 +4,7 @@
 
 import logging
 
+from django.urls import reverse
 from django.contrib.auth import get_user_model
 from django.core.exceptions import MultipleObjectsReturned
 from rest_framework.exceptions import PermissionDenied, NotFound
@@ -11,6 +12,8 @@
 from common.djangoapps.student.models import (
     get_user_by_username_or_email,
 )
+from lms.djangoapps.course_home_api.toggles import course_home_mfe_progress_tab_is_active
+from openedx.features.course_experience.url_helpers import get_learning_mfe_home_url
 
 log = logging.getLogger(__name__)
 User = get_user_model()
@@ -54,3 +57,16 @@ def get_masquerade_user(request):
         )
         log.info(success_msg)
         return masquerade_user
+
+
+def course_progress_url(course_key) -> str:
+    """
+    Returns the course progress page's URL for the current user.
+
+    :param course_key: The course key for which the home url is being requested.
+
+    :return: The course progress page URL.
+    """
+    if course_home_mfe_progress_tab_is_active(course_key):
+        return get_learning_mfe_home_url(course_key, url_fragment='progress')
+    return reverse('progress', kwargs={'course_id': course_key})