# Pleroma: A lightweight social networking server
-# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
+# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do
use Pleroma.Web.ConnCase, async: false
+ import Mock
import Tesla.Mock
import Pleroma.Factory
Pleroma.Config.get!([:instance, :static_dir]),
"emoji"
)
- setup do: clear_config([:auth, :enforce_oauth_admin_scope_usage], false)
setup do: clear_config([:instance, :public], true)
{:ok, %{admin_conn: admin_conn}}
end
- test "GET /api/pleroma/emoji/packs when :public: false", %{conn: conn} do
- Config.put([:instance, :public], false)
- conn |> get("/api/pleroma/emoji/packs") |> json_response_and_validate_schema(200)
+ test "GET /api/v1/pleroma/emoji/packs when :public: false", %{conn: conn} do
+ clear_config([:instance, :public], false)
+ conn |> get("/api/v1/pleroma/emoji/packs") |> json_response_and_validate_schema(200)
end
- test "GET /api/pleroma/emoji/packs", %{conn: conn} do
- resp = conn |> get("/api/pleroma/emoji/packs") |> json_response_and_validate_schema(200)
+ test "GET /api/v1/pleroma/emoji/packs", %{conn: conn} do
+ resp =
+ conn
+ |> get("/api/v1/pleroma/emoji/packs")
+ |> json_response_and_validate_schema(200)
- assert resp["count"] == 4
+ assert resp["count"] == 5
assert resp["packs"]
|> Map.keys()
- |> length() == 4
+ |> length() == 5
shared = resp["packs"]["test_pack"]
assert shared["files"] == %{"blank" => "blank.png", "blank2" => "blank2.png"}
resp =
conn
- |> get("/api/pleroma/emoji/packs?page_size=1")
+ |> get("/api/v1/pleroma/emoji/packs?page_size=1")
|> json_response_and_validate_schema(200)
- assert resp["count"] == 4
+ assert resp["count"] == 5
packs = Map.keys(resp["packs"])
resp =
conn
- |> get("/api/pleroma/emoji/packs?page_size=1&page=2")
+ |> get("/api/v1/pleroma/emoji/packs?page_size=1&page=2")
|> json_response_and_validate_schema(200)
- assert resp["count"] == 4
+ assert resp["count"] == 5
packs = Map.keys(resp["packs"])
assert length(packs) == 1
[pack2] = packs
resp =
conn
- |> get("/api/pleroma/emoji/packs?page_size=1&page=3")
+ |> get("/api/v1/pleroma/emoji/packs?page_size=1&page=3")
|> json_response_and_validate_schema(200)
- assert resp["count"] == 4
+ assert resp["count"] == 5
packs = Map.keys(resp["packs"])
assert length(packs) == 1
[pack3] = packs
resp =
conn
- |> get("/api/pleroma/emoji/packs?page_size=1&page=4")
+ |> get("/api/v1/pleroma/emoji/packs?page_size=1&page=4")
|> json_response_and_validate_schema(200)
- assert resp["count"] == 4
+ assert resp["count"] == 5
packs = Map.keys(resp["packs"])
assert length(packs) == 1
[pack4] = packs
assert [pack1, pack2, pack3, pack4] |> Enum.uniq() |> length() == 4
end
- describe "GET /api/pleroma/emoji/packs/remote" do
+ describe "GET /api/v1/pleroma/emoji/packs/remote" do
test "shareable instance", %{admin_conn: admin_conn, conn: conn} do
resp =
conn
- |> get("/api/pleroma/emoji/packs?page=2&page_size=1")
+ |> get("/api/v1/pleroma/emoji/packs?page=2&page_size=1")
|> json_response_and_validate_schema(200)
mock(fn
%{method: :get, url: "https://example.com/nodeinfo/2.1.json"} ->
json(%{metadata: %{features: ["shareable_emoji_packs"]}})
- %{method: :get, url: "https://example.com/api/pleroma/emoji/packs?page=2&page_size=1"} ->
+ %{
+ method: :get,
+ url: "https://example.com/api/v1/pleroma/emoji/packs?page=2&page_size=1"
+ } ->
json(resp)
end)
assert admin_conn
- |> get("/api/pleroma/emoji/packs/remote?url=https://example.com&page=2&page_size=1")
+ |> get(
+ "/api/v1/pleroma/emoji/packs/remote?url=https://example.com&page=2&page_size=1"
+ )
|> json_response_and_validate_schema(200) == resp
end
end)
assert admin_conn
- |> get("/api/pleroma/emoji/packs/remote?url=https://example.com")
+ |> get("/api/v1/pleroma/emoji/packs/remote?url=https://example.com")
|> json_response_and_validate_schema(500) == %{
"error" => "The requested instance does not support sharing emoji packs"
}
end
end
- describe "GET /api/pleroma/emoji/packs/archive?name=:name" do
+ describe "GET /api/v1/pleroma/emoji/packs/archive?name=:name" do
test "download shared pack", %{conn: conn} do
resp =
conn
- |> get("/api/pleroma/emoji/packs/archive?name=test_pack")
+ |> get("/api/v1/pleroma/emoji/packs/archive?name=test_pack")
|> response(200)
{:ok, arch} = :zip.unzip(resp, [:memory])
test "non existing pack", %{conn: conn} do
assert conn
- |> get("/api/pleroma/emoji/packs/archive?name=test_pack_for_import")
+ |> get("/api/v1/pleroma/emoji/packs/archive?name=test_pack_for_import")
|> json_response_and_validate_schema(:not_found) == %{
"error" => "Pack test_pack_for_import does not exist"
}
test "non downloadable pack", %{conn: conn} do
assert conn
- |> get("/api/pleroma/emoji/packs/archive?name=test_pack_nonshared")
+ |> get("/api/v1/pleroma/emoji/packs/archive?name=test_pack_nonshared")
|> json_response_and_validate_schema(:forbidden) == %{
"error" =>
"Pack test_pack_nonshared cannot be downloaded from this instance, either pack sharing was disabled for this pack or some files are missing"
end
end
- describe "POST /api/pleroma/emoji/packs/download" do
+ describe "POST /api/v1/pleroma/emoji/packs/download" do
test "shared pack from remote and non shared from fallback-src", %{
admin_conn: admin_conn,
conn: conn
%{
method: :get,
- url: "https://example.com/api/pleroma/emoji/pack?name=test_pack"
+ url: "https://example.com/api/v1/pleroma/emoji/pack?name=test_pack"
} ->
conn
- |> get("/api/pleroma/emoji/pack?name=test_pack")
+ |> get("/api/v1/pleroma/emoji/pack?name=test_pack")
|> json_response_and_validate_schema(200)
|> json()
%{
method: :get,
- url: "https://example.com/api/pleroma/emoji/packs/archive?name=test_pack"
+ url: "https://example.com/api/v1/pleroma/emoji/packs/archive?name=test_pack"
} ->
conn
- |> get("/api/pleroma/emoji/packs/archive?name=test_pack")
+ |> get("/api/v1/pleroma/emoji/packs/archive?name=test_pack")
|> response(200)
|> text()
%{
method: :get,
- url: "https://example.com/api/pleroma/emoji/pack?name=test_pack_nonshared"
+ url: "https://example.com/api/v1/pleroma/emoji/pack?name=test_pack_nonshared"
} ->
conn
- |> get("/api/pleroma/emoji/pack?name=test_pack_nonshared")
+ |> get("/api/v1/pleroma/emoji/pack?name=test_pack_nonshared")
|> json_response_and_validate_schema(200)
|> json()
url: "https://nonshared-pack"
} ->
text(File.read!("#{@emoji_path}/test_pack_nonshared/nonshared.zip"))
+
+ %{
+ method: :get,
+ url: "https://example.com/api/v1/pleroma/emoji/pack?name=test%20with%20spaces"
+ } ->
+ conn
+ |> get("/api/v1/pleroma/emoji/pack?name=test%20with%20spaces")
+ |> json_response_and_validate_schema(200)
+ |> json()
+
+ %{
+ method: :get,
+ url: "https://example.com/api/v1/pleroma/emoji/packs/archive?name=test%20with%20spaces"
+ } ->
+ conn
+ |> get("/api/v1/pleroma/emoji/packs/archive?name=test%20with%20spaces")
+ |> response(200)
+ |> text()
end)
assert admin_conn
|> put_req_header("content-type", "multipart/form-data")
- |> post("/api/pleroma/emoji/packs/download", %{
+ |> post("/api/v1/pleroma/emoji/packs/download", %{
url: "https://example.com",
name: "test_pack",
as: "test_pack2"
assert File.exists?("#{@emoji_path}/test_pack2/blank.png")
assert admin_conn
- |> delete("/api/pleroma/emoji/pack?name=test_pack2")
+ |> delete("/api/v1/pleroma/emoji/pack?name=test_pack2")
|> json_response_and_validate_schema(200) == "ok"
refute File.exists?("#{@emoji_path}/test_pack2")
assert admin_conn
|> put_req_header("content-type", "multipart/form-data")
|> post(
- "/api/pleroma/emoji/packs/download",
+ "/api/v1/pleroma/emoji/packs/download",
%{
url: "https://example.com",
name: "test_pack_nonshared",
assert File.exists?("#{@emoji_path}/test_pack_nonshared2/blank.png")
assert admin_conn
- |> delete("/api/pleroma/emoji/pack?name=test_pack_nonshared2")
+ |> delete("/api/v1/pleroma/emoji/pack?name=test_pack_nonshared2")
|> json_response_and_validate_schema(200) == "ok"
refute File.exists?("#{@emoji_path}/test_pack_nonshared2")
+
+ assert admin_conn
+ |> put_req_header("content-type", "multipart/form-data")
+ |> post("/api/v1/pleroma/emoji/packs/download", %{
+ url: "https://example.com",
+ name: "test with spaces",
+ as: "test with spaces"
+ })
+ |> json_response_and_validate_schema(200) == "ok"
+
+ assert File.exists?("#{@emoji_path}/test with spaces/pack.json")
+ assert File.exists?("#{@emoji_path}/test with spaces/blank.png")
end
test "nonshareable instance", %{admin_conn: admin_conn} do
assert admin_conn
|> put_req_header("content-type", "multipart/form-data")
|> post(
- "/api/pleroma/emoji/packs/download",
+ "/api/v1/pleroma/emoji/packs/download",
%{
url: "https://old-instance",
name: "test_pack",
%{
method: :get,
- url: "https://example.com/api/pleroma/emoji/pack?name=pack_bad_sha"
+ url: "https://example.com/api/v1/pleroma/emoji/pack?name=pack_bad_sha"
} ->
{:ok, pack} = Pleroma.Emoji.Pack.load_pack("pack_bad_sha")
%Tesla.Env{status: 200, body: Jason.encode!(pack)}
%{
method: :get,
- url: "https://example.com/api/pleroma/emoji/packs/archive?name=pack_bad_sha"
+ url: "https://example.com/api/v1/pleroma/emoji/packs/archive?name=pack_bad_sha"
} ->
%Tesla.Env{
status: 200,
assert admin_conn
|> put_req_header("content-type", "multipart/form-data")
- |> post("/api/pleroma/emoji/packs/download", %{
+ |> post("/api/v1/pleroma/emoji/packs/download", %{
url: "https://example.com",
name: "pack_bad_sha",
as: "pack_bad_sha2"
%{
method: :get,
- url: "https://example.com/api/pleroma/emoji/pack?name=test_pack"
+ url: "https://example.com/api/v1/pleroma/emoji/pack?name=test_pack"
} ->
{:ok, pack} = Pleroma.Emoji.Pack.load_pack("test_pack")
%Tesla.Env{status: 200, body: Jason.encode!(pack)}
assert admin_conn
|> put_req_header("content-type", "multipart/form-data")
- |> post("/api/pleroma/emoji/packs/download", %{
+ |> post("/api/v1/pleroma/emoji/packs/download", %{
url: "https://example.com",
name: "test_pack",
as: "test_pack2"
end
end
- describe "PATCH/update /api/pleroma/emoji/pack?name=:name" do
+ describe "PATCH/update /api/v1/pleroma/emoji/pack?name=:name" do
setup do
pack_file = "#{@emoji_path}/test_pack/pack.json"
original_content = File.read!(pack_file)
end
test "returns error when file system not writable", %{admin_conn: conn} = ctx do
- {:ok, %File.Stat{mode: mode}} = File.stat(@emoji_path)
-
- try do
- File.chmod!(@emoji_path, 0o400)
-
+ with_mocks([
+ {File, [:passthrough], [stat: fn _ -> {:error, :eacces} end]}
+ ]) do
assert conn
|> put_req_header("content-type", "multipart/form-data")
|> patch(
- "/api/pleroma/emoji/pack?name=test_pack",
+ "/api/v1/pleroma/emoji/pack?name=test_pack",
%{"metadata" => ctx[:new_data]}
)
|> json_response_and_validate_schema(500)
- after
- File.chmod!(@emoji_path, mode)
end
end
test "for a pack without a fallback source", ctx do
assert ctx[:admin_conn]
|> put_req_header("content-type", "multipart/form-data")
- |> patch("/api/pleroma/emoji/pack?name=test_pack", %{
+ |> patch("/api/v1/pleroma/emoji/pack?name=test_pack", %{
"metadata" => ctx[:new_data]
})
|> json_response_and_validate_schema(200) == ctx[:new_data]
assert ctx[:admin_conn]
|> put_req_header("content-type", "multipart/form-data")
- |> patch("/api/pleroma/emoji/pack?name=test_pack", %{metadata: new_data})
+ |> patch("/api/v1/pleroma/emoji/pack?name=test_pack", %{metadata: new_data})
|> json_response_and_validate_schema(200) == new_data_with_sha
assert Jason.decode!(File.read!(ctx[:pack_file]))["pack"] == new_data_with_sha
assert ctx[:admin_conn]
|> put_req_header("content-type", "multipart/form-data")
- |> patch("/api/pleroma/emoji/pack?name=test_pack", %{metadata: new_data})
+ |> patch("/api/v1/pleroma/emoji/pack?name=test_pack", %{metadata: new_data})
|> json_response_and_validate_schema(:bad_request) == %{
"error" => "The fallback archive does not have all files specified in pack.json"
}
end
end
- describe "POST/DELETE /api/pleroma/emoji/pack?name=:name" do
- test "returns error when file system not writable", %{admin_conn: admin_conn} do
- {:ok, %File.Stat{mode: mode}} = File.stat(@emoji_path)
-
- try do
- File.chmod!(@emoji_path, 0o400)
+ describe "POST/DELETE /api/v1/pleroma/emoji/pack?name=:name" do
+ test "returns an error on creates pack when file system not writable", %{
+ admin_conn: admin_conn
+ } do
+ path_pack = Path.join(@emoji_path, "test_pack")
+ with_mocks([
+ {File, [:passthrough], [mkdir: fn ^path_pack -> {:error, :eacces} end]}
+ ]) do
assert admin_conn
- |> post("/api/pleroma/emoji/pack?name=test_pack")
+ |> post("/api/v1/pleroma/emoji/pack?name=test_pack")
|> json_response_and_validate_schema(500) == %{
"error" =>
"Unexpected error occurred while creating pack. (POSIX error: Permission denied)"
}
- after
- File.chmod!(@emoji_path, mode)
end
end
test "returns an error on deletes pack when the file system is not writable", %{
admin_conn: admin_conn
} do
- {:ok, _pack} = Pleroma.Emoji.Pack.create("test_pack2")
- {:ok, %File.Stat{mode: mode}} = File.stat(@emoji_path)
+ path_pack = Path.join(@emoji_path, "test_emoji_pack")
try do
- File.chmod!(@emoji_path, 0o400)
-
- assert admin_conn
- |> delete("/api/pleroma/emoji/pack?name=test_pack")
- |> json_response_and_validate_schema(500) == %{
- "error" => "Couldn't delete the pack test_pack (POSIX error: Permission denied)"
- }
+ {:ok, _pack} = Pleroma.Emoji.Pack.create("test_emoji_pack")
+
+ with_mocks([
+ {File, [:passthrough], [rm_rf: fn ^path_pack -> {:error, :eacces, path_pack} end]}
+ ]) do
+ assert admin_conn
+ |> delete("/api/v1/pleroma/emoji/pack?name=test_emoji_pack")
+ |> json_response_and_validate_schema(500) == %{
+ "error" =>
+ "Couldn't delete the `test_emoji_pack` pack (POSIX error: Permission denied)"
+ }
+ end
after
- File.chmod!(@emoji_path, mode)
- File.rm_rf!(Path.join([@emoji_path, "test_pack2"]))
+ File.rm_rf(path_pack)
end
end
test "creating and deleting a pack", %{admin_conn: admin_conn} do
assert admin_conn
- |> post("/api/pleroma/emoji/pack?name=test_created")
+ |> post("/api/v1/pleroma/emoji/pack?name=test_created")
|> json_response_and_validate_schema(200) == "ok"
assert File.exists?("#{@emoji_path}/test_created/pack.json")
}
assert admin_conn
- |> delete("/api/pleroma/emoji/pack?name=test_created")
+ |> delete("/api/v1/pleroma/emoji/pack?name=test_created")
|> json_response_and_validate_schema(200) == "ok"
refute File.exists?("#{@emoji_path}/test_created/pack.json")
File.write!(Path.join(path, "pack.json"), pack_file)
assert admin_conn
- |> post("/api/pleroma/emoji/pack?name=test_created")
+ |> post("/api/v1/pleroma/emoji/pack?name=test_created")
|> json_response_and_validate_schema(:conflict) == %{
"error" => "A pack named \"test_created\" already exists"
}
test "with empty name", %{admin_conn: admin_conn} do
assert admin_conn
- |> post("/api/pleroma/emoji/pack?name= ")
+ |> post("/api/v1/pleroma/emoji/pack?name= ")
|> json_response_and_validate_schema(:bad_request) == %{
"error" => "pack name cannot be empty"
}
test "deleting nonexisting pack", %{admin_conn: admin_conn} do
assert admin_conn
- |> delete("/api/pleroma/emoji/pack?name=non_existing")
+ |> delete("/api/v1/pleroma/emoji/pack?name=non_existing")
|> json_response_and_validate_schema(:not_found) == %{
"error" => "Pack non_existing does not exist"
}
test "deleting with empty name", %{admin_conn: admin_conn} do
assert admin_conn
- |> delete("/api/pleroma/emoji/pack?name= ")
+ |> delete("/api/v1/pleroma/emoji/pack?name= ")
|> json_response_and_validate_schema(:bad_request) == %{
"error" => "pack name cannot be empty"
}
File.rm!("#{@emoji_path}/test_pack_for_import/pack.json")
end)
- resp = conn |> get("/api/pleroma/emoji/packs") |> json_response_and_validate_schema(200)
+ resp =
+ conn
+ |> get("/api/v1/pleroma/emoji/packs")
+ |> json_response_and_validate_schema(200)
refute Map.has_key?(resp["packs"], "test_pack_for_import")
assert admin_conn
- |> get("/api/pleroma/emoji/packs/import")
+ |> get("/api/v1/pleroma/emoji/packs/import")
|> json_response_and_validate_schema(200) == ["test_pack_for_import"]
- resp = conn |> get("/api/pleroma/emoji/packs") |> json_response_and_validate_schema(200)
+ resp =
+ conn
+ |> get("/api/v1/pleroma/emoji/packs")
+ |> json_response_and_validate_schema(200)
+
assert resp["packs"]["test_pack_for_import"]["files"] == %{"blank" => "blank.png"}
File.rm!("#{@emoji_path}/test_pack_for_import/pack.json")
File.write!("#{@emoji_path}/test_pack_for_import/emoji.txt", emoji_txt_content)
assert admin_conn
- |> get("/api/pleroma/emoji/packs/import")
+ |> get("/api/v1/pleroma/emoji/packs/import")
|> json_response_and_validate_schema(200) == ["test_pack_for_import"]
- resp = conn |> get("/api/pleroma/emoji/packs") |> json_response_and_validate_schema(200)
+ resp =
+ conn
+ |> get("/api/v1/pleroma/emoji/packs")
+ |> json_response_and_validate_schema(200)
assert resp["packs"]["test_pack_for_import"]["files"] == %{
"blank" => "blank.png",
}
end
- describe "GET /api/pleroma/emoji/pack?name=:name" do
+ describe "GET /api/v1/pleroma/emoji/pack?name=:name" do
test "shows pack.json", %{conn: conn} do
assert %{
"files" => files,
}
} =
conn
- |> get("/api/pleroma/emoji/pack?name=test_pack")
+ |> get("/api/v1/pleroma/emoji/pack?name=test_pack")
|> json_response_and_validate_schema(200)
assert files == %{"blank" => "blank.png", "blank2" => "blank2.png"}
"files_count" => 2
} =
conn
- |> get("/api/pleroma/emoji/pack?name=test_pack&page_size=1")
+ |> get("/api/v1/pleroma/emoji/pack?name=test_pack&page_size=1")
|> json_response_and_validate_schema(200)
assert files |> Map.keys() |> length() == 1
"files_count" => 2
} =
conn
- |> get("/api/pleroma/emoji/pack?name=test_pack&page_size=1&page=2")
+ |> get("/api/v1/pleroma/emoji/pack?name=test_pack&page_size=1&page=2")
|> json_response_and_validate_schema(200)
assert files |> Map.keys() |> length() == 1
}
} =
conn
- |> get("/api/pleroma/emoji/pack?name=blobs.gg")
+ |> get("/api/v1/pleroma/emoji/pack?name=blobs.gg")
|> json_response_and_validate_schema(200)
end
test "non existing pack", %{conn: conn} do
assert conn
- |> get("/api/pleroma/emoji/pack?name=non_existing")
+ |> get("/api/v1/pleroma/emoji/pack?name=non_existing")
|> json_response_and_validate_schema(:not_found) == %{
"error" => "Pack non_existing does not exist"
}
test "error name", %{conn: conn} do
assert conn
- |> get("/api/pleroma/emoji/pack?name= ")
+ |> get("/api/v1/pleroma/emoji/pack?name= ")
|> json_response_and_validate_schema(:bad_request) == %{
"error" => "pack name cannot be empty"
}