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
fb16e013
Commit
fb16e013
authored
May 27, 2014
by
muhammad-ammar
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #3694 from edx/ammar/bok-choy-video-time-tests
Bok-Choy Video Time Tests
parents
5d03cad7
510d0ae1
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
320 additions
and
112 deletions
+320
-112
common/test/acceptance/pages/lms/video/__init__.py
+0
-0
common/test/acceptance/pages/lms/video/video.py
+97
-4
common/test/acceptance/tests/test_lms.py
+1
-1
common/test/acceptance/tests/video/__init__.py
+0
-0
common/test/acceptance/tests/video/test_video_module.py
+22
-21
common/test/acceptance/tests/video/test_video_times.py
+199
-0
lms/djangoapps/courseware/features/video.feature
+1
-86
No files found.
common/test/acceptance/pages/lms/video/__init__.py
0 → 100644
View file @
fb16e013
common/test/acceptance/pages/lms/video.py
→
common/test/acceptance/pages/lms/video
/video
.py
View file @
fb16e013
...
@@ -72,6 +72,7 @@ class VideoPage(PageObject):
...
@@ -72,6 +72,7 @@ class VideoPage(PageObject):
promise_desc (str): Description of the Promise, used in log messages.
promise_desc (str): Description of the Promise, used in log messages.
"""
"""
def
_is_element_present
():
def
_is_element_present
():
"""
"""
Check if web-element present in DOM.
Check if web-element present in DOM.
...
@@ -182,7 +183,6 @@ class VideoPage(PageObject):
...
@@ -182,7 +183,6 @@ class VideoPage(PageObject):
return
Promise
(
_is_element_present
,
'Video Rendering Failed in {0} mode.'
.
format
(
mode
))
.
fulfill
()
return
Promise
(
_is_element_present
,
'Video Rendering Failed in {0} mode.'
.
format
(
mode
))
.
fulfill
()
@property
def
is_autoplay_enabled
(
self
,
video_display_name
=
None
):
def
is_autoplay_enabled
(
self
,
video_display_name
=
None
):
"""
"""
Extract `data-autoplay` attribute to check video autoplay is enabled or disabled.
Extract `data-autoplay` attribute to check video autoplay is enabled or disabled.
...
@@ -202,7 +202,6 @@ class VideoPage(PageObject):
...
@@ -202,7 +202,6 @@ class VideoPage(PageObject):
return
True
return
True
@property
def
is_error_message_shown
(
self
,
video_display_name
=
None
):
def
is_error_message_shown
(
self
,
video_display_name
=
None
):
"""
"""
Checks if video player error message shown.
Checks if video player error message shown.
...
@@ -231,7 +230,6 @@ class VideoPage(PageObject):
...
@@ -231,7 +230,6 @@ class VideoPage(PageObject):
selector
=
self
.
get_element_selector
(
video_display_name
,
CSS_CLASS_NAMES
[
'video_spinner'
])
selector
=
self
.
get_element_selector
(
video_display_name
,
CSS_CLASS_NAMES
[
'video_spinner'
])
return
self
.
q
(
css
=
selector
)
.
visible
return
self
.
q
(
css
=
selector
)
.
visible
@property
def
error_message_text
(
self
,
video_display_name
=
None
):
def
error_message_text
(
self
,
video_display_name
=
None
):
"""
"""
Extract video player error message text.
Extract video player error message text.
...
@@ -318,7 +316,6 @@ class VideoPage(PageObject):
...
@@ -318,7 +316,6 @@ class VideoPage(PageObject):
EmptyPromise
(
lambda
:
_captions_current_state
()
==
captions_new_state
,
EmptyPromise
(
lambda
:
_captions_current_state
()
==
captions_new_state
,
"Captions are {state}"
.
format
(
state
=
state
))
.
fulfill
()
"Captions are {state}"
.
format
(
state
=
state
))
.
fulfill
()
@property
def
captions_text
(
self
,
video_display_name
=
None
):
def
captions_text
(
self
,
video_display_name
=
None
):
"""
"""
Extract captions text.
Extract captions text.
...
@@ -663,3 +660,99 @@ class VideoPage(PageObject):
...
@@ -663,3 +660,99 @@ class VideoPage(PageObject):
language_names
=
self
.
q
(
css
=
languages_selector
)
.
attrs
(
'textContent'
)
language_names
=
self
.
q
(
css
=
languages_selector
)
.
attrs
(
'textContent'
)
return
dict
(
zip
(
language_codes
,
language_names
))
return
dict
(
zip
(
language_codes
,
language_names
))
def
position
(
self
,
video_display_name
=
None
):
"""
Gets current video slider position.
Arguments:
video_display_name (str or None): Display name of a Video.
Returns:
str: current seek position in format min:sec.
"""
selector
=
self
.
get_element_selector
(
video_display_name
,
CSS_CLASS_NAMES
[
'video_time'
])
current_seek_position
=
self
.
q
(
css
=
selector
)
.
text
[
0
]
return
current_seek_position
.
split
(
'/'
)[
0
]
.
strip
()
def
state
(
self
,
video_display_name
=
None
):
"""
Extract the current state (play, pause etc) of video.
Arguments:
video_display_name (str or None): Display name of a Video.
Returns:
str: current video state
"""
state_selector
=
self
.
get_element_selector
(
video_display_name
,
CSS_CLASS_NAMES
[
'video_container'
])
current_state
=
self
.
q
(
css
=
state_selector
)
.
attrs
(
'class'
)[
0
]
if
'is-playing'
in
current_state
:
return
'playing'
elif
'is-paused'
in
current_state
:
return
'pause'
elif
'is-buffered'
in
current_state
:
return
'buffering'
elif
'is-ended'
in
current_state
:
return
'finished'
def
_wait_for
(
self
,
check_func
,
desc
,
result
=
False
,
timeout
=
200
):
"""
Calls the method provided as an argument until the return value is not False.
Arguments:
check_func (callable): Function that accepts no arguments and returns a boolean indicating whether the promise is fulfilled.
desc (str): Description of the Promise, used in log messages.
timeout (float): Maximum number of seconds to wait for the Promise to be satisfied before timing out.
"""
if
result
:
return
Promise
(
check_func
,
desc
,
timeout
=
timeout
)
.
fulfill
()
else
:
return
EmptyPromise
(
check_func
,
desc
,
timeout
=
timeout
)
.
fulfill
()
def
wait_for_state
(
self
,
state
,
video_display_name
=
None
):
"""
Wait until `state` occurs.
Arguments:
state (str): State we wait for.
video_display_name (str or None): Display name of a Video.
"""
self
.
_wait_for
(
lambda
:
self
.
state
(
video_display_name
)
==
state
,
'State is {state}'
.
format
(
state
=
state
)
)
def
_parse_time_str
(
self
,
time_str
):
"""
Parse a string of the form 1:23 into seconds (int).
Arguments:
time_str (str): seek value
Returns:
int: seek value in seconds
"""
time_obj
=
time
.
strptime
(
time_str
,
'
%
M:
%
S'
)
return
time_obj
.
tm_min
*
60
+
time_obj
.
tm_sec
def
seek
(
self
,
seek_value
,
video_display_name
=
None
):
"""
Seek the video to position specified by `seek_value`.
Arguments:
seek_value (str): seek value
video_display_name (str or None): Display name of a Video.
"""
seek_time
=
self
.
_parse_time_str
(
seek_value
)
seek_selector
=
self
.
get_element_selector
(
video_display_name
,
' .video'
)
js_code
=
"$('{seek_selector}').data('video-player-state').videoPlayer.onSlideSeek({{time: {seek_time}}})"
.
format
(
seek_selector
=
seek_selector
,
seek_time
=
seek_time
)
self
.
browser
.
execute_script
(
js_code
)
common/test/acceptance/tests/test_lms.py
View file @
fb16e013
...
@@ -14,7 +14,7 @@ from ..pages.lms.tab_nav import TabNavPage
...
@@ -14,7 +14,7 @@ from ..pages.lms.tab_nav import TabNavPage
from
..pages.lms.course_nav
import
CourseNavPage
from
..pages.lms.course_nav
import
CourseNavPage
from
..pages.lms.progress
import
ProgressPage
from
..pages.lms.progress
import
ProgressPage
from
..pages.lms.dashboard
import
DashboardPage
from
..pages.lms.dashboard
import
DashboardPage
from
..pages.lms.video
import
VideoPage
from
..pages.lms.video
.video
import
VideoPage
from
..pages.xblock.acid
import
AcidView
from
..pages.xblock.acid
import
AcidView
from
..fixtures.course
import
CourseFixture
,
XBlockFixtureDesc
,
CourseUpdateDesc
from
..fixtures.course
import
CourseFixture
,
XBlockFixtureDesc
,
CourseUpdateDesc
...
...
common/test/acceptance/tests/video/__init__.py
0 → 100644
View file @
fb16e013
common/test/acceptance/tests/test_video_module.py
→
common/test/acceptance/tests/
video/
test_video_module.py
View file @
fb16e013
...
@@ -6,15 +6,16 @@ Acceptance tests for Video.
...
@@ -6,15 +6,16 @@ Acceptance tests for Video.
import
json
import
json
import
requests
import
requests
from
.helpers
import
UniqueCourseTest
from
.
.
helpers
import
UniqueCourseTest
from
..
pages.lms
.video
import
VideoPage
from
..
.pages.lms.video
.video
import
VideoPage
from
..pages.lms.tab_nav
import
TabNavPage
from
..
.
pages.lms.tab_nav
import
TabNavPage
from
..pages.lms.course_nav
import
CourseNavPage
from
..
.
pages.lms.course_nav
import
CourseNavPage
from
..pages.lms.auto_auth
import
AutoAuthPage
from
..
.
pages.lms.auto_auth
import
AutoAuthPage
from
..pages.lms.course_info
import
CourseInfoPage
from
..
.
pages.lms.course_info
import
CourseInfoPage
from
..fixtures.course
import
CourseFixture
,
XBlockFixtureDesc
from
..
.
fixtures.course
import
CourseFixture
,
XBlockFixtureDesc
from
box.test.flaky
import
flaky
from
box.test.flaky
import
flaky
VIDEO_SOURCE_PORT
=
8777
VIDEO_SOURCE_PORT
=
8777
YOUTUBE_STUB_PORT
=
9080
YOUTUBE_STUB_PORT
=
9080
YOUTUBE_STUB_URL
=
'http://127.0.0.1:{}/'
.
format
(
YOUTUBE_STUB_PORT
)
YOUTUBE_STUB_URL
=
'http://127.0.0.1:{}/'
.
format
(
YOUTUBE_STUB_PORT
)
...
@@ -263,7 +264,7 @@ class YouTubeVideoTest(VideoBaseTest):
...
@@ -263,7 +264,7 @@ class YouTubeVideoTest(VideoBaseTest):
# Verify that we see "好 各位同学" text in the captions
# Verify that we see "好 各位同学" text in the captions
unicode_text
=
"好 各位同学"
.
decode
(
'utf-8'
)
unicode_text
=
"好 各位同学"
.
decode
(
'utf-8'
)
self
.
assertIn
(
unicode_text
,
self
.
video
.
captions_text
)
self
.
assertIn
(
unicode_text
,
self
.
video
.
captions_text
()
)
def
test_cc_button_transcripts_and_sub_fields_empty
(
self
):
def
test_cc_button_transcripts_and_sub_fields_empty
(
self
):
"""
"""
...
@@ -278,7 +279,7 @@ class YouTubeVideoTest(VideoBaseTest):
...
@@ -278,7 +279,7 @@ class YouTubeVideoTest(VideoBaseTest):
self
.
video
.
show_captions
()
self
.
video
.
show_captions
()
# Verify that we see "Hi, welcome to Edx." text in the captions
# Verify that we see "Hi, welcome to Edx." text in the captions
self
.
assertIn
(
'Hi, welcome to Edx.'
,
self
.
video
.
captions_text
)
self
.
assertIn
(
'Hi, welcome to Edx.'
,
self
.
video
.
captions_text
()
)
def
test_cc_button_hidden_no_translations
(
self
):
def
test_cc_button_hidden_no_translations
(
self
):
"""
"""
...
@@ -342,7 +343,7 @@ class YouTubeVideoTest(VideoBaseTest):
...
@@ -342,7 +343,7 @@ class YouTubeVideoTest(VideoBaseTest):
self
.
navigate_to_video
()
self
.
navigate_to_video
()
# check if "Hi, welcome to Edx." text in the captions
# check if "Hi, welcome to Edx." text in the captions
self
.
assertIn
(
'Hi, welcome to Edx.'
,
self
.
video
.
captions_text
)
self
.
assertIn
(
'Hi, welcome to Edx.'
,
self
.
video
.
captions_text
()
)
# check if we can download transcript in "srt" format that has text "Hi, welcome to Edx."
# check if we can download transcript in "srt" format that has text "Hi, welcome to Edx."
self
.
assertTrue
(
self
.
video
.
downloaded_transcript_contains_text
(
'srt'
,
'Hi, welcome to Edx.'
))
self
.
assertTrue
(
self
.
video
.
downloaded_transcript_contains_text
(
'srt'
,
'Hi, welcome to Edx.'
))
...
@@ -352,7 +353,7 @@ class YouTubeVideoTest(VideoBaseTest):
...
@@ -352,7 +353,7 @@ class YouTubeVideoTest(VideoBaseTest):
# check if we see "好 各位同学" text in the captions
# check if we see "好 各位同学" text in the captions
unicode_text
=
"好 各位同学"
.
decode
(
'utf-8'
)
unicode_text
=
"好 各位同学"
.
decode
(
'utf-8'
)
self
.
assertIn
(
unicode_text
,
self
.
video
.
captions_text
)
self
.
assertIn
(
unicode_text
,
self
.
video
.
captions_text
()
)
# check if we can download transcript in "srt" format that has text "好 各位同学"
# check if we can download transcript in "srt" format that has text "好 各位同学"
unicode_text
=
"好 各位同学"
.
decode
(
'utf-8'
)
unicode_text
=
"好 各位同学"
.
decode
(
'utf-8'
)
...
@@ -519,10 +520,10 @@ class YouTubeVideoTest(VideoBaseTest):
...
@@ -519,10 +520,10 @@ class YouTubeVideoTest(VideoBaseTest):
self
.
video
.
select_language
(
'zh'
)
self
.
video
.
select_language
(
'zh'
)
unicode_text
=
"好 各位同学"
.
decode
(
'utf-8'
)
unicode_text
=
"好 各位同学"
.
decode
(
'utf-8'
)
self
.
assertIn
(
unicode_text
,
self
.
video
.
captions_text
)
self
.
assertIn
(
unicode_text
,
self
.
video
.
captions_text
()
)
self
.
video
.
select_language
(
'en'
)
self
.
video
.
select_language
(
'en'
)
self
.
assertIn
(
'Hi, welcome to Edx.'
,
self
.
video
.
captions_text
)
self
.
assertIn
(
'Hi, welcome to Edx.'
,
self
.
video
.
captions_text
()
)
class
YouTubeHtml5VideoTest
(
VideoBaseTest
):
class
YouTubeHtml5VideoTest
(
VideoBaseTest
):
...
@@ -562,7 +563,7 @@ class Html5VideoTest(VideoBaseTest):
...
@@ -562,7 +563,7 @@ class Html5VideoTest(VideoBaseTest):
self
.
navigate_to_video
()
self
.
navigate_to_video
()
# Verify that the video has autoplay mode disabled
# Verify that the video has autoplay mode disabled
self
.
assertFalse
(
self
.
video
.
is_autoplay_enabled
)
self
.
assertFalse
(
self
.
video
.
is_autoplay_enabled
()
)
def
test_html5_video_rendering_with_unsupported_sources
(
self
):
def
test_html5_video_rendering_with_unsupported_sources
(
self
):
"""
"""
...
@@ -576,11 +577,11 @@ class Html5VideoTest(VideoBaseTest):
...
@@ -576,11 +577,11 @@ class Html5VideoTest(VideoBaseTest):
self
.
navigate_to_video_no_render
()
self
.
navigate_to_video_no_render
()
# Verify that error message is shown
# Verify that error message is shown
self
.
assertTrue
(
self
.
video
.
is_error_message_shown
)
self
.
assertTrue
(
self
.
video
.
is_error_message_shown
()
)
# Verify that error message has correct text
# Verify that error message has correct text
correct_error_message_text
=
'No playable video sources found.'
correct_error_message_text
=
'No playable video sources found.'
self
.
assertIn
(
correct_error_message_text
,
self
.
video
.
error_message_text
)
self
.
assertIn
(
correct_error_message_text
,
self
.
video
.
error_message_text
()
)
# Verify that spinner is not shown
# Verify that spinner is not shown
self
.
assertFalse
(
self
.
video
.
is_spinner_shown
())
self
.
assertFalse
(
self
.
video
.
is_spinner_shown
())
...
@@ -603,7 +604,7 @@ class Html5VideoTest(VideoBaseTest):
...
@@ -603,7 +604,7 @@ class Html5VideoTest(VideoBaseTest):
# check if we see "好 各位同学" text in the captions
# check if we see "好 各位同学" text in the captions
unicode_text
=
"好 各位同学"
.
decode
(
'utf-8'
)
unicode_text
=
"好 各位同学"
.
decode
(
'utf-8'
)
self
.
assertIn
(
unicode_text
,
self
.
video
.
captions_text
)
self
.
assertIn
(
unicode_text
,
self
.
video
.
captions_text
()
)
# check if we can download transcript in "srt" format that has text "好 各位同学"
# check if we can download transcript in "srt" format that has text "好 各位同学"
unicode_text
=
"好 各位同学"
.
decode
(
'utf-8'
)
unicode_text
=
"好 各位同学"
.
decode
(
'utf-8'
)
...
@@ -628,7 +629,7 @@ class Html5VideoTest(VideoBaseTest):
...
@@ -628,7 +629,7 @@ class Html5VideoTest(VideoBaseTest):
self
.
navigate_to_video
()
self
.
navigate_to_video
()
# check if "Hi, welcome to Edx." text in the captions
# check if "Hi, welcome to Edx." text in the captions
self
.
assertIn
(
'Hi, welcome to Edx.'
,
self
.
video
.
captions_text
)
self
.
assertIn
(
'Hi, welcome to Edx.'
,
self
.
video
.
captions_text
()
)
# check if we can download transcript in "srt" format that has text "Hi, welcome to Edx."
# check if we can download transcript in "srt" format that has text "Hi, welcome to Edx."
self
.
assertTrue
(
self
.
video
.
downloaded_transcript_contains_text
(
'srt'
,
'Hi, welcome to Edx.'
))
self
.
assertTrue
(
self
.
video
.
downloaded_transcript_contains_text
(
'srt'
,
'Hi, welcome to Edx.'
))
...
@@ -639,7 +640,7 @@ class Html5VideoTest(VideoBaseTest):
...
@@ -639,7 +640,7 @@ class Html5VideoTest(VideoBaseTest):
# check if we see "好 各位同学" text in the captions
# check if we see "好 各位同学" text in the captions
unicode_text
=
"好 各位同学"
.
decode
(
'utf-8'
)
unicode_text
=
"好 各位同学"
.
decode
(
'utf-8'
)
self
.
assertIn
(
unicode_text
,
self
.
video
.
captions_text
)
self
.
assertIn
(
unicode_text
,
self
.
video
.
captions_text
()
)
#Then I can download transcript in "srt" format that has text "好 各位同学"
#Then I can download transcript in "srt" format that has text "好 各位同学"
unicode_text
=
"好 各位同学"
.
decode
(
'utf-8'
)
unicode_text
=
"好 各位同学"
.
decode
(
'utf-8'
)
...
@@ -690,7 +691,7 @@ class Html5VideoTest(VideoBaseTest):
...
@@ -690,7 +691,7 @@ class Html5VideoTest(VideoBaseTest):
self
.
video
.
show_captions
()
self
.
video
.
show_captions
()
# check if we see "Hi, welcome to Edx." text in the captions
# check if we see "Hi, welcome to Edx." text in the captions
self
.
assertIn
(
"Hi, welcome to Edx."
,
self
.
video
.
captions_text
)
self
.
assertIn
(
"Hi, welcome to Edx."
,
self
.
video
.
captions_text
()
)
def
test_cc_button_wo_english_transcript
(
self
):
def
test_cc_button_wo_english_transcript
(
self
):
"""
"""
...
@@ -712,7 +713,7 @@ class Html5VideoTest(VideoBaseTest):
...
@@ -712,7 +713,7 @@ class Html5VideoTest(VideoBaseTest):
# check if we see "好 各位同学" text in the captions
# check if we see "好 各位同学" text in the captions
unicode_text
=
"好 各位同学"
.
decode
(
'utf-8'
)
unicode_text
=
"好 各位同学"
.
decode
(
'utf-8'
)
self
.
assertIn
(
unicode_text
,
self
.
video
.
captions_text
)
self
.
assertIn
(
unicode_text
,
self
.
video
.
captions_text
()
)
def
test_video_rendering
(
self
):
def
test_video_rendering
(
self
):
"""
"""
...
...
common/test/acceptance/tests/video/test_video_times.py
0 → 100644
View file @
fb16e013
"""
Acceptance tests for Video Times(Start, End and Finish) functionality.
"""
from
.test_video_module
import
VideoBaseTest
class
VideoTimesTest
(
VideoBaseTest
):
""" Test Video Player Times """
def
setUp
(
self
):
super
(
VideoTimesTest
,
self
)
.
setUp
()
def
test_video_start_time
(
self
):
"""
Scenario: Start time works for Youtube video
Given we have a video in "Youtube" mode with start_time set to 00:00:10
And I see video slider at "0:10" position
And I click video button "play"
Then video starts playing at or after start_time(00:00:10)
"""
data
=
{
'start_time'
:
'00:00:10'
}
self
.
metadata
=
self
.
metadata_for_mode
(
'youtube'
,
additional_data
=
data
)
# go to video
self
.
navigate_to_video
()
self
.
assertEqual
(
self
.
video
.
position
(),
'0:10'
)
self
.
video
.
click_player_button
(
'play'
)
self
.
assertGreaterEqual
(
int
(
self
.
video
.
position
()
.
split
(
':'
)[
1
]),
10
)
def
test_video_end_time_with_default_start_time
(
self
):
"""
Scenario: End time works for Youtube video if starts playing from beginning.
Given we have a video in "Youtube" mode with end time set to 00:00:02
And I click video button "play"
And I wait until video stop playing
Then I see video slider at "0:02" position
"""
data
=
{
'end_time'
:
'00:00:02'
}
self
.
metadata
=
self
.
metadata_for_mode
(
'youtube'
,
additional_data
=
data
)
# go to video
self
.
navigate_to_video
()
self
.
video
.
click_player_button
(
'play'
)
# wait until video stop playing
self
.
video
.
wait_for_state
(
'pause'
)
self
.
assertEqual
(
self
.
video
.
position
(),
'0:02'
)
def
test_video_end_time_wo_default_start_time
(
self
):
"""
Scenario: End time works for Youtube video if starts playing from between.
Given we have a video in "Youtube" mode with end time set to 00:01:00
And I seek video to "0:55" position
And I click video button "play"
And I wait until video stop playing
Then I see video slider at "1:00" position
"""
data
=
{
'end_time'
:
'00:01:00'
}
self
.
metadata
=
self
.
metadata_for_mode
(
'youtube'
,
additional_data
=
data
)
# go to video
self
.
navigate_to_video
()
self
.
video
.
seek
(
'0:55'
)
self
.
video
.
click_player_button
(
'play'
)
# wait until video stop playing
self
.
video
.
wait_for_state
(
'pause'
)
self
.
assertEqual
(
self
.
video
.
position
(),
'1:00'
)
def
test_video_start_time_and_end_time
(
self
):
"""
Scenario: Start time and end time work together for Youtube video.
Given we a video in "Youtube" mode with start time set to 00:00:10 and end_time set to 00:00:12
And I see video slider at "0:10" position
And I click video button "play"
Then I wait until video stop playing
Then I see video slider at "0:12" position
"""
data
=
{
'start_time'
:
'00:00:10'
,
'end_time'
:
'00:00:12'
}
self
.
metadata
=
self
.
metadata_for_mode
(
'youtube'
,
additional_data
=
data
)
# go to video
self
.
navigate_to_video
()
self
.
assertEqual
(
self
.
video
.
position
(),
'0:10'
)
self
.
video
.
click_player_button
(
'play'
)
# wait until video stop playing
self
.
video
.
wait_for_state
(
'pause'
)
self
.
assertEqual
(
self
.
video
.
position
(),
'0:12'
)
def
test_video_end_time_and_finish_time
(
self
):
"""
Scenario: Youtube video works after pausing at end time and then plays again from End Time to the end.
Given we have a video in "Youtube" mode with start time set to 00:01:41 and end_time set to 00:01:42
And I click video button "play"
And I wait until video stop playing
Then I see video slider at "1:42" position
And I click video button "play"
And I wait until video stop playing
Then I see video slider at "1:54" position
# NOTE: The above video duration(1:54) is disputed because
# 1. Our Video Player first shows Video Duration equals to 1 minute and 56 sec and then 1 minute and 54 sec
# 2 YouTube first shows duration of 1 minute and 56 seconds and then changes duration to 1 minute and 55 sec
#
# The 1:56 time is the duration from metadata. 1:54 time is the duration reported by the video API once
# the video starts playing. BUT sometime video API gives duration equals 1 minute and 55 second.
"""
data
=
{
'start_time'
:
'00:01:41'
,
'end_time'
:
'00:01:42'
}
self
.
metadata
=
self
.
metadata_for_mode
(
'youtube'
,
additional_data
=
data
)
# go to video
self
.
navigate_to_video
()
self
.
video
.
click_player_button
(
'play'
)
# wait until video stop playing
self
.
video
.
wait_for_state
(
'pause'
)
self
.
assertEqual
(
self
.
video
.
position
(),
'1:42'
)
self
.
video
.
click_player_button
(
'play'
)
# wait until video stop playing
self
.
video
.
wait_for_state
(
'finished'
)
self
.
assertIn
(
self
.
video
.
position
(),
[
'1:54'
,
'1:55'
])
def
test_video_end_time_with_seek
(
self
):
"""
Scenario: End Time works for Youtube Video if starts playing before Start Time.
Given we have a video in "Youtube" mode with end-time at 0:32 and start-time at 0:30
And I seek video to "0:28" position
And I click video button "play"
And I wait until video stop playing
Then I see video slider at "0:32" position
"""
data
=
{
'start_time'
:
'00:00:30'
,
'end_time'
:
'00:00:32'
}
self
.
metadata
=
self
.
metadata_for_mode
(
'youtube'
,
additional_data
=
data
)
# go to video
self
.
navigate_to_video
()
self
.
video
.
seek
(
'0:28'
)
self
.
video
.
click_player_button
(
'play'
)
# wait until video stop playing
self
.
video
.
wait_for_state
(
'pause'
)
self
.
assertEqual
(
self
.
video
.
position
(),
'0:32'
)
def
test_video_finish_time_with_seek
(
self
):
"""
Scenario: Finish Time works for Youtube video.
Given it has a video in "Youtube" mode with end-time at 1:00, the video starts playing from 1:42
And I seek video to "1:42" position
And I click video button "play"
And I wait until video stop playing
Then I see video slider at "1:54" position
# NOTE: The above video duration(1:54) is disputed because
# 1. Our Video Player first shows Video Duration equals to 1 minute and 56 sec and then 1 minute and 54 sec
# 2 YouTube first shows duration of 1 minute and 56 seconds and then changes duration to 1 minute and 55 sec
#
# The 1:56 time is the duration from metadata. 1:54 time is the duration reported by the video API once
# the video starts playing. BUT sometime video API gives duration equals 1 minute and 55 second.
"""
data
=
{
'end_time'
:
'00:01:00'
}
self
.
metadata
=
self
.
metadata_for_mode
(
'youtube'
,
additional_data
=
data
)
# go to video
self
.
navigate_to_video
()
self
.
video
.
seek
(
'1:42'
)
self
.
video
.
click_player_button
(
'play'
)
# wait until video stop playing
self
.
video
.
wait_for_state
(
'finished'
)
self
.
assertIn
(
self
.
video
.
position
(),
[
'1:54'
,
'1:55'
])
lms/djangoapps/courseware/features/video.feature
View file @
fb16e013
...
@@ -93,92 +93,7 @@ Feature: LMS.Video component
...
@@ -93,92 +93,7 @@ Feature: LMS.Video component
Then
the video has rendered in
"HTML5"
mode
Then
the video has rendered in
"HTML5"
mode
And
the video does not show the captions
And
the video does not show the captions
# Disabling because this test is not reliable and needs to be improved.
# Sometimes by the time it checks the video slider is at 10,
# it is actually at 11, so the test fails.
# 10
# Scenario: Start time works for Youtube video
# Given I am registered for the course "test_course"
# And it has a video in "Youtube" mode:
# | start_time |
# | 00:00:10 |
# And I click video button "play"
# Then I see video slider at "0:10" position
# 4
# 4
Scenario
:
End time works for Youtube video
Given
I am registered for the course
"test_course"
And it has a video in "Youtube" mode
:
|
end_time
|
|
00:00:02
|
And
I click video button
"play"
And
I wait
"5"
seconds
Then I see video slider at "0
:
02"
position
# 5
Scenario
:
Youtube video with end-time at 1
:
00 and the video starts playing at 0
:
58
Given
I am registered for the course
"test_course"
And it has a video in "Youtube" mode
:
|
end_time
|
|
00:01:00
|
And
I wait for video controls appear
And I seek video to "0
:
58"
position
And
I click video button
"play"
And
I wait
"5"
seconds
Then I see video slider at "1
:
00"
position
# 6
Scenario
:
Start time and end time work together for Youtube video
Given
I am registered for the course
"test_course"
And it has a video in "Youtube" mode
:
|
start_time
|
end_time
|
|
00:00:10
|
00:00:12
|
And
I click video button
"play"
Then I see video slider at "0
:
10"
position
And
I wait
"5"
seconds
Then I see video slider at "0
:
12"
position
# 7
Scenario
:
Youtube video after pausing at end time video plays to the end from end time
Given
I am registered for the course
"test_course"
And it has a video in "Youtube" mode
:
|
start_time
|
end_time
|
|
00:01:51
|
00:01:52
|
And
I click video button
"play"
And
I wait
"5"
seconds
# The end time is 00:01:52.
Then I see video slider at "1
:
52"
position
And
I click video button
"play"
And
I wait
"8"
seconds
# The default video length is 00:01:55.
Then I see video slider at "1
:
55"
position
# 8
Scenario
:
Youtube video with end-time at 0
:
32 and start-time at 0
:
30, the video starts playing from 0
:
28
Given
I am registered for the course
"test_course"
And it has a video in "Youtube" mode
:
|
start_time
|
end_time
|
|
00:00:30
|
00:00:32
|
And
I wait for video controls appear
And I seek video to "0
:
28"
position
And
I click video button
"play"
And
I wait
"8"
seconds
Then I see video slider at "0
:
32"
position
# 9
Scenario
:
Youtube video with end-time at 1
:
00, the video starts playing from 1
:
52
Given
I am registered for the course
"test_course"
And it has a video in "Youtube" mode
:
|
end_time
|
|
00:01:00
|
And
I wait for video controls appear
And I seek video to "1
:
52"
position
And
I click video button
"play"
And
I wait
"5"
seconds
# Video stops at the end.
Then I see video slider at "1
:
55"
position
# 10
@skip_firefox
@skip_firefox
Scenario
:
Quality button appears on play
Scenario
:
Quality button appears on play
Given
the course has a Video component in
"Youtube"
mode
Given
the course has a Video component in
"Youtube"
mode
...
@@ -186,7 +101,7 @@ Feature: LMS.Video component
...
@@ -186,7 +101,7 @@ Feature: LMS.Video component
And
I click video button
"play"
And
I click video button
"play"
Then
I see video button
"quality"
is visible
Then
I see video button
"quality"
is visible
#
11
#
5
@skip_firefox
@skip_firefox
Scenario
:
Quality button works correctly
Scenario
:
Quality button works correctly
Given
the course has a Video component in
"Youtube"
mode
Given
the course has a Video component in
"Youtube"
mode
...
...
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