A feature for shareable emoji packs, use it in download_from & tests

This commit is contained in:
Ekaterina Vaartis 2019-09-11 22:58:55 +03:00
parent 74fb6d8647
commit 36f2275dc9
3 changed files with 88 additions and 50 deletions

View File

@ -153,6 +153,15 @@ def download_shared(conn, %{"name" => name}) do
from that instance, otherwise it will be downloaded from the fallback source, if there is one. from that instance, otherwise it will be downloaded from the fallback source, if there is one.
""" """
def download_from(conn, %{"instance_address" => address, "pack_name" => name} = data) do def download_from(conn, %{"instance_address" => address, "pack_name" => name} = data) do
shareable_packs_available =
"#{address}/nodeinfo/2.1.json"
|> Tesla.get!()
|> Map.get(:body)
|> Jason.decode!()
|> Map.get("features")
|> Enum.member?("shareable_emoji_packs")
if shareable_packs_available do
full_pack = full_pack =
"#{address}/api/pleroma/emoji/packs/list" "#{address}/api/pleroma/emoji/packs/list"
|> Tesla.get!() |> Tesla.get!()
@ -178,7 +187,8 @@ def download_from(conn, %{"instance_address" => address, "pack_name" => name} =
}} }}
_ -> _ ->
{:error, "The pack was not set as shared and there is no fallback src to download from"} {:error,
"The pack was not set as shared and there is no fallback src to download from"}
end end
with {:ok, %{sha: sha, uri: uri} = pinfo} <- pack_info_res, with {:ok, %{sha: sha, uri: uri} = pinfo} <- pack_info_res,
@ -212,6 +222,11 @@ def download_from(conn, %{"instance_address" => address, "pack_name" => name} =
|> put_status(:internal_server_error) |> put_status(:internal_server_error)
|> json(%{error: "SHA256 for the pack doesn't match the one sent by the server"}) |> json(%{error: "SHA256 for the pack doesn't match the one sent by the server"})
end end
else
conn
|> put_status(:internal_server_error)
|> json(%{error: "The requested instance does not support sharing emoji packs"})
end
end end
@doc """ @doc """

View File

@ -57,6 +57,7 @@ def raw_nodeinfo do
"mastodon_api_streaming", "mastodon_api_streaming",
"polls", "polls",
"pleroma_explicit_addressing", "pleroma_explicit_addressing",
"shareable_emoji_packs",
if Config.get([:media_proxy, :enabled]) do if Config.get([:media_proxy, :enabled]) do
"media_proxy" "media_proxy"
end, end,

View File

@ -54,6 +54,12 @@ test "downloading shared & unshared packs from another instance via download_fro
end) end)
mock(fn mock(fn
%{method: :get, url: "https://old-instance/nodeinfo/2.1.json"} ->
json(%{features: []})
%{method: :get, url: "https://example.com/nodeinfo/2.1.json"} ->
json(%{features: ["shareable_emoji_packs"]})
%{ %{
method: :get, method: :get,
url: "https://example.com/api/pleroma/emoji/packs/list" url: "https://example.com/api/pleroma/emoji/packs/list"
@ -87,6 +93,22 @@ test "downloading shared & unshared packs from another instance via download_fro
conn = build_conn() |> assign(:user, admin) conn = build_conn() |> assign(:user, admin)
assert (conn
|> put_req_header("content-type", "application/json")
|> post(
emoji_api_path(
conn,
:download_from
),
%{
instance_address: "https://old-instance",
pack_name: "test_pack",
as: "test_pack2"
}
|> Jason.encode!()
)
|> json_response(500))["error"] =~ "does not support"
assert conn assert conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> post( |> post(