test_deliver_cielo.py 6.36 KB
Newer Older
1 2 3
"""
Cielo24 transcription testing
"""
muhammad-ammar committed
4
from django.test import TestCase
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192

import responses
from ddt import ddt
from mock import patch

from control.veda_deliver_cielo import Cielo24Transcript
from VEDA_OS01.models import (Cielo24Fidelity, Cielo24Turnaround, Course,
                              TranscriptProcessMetadata, TranscriptStatus,
                              Video)
from VEDA_OS01.utils import build_url

VIDEO_DATA = {
    'studio_id': '12345'
}


@ddt
class Cielo24TranscriptTests(TestCase):
    """
    Cielo24 transcription tests
    """
    def setUp(self):
        """
        Tests setup
        """
        self.course = Course.objects.create(
            course_name='Intro to VEDA',
            institution='MAx',
            edx_classid='123'
        )

        self.video = Video.objects.create(
            inst_class=self.course,
            **VIDEO_DATA
        )

        self.video_transcript_preferences = {
            'org': 'MAx',
            'api_key': 'cielo24_api_key',
            'turnaround': Cielo24Turnaround.PRIORITY,
            'fidelity': Cielo24Fidelity.PROFESSIONAL,
            'preferred_languages': ['en', 'ur'],
            's3_video_url': 'https://s3.amazonaws.com/bkt/video.mp4',
            'callback_base_url': 'https://veda.edx.org/cielo24/transcript_completed/1234567890',
        }

    def tearDown(self):
        """
        Test cleanup
        """
        TranscriptProcessMetadata.objects.all().delete()

    def cielo24_url(self, cielo24, endpoint):
        """
        Return absolute url

        Arguments:
            cielo24 (Cielo24Transcript), object
            endpoint (srt): url endpoint

        Returns:
            absolute url
        """
        return build_url(cielo24.cielo24_site, endpoint)

    def assert_request(self, received_request, expected_request):
        """
        Verify that `received_request` matches `expected_request`
        """
        self.assertEqual(received_request.method, expected_request['method'])
        self.assertEqual(received_request.url, expected_request['url'])
        self.assertEqual(received_request.body, expected_request['body'])

    @responses.activate
    def test_transcript_flow(self):
        """
        Verify cielo24 transcription flow
        """
        job_id = '000-111-222'

        cielo24 = Cielo24Transcript(
            video=self.video,
            **self.video_transcript_preferences
        )

        responses.add(
            responses.GET,
            self.cielo24_url(cielo24, cielo24.cielo24_new_job),
            body={'JobId': job_id},
            status=200
        )
        responses.add(
            responses.GET,
            self.cielo24_url(cielo24, cielo24.cielo24_add_media),
            body={'TaskId': '000-000-111'},
            status=200
        )
        responses.add(
            responses.GET,
            self.cielo24_url(cielo24, cielo24.cielo24_perform_transcription),
            body={'TaskId': '000-000-000'},
            status=200
        )

        cielo24.start_transcription_flow()

        # Total of 6 HTTP requests are made
        # 3 cielo24 requests for first language(en)
        # 3 cielo24 requests for second language(ur)
        self.assertEqual(len(responses.calls), 6)

        # pylint: disable=line-too-long
        expected_data = [
            {
                'url': 'https://api.cielo24.com/api/job/new?api_token=cielo24_api_key&job_name=12345&language=en&v=1',
                'body': None,
                'method': 'GET'
            },
            {
                'url': 'https://api.cielo24.com/api/job/add_media?media_url=https%253A%252F%252Fs3.amazonaws.com%252Fbkt%252Fvideo.mp4&api_token=cielo24_api_key&job_id=000-111-222&v=1',
                'body': None,
                'method': 'GET'
            },
            {
                'url': 'https://api.cielo24.com/api/job/perform_transcription?transcription_fidelity=PROFESSIONAL&job_id=000-111-222&v=1&priority=PRIORITY&api_token=cielo24_api_key&callback_url=https%253A%252F%252Fveda.edx.org%252Fcielo24%252Ftranscript_completed%252F1234567890%253Flang_code%253D{}%2526video_id%253D12345%2526job_id%253D000-111-222%2526org%253DMAx&target_language={}',
                'body': None,
                'method': 'GET'
            }
        ]

        received_request_index = 0
        for preferred_language in self.video_transcript_preferences['preferred_languages']:
            for request_data in expected_data:
                # replace target language with appropriate value
                if 'api/job/perform_transcription' in request_data['url']:
                    request_data = dict(request_data)
                    request_data['url'] = request_data['url'].format(preferred_language, preferred_language)

                self.assert_request(
                    responses.calls[received_request_index].request,
                    request_data
                )
                received_request_index += 1

    @patch('control.veda_deliver_cielo.LOGGER')
    @responses.activate
    def test_transcript_flow_exceptions(self, mock_logger):
        """
        Verify that cielo24 transcription flow works as expected in case of bad response from cielo24
        """
        job_id = '010-010-010'
        bad_request_message = 'Bad request data'

        preferences = dict(self.video_transcript_preferences)
        preferences['preferred_languages'] = ['en']
        cielo24 = Cielo24Transcript(
            video=self.video,
            **preferences
        )

        responses.add(
            responses.GET,
            self.cielo24_url(cielo24, cielo24.cielo24_new_job),
            body={'JobId': job_id},
            status=200
        )
        responses.add(
            responses.GET,
            self.cielo24_url(cielo24, cielo24.cielo24_add_media),
            body=bad_request_message,
            status=400
        )

        cielo24.start_transcription_flow()

        mock_logger.exception.assert_called_with(
            '[CIELO24] Request failed for video=%s -- lang=%s -- job_id=%s',
            self.video.studio_id,
            preferences['preferred_languages'][0],
            job_id
        )

        # Total of 2 HTTP requests are made for2 cielo24
        self.assertEqual(len(responses.calls), 2)

        process_metadata = TranscriptProcessMetadata.objects.all()
        self.assertEqual(process_metadata.count(), 1)
        self.assertEqual(process_metadata.first().status, TranscriptStatus.FAILED)