Fix the remaining reverse proxy tests which are still relevant
All tests related to streaming/chunking have been removed
This commit is contained in:
parent
8fd0a06241
commit
fd80b75444
1 changed files with 105 additions and 41 deletions
|
@ -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")
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue