From 893c025d0c8a3235381bc5da9c928c978e037b2d Mon Sep 17 00:00:00 2001 From: Syed Sajjad Hussain Shah <52817156+syedsajjadkazmii@users.noreply.github.com> Date: Wed, 5 Oct 2022 11:37:55 +0500 Subject: [PATCH] feat: add course recommendations api unit tests [VAN-1104] (#31069) --- .../api/v0/tests/test_views.py | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/lms/djangoapps/learner_dashboard/api/v0/tests/test_views.py b/lms/djangoapps/learner_dashboard/api/v0/tests/test_views.py index e8d3fc5f98..9f6fbcf288 100644 --- a/lms/djangoapps/learner_dashboard/api/v0/tests/test_views.py +++ b/lms/djangoapps/learner_dashboard/api/v0/tests/test_views.py @@ -230,3 +230,75 @@ class TestProgramsView(SharedModuleStoreTestCase, ProgramCacheMixin): response = self.client.get(self.url) self.assertEqual(response.status_code, 200) self.assertEqual(response.data, []) + + +class TestCourseRecommendationApiView(SharedModuleStoreTestCase): + """Unit tests for the course recommendations on dashboard page.""" + + password = 'test' + url = reverse_lazy('learner_dashboard:v0:courses') + + def setUp(self): + super().setUp() + self.user = UserFactory() + self.client.login(username=self.user.username, password=self.password) + self.recommended_courses = ['MITx+6.00.1x', 'IBM+PY0101EN', 'HarvardX+CS50P', 'UQx+IELTSx', 'HarvardX+CS50x', + 'Harvard+CS50z', 'BabsonX+EPS03x', 'TUMx+QPLS2x', 'NYUx+FCS.NET.1', 'MichinX+101x'] + self.course_data = { + 'course_key': 'MITx+6.00.1x', + 'title': 'Introduction to Computer Science and Programming Using Python', + 'owners': [{'logo_image_url': 'https://prod-discovery.edx-cdn.org/organization/logos/2a73d2ce-c34a-4e08' + '-822383bca9d2f01d-2cc8854c6fee.png'}], + 'marketing_url': 'https://www.edx.org/course/introduction-to-computer-science-and-programming-7' + } + + @mock.patch('lms.djangoapps.learner_dashboard.api.v0.views.get_personalized_course_recommendations', ) + @mock.patch('lms.djangoapps.learner_dashboard.api.v0.views.get_course_data') + def test_no_recommendations_from_amplitude(self, mocked_get_course_data, + mocked_get_personalized_course_recommendations): + """ + Verify API returns 400 if no course recommendations from amplitude. + """ + mocked_get_personalized_course_recommendations.return_value = [False, []] + mocked_get_course_data.return_value = self.course_data + + response = self.client.get(self.url) + self.assertEqual(response.status_code, 400) + self.assertEqual(response.data, None) + + @mock.patch('lms.djangoapps.learner_dashboard.api.v0.views.get_personalized_course_recommendations') + @mock.patch('lms.djangoapps.learner_dashboard.api.v0.views.get_course_data') + def test_get_course_recommendations(self, mocked_get_course_data, + mocked_get_personalized_course_recommendations): + """ + Verify API returns course recommendations. + """ + mocked_get_personalized_course_recommendations.return_value = [False, self.recommended_courses] + mocked_get_course_data.return_value = self.course_data + expected_recommendations = 5 + + response = self.client.get(self.url) + self.assertEqual(response.status_code, 200) + self.assertEqual(response.data.get('is_personalized_recommendation'), True) + self.assertEqual(len(response.data.get('courses')), expected_recommendations) + + @mock.patch('lms.djangoapps.learner_dashboard.api.v0.views.get_personalized_course_recommendations') + @mock.patch('lms.djangoapps.learner_dashboard.api.v0.views.get_course_data') + def test_get_enrollable_course_recommendations(self, mocked_get_course_data, + mocked_get_personalized_course_recommendations): + """ + Verify API returns course recommendations for courses in which user is not enrolled. + """ + mocked_get_personalized_course_recommendations.return_value = [False, self.recommended_courses] + mocked_get_course_data.return_value = self.course_data + course_keys = ['course-v1:IBM+PY0101EN+Run_0', 'course-v1:UQx+IELTSx+Run_0', 'course-v1:MITx+6.00.1x+Run_0', + 'course-v1:HarvardX+CS50P+Run_0', 'course-v1:Harvard+CS50z+Run_0', 'course-v1:TUMx+QPLS2x+Run_0'] + expected_recommendations = 4 + # enrolling in 6 courses + for course_key in course_keys: + CourseEnrollmentFactory(course_id=course_key, user=self.user) + + response = self.client.get(self.url) + self.assertEqual(response.status_code, 200) + self.assertEqual(response.data.get('is_personalized_recommendation'), True) + self.assertEqual(len(response.data.get('courses')), expected_recommendations)