From b90748c17bc8724819e55affe8dad15c02dd792a Mon Sep 17 00:00:00 2001 From: thenav56 Date: Wed, 5 Jul 2023 12:05:10 +0545 Subject: [PATCH] Update logic for new translation API --- lang/tests.py | 47 +++++++++++++++++++++++++++++++++++++++++++++ lang/translation.py | 20 +++++++++++-------- main/settings.py | 10 ++++++---- 3 files changed, 65 insertions(+), 12 deletions(-) diff --git a/lang/tests.py b/lang/tests.py index 83730dc29..68d20e77c 100644 --- a/lang/tests.py +++ b/lang/tests.py @@ -1,8 +1,14 @@ +import unittest +from unittest import mock + +from django.test import override_settings from django.conf import settings from django.core import management from django.contrib.auth.models import User, Permission from main.test_case import APITestCase +from lang.translation import IfrcTranslator + from .serializers import LanguageBulkActionSerializer from .models import String @@ -153,3 +159,44 @@ def test_lang_api_permissions(self): self.authenticate(user) resp = self.client.post(f'/api/v2/language/{language}/bulk-action/', data, format='json') self.assertEqual(resp.status_code, 200) + + +class TranslatorMockTest(unittest.TestCase): + + @mock.patch('lang.translation.requests') + def test_ifrc_translator(self, requests_mock): + # Simple mock test where we define what the expected response is from provider + requests_mock.post.return_value.json.return_value = [{ + "detectedLanguage": {"language": "en", "score": 1}, + "translations": [{"text": "Hola", "to": "es"}] + }] + + # Without valid settings provided + for settings_params in [ + dict(), + dict( + IFRC_TRANSLATION_GET_API_KEY='dummy-api-param-key', + IFRC_TRANSLATION_HEADER_API_KEY='dummy-api-header-key', + ), + dict(IFRC_TRANSLATION_HEADER_API_KEY='dummy-api-header-key'), + ]: + with override_settings( + AUTO_TRANSLATION_TRANSLATOR='lang.translation.IfrcTranslator', + **settings_params, + ): + with self.assertRaises(Exception): + IfrcTranslator() + + # With valid settings provided + with override_settings( + AUTO_TRANSLATION_TRANSLATOR='lang.translation.IfrcTranslator', + IFRC_TRANSLATION_DOMAIN='http://example.org', + IFRC_TRANSLATION_GET_API_KEY='dummy-api-param-key', + IFRC_TRANSLATION_HEADER_API_KEY='dummy-api-header-key', + ): + # with settings.TESTING True + ifrc_translator = IfrcTranslator() + assert ifrc_translator.translate_text('hello', 'es') == 'hello translated to "es" using source language "None"' + # with settings.TESTING False + with override_settings(TESTING=False): + assert ifrc_translator.translate_text('hello', 'es') == "Hola" diff --git a/lang/translation.py b/lang/translation.py index 24c0a4808..804bc3289 100644 --- a/lang/translation.py +++ b/lang/translation.py @@ -65,21 +65,24 @@ class IfrcTranslator(BaseTranslator): """ IFRC Translator helper """ + domain: str url: str params: dict def __init__(self): - if settings.TESTING: - return - if ( - not settings.IFRC_TRANSLATION_URL or - not settings.IFRC_TRANSLATION_API_KEY + not settings.IFRC_TRANSLATION_DOMAIN or + not settings.IFRC_TRANSLATION_GET_API_KEY or + not settings.IFRC_TRANSLATION_HEADER_API_KEY ): raise Exception('Translation configuration missing') - self.url = settings.IFRC_TRANSLATION_URL + self.domain = settings.IFRC_TRANSLATION_DOMAIN.strip('/') + self.url = f'{self.domain}/TranslationV2_API/api/Home/Translate' + self.headers = { + 'X-API-KEY': settings.IFRC_TRANSLATION_HEADER_API_KEY, + } self.params = dict( - apiKey=settings.IFRC_TRANSLATION_API_KEY + apiKey=settings.IFRC_TRANSLATION_GET_API_KEY ) def translate_text(self, text, dest_language, source_language=None): @@ -93,10 +96,11 @@ def translate_text(self, text, dest_language, source_language=None): } response = requests.post( self.url, + headers=self.headers, params=self.params, json=payload, ) - return response.json()[0]["Translations"][0]["Text"] + return response.json()[0]["translations"][0]["text"] def get_translator_class(): diff --git a/main/settings.py b/main/settings.py index fca7cd20b..d37fe3921 100644 --- a/main/settings.py +++ b/main/settings.py @@ -55,8 +55,9 @@ AWS_TRANSLATE_SECRET_KEY=(str, None), AWS_TRANSLATE_REGION=(str, None), # IFRC Translation - IFRC_TRANSLATION_URL=(str, None), - IFRC_TRANSLATION_API_KEY=(str, None), + IFRC_TRANSLATION_DOMAIN=(str, None), # https://example.ifrc.org + IFRC_TRANSLATION_GET_API_KEY=(str, None), + IFRC_TRANSLATION_HEADER_API_KEY=(str, None), # Celery NOTE: Not used right now CELERY_REDIS_URL=str, CACHE_REDIS_URL=str, @@ -353,8 +354,9 @@ MODELTRANSLATION_FALLBACK_LANGUAGES = ('en', 'fr', 'es', 'ar') AUTO_TRANSLATION_TRANSLATOR = env('AUTO_TRANSLATION_TRANSLATOR') -IFRC_TRANSLATION_URL = env('IFRC_TRANSLATION_URL') -IFRC_TRANSLATION_API_KEY = env('IFRC_TRANSLATION_API_KEY') +IFRC_TRANSLATION_DOMAIN = env('IFRC_TRANSLATION_DOMAIN') +IFRC_TRANSLATION_GET_API_KEY = env('IFRC_TRANSLATION_GET_API_KEY') +IFRC_TRANSLATION_HEADER_API_KEY = env('IFRC_TRANSLATION_HEADER_API_KEY') MEDIA_URL = env('DJANGO_MEDIA_URL') MEDIA_ROOT = env('DJANGO_MEDIA_ROOT')