111 lines
3.9 KiB
Elixir
111 lines
3.9 KiB
Elixir
defmodule HostasWeb.Auth.DenizenControllerTest do
|
|
use HostasWeb.ConnCase
|
|
|
|
# For testing with Ecto
|
|
import Ecto.Query, only: [from: 2]
|
|
alias Hostas.Repo
|
|
|
|
alias Hostas.Denizen
|
|
alias Hostas.Token
|
|
|
|
@denizen %{
|
|
"handle" => "test",
|
|
"name" => "Test Denizen",
|
|
"password" => "password",
|
|
}
|
|
|
|
setup_all %{conn: conn} do
|
|
denizen1 = %Denizen{}
|
|
|> Denizen.changeset(%{handle: "denizen1", name: "Test Denizen 1", password: "password"})
|
|
|> Repo.insert!
|
|
|
|
denizen1 = Denizen.create(%{handle: "denizen1", name: "Test Denizen 1", password: "password"})
|
|
denizen2 = Denizen.create(%{handle: "denizen2", name: "Test Denizen 2", password: "password"})
|
|
|
|
{:ok, token} = Token.new(denizen1.id)
|
|
|
|
# Facilitate requests to protected routes
|
|
conn = put_req_header(conn, "authorization", "Bearer #{struct.token}")
|
|
|
|
%{denizen1: denizen1, denizen2: denizen2, token: token, conn: conn}
|
|
end
|
|
|
|
describe "register denizen" do
|
|
test "succeeds", %{conn: conn} do
|
|
conn = post(conn, ~p"/hostapi/denizen/", @denizen)
|
|
|
|
assert json_response(conn, 201)["handle"] == @denizen["handle"]
|
|
assert json_response(conn, 201)["name"] == @denizen["name"]
|
|
assert json_response(conn, 201)["id"] == @denizen["id"]
|
|
end
|
|
|
|
test "fails because duplicate handle", %{conn: conn, denizen1: pre_existing_denizen} do
|
|
pre_existing_handle = pre_existing_denizen["handle"]
|
|
conn = post(
|
|
conn,
|
|
~p"/hostapi/denizen/",
|
|
Map.put(@denizen, "handle", pre_existing_handle)
|
|
)
|
|
|
|
assert json_response(conn, 422)["error"] ==
|
|
"Denizen with handle #{pre_existing_handle} already exists"
|
|
end
|
|
end
|
|
|
|
describe "show denizen" do
|
|
test "succeeds", %{conn: conn, denizen1: denizen} do
|
|
%{handle: handle} = denizen
|
|
conn = get(conn, ~p"/hostapi/denizen/#{handle}")
|
|
assert json_response(conn, 200) == Map.delete(denizen, :password)
|
|
end
|
|
|
|
test "fails because handle is unknown", %{conn: conn} do
|
|
conn = get(conn, ~p"/hostapi/denizen/unknown_denizen")
|
|
assert json_response(conn, 404)["error"] == "No denizen corresponding to given handle"
|
|
end
|
|
end
|
|
|
|
describe "deactivate denizen" do
|
|
test "returns 201 when done by same denizen", %{conn: conn, denizen1: denizen} do
|
|
%{handle: handle} = denizen
|
|
conn = delete(conn, ~p"/hostapi/denizen/#{handle}")
|
|
assert json_response(conn, 201)
|
|
end
|
|
|
|
test "succeeds", %{conn: conn, denizen1: denizen} do
|
|
%{handle: handle} = denizen
|
|
conn = delete(conn, ~p"/hostapi/denizen/#{handle}")
|
|
assert json_response(conn, 201)
|
|
end
|
|
|
|
test "fails because denizens can't deactivate one another", %{conn: conn, denizen2: denizen2} do
|
|
conn = delete(conn, ~p"/hostapi/denizen/#{denizen2.handle}")
|
|
assert json_response(conn, 403)["error"] == "Regular denizens cannot deactivate other denizens"
|
|
end
|
|
|
|
test "fails because referenced denizen doesn't exist", %{conn: conn, denizen1: denizen} do
|
|
conn = delete(conn, ~p"/hostapi/denizen/unknown_denizen")
|
|
assert json_response(conn, 403)["error"] == "Regular denizens cannot deactivate other denizens"
|
|
end
|
|
end
|
|
|
|
describe "update denizen" do
|
|
test "succeeds", %{conn: conn, denizen1: denizen} do
|
|
update = Map.put(denizen, :name, "Updated Name")
|
|
conn = patch(conn, ~p"/hostapi/denizen/#{denizen.handle}", update)
|
|
|
|
assert json_response(conn, 200) == update
|
|
end
|
|
|
|
test "fails because denizen can't modify someone else's account", %{conn: conn, denizen2: denizen2} do
|
|
conn = patch(conn, ~p"/hostapi/denizen/#{denizen.handle}", %{})
|
|
assert json_response(conn, 403)["error"] == "Regular denizens cannot update other denizens"
|
|
end
|
|
|
|
test "fails because denizen doesn't exist", %{conn: conn} do
|
|
conn = patch(conn, ~p"/hostapi/denizen/unknown_denizen", %{})
|
|
assert json_response(conn, 403)["error"] == "Regular denizens cannot update other denizens"
|
|
end
|
|
end
|
|
end
|