diff --git a/common/test/acceptance/tests/studio/test_studio_settings.py b/common/test/acceptance/tests/studio/test_studio_settings.py index 5ae1de6336..73ed50090c 100644 --- a/common/test/acceptance/tests/studio/test_studio_settings.py +++ b/common/test/acceptance/tests/studio/test_studio_settings.py @@ -4,25 +4,19 @@ Acceptance tests for Studio's Setting pages """ -import json import os -import random -import string from textwrap import dedent -import six from bok_choy.promise import EmptyPromise from mock import patch -from six.moves import range from common.test.acceptance.fixtures.course import XBlockFixtureDesc from common.test.acceptance.pages.common.utils import add_enrollment_course_modes from common.test.acceptance.pages.lms.courseware import CoursewarePage from common.test.acceptance.pages.studio.overview import CourseOutlinePage from common.test.acceptance.pages.studio.settings import SettingsPage -from common.test.acceptance.pages.studio.settings_advanced import AdvancedSettingsPage from common.test.acceptance.pages.studio.settings_group_configurations import GroupConfigurationsPage -from common.test.acceptance.pages.studio.utils import get_input_value, type_in_codemirror +from common.test.acceptance.pages.studio.utils import get_input_value from common.test.acceptance.tests.helpers import create_user_partition_json, element_has_text from common.test.acceptance.tests.studio.base_studio_test import StudioCourseTest from openedx.core.lib.tests import attr @@ -291,381 +285,6 @@ class EnrollmentTrackModeTest(StudioCourseTest): self.assertEqual(len(groups), 0) -@attr(shard=19) -class AdvancedSettingsValidationTest(StudioCourseTest): - """ - Tests for validation feature in Studio's advanced settings tab - """ - course_name_key = 'Course Display Name' - course_name_value = 'Test Name' - - def setUp(self): - super(AdvancedSettingsValidationTest, self).setUp() - self.advanced_settings = AdvancedSettingsPage( - self.browser, - self.course_info['org'], - self.course_info['number'], - self.course_info['run'] - ) - - self.type_fields = ['Course Display Name', 'Advanced Module List', 'Discussion Topic Mapping', - 'Maximum Attempts', 'Course Announcement Date'] - - # Before every test, make sure to visit the page first - self.advanced_settings.visit() - - def test_course_author_sees_default_advanced_settings(self): - """ - Scenario: Test that advanced settings have the default settings - Given a staff logs in to studio - When this user goes to advanced settings page - Then this user sees 'Allow Anonymous Discussion Posts' as true - And 'Enable Timed Exams' as false - And 'Maximum Attempts' as null - """ - anonymous_discussion_setting = self.advanced_settings.get('Allow Anonymous Discussion Posts') - timed_exam_settings = self.advanced_settings.get('Enable Timed Exams') - max_attempts = self.advanced_settings.get('Maximum Attempts') - page_default_settings = [ - anonymous_discussion_setting, - timed_exam_settings, - max_attempts - ] - default_anonymous_discussion_setting = 'true' - default_timed_exam_settings = 'false' - default_max_attempts = 'null' - expected_default_settings = [ - default_anonymous_discussion_setting, - default_timed_exam_settings, - default_max_attempts - ] - self.assertEqual( - page_default_settings, - expected_default_settings - ) - - def test_keys_appear_alphabetically(self): - """ - Scenario: Test that advanced settings have all the keys in alphabetic order - Given a staff logs in to studio - When this user goes to advanced settings page - Then he sees all the advanced setting keys in alphabetic order - """ - - key_names = self.advanced_settings.key_names - self.assertEqual(key_names, sorted(key_names)) - - def test_cancel_editing_key_value(self): - """ - Scenario: Test that advanced settings does not save the key value, if cancel - is clicked from notification bar - Given a staff logs in to studio - When this user goes to advanced settings page and enters and new course name - Then he clicks 'cancel' buttin when asked to save changes - When this user reloads the page - And then he does not see any change in the original course name - """ - - original_course_display_name = self.advanced_settings.get(self.course_name_key) - new_course_name = 'New Course Name' - type_in_codemirror(self.advanced_settings, 16, new_course_name) - self.advanced_settings.cancel() - self.advanced_settings.refresh_and_wait_for_load() - self.assertNotEqual( - original_course_display_name, - new_course_name, - ( - 'original course name:{} can not not be equal to unsaved course name {}'.format( - original_course_display_name, - new_course_name - ) - ) - ) - self.assertEqual( - self.advanced_settings.get(self.course_name_key), - original_course_display_name, - ( - 'course name from the page should be same as original_course_display_name:{}'.format( - original_course_display_name - ) - ) - ) - - def test_editing_key_value(self): - """ - Scenario: Test that advanced settings saves the key value, if save button - is clicked from notification bar after the editing - Given a staff logs in to studio - When this user goes to advanced settings page and enters a new course name - And he clicks 'save' button from the notification bar - Then he is able to see the updated course name - """ - new_course_name = ''.join(random.choice(string.ascii_uppercase) for _ in range(10)) - self.advanced_settings.set(self.course_name_key, new_course_name) - self.assertEqual( - self.advanced_settings.get(self.course_name_key), - '"{}"'.format(new_course_name), - ( - 'course name from the page should be same as new_course_name:{}'.format( - new_course_name - ) - ) - ) - - def test_confirmation_is_shown_on_save(self): - """ - Scenario: Test that advanced settings shows confirmation after editing a field successfully - Given a staff logs in to studio - When this user goes to advanced settings page and edits any value - And he clicks 'save' button from the notification bar - Then he is able to see the confirmation message - """ - self.advanced_settings.set('Maximum Attempts', 5) - confirmation_message = self.advanced_settings.confirmation_message - self.assertEqual( - confirmation_message, - 'Your policy changes have been saved.', - 'Settings must be saved successfully in order to have confirmation message' - ) - - def test_deprecated_settings_can_be_toggled(self): - """ - Scenario: Test that advanced settings can toggle deprecated settings - Given I am on the Advanced Course Settings page in Studio - When I toggle the display of deprecated settings - Then deprecated settings are then shown - And I toggle the display of deprecated settings - Then deprecated settings are not shown - """ - - self.advanced_settings.toggle_deprecated_settings() - button_text = self.advanced_settings.deprecated_settings_button_text - self.assertEqual( - button_text, - 'Hide Deprecated Settings', - "Button text should change to 'Hide Deprecated Settings' after the click" - ) - self.assertTrue(self.advanced_settings.is_deprecated_setting_visible()) - self.advanced_settings.toggle_deprecated_settings() - self.assertFalse(self.advanced_settings.is_deprecated_setting_visible()) - self.assertEqual( - self.advanced_settings.deprecated_settings_button_text, - 'Show Deprecated Settings', - "Button text should change to 'Show Deprecated Settings' after the click" - ) - - def test_multi_line_input(self): - """ - Scenario: Test that advanced settings correctly shows the multi-line input - Given I am on the Advanced Course Settings page in Studio - When I create a JSON object as a value for "Discussion Topic Mapping" - Then it is displayed as formatted - """ - - inputs = { - "key": "value", - "key_2": "value_2" - } - json_input = json.dumps(inputs) - self.advanced_settings.set('Discussion Topic Mapping', json_input) - assert self.advanced_settings.get('Discussion Topic Mapping') in ( - '{\n "key": "value",\n "key_2": "value_2"\n}', - '{\n "key_2": "value_2",\n "key": "value"\n}' - ) - - def test_automatic_quoting_of_non_json_value(self): - """ - Scenario: Test that advanced settings automatically quotes the field input - upon saving - Given I am on the Advanced Course Settings page in Studio - When I create a non-JSON value not in quotes - Then it is displayed as a string - """ - - self.advanced_settings.set(self.course_name_key, self.course_name_value) - self.assertEqual( - self.advanced_settings.get(self.course_name_key), - '"Test Name"' - ) - - def test_validation_error_for_wrong_input_type(self): - """ - Scenario: Test error if value supplied is of the wrong type - Given I am on the Advanced Course Settings page in Studio - When I create a JSON object as a value for "Course Display Name" - Then I get an error on save - And I reload the page - Then the policy key value is unchanged - """ - - course_display_name = self.advanced_settings.get('Course Display Name') - inputs = { - "key": "value", - "key_2": "value_2" - } - json_input = json.dumps(inputs) - self.advanced_settings.set('Course Display Name', json_input) - self.advanced_settings.wait_for_modal_load() - self.check_modal_shows_correct_contents(['Course Display Name']) - self.advanced_settings.refresh_and_wait_for_load() - self.assertEqual( - self.advanced_settings.get('Course Display Name'), - course_display_name, - 'Wrong input for Course Display Name must not change its value' - ) - - def test_modal_shows_one_validation_error(self): - """ - Test that advanced settings don't save if there's a single wrong input, - and that it shows the correct error message in the modal. - """ - - # Feed an integer value for String field. - # .set method saves automatically after setting a value - course_display_name = self.advanced_settings.get('Course Display Name') - self.advanced_settings.set('Course Display Name', 1) - self.advanced_settings.wait_for_modal_load() - - # Test Modal - self.check_modal_shows_correct_contents(['Course Display Name']) - self.advanced_settings.refresh_and_wait_for_load() - - self.assertEqual( - self.advanced_settings.get('Course Display Name'), - course_display_name, - 'Wrong input for Course Display Name must not change its value' - ) - - def test_modal_shows_multiple_validation_errors(self): - """ - Test that advanced settings don't save with multiple wrong inputs - """ - - # Save original values and feed wrong inputs - original_values_map = self.get_settings_fields_of_each_type() - self.set_wrong_inputs_to_fields() - self.advanced_settings.wait_for_modal_load() - - # Test Modal - self.check_modal_shows_correct_contents(self.type_fields) - self.advanced_settings.refresh_and_wait_for_load() - - for key, val in six.iteritems(original_values_map): - self.assertEqual( - self.advanced_settings.get(key), - val, - 'Wrong input for Advanced Settings Fields must not change its value' - ) - - def test_undo_changes(self): - """ - Test that undo changes button in the modal resets all settings changes - """ - - # Save original values and feed wrong inputs - original_values_map = self.get_settings_fields_of_each_type() - self.set_wrong_inputs_to_fields() - - # Let modal popup - self.advanced_settings.wait_for_modal_load() - - # Click Undo Changes button - self.advanced_settings.undo_changes_via_modal() - - # Check that changes are undone - for key, val in six.iteritems(original_values_map): - self.assertEqual( - self.advanced_settings.get(key), - val, - 'Undoing Should revert back to original value' - ) - - def test_manual_change(self): - """ - Test that manual changes button in the modal keeps settings unchanged - """ - inputs = {"Course Display Name": 1, - "Advanced Module List": 1, - "Discussion Topic Mapping": 1, - "Maximum Attempts": '"string"', - "Course Announcement Date": '"string"', - } - - self.set_wrong_inputs_to_fields() - self.advanced_settings.wait_for_modal_load() - self.advanced_settings.trigger_manual_changes() - - # Check that the validation modal went away. - self.assertFalse(self.advanced_settings.is_validation_modal_present()) - - # Iterate through the wrong values and make sure they're still displayed - for key, val in six.iteritems(inputs): - self.assertEqual( - str(self.advanced_settings.get(key)), - str(val), - 'manual change should keep: ' + str(val) + ', but is: ' + str(self.advanced_settings.get(key)) - ) - - def check_modal_shows_correct_contents(self, wrong_settings_list): - """ - Helper function that checks if the validation modal contains correct - error messages. - """ - # Check presence of modal - self.assertTrue(self.advanced_settings.is_validation_modal_present()) - - # List of wrong settings item & what is presented in the modal should be the same - error_item_names = self.advanced_settings.get_error_item_names() - self.assertEqual(set(wrong_settings_list), set(error_item_names)) - - error_item_messages = self.advanced_settings.get_error_item_messages() - self.assertEqual(len(error_item_names), len(error_item_messages)) - - def get_settings_fields_of_each_type(self): - """ - Get one of each field type: - - String: Course Display Name - - List: Advanced Module List - - Dict: Discussion Topic Mapping - - Integer: Maximum Attempts - - Date: Course Announcement Date - """ - return { - "Course Display Name": self.advanced_settings.get('Course Display Name'), - "Advanced Module List": self.advanced_settings.get('Advanced Module List'), - "Discussion Topic Mapping": self.advanced_settings.get('Discussion Topic Mapping'), - "Maximum Attempts": self.advanced_settings.get('Maximum Attempts'), - "Course Announcement Date": self.advanced_settings.get('Course Announcement Date'), - } - - def set_wrong_inputs_to_fields(self): - """ - Set wrong values for the chosen fields - """ - self.advanced_settings.set_values( - { - "Course Display Name": 1, - "Advanced Module List": 1, - "Discussion Topic Mapping": 1, - "Maximum Attempts": '"string"', - "Course Announcement Date": '"string"', - } - ) - - def test_only_expected_fields_are_displayed(self): - """ - Scenario: The Advanced Settings screen displays settings/fields not specifically hidden from - view by a developer. - Given I have a set of CourseMetadata fields defined for the course - When I view the Advanced Settings screen for the course - The total number of fields displayed matches the number I expect - And the actual fields displayed match the fields I expect to see - """ - expected_fields = self.advanced_settings.expected_settings_names - displayed_fields = self.advanced_settings.displayed_settings_names - self.assertEqual(set(displayed_fields), set(expected_fields)) - - @attr(shard=16) class ContentLicenseTest(StudioCourseTest): """