Fix the remaining reverse proxy tests which are still relevant

All tests related to streaming/chunking have been removed
This commit is contained in:
Mark Felder 2021-12-30 20:50:14 +00:00 committed by FloatingGhost
parent 8fd0a06241
commit fd80b75444

View file

@ -5,7 +5,6 @@
defmodule Pleroma.ReverseProxyTest do defmodule Pleroma.ReverseProxyTest do
use Pleroma.Web.ConnCase use Pleroma.Web.ConnCase
import ExUnit.CaptureLog import ExUnit.CaptureLog
import Mox
alias Pleroma.ReverseProxy alias Pleroma.ReverseProxy
alias Plug.Conn alias Plug.Conn
@ -23,11 +22,12 @@ test "do not track successful request", %{conn: conn} do
conn = ReverseProxy.call(conn, url) conn = ReverseProxy.call(conn, url)
assert conn.status == 200 assert response(conn, 200)
assert Cachex.get(:failed_proxy_url_cache, url) == {:ok, nil} assert Cachex.get(:failed_proxy_url_cache, url) == {:ok, nil}
end end
test "use Pleroma's user agent in the request; don't pass the client's", %{conn: conn} do test "use Pleroma's user agent in the request; don't pass the client's", %{conn: conn} do
# Mock will fail if the client's user agent isn't filtered
wanted_headers = [{"user-agent", Pleroma.Application.user_agent()}] wanted_headers = [{"user-agent", Pleroma.Application.user_agent()}]
Tesla.Mock.mock(fn %{url: "/user-agent", headers: ^wanted_headers} -> Tesla.Mock.mock(fn %{url: "/user-agent", headers: ^wanted_headers} ->
@ -44,20 +44,18 @@ test "use Pleroma's user agent in the request; don't pass the client's", %{conn:
assert response(conn, 200) assert response(conn, 200)
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
end end
describe "max_body" do describe "max_body" do
test "length returns error if content-length more than option", %{conn: conn} do test "length returns error if content-length more than option", %{conn: conn} do
Tesla.Mock.mock(fn %{url: "/huge-file"} ->
%Tesla.Env{
status: 200,
headers: [{"content-length", "100"}],
body: "This body is too large."
}
end)
assert capture_log(fn -> assert capture_log(fn ->
ReverseProxy.call(conn, "/huge-file", max_body_length: 4) ReverseProxy.call(conn, "/huge-file", max_body_length: 4)
end) =~ end) =~
@ -73,9 +71,12 @@ test "length returns error if content-length more than option", %{conn: conn} do
describe "HEAD requests" do describe "HEAD requests" do
test "common", %{conn: conn} do test "common", %{conn: conn} do
ClientMock Tesla.Mock.mock(fn %{method: :head, url: "/head"} ->
|> expect(:request, fn :head, "/head", _, _, _ -> %Tesla.Env{
{:ok, 200, [{"content-type", "text/html; charset=utf-8"}]} status: 200,
headers: [{"content-type", "text/html; charset=utf-8"}],
body: ""
}
end) end)
conn = ReverseProxy.call(Map.put(conn, :method, "HEAD"), "/head") conn = ReverseProxy.call(Map.put(conn, :method, "HEAD"), "/head")
@ -87,6 +88,13 @@ test "common", %{conn: conn} do
test "500", %{conn: conn} do test "500", %{conn: conn} do
url = "/status/500" url = "/status/500"
Tesla.Mock.mock(fn %{url: ^url} ->
%Tesla.Env{
status: 500,
body: ""
}
end)
capture_log(fn -> ReverseProxy.call(conn, url) end) =~ capture_log(fn -> ReverseProxy.call(conn, url) end) =~
"[error] Elixir.Pleroma.ReverseProxy: request to /status/500 failed with HTTP status 500" "[error] Elixir.Pleroma.ReverseProxy: request to /status/500 failed with HTTP status 500"
@ -99,6 +107,13 @@ test "500", %{conn: conn} do
test "400", %{conn: conn} do test "400", %{conn: conn} do
url = "/status/400" url = "/status/400"
Tesla.Mock.mock(fn %{url: ^url} ->
%Tesla.Env{
status: 400,
body: ""
}
end)
capture_log(fn -> ReverseProxy.call(conn, url) end) =~ capture_log(fn -> ReverseProxy.call(conn, url) end) =~
"[error] Elixir.Pleroma.ReverseProxy: request to /status/400 failed with HTTP status 400" "[error] Elixir.Pleroma.ReverseProxy: request to /status/400 failed with HTTP status 400"
@ -109,6 +124,13 @@ test "400", %{conn: conn} do
test "403", %{conn: conn} do test "403", %{conn: conn} do
url = "/status/403" url = "/status/403"
Tesla.Mock.mock(fn %{url: ^url} ->
%Tesla.Env{
status: 403,
body: ""
}
end)
capture_log(fn -> capture_log(fn ->
ReverseProxy.call(conn, url, failed_request_ttl: :timer.seconds(120)) ReverseProxy.call(conn, url, failed_request_ttl: :timer.seconds(120))
end) =~ end) =~
@ -120,9 +142,14 @@ test "403", %{conn: conn} do
end end
describe "keep request headers" do describe "keep request headers" do
# setup [:headers_mock]
test "header passes", %{conn: conn} do test "header passes", %{conn: conn} do
Tesla.Mock.mock(fn %{url: "/headers"} ->
%Tesla.Env{
status: 200,
body: ""
}
end)
conn = conn =
Conn.put_req_header( Conn.put_req_header(
conn, conn,
@ -131,48 +158,79 @@ test "header passes", %{conn: conn} do
) )
|> ReverseProxy.call("/headers") |> ReverseProxy.call("/headers")
%{"headers" => headers} = json_response(conn, 200) assert response(conn, 200)
assert headers["Accept"] == "text/html" assert {"accept", "text/html"} in conn.req_headers
end end
test "header is filtered", %{conn: conn} do test "header is filtered", %{conn: conn} do
# Mock will fail if the accept-language header isn't filtered
wanted_headers = [
{"user-agent", Pleroma.Application.user_agent()},
{"accept-encoding", "*"}
]
Tesla.Mock.mock(fn %{url: "/headers", headers: ^wanted_headers} ->
%Tesla.Env{
status: 200,
body: ""
}
end)
conn = conn =
Conn.put_req_header( conn
conn, |> Conn.put_req_header("accept-language", "en-US")
"accept-language", |> Conn.put_req_header("accept-encoding", "*")
"en-US"
)
|> ReverseProxy.call("/headers") |> ReverseProxy.call("/headers")
%{"headers" => headers} = json_response(conn, 200) assert response(conn, 200)
refute headers["Accept-Language"]
end end
end end
test "returns 400 on non GET, HEAD requests", %{conn: conn} do test "returns 400 on non GET, HEAD requests", %{conn: conn} do
Tesla.Mock.mock(fn %{url: "/ip"} ->
%Tesla.Env{
status: 200,
body: ""
}
end)
conn = ReverseProxy.call(Map.put(conn, :method, "POST"), "/ip") conn = ReverseProxy.call(Map.put(conn, :method, "POST"), "/ip")
assert conn.status == 400 assert response(conn, 400)
end end
describe "cache resp headers" do describe "cache resp headers not filtered" do
test "add cache-control", %{conn: conn} do test "add cache-control", %{conn: conn} do
ClientMock Tesla.Mock.mock(fn %{url: "/cache"} ->
|> expect(:request, fn :get, "/cache", _, _, _ -> %Tesla.Env{
{:ok, 200, [{"ETag", "some ETag"}], %{}} status: 200,
headers: [
{"cache-control", "public, max-age=1209600"},
{"etag", "some ETag"},
{"expires", "Wed, 21 Oct 2015 07:28:00 GMT"}
],
body: ""
}
end) end)
|> expect(:stream_body, fn _ -> :done end)
conn = ReverseProxy.call(conn, "/cache") conn = ReverseProxy.call(conn, "/cache")
assert {"cache-control", "public, max-age=1209600"} in conn.resp_headers assert {"cache-control", "public, max-age=1209600"} in conn.resp_headers
assert {"etag", "some ETag"} in conn.resp_headers
assert {"expires", "Wed, 21 Oct 2015 07:28:00 GMT"} in conn.resp_headers
end end
end end
describe "response content disposition header" do describe "response content disposition header" do
test "not atachment", %{conn: conn} do test "not attachment", %{conn: conn} do
# disposition_headers_mock([ Tesla.Mock.mock(fn %{url: "/disposition"} ->
# {"content-type", "image/gif"}, %Tesla.Env{
# {"content-length", "0"} status: 200,
# ]) headers: [
{"content-type", "image/gif"},
{"content-length", "0"}
],
body: ""
}
end)
conn = ReverseProxy.call(conn, "/disposition") conn = ReverseProxy.call(conn, "/disposition")
@ -180,10 +238,16 @@ test "not atachment", %{conn: conn} do
end end
test "with content-disposition header", %{conn: conn} do test "with content-disposition header", %{conn: conn} do
# disposition_headers_mock([ Tesla.Mock.mock(fn %{url: "/disposition"} ->
# {"content-disposition", "attachment; filename=\"filename.jpg\""}, %Tesla.Env{
# {"content-length", "0"} status: 200,
# ]) headers: [
{"content-disposition", "attachment; filename=\"filename.jpg\""},
{"content-length", "0"}
],
body: ""
}
end)
conn = ReverseProxy.call(conn, "/disposition") conn = ReverseProxy.call(conn, "/disposition")