2023-10-02 12:18:49 +03:00
|
|
|
defmodule PlausibleWeb.Plugins.API.ErrorsTest do
|
|
|
|
use ExUnit.Case, async: true
|
|
|
|
|
|
|
|
import Phoenix.ConnTest, only: [json_response: 2]
|
|
|
|
|
|
|
|
alias PlausibleWeb.Plugins.API.Errors
|
|
|
|
|
|
|
|
describe "unauthorized/1" do
|
|
|
|
test "sends an 401 response with the `www-authenticate` header set" do
|
|
|
|
conn =
|
|
|
|
Plug.Test.conn(:get, "/")
|
|
|
|
|> Errors.unauthorized()
|
|
|
|
|
|
|
|
assert conn.halted
|
|
|
|
|
|
|
|
assert json_response(conn, 401) == %{
|
|
|
|
"errors" => [%{"detail" => "Plugins API: unauthorized"}]
|
|
|
|
}
|
|
|
|
|
|
|
|
assert Plug.Conn.get_resp_header(conn, "www-authenticate") == [
|
|
|
|
~s[Basic realm="Plugins API Access"]
|
|
|
|
]
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe "error/3" do
|
|
|
|
test "formats the given error message" do
|
|
|
|
message = "Some message"
|
|
|
|
|
|
|
|
conn =
|
|
|
|
Plug.Test.conn(:get, "/")
|
|
|
|
|> Errors.error(:forbidden, message)
|
|
|
|
|
|
|
|
assert conn.halted
|
|
|
|
|
|
|
|
assert json_response(conn, 403) == %{
|
|
|
|
"errors" => [%{"detail" => "Some message"}]
|
|
|
|
}
|
|
|
|
end
|
2023-10-05 12:54:18 +03:00
|
|
|
|
|
|
|
defmodule Example do
|
|
|
|
use Ecto.Schema
|
|
|
|
import Ecto.Changeset
|
|
|
|
|
|
|
|
schema "" do
|
|
|
|
field(:name)
|
|
|
|
field(:email)
|
|
|
|
field(:age, :integer)
|
|
|
|
end
|
|
|
|
|
|
|
|
def changeset(example, params \\ %{}) do
|
|
|
|
example
|
|
|
|
|> cast(params, [:name, :email, :age])
|
|
|
|
|> validate_required([:name, :email])
|
|
|
|
|> validate_format(:email, ~r/@/)
|
|
|
|
|> validate_inclusion(:age, 18..100)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
test "formats changeset errors" do
|
|
|
|
changeset = Example.changeset(%Example{}, %{email: "foo", age: 101})
|
|
|
|
|
2023-10-24 11:33:48 +03:00
|
|
|
errors =
|
|
|
|
Plug.Test.conn(:get, "/")
|
|
|
|
|> Errors.error(:bad_request, changeset)
|
|
|
|
|> json_response(400)
|
|
|
|
|> Map.fetch!("errors")
|
|
|
|
|
|
|
|
assert Enum.count(errors) == 3
|
|
|
|
assert %{"detail" => "age: is invalid"} in errors
|
|
|
|
assert %{"detail" => "email: has invalid format"} in errors
|
|
|
|
assert %{"detail" => "name: can't be blank"} in errors
|
2023-10-05 12:54:18 +03:00
|
|
|
end
|
2023-10-02 12:18:49 +03:00
|
|
|
end
|
|
|
|
end
|