9ed2c53230af9c497b7e532165b286565f7d2192
[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 work without an API key" do
12 Tesla.Mock.mock(fn
13 %{method: :post, url: "http://libre.translate/translate"} = env ->
14 assert {:ok, %{"api_key" => nil}} = Jason.decode(env.body)
15
16 %Tesla.Env{
17 status: 200,
18 body:
19 Jason.encode!(%{
20 detectedLanguage: %{
21 confidence: 83,
22 language: "ja"
23 },
24 translatedText: "I will crush you"
25 })
26 }
27 end)
28
29 assert {:ok, "ja", "I will crush you"} = LibreTranslate.translate("ギュギュ握りつぶしちゃうぞ", "en")
30 end
31
32 test "should work with an API key" do
33 clear_config([:libre_translate, :api_key], "libre_translate_api_key")
34
35 Tesla.Mock.mock(fn
36 %{method: :post, url: "http://libre.translate/translate"} = env ->
37 assert {:ok, %{"api_key" => "libre_translate_api_key"}} = Jason.decode(env.body)
38
39 %Tesla.Env{
40 status: 200,
41 body:
42 Jason.encode!(%{
43 detectedLanguage: %{
44 confidence: 83,
45 language: "ja"
46 },
47 translatedText: "I will crush you"
48 })
49 }
50 end)
51
52 assert {:ok, "ja", "I will crush you"} = LibreTranslate.translate("ギュギュ握りつぶしちゃうぞ", "en")
53 end
54
55 test "should gracefully handle API key errors" do
56 clear_config([:libre_translate, :api_key], "")
57
58 Tesla.Mock.mock(fn
59 %{method: :post, url: "http://libre.translate/translate"} ->
60 %Tesla.Env{
61 status: 403,
62 body:
63 Jason.encode!(%{
64 error: "Please contact the server operator to obtain an API key"
65 })
66 }
67 end)
68
69 assert {:error, "libre_translate: request failed (code 403)"} =
70 LibreTranslate.translate("ギュギュ握りつぶしちゃうぞ", "en")
71 end
72
73 test "should gracefully handle an unsupported language" do
74 clear_config([:libre_translate, :api_key], "")
75
76 Tesla.Mock.mock(fn
77 %{method: :post, url: "http://libre.translate/translate"} ->
78 %Tesla.Env{
79 status: 400,
80 body:
81 Jason.encode!(%{
82 error: "zoop is not supported"
83 })
84 }
85 end)
86
87 assert {:error, "libre_translate: request failed (code 400)"} =
88 LibreTranslate.translate("ギュギュ握りつぶしちゃうぞ", "zoop")
89 end
90 end
91 end