Files
edx-platform/xmodule/tests/test_library_sourced_block.py
2022-06-20 18:20:06 +05:00

73 lines
3.5 KiB
Python

"""
Tests for Source from Library XBlock
"""
from openedx.core.djangoapps.content_libraries.tests.base import ContentLibrariesRestApiTest
from common.djangoapps.student.roles import CourseInstructorRole
from xmodule.modulestore.django import modulestore
from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory
from xmodule.tests import get_test_system
from xmodule.x_module import STUDENT_VIEW # lint-amnesty, pylint: disable=unused-import
class LibrarySourcedBlockTestCase(ContentLibrariesRestApiTest):
"""
Tests for LibraryToolsService which interact with blockstore-based content libraries
"""
def setUp(self):
super().setUp()
self.store = modulestore()
# Create a modulestore course
course = CourseFactory.create(modulestore=self.store, user_id=self.user.id)
CourseInstructorRole(course.id).add_users(self.user)
# Add a "Source from Library" block to the course
self.source_block = ItemFactory.create(
category="library_sourced",
parent=course,
parent_location=course.location,
user_id=self.user.id,
modulestore=self.store
)
self.submit_url = f'/xblock/{self.source_block.scope_ids.usage_id}/handler/submit_studio_edits'
def test_block_views(self):
# Create a blockstore content library
library = self._create_library(slug="testlib1_preview", title="Test Library 1", description="Testing XBlocks")
# Add content to the library
html_block_1 = self._add_block_to_library(library["id"], "html", "html_student_preview_1")["id"]
self._set_library_block_olx(html_block_1, '<html>Student Preview Test 1</html>')
html_block_2 = self._add_block_to_library(library["id"], "html", "html_student_preview_2")["id"]
self._set_library_block_olx(html_block_2, '<html>Student Preview Test 2</html>')
# Import the html blocks from the library to the course
post_data = {"values": {"source_block_ids": [html_block_1, html_block_2]}, "defaults": ["display_name"]}
res = self.client.post(self.submit_url, data=post_data, format='json')
# Check if student_view renders the children correctly
res = self.get_block_view(self.source_block, STUDENT_VIEW)
assert 'Student Preview Test 1' in res
assert 'Student Preview Test 2' in res
def test_block_limits(self):
# Create a blockstore content library
library = self._create_library(slug="testlib2_preview", title="Test Library 2", description="Testing XBlocks")
# Add content to the library
blocks = [self._add_block_to_library(library["id"], "html", f"block_{i}")["id"] for i in range(11)]
# Import the html blocks from the library to the course
post_data = {"values": {"source_block_ids": blocks}, "defaults": ["display_name"]}
res = self.client.post(self.submit_url, data=post_data, format='json')
assert res.status_code == 400
assert res.json()['error']['messages'][0]['text'] == 'A maximum of 10 components may be added.'
def get_block_view(self, block, view, context=None):
"""
Renders the specified view for a given XBlock
"""
context = context or {}
block = self.store.get_item(block.location)
module_system = get_test_system(block)
module_system.descriptor_runtime = block._runtime # pylint: disable=protected-access
block.bind_for_student(module_system, self.user.id)
return module_system.render(block, view, context).content