* Automatically create user partitions on course publish for each ICRV checkpoint. * Disable partitions for ICRV checkpoints that have been deleted. * Skip partitions that have been disabled when checking access. * Add verification access control UI to visibility settings. * Add verification access control UI to sequential and vertical settings. * Add partition scheme for verification partition groups. * Cache information used by verification partition scheme and invalidate the cache on update. * Add location parameter to UserPartition so the partition scheme can find the associated checkpoint. * Refactor GroupConfiguration to allow multiple user partitions. * Add special messaging to ICRV for students in the honor track. Authors: Zubair Arbi, Awais Qureshi, Aamir Khan, Will Daly
163 lines
6.1 KiB
Python
163 lines
6.1 KiB
Python
"""
|
|
Tests for the Studio authoring XBlock mixin.
|
|
"""
|
|
|
|
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
|
|
from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory
|
|
from xmodule.partitions.partitions import Group, UserPartition
|
|
|
|
|
|
class AuthoringMixinTestCase(ModuleStoreTestCase):
|
|
"""
|
|
Tests the studio authoring XBlock mixin.
|
|
"""
|
|
def setUp(self):
|
|
"""
|
|
Create a simple course with a video component.
|
|
"""
|
|
super(AuthoringMixinTestCase, self).setUp()
|
|
self.course = CourseFactory.create()
|
|
chapter = ItemFactory.create(
|
|
category='chapter',
|
|
parent_location=self.course.location,
|
|
display_name='Test Chapter'
|
|
)
|
|
sequential = ItemFactory.create(
|
|
category='sequential',
|
|
parent_location=chapter.location,
|
|
display_name='Test Sequential'
|
|
)
|
|
vertical = ItemFactory.create(
|
|
category='vertical',
|
|
parent_location=sequential.location,
|
|
display_name='Test Vertical'
|
|
)
|
|
video = ItemFactory.create(
|
|
category='video',
|
|
parent_location=vertical.location,
|
|
display_name='Test Vertical'
|
|
)
|
|
self.vertical_location = vertical.location
|
|
self.video_location = video.location
|
|
self.pet_groups = [Group(1, 'Cat Lovers'), Group(2, 'Dog Lovers')]
|
|
|
|
def create_content_groups(self, content_groups):
|
|
"""
|
|
Create a cohorted user partition with the specified content groups.
|
|
"""
|
|
# pylint: disable=attribute-defined-outside-init
|
|
self.content_partition = UserPartition(
|
|
1,
|
|
'Content Groups',
|
|
'Contains Groups for Cohorted Courseware',
|
|
content_groups,
|
|
scheme_id='cohort'
|
|
)
|
|
self.course.user_partitions = [self.content_partition]
|
|
self.store.update_item(self.course, self.user.id)
|
|
|
|
def create_verification_user_partitions(self, checkpoint_names):
|
|
"""
|
|
Create user partitions for verification checkpoints.
|
|
"""
|
|
scheme = UserPartition.get_scheme("verification")
|
|
self.course.user_partitions = [
|
|
UserPartition(
|
|
id=0,
|
|
name=checkpoint_name,
|
|
description="Verification checkpoint",
|
|
scheme=scheme,
|
|
groups=[
|
|
Group(scheme.ALLOW, "Completed verification at {}".format(checkpoint_name)),
|
|
Group(scheme.DENY, "Did not complete verification at {}".format(checkpoint_name)),
|
|
],
|
|
)
|
|
for checkpoint_name in checkpoint_names
|
|
]
|
|
self.store.update_item(self.course, self.user.id)
|
|
|
|
def set_staff_only(self, item_location):
|
|
"""Make an item visible to staff only."""
|
|
item = self.store.get_item(item_location)
|
|
item.visible_to_staff_only = True
|
|
self.store.update_item(item, self.user.id)
|
|
|
|
def set_group_access(self, item_location, group_ids):
|
|
"""
|
|
Set group_access for the specified item to the specified group
|
|
ids within the content partition.
|
|
"""
|
|
item = self.store.get_item(item_location)
|
|
item.group_access[self.content_partition.id] = group_ids
|
|
self.store.update_item(item, self.user.id)
|
|
|
|
def verify_visibility_view_contains(self, item_location, substrings):
|
|
"""
|
|
Verify that an item's visibility view returns an html string
|
|
containing all the expected substrings.
|
|
"""
|
|
item = self.store.get_item(item_location)
|
|
html = item.visibility_view().body_html()
|
|
for string in substrings:
|
|
self.assertIn(string, html)
|
|
|
|
def test_html_no_partition(self):
|
|
self.verify_visibility_view_contains(self.video_location, 'No content groups exist')
|
|
|
|
def test_html_empty_partition(self):
|
|
self.create_content_groups([])
|
|
self.verify_visibility_view_contains(self.video_location, 'No content groups exist')
|
|
|
|
def test_html_populated_partition(self):
|
|
self.create_content_groups(self.pet_groups)
|
|
self.verify_visibility_view_contains(self.video_location, ['Cat Lovers', 'Dog Lovers'])
|
|
|
|
def test_html_no_partition_staff_locked(self):
|
|
self.set_staff_only(self.vertical_location)
|
|
self.verify_visibility_view_contains(self.video_location, ['No content groups exist'])
|
|
|
|
def test_html_empty_partition_staff_locked(self):
|
|
self.create_content_groups([])
|
|
self.set_staff_only(self.vertical_location)
|
|
self.verify_visibility_view_contains(self.video_location, 'No content groups exist')
|
|
|
|
def test_html_populated_partition_staff_locked(self):
|
|
self.create_content_groups(self.pet_groups)
|
|
self.set_staff_only(self.vertical_location)
|
|
self.verify_visibility_view_contains(
|
|
self.video_location,
|
|
['The Unit this component is contained in is hidden from students.', 'Cat Lovers', 'Dog Lovers']
|
|
)
|
|
|
|
def test_html_false_content_group(self):
|
|
self.create_content_groups(self.pet_groups)
|
|
self.set_group_access(self.video_location, ['false_group_id'])
|
|
self.verify_visibility_view_contains(
|
|
self.video_location, ['Cat Lovers', 'Dog Lovers', 'Content group no longer exists.']
|
|
)
|
|
|
|
def test_html_false_content_group_staff_locked(self):
|
|
self.create_content_groups(self.pet_groups)
|
|
self.set_staff_only(self.vertical_location)
|
|
self.set_group_access(self.video_location, ['false_group_id'])
|
|
self.verify_visibility_view_contains(
|
|
self.video_location,
|
|
[
|
|
'Cat Lovers',
|
|
'Dog Lovers',
|
|
'The Unit this component is contained in is hidden from students.',
|
|
'Content group no longer exists.'
|
|
]
|
|
)
|
|
|
|
def test_html_verification_checkpoints(self):
|
|
self.create_verification_user_partitions(["Midterm A", "Midterm B"])
|
|
self.verify_visibility_view_contains(
|
|
self.video_location,
|
|
[
|
|
"Verification Checkpoint",
|
|
"Midterm A",
|
|
"Midterm B",
|
|
]
|
|
)
|