From abfd50a9846349b2bf9228ab38fb7734578de942 Mon Sep 17 00:00:00 2001 From: Nathan Sprenkle Date: Wed, 22 Jun 2022 13:38:30 -0400 Subject: [PATCH] feat: Learner Dashboard top level serializer (#30631) * feat: add top-level serializer classes List serializer classes stubbed, to be filled out later. * test: add basic test for high-level serializer. Includes 2 examples of how to patch sub-serializers. Co-authored-by: nsprenkle --- .../learner_dashboard/serializers.py | 35 ++++++ .../learner_dashboard/test_serializers.py | 108 ++++++++++++++++++ 2 files changed, 143 insertions(+) create mode 100644 lms/djangoapps/learner_dashboard/serializers.py create mode 100644 lms/djangoapps/learner_dashboard/test_serializers.py diff --git a/lms/djangoapps/learner_dashboard/serializers.py b/lms/djangoapps/learner_dashboard/serializers.py new file mode 100644 index 0000000000..a1d3df7c06 --- /dev/null +++ b/lms/djangoapps/learner_dashboard/serializers.py @@ -0,0 +1,35 @@ +""" +Serializers for the Learner Dashboard +""" + +from rest_framework import serializers + + +class PlatformSettingsSerializer(serializers.Serializer): + """Serializer for edX platform-level info, emails, and URLs""" + + feedbackEmail = serializers.EmailField() + supportEmail = serializers.EmailField() + billingEmail = serializers.EmailField() + courseSearchUrl = serializers.URLField() + + +class EnrollmentSerializer(serializers.Serializer): + """Serializer for an enrollment""" + + +class EntitlementSerializer(serializers.Serializer): + """Serializer for an unfulfilled entitlement""" + + +class SuggestedCourseSerializer(serializers.Serializer): + """Serializer for a suggested course""" + + +class LearnerDashboardSerializer(serializers.Serializer): + """Serializer for all info required to render the Learner Dashboard""" + + edx = PlatformSettingsSerializer() + enrollments = serializers.ListField(child=EnrollmentSerializer(), allow_empty=True) + unfulfilledEntitlements = serializers.ListField(child=EntitlementSerializer(), allow_empty=True) + suggestedCourses = serializers.ListField(child=SuggestedCourseSerializer(), allow_empty=True) diff --git a/lms/djangoapps/learner_dashboard/test_serializers.py b/lms/djangoapps/learner_dashboard/test_serializers.py new file mode 100644 index 0000000000..91961aac4f --- /dev/null +++ b/lms/djangoapps/learner_dashboard/test_serializers.py @@ -0,0 +1,108 @@ +"""Tests for serializers for the Learner Dashboard""" + +from unittest import TestCase +from unittest import mock +from uuid import uuid4 + +from lms.djangoapps.learner_dashboard.serializers import ( + PlatformSettingsSerializer, + LearnerDashboardSerializer, +) + + +class TestPlatformSettingsSerializer(TestCase): + """Tests for the PlatformSettingsSerializer""" + + def test_happy_path(self): + input_data = { + "feedbackEmail": f"{uuid4()}@example.com", + "supportEmail": f"{uuid4()}@example.com", + "billingEmail": f"{uuid4()}@example.com", + "courseSearchUrl": f"{uuid4()}.example.com/search", + } + output_data = PlatformSettingsSerializer(input_data).data + + assert output_data == { + "feedbackEmail": input_data["feedbackEmail"], + "supportEmail": input_data["supportEmail"], + "billingEmail": input_data["billingEmail"], + "courseSearchUrl": input_data["courseSearchUrl"], + } + + +class TestLearnerDashboardSerializer(TestCase): + """High-level tests for Learner Dashboard serialization""" + + # Show full diff for serialization issues + maxDiff = None + + def test_empty(self): + """Test that empty inputs return the right keys""" + + input_data = { + "edx": None, + "enrollments": [], + "unfulfilledEntitlements": [], + "suggestedCourses": [], + } + output_data = LearnerDashboardSerializer(input_data).data + + self.assertDictEqual( + output_data, + { + "edx": None, + "enrollments": [], + "unfulfilledEntitlements": [], + "suggestedCourses": [], + }, + ) + + def test_linkage(self): + """Test that serializers link to their appropriate outputs""" + input_data = { + "edx": {}, + "enrollments": [], + "unfulfilledEntitlements": [], + "suggestedCourses": [], + } + serializer = LearnerDashboardSerializer(input_data) + with mock.patch( + "lms.djangoapps.learner_dashboard.serializers.PlatformSettingsSerializer.to_representation" + ) as mock_platform_settings_serializer: + mock_platform_settings_serializer.return_value = mock_platform_settings_serializer + output_data = serializer.data + + self.assertDictEqual( + output_data, + { + "edx": mock_platform_settings_serializer, + "enrollments": [], + "unfulfilledEntitlements": [], + "suggestedCourses": [], + }, + ) + + @mock.patch( + "lms.djangoapps.learner_dashboard.serializers.PlatformSettingsSerializer.to_representation" + ) + def test_linkage2(self, mock_platform_settings_serializer): + """Second example of paradigm using test-level patching""" + mock_platform_settings_serializer.return_value = mock_platform_settings_serializer + + input_data = { + "edx": {}, + "enrollments": [], + "unfulfilledEntitlements": [], + "suggestedCourses": [], + } + output_data = LearnerDashboardSerializer(input_data).data + + self.assertDictEqual( + output_data, + { + "edx": mock_platform_settings_serializer, + "enrollments": [], + "unfulfilledEntitlements": [], + "suggestedCourses": [], + }, + )