diff options
25 files changed, 376 insertions, 178 deletions
diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index 01824aa18..ce7ba9b80 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -277,7 +277,7 @@ defmodule Mix.Tasks.Pleroma.User do shell_info("Generated user invite token " <> String.replace(invite.invite_type, "_", " ")) url = - Pleroma.Web.Router.Helpers.redirect_url( + Pleroma.Web.Router.Helpers.frontend_url( Pleroma.Web.Endpoint, :registration_page, invite.token diff --git a/lib/pleroma/emails/user_email.ex b/lib/pleroma/emails/user_email.ex index 313533859..1a1f6fb4b 100644 --- a/lib/pleroma/emails/user_email.ex +++ b/lib/pleroma/emails/user_email.ex @@ -52,7 +52,7 @@ defmodule Pleroma.Emails.UserEmail do to_name \\ nil ) do registration_url = - Router.Helpers.redirect_url( + Router.Helpers.frontend_url( Endpoint, :registration_page, user_invite_token.token diff --git a/lib/pleroma/frontend.ex b/lib/pleroma/frontend.ex new file mode 100644 index 000000000..646a0c806 --- /dev/null +++ b/lib/pleroma/frontend.ex @@ -0,0 +1,56 @@ +defmodule Pleroma.Frontend do + @type frontend_kind :: :primary + + def get_config(frontend \\ :primary) + + def get_config(:primary) do + primary_fe_config = Pleroma.Config.get([:frontends, :primary], %{"name" => "pleroma"}) + + {config, controller} = + if primary_fe_config["name"] == "none" do + {%{}, Pleroma.Web.Frontend.HeadlessController} + else + {primary_fe_config, + Module.concat([ + Pleroma.Web.Frontend, + String.capitalize(primary_fe_config["name"]) <> "Controller" + ])} + end + + %{"config" => config, "controller" => controller} + end + + @spec file_path(String.t(), frontend_kind()) :: {:ok, String.t()} | {:error, String.t()} + def file_path(file, kind \\ :primary) do + config = get_config(kind) + + instance_static_dir = Pleroma.Config.get([:instance, :static_dir], "instance/static") + + frontend_path = + case config["config"] do + %{"name" => name, "ref" => ref} -> + Path.join([instance_static_dir, "frontends", name, ref, file]) + + _ -> + false + end + + instance_path = Path.join([instance_static_dir, file]) + priv_path = Application.app_dir(:pleroma, ["priv", "static", file]) + + cond do + File.exists?(instance_path) -> + {:ok, instance_path} + + frontend_path && File.exists?(frontend_path) -> + {:ok, frontend_path} + + File.exists?(priv_path) -> + {:ok, priv_path} + + true -> + {:error, + "File #{file} not found in #{inspect([instance_path, frontend_path, priv_path])}"} + end + end +end diff --git a/lib/pleroma/plugs/frontend_plug.ex b/lib/pleroma/plugs/frontend_plug.ex new file mode 100644 index 000000000..b6bc23ae7 --- /dev/null +++ b/lib/pleroma/plugs/frontend_plug.ex @@ -0,0 +1,11 @@ +defmodule Pleroma.Plugs.FrontendPlug do + import Plug.Conn + + @behaviour Plug + + def init(opts), do: opts + + def call(conn, _opts) do + put_private(conn, :frontend, Pleroma.Frontend.get_config()) + end +end diff --git a/lib/pleroma/plugs/frontend_static.ex b/lib/pleroma/plugs/frontend_static.ex index f549ca75f..815f3bb20 100644 --- a/lib/pleroma/plugs/frontend_static.ex +++ b/lib/pleroma/plugs/frontend_static.ex @@ -21,8 +21,6 @@ defmodule Pleroma.Plugs.FrontendStatic do configuration["ref"], path ]) - else - nil end end diff --git a/lib/pleroma/plugs/instance_static.ex b/lib/pleroma/plugs/instance_static.ex index 0fb57e422..bb813a41a 100644 --- a/lib/pleroma/plugs/instance_static.ex +++ b/lib/pleroma/plugs/instance_static.ex @@ -12,17 +12,6 @@ defmodule Pleroma.Plugs.InstanceStatic do """ @behaviour Plug - def file_path(path) do - instance_path = - Path.join(Pleroma.Config.get([:instance, :static_dir], "instance/static/"), path) - - frontend_path = Pleroma.Plugs.FrontendStatic.file_path(path, :primary) - - (File.exists?(instance_path) && instance_path) || - (frontend_path && File.exists?(frontend_path) && frontend_path) || - Path.join(Application.app_dir(:pleroma, "priv/static/"), path) - end - def init(opts) do opts |> Keyword.put(:from, "__unconfigured_instance_static_plug") diff --git a/lib/pleroma/web/controller/frontend/headless_controller.ex b/lib/pleroma/web/controller/frontend/headless_controller.ex new file mode 100644 index 000000000..fe60c05dc --- /dev/null +++ b/lib/pleroma/web/controller/frontend/headless_controller.ex @@ -0,0 +1,9 @@ +defmodule Pleroma.Web.Frontend.HeadlessController do + use Pleroma.Web, :controller + + def fallback(conn, _params) do + conn + |> put_status(404) + |> text("") + end +end diff --git a/lib/pleroma/web/controller/frontend/kenoma_controller.ex b/lib/pleroma/web/controller/frontend/kenoma_controller.ex new file mode 100644 index 000000000..dbd487e7e --- /dev/null +++ b/lib/pleroma/web/controller/frontend/kenoma_controller.ex @@ -0,0 +1,4 @@ +defmodule Pleroma.Web.Frontend.KenomaController do + use Pleroma.Web, :controller + use Pleroma.Web.FrontendController +end diff --git a/lib/pleroma/web/controller/frontend/pleroma_controller.ex b/lib/pleroma/web/controller/frontend/pleroma_controller.ex new file mode 100644 index 000000000..18a376e6b --- /dev/null +++ b/lib/pleroma/web/controller/frontend/pleroma_controller.ex @@ -0,0 +1,4 @@ +defmodule Pleroma.Web.Frontend.PleromaController do + use Pleroma.Web, :controller + use Pleroma.Web.FrontendController +end diff --git a/lib/pleroma/web/controller/frontend_controller.ex b/lib/pleroma/web/controller/frontend_controller.ex new file mode 100644 index 000000000..2e9082db1 --- /dev/null +++ b/lib/pleroma/web/controller/frontend_controller.ex @@ -0,0 +1,131 @@ +defmodule Pleroma.Web.FrontendController do + use Pleroma.Web, :controller + + defmacro __using__(_opts) do + quote do + require Logger + alias Pleroma.User + + def fallback(conn, _params) do + conn + |> put_status(404) + |> text("Not found") + end + + def registration_page(conn, params) do + index(conn, params) + end + + def api_not_implemented(conn, _params) do + conn + |> put_status(404) + |> json(%{error: "Not implemented"}) + end + + def empty(conn, _params) do + conn + |> put_status(204) + |> text("") + end + + def index(conn, _params) do + {:ok, path} = Pleroma.Frontend.file_path("index.html") + + conn + |> put_resp_content_type("text/html") + |> send_file(conn.status || 200, path) + end + + def index_with_preload(conn, %{"path" => ["pleroma", "admin"]}) do + redirect(conn, to: "/pleroma/admin/") + end + + def index_with_preload(conn, params) do + index_with_generated_data(conn, params, [:preload]) + end + + def index_with_meta(conn, %{"maybe_nickname_or_id" => maybe_nickname_or_id} = params) do + with %User{} = user <- User.get_cached_by_nickname_or_id(maybe_nickname_or_id) do + index_with_meta(conn, %{user: user}) + else + nil -> + index(conn, params) + end + end + + def index_with_meta(conn, params) do + index_with_generated_data(conn, params, [:metadata, :preload]) + end + + defp index_with_generated_data(conn, params, generators) do + {:ok, path} = Pleroma.Frontend.file_path("index.html") + {:ok, index_content} = File.read(path) + + generated = + Enum.reduce(generators, "", fn generator, acc -> + acc <> generate_data(conn, params, generator) + end) + + response = String.replace(index_content, "<!--server-generated-meta-->", generated) + + html(conn, response) + end + + defp generate_data(conn, params, :preload) do + try do + Pleroma.Web.Preload.build_tags(conn, params) + rescue + e -> + Logger.error( + "Preloading for #{conn.request_path} failed.\n" <> + Exception.format(:error, e, __STACKTRACE__) + ) + + "" + end + end + + defp generate_data(conn, params, :metadata) do + try do + Pleroma.Web.Metadata.build_tags(params) + rescue + e -> + Logger.error( + "Metadata rendering for #{conn.request_path} failed.\n" <> + Exception.format(:error, e, __STACKTRACE__) + ) + + "" + end + end + + defoverridable api_not_implemented: 2, + empty: 2, + fallback: 2, + index: 2, + index_with_preload: 2, + index_with_meta: 2, + registration_page: 2 + end + end + + defp action(conn, _opts) do + fe_config = conn.private[:frontend] || Pleroma.Frontend.get_config(:primary) + + action_name = action_name(conn) + + {controller, action} = + cond do + function_exported?(fe_config["controller"], action_name, 2) -> + {fe_config["controller"], action_name} + + true -> + {fe_config["controller"], :fallback} + end + + conn + |> put_private(:frontend, fe_config) + |> put_view(Phoenix.Controller.__view__(controller)) + |> controller.call(controller.init(action)) + end +end diff --git a/lib/pleroma/web/endpoint.ex b/lib/pleroma/web/endpoint.ex index 527fb288d..22dfe8298 100644 --- a/lib/pleroma/web/endpoint.ex +++ b/lib/pleroma/web/endpoint.ex @@ -13,6 +13,7 @@ defmodule Pleroma.Web.Endpoint do plug(CORSPlug) plug(Pleroma.Plugs.HTTPSecurityPlug) plug(Pleroma.Plugs.UploadedMedia) + plug(Pleroma.Plugs.FrontendPlug) @static_cache_control "public, no-cache" diff --git a/lib/pleroma/web/fallback_redirect_controller.ex b/lib/pleroma/web/fallback_redirect_controller.ex deleted file mode 100644 index 431ad5485..000000000 --- a/lib/pleroma/web/fallback_redirect_controller.ex +++ /dev/null @@ -1,108 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Fallback.RedirectController do - use Pleroma.Web, :controller - - require Logger - - alias Pleroma.User - alias Pleroma.Web.Metadata - alias Pleroma.Web.Preload - - def api_not_implemented(conn, _params) do - conn - |> put_status(404) - |> json(%{error: "Not implemented"}) - end - - def redirector(conn, _params, code \\ 200) do - conn - |> put_resp_content_type("text/html") - |> send_file(code, index_file_path()) - end - - def redirector_with_meta(conn, %{"maybe_nickname_or_id" => maybe_nickname_or_id} = params) do - with %User{} = user <- User.get_cached_by_nickname_or_id(maybe_nickname_or_id) do - redirector_with_meta(conn, %{user: user}) - else - nil -> - redirector(conn, params) - end - end - - def redirector_with_meta(conn, params) do - {:ok, index_content} = File.read(index_file_path()) - - tags = build_tags(conn, params) - preloads = preload_data(conn, params) - - response = - index_content - |> String.replace("<!--server-generated-meta-->", tags <> preloads) - - conn - |> put_resp_content_type("text/html") - |> send_resp(200, response) - end - - def redirector_with_preload(conn, %{"path" => ["pleroma", "admin"]}) do - redirect(conn, to: "/pleroma/admin/") - end - - def redirector_with_preload(conn, params) do - {:ok, index_content} = File.read(index_file_path()) - preloads = preload_data(conn, params) - - response = - index_content - |> String.replace("<!--server-generated-meta-->", preloads) - - conn - |> put_resp_content_type("text/html") - |> send_resp(200, response) - end - - def registration_page(conn, params) do - redirector(conn, params) - end - - def empty(conn, _params) do - conn - |> put_status(204) - |> text("") - end - - defp index_file_path do - Pleroma.Plugs.InstanceStatic.file_path("index.html") - end - - defp build_tags(conn, params) do - try do - Metadata.build_tags(params) - rescue - e -> - Logger.error( - "Metadata rendering for #{conn.request_path} failed.\n" <> - Exception.format(:error, e, __STACKTRACE__) - ) - - "" - end - end - - defp preload_data(conn, params) do - try do - Preload.build_tags(conn, params) - rescue - e -> - Logger.error( - "Preloading for #{conn.request_path} failed.\n" <> - Exception.format(:error, e, __STACKTRACE__) - ) - - "" - end - end -end diff --git a/lib/pleroma/web/feed/user_controller.ex b/lib/pleroma/web/feed/user_controller.ex index 9cd334a33..7118c087c 100644 --- a/lib/pleroma/web/feed/user_controller.ex +++ b/lib/pleroma/web/feed/user_controller.ex @@ -5,7 +5,6 @@ defmodule Pleroma.Web.Feed.UserController do use Pleroma.Web, :controller - alias Fallback.RedirectController alias Pleroma.User alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.Web.ActivityPub.ActivityPubController @@ -17,7 +16,9 @@ defmodule Pleroma.Web.Feed.UserController do def feed_redirect(%{assigns: %{format: "html"}} = conn, %{"nickname" => nickname}) do with {_, %User{} = user} <- {:fetch_user, User.get_cached_by_nickname_or_id(nickname)} do - RedirectController.redirector_with_meta(conn, %{user: user}) + conn + |> Map.put(:params, %{user: user}) + |> Pleroma.Web.FrontendController.call(:index_with_meta) end end diff --git a/lib/pleroma/web/ostatus/ostatus_controller.ex b/lib/pleroma/web/ostatus/ostatus_controller.ex index de1b0b3f0..a1b8a3adc 100644 --- a/lib/pleroma/web/ostatus/ostatus_controller.ex +++ b/lib/pleroma/web/ostatus/ostatus_controller.ex @@ -5,7 +5,6 @@ defmodule Pleroma.Web.OStatus.OStatusController do use Pleroma.Web, :controller - alias Fallback.RedirectController alias Pleroma.Activity alias Pleroma.Object alias Pleroma.Plugs.RateLimiter @@ -91,24 +90,25 @@ defmodule Pleroma.Web.OStatus.OStatusController do activity.data["type"] == "Create" -> %Object{} = object = Object.normalize(activity) - RedirectController.redirector_with_meta( - conn, - %{ - activity_id: activity.id, - object: object, - url: Router.Helpers.o_status_url(Endpoint, :notice, activity.id), - user: user - } - ) + params = %{ + activity_id: activity.id, + object: object, + url: Router.Helpers.o_status_url(Endpoint, :notice, activity.id), + user: user + } + + conn + |> Map.put(:params, params) + |> Pleroma.Web.FrontendController.call(:index_with_meta) true -> - RedirectController.redirector(conn, nil) + Pleroma.Web.FrontendController.call(conn, :index) end else reason when reason in [{:public?, false}, {:activity, nil}] -> conn |> put_status(404) - |> RedirectController.redirector(nil, 404) + |> Pleroma.Web.FrontendController.call(:index) e -> e @@ -135,7 +135,7 @@ defmodule Pleroma.Web.OStatus.OStatusController do _error -> conn |> put_status(404) - |> RedirectController.redirector(nil, 404) + |> Pleroma.Web.FrontendController.call(:index) end end diff --git a/lib/pleroma/web/preload/instance.ex b/lib/pleroma/web/preload/instance.ex index 50d1f3382..ad8f33f6f 100644 --- a/lib/pleroma/web/preload/instance.ex +++ b/lib/pleroma/web/preload/instance.ex @@ -3,7 +3,6 @@ # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Web.Preload.Providers.Instance do - alias Pleroma.Plugs.InstanceStatic alias Pleroma.Web.MastodonAPI.InstanceView alias Pleroma.Web.Nodeinfo.Nodeinfo alias Pleroma.Web.Preload.Providers.Provider @@ -28,13 +27,13 @@ defmodule Pleroma.Web.Preload.Providers.Instance do end defp build_panel_tag(acc) do - instance_path = InstanceStatic.file_path(@panel_url |> to_string()) + case Pleroma.Frontend.file_path(@panel_url |> to_string()) do + {:ok, file} -> + panel_data = File.read!(file) + Map.put(acc, @panel_url, panel_data) - if File.exists?(instance_path) do - panel_data = File.read!(instance_path) - Map.put(acc, @panel_url, panel_data) - else - acc + _ -> + acc end end diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index c6433cc53..1e3ecf298 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -715,12 +715,12 @@ defmodule Pleroma.Web.Router do get("/check_password", MongooseIMController, :check_password) end - scope "/", Fallback do - get("/registration/:token", RedirectController, :registration_page) - get("/:maybe_nickname_or_id", RedirectController, :redirector_with_meta) - get("/api*path", RedirectController, :api_not_implemented) - get("/*path", RedirectController, :redirector_with_preload) + scope "/", Pleroma.Web do + get("/registration/:token", FrontendController, :registration_page) + get("/:maybe_nickname_or_id", FrontendController, :index_with_meta) + get("/api*path", FrontendController, :api_not_implemented) + get("/*path", FrontendController, :index_with_preload) - options("/*path", RedirectController, :empty) + options("/*path", FrontendController, :empty) end end diff --git a/lib/pleroma/web/web.ex b/lib/pleroma/web/web.ex index 4f9281851..920d68461 100644 --- a/lib/pleroma/web/web.ex +++ b/lib/pleroma/web/web.ex @@ -120,6 +120,8 @@ defmodule Pleroma.Web do conn end end + + defoverridable(action: 2) end end diff --git a/test/emails/user_email_test.exs b/test/emails/user_email_test.exs index a75623bb4..c6044a8a5 100644 --- a/test/emails/user_email_test.exs +++ b/test/emails/user_email_test.exs @@ -31,7 +31,7 @@ defmodule Pleroma.Emails.UserEmailTest do assert email.to == [{"Jonh", "test@test.com"}] assert email.html_body =~ - Router.Helpers.redirect_url(Endpoint, :registration_page, token.token) + Router.Helpers.frontend_url(Endpoint, :registration_page, token.token) end test "build account confirmation email" do diff --git a/test/frontend_test.exs b/test/frontend_test.exs new file mode 100644 index 000000000..ad8568092 --- /dev/null +++ b/test/frontend_test.exs @@ -0,0 +1,75 @@ +defmodule Pleroma.FrontendTest do + use ExUnit.Case + use Pleroma.Tests.Helpers + + describe "get_config/1" do + test "Primary config" do + config = %{"name" => "monsta", "ref" => "pika"} + + clear_config([:frontends, :primary], config) + + fe_config = Pleroma.Frontend.get_config() + assert fe_config["config"] == config + assert fe_config["controller"] == Pleroma.Web.Frontend.MonstaController + end + + test "Headless" do + config = %{"name" => "none", "ref" => "void"} + + clear_config([:frontends, :primary], config) + + fe_config = Pleroma.Frontend.get_config() + assert fe_config["config"] == %{} + assert fe_config["controller"] == Pleroma.Web.Frontend.HeadlessController + end + end + + describe "file_path/2" do + @dir "test/tmp/instance_static" + @filename "gif.bat" + + setup do + File.mkdir_p!(@dir) + + config = %{"name" => "monsta", "ref" => "mew"} + + clear_config([:frontends, :primary], config) + clear_config([:instance, :static_dir], @dir) + + fe_path = Path.join([@dir, "frontends", config["name"], config["ref"]]) + File.mkdir_p!(fe_path) + priv_path = Application.app_dir(:pleroma, ["priv", "static"]) + + on_exit(fn -> + File.rm_rf(@dir) + File.rm(Path.join(priv_path, @filename)) + end) + + {:ok, %{frontend_path: fe_path, priv_path: priv_path}} + end + + test "instance static path priority", %{frontend_path: fp, priv_path: pp} do + Enum.each([@dir, fp, pp], &File.write!(Path.join(&1, @filename), "sup")) + + assert Pleroma.Frontend.file_path(@filename) == {:ok, Path.join(@dir, @filename)} + end + + test "frontend path priority", %{frontend_path: fp, priv_path: pp} do + Enum.each([fp, pp], &File.write!(Path.join(&1, @filename), "sup")) + + assert Pleroma.Frontend.file_path(@filename) == {:ok, Path.join(fp, @filename)} + end + + test "priv path fallback", %{priv_path: pp} do + File.write!(Path.join(pp, @filename), "sup") + + assert Pleroma.Frontend.file_path(@filename) == {:ok, Path.join(pp, @filename)} + end + + test "non-existing file" do + assert {:error, error} = Pleroma.Frontend.file_path("miseeen.jgp.pgn.mp5.avee") + + assert String.valid?(error) + end + end +end diff --git a/test/plugs/frontend_plug_test.exs b/test/plugs/frontend_plug_test.exs new file mode 100644 index 000000000..d75c7a54b --- /dev/null +++ b/test/plugs/frontend_plug_test.exs @@ -0,0 +1,21 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.FrontendPlugTest do + use Pleroma.Web.ConnCase + + test "Puts correct conn.private.frontend", %{conn: conn} do + config = %{"name" => "sake", "ref" => "beer"} + + clear_config([:frontends, :primary], config) + + plug = Pleroma.Plugs.FrontendPlug.init(nil) + conn = Pleroma.Plugs.FrontendPlug.call(conn, plug) + + frontend = Map.get(conn.private, :frontend, %{}) + + assert frontend["controller"] == Pleroma.Web.Frontend.SakeController + assert frontend["config"] == config + end +end diff --git a/test/plugs/frontend_static_test.exs b/test/plugs/frontend_static_test.exs index d11d91d78..c0ffc9bda 100644 --- a/test/plugs/frontend_static_test.exs +++ b/test/plugs/frontend_static_test.exs @@ -15,7 +15,7 @@ defmodule Pleroma.Web.FrontendStaticPlugTest do setup do: clear_config([:instance, :static_dir], @dir) test "overrides existing static files", %{conn: conn} do - name = "pelmora" + name = "pleroma" ref = "uguu" clear_config([:frontends, :primary], %{"name" => name, "ref" => ref}) diff --git a/test/plugs/instance_static_test.exs b/test/plugs/instance_static_test.exs index d42ba817e..c4c5e948e 100644 --- a/test/plugs/instance_static_test.exs +++ b/test/plugs/instance_static_test.exs @@ -6,14 +6,16 @@ defmodule Pleroma.Web.InstanceStaticPlugTest do use Pleroma.Web.ConnCase @dir "test/tmp/instance_static" + @fe_name "pleroma" + @fe_ref "uguu" setup do File.mkdir_p!(@dir) on_exit(fn -> File.rm_rf(@dir) end) + clear_config([:instance, :static_dir], @dir) + clear_config([:frontends, :primary], %{"name" => @fe_name, "ref" => @fe_ref}) end - setup do: clear_config([:instance, :static_dir], @dir) - test "overrides index" do bundled_index = get(build_conn(), "/") refute html_response(bundled_index, 200) == "hello world" @@ -25,15 +27,10 @@ defmodule Pleroma.Web.InstanceStaticPlugTest do end test "also overrides frontend files", %{conn: conn} do - name = "pelmora" - ref = "uguu" - - clear_config([:frontends, :primary], %{"name" => name, "ref" => ref}) - bundled_index = get(conn, "/") refute html_response(bundled_index, 200) == "from frontend plug" - path = "#{@dir}/frontends/#{name}/#{ref}" + path = "#{@dir}/frontends/#{@fe_name}/#{@fe_ref}" File.mkdir_p!(path) File.write!("#{path}/index.html", "from frontend plug") diff --git a/test/web/controllers/frontend/headless_controller_test.exs b/test/web/controllers/frontend/headless_controller_test.exs new file mode 100644 index 000000000..b3245c9ee --- /dev/null +++ b/test/web/controllers/frontend/headless_controller_test.exs @@ -0,0 +1,10 @@ +defmodule Pleroma.Web.Frontend.HeadlessControllerTest do + use Pleroma.Web.ConnCase + + setup do: clear_config([:frontends, :primary], %{"name" => "none", "ref" => "none"}) + + test "Returns 404", %{conn: conn} do + conn = get(conn, "/") + assert text_response(conn, 404) == "" + end +end diff --git a/test/web/fallback_test.exs b/test/web/controllers/frontend/pleroma_controller_test.exs index a65865860..515b7b3b2 100644 --- a/test/web/fallback_test.exs +++ b/test/web/controllers/frontend/pleroma_controller_test.exs @@ -1,14 +1,14 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Web.FallbackTest do +defmodule Pleroma.Web.Frontend.PleromaControllerTest do use Pleroma.Web.ConnCase import Pleroma.Factory + test "GET /pleroma/admin -> /pleroma/admin/", %{conn: conn} do + assert redirected_to(get(conn, "/pleroma/admin")) =~ "/pleroma/admin/" + end + describe "neither preloaded data nor metadata attached to" do test "GET /registration/:token", %{conn: conn} do - response = get(conn, "/registration/foo") + response = get(conn, frontend_path(conn, :registration_page, "foo")) assert html_response(response, 200) =~ "<!--server-generated-meta-->" end @@ -23,8 +23,8 @@ defmodule Pleroma.Web.FallbackTest do describe "preloaded data and metadata attached to" do test "GET /:maybe_nickname_or_id", %{conn: conn} do user = insert(:user) - user_missing = get(conn, "/foo") - user_present = get(conn, "/#{user.nickname}") + user_missing = get(conn, frontend_path(conn, :index_with_meta, "foo")) + user_present = get(conn, frontend_path(conn, :index_with_meta, user.nickname)) assert(html_response(user_missing, 200) =~ "<!--server-generated-meta-->") refute html_response(user_present, 200) =~ "<!--server-generated-meta-->" @@ -64,10 +64,6 @@ defmodule Pleroma.Web.FallbackTest do |> json_response(404) == %{"error" => "Not implemented"} end - test "GET /pleroma/admin -> /pleroma/admin/", %{conn: conn} do - assert redirected_to(get(conn, "/pleroma/admin")) =~ "/pleroma/admin/" - end - test "OPTIONS /*path", %{conn: conn} do assert conn |> options("/foo") diff --git a/test/web/feed/user_controller_test.exs b/test/web/feed/user_controller_test.exs index 0d2a61967..fb7f66551 100644 --- a/test/web/feed/user_controller_test.exs +++ b/test/web/feed/user_controller_test.exs @@ -205,11 +205,13 @@ defmodule Pleroma.Web.Feed.UserControllerTest do |> get("/users/#{user.nickname}") |> response(200) - assert response == - Fallback.RedirectController.redirector_with_meta( - conn, - %{user: user} - ).resp_body + expected = + conn + |> Map.put(:params, %{user: user}) + |> Pleroma.Web.FrontendController.call(:index_with_meta) + |> Map.get(:resp_body) + + assert response == expected end test "with html format, it returns error when user is not found", %{conn: conn} do |