diff --git a/cms/djangoapps/contentstore/features/course-export.feature b/cms/djangoapps/contentstore/features/course-export.feature deleted file mode 100644 index 581992e6e4..0000000000 --- a/cms/djangoapps/contentstore/features/course-export.feature +++ /dev/null @@ -1,12 +0,0 @@ -@shard_1 -Feature: Course export - I want to export my course to a tar.gz file to share with others or check into source control - - # Disabling due to failure on master. 05/21/2014 TODO: fix - # Scenario: User is directed to problem with & in it when export fails - # Given I am in Studio editing a new unit - # When I add a "Blank Advanced Problem" "Advanced Problem" component - # And I edit and enter an ampersand - # And I export the course - # Then I get an error dialog - # And I can click to go to the unit with the error diff --git a/cms/djangoapps/contentstore/features/course-export.py b/cms/djangoapps/contentstore/features/course-export.py deleted file mode 100644 index ae30100382..0000000000 --- a/cms/djangoapps/contentstore/features/course-export.py +++ /dev/null @@ -1,71 +0,0 @@ -# pylint: disable=missing-docstring -# pylint: disable=redefined-outer-name -# pylint: disable=unused-argument - -from lettuce import world, step -from component_settings_editor_helpers import enter_xml_in_advanced_problem -from nose.tools import assert_true, assert_equal -from contentstore.utils import reverse_usage_url - - -@step('I go to the export page$') -def i_go_to_the_export_page(step): - world.click_tools() - link_css = 'li.nav-course-tools-export a' - world.css_click(link_css) - - -@step('I export the course$') -def i_export_the_course(step): - step.given('I go to the export page') - world.css_click('a.action-export') - - -@step('I edit and enter bad XML$') -def i_enter_bad_xml(step): - enter_xml_in_advanced_problem( - step, - """

Smallest Canvas

-

You want to make the smallest canvas you can.

