diff --git a/cms/djangoapps/contentstore/views/preview.py b/cms/djangoapps/contentstore/views/preview.py index 8401935c3d8ddb08a3cc8812c771dca49dba5c69..64048645874539a14df92e652102ebf167ea11a3 100644 --- a/cms/djangoapps/contentstore/views/preview.py +++ b/cms/djangoapps/contentstore/views/preview.py @@ -95,6 +95,20 @@ class PreviewModuleSystem(ModuleSystem): # pylint: disable=abstract-method return local_resource_url(block, uri) +class StudioUserService(object): + """ + Provides a Studio implementation of the XBlock user service. + """ + + def __init__(self, request): + super(StudioUserService, self).__init__() + self._request = request + + @property + def user_id(self): + return self._request.user.id + + def _preview_module_system(request, descriptor): """ Returns a ModuleSystem for the specified descriptor that is specialized for @@ -117,6 +131,8 @@ def _preview_module_system(request, descriptor): _studio_wrap_xblock, ] + descriptor.runtime._services['user'] = StudioUserService(request) # pylint: disable=protected-access + return PreviewModuleSystem( static_url=settings.STATIC_URL, # TODO (cpennington): Do we want to track how instructors are using the preview problems? diff --git a/common/lib/xmodule/xmodule/split_test_module.py b/common/lib/xmodule/xmodule/split_test_module.py index 35154f7466a0ec7f6840df61c0c409c7b9c2cc78..40da66784002d9d3df6a09e9eafae5da45e7857c 100644 --- a/common/lib/xmodule/xmodule/split_test_module.py +++ b/common/lib/xmodule/xmodule/split_test_module.py @@ -343,6 +343,7 @@ class SplitTestModule(SplitTestFields, XModule, StudioEditableModule): @XBlock.needs('user_tags') # pylint: disable=abstract-method @XBlock.wants('partitions') +@XBlock.wants('user') class SplitTestDescriptor(SplitTestFields, SequenceDescriptor, StudioEditableDescriptor): # the editing interface can be the same as for sequences -- just a container module_class = SplitTestModule @@ -553,7 +554,8 @@ class SplitTestDescriptor(SplitTestFields, SequenceDescriptor, StudioEditableDes for group in user_partition.groups: str_group_id = unicode(group.id) if str_group_id not in self.group_id_to_child: - self._create_vertical_for_group(group, request.user.id) + user_id = self.runtime.service(self, 'user').user_id + self._create_vertical_for_group(group, user_id) changed = True if changed: diff --git a/common/test/acceptance/pages/xblock/acid.py b/common/test/acceptance/pages/xblock/acid.py index 9b9218ebe7a8d4ecda08c00c5b1765887e7fd517..3cb073ecc27c0bd45ae21cbd21392910f8ba7277 100644 --- a/common/test/acceptance/pages/xblock/acid.py +++ b/common/test/acceptance/pages/xblock/acid.py @@ -3,7 +3,8 @@ PageObjects related to the AcidBlock """ from bok_choy.page_object import PageObject -from bok_choy.promise import EmptyPromise, BrokenPromise, Promise +from bok_choy.promise import Promise +from .utils import wait_for_xblock_initialization class AcidView(PageObject): """ @@ -25,16 +26,11 @@ class AcidView(PageObject): def is_browser_on_page(self): - def _is_finished_loading(): - # Wait for the xblock javascript to finish initializing - is_done = self.browser.execute_script("return $({!r}).data('initialized')".format(self.context_selector)) - return (is_done, is_done) - # First make sure that an element with the view-container class is present on the page, # and then wait to make sure that the xblock has finished initializing. return ( self.q(css='{} .acid-block'.format(self.context_selector)).present and - Promise(_is_finished_loading, 'Finished initializing the xblock.').fulfill() + wait_for_xblock_initialization(self, self.context_selector) ) def test_passed(self, test_selector): diff --git a/common/test/acceptance/pages/xblock/utils.py b/common/test/acceptance/pages/xblock/utils.py new file mode 100644 index 0000000000000000000000000000000000000000..534dabc5f07e4180f1e0a4681b0c8e6c61316beb --- /dev/null +++ b/common/test/acceptance/pages/xblock/utils.py @@ -0,0 +1,17 @@ +""" +Utility methods useful for XBlock page tests. +""" +from bok_choy.promise import Promise +from selenium.webdriver.common.action_chains import ActionChains + + +def wait_for_xblock_initialization(page, xblock_css): + """ + Wait for the xblock with the given CSS to finish initializing. + """ + def _is_finished_loading(): + # Wait for the xblock javascript to finish initializing + is_done = page.browser.execute_script("return $({!r}).data('initialized')".format(xblock_css)) + return (is_done, is_done) + + return Promise(_is_finished_loading, 'Finished initializing the xblock.').fulfill() diff --git a/common/test/acceptance/tests/test_studio_split_test.py b/common/test/acceptance/tests/test_studio_split_test.py index 1edea80928fbc2c65738836e597db78ab14eecbf..93a6015b9e0f625d3afb176a97d13970c31b1e02 100644 --- a/common/test/acceptance/tests/test_studio_split_test.py +++ b/common/test/acceptance/tests/test_studio_split_test.py @@ -6,19 +6,20 @@ import json import os from unittest import skip, skipUnless -from ..fixtures.course import CourseFixture, XBlockFixtureDesc +from xmodule.partitions.partitions import Group, UserPartition +from bok_choy.promise import Promise +from ..fixtures.course import CourseFixture, XBlockFixtureDesc from ..pages.studio.component_editor import ComponentEditorView from ..pages.studio.settings_advanced import AdvancedSettingsPage from ..pages.studio.settings_group_configurations import GroupConfigurationsPage from ..pages.studio.auto_auth import AutoAuthPage -from test_studio_container import ContainerBase from ..pages.studio.utils import add_advanced_component -from xmodule.partitions.partitions import Group, UserPartition -from bok_choy.promise import Promise - +from ..pages.xblock.utils import wait_for_xblock_initialization from .helpers import UniqueCourseTest +from test_studio_container import ContainerBase + class SplitTest(ContainerBase): """ @@ -147,6 +148,11 @@ class SplitTest(ContainerBase): The case of a split test with invalid configuration (missing group). """ container = self.create_poorly_configured_split_instance() + + # Wait for the xblock to be fully initialized so that the add button is rendered + wait_for_xblock_initialization(self, '.xblock[data-block-type="split_test"]') + + # Click the add button and verify that the groups were added on the page container.add_missing_groups() self.verify_groups(container, ['alpha', 'gamma'], ['beta'])