refactor: deprecate ModuleSystem user attributes in favor of user service

The following ModuleSystem attributes are deprecated by this change, and should be pulled directly from the user service instead:

* anonymous_student_id
* seed
* user_id
* user_is_staff

Related changes:

* Removes the `user` and `anonymous_student_id` parameters from the ModuleService constructor.
* Stores anonymous_user_id in XBlockDjangoUserService's opt_attr
* Pulls out constants used by DjangoXBlockUserService opt_attr so they can be used in the platform code.
* LmsModuleSystem uses the user service created in wrapper function for runtime.publish to avoid requiring the user
  service to be "needed" by all XBlocks.
* LmsModuleSystem no longer checks for instances of XModuleDescriptor when deciding what kind of anonymous_user_id to
  provide:  all XModules are XBlocks, so this check is unnecessary.
* XBlockRuntime returns a user service when requested
* Adds tests for deprecated ModuleSystem attributes and changes to XBlockDjangoUserService.
This commit is contained in:
Jillian Vogel
2021-08-31 16:18:43 +09:30
parent 8f59d5e4a2
commit c41e7fb93a
9 changed files with 253 additions and 47 deletions

View File

@@ -2554,3 +2554,95 @@ class TestDisabledXBlockTypes(ModuleStoreTestCase):
item = self.store.get_item(item_id)
assert item.__class__.__name__ == descriptor
return item_id
@ddt.ddt
class LmsModuleSystemShimTest(SharedModuleStoreTestCase):
"""
Tests that the deprecated attributes in the LMS Module System (XBlock Runtime) return the expected values.
"""
@classmethod
def setUpClass(cls):
"""
Set up the course and descriptor used to instantiate the runtime.
"""
super().setUpClass()
cls.course = CourseFactory.create()
cls.descriptor = ItemFactory(category="vertical", parent=cls.course)
def setUp(self):
"""
Set up the user and other fields that will be used to instantiate the runtime.
"""
super().setUp()
self.user = UserFactory(id=232)
self.student_data = Mock()
self.track_function = Mock()
self.xqueue_callback_url_prefix = Mock()
self.request_token = Mock()
@ddt.data(
('seed', 232),
('user_id', 232),
('user_is_staff', False),
)
@ddt.unpack
def test_user_service_attributes(self, attribute, expected_value):
"""
Tests that the deprecated attributes provided by the user service match expected values.
"""
runtime, _ = render.get_module_system_for_user(
self.user,
self.student_data,
self.descriptor,
self.course.id,
self.track_function,
self.xqueue_callback_url_prefix,
self.request_token,
course=self.course,
)
assert getattr(runtime, attribute) == expected_value
@patch('lms.djangoapps.courseware.module_render.has_access', Mock(return_value=True, autospec=True))
def test_user_is_staff(self):
runtime, _ = render.get_module_system_for_user(
self.user,
self.student_data,
self.descriptor,
self.course.id,
self.track_function,
self.xqueue_callback_url_prefix,
self.request_token,
course=self.course,
)
assert runtime.user_is_staff
def test_anonymous_student_id(self):
runtime, _ = render.get_module_system_for_user(
self.user,
self.student_data,
self.descriptor,
self.course.id,
self.track_function,
self.xqueue_callback_url_prefix,
self.request_token,
course=self.course,
)
assert runtime.anonymous_student_id == anonymous_id_for_user(self.user, self.course.id)
def test_user_service_with_anonymous_user(self):
runtime, _ = render.get_module_system_for_user(
AnonymousUser(),
self.student_data,
self.descriptor,
self.course.id,
self.track_function,
self.xqueue_callback_url_prefix,
self.request_token,
course=self.course,
)
assert runtime.anonymous_student_id is None
assert runtime.seed == 0
assert runtime.user_id is None
assert not runtime.user_is_staff