Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
E
edx-platform
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
edx
edx-platform
Commits
5b6f3f8f
Commit
5b6f3f8f
authored
Apr 02, 2014
by
Muhammad Ammar
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Convert first batch of lettuce video tests to bok-choy.
parent
8c8367b0
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
433 additions
and
113 deletions
+433
-113
common/test/acceptance/fixtures/course.py
+42
-1
common/test/acceptance/pages/lms/video.py
+135
-46
common/test/acceptance/tests/helpers.py
+14
-0
common/test/acceptance/tests/test_video_module.py
+223
-0
lms/djangoapps/courseware/features/video.feature
+19
-66
No files found.
common/test/acceptance/fixtures/course.py
View file @
5b6f3f8f
...
...
@@ -7,6 +7,7 @@ import datetime
from
textwrap
import
dedent
from
collections
import
namedtuple
import
requests
from
path
import
path
from
lazy
import
lazy
from
.
import
STUDIO_BASE_URL
...
...
@@ -185,6 +186,7 @@ class CourseFixture(StudioApiFixture):
self
.
_updates
=
[]
self
.
_handouts
=
[]
self
.
_children
=
[]
self
.
_assets
=
[]
def
__str__
(
self
):
"""
...
...
@@ -215,6 +217,12 @@ class CourseFixture(StudioApiFixture):
"""
self
.
_handouts
.
append
(
asset_name
)
def
add_asset
(
self
,
asset_name
):
"""
Add the asset to the list of assets to be uploaded when the install method is called.
"""
self
.
_assets
.
append
(
asset_name
)
def
install
(
self
):
"""
Create the course and XBlocks within the course.
...
...
@@ -223,10 +231,10 @@ class CourseFixture(StudioApiFixture):
conflicts between tests.
"""
self
.
_create_course
()
self
.
_install_course_updates
()
self
.
_install_course_handouts
()
self
.
_configure_course
()
self
.
_upload_assets
()
self
.
_create_xblock_children
(
self
.
_course_loc
,
self
.
_children
)
@property
...
...
@@ -244,6 +252,13 @@ class CourseFixture(StudioApiFixture):
return
"{org}.{number}.{run}/branch/draft/block/updates"
.
format
(
**
self
.
_course_dict
)
@property
def
_assets_url
(
self
):
"""
Return the url string for the assets
"""
return
"/assets/{org}.{number}.{run}/branch/draft/block/{run}"
.
format
(
**
self
.
_course_dict
)
@property
def
_handouts_loc
(
self
):
"""
Return the locator string for the course handouts
...
...
@@ -359,6 +374,32 @@ class CourseFixture(StudioApiFixture):
"Could not add update to course: {0}. Status was {1}"
.
format
(
update
,
response
.
status_code
))
def
_upload_assets
(
self
):
"""
Upload assets
:raise CourseFixtureError:
"""
url
=
STUDIO_BASE_URL
+
self
.
_assets_url
test_dir
=
path
(
__file__
)
.
abspath
()
.
dirname
()
.
dirname
()
.
dirname
()
for
asset_name
in
self
.
_assets
:
srt_path
=
test_dir
+
'/data/uploads/'
+
asset_name
asset_file
=
open
(
srt_path
)
files
=
{
'file'
:
(
asset_name
,
asset_file
)}
headers
=
{
'Accept'
:
'application/json'
,
'X-CSRFToken'
:
self
.
session_cookies
.
get
(
'csrftoken'
,
''
)
}
upload_response
=
self
.
session
.
post
(
url
,
files
=
files
,
headers
=
headers
)
if
not
upload_response
.
ok
:
raise
CourseFixtureError
(
'Could not upload {asset_name}. Status code: {code}'
.
format
(
asset_name
=
asset_name
,
code
=
upload_response
.
status_code
))
def
_create_xblock_children
(
self
,
parent_loc
,
xblock_descriptions
):
"""
Recursively create XBlock children.
...
...
common/test/acceptance/pages/lms/video.py
View file @
5b6f3f8f
...
...
@@ -2,13 +2,37 @@
Video player in the courseware.
"""
import
time
from
bok_choy.page_object
import
PageObject
from
bok_choy.promise
import
EmptyPromise
from
bok_choy.promise
import
EmptyPromise
,
Promise
from
bok_choy.javascript
import
wait_for_js
,
js_defined
@js_defined
(
'window.Video'
)
from
...tests.helpers
import
wait_for_ajax
VIDEO_BUTTONS
=
{
'CC'
:
'.hide-subtitles'
,
'volume'
:
'.volume'
,
'play'
:
'.video_control.play'
,
'pause'
:
'.video_control.pause'
,
'fullscreen'
:
'.add-fullscreen'
,
'download_transcript'
:
'.video-tracks > a'
,
}
CSS_CLASS_NAMES
=
{
'closed_captions'
:
'.closed .subtitles'
,
'captions'
:
'.subtitles'
,
'error_message'
:
'.video .video-player h3'
,
'video_container'
:
'div.video'
,
'video_sources'
:
'.video-player video source'
,
'video_spinner'
:
'.video-wrapper .spinner'
,
'video_xmodule'
:
'.xmodule_VideoModule'
}
VIDEO_MODES
=
{
'html5'
:
'video'
,
'youtube'
:
'iframe'
}
@js_defined
(
'window.Video'
,
'window.RequireJS.require'
,
'window.jQuery'
)
class
VideoPage
(
PageObject
):
"""
Video player in the courseware.
...
...
@@ -16,77 +40,142 @@ class VideoPage(PageObject):
url
=
None
@wait_for_js
def
is_browser_on_page
(
self
):
return
self
.
q
(
css
=
'div.xmodule_VideoModule'
)
.
present
return
self
.
q
(
css
=
'div{0}'
.
format
(
CSS_CLASS_NAMES
[
'video_xmodule'
]))
.
present
@wait_for_js
def
wait_for_video_class
(
self
):
"""
Wait until element with class name `video` appeared in DOM.
"""
video_css
=
'{0}'
.
format
(
CSS_CLASS_NAMES
[
'video_container'
])
wait_for_ajax
(
self
.
browser
)
return
EmptyPromise
(
lambda
:
self
.
q
(
css
=
video_css
)
.
present
,
"Video is initialized"
)
.
fulfill
()
@wait_for_js
def
wait_for_video_player_render
(
self
):
"""
Wait until Video Player Rendered Completely.
"""
def
_is_finished_loading
():
"""
Check if video loading completed
:return: bool
"""
return
not
self
.
q
(
css
=
CSS_CLASS_NAMES
[
'video_spinner'
])
.
visible
self
.
wait_for_video_class
()
return
EmptyPromise
(
_is_finished_loading
,
'Finished loading the video'
,
try_limit
=
10
,
timeout
=
60
,
try_interval
=
10
)
.
fulfill
()
def
is_video_rendered
(
self
,
mode
):
"""
Check that if video is rendered in `mode`.
:param mode: Video mode, `html5` or `youtube`
"""
html_tag
=
VIDEO_MODES
[
mode
]
css
=
'{0} {1}'
.
format
(
CSS_CLASS_NAMES
[
'video_container'
],
html_tag
)
def
_is_element_present
():
"""
Check if a web element is present in DOM
:return:
"""
is_present
=
self
.
q
(
css
=
css
)
.
present
return
is_present
,
is_present
return
Promise
(
_is_element_present
,
'Video Rendering Failed in {0} mode.'
.
format
(
mode
))
.
fulfill
()
@property
def
elapsed_time
(
self
):
def
all_video_sources
(
self
):
"""
Amount of time elapsed since the start of the video, in seconds
.
Extract all video source urls on current page
.
"""
elapsed
,
_
=
self
.
_video_time
()
return
elapsed
return
self
.
q
(
css
=
CSS_CLASS_NAMES
[
'video_sources'
])
.
map
(
lambda
el
:
el
.
get_attribute
(
'src'
)
.
split
(
'?'
)[
0
])
.
results
@property
def
duration
(
self
):
def
is_autoplay_enabled
(
self
):
"""
Total duration of the video, in seconds
.
Extract `data-autoplay` attribute to check video autoplay is enabled or disabled
.
"""
_
,
duration
=
self
.
_video_time
()
return
duration
auto_play
=
self
.
q
(
css
=
CSS_CLASS_NAMES
[
'video_container'
])
.
attrs
(
'data-autoplay'
)[
0
]
if
auto_play
.
lower
()
==
'false'
:
return
False
return
True
@property
def
is_
playing
(
self
):
def
is_
error_message_shown
(
self
):
"""
Return a boolean indicating whether the video is playing.
Checks if video player error message shown.
:return: bool
"""
return
self
.
q
(
css
=
'a.video_control'
)
.
present
and
self
.
q
(
css
=
'a.video_control.pause'
)
.
present
return
self
.
q
(
css
=
CSS_CLASS_NAMES
[
'error_message'
])
.
visible
@property
def
is_paused
(
self
):
def
error_message_text
(
self
):
"""
Return a boolean indicating whether the video is paused.
Extract video player error message text.
:return: str
"""
return
self
.
q
(
css
=
'a.video_control'
)
.
present
and
self
.
q
(
css
=
'a.video_control.play'
)
.
present
return
self
.
q
(
css
=
CSS_CLASS_NAMES
[
'error_message'
])
.
text
[
0
]
@wait_for_js
def
play
(
self
):
def
is_button_shown
(
self
,
button_id
):
"""
Start playing the video.
Check if a video button specified by `button_id` is visible
:param button_id: button css selector
:return: bool
"""
self
.
q
(
css
=
'a.video_control.play'
)
.
first
.
click
()
EmptyPromise
(
lambda
:
self
.
is_playing
,
"Video is playing"
)
return
self
.
q
(
css
=
VIDEO_BUTTONS
[
button_id
])
.
visible
@wait_for_js
def
pause
(
self
):
def
show_captions
(
self
):
"""
Pause the video
.
Show the video captions
.
"""
self
.
q
(
css
=
'a.video_control.pause'
)
.
first
.
click
()
EmptyPromise
(
lambda
:
self
.
is_paused
,
"Video is paused"
)
def
_video_time
(
self
):
def
_is_subtitles_open
():
"""
Return a tuple `(elapsed_time, duration)`, each in seconds.
Check if subtitles are opened
:return: bool
"""
# The full time has the form "0:32 / 3:14"
all_times
=
self
.
q
(
css
=
'div.vidtime'
)
.
text
is_open
=
not
self
.
q
(
css
=
CSS_CLASS_NAMES
[
'closed_captions'
])
.
present
return
is_open
if
len
(
all_times
)
==
0
:
self
.
warning
(
'Could not find video time'
)
# Make sure that the CC button is there
EmptyPromise
(
lambda
:
self
.
is_button_shown
(
'CC'
),
"CC button is shown"
)
.
fulfill
()
else
:
full_time
=
all_times
[
0
]
# Check if the captions are already open and click if not
if
_is_subtitles_open
()
is
False
:
self
.
q
(
css
=
VIDEO_BUTTONS
[
'CC'
])
.
first
.
click
()
# Split the time at the " / ", to get ["0:32", "3:14"]
elapsed_str
,
duration_str
=
full_time
.
split
(
' / '
)
# Verify that they are now open
EmptyPromise
(
_is_subtitles_open
,
"Subtitles are shown"
)
.
fulfill
()
# Convert each string to seconds
return
self
.
_parse_time_str
(
elapsed_str
),
self
.
_parse_time_str
(
duration_str
)
@property
def
captions_text
(
self
):
"""
Extract captions text.
:return: str
"""
captions_css
=
CSS_CLASS_NAMES
[
'captions'
]
def
_parse_time_str
(
self
,
time_str
):
def
_captions_text
(
):
"""
Parse a string of the form 1:23 into seconds (int).
Extract captions text.
:return: tuple
"""
time_obj
=
time
.
strptime
(
time_str
,
'
%
M:
%
S'
)
return
time_obj
.
tm_min
*
60
+
time_obj
.
tm_sec
is_present
=
self
.
q
(
css
=
captions_css
)
.
present
result
=
None
if
is_present
:
result
=
self
.
q
(
css
=
captions_css
)
.
text
[
0
]
return
is_present
,
result
return
Promise
(
_captions_text
,
'Captions Text'
)
.
fulfill
()
common/test/acceptance/tests/helpers.py
View file @
5b6f3f8f
...
...
@@ -3,8 +3,22 @@ Test helper functions and base classes.
"""
from
path
import
path
from
bok_choy.web_app_test
import
WebAppTest
from
bok_choy.promise
import
EmptyPromise
def
wait_for_ajax
(
browser
):
""" Make sure that all ajax requests are finished.
:param browser: selenium.webdriver, The Selenium-controlled browser that this page is loaded in.
"""
def
_is_ajax_finished
():
"""
Check if all the ajax call on current page completed.
:return:
"""
return
browser
.
execute_script
(
"return jQuery.active"
)
==
0
EmptyPromise
(
_is_ajax_finished
,
"Finished waiting for ajax requests."
)
.
fulfill
()
def
load_data_str
(
rel_path
):
"""
Load a file from the "data" directory as a string.
...
...
common/test/acceptance/tests/test_video_module.py
0 → 100644
View file @
5b6f3f8f
# -*- coding: utf-8 -*-
"""
Acceptance tests for Video.
"""
from
.helpers
import
UniqueCourseTest
from
..pages.lms.video
import
VideoPage
from
..pages.lms.tab_nav
import
TabNavPage
from
..pages.studio.auto_auth
import
AutoAuthPage
from
..pages.lms.course_info
import
CourseInfoPage
from
..fixtures.course
import
CourseFixture
,
XBlockFixtureDesc
HTML5_SOURCES
=
[
'https://s3.amazonaws.com/edx-course-videos/edx-intro/edX-FA12-cware-1_100.mp4'
,
'https://s3.amazonaws.com/edx-course-videos/edx-intro/edX-FA12-cware-1_100.webm'
,
'https://s3.amazonaws.com/edx-course-videos/edx-intro/edX-FA12-cware-1_100.ogv'
,
]
HTML5_SOURCES_INCORRECT
=
[
'https://s3.amazonaws.com/edx-course-videos/edx-intro/edX-FA12-cware-1_100.mp99'
,
]
HTML5_METADATA
=
{
'youtube_id_1_0'
:
''
,
'youtube_id_0_75'
:
''
,
'youtube_id_1_25'
:
''
,
'youtube_id_1_5'
:
''
,
'html5_sources'
:
HTML5_SOURCES
}
YT_HTML5_METADATA
=
{
'html5_sources'
:
HTML5_SOURCES
}
class
VideoBaseTest
(
UniqueCourseTest
):
"""
Base class for tests of the Video Player
Sets up the course and provides helper functions for the Video tests.
"""
def
setUp
(
self
):
"""
Initialization of pages and course fixture for video tests
"""
super
(
VideoBaseTest
,
self
)
.
setUp
()
self
.
video
=
VideoPage
(
self
.
browser
)
self
.
tab_nav
=
TabNavPage
(
self
.
browser
)
self
.
course_info_page
=
CourseInfoPage
(
self
.
browser
,
self
.
course_id
)
self
.
course_fixture
=
CourseFixture
(
self
.
course_info
[
'org'
],
self
.
course_info
[
'number'
],
self
.
course_info
[
'run'
],
self
.
course_info
[
'display_name'
]
)
self
.
metadata
=
{}
self
.
assets
=
None
def
navigate_to_video
(
self
):
""" Prepare the course and get to the video and render it """
self
.
_install_course_fixture
()
self
.
_navigate_to_courseware_video_and_render
()
def
navigate_to_video_no_render
(
self
):
"""
Prepare the course and get to the video unit
however do not wait for it to render, because
the has been an error.
"""
self
.
_install_course_fixture
()
self
.
_navigate_to_courseware_video_no_render
()
def
_install_course_fixture
(
self
):
""" Install the course fixture that has been defined """
if
self
.
assets
:
self
.
course_fixture
.
add_asset
(
self
.
assets
)
# If you are not sending any metadata then `None` should be send as metadata to XBlockFixtureDesc
# instead of empty dictionary otherwise test will not produce correct results.
_metadata
=
self
.
metadata
if
self
.
metadata
else
None
self
.
course_fixture
.
add_children
(
XBlockFixtureDesc
(
'chapter'
,
'Test Chapter'
)
.
add_children
(
XBlockFixtureDesc
(
'sequential'
,
'Test Section'
)
.
add_children
(
XBlockFixtureDesc
(
'vertical'
,
'Test Vertical-0'
)
.
add_children
(
XBlockFixtureDesc
(
'video'
,
'Video'
,
metadata
=
_metadata
)
))))
.
install
()
def
_navigate_to_courseware_video
(
self
):
""" Register for the course and navigate to the video unit """
AutoAuthPage
(
self
.
browser
,
course_id
=
self
.
course_id
)
.
visit
()
self
.
course_info_page
.
visit
()
self
.
tab_nav
.
go_to_tab
(
'Courseware'
)
def
_navigate_to_courseware_video_and_render
(
self
):
""" Wait for the video player to render """
self
.
_navigate_to_courseware_video
()
self
.
video
.
wait_for_video_player_render
()
def
_navigate_to_courseware_video_no_render
(
self
):
""" Wait for the video Xmodule but not for rendering """
self
.
_navigate_to_courseware_video
()
self
.
video
.
wait_for_video_class
()
class
YouTubeVideoTest
(
VideoBaseTest
):
""" Test YouTube Video Player """
def
setUp
(
self
):
super
(
YouTubeVideoTest
,
self
)
.
setUp
()
def
test_video_component_rendered_in_youtube_without_html5_sources
(
self
):
"""
Scenario: Video component is rendered in the LMS in Youtube mode without HTML5 sources
Given the course has a Video component in "Youtube" mode
Then the video has rendered in "Youtube" mode
"""
self
.
navigate_to_video
()
# Verify that video has rendered in "Youtube" mode
self
.
assertTrue
(
self
.
video
.
is_video_rendered
(
'youtube'
))
def
test_cc_button_without_english_transcript_youtube_mode
(
self
):
"""
Scenario: CC button works correctly w/o english transcript in Youtube mode of Video component
Given the course has a Video component in "Youtube" mode
And I have defined a non-english transcript for the video
And I have uploaded a non-english transcript file to assets
Then I see the correct text in the captions
"""
self
.
metadata
[
'transcripts'
]
=
{
'zh'
:
'chinese_transcripts.srt'
}
self
.
assets
=
'chinese_transcripts.srt'
self
.
navigate_to_video
()
self
.
video
.
show_captions
()
# Verify that we see "好 各位同学" text in the captions
unicode_text
=
"好 各位同学"
.
decode
(
'utf-8'
)
self
.
assertIn
(
unicode_text
,
self
.
video
.
captions_text
)
def
test_cc_button_transcripts_and_sub_fields_empty
(
self
):
"""
Scenario: CC button works correctly if transcripts and sub fields are empty,
but transcript file exists in assets (Youtube mode of Video component)
Given the course has a Video component in "Youtube" mode
And I have uploaded a .srt.sjson file to assets
Then I see the correct english text in the captions
"""
self
.
assets
=
'subs_OEoXaMPEzfM.srt.sjson'
self
.
navigate_to_video
()
self
.
video
.
show_captions
()
# Verify that we see "Hi, welcome to Edx." text in the captions
self
.
assertIn
(
'Hi, welcome to Edx.'
,
self
.
video
.
captions_text
)
def
test_cc_button_hidden_if_no_translations
(
self
):
"""
Scenario: CC button is hidden if no translations
Given the course has a Video component in "Youtube" mode
Then the "CC" button is hidden
"""
self
.
navigate_to_video
()
self
.
assertFalse
(
self
.
video
.
is_button_shown
(
'CC'
))
class
YouTubeHtml5VideoTest
(
VideoBaseTest
):
""" Test YouTube HTML5 Video Player """
def
setUp
(
self
):
super
(
YouTubeHtml5VideoTest
,
self
)
.
setUp
()
self
.
metadata
=
YT_HTML5_METADATA
def
test_video_component_rendered_in_youtube_with_unsupported_html5_sources
(
self
):
"""
Scenario: Video component is rendered in the LMS in Youtube mode
with HTML5 sources that doesn't supported by browser
Given the course has a Video component in "Youtube_HTML5_Unsupported_Video" mode
Then the video has rendered in "Youtube" mode
"""
self
.
metadata
[
'html5_sources'
]
=
HTML5_SOURCES_INCORRECT
self
.
navigate_to_video
()
# Verify that the video has rendered in "Youtube" mode
self
.
assertTrue
(
self
.
video
.
is_video_rendered
(
'youtube'
))
class
Html5VideoTest
(
VideoBaseTest
):
""" Test HTML5 Video Player """
def
setUp
(
self
):
super
(
Html5VideoTest
,
self
)
.
setUp
()
self
.
metadata
=
HTML5_METADATA
def
test_autoplay_disabled_for_video_component
(
self
):
"""
Scenario: Autoplay is disabled in LMS for a Video component
Given the course has a Video component in "HTML5" mode
Then it does not have autoplay enabled
"""
self
.
navigate_to_video
()
# Verify that the video has autoplay mode disabled
self
.
assertFalse
(
self
.
video
.
is_autoplay_enabled
)
def
test_video_component_rendered_in_html5_with_unsupported_html5_sources
(
self
):
"""
Scenario: Video component is rendered in the LMS in HTML5 mode with HTML5 sources that doesn't supported by browser
Given the course has a Video component in "HTML5_Unsupported_Video" mode
Then error message is shown
And error message has correct text
"""
self
.
metadata
[
'html5_sources'
]
=
HTML5_SOURCES_INCORRECT
self
.
navigate_to_video_no_render
()
# Verify that error message is shown
self
.
assertTrue
(
self
.
video
.
is_error_message_shown
)
# Verify that error message has correct text
correct_error_message_text
=
'ERROR: No playable video sources found!'
self
.
assertIn
(
correct_error_message_text
,
self
.
video
.
error_message_text
)
lms/djangoapps/courseware/features/video.feature
View file @
5b6f3f8f
...
...
@@ -21,25 +21,19 @@ Feature: LMS.Video component
And
all sources are correct
# 2
@skip_firefox
Scenario
:
Autoplay is disabled in LMS for a Video component
Given
the course has a Video component in
"HTML5"
mode
Then
when I view the video it does not have autoplay enabled
# 3
# Youtube testing
Scenario
:
Video component is fully rendered in the LMS in Youtube mode with HTML5 sources
Given
youtube server is up and response time is 0.4 seconds
And
the course has a Video component in
"Youtube_HTML5"
mode
When
the video has rendered in
"Youtube"
mode
#
4
#
3
Scenario
:
Video component is not rendered in the LMS in Youtube mode with HTML5 sources
Given
youtube server is up and response time is 2 seconds
And
the course has a Video component in
"Youtube_HTML5"
mode
When
the video has rendered in
"HTML5"
mode
#
5
#
4
Scenario
:
Video component is not rendered in the LMS in Youtube mode with HTML5 sources when YouTube API is blocked
Given
youtube server is up and response time is 2 seconds
And
youtube stub server blocks YouTube API
...
...
@@ -47,25 +41,7 @@ Feature: LMS.Video component
And
I wait
"3"
seconds
Then
the video has rendered in
"HTML5"
mode
# 6
Scenario
:
Video component is rendered in the LMS in Youtube mode without HTML5 sources
Given
youtube server is up and response time is 2 seconds
And
the course has a Video component in
"Youtube"
mode
When
the video has rendered in
"Youtube"
mode
# 7
Scenario
:
Video component is rendered in the LMS in Youtube mode with HTML5 sources that doesn't supported by browser
Given
youtube server is up and response time is 2 seconds
And
the course has a Video component in
"Youtube_HTML5_Unsupported_Video"
mode
When
the video has rendered in
"Youtube"
mode
# 8
Scenario
:
Video component is rendered in the LMS in HTML5 mode with HTML5 sources that doesn't supported by browser
Given
the course has a Video component in
"HTML5_Unsupported_Video"
mode
Then
error message is shown
And
error message has correct text
# 9
# 5
Scenario
:
Multiple videos in sequentials all load and work, switching between sequentials
Given
I am registered for the course
"test_course"
And
it has a video
"A"
in
"Youtube"
mode in position
"1"
of sequential
...
...
@@ -87,7 +63,7 @@ Feature: LMS.Video component
When
I open video
"A"
Then
video
"A"
should start playing at speed
"2.0"
#
10
#
6
Scenario
:
Video component stores speed correctly when each video is in separate sequence
Given
I am registered for the course
"test_course"
And
it has a video
"A"
in
"Youtube"
mode in position
"1"
of sequential
...
...
@@ -109,7 +85,7 @@ Feature: LMS.Video component
When
I open video
"C"
Then
video
"C"
should start playing at speed
"1.0"
#
11
#
7
Scenario
:
Language menu works correctly in Video component
Given
I am registered for the course
"test_course"
And
I have a
"chinese_transcripts.srt"
transcript file in assets
...
...
@@ -124,7 +100,7 @@ Feature: LMS.Video component
And
I select language with code
"en"
And
I see
"Hi, welcome to Edx."
text in the captions
#
12
#
8
Scenario
:
CC button works correctly w/o english transcript in HTML5 mode of Video component
Given
I am registered for the course
"test_course"
And
I have a
"chinese_transcripts.srt"
transcript file in assets
...
...
@@ -134,7 +110,7 @@ Feature: LMS.Video component
And
I make sure captions are opened
Then
I see
"好 各位同学"
text in the captions
#
13
#
9
Scenario
:
CC button works correctly only w/ english transcript in HTML5 mode of Video component
Given
I am registered for the course
"test_course"
And
I have a
"subs_OEoXaMPEzfM.srt.sjson"
transcript file in assets
...
...
@@ -144,30 +120,7 @@ Feature: LMS.Video component
And
I make sure captions are opened
Then
I see
"Hi, welcome to Edx."
text in the captions
# 14
Scenario
:
CC button works correctly w/o english transcript in Youtube mode of Video component
Given
I am registered for the course
"test_course"
And
I have a
"chinese_transcripts.srt"
transcript file in assets
And it has a video in "Youtube" mode
:
|
transcripts
|
|
{"zh":
"chinese_transcripts.srt"}
|
And
I make sure captions are opened
Then
I see
"好 各位同学"
text in the captions
# 15
Scenario
:
CC button works correctly if transcripts and sub fields are empty, but transcript file exists in assets (Youtube mode of Video component)
Given
I am registered for the course
"test_course"
And
I have a
"subs_OEoXaMPEzfM.srt.sjson"
transcript file in assets
And
it has a video in
"Youtube"
mode
And
I make sure captions are opened
Then
I see
"Hi, welcome to Edx."
text in the captions
# 16
Scenario
:
CC button is hidden if no translations
Given
the course has a Video component in
"Youtube"
mode
Then
button
"CC"
is hidden
# 17
# 10
Scenario
:
Video is aligned correctly if transcript is visible in fullscreen mode
Given
I am registered for the course
"test_course"
And
I have a
"subs_OEoXaMPEzfM.srt.sjson"
transcript file in assets
...
...
@@ -178,13 +131,13 @@ Feature: LMS.Video component
And
I click video button
"fullscreen"
Then
I see video aligned correctly with enabled transcript
# 1
8
# 1
1
Scenario
:
Video is aligned correctly if transcript is hidden in fullscreen mode
Given
the course has a Video component in
"Youtube"
mode
And
I click video button
"fullscreen"
Then
I see video aligned correctly without enabled transcript
# 1
9
# 1
2
Scenario
:
Video is aligned correctly on transcript toggle in fullscreen mode
Given
I am registered for the course
"test_course"
And
I have a
"subs_OEoXaMPEzfM.srt.sjson"
transcript file in assets
...
...
@@ -197,7 +150,7 @@ Feature: LMS.Video component
And
I click video button
"CC"
Then
I see video aligned correctly without enabled transcript
#
20
#
13
Scenario
:
Download Transcript button works correctly in Video component
Given
I am registered for the course
"test_course"
And
I have a
"subs_OEoXaMPEzfM.srt.sjson"
transcript file in assets
...
...
@@ -219,7 +172,7 @@ Feature: LMS.Video component
When
I open video
"C"
Then
menu
"download_transcript"
doesn't exist
#
21
#
14
Scenario
:
Youtube video has correct transcript if fields for other speeds are filled.
Given
I am registered for the course
"test_course"
And
I have a
"subs_OEoXaMPEzfM.srt.sjson"
transcript file in assets
...
...
@@ -234,7 +187,7 @@ Feature: LMS.Video component
Then
I see
"Hi, welcome to Edx."
text in the captions
And I see duration "1
:
00"
#
22
#
15
Scenario
:
Download button works correctly for non-english transcript in Youtube mode of Video component
Given
I am registered for the course
"test_course"
And
I have a
"chinese_transcripts.srt"
transcript file in assets
...
...
@@ -248,7 +201,7 @@ Feature: LMS.Video component
And
I see
"好 各位同学"
text in the captions
Then
I can download transcript in
"srt"
format that has text
"好 各位同学"
#
23
#
16
Scenario
:
Download button works correctly for non-english transcript in HTML5 mode of Video component
Given
I am registered for the course
"test_course"
And
I have a
"chinese_transcripts.srt"
transcript file in assets
...
...
@@ -262,7 +215,7 @@ Feature: LMS.Video component
And
I see
"好 各位同学"
text in the captions
Then
I can download transcript in
"srt"
format that has text
"好 各位同学"
#
24
#
17
Scenario
:
Download button works correctly w/o english transcript in HTML5 mode of Video component
Given
I am registered for the course
"test_course"
And
I have a
"chinese_transcripts.srt"
transcript file in assets
...
...
@@ -272,7 +225,7 @@ Feature: LMS.Video component
And
I see
"好 各位同学"
text in the captions
Then
I can download transcript in
"srt"
format that has text
"好 各位同学"
#
25
#
18
Scenario
:
Download button works correctly w/o english transcript in Youtube mode of Video component
Given
I am registered for the course
"test_course"
And
I have a
"chinese_transcripts.srt"
transcript file in assets
...
...
@@ -282,7 +235,7 @@ Feature: LMS.Video component
And
I see
"好 各位同学"
text in the captions
Then
I can download transcript in
"srt"
format that has text
"好 各位同学"
#
26
#
19
Scenario
:
Verify that each video in each sub-section includes a transcript for non-Youtube countries.
Given
youtube server is up and response time is 2 seconds
And
I am registered for the course
"test_course"
...
...
@@ -311,7 +264,7 @@ Feature: LMS.Video component
Then
the video has rendered in
"HTML5"
mode
And
the video does not show the captions
# 2
7
Disabled 4/8/14 after intermittent failures in master
# 2
0
Disabled 4/8/14 after intermittent failures in master
#Scenario: Transcripts are available on different speeds of Flash mode
# Given I am registered for the course "test_course"
# And I have a "subs_OEoXaMPEzfM.srt.sjson" transcript file in assets
...
...
@@ -326,7 +279,7 @@ Feature: LMS.Video component
# Then I select the "1.25" speed
# And I see "Hi, welcome to Edx." text in the captions
# 2
8
Disabled 4/8/14 after intermittent failures in master
# 2
1
Disabled 4/8/14 after intermittent failures in master
#Scenario: Elapsed time calculates correctly on different speeds of Flash mode
# Given I am registered for the course "test_course"
# And I have a "subs_OEoXaMPEzfM.srt.sjson" transcript file in assets
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment