Add support for install via `file` and `build_url` params
authorEgor Kislitsyn <egor@kislitsyn.com>
Thu, 29 Oct 2020 12:37:50 +0000 (16:37 +0400)
committerEgor Kislitsyn <egor@kislitsyn.com>
Thu, 29 Oct 2020 12:37:50 +0000 (16:37 +0400)
lib/pleroma/frontend.ex
lib/pleroma/web/api_spec/operations/admin/frontend_operation.ex
test/pleroma/frontend_test.exs
test/pleroma/web/admin_api/controllers/frontend_controller_test.exs

index 3413d2fbad1dd2c8ab156344e025c6bce789feb3..b3d4c3325073f21b6ec33c9115c17d842844cc70 100644 (file)
@@ -8,16 +8,16 @@ defmodule Pleroma.Frontend do
   require Logger
 
   def install(name, opts \\ []) do
-    cmd_frontend_info = %{
+    frontend_info = %{
       "ref" => opts[:ref],
       "build_url" => opts[:build_url],
       "build_dir" => opts[:build_dir]
     }
 
-    config_frontend_info = Config.get([:frontends, :available, name], %{})
-
     frontend_info =
-      Map.merge(config_frontend_info, cmd_frontend_info, fn _key, config, cmd ->
+      [:frontends, :available, name]
+      |> Config.get(%{})
+      |> Map.merge(frontend_info, fn _key, config, cmd ->
         # This only overrides things that are actually set
         cmd || config
       end)
index 24d23a4e00fe853da5da773aed0eef56f64d55a2..9d7d017a2300ded18ec37a8f258864f430a26d39 100644 (file)
@@ -49,7 +49,7 @@ defmodule Pleroma.Web.ApiSpec.Admin.FrontendOperation do
         properties: %{
           name: %Schema{type: :string},
           git: %Schema{type: :string, format: :uri, nullable: true},
-          build_url: %Schema{type: :string, format: :uri},
+          build_url: %Schema{type: :string, format: :uri, nullable: true},
           ref: %Schema{type: :string},
           installed: %Schema{type: :boolean}
         }
@@ -64,12 +64,19 @@ defmodule Pleroma.Web.ApiSpec.Admin.FrontendOperation do
       required: [:name],
       properties: %{
         name: %Schema{
-          type: :string,
-          nullable: false
+          type: :string
         },
         ref: %Schema{
-          type: :string,
-          nullable: false
+          type: :string
+        },
+        file: %Schema{
+          type: :string
+        },
+        build_url: %Schema{
+          type: :string
+        },
+        build_dir: %Schema{
+          type: :string
         }
       }
     }
index 77913b2238a3fb6d8b012afd8dd0522ac61a94a2..223625857148d9c990c604915123dd1c6ed74b0d 100644 (file)
@@ -6,8 +6,6 @@ defmodule Pleroma.FrontendTest do
   use Pleroma.DataCase
   alias Pleroma.Frontend
 
-  import ExUnit.CaptureIO, only: [capture_io: 1]
-
   @dir "test/frontend_static_test"
 
   setup do
@@ -32,9 +30,7 @@ defmodule Pleroma.FrontendTest do
       %Tesla.Env{status: 200, body: File.read!("test/fixtures/tesla_mock/frontend_dist.zip")}
     end)
 
-    capture_io(fn ->
-      Frontend.install("pleroma")
-    end)
+    Frontend.install("pleroma")
 
     assert File.exists?(Path.join([@dir, "frontends", "pleroma", "fantasy", "test.txt"]))
   end
@@ -54,9 +50,7 @@ defmodule Pleroma.FrontendTest do
     File.write!(previously_existing, "yey")
     assert File.exists?(previously_existing)
 
-    capture_io(fn ->
-      Frontend.install("pleroma", file: "test/fixtures/tesla_mock/frontend.zip")
-    end)
+    Frontend.install("pleroma", file: "test/fixtures/tesla_mock/frontend.zip")
 
     assert File.exists?(Path.join([folder, "test.txt"]))
     refute File.exists?(previously_existing)
@@ -67,13 +61,11 @@ defmodule Pleroma.FrontendTest do
       %Tesla.Env{status: 200, body: File.read!("test/fixtures/tesla_mock/frontend.zip")}
     end)
 
-    capture_io(fn ->
-      Frontend.install("unknown",
-        ref: "baka",
-        build_url: "http://gensokyo.2hu/madeup.zip",
-        build_dir: ""
-      )
-    end)
+    Frontend.install("unknown",
+      ref: "baka",
+      build_url: "http://gensokyo.2hu/madeup.zip",
+      build_dir: ""
+    )
 
     assert File.exists?(Path.join([@dir, "frontends", "unknown", "baka", "test.txt"]))
   end
index 461d6e5c93d99c694a4516140064acefcbdd6963..afe82ddf5c834a14166bd283fe6bf7c753378e60 100644 (file)
@@ -48,7 +48,7 @@ defmodule Pleroma.Web.AdminAPI.FrontendControllerTest do
   end
 
   describe "POST /api/pleroma/admin/frontends" do
-    test "it installs a frontend", %{conn: conn} do
+    test "from available frontends", %{conn: conn} do
       clear_config([:frontends, :available], %{
         "pleroma" => %{
           "ref" => "fantasy",
@@ -90,5 +90,55 @@ defmodule Pleroma.Web.AdminAPI.FrontendControllerTest do
                }
              ]
     end
+
+    test "from a file", %{conn: conn} do
+      clear_config([:frontends, :available], %{
+        "pleroma" => %{
+          "ref" => "fantasy",
+          "name" => "pleroma",
+          "build_dir" => ""
+        }
+      })
+
+      conn
+      |> put_req_header("content-type", "application/json")
+      |> post("/api/pleroma/admin/frontends", %{
+        name: "pleroma",
+        file: "test/fixtures/tesla_mock/frontend.zip"
+      })
+      |> json_response_and_validate_schema(:ok)
+
+      assert_enqueued(
+        worker: FrontendInstallerWorker,
+        args: %{
+          "name" => "pleroma",
+          "opts" => %{"file" => "test/fixtures/tesla_mock/frontend.zip"}
+        }
+      )
+
+      ObanHelpers.perform(all_enqueued(worker: FrontendInstallerWorker))
+
+      assert File.exists?(Path.join([@dir, "frontends", "pleroma", "fantasy", "test.txt"]))
+    end
+
+    test "from an URL", %{conn: conn} do
+      Tesla.Mock.mock(fn %{url: "http://gensokyo.2hu/madeup.zip"} ->
+        %Tesla.Env{status: 200, body: File.read!("test/fixtures/tesla_mock/frontend.zip")}
+      end)
+
+      conn
+      |> put_req_header("content-type", "application/json")
+      |> post("/api/pleroma/admin/frontends", %{
+        name: "unknown",
+        ref: "baka",
+        build_url: "http://gensokyo.2hu/madeup.zip",
+        build_dir: ""
+      })
+      |> json_response_and_validate_schema(:ok)
+
+      ObanHelpers.perform(all_enqueued(worker: FrontendInstallerWorker))
+
+      assert File.exists?(Path.join([@dir, "frontends", "unknown", "baka", "test.txt"]))
+    end
   end
 end