Skip to content

Commit

Permalink
fix: handle edge case + add tests
Browse files Browse the repository at this point in the history
  • Loading branch information
hamzawaleed01 committed Feb 10, 2025
1 parent 6edc5fa commit 6993ab3
Show file tree
Hide file tree
Showing 2 changed files with 89 additions and 4 deletions.
75 changes: 74 additions & 1 deletion enterprise_access/apps/content_assignments/tests/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
Tests for Enterprise Access content_assignments utils.
"""

import uuid

import ddt
from django.test import TestCase

Expand All @@ -13,7 +15,12 @@
has_time_to_complete,
is_within_minimum_start_date_threshold
)
from enterprise_access.utils import _curr_date, _days_from_now, get_normalized_metadata_for_assignment
from enterprise_access.utils import (
_curr_date,
_days_from_now,
get_course_run_metadata_for_assignment,
get_normalized_metadata_for_assignment
)

mock_course_run_1 = {
'start_date': _days_from_now(-370, DATE_FORMAT_ISO_8601),
Expand All @@ -39,6 +46,9 @@
'content_price': 100,
}

assignment_uuid = uuid.uuid4()
advertised_course_run_uuid = uuid.uuid4()


@ddt.ddt
class UtilsTests(TestCase):
Expand Down Expand Up @@ -273,3 +283,66 @@ def test_get_normalized_metadata_for_assignment(self, assignment, expected_outpu
content_metadata=self.mock_content_metadata
)
self.assertEqual(normalized_metadata, expected_output)

@ddt.data(
# Test case for preferred course run that exists
{
'assignment': {
'preferred_course_run_key': 'course-v1:edX+DemoX+1T60',
'uuid': assignment_uuid
},
'content_metadata': {
'course_runs': [
{'key': 'course-v1:edX+DemoX+1T60', 'data': 'test1'},
{'key': 'course-v1:edX+DemoX+1T360', 'data': 'test2'}
],
'advertised_course_run_uuid': advertised_course_run_uuid,
'key': 'test-content-key'
},
'expected_output': {'key': 'course-v1:edX+DemoX+1T60', 'data': 'test1'}
},
# Test case for preferred course run that doesn't exist - should fall back to advertised run
{
'assignment': {
'preferred_course_run_key': 'non-existent-key',
'uuid': assignment_uuid
},
'content_metadata': {
'course_runs': [
{'key': 'course-v1:edX+DemoX+1T60', 'uuid': advertised_course_run_uuid, 'data': 'test1'},
{'key': 'course-v1:edX+DemoX+1T360', 'data': 'test2'}
],
'advertised_course_run_uuid': advertised_course_run_uuid,
'key': 'test-content-key'
},
'expected_output': {'key': 'course-v1:edX+DemoX+1T60', 'uuid': advertised_course_run_uuid, 'data': 'test1'}
},
# Test case for no preferred course run - should return advertised run
{
'assignment': {
'preferred_course_run_key': None,
'uuid': assignment_uuid
},
'content_metadata': {
'course_runs': [
{'key': 'course-v1:edX+DemoX+1T60', 'uuid': advertised_course_run_uuid, 'data': 'test1'},
{'key': 'course-v1:edX+DemoX+1T360', 'data': 'test2'}
],
'advertised_course_run_uuid': advertised_course_run_uuid,
'key': 'test-content-key'
},
'expected_output': {'key': 'course-v1:edX+DemoX+1T60', 'uuid': advertised_course_run_uuid, 'data': 'test1'}
}
)
@ddt.unpack
def test_get_course_run_metadata_for_assignment(self, assignment, content_metadata, expected_output):
"""
Test get_course_run_metadata_for_assignment returns the correct course run metadata
based on assignment and content metadata.
"""
assignment_obj = LearnerContentAssignmentFactory(**assignment)
course_run_metadata = get_course_run_metadata_for_assignment(
assignment=assignment_obj,
content_metadata=content_metadata
)
self.assertEqual(course_run_metadata, expected_output)
18 changes: 15 additions & 3 deletions enterprise_access/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -247,6 +247,12 @@ def _days_from_now(days_from_now=0, date_format=None):
return date.strftime(date_format)


def get_advertised_course_run_metadata(content_metadata):
course_runs = content_metadata.get('course_runs', [])
advertised_course_run_uuid = content_metadata.get('advertised_course_run_uuid')
return next((run for run in course_runs if run.get('uuid') == advertised_course_run_uuid), None)


def get_course_run_metadata_for_assignment(assignment, content_metadata):
"""
Retrieves metadata for a specific course run associated with an assignment. If the assignment has
Expand All @@ -258,9 +264,12 @@ def get_course_run_metadata_for_assignment(assignment, content_metadata):
content_metadata (dict): The content metadata object.
Returns:
dict: Course run metadata if available, otherwise normalized_metadata.
dict: Course run metadata if available, otherwise advertised_course_run.
"""
course_runs = content_metadata.get('course_runs', [])

# For run-based assignments, return metadata for the preferred course run if
# available. If not, fallback to advertised run.
if preferred_course_run_key := assignment.preferred_course_run_key:
course_run = next((run for run in course_runs if run.get('key') == preferred_course_run_key), None)
if not course_run:
Expand All @@ -270,6 +279,9 @@ def get_course_run_metadata_for_assignment(assignment, content_metadata):
content_metadata.get('key'),
assignment.uuid
)
# Fallback to advertised course run if preferred course run metadata is missing
return get_advertised_course_run_metadata(content_metadata)
return course_run
advertised_course_run_uuid = content_metadata.get('advertised_course_run_uuid')
return next((run for run in course_runs if run.get("uuid") == advertised_course_run_uuid), None)

# For course-based assignments, return metadata for the advertised course run
return get_advertised_course_run_metadata(content_metadata)

0 comments on commit 6993ab3

Please sign in to comment.