A feature for shareable emoji packs, use it in download_from & tests
[akkoma] / test / web / emoji_api_controller_test.exs
index c1aece69140fb838b597e34095b4e71a8643491e..1af4d3720e88f40565a3cd7fbfb99c5a8ce667b2 100644 (file)
@@ -1,4 +1,4 @@
-defmodule Pleroma.Web.EmojiAPI.EmojiAPIControllerTest do
+defmodule Pleroma.Web.PleromaAPI.EmojiAPIControllerTest do
   use Pleroma.Web.ConnCase
 
   import Tesla.Mock
@@ -54,6 +54,12 @@ defmodule Pleroma.Web.EmojiAPI.EmojiAPIControllerTest do
     end)
 
     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,
         url: "https://example.com/api/pleroma/emoji/packs/list"
@@ -87,6 +93,22 @@ defmodule Pleroma.Web.EmojiAPI.EmojiAPIControllerTest do
 
     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
            |> put_req_header("content-type", "application/json")
            |> post(
@@ -101,14 +123,14 @@ defmodule Pleroma.Web.EmojiAPI.EmojiAPIControllerTest do
              }
              |> Jason.encode!()
            )
-           |> text_response(200) == "ok"
+           |> json_response(200) == "ok"
 
     assert File.exists?("#{@emoji_dir_path}/test_pack2/pack.json")
     assert File.exists?("#{@emoji_dir_path}/test_pack2/blank.png")
 
     assert conn
            |> delete(emoji_api_path(conn, :delete, "test_pack2"))
-           |> response(200) == "ok"
+           |> json_response(200) == "ok"
 
     refute File.exists?("#{@emoji_dir_path}/test_pack2")
 
@@ -130,14 +152,14 @@ defmodule Pleroma.Web.EmojiAPI.EmojiAPIControllerTest do
              }
              |> Jason.encode!()
            )
-           |> text_response(200) == "ok"
+           |> json_response(200) == "ok"
 
     assert File.exists?("#{@emoji_dir_path}/test_pack_nonshared2/pack.json")
     assert File.exists?("#{@emoji_dir_path}/test_pack_nonshared2/blank.png")
 
     assert conn
            |> delete(emoji_api_path(conn, :delete, "test_pack_nonshared2"))
-           |> response(200) == "ok"
+           |> json_response(200) == "ok"
 
     refute File.exists?("#{@emoji_dir_path}/test_pack_nonshared2")
   end
@@ -225,15 +247,15 @@ defmodule Pleroma.Web.EmojiAPI.EmojiAPIControllerTest do
 
       conn = build_conn()
 
-      assert conn
-             |> assign(:user, ctx[:admin])
-             |> post(
-               emoji_api_path(conn, :update_metadata, "test_pack"),
-               %{
-                 "new_data" => new_data
-               }
-             )
-             |> text_response(:bad_request) =~ "does not have all"
+      assert (conn
+              |> assign(:user, ctx[:admin])
+              |> post(
+                emoji_api_path(conn, :update_metadata, "test_pack"),
+                %{
+                  "new_data" => new_data
+                }
+              )
+              |> json_response(:bad_request))["error"] =~ "does not have all"
     end
   end
 
@@ -267,9 +289,9 @@ defmodule Pleroma.Web.EmojiAPI.EmojiAPIControllerTest do
 
     conn = conn |> assign(:user, admin)
 
-    assert conn
-           |> post(emoji_api_path(conn, :update_file, "test_pack"), same_name)
-           |> text_response(:conflict) =~ "already exists"
+    assert (conn
+            |> post(emoji_api_path(conn, :update_file, "test_pack"), same_name)
+            |> json_response(:conflict))["error"] =~ "already exists"
 
     assert conn
            |> post(emoji_api_path(conn, :update_file, "test_pack"), different_name)
@@ -331,4 +353,79 @@ defmodule Pleroma.Web.EmojiAPI.EmojiAPIControllerTest do
 
     refute File.exists?("#{@emoji_dir_path}/test_pack/blank_url.png")
   end
+
+  test "creating and deleting a pack" do
+    on_exit(fn ->
+      File.rm_rf!("#{@emoji_dir_path}/test_created")
+    end)
+
+    admin = insert(:user, info: %{is_admin: true})
+
+    conn = build_conn() |> assign(:user, admin)
+
+    assert conn
+           |> put_req_header("content-type", "application/json")
+           |> put(
+             emoji_api_path(
+               conn,
+               :create,
+               "test_created"
+             )
+           )
+           |> json_response(200) == "ok"
+
+    assert File.exists?("#{@emoji_dir_path}/test_created/pack.json")
+
+    assert Jason.decode!(File.read!("#{@emoji_dir_path}/test_created/pack.json")) == %{
+             "pack" => %{},
+             "files" => %{}
+           }
+
+    assert conn
+           |> delete(emoji_api_path(conn, :delete, "test_created"))
+           |> json_response(200) == "ok"
+
+    refute File.exists?("#{@emoji_dir_path}/test_created/pack.json")
+  end
+
+  test "filesystem import" do
+    on_exit(fn ->
+      File.rm!("#{@emoji_dir_path}/test_pack_for_import/emoji.txt")
+      File.rm!("#{@emoji_dir_path}/test_pack_for_import/pack.json")
+    end)
+
+    conn = build_conn()
+    resp = conn |> get(emoji_api_path(conn, :list_packs)) |> json_response(200)
+
+    refute Map.has_key?(resp, "test_pack_for_import")
+
+    admin = insert(:user, info: %{is_admin: true})
+
+    assert conn
+           |> assign(:user, admin)
+           |> post(emoji_api_path(conn, :import_from_fs))
+           |> json_response(200) == ["test_pack_for_import"]
+
+    resp = conn |> get(emoji_api_path(conn, :list_packs)) |> json_response(200)
+    assert resp["test_pack_for_import"]["files"] == %{"blank" => "blank.png"}
+
+    File.rm!("#{@emoji_dir_path}/test_pack_for_import/pack.json")
+    refute File.exists?("#{@emoji_dir_path}/test_pack_for_import/pack.json")
+
+    emoji_txt_content = "blank, blank.png, Fun\n\nblank2, blank.png"
+
+    File.write!("#{@emoji_dir_path}/test_pack_for_import/emoji.txt", emoji_txt_content)
+
+    assert conn
+           |> assign(:user, admin)
+           |> post(emoji_api_path(conn, :import_from_fs))
+           |> json_response(200) == ["test_pack_for_import"]
+
+    resp = conn |> get(emoji_api_path(conn, :list_packs)) |> json_response(200)
+
+    assert resp["test_pack_for_import"]["files"] == %{
+             "blank" => "blank.png",
+             "blank2" => "blank.png"
+           }
+  end
 end