Commit 04eff800 by Shrhawk

Merge pull request #8495 from…

Merge pull request #8495 from edx/shr/bug/tnl-2122-fix-show-enable-import-from-youtube-transcript-button

add name param check_transcripts
parents f73b68d6 c9778a5f
...@@ -18,6 +18,7 @@ from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase ...@@ -18,6 +18,7 @@ from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
from xmodule.exceptions import NotFoundError from xmodule.exceptions import NotFoundError
from xmodule.contentstore.django import contentstore from xmodule.contentstore.django import contentstore
from xmodule.video_module import transcripts_utils from xmodule.video_module import transcripts_utils
from contentstore.tests.utils import mock_requests_get
TEST_DATA_CONTENTSTORE = copy.deepcopy(settings.CONTENTSTORE) TEST_DATA_CONTENTSTORE = copy.deepcopy(settings.CONTENTSTORE)
TEST_DATA_CONTENTSTORE['DOC_STORE_CONFIG']['db'] = 'test_xcontent_%s' % uuid4().hex TEST_DATA_CONTENTSTORE['DOC_STORE_CONFIG']['db'] = 'test_xcontent_%s' % uuid4().hex
...@@ -321,36 +322,7 @@ class TestDownloadYoutubeSubs(ModuleStoreTestCase): ...@@ -321,36 +322,7 @@ class TestDownloadYoutubeSubs(ModuleStoreTestCase):
transcript_name = transcripts_utils.youtube_video_transcript_name(youtube_text_api) transcript_name = transcripts_utils.youtube_video_transcript_name(youtube_text_api)
self.assertIsNone(transcript_name) self.assertIsNone(transcript_name)
def mocked_requests_get(*args, **kwargs): @patch('xmodule.video_module.transcripts_utils.requests.get', side_effect=mock_requests_get)
"""
This method will be used by the mock to replace requests.get
"""
# pylint: disable=no-method-argument
response_transcript_list = """
<transcript_list>
<track id="1" name="Custom" lang_code="en" />
<track id="0" name="Custom1" lang_code="en-GB"/>
</transcript_list>
"""
response_transcript = textwrap.dedent("""
<transcript>
<text start="0" dur="0.27"></text>
<text start="0.27" dur="2.45">Test text 1.</text>
<text start="2.72">Test text 2.</text>
<text start="5.43" dur="1.73">Test text 3.</text>
</transcript>
""")
if kwargs == {'params': {'lang': 'en', 'v': 'good_id_2'}}:
return Mock(status_code=200, text='')
elif kwargs == {'params': {'type': 'list', 'v': 'good_id_2'}}:
return Mock(status_code=200, text=response_transcript_list, content=response_transcript_list)
elif kwargs == {'params': {'lang': 'en', 'v': 'good_id_2', 'name': 'Custom'}}:
return Mock(status_code=200, text=response_transcript, content=response_transcript)
return Mock(status_code=404, text='')
@patch('xmodule.video_module.transcripts_utils.requests.get', side_effect=mocked_requests_get)
def test_downloading_subs_using_transcript_name(self, mock_get): def test_downloading_subs_using_transcript_name(self, mock_get):
""" """
Download transcript using transcript name in url Download transcript using transcript name in url
......
...@@ -3,6 +3,8 @@ ...@@ -3,6 +3,8 @@
Utilities for contentstore tests Utilities for contentstore tests
''' '''
import json import json
import textwrap
from mock import Mock
from django.conf import settings from django.conf import settings
from django.contrib.auth.models import User from django.contrib.auth.models import User
...@@ -375,6 +377,35 @@ class CourseTestCase(ModuleStoreTestCase): ...@@ -375,6 +377,35 @@ class CourseTestCase(ModuleStoreTestCase):
self.assertEqual(value, course2_asset_attrs[key]) self.assertEqual(value, course2_asset_attrs[key])
def mock_requests_get(*args, **kwargs):
"""
Returns mock responses for the youtube API.
"""
# pylint: disable=unused-argument
response_transcript_list = """
<transcript_list>
<track id="1" name="Custom" lang_code="en" />
<track id="0" name="Custom1" lang_code="en-GB"/>
</transcript_list>
"""
response_transcript = textwrap.dedent("""
<transcript>
<text start="100" dur="100">subs #1</text>
<text start="200" dur="40">subs #2</text>
<text start="240" dur="140">subs #3</text>
</transcript>
""")
if kwargs == {'params': {'lang': 'en', 'v': 'good_id_2'}}:
return Mock(status_code=200, text='')
elif kwargs == {'params': {'type': 'list', 'v': 'good_id_2'}}:
return Mock(status_code=200, text=response_transcript_list, content=response_transcript_list)
elif kwargs == {'params': {'lang': 'en', 'v': 'good_id_2', 'name': 'Custom'}}:
return Mock(status_code=200, text=response_transcript, content=response_transcript)
return Mock(status_code=404, text='')
def get_url(handler_name, key_value, key_name='usage_key_string', kwargs=None): def get_url(handler_name, key_value, key_name='usage_key_string', kwargs=None):
""" """
Helper function for getting HTML for a page in Studio and checking that it does not error. Helper function for getting HTML for a page in Studio and checking that it does not error.
......
...@@ -6,12 +6,13 @@ import os ...@@ -6,12 +6,13 @@ import os
import tempfile import tempfile
import textwrap import textwrap
from uuid import uuid4 from uuid import uuid4
from mock import patch
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.test.utils import override_settings from django.test.utils import override_settings
from django.conf import settings from django.conf import settings
from contentstore.tests.utils import CourseTestCase from contentstore.tests.utils import CourseTestCase, mock_requests_get
from cache_toolbox.core import del_cached_content from cache_toolbox.core import del_cached_content
from xmodule.modulestore.django import modulestore from xmodule.modulestore.django import modulestore
from xmodule.contentstore.django import contentstore from xmodule.contentstore.django import contentstore
...@@ -628,6 +629,58 @@ class TestCheckTranscripts(BaseTranscripts): ...@@ -628,6 +629,58 @@ class TestCheckTranscripts(BaseTranscripts):
} }
) )
@patch('xmodule.video_module.transcripts_utils.requests.get', side_effect=mock_requests_get)
def test_check_youtube_with_transcript_name(self, mock_get):
"""
Test that the transcripts are fetched correctly when the the transcript name is set
"""
self.item.data = '<video youtube="good_id_2" />'
modulestore().update_item(self.item, self.user.id)
subs = {
'start': [100, 200, 240],
'end': [200, 240, 380],
'text': [
'subs #1',
'subs #2',
'subs #3'
]
}
self.save_subs_to_store(subs, 'good_id_2')
link = reverse('check_transcripts')
data = {
'locator': unicode(self.video_usage_key),
'videos': [{
'type': 'youtube',
'video': 'good_id_2',
'mode': 'youtube',
}]
}
resp = self.client.get(link, {'data': json.dumps(data)})
mock_get.assert_any_call(
'http://video.google.com/timedtext',
params={'lang': 'en', 'v': 'good_id_2', 'name': 'Custom'}
)
self.assertEqual(resp.status_code, 200)
self.assertDictEqual(
json.loads(resp.content),
{
u'status': u'Success',
u'subs': u'good_id_2',
u'youtube_local': True,
u'is_youtube_mode': True,
u'youtube_server': True,
u'command': u'replace',
u'current_item_subs': None,
u'youtube_diff': True,
u'html5_local': [],
u'html5_equal': False,
}
)
def test_fail_data_without_id(self): def test_fail_data_without_id(self):
link = reverse('check_transcripts') link = reverse('check_transcripts')
data = { data = {
......
...@@ -35,7 +35,8 @@ from xmodule.video_module.transcripts_utils import ( ...@@ -35,7 +35,8 @@ from xmodule.video_module.transcripts_utils import (
copy_or_rename_transcript, copy_or_rename_transcript,
manage_video_subtitles_save, manage_video_subtitles_save,
GetTranscriptsFromYouTubeException, GetTranscriptsFromYouTubeException,
TranscriptsRequestValidationException TranscriptsRequestValidationException,
youtube_video_transcript_name,
) )
from student.auth import has_course_author_access from student.auth import has_course_author_access
...@@ -251,6 +252,9 @@ def check_transcripts(request): ...@@ -251,6 +252,9 @@ def check_transcripts(request):
# youtube server # youtube server
youtube_text_api = copy.deepcopy(settings.YOUTUBE['TEXT_API']) youtube_text_api = copy.deepcopy(settings.YOUTUBE['TEXT_API'])
youtube_text_api['params']['v'] = youtube_id youtube_text_api['params']['v'] = youtube_id
youtube_transcript_name = youtube_video_transcript_name(youtube_text_api)
if youtube_transcript_name:
youtube_text_api['params']['name'] = youtube_transcript_name
youtube_response = requests.get('http://' + youtube_text_api['url'], params=youtube_text_api['params']) youtube_response = requests.get('http://' + youtube_text_api['url'], params=youtube_text_api['params'])
if youtube_response.status_code == 200 and youtube_response.text: if youtube_response.status_code == 200 and youtube_response.text:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment