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)
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}
}
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
}
}
}
use Pleroma.DataCase
alias Pleroma.Frontend
- import ExUnit.CaptureIO, only: [capture_io: 1]
-
@dir "test/frontend_static_test"
setup 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
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)
%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
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",
}
]
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