diff --git a/enterprise_catalog/apps/api/v1/tests/test_views.py b/enterprise_catalog/apps/api/v1/tests/test_views.py index 5ff3d45f..7f6075cf 100644 --- a/enterprise_catalog/apps/api/v1/tests/test_views.py +++ b/enterprise_catalog/apps/api/v1/tests/test_views.py @@ -1530,6 +1530,43 @@ def test_get_content_metadata(self, learner_portal_enabled, mock_api_client): False, True ) + def test_excludes_unpublished_courses(self, learner_portal_enabled, mock_api_client): + #pylint: disable=unused-argument + """ + Verify that unpublished courses are never returned + in the content metadata API response. + """ + + unpublished_course = ContentMetadataFactory( + content_type=COURSE, + json_metadata={ + "status": "unpublished", + "course_runs": [], + }, + ) + + self.add_metadata_to_catalog( + self.enterprise_catalog, + [unpublished_course], + ) + + url = self._get_content_metadata_url(self.enterprise_catalog) + response = self.client.get(url) + + self.assertEqual(response.status_code, status.HTTP_200_OK) + + response_data = response.json() + + # Core assertions + self.assertEqual(response_data["count"], 0) + self.assertEqual(response_data["results"], []) + + @mock.patch('enterprise_catalog.apps.api_client.enterprise_cache.EnterpriseApiClient') + @ddt.data( + False, + True + ) + def test_get_content_metadata_non_active_courses(self, learner_portal_enabled, mock_api_client): """ Verify the get_content_metadata endpoint returns only active courses associated with a particular catalog diff --git a/enterprise_catalog/apps/api/v1/views/enterprise_catalog_get_content_metadata.py b/enterprise_catalog/apps/api/v1/views/enterprise_catalog_get_content_metadata.py index bbca33fd..90c43a72 100644 --- a/enterprise_catalog/apps/api/v1/views/enterprise_catalog_get_content_metadata.py +++ b/enterprise_catalog/apps/api/v1/views/enterprise_catalog_get_content_metadata.py @@ -240,12 +240,12 @@ def get_content_metadata(self, request, traverse_pagination, content_keys_filter queryset = self.filter_queryset(self.get_queryset(content_keys_filter=content_keys_filter)) logger.debug(f'[get_content_metadata]: Original queryset length: {len(queryset)}, {self.enterprise_catalog}') - # Only filter out archived courses if content_keys_filter is not provided, - # to ensure active content is always returned - if not content_keys_filter: - queryset = [item for item in queryset if self.is_active(item)] - filtered_queryset_length = len(queryset) - logger.debug(f'[get_content_metadata]: Filtered queryset length: {filtered_queryset_length}, ' + # Always filter out inactive courses, + # to ensure only active content is always returned via API + + queryset = [item for item in queryset if self.is_active(item)] + filtered_queryset_length = len(queryset) + logger.debug(f'[get_content_metadata]: Filtered queryset length: {filtered_queryset_length}, ' f'{self.enterprise_catalog}') context = self.get_serializer_context() context['enterprise_catalog'] = self.enterprise_catalog