diff --git a/openedx/core/djangoapps/content_tagging/rest_api/v1/tests/test_objecttag_export_helpers.py b/openedx/core/djangoapps/content_tagging/rest_api/v1/tests/test_objecttag_export_helpers.py index b50eb0580b81..d52b48a3eaf7 100644 --- a/openedx/core/djangoapps/content_tagging/rest_api/v1/tests/test_objecttag_export_helpers.py +++ b/openedx/core/djangoapps/content_tagging/rest_api/v1/tests/test_objecttag_export_helpers.py @@ -3,19 +3,15 @@ """ from unittest.mock import patch -from openedx_tagging.core.tagging.models import Tag -from organizations.models import Organization - -from common.djangoapps.student.tests.factories import UserFactory from xmodule.modulestore.tests.django_utils import TEST_DATA_SPLIT_MODULESTORE, ModuleStoreTestCase from xmodule.modulestore.tests.factories import BlockFactory, CourseFactory from .... import api -from ....models import ContentObjectTag +from ....tests.test_api import TestGetAllObjectTagsMixin from ..objecttag_export_helpers import TaggedContent, build_object_tree_with_objecttags, iterate_with_level -class TaggedCourseMixin(ModuleStoreTestCase): +class TaggedCourseMixin(TestGetAllObjectTagsMixin, ModuleStoreTestCase): # type: ignore[misc] """ Mixin with a course structure and taxonomies """ @@ -23,33 +19,8 @@ class TaggedCourseMixin(ModuleStoreTestCase): def setUp(self): super().setUp() - # Create user - self.user = UserFactory.create() - - self.orgA = Organization.objects.create(name="Organization A", short_name="orgA") - self.taxonomy_1 = api.create_taxonomy(name="Taxonomy 1") - api.set_taxonomy_orgs(self.taxonomy_1, all_orgs=True) - Tag.objects.create( - taxonomy=self.taxonomy_1, - value="Tag 1.1", - ) - Tag.objects.create( - taxonomy=self.taxonomy_1, - value="Tag 1.2", - ) - - self.taxonomy_2 = api.create_taxonomy(name="Taxonomy 2") - api.set_taxonomy_orgs(self.taxonomy_2, all_orgs=True) - - Tag.objects.create( - taxonomy=self.taxonomy_2, - value="Tag 2.1", - ) - Tag.objects.create( - taxonomy=self.taxonomy_2, - value="Tag 2.2", - ) + # Patch modulestore self.patcher = patch("openedx.core.djangoapps.content_tagging.tasks.modulestore", return_value=self.store) self.addCleanup(self.patcher.stop) self.patcher.start() @@ -61,19 +32,13 @@ def setUp(self): run="test_run", display_name="Test Course", ) - course_tags = api.tag_content_object( - object_key=self.course.id, - taxonomy=self.taxonomy_1, - tags=['Tag 1.1'], - ) - self.expected_tagged_xblock = TaggedContent( display_name="Test Course", block_id="course-v1:orgA+test_course+test_run", category="course", children=[], object_tags={ - self.taxonomy_1.id: list(course_tags), + self.taxonomy_1.id: list(self.course_tags), }, ) @@ -84,24 +49,14 @@ def setUp(self): display_name="test sequential", ) # Tag blocks - sequential_tags1 = api.tag_content_object( - object_key=self.sequential.location, - taxonomy=self.taxonomy_1, - tags=['Tag 1.1', 'Tag 1.2'], - ) - sequential_tags2 = api.tag_content_object( - object_key=self.sequential.location, - taxonomy=self.taxonomy_2, - tags=['Tag 2.1'], - ) tagged_sequential = TaggedContent( display_name="test sequential", block_id="block-v1:orgA+test_course+test_run+type@sequential+block@test_sequential", category="sequential", children=[], object_tags={ - self.taxonomy_1.id: list(sequential_tags1), - self.taxonomy_2.id: list(sequential_tags2), + self.taxonomy_1.id: list(self.sequential_tags1), + self.taxonomy_2.id: list(self.sequential_tags2), }, ) @@ -144,21 +99,15 @@ def setUp(self): category="vertical", display_name="test vertical1", ) - vertical_tags = api.tag_content_object( - object_key=vertical.location, - taxonomy=self.taxonomy_2, - tags=['Tag 2.2'], - ) tagged_vertical = TaggedContent( display_name="test vertical1", block_id="block-v1:orgA+test_course+test_run+type@vertical+block@test_vertical1", category="vertical", children=[], object_tags={ - self.taxonomy_2.id: list(vertical_tags), + self.taxonomy_2.id: list(self.vertical1_tags), }, ) - assert tagged_sequential.children is not None # type guard tagged_sequential.children.append(tagged_vertical) @@ -182,39 +131,18 @@ def setUp(self): category="html", display_name="test html", ) - html_tags = api.tag_content_object( - object_key=html.location, - taxonomy=self.taxonomy_2, - tags=['Tag 2.1'], - ) tagged_text = TaggedContent( display_name="test html", block_id="block-v1:orgA+test_course+test_run+type@html+block@test_html", category="html", children=[], object_tags={ - self.taxonomy_2.id: list(html_tags), + self.taxonomy_2.id: list(self.html_tags), }, ) - assert untagged_vertical2.children is not None # type guard untagged_vertical2.children.append(tagged_text) - # Create "deleted" object tags, which will be omitted from the results. - for object_id in ( - self.course.id, - self.sequential.location, - vertical.location, - html.location, - ): - ContentObjectTag.objects.create( - object_id=str(object_id), - taxonomy=None, - tag=None, - _value="deleted tag", - _name="deleted taxonomy", - ) - self.all_object_tags, _ = api.get_all_object_tags(self.course.id) self.expected_tagged_content_list = [ (self.expected_tagged_xblock, 0), diff --git a/openedx/core/djangoapps/content_tagging/rest_api/v1/tests/test_views.py b/openedx/core/djangoapps/content_tagging/rest_api/v1/tests/test_views.py index 0c151070eac5..6346adcebe88 100644 --- a/openedx/core/djangoapps/content_tagging/rest_api/v1/tests/test_views.py +++ b/openedx/core/djangoapps/content_tagging/rest_api/v1/tests/test_views.py @@ -4,14 +4,13 @@ from __future__ import annotations +import abc import json from io import BytesIO -from urllib.parse import parse_qs, urlparse from unittest.mock import MagicMock +from urllib.parse import parse_qs, urlparse -import abc import ddt -from common.djangoapps.student.tests.factories import UserFactory from django.contrib.auth import get_user_model from django.core.files.uploadedfile import SimpleUploadedFile from opaque_keys.edx.locator import BlockUsageLocator, CourseLocator @@ -29,13 +28,10 @@ OrgContentCreatorRole, OrgInstructorRole, OrgLibraryUserRole, - OrgStaffRole, -) -from openedx.core.djangoapps.content_libraries.api import ( - AccessLevel, - create_library, - set_library_user_permissions, + OrgStaffRole ) +from common.djangoapps.student.tests.factories import UserFactory +from openedx.core.djangoapps.content_libraries.api import AccessLevel, create_library, set_library_user_permissions from openedx.core.djangoapps.content_tagging import api as tagging_api from openedx.core.djangoapps.content_tagging.models import TaxonomyOrg from openedx.core.djangolib.testing.utils import skip_unless_cms @@ -1637,6 +1633,7 @@ class TestContentObjectChildrenExportView(TaggedCourseMixin, APITestCase): # ty """ def setUp(self): super().setUp() + self.user = UserFactory.create() self.staff = UserFactory.create( username="staff", email="staff@example.com", diff --git a/openedx/core/djangoapps/content_tagging/tests/test_api.py b/openedx/core/djangoapps/content_tagging/tests/test_api.py index 143a225becad..76502163f2f4 100644 --- a/openedx/core/djangoapps/content_tagging/tests/test_api.py +++ b/openedx/core/djangoapps/content_tagging/tests/test_api.py @@ -6,6 +6,7 @@ from organizations.models import Organization from .. import api +from ..models import ContentObjectTag class TestTaxonomyMixin: @@ -250,13 +251,14 @@ def test_cannot_tag_across_orgs(self): ) -class TestGetAllObjectTags(TestCase): +class TestGetAllObjectTagsMixin: """ - Test the get_all_object_tags function + Set up data to test get_all_object_tags functions """ def setUp(self): super().setUp() + self.orgA = Organization.objects.create(name="Organization A", short_name="orgA") self.taxonomy_1 = api.create_taxonomy(name="Taxonomy 1") api.set_taxonomy_orgs(self.taxonomy_1, all_orgs=True) @@ -281,35 +283,35 @@ def setUp(self): value="Tag 2.2", ) - course_tags = api.tag_content_object( + self.course_tags = api.tag_content_object( object_key=CourseKey.from_string("course-v1:orgA+test_course+test_run"), taxonomy=self.taxonomy_1, tags=['Tag 1.1'], ) # Tag blocks - sequential_tags = api.tag_content_object( + self.sequential_tags1 = api.tag_content_object( object_key=UsageKey.from_string( "block-v1:orgA+test_course+test_run+type@sequential+block@test_sequential" ), taxonomy=self.taxonomy_1, tags=['Tag 1.1', 'Tag 1.2'], ) - sequential_tags2 = api.tag_content_object( + self.sequential_tags2 = api.tag_content_object( object_key=UsageKey.from_string( "block-v1:orgA+test_course+test_run+type@sequential+block@test_sequential" ), taxonomy=self.taxonomy_2, tags=['Tag 2.1'], ) - vertical1_tags = api.tag_content_object( + self.vertical1_tags = api.tag_content_object( object_key=UsageKey.from_string( "block-v1:orgA+test_course+test_run+type@vertical+block@test_vertical1" ), taxonomy=self.taxonomy_2, tags=['Tag 2.2'], ) - html_tags = api.tag_content_object( + self.html_tags = api.tag_content_object( object_key=UsageKey.from_string( "block-v1:orgA+test_course+test_run+type@html+block@test_html" ), @@ -317,22 +319,43 @@ def setUp(self): tags=['Tag 2.1'], ) + # Create "deleted" object tags, which will be omitted from the results. + for object_id in ( + "course-v1:orgA+test_course+test_run", + "block-v1:orgA+test_course+test_run+type@sequential+block@test_sequential", + "block-v1:orgA+test_course+test_run+type@vertical+block@test_vertical1", + "block-v1:orgA+test_course+test_run+type@html+block@test_html", + ): + ContentObjectTag.objects.create( + object_id=str(object_id), + taxonomy=None, + tag=None, + _value="deleted tag", + _name="deleted taxonomy", + ) + self.expected_objecttags = { "course-v1:orgA+test_course+test_run": { - self.taxonomy_1.id: list(course_tags), + self.taxonomy_1.id: list(self.course_tags), }, "block-v1:orgA+test_course+test_run+type@sequential+block@test_sequential": { - self.taxonomy_1.id: list(sequential_tags), - self.taxonomy_2.id: list(sequential_tags2), + self.taxonomy_1.id: list(self.sequential_tags1), + self.taxonomy_2.id: list(self.sequential_tags2), }, "block-v1:orgA+test_course+test_run+type@vertical+block@test_vertical1": { - self.taxonomy_2.id: list(vertical1_tags), + self.taxonomy_2.id: list(self.vertical1_tags), }, "block-v1:orgA+test_course+test_run+type@html+block@test_html": { - self.taxonomy_2.id: list(html_tags), + self.taxonomy_2.id: list(self.html_tags), }, } + +class TestGetAllObjectTags(TestGetAllObjectTagsMixin, TestCase): + """ + Test get_all_object_tags api function + """ + def test_get_all_object_tags(self): """ Test the get_all_object_tags function