 decbca0c91
			
		
	
	
		decbca0c91
		
	
	
	
	
		
			
			Co-authored-by: FloatingGhost <hannah@coffee-and-dreams.uk> Reviewed-on: https://akkoma.dev/AkkomaGang/akkoma/pulls/193
		
			
				
	
	
		
			146 lines
		
	
	
	
		
			4.5 KiB
		
	
	
	
		
			Elixir
		
	
	
	
	
	
			
		
		
	
	
			146 lines
		
	
	
	
		
			4.5 KiB
		
	
	
	
		
			Elixir
		
	
	
	
	
	
| defmodule Pleroma.Akkoma.Translators.DeepLTest do
 | |
|   use Pleroma.DataCase, async: true
 | |
| 
 | |
|   alias Pleroma.Akkoma.Translators.DeepL
 | |
| 
 | |
|   describe "translating with deepl" do
 | |
|     setup do
 | |
|       clear_config([:deepl, :api_key], "deepl_api_key")
 | |
|     end
 | |
| 
 | |
|     test "should list supported languages" do
 | |
|       clear_config([:deepl, :tier], :free)
 | |
| 
 | |
|       Tesla.Mock.mock(fn
 | |
|         %{method: :get, url: "https://api-free.deepl.com/v2/languages?type=target"} = env ->
 | |
|           auth_header = Enum.find(env.headers, fn {k, _v} -> k == "authorization" end)
 | |
|           assert {"authorization", "DeepL-Auth-Key deepl_api_key"} = auth_header
 | |
| 
 | |
|           %Tesla.Env{
 | |
|             status: 200,
 | |
|             body:
 | |
|               Jason.encode!([
 | |
|                 %{
 | |
|                   "language" => "BG",
 | |
|                   "name" => "Bulgarian",
 | |
|                   "supports_formality" => false
 | |
|                 },
 | |
|                 %{
 | |
|                   "language" => "CS",
 | |
|                   "name" => "Czech",
 | |
|                   "supports_formality" => false
 | |
|                 }
 | |
|               ])
 | |
|           }
 | |
| 
 | |
|         %{method: :get, url: "https://api-free.deepl.com/v2/languages?type=source"} ->
 | |
|           %Tesla.Env{
 | |
|             status: 200,
 | |
|             body:
 | |
|               Jason.encode!([
 | |
|                 %{
 | |
|                   "language" => "JA",
 | |
|                   "name" => "Japanese",
 | |
|                   "supports_formality" => false
 | |
|                 }
 | |
|               ])
 | |
|           }
 | |
|       end)
 | |
| 
 | |
|       assert {:ok, [%{code: "JA", name: "Japanese"}],
 | |
|               [%{code: "BG", name: "Bulgarian"}, %{code: "CS", name: "Czech"}]} =
 | |
|                DeepL.languages()
 | |
|     end
 | |
| 
 | |
|     test "should work with the free tier" do
 | |
|       clear_config([:deepl, :tier], :free)
 | |
| 
 | |
|       Tesla.Mock.mock(fn
 | |
|         %{method: :post, url: "https://api-free.deepl.com/v2/translate"} = env ->
 | |
|           auth_header = Enum.find(env.headers, fn {k, _v} -> k == "authorization" end)
 | |
|           assert {"authorization", "DeepL-Auth-Key deepl_api_key"} = auth_header
 | |
| 
 | |
|           %Tesla.Env{
 | |
|             status: 200,
 | |
|             body:
 | |
|               Jason.encode!(%{
 | |
|                 translations: [
 | |
|                   %{
 | |
|                     "text" => "I will crush you",
 | |
|                     "detected_source_language" => "ja"
 | |
|                   }
 | |
|                 ]
 | |
|               })
 | |
|           }
 | |
|       end)
 | |
| 
 | |
|       assert {:ok, "ja", "I will crush you"} = DeepL.translate("ギュギュ握りつぶしちゃうぞ", nil, "en")
 | |
|     end
 | |
| 
 | |
|     test "should work with the pro tier" do
 | |
|       clear_config([:deepl, :tier], :pro)
 | |
| 
 | |
|       Tesla.Mock.mock(fn
 | |
|         %{method: :post, url: "https://api.deepl.com/v2/translate"} = env ->
 | |
|           auth_header = Enum.find(env.headers, fn {k, _v} -> k == "authorization" end)
 | |
|           assert {"authorization", "DeepL-Auth-Key deepl_api_key"} = auth_header
 | |
| 
 | |
|           %Tesla.Env{
 | |
|             status: 200,
 | |
|             body:
 | |
|               Jason.encode!(%{
 | |
|                 translations: [
 | |
|                   %{
 | |
|                     "text" => "I will crush you",
 | |
|                     "detected_source_language" => "ja"
 | |
|                   }
 | |
|                 ]
 | |
|               })
 | |
|           }
 | |
|       end)
 | |
| 
 | |
|       assert {:ok, "ja", "I will crush you"} = DeepL.translate("ギュギュ握りつぶしちゃうぞ", nil, "en")
 | |
|     end
 | |
| 
 | |
|     test "should assign source language if set" do
 | |
|       clear_config([:deepl, :tier], :pro)
 | |
| 
 | |
|       Tesla.Mock.mock(fn
 | |
|         %{method: :post, url: "https://api.deepl.com/v2/translate"} = env ->
 | |
|           auth_header = Enum.find(env.headers, fn {k, _v} -> k == "authorization" end)
 | |
|           assert {"authorization", "DeepL-Auth-Key deepl_api_key"} = auth_header
 | |
|           assert String.contains?(env.body, "source_lang=ja")
 | |
| 
 | |
|           %Tesla.Env{
 | |
|             status: 200,
 | |
|             body:
 | |
|               Jason.encode!(%{
 | |
|                 translations: [
 | |
|                   %{
 | |
|                     "text" => "I will crush you",
 | |
|                     "detected_source_language" => "ja"
 | |
|                   }
 | |
|                 ]
 | |
|               })
 | |
|           }
 | |
|       end)
 | |
| 
 | |
|       assert {:ok, "ja", "I will crush you"} = DeepL.translate("ギュギュ握りつぶしちゃうぞ", "ja", "en")
 | |
|     end
 | |
| 
 | |
|     test "should gracefully fail if the API errors" do
 | |
|       clear_config([:deepl, :tier], :free)
 | |
| 
 | |
|       Tesla.Mock.mock(fn
 | |
|         %{method: :post, url: "https://api-free.deepl.com/v2/translate"} ->
 | |
|           %Tesla.Env{
 | |
|             status: 403,
 | |
|             body: ""
 | |
|           }
 | |
|       end)
 | |
| 
 | |
|       assert {:error, "DeepL request failed (code 403)"} =
 | |
|                DeepL.translate("ギュギュ握りつぶしちゃうぞ", nil, "en")
 | |
|     end
 | |
|   end
 | |
| end
 |