| defmodule PlausibleWeb.Plugs.AuthorizePluginsAPITest do |
| use PlausibleWeb.ConnCase, async: true |
|
|
| alias Plausible.Plugins.API.{Token, Tokens} |
| alias PlausibleWeb.Plugs.AuthorizePluginsAPI |
| alias Plausible.Repo |
|
|
| import Plug.Conn |
|
|
| test "plug passes when a token is found" do |
| %{id: site_id} = site = insert(:site, domain: "pass.example.com") |
| {:ok, _, raw} = Tokens.create(site, "Some token") |
|
|
| credentials = "Basic " <> Base.encode64("#{site.domain}:#{raw}") |
|
|
| conn = |
| build_conn() |
| |> put_req_header("authorization", credentials) |
| |> AuthorizePluginsAPI.call() |
|
|
| refute conn.halted |
| assert %Plausible.Site{id: ^site_id} = conn.assigns.authorized_site |
| end |
|
|
| test "plug passes when a token is found, no domain provided" do |
| %{id: site_id} = site = insert(:site, domain: "pass.example.com") |
| {:ok, _, raw} = Tokens.create(site, "Some token") |
|
|
| credentials = "Basic " <> Base.encode64(raw) |
|
|
| conn = |
| build_conn() |
| |> put_req_header("authorization", credentials) |
| |> AuthorizePluginsAPI.call() |
|
|
| refute conn.halted |
| assert %Plausible.Site{id: ^site_id} = conn.assigns.authorized_site |
| end |
|
|
| test "plug halts when a token is not found" do |
| site = insert(:site, domain: "pass.example.com") |
|
|
| credentials = "Basic " <> Base.encode64("#{site.domain}:invalid-token") |
|
|
| conn = |
| build_conn() |
| |> put_req_header("authorization", credentials) |
| |> AuthorizePluginsAPI.call() |
|
|
| assert conn.halted |
|
|
| assert json_response(conn, 401) == %{ |
| "errors" => [ |
| %{"detail" => "Plugins API: unauthorized"} |
| ] |
| } |
| end |
|
|
| test "plug halts when no authorization header is passed" do |
| conn = |
| build_conn() |
| |> AuthorizePluginsAPI.call() |
|
|
| assert conn.halted |
|
|
| assert json_response(conn, 401) == %{ |
| "errors" => [ |
| %{"detail" => "Plugins API: unauthorized"} |
| ] |
| } |
| end |
|
|
| test "plug optionally doesn't halt when no authorization header is passed" do |
| conn = |
| build_conn() |
| |> AuthorizePluginsAPI.call(send_error?: false) |
|
|
| refute conn.halted |
| end |
|
|
| test "plug updates last seen timestamp" do |
| site = insert(:site, domain: "pass.example.com") |
| {:ok, token, raw} = Tokens.create(site, "Some token") |
|
|
| refute token.last_used_at |
| assert Token.last_used_humanize(token) == "Not yet" |
|
|
| credentials = "Basic " <> Base.encode64(raw) |
|
|
| build_conn() |
| |> put_req_header("authorization", credentials) |
| |> AuthorizePluginsAPI.call() |
|
|
| token = Repo.reload!(token) |
| assert token.last_used_at |
| assert Token.last_used_humanize(token) == "Just recently" |
| end |
| end |
|
|