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
da828cdf
Commit
da828cdf
authored
Mar 18, 2016
by
Sanford Student
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
MA-2164 cleaning up old lettuce
parent
f3d000ec
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
1 additions
and
526 deletions
+1
-526
cms/djangoapps/contentstore/features/course-export.feature
+0
-12
cms/djangoapps/contentstore/features/course-export.py
+0
-71
cms/djangoapps/contentstore/features/problem-editor.feature
+0
-24
cms/djangoapps/contentstore/features/video.feature
+0
-57
cms/djangoapps/contentstore/features/video_editor.py
+0
-321
cms/djangoapps/contentstore/features/video_handout.py
+0
-40
lms/djangoapps/courseware/tests/test_video_mongo.py
+1
-1
No files found.
cms/djangoapps/contentstore/features/course-export.feature
deleted
100644 → 0
View file @
f3d000ec
@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
cms/djangoapps/contentstore/features/course-export.py
deleted
100644 → 0
View file @
f3d000ec
# 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
,
"""<problem><h1>Smallest Canvas</h1>
<p>You want to make the smallest canvas you can.</p>
<multiplechoiceresponse>
<choicegroup type="MultipleChoice">
<choice correct="false"><verbatim><canvas id="myCanvas" width = 10 height = 100> </canvas></verbatim></choice>
<choice correct="true"><code><canvas id="myCanvas" width = 10 height = 10> </canvas></code></choice>
</choicegroup>
</multiplechoiceresponse>
</problem>"""
)
@step
(
'I edit and enter an ampersand$'
)
def
i_enter_an_ampersand
(
step
):
enter_xml_in_advanced_problem
(
step
,
"<problem>&</problem>"
)
@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
))
cms/djangoapps/contentstore/features/problem-editor.feature
View file @
da828cdf
...
...
@@ -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
cms/djangoapps/contentstore/features/video.feature
deleted
100644 → 0
View file @
f3d000ec
@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
cms/djangoapps/contentstore/features/video_editor.py
deleted
100644 → 0
View file @
f3d000ec
# -*- 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
)
cms/djangoapps/contentstore/features/video_handout.py
deleted
100644 → 0
View file @
f3d000ec
# -*- 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
))
lms/djangoapps/courseware/tests/test_video_mongo.py
View file @
da828cdf
...
...
@@ -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 i
s
VAL so in contexts that do and don't allow cache misses we should always get a fallback
# The video is not i
n
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
)
...
...
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