| 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 |
|
|
| 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}) |
|
|
| 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 |
| end |
| end |
| end |
|
|