BLD-1110: Create, edit, delete groups.
This commit is contained in:
@@ -18,11 +18,51 @@ from ..pages.studio.auto_auth import AutoAuthPage
|
||||
from ..pages.studio.utils import add_advanced_component
|
||||
from ..pages.xblock.utils import wait_for_xblock_initialization
|
||||
from .helpers import UniqueCourseTest
|
||||
|
||||
from test_studio_container import ContainerBase
|
||||
|
||||
|
||||
class SplitTest(ContainerBase):
|
||||
class SplitTestMixin(object):
|
||||
"""
|
||||
Mixin that contains useful methods for split_test module testing.
|
||||
"""
|
||||
def verify_groups(self, container, active_groups, inactive_groups, verify_missing_groups_not_present=True):
|
||||
"""
|
||||
Check that the groups appear and are correctly categorized as to active and inactive.
|
||||
|
||||
Also checks that the "add missing groups" button/link is not present unless a value of False is passed
|
||||
for verify_missing_groups_not_present.
|
||||
"""
|
||||
def wait_for_xblocks_to_render():
|
||||
# First xblock is the container for the page, subtract 1.
|
||||
return (len(active_groups) + len(inactive_groups) == len(container.xblocks) - 1, len(active_groups))
|
||||
|
||||
Promise(wait_for_xblocks_to_render, "Number of xblocks on the page are incorrect").fulfill()
|
||||
|
||||
def check_xblock_names(expected_groups, actual_blocks):
|
||||
self.assertEqual(len(expected_groups), len(actual_blocks))
|
||||
for idx, expected in enumerate(expected_groups):
|
||||
self.assertEqual('Expand or Collapse\n{}'.format(expected), actual_blocks[idx].name)
|
||||
|
||||
check_xblock_names(active_groups, container.active_xblocks)
|
||||
check_xblock_names(inactive_groups, container.inactive_xblocks)
|
||||
|
||||
# Verify inactive xblocks appear after active xblocks
|
||||
check_xblock_names(active_groups + inactive_groups, container.xblocks[1:])
|
||||
if verify_missing_groups_not_present:
|
||||
self.verify_add_missing_groups_button_not_present(container)
|
||||
|
||||
def verify_add_missing_groups_button_not_present(self, container):
|
||||
"""
|
||||
Checks that the "add missing gorups" button/link is not present.
|
||||
"""
|
||||
def missing_groups_button_not_present():
|
||||
button_present = container.missing_groups_button_present()
|
||||
return (not button_present, not button_present)
|
||||
|
||||
Promise(missing_groups_button_not_present, "Add missing groups button should not be showing.").fulfill()
|
||||
|
||||
|
||||
class SplitTest(ContainerBase, SplitTestMixin):
|
||||
"""
|
||||
Tests for creating and editing split test instances in Studio.
|
||||
"""
|
||||
@@ -58,21 +98,6 @@ class SplitTest(ContainerBase):
|
||||
|
||||
self.user = course_fix.user
|
||||
|
||||
def verify_groups(self, container, active_groups, inactive_groups, verify_missing_groups_not_present=True):
|
||||
super(SplitTest, self).verify_groups(container, active_groups, inactive_groups)
|
||||
if verify_missing_groups_not_present:
|
||||
self.verify_add_missing_groups_button_not_present(container)
|
||||
|
||||
def verify_add_missing_groups_button_not_present(self, container):
|
||||
"""
|
||||
Checks that the "add missing gorups" button/link is not present.
|
||||
"""
|
||||
def missing_groups_button_not_present():
|
||||
button_present = container.missing_groups_button_present()
|
||||
return (not button_present, not button_present)
|
||||
|
||||
Promise(missing_groups_button_not_present, "Add missing groups button should not be showing.").fulfill()
|
||||
|
||||
def create_poorly_configured_split_instance(self):
|
||||
"""
|
||||
Creates a split test instance with a missing group and an inactive group.
|
||||
@@ -210,7 +235,7 @@ class SettingsMenuTest(UniqueCourseTest):
|
||||
|
||||
|
||||
@skipUnless(os.environ.get('FEATURE_GROUP_CONFIGURATIONS'), 'Tests Group Configurations feature')
|
||||
class GroupConfigurationsTest(ContainerBase):
|
||||
class GroupConfigurationsTest(ContainerBase, SplitTestMixin):
|
||||
"""
|
||||
Tests that Group Configurations page works correctly with previously
|
||||
added configurations in Studio
|
||||
@@ -266,9 +291,10 @@ class GroupConfigurationsTest(ContainerBase):
|
||||
|
||||
if groups:
|
||||
allocation = int(math.floor(100 / len(groups)))
|
||||
for index, group in enumerate(groups):
|
||||
self.assertEqual(group, config.groups[index].name)
|
||||
self.assertEqual(str(allocation) + "%", config.groups[index].allocation)
|
||||
self.assertEqual(groups, [group.name for group in config.groups])
|
||||
for group in config.groups:
|
||||
self.assertEqual(str(allocation) + "%", group.allocation)
|
||||
|
||||
# Collapse the configuration
|
||||
config.toggle()
|
||||
|
||||
@@ -336,11 +362,11 @@ class GroupConfigurationsTest(ContainerBase):
|
||||
Scenario: Ensure that the group configuration can be created and edited correctly.
|
||||
Given I have a course without group configurations
|
||||
When I click button 'Create new Group Configuration'
|
||||
And I set new name and description
|
||||
And I set new name and description, change name for the 2nd default group, add one new group
|
||||
And I click button 'Create'
|
||||
Then I see the new group configuration is added
|
||||
Then I see the new group configuration is added and has correct data
|
||||
When I edit the group group_configuration
|
||||
And I change the name and description
|
||||
And I change the name and description, add new group, remove old one and change name for the Group A
|
||||
And I click button 'Save'
|
||||
Then I see the group configuration is saved successfully and has the new data
|
||||
"""
|
||||
@@ -351,15 +377,19 @@ class GroupConfigurationsTest(ContainerBase):
|
||||
config = self.page.group_configurations()[0]
|
||||
config.name = "New Group Configuration Name"
|
||||
config.description = "New Description of the group configuration."
|
||||
self.assertEqual(config.get_text('.action-primary'), "CREATE")
|
||||
config.groups[1].name = "New Group Name"
|
||||
# Add new group
|
||||
config.add_group() # Group C
|
||||
|
||||
# Save the configuration
|
||||
self.assertEqual(config.get_text('.action-primary'), "CREATE")
|
||||
config.save()
|
||||
|
||||
self._assert_fields(
|
||||
config,
|
||||
name="New Group Configuration Name",
|
||||
description="New Description of the group configuration.",
|
||||
groups=["Group A", "Group B"]
|
||||
groups=["Group A", "New Group Name", "Group C"]
|
||||
)
|
||||
|
||||
# Edit the group configuration
|
||||
@@ -369,13 +399,20 @@ class GroupConfigurationsTest(ContainerBase):
|
||||
config.name = "Second Group Configuration Name"
|
||||
config.description = "Second Description of the group configuration."
|
||||
self.assertEqual(config.get_text('.action-primary'), "SAVE")
|
||||
# Add new group
|
||||
config.add_group() # Group D
|
||||
# Remove group with name "New Group Name"
|
||||
config.groups[1].remove()
|
||||
# Rename Group A
|
||||
config.groups[0].name = "First Group"
|
||||
# Save the configuration
|
||||
config.save()
|
||||
|
||||
self._assert_fields(
|
||||
config,
|
||||
name="Second Group Configuration Name",
|
||||
description="Second Description of the group configuration."
|
||||
description="Second Description of the group configuration.",
|
||||
groups=["First Group", "Group C", "Group D"]
|
||||
)
|
||||
|
||||
def test_use_group_configuration(self):
|
||||
@@ -383,23 +420,30 @@ class GroupConfigurationsTest(ContainerBase):
|
||||
Scenario: Ensure that the group configuration can be used by split_module correctly
|
||||
Given I have a course without group configurations
|
||||
When I create new group configuration
|
||||
And I set new name, save the group configuration
|
||||
And I set new name and add a new group, save the group configuration
|
||||
And I go to the unit page in Studio
|
||||
And I add new advanced module "Content Experiment"
|
||||
When I assign created group configuration to the module
|
||||
Then I see the module has correct groups
|
||||
And I go to the Group Configuration page in Studio
|
||||
And I edit the name of the group configuration
|
||||
And I edit the name of the group configuration, add new group and remove old one
|
||||
And I go to the unit page in Studio
|
||||
And I edit the unit
|
||||
Then I see the group configuration name is changed in `Group Configuration` dropdown
|
||||
And the group configuration name is changed on container page
|
||||
And I see the module has 2 active groups and one inactive
|
||||
And I see "Add missing groups" link exists
|
||||
When I click on "Add missing groups" link
|
||||
The I see the module has 3 active groups and one inactive
|
||||
"""
|
||||
self.page.visit()
|
||||
# Create new group configuration
|
||||
self.page.create()
|
||||
config = self.page.group_configurations()[0]
|
||||
config.name = "New Group Configuration Name"
|
||||
# Add new group
|
||||
config.add_group()
|
||||
config.groups[2].name = "New group"
|
||||
# Save the configuration
|
||||
config.save()
|
||||
|
||||
@@ -409,12 +453,16 @@ class GroupConfigurationsTest(ContainerBase):
|
||||
container.edit()
|
||||
component_editor = ComponentEditorView(self.browser, container.locator)
|
||||
component_editor.set_select_value_and_save('Group Configuration', 'New Group Configuration Name')
|
||||
self.verify_groups(container, ['Group A', 'Group B'], [])
|
||||
self.verify_groups(container, ['Group A', 'Group B', 'New group'], [])
|
||||
|
||||
self.page.visit()
|
||||
config = self.page.group_configurations()[0]
|
||||
config.edit()
|
||||
config.name = "Second Group Configuration Name"
|
||||
# Add new group
|
||||
config.add_group() # Group D
|
||||
# Remove Group A
|
||||
config.groups[0].remove()
|
||||
# Save the configuration
|
||||
config.save()
|
||||
|
||||
@@ -430,13 +478,20 @@ class GroupConfigurationsTest(ContainerBase):
|
||||
"Second Group Configuration Name",
|
||||
container.get_xblock_information_message()
|
||||
)
|
||||
self.verify_groups(
|
||||
container, ['Group B', 'New group'], ['Group A'],
|
||||
verify_missing_groups_not_present=False
|
||||
)
|
||||
# Click the add button and verify that the groups were added on the page
|
||||
container.add_missing_groups()
|
||||
self.verify_groups(container, ['Group B', 'New group', 'Group D'], ['Group A'])
|
||||
|
||||
def test_can_cancel_creation_of_group_configuration(self):
|
||||
"""
|
||||
Scenario: Ensure that creation of the group configuration can be canceled correctly.
|
||||
Given I have a course without group configurations
|
||||
When I click button 'Create new Group Configuration'
|
||||
And I set new name and description
|
||||
And I set new name and description, add 1 additional group
|
||||
And I click button 'Cancel'
|
||||
Then I see that there is no new group configurations in the course
|
||||
"""
|
||||
@@ -449,6 +504,8 @@ class GroupConfigurationsTest(ContainerBase):
|
||||
config = self.page.group_configurations()[0]
|
||||
config.name = "Name of the Group Configuration"
|
||||
config.description = "Description of the group configuration."
|
||||
# Add new group
|
||||
config.add_group() # Group C
|
||||
# Cancel the configuration
|
||||
config.cancel()
|
||||
|
||||
@@ -459,7 +516,7 @@ class GroupConfigurationsTest(ContainerBase):
|
||||
Scenario: Ensure that editing of the group configuration can be canceled correctly.
|
||||
Given I have a course with group configuration
|
||||
When I go to the edit mode of the group configuration
|
||||
And I set new name and description
|
||||
And I set new name and description, add 2 additional groups
|
||||
And I click button 'Cancel'
|
||||
Then I see that new changes were discarded
|
||||
"""
|
||||
@@ -478,6 +535,9 @@ class GroupConfigurationsTest(ContainerBase):
|
||||
|
||||
config.name = "New Group Configuration Name"
|
||||
config.description = "New Description of the group configuration."
|
||||
# Add 2 new groups
|
||||
config.add_group() # Group C
|
||||
config.add_group() # Group D
|
||||
# Cancel the configuration
|
||||
config.cancel()
|
||||
|
||||
@@ -495,27 +555,39 @@ class GroupConfigurationsTest(ContainerBase):
|
||||
And I create new group configuration with 2 default groups
|
||||
When I set only description and try to save
|
||||
Then I see error message "Group Configuration name is required"
|
||||
When I set new name and try to save
|
||||
When I set a name
|
||||
And I delete the name of one of the groups and try to save
|
||||
Then I see error message "All groups must have a name"
|
||||
When I delete the group without name and try to save
|
||||
Then I see error message "Please add at least two groups"
|
||||
When I add new group and try to save
|
||||
Then I see the group configuration is saved successfully
|
||||
"""
|
||||
self.page.visit()
|
||||
def try_to_save_and_verify_error_message(message):
|
||||
# Try to save
|
||||
config.save()
|
||||
# Verify that configuration is still in editing mode
|
||||
self.assertEqual(config.mode, 'edit')
|
||||
# Verify error message
|
||||
self.assertEqual(message, config.validation_message)
|
||||
|
||||
self.page.visit()
|
||||
# Create new group configuration
|
||||
self.page.create()
|
||||
# Leave empty required field
|
||||
config = self.page.group_configurations()[0]
|
||||
config.description = "Description of the group configuration."
|
||||
# Try to save
|
||||
config.save()
|
||||
# Verify that configuration is still in editing mode
|
||||
self.assertEqual(config.mode, 'edit')
|
||||
# Verify error message
|
||||
self.assertEqual(
|
||||
"Group Configuration name is required",
|
||||
config.validation_message
|
||||
)
|
||||
|
||||
try_to_save_and_verify_error_message("Group Configuration name is required")
|
||||
|
||||
# Set required field
|
||||
config.name = "Name of the Group Configuration"
|
||||
config.groups[1].name = ''
|
||||
try_to_save_and_verify_error_message("All groups must have a name")
|
||||
config.groups[1].remove()
|
||||
try_to_save_and_verify_error_message("There must be at least two groups")
|
||||
config.add_group()
|
||||
|
||||
# Save the configuration
|
||||
config.save()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user