Skip to content

Commit a85da46

Browse files
committed
test: add unit tests for get_extended_profile function
1 parent 3486f48 commit a85da46

1 file changed

Lines changed: 148 additions & 2 deletions

File tree

openedx/core/djangoapps/user_api/accounts/tests/test_serializers.py

Lines changed: 148 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,17 @@
22
Test cases to cover Accounts-related serializers of the User API application
33
"""
44

5-
65
import logging
6+
from unittest.mock import Mock, patch
77

88
from django.test import TestCase
99
from django.test.client import RequestFactory
10+
from django.test.utils import override_settings
1011
from testfixtures import LogCapture
1112

12-
from openedx.core.djangoapps.user_api.accounts.serializers import UserReadOnlySerializer
1313
from common.djangoapps.student.models import UserProfile
1414
from common.djangoapps.student.tests.factories import UserFactory
15+
from openedx.core.djangoapps.user_api.accounts.serializers import UserReadOnlySerializer, get_extended_profile
1516

1617
LOGGER_NAME = "openedx.core.djangoapps.user_api.accounts.serializers"
1718

@@ -52,3 +53,148 @@ def test_user_no_profile(self):
5253

5354
assert data['username'] == self.user.username
5455
assert data['name'] is None
56+
57+
58+
class GetExtendedProfileTest(TestCase):
59+
"""
60+
Tests for get_extended_profile function
61+
"""
62+
63+
def setUp(self):
64+
super().setUp()
65+
self.user = UserFactory.create()
66+
self.user_profile = UserProfile.objects.get(user=self.user)
67+
68+
@patch("openedx.core.djangoapps.user_api.accounts.serializers.configuration_helpers")
69+
@patch("openedx.core.djangoapps.user_api.accounts.serializers.get_extended_profile_model")
70+
def test_get_extended_profile_from_model(self, mock_get_model: Mock, mock_config_helpers: Mock):
71+
"""
72+
Test getting extended profile from a custom model
73+
"""
74+
mock_config_helpers.get_value.return_value = ["department", "title", "company"]
75+
mock_model = Mock()
76+
mock_instance = Mock()
77+
mock_instance.department = "Engineering"
78+
mock_instance.title = "Software Engineer"
79+
mock_instance.company = "EdX"
80+
mock_instance.user = self.user
81+
mock_model.objects.get.return_value = mock_instance
82+
mock_get_model.return_value = mock_model
83+
84+
with patch("openedx.core.djangoapps.user_api.accounts.serializers.model_to_dict") as mock_model_to_dict:
85+
mock_model_to_dict.return_value = {
86+
"department": "Engineering",
87+
"title": "Software Engineer",
88+
"company": "EdX",
89+
"user": self.user.id,
90+
}
91+
92+
result = get_extended_profile(self.user_profile)
93+
94+
self.assertEqual(len(result), 3)
95+
self.assertIn({"field_name": "department", "field_value": "Engineering"}, result)
96+
self.assertIn({"field_name": "title", "field_value": "Software Engineer"}, result)
97+
self.assertIn({"field_name": "company", "field_value": "EdX"}, result)
98+
99+
@override_settings(REGISTRATION_EXTENSION_FORM=None)
100+
@patch("openedx.core.djangoapps.user_api.accounts.serializers.configuration_helpers")
101+
def test_get_extended_profile_model_does_not_exist(self, mock_config_helpers: Mock):
102+
"""
103+
Test fallback to meta field when model instance doesn't exist
104+
"""
105+
mock_config_helpers.get_value.return_value = ["department", "title"]
106+
self.user_profile.set_meta({"department": "Sales", "title": "Manager"})
107+
self.user_profile.save()
108+
109+
result = get_extended_profile(self.user_profile)
110+
111+
self.assertEqual(len(result), 2)
112+
self.assertIn({"field_name": "department", "field_value": "Sales"}, result)
113+
self.assertIn({"field_name": "title", "field_value": "Manager"}, result)
114+
115+
@patch("openedx.core.djangoapps.user_api.accounts.serializers.configuration_helpers")
116+
@patch("openedx.core.djangoapps.user_api.accounts.serializers.get_extended_profile_model")
117+
def test_get_extended_profile_no_model_configured(self, mock_get_model: Mock, mock_config_helpers: Mock):
118+
"""
119+
Test fallback to meta field when no model is configured
120+
"""
121+
mock_config_helpers.get_value.return_value = ["department", "title"]
122+
mock_get_model.return_value = None
123+
meta_data = {"department": "Marketing", "title": "Director"}
124+
self.user_profile.set_meta(meta_data)
125+
self.user_profile.save()
126+
127+
result = get_extended_profile(self.user_profile)
128+
129+
self.assertEqual(len(result), 2)
130+
self.assertIn({"field_name": "department", "field_value": "Marketing"}, result)
131+
self.assertIn({"field_name": "title", "field_value": "Director"}, result)
132+
133+
@patch("openedx.core.djangoapps.user_api.accounts.serializers.configuration_helpers")
134+
@patch("openedx.core.djangoapps.user_api.accounts.serializers.get_extended_profile_model")
135+
def test_get_extended_profile_empty_meta(self, mock_get_model: Mock, mock_config_helpers: Mock):
136+
"""
137+
Test getting extended profile with empty meta field
138+
"""
139+
mock_config_helpers.get_value.return_value = ["department", "title"]
140+
mock_get_model.return_value = None
141+
self.user_profile.meta = ""
142+
self.user_profile.save()
143+
144+
result = get_extended_profile(self.user_profile)
145+
146+
self.assertEqual(len(result), 2)
147+
self.assertIn({"field_name": "department", "field_value": ""}, result)
148+
self.assertIn({"field_name": "title", "field_value": ""}, result)
149+
150+
@patch("openedx.core.djangoapps.user_api.accounts.serializers.configuration_helpers")
151+
@patch("openedx.core.djangoapps.user_api.accounts.serializers.get_extended_profile_model")
152+
def test_get_extended_profile_invalid_json_in_meta(self, mock_get_model: Mock, mock_config_helpers: Mock):
153+
"""
154+
Test getting extended profile with invalid JSON in meta field
155+
"""
156+
mock_config_helpers.get_value.return_value = ["department", "title"]
157+
mock_get_model.return_value = None
158+
self.user_profile.meta = "invalid json {"
159+
self.user_profile.save()
160+
161+
result = get_extended_profile(self.user_profile)
162+
163+
self.assertEqual(len(result), 2)
164+
self.assertIn({"field_name": "department", "field_value": ""}, result)
165+
self.assertIn({"field_name": "title", "field_value": ""}, result)
166+
167+
@patch("openedx.core.djangoapps.user_api.accounts.serializers.configuration_helpers")
168+
@patch("openedx.core.djangoapps.user_api.accounts.serializers.get_extended_profile_model")
169+
def test_get_extended_profile_missing_fields(self, mock_get_model: Mock, mock_config_helpers: Mock):
170+
"""
171+
Test getting extended profile when some configured fields are missing
172+
"""
173+
mock_config_helpers.get_value.return_value = ["department", "title", "location"]
174+
mock_get_model.return_value = None
175+
meta_data = {"department": "HR", "title": "Recruiter"}
176+
self.user_profile.set_meta(meta_data)
177+
self.user_profile.save()
178+
179+
result = get_extended_profile(self.user_profile)
180+
181+
self.assertEqual(len(result), 3)
182+
self.assertIn({"field_name": "department", "field_value": "HR"}, result)
183+
self.assertIn({"field_name": "title", "field_value": "Recruiter"}, result)
184+
self.assertIn({"field_name": "location", "field_value": ""}, result)
185+
186+
@patch("openedx.core.djangoapps.user_api.accounts.serializers.configuration_helpers")
187+
@patch("openedx.core.djangoapps.user_api.accounts.serializers.get_extended_profile_model")
188+
def test_get_extended_profile_no_configured_fields(self, mock_get_model: Mock, mock_config_helpers: Mock):
189+
"""
190+
Test getting extended profile when no fields are configured
191+
"""
192+
mock_config_helpers.get_value.return_value = []
193+
mock_get_model.return_value = None
194+
meta_data = {"department": "Finance", "title": "Analyst"}
195+
self.user_profile.set_meta(meta_data)
196+
self.user_profile.save()
197+
198+
result = get_extended_profile(self.user_profile)
199+
200+
self.assertEqual(len(result), 0)

0 commit comments

Comments
 (0)