reverse proxy tests See merge request pleroma/pleroma!1385stable
commit
b6fd16d0a4
@ -0,0 +1,24 @@
|
|||||||
|
defmodule Pleroma.ReverseProxy.Client do
|
||||||
|
@callback request(atom(), String.t(), [tuple()], String.t(), list()) ::
|
||||||
|
{:ok, pos_integer(), [tuple()], reference() | map()}
|
||||||
|
| {:ok, pos_integer(), [tuple()]}
|
||||||
|
| {:ok, reference()}
|
||||||
|
| {:error, term()}
|
||||||
|
|
||||||
|
@callback stream_body(reference() | pid() | map()) ::
|
||||||
|
{:ok, binary()} | :done | {:error, String.t()}
|
||||||
|
|
||||||
|
@callback close(reference() | pid() | map()) :: :ok
|
||||||
|
|
||||||
|
def request(method, url, headers, "", opts \\ []) do
|
||||||
|
client().request(method, url, headers, "", opts)
|
||||||
|
end
|
||||||
|
|
||||||
|
def stream_body(ref), do: client().stream_body(ref)
|
||||||
|
|
||||||
|
def close(ref), do: client().close(ref)
|
||||||
|
|
||||||
|
defp client do
|
||||||
|
Pleroma.Config.get([Pleroma.ReverseProxy.Client], :hackney)
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,91 @@
|
|||||||
|
defmodule Pleroma.HTTP.RequestBuilderTest do
|
||||||
|
use ExUnit.Case, async: true
|
||||||
|
alias Pleroma.HTTP.RequestBuilder
|
||||||
|
|
||||||
|
describe "headers/2" do
|
||||||
|
test "don't send pleroma user agent" do
|
||||||
|
assert RequestBuilder.headers(%{}, []) == %{headers: []}
|
||||||
|
end
|
||||||
|
|
||||||
|
test "send pleroma user agent" do
|
||||||
|
send = Pleroma.Config.get([:http, :send_user_agent])
|
||||||
|
Pleroma.Config.put([:http, :send_user_agent], true)
|
||||||
|
|
||||||
|
on_exit(fn ->
|
||||||
|
Pleroma.Config.put([:http, :send_user_agent], send)
|
||||||
|
end)
|
||||||
|
|
||||||
|
assert RequestBuilder.headers(%{}, []) == %{
|
||||||
|
headers: [{"User-Agent", Pleroma.Application.user_agent()}]
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "add_optional_params/3" do
|
||||||
|
test "don't add if keyword is empty" do
|
||||||
|
assert RequestBuilder.add_optional_params(%{}, %{}, []) == %{}
|
||||||
|
end
|
||||||
|
|
||||||
|
test "add query parameter" do
|
||||||
|
assert RequestBuilder.add_optional_params(
|
||||||
|
%{},
|
||||||
|
%{query: :query, body: :body, another: :val},
|
||||||
|
[
|
||||||
|
{:query, "param1=val1¶m2=val2"},
|
||||||
|
{:body, "some body"}
|
||||||
|
]
|
||||||
|
) == %{query: "param1=val1¶m2=val2", body: "some body"}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "add_param/4" do
|
||||||
|
test "add file parameter" do
|
||||||
|
%{
|
||||||
|
body: %Tesla.Multipart{
|
||||||
|
boundary: _,
|
||||||
|
content_type_params: [],
|
||||||
|
parts: [
|
||||||
|
%Tesla.Multipart.Part{
|
||||||
|
body: %File.Stream{
|
||||||
|
line_or_bytes: 2048,
|
||||||
|
modes: [:raw, :read_ahead, :read, :binary],
|
||||||
|
path: "some-path/filename.png",
|
||||||
|
raw: true
|
||||||
|
},
|
||||||
|
dispositions: [name: "filename.png", filename: "filename.png"],
|
||||||
|
headers: []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
} = RequestBuilder.add_param(%{}, :file, "filename.png", "some-path/filename.png")
|
||||||
|
end
|
||||||
|
|
||||||
|
test "add key to body" do
|
||||||
|
%{
|
||||||
|
body: %Tesla.Multipart{
|
||||||
|
boundary: _,
|
||||||
|
content_type_params: [],
|
||||||
|
parts: [
|
||||||
|
%Tesla.Multipart.Part{
|
||||||
|
body: "\"someval\"",
|
||||||
|
dispositions: [name: "somekey"],
|
||||||
|
headers: ["Content-Type": "application/json"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
} = RequestBuilder.add_param(%{}, :body, "somekey", "someval")
|
||||||
|
end
|
||||||
|
|
||||||
|
test "add form parameter" do
|
||||||
|
assert RequestBuilder.add_param(%{}, :form, "somename", "someval") == %{
|
||||||
|
body: %{"somename" => "someval"}
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
test "add for location" do
|
||||||
|
assert RequestBuilder.add_param(%{}, :some_location, "somekey", "someval") == %{
|
||||||
|
some_location: [{"somekey", "someval"}]
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,297 @@
|
|||||||
|
defmodule Pleroma.ReverseProxyTest do
|
||||||
|
use Pleroma.Web.ConnCase, async: true
|
||||||
|
import ExUnit.CaptureLog
|
||||||
|
import ExUnit.CaptureLog
|
||||||
|
import Mox
|
||||||
|
alias Pleroma.ReverseProxy
|
||||||
|
alias Pleroma.ReverseProxy.ClientMock
|
||||||
|
|
||||||
|
setup_all do
|
||||||
|
{:ok, _} = Registry.start_link(keys: :unique, name: Pleroma.ReverseProxy.ClientMock)
|
||||||
|
:ok
|
||||||
|
end
|
||||||
|
|
||||||
|
setup :verify_on_exit!
|
||||||
|
|
||||||
|
defp user_agent_mock(user_agent, invokes) do
|
||||||
|
json = Jason.encode!(%{"user-agent": user_agent})
|
||||||
|
|
||||||
|
ClientMock
|
||||||
|
|> expect(:request, fn :get, url, _, _, _ ->
|
||||||
|
Registry.register(Pleroma.ReverseProxy.ClientMock, url, 0)
|
||||||
|
|
||||||
|
{:ok, 200,
|
||||||
|
[
|
||||||
|
{"content-type", "application/json"},
|
||||||
|
{"content-length", byte_size(json) |> to_string()}
|
||||||
|
], %{url: url}}
|
||||||
|
end)
|
||||||
|
|> expect(:stream_body, invokes, fn %{url: url} ->
|
||||||
|
case Registry.lookup(Pleroma.ReverseProxy.ClientMock, url) do
|
||||||
|
[{_, 0}] ->
|
||||||
|
Registry.update_value(Pleroma.ReverseProxy.ClientMock, url, &(&1 + 1))
|
||||||
|
{:ok, json}
|
||||||
|
|
||||||
|
[{_, 1}] ->
|
||||||
|
Registry.unregister(Pleroma.ReverseProxy.ClientMock, url)
|
||||||
|
:done
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "user-agent" do
|
||||||
|
test "don't keep", %{conn: conn} do
|
||||||
|
user_agent_mock("hackney/1.15.1", 2)
|
||||||
|
conn = ReverseProxy.call(conn, "/user-agent")
|
||||||
|
assert json_response(conn, 200) == %{"user-agent" => "hackney/1.15.1"}
|
||||||
|
end
|
||||||
|
|
||||||
|
test "keep", %{conn: conn} do
|
||||||
|
user_agent_mock(Pleroma.Application.user_agent(), 2)
|
||||||
|
conn = ReverseProxy.call(conn, "/user-agent-keep", keep_user_agent: true)
|
||||||
|
assert json_response(conn, 200) == %{"user-agent" => Pleroma.Application.user_agent()}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
test "closed connection", %{conn: conn} do
|
||||||
|
ClientMock
|
||||||
|
|> expect(:request, fn :get, "/closed", _, _, _ -> {:ok, 200, [], %{}} end)
|
||||||
|
|> expect(:stream_body, fn _ -> {:error, :closed} end)
|
||||||
|
|> expect(:close, fn _ -> :ok end)
|
||||||
|
|
||||||
|
conn = ReverseProxy.call(conn, "/closed")
|
||||||
|
assert conn.halted
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "max_body " do
|
||||||
|
test "length returns error if content-length more than option", %{conn: conn} do
|
||||||
|
user_agent_mock("hackney/1.15.1", 0)
|
||||||
|
|
||||||
|
assert capture_log(fn ->
|
||||||
|
ReverseProxy.call(conn, "/user-agent", max_body_length: 4)
|
||||||
|
end) =~
|
||||||
|
"[error] Elixir.Pleroma.ReverseProxy: request to \"/user-agent\" failed: :body_too_large"
|
||||||
|
end
|
||||||
|
|
||||||
|
defp stream_mock(invokes, with_close? \\ false) do
|
||||||
|
ClientMock
|
||||||
|
|> expect(:request, fn :get, "/stream-bytes/" <> length, _, _, _ ->
|
||||||
|
Registry.register(Pleroma.ReverseProxy.ClientMock, "/stream-bytes/" <> length, 0)
|
||||||
|
|
||||||
|
{:ok, 200, [{"content-type", "application/octet-stream"}],
|
||||||
|
%{url: "/stream-bytes/" <> length}}
|
||||||
|
end)
|
||||||
|
|> expect(:stream_body, invokes, fn %{url: "/stream-bytes/" <> length} ->
|
||||||
|
max = String.to_integer(length)
|
||||||
|
|
||||||
|
case Registry.lookup(Pleroma.ReverseProxy.ClientMock, "/stream-bytes/" <> length) do
|
||||||
|
[{_, current}] when current < max ->
|
||||||
|
Registry.update_value(
|
||||||
|
Pleroma.ReverseProxy.ClientMock,
|
||||||
|
"/stream-bytes/" <> length,
|
||||||
|
&(&1 + 10)
|
||||||
|
)
|
||||||
|
|
||||||
|
{:ok, "0123456789"}
|
||||||
|
|
||||||
|
[{_, ^max}] ->
|
||||||
|
Registry.unregister(Pleroma.ReverseProxy.ClientMock, "/stream-bytes/" <> length)
|
||||||
|
:done
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
if with_close? do
|
||||||
|
expect(ClientMock, :close, fn _ -> :ok end)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
test "max_body_size returns error if streaming body more than that option", %{conn: conn} do
|
||||||
|
stream_mock(3, true)
|
||||||
|
|
||||||
|
assert capture_log(fn ->
|
||||||
|
ReverseProxy.call(conn, "/stream-bytes/50", max_body_size: 30)
|
||||||
|
end) =~
|
||||||
|
"[warn] Elixir.Pleroma.ReverseProxy request to /stream-bytes/50 failed while reading/chunking: :body_too_large"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "HEAD requests" do
|
||||||
|
test "common", %{conn: conn} do
|
||||||
|
ClientMock
|
||||||
|
|> expect(:request, fn :head, "/head", _, _, _ ->
|
||||||
|
{:ok, 200, [{"content-type", "text/html; charset=utf-8"}]}
|
||||||
|
end)
|
||||||
|
|
||||||
|
conn = ReverseProxy.call(Map.put(conn, :method, "HEAD"), "/head")
|
||||||
|
assert html_response(conn, 200) == ""
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp error_mock(status) when is_integer(status) do
|
||||||
|
ClientMock
|
||||||
|
|> expect(:request, fn :get, "/status/" <> _, _, _, _ ->
|
||||||
|
{:error, status}
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "returns error on" do
|
||||||
|
test "500", %{conn: conn} do
|
||||||
|
error_mock(500)
|
||||||
|
|
||||||
|
capture_log(fn -> ReverseProxy.call(conn, "/status/500") end) =~
|
||||||
|
"[error] Elixir.Pleroma.ReverseProxy: request to /status/500 failed with HTTP status 500"
|
||||||
|
end
|
||||||
|
|
||||||
|
test "400", %{conn: conn} do
|
||||||
|
error_mock(400)
|
||||||
|
|
||||||
|
capture_log(fn -> ReverseProxy.call(conn, "/status/400") end) =~
|
||||||
|
"[error] Elixir.Pleroma.ReverseProxy: request to /status/400 failed with HTTP status 400"
|
||||||
|
end
|
||||||
|
|
||||||
|
test "204", %{conn: conn} do
|
||||||
|
ClientMock
|
||||||
|
|> expect(:request, fn :get, "/status/204", _, _, _ -> {:ok, 204, [], %{}} end)
|
||||||
|
|
||||||
|
capture_log(fn ->
|
||||||
|
conn = ReverseProxy.call(conn, "/status/204")
|
||||||
|
assert conn.resp_body == "Request failed: No Content"
|
||||||
|
assert conn.halted
|
||||||
|
end) =~
|
||||||
|
"[error] Elixir.Pleroma.ReverseProxy: request to \"/status/204\" failed with HTTP status 204"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
test "streaming", %{conn: conn} do
|
||||||
|
stream_mock(21)
|
||||||
|
conn = ReverseProxy.call(conn, "/stream-bytes/200")
|
||||||
|
assert conn.state == :chunked
|
||||||
|
assert byte_size(conn.resp_body) == 200
|
||||||
|
assert Plug.Conn.get_resp_header(conn, "content-type") == ["application/octet-stream"]
|
||||||
|
end
|
||||||
|
|
||||||
|
defp headers_mock(_) do
|
||||||
|
ClientMock
|
||||||
|
|> expect(:request, fn :get, "/headers", headers, _, _ ->
|
||||||
|
Registry.register(Pleroma.ReverseProxy.ClientMock, "/headers", 0)
|
||||||
|
{:ok, 200, [{"content-type", "application/json"}], %{url: "/headers", headers: headers}}
|
||||||
|
end)
|
||||||
|
|> expect(:stream_body, 2, fn %{url: url, headers: headers} ->
|
||||||
|
case Registry.lookup(Pleroma.ReverseProxy.ClientMock, url) do
|
||||||
|
[{_, 0}] ->
|
||||||
|
Registry.update_value(Pleroma.ReverseProxy.ClientMock, url, &(&1 + 1))
|
||||||
|
headers = for {k, v} <- headers, into: %{}, do: {String.capitalize(k), v}
|
||||||
|
{:ok, Jason.encode!(%{headers: headers})}
|
||||||
|
|
||||||
|
[{_, 1}] ->
|
||||||
|
Registry.unregister(Pleroma.ReverseProxy.ClientMock, url)
|
||||||
|
:done
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
:ok
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "keep request headers" do
|
||||||
|
setup [:headers_mock]
|
||||||
|
|
||||||
|
test "header passes", %{conn: conn} do
|
||||||
|
conn =
|
||||||
|
Plug.Conn.put_req_header(
|
||||||
|
conn,
|
||||||
|
"accept",
|
||||||
|
"text/html"
|
||||||
|
)
|
||||||
|
|> ReverseProxy.call("/headers")
|
||||||
|
|
||||||
|
%{"headers" => headers} = json_response(conn, 200)
|
||||||
|
assert headers["Accept"] == "text/html"
|
||||||
|
end
|
||||||
|
|
||||||
|
test "header is filtered", %{conn: conn} do
|
||||||
|
conn =
|
||||||
|
Plug.Conn.put_req_header(
|
||||||
|
conn,
|
||||||
|
"accept-language",
|
||||||
|
"en-US"
|
||||||
|
)
|
||||||
|
|> ReverseProxy.call("/headers")
|
||||||
|
|
||||||
|
%{"headers" => headers} = json_response(conn, 200)
|
||||||
|
refute headers["Accept-Language"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
test "returns 400 on non GET, HEAD requests", %{conn: conn} do
|
||||||
|
conn = ReverseProxy.call(Map.put(conn, :method, "POST"), "/ip")
|
||||||
|
assert conn.status == 400
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "cache resp headers" do
|
||||||
|
test "returns headers", %{conn: conn} do
|
||||||
|
ClientMock
|
||||||
|
|> expect(:request, fn :get, "/cache/" <> ttl, _, _, _ ->
|
||||||
|
{:ok, 200, [{"cache-control", "public, max-age=" <> ttl}], %{}}
|
||||||
|
end)
|
||||||
|
|> expect(:stream_body, fn _ -> :done end)
|
||||||
|
|
||||||
|
conn = ReverseProxy.call(conn, "/cache/10")
|
||||||
|
assert {"cache-control", "public, max-age=10"} in conn.resp_headers
|
||||||
|
end
|
||||||
|
|
||||||
|
test "add cache-control", %{conn: conn} do
|
||||||
|
ClientMock
|
||||||
|
|> expect(:request, fn :get, "/cache", _, _, _ ->
|
||||||
|
{:ok, 200, [{"ETag", "some ETag"}], %{}}
|
||||||
|
end)
|
||||||
|
|> expect(:stream_body, fn _ -> :done end)
|
||||||
|
|
||||||
|
conn = ReverseProxy.call(conn, "/cache")
|
||||||
|
assert {"cache-control", "public"} in conn.resp_headers
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp disposition_headers_mock(headers) do
|
||||||
|
ClientMock
|
||||||
|
|> expect(:request, fn :get, "/disposition", _, _, _ ->
|
||||||
|
Registry.register(Pleroma.ReverseProxy.ClientMock, "/disposition", 0)
|
||||||
|
|
||||||
|
{:ok, 200, headers, %{url: "/disposition"}}
|
||||||
|
end)
|
||||||
|
|> expect(:stream_body, 2, fn %{url: "/disposition"} ->
|
||||||
|
case Registry.lookup(Pleroma.ReverseProxy.ClientMock, "/disposition") do
|
||||||
|
[{_, 0}] ->
|
||||||
|
Registry.update_value(Pleroma.ReverseProxy.ClientMock, "/disposition", &(&1 + 1))
|
||||||
|
{:ok, ""}
|
||||||
|
|
||||||
|
[{_, 1}] ->
|
||||||
|
Registry.unregister(Pleroma.ReverseProxy.ClientMock, "/disposition")
|
||||||
|
:done
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "response content disposition header" do
|
||||||
|
test "not atachment", %{conn: conn} do
|
||||||
|
disposition_headers_mock([
|
||||||
|
{"content-type", "image/gif"},
|
||||||
|
{"content-length", 0}
|
||||||
|
])
|
||||||
|
|
||||||
|
conn = ReverseProxy.call(conn, "/disposition")
|
||||||
|
|
||||||
|
assert {"content-type", "image/gif"} in conn.resp_headers
|
||||||
|
end
|
||||||
|
|
||||||
|
test "with content-disposition header", %{conn: conn} do
|
||||||
|
disposition_headers_mock([
|
||||||
|
{"content-disposition", "attachment; filename=\"filename.jpg\""},
|
||||||
|
{"content-length", 0}
|
||||||
|
])
|
||||||
|
|
||||||
|
conn = ReverseProxy.call(conn, "/disposition")
|
||||||
|
|
||||||
|
assert {"content-disposition", "attachment; filename=\"filename.jpg\""} in conn.resp_headers
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,11 @@
|
|||||||
|
defmodule Mix.Tasks.Pleroma.EctoTest do
|
||||||
|
use ExUnit.Case, async: true
|
||||||
|
|
||||||
|
test "raise on bad path" do
|
||||||
|
assert_raise RuntimeError, ~r/Could not find migrations directory/, fn ->
|
||||||
|
Mix.Tasks.Pleroma.Ecto.ensure_migrations_path(Pleroma.Repo,
|
||||||
|
migrations_path: "some-path"
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,46 @@
|
|||||||
|
defmodule Mix.PleromaTest do
|
||||||
|
use ExUnit.Case, async: true
|
||||||
|
import Mix.Pleroma
|
||||||
|
|
||||||
|
setup_all do
|
||||||
|
Mix.shell(Mix.Shell.Process)
|
||||||
|
|
||||||
|
on_exit(fn ->
|
||||||
|
Mix.shell(Mix.Shell.IO)
|
||||||
|
end)
|
||||||
|
|
||||||
|
:ok
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "shell_prompt/1" do
|
||||||
|
test "input" do
|
||||||
|
send(self(), {:mix_shell_input, :prompt, "Yes"})
|
||||||
|
|
||||||
|
answer = shell_prompt("Do you want this?")
|
||||||
|
assert_received {:mix_shell, :prompt, [message]}
|
||||||
|
assert message =~ "Do you want this?"
|
||||||
|
assert answer == "Yes"
|
||||||
|
end
|
||||||
|
|
||||||
|
test "with defval" do
|
||||||
|
send(self(), {:mix_shell_input, :prompt, "\n"})
|
||||||
|
|
||||||
|
answer = shell_prompt("Do you want this?", "defval")
|
||||||
|
|
||||||
|
assert_received {:mix_shell, :prompt, [message]}
|
||||||
|
assert message =~ "Do you want this? [defval]"
|
||||||
|
assert answer == "defval"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "get_option/3" do
|
||||||
|
test "get from options" do
|
||||||
|
assert get_option([domain: "some-domain.com"], :domain, "Promt") == "some-domain.com"
|
||||||
|
end
|
||||||
|
|
||||||
|
test "get from prompt" do
|
||||||
|
send(self(), {:mix_shell_input, :prompt, "another-domain.com"})
|
||||||
|
assert get_option([], :domain, "Prompt") == "another-domain.com"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,43 @@
|
|||||||
|
defmodule Mix.Tasks.Pleroma.RobotsTxtTest do
|
||||||
|
use ExUnit.Case, async: true
|
||||||
|
alias Mix.Tasks.Pleroma.RobotsTxt
|
||||||
|
|
||||||
|
test "creates new dir" do
|
||||||
|
path = "test/fixtures/new_dir/"
|
||||||
|
file_path = path <> "robots.txt"
|
||||||
|
|
||||||
|
static_dir = Pleroma.Config.get([:instance, :static_dir])
|
||||||
|
Pleroma.Config.put([:instance, :static_dir], path)
|
||||||
|
|
||||||
|
on_exit(fn ->
|
||||||
|
Pleroma.Config.put([:instance, :static_dir], static_dir)
|
||||||
|
{:ok, ["test/fixtures/new_dir/", "test/fixtures/new_dir/robots.txt"]} = File.rm_rf(path)
|
||||||
|
end)
|
||||||
|
|
||||||
|
RobotsTxt.run(["disallow_all"])
|
||||||
|
|
||||||
|
assert File.exists?(file_path)
|
||||||
|
{:ok, file} = File.read(file_path)
|
||||||
|
|
||||||
|
assert file == "User-Agent: *\nDisallow: /\n"
|
||||||
|
end
|
||||||
|
|
||||||
|
test "to existance folder" do
|
||||||
|
path = "test/fixtures/"
|
||||||
|
file_path = path <> "robots.txt"
|
||||||
|
static_dir = Pleroma.Config.get([:instance, :static_dir])
|
||||||
|
Pleroma.Config.put([:instance, :static_dir], path)
|
||||||
|
|
||||||
|
on_exit(fn ->
|
||||||
|
Pleroma.Config.put([:instance, :static_dir], static_dir)
|
||||||
|
:ok = File.rm(file_path)
|
||||||
|
end)
|
||||||
|
|
||||||
|
RobotsTxt.run(["disallow_all"])
|
||||||
|
|
||||||
|
assert File.exists?(file_path)
|
||||||
|
{:ok, file} = File.read(file_path)
|
||||||
|
|
||||||
|
assert file == "User-Agent: *\nDisallow: /\n"
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in new issue