- - - - - - -
""" - ) - - -@step('I edit and enter an ampersand$') -def i_enter_an_ampersand(step): - enter_xml_in_advanced_problem(step, "&") - - -@step('I get an error dialog$') -def get_an_error_dialog(step): - assert_true(world.is_css_present("div.prompt.error")) - - -@step('I can click to go to the unit with the error$') -def i_click_on_error_dialog(step): - world.css_click("button.action-primary") - - problem_string = unicode(world.scenario_dict['COURSE'].id.make_usage_key("problem", 'ignore')) - problem_string = u"Problem {}".format(problem_string[:problem_string.rfind('ignore')]) - css_selector = "span.inline-error" - world.wait_for_visible(css_selector) - assert_true( - world.css_html(css_selector).startswith(problem_string), - u"{} does not start with {}".format( - world.css_html(css_selector), problem_string - )) - # we don't know the actual ID of the vertical. So just check that we did go to a - # vertical page in the course (there should only be one). - vertical_usage_key = world.scenario_dict['COURSE'].id.make_usage_key("vertical", "test") - vertical_url = reverse_usage_url('container_handler', vertical_usage_key) - # Remove the trailing "/None" from the URL - we don't know the course ID, so we just want to - # check that we visited a vertical URL. - if vertical_url.endswith("/test") or vertical_url.endswith("@test"): - vertical_url = vertical_url[:-5] - assert_equal(1, world.browser.url.count(vertical_url)) diff --git a/cms/djangoapps/contentstore/features/problem-editor.feature b/cms/djangoapps/contentstore/features/problem-editor.feature index 0891e9de99..026504ca7f 100644 --- a/cms/djangoapps/contentstore/features/problem-editor.feature +++ b/cms/djangoapps/contentstore/features/problem-editor.feature @@ -101,27 +101,3 @@ Feature: CMS.Problem Editor Then I can see Reply to Annotation link And I see that page has scrolled "down" when I click on "annotatable-reply" link And I see that page has scrolled "up" when I click on "annotation-return" link - - # Disabled 11/13/2013 after failing in master - # The screenshot showed that the LaTeX editor had the text "hi", - # but Selenium timed out waiting for the text to appear. - # It also caused later tests to fail with "UnexpectedAlertPresent" - # - # This feature will work in Firefox only when Firefox is the active window - # IE will not interact with the high level source in sauce labs - #@skip_internetexplorer - #Scenario: High Level source is persisted for LaTeX problem (bug STUD-280) - # Given I have created a LaTeX Problem - # When I edit and compile the High Level Source - # Then my change to the High Level Source is persisted - # And when I view the High Level Source I see my changes - - # Disabled 10/28/13 due to flakiness observed in master - # Scenario: Exceptions don't cause problem to be uneditable (bug STUD-786) - #Given I have an empty course - #And I go to the import page - #And I import the file "get_html_exception_test.tar.gz" - #When I go to the unit "Probability and BMI" - #And I click on "edit a draft" - #Then I see a message that says "We're having trouble rendering your component" - #And I can edit the problem diff --git a/cms/djangoapps/contentstore/features/video.feature b/cms/djangoapps/contentstore/features/video.feature deleted file mode 100644 index 59dc89f6eb..0000000000 --- a/cms/djangoapps/contentstore/features/video.feature +++ /dev/null @@ -1,57 +0,0 @@ -@shard_2 @requires_stub_youtube -Feature: CMS Video Component - As a course author, I want to be able to view my created videos in Studio - - # 2 - # Disabled 2/19/14 after intermittent failures in master - #Scenario: Check that position is stored on page refresh, position within start-end range - # Given I have created a Video component with subtitles - # And Make sure captions are closed - # And I edit the component - # And I open tab "Advanced" - # And I set value "00:00:12" to the field "Video Start Time" - # And I set value "00:00:24" to the field "Video Stop Time" - # And I save changes - # And I click video button "play" - # Then I see a range on slider - # Then I seek video to "16" seconds - # And I click video button "pause" - # And I reload the page - # And I click video button "play" - # Then I see video starts playing from "0:16" position - - # 3 -# Disabled 2/18/14 after intermittent failures in master -# Scenario: Check that position is stored on page refresh, position before start-end range -# Given I have created a Video component with subtitles -# And Make sure captions are closed -# And I edit the component -# And I open tab "Advanced" -# And I set value "00:00:12" to the field "Video Start Time" -# And I set value "00:00:24" to the field "Video Stop Time" -# And I save changes -# And I click video button "play" -# Then I see a range on slider -# Then I seek video to "5" seconds -# And I click video button "pause" -# And I reload the page -# And I click video button "play" -# Then I see video starts playing from "0:12" position - - # 4 -# Disabled 2/18/14 after intermittent failures in master -# Scenario: Check that position is stored on page refresh, position after start-end range -# Given I have created a Video component with subtitles -# And Make sure captions are closed -# And I edit the component -# And I open tab "Advanced" -# And I set value "00:00:12" to the field "Video Start Time" -# And I set value "00:00:24" to the field "Video Stop Time" -# And I save changes -# And I click video button "play" -# Then I see a range on slider -# Then I seek video to "30" seconds -# And I click video button "pause" -# And I reload the page -# And I click video button "play" -# Then I see video starts playing from "0:12" position diff --git a/cms/djangoapps/contentstore/features/video_editor.py b/cms/djangoapps/contentstore/features/video_editor.py deleted file mode 100644 index cf96e099c9..0000000000 --- a/cms/djangoapps/contentstore/features/video_editor.py +++ /dev/null @@ -1,321 +0,0 @@ -# -*- coding: utf-8 -*- -# disable missing docstring -# pylint: disable=missing-docstring - -import requests -from lettuce import world, step -from nose.tools import assert_true, assert_equal, assert_in, assert_not_equal -from terrain.steps import reload_the_page -from django.conf import settings -from common import upload_file, attach_file - -TEST_ROOT = settings.COMMON_TEST_DATA_ROOT - -DISPLAY_NAME = "Component Display Name" -NATIVE_LANGUAGES = {lang: label for lang, label in settings.LANGUAGES if len(lang) == 2} -LANGUAGES = { - lang: NATIVE_LANGUAGES.get(lang, display) - for lang, display in settings.ALL_LANGUAGES -} - -LANGUAGES.update({ - 'table': 'Table of Contents' -}) - -TRANSLATION_BUTTONS = { - 'add': '.metadata-video-translations .create-action', - 'upload': '.metadata-video-translations .upload-action', - 'download': '.metadata-video-translations .download-action', - 'remove': '.metadata-video-translations .remove-action', - 'clear': '.metadata-video-translations .setting-clear', -} - -VIDEO_MENUS = { - 'language': '.lang .menu', -} - - -class RequestHandlerWithSessionId(object): - def get(self, url): - """ - Sends a request. - """ - kwargs = dict() - - session_id = [{i['name']:i['value']} for i in world.browser.cookies.all() if i['name'] == u'sessionid'] - if session_id: - kwargs.update({ - 'cookies': session_id[0] - }) - - response = requests.get(url, **kwargs) - self.response = response - self.status_code = response.status_code - self.headers = response.headers - self.content = response.content - - return self - - def is_success(self): - """ - Returns `True` if the response was succeed, otherwise, returns `False`. - """ - if self.status_code < 400: - return True - return False - - def check_header(self, name, value): - """ - Returns `True` if the response header exist and has appropriate value, - otherwise, returns `False`. - """ - if value in self.headers.get(name, ''): - return True - return False - - -def success_upload_file(filename): - upload_file(filename, sub_path="uploads/") - world.css_has_text('#upload_confirm', 'Success!') - world.is_css_not_present('.wrapper-modal-window-assetupload', wait_time=30) - - -def get_translations_container(): - return world.browser.find_by_xpath('//label[text()="Transcript Languages"]/following-sibling::div') - - -def get_setting_container(lang_code): - try: - get_xpath = lambda value: './/descendant::a[@data-lang="{}" and contains(@class,"remove-setting")]/parent::*'.format(value) - return get_translations_container().find_by_xpath(get_xpath(lang_code)).first - except Exception: - return None - - -def get_last_dropdown(): - return get_translations_container().find_by_xpath('.//descendant::select[last()]').last - - -def choose_option(dropdown, value): - dropdown.find_by_value(value)[0].click() - - -def choose_new_lang(lang_code): - world.css_click(TRANSLATION_BUTTONS['add']) - choose_option(get_last_dropdown(), lang_code) - assert_equal(get_last_dropdown().value, lang_code, "Option with provided value is not available or was not selected") - - -def open_menu(menu): - world.browser.execute_script("$('{selector}').parent().addClass('is-opened')".format( - selector=VIDEO_MENUS[menu] - )) - - -@step('I have set "transcript display" to (.*)$') -def set_show_captions(step, setting): - # Prevent cookies from overriding course settings - world.browser.cookies.delete('hide_captions') - - world.edit_component() - world.select_editor_tab('Advanced') - world.browser.select('Show Transcript', setting) - world.save_component() - - -@step('when I view the video it (.*) show the captions$') -def shows_captions(_step, show_captions): - world.wait_for_js_variable_truthy("Video") - world.wait(0.5) - if show_captions == 'does not': - assert_true(world.is_css_present('div.video.closed')) - else: - assert_true(world.is_css_not_present('div.video.closed')) - - # Prevent cookies from overriding course settings - world.browser.cookies.delete('hide_captions') - world.browser.cookies.delete('current_player_mode') - - -@step('I see the correct video settings and default values$') -def correct_video_settings(_step): - expected_entries = [ - # basic - [DISPLAY_NAME, 'Video', False], - ['Default Video URL', 'http://youtu.be/3_yD_cEKoCk, , ', False], - - # advanced - [DISPLAY_NAME, 'Video', False], - ['Default Timed Transcript', '', False], - ['Download Transcript Allowed', 'False', False], - ['Downloadable Transcript URL', '', False], - ['Show Transcript', 'True', False], - ['Transcript Languages', '', False], - ['Upload Handout', '', False], - ['Video Available on Web Only', 'False', False], - ['Video Download Allowed', 'False', False], - ['Video File URLs', '', False], - ['Video Start Time', '00:00:00', False], - ['Video Stop Time', '00:00:00', False], - ['YouTube ID', '3_yD_cEKoCk', False], - ['YouTube ID for .75x speed', '', False], - ['YouTube ID for 1.25x speed', '', False], - ['YouTube ID for 1.5x speed', '', False] - ] - world.verify_all_setting_entries(expected_entries) - - -@step('my video display name change is persisted on save$') -def video_name_persisted(step): - world.save_component() - reload_the_page(step) - world.wait_for_xmodule() - world.edit_component() - - world.verify_setting_entry( - world.get_setting_entry(DISPLAY_NAME), - DISPLAY_NAME, '3.4', True - ) - - -@step('I can modify video display name') -def i_can_modify_video_display_name(_step): - index = world.get_setting_entry_index(DISPLAY_NAME) - world.set_field_value(index, '3.4') - world.verify_setting_entry(world.get_setting_entry(DISPLAY_NAME), DISPLAY_NAME, '3.4', True) - - -@step('I upload transcript file(?:s)?:$') -def upload_transcript(step): - input_hidden = '.metadata-video-translations .input' - # Number of previously added translations - initial_index = len(world.css_find(TRANSLATION_BUTTONS['download'])) - - if step.hashes: - for i, item in enumerate(step.hashes): - lang_code = item['lang_code'] - filename = item['filename'] - index = initial_index + i - - choose_new_lang(lang_code) - - expected_text = world.css_text(TRANSLATION_BUTTONS['upload'], index=index) - assert_equal(expected_text, "Upload") - assert_equal(world.css_find(input_hidden).last.value, "") - - world.css_click(TRANSLATION_BUTTONS['upload'], index=index) - success_upload_file(filename) - - world.wait_for_visible(TRANSLATION_BUTTONS['download'], index=index) - assert_equal(world.css_find(TRANSLATION_BUTTONS['upload']).last.text, "Replace") - assert_equal(world.css_find(input_hidden).last.value, filename) - - -@step('I try to upload transcript file "([^"]*)"$') -def try_to_upload_transcript(step, filename): - world.css_click(TRANSLATION_BUTTONS['upload']) - attach_file(filename, 'uploads/') - - -@step('I upload transcript file "([^"]*)" for "([^"]*)" language code$') -def upload_transcript_for_lang(step, filename, lang_code): - get_xpath = lambda value: './/div/a[contains(@class, "upload-action")]'.format(value) - container = get_setting_container(lang_code) - - # If translation isn't uploaded, prepare drop-down and try to find container again - choose_new_lang(lang_code) - container = get_setting_container(lang_code) - - button = container.find_by_xpath(get_xpath(lang_code)).first - button.click() - success_upload_file(filename) - - -@step('I replace transcript file for "([^"]*)" language code by "([^"]*)"$') -def replace_transcript_for_lang(step, lang_code, filename): - get_xpath = lambda value: './/div/a[contains(@class, "upload-action")]'.format(value) - container = get_setting_container(lang_code) - - button = container.find_by_xpath(get_xpath(lang_code)).first - button.click() - success_upload_file(filename) - - -@step('I see validation error "([^"]*)"$') -def verify_validation_error_message(step, error_message): - assert_equal(world.css_text('#upload_error'), error_message) - - -@step('I can download transcript for "([^"]*)" language code, that contains text "([^"]*)"$') -def i_can_download_transcript(_step, lang_code, text): - MIME_TYPE = 'application/x-subrip' - get_xpath = lambda value: './/div/a[contains(text(), "Download")]'.format(value) - container = get_setting_container(lang_code) - assert container - button = container.find_by_xpath(get_xpath(lang_code)).first - url = button['href'] - request = RequestHandlerWithSessionId() - assert_true(request.get(url).is_success()) - assert_true(request.check_header('content-type', MIME_TYPE)) - assert_in(text.encode('utf-8'), request.content) - - -@step('I remove translation for "([^"]*)" language code$') -def i_can_remove_transcript(_step, lang_code): - get_xpath = lambda value: './/descendant::a[@data-lang="{}" and contains(@class,"remove-setting")]'.format(value) - container = get_setting_container(lang_code) - assert container - button = container.find_by_xpath(get_xpath(lang_code)).first - button.click() - - -@step('I see translations for "([^"]*)"$') -def verify_translations(_step, lang_codes_string): - expected = [l.strip() for l in lang_codes_string.split(',')] - actual = [l['data-lang'] for l in world.css_find('.metadata-video-translations .remove-setting')] - assert_equal(set(expected), set(actual)) - - -@step('I do not see translations$') -def no_translations(_step): - assert_true(world.is_css_not_present('.metadata-video-translations .remove-setting')) - - -@step('I confirm prompt$') -def confirm_prompt(_step): - world.confirm_studio_prompt() - - -@step('I (cannot )?choose "([^"]*)" language code$') -def i_choose_lang_code(_step, cannot, lang_code): - choose_option(get_last_dropdown(), lang_code) - if cannot: - assert_not_equal(get_last_dropdown().value, lang_code, "Option with provided value was selected, but shouldn't") - else: - assert_equal(get_last_dropdown().value, lang_code, "Option with provided value is not available or was not selected") - - -@step('I click button "([^"]*)"$') -def click_button(_step, button): - world.css_click(TRANSLATION_BUTTONS[button.lower()]) - - -@step('video language menu has "([^"]*)" translations$') -def i_see_correct_langs(_step, langs): - menu_name = 'language' - open_menu(menu_name) - items = world.css_find(VIDEO_MENUS[menu_name] + ' li') - translations = {t.strip(): LANGUAGES[t.strip()] for t in langs.split(',')} - - assert_equal(len(translations), len(items)) - for lang_code, label in translations.items(): - assert_true(any([i.text == label for i in items])) - assert_true(any([i['data-lang-code'] == lang_code for i in items])) - - -@step('video language with code "([^"]*)" at position "(\d+)"$') -def i_see_lang_at_position(_step, code, position): - menu_name = 'language' - open_menu(menu_name) - item = world.css_find(VIDEO_MENUS[menu_name] + ' li')[int(position)] - assert_equal(item['data-lang-code'], code) diff --git a/cms/djangoapps/contentstore/features/video_handout.py b/cms/djangoapps/contentstore/features/video_handout.py deleted file mode 100644 index 233ea30b56..0000000000 --- a/cms/djangoapps/contentstore/features/video_handout.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- -# disable missing docstring -# pylint: disable=missing-docstring - -from lettuce import world, step -from nose.tools import assert_true -from video_editor import RequestHandlerWithSessionId, success_upload_file - - -@step('I (?:upload|replace) handout file(?: by)? "([^"]*)"$') -def upload_handout(step, filename): - world.css_click('.wrapper-comp-setting.file-uploader .upload-action') - success_upload_file(filename) - - -@step('I can download handout file( in editor)? with mime type "([^"]*)"$') -def i_can_download_handout_with_mime_type(_step, is_editor, mime_type): - if is_editor: - selector = '.wrapper-comp-setting.file-uploader .download-action' - else: - selector = '.video-handout.video-download-button a' - - button = world.css_find(selector).first - url = button['href'] - request = RequestHandlerWithSessionId() - assert_true(request.get(url).is_success()) - assert_true(request.check_header('content-type', mime_type)) - - -@step('I clear handout$') -def clear_handout(_step): - world.css_click('.wrapper-comp-setting.file-uploader .setting-clear') - - -@step('I have created a Video component with handout file "([^"]*)"') -def create_video_with_handout(_step, filename): - _step.given('I have created a Video component') - _step.given('I edit the component') - _step.given('I open tab "Advanced"') - _step.given('I upload handout file "{0}"'.format(filename)) diff --git a/lms/djangoapps/courseware/tests/test_video_mongo.py b/lms/djangoapps/courseware/tests/test_video_mongo.py index a617a4b94c..31c008d8f0 100644 --- a/lms/djangoapps/courseware/tests/test_video_mongo.py +++ b/lms/djangoapps/courseware/tests/test_video_mongo.py @@ -1159,7 +1159,7 @@ class TestVideoDescriptorStudentViewJson(TestCase): Tests retrieving a video that is not stored in VAL. """ self.video.edx_video_id = self.TEST_EDX_VIDEO_ID - # The video is not is VAL so in contexts that do and don't allow cache misses we should always get a fallback + # The video is not in VAL so in contexts that do and don't allow cache misses we should always get a fallback result = self.get_result(allow_cache_miss) self.verify_result_with_fallback_and_youtube(result)