Allow listing languages, setting source language (#192)
[akkoma] / test / pleroma / translators / libre_translate_test.exs
1 defmodule Pleroma.Akkoma.Translators.LibreTranslateTest do
2 use Pleroma.DataCase, async: true
3
4 alias Pleroma.Akkoma.Translators.LibreTranslate
5
6 describe "translating with libre translate" do
7 setup do
8 clear_config([:libre_translate, :url], "http://libre.translate/translate")
9 end
10
11 test "should list supported languages" do
12 clear_config([:deepl, :tier], :free)
13
14 Tesla.Mock.mock(fn
15 %{method: :get, url: "http://libre.translate/languages"} = _ ->
16 %Tesla.Env{
17 status: 200,
18 body:
19 Jason.encode!([
20 %{
21 "code" => "en",
22 "name" => "English"
23 },
24 %{
25 "code" => "ar",
26 "name" => "Arabic"
27 }
28 ])
29 }
30 end)
31
32 assert {:ok, [%{code: "en", name: "English"}, %{code: "ar", name: "Arabic"}]} =
33 LibreTranslate.languages()
34 end
35
36 test "should work without an API key" do
37 Tesla.Mock.mock(fn
38 %{method: :post, url: "http://libre.translate/translate"} = env ->
39 assert {:ok, %{"api_key" => nil, "source" => "auto"}} = Jason.decode(env.body)
40
41 %Tesla.Env{
42 status: 200,
43 body:
44 Jason.encode!(%{
45 detectedLanguage: %{
46 confidence: 83,
47 language: "ja"
48 },
49 translatedText: "I will crush you"
50 })
51 }
52 end)
53
54 assert {:ok, "ja", "I will crush you"} =
55 LibreTranslate.translate("ギュギュ握りつぶしちゃうぞ", nil, "en")
56 end
57
58 test "should work with an API key" do
59 clear_config([:libre_translate, :api_key], "libre_translate_api_key")
60
61 Tesla.Mock.mock(fn
62 %{method: :post, url: "http://libre.translate/translate"} = env ->
63 assert {:ok, %{"api_key" => "libre_translate_api_key"}} = Jason.decode(env.body)
64
65 %Tesla.Env{
66 status: 200,
67 body:
68 Jason.encode!(%{
69 detectedLanguage: %{
70 confidence: 83,
71 language: "ja"
72 },
73 translatedText: "I will crush you"
74 })
75 }
76 end)
77
78 assert {:ok, "ja", "I will crush you"} =
79 LibreTranslate.translate("ギュギュ握りつぶしちゃうぞ", nil, "en")
80 end
81
82 test "should gracefully handle API key errors" do
83 clear_config([:libre_translate, :api_key], "")
84
85 Tesla.Mock.mock(fn
86 %{method: :post, url: "http://libre.translate/translate"} ->
87 %Tesla.Env{
88 status: 403,
89 body:
90 Jason.encode!(%{
91 error: "Please contact the server operator to obtain an API key"
92 })
93 }
94 end)
95
96 assert {:error, "libre_translate: request failed (code 403)"} =
97 LibreTranslate.translate("ギュギュ握りつぶしちゃうぞ", nil, "en")
98 end
99
100 test "should set a source language if requested" do
101 Tesla.Mock.mock(fn
102 %{method: :post, url: "http://libre.translate/translate"} = env ->
103 assert {:ok, %{"api_key" => nil, "source" => "ja"}} = Jason.decode(env.body)
104
105 %Tesla.Env{
106 status: 200,
107 body:
108 Jason.encode!(%{
109 translatedText: "I will crush you"
110 })
111 }
112 end)
113
114 assert {:ok, "ja", "I will crush you"} =
115 LibreTranslate.translate("ギュギュ握りつぶしちゃうぞ", "ja", "en")
116 end
117
118 test "should gracefully handle an unsupported language" do
119 clear_config([:libre_translate, :api_key], "")
120
121 Tesla.Mock.mock(fn
122 %{method: :post, url: "http://libre.translate/translate"} ->
123 %Tesla.Env{
124 status: 400,
125 body:
126 Jason.encode!(%{
127 error: "zoop is not supported"
128 })
129 }
130 end)
131
132 assert {:error, "libre_translate: request failed (code 400)"} =
133 LibreTranslate.translate("ギュギュ握りつぶしちゃうぞ", nil, "zoop")
134 end
135 end
136 end