我正在努力测试需要令牌头的api端点。我们的想法是测试两种情况,包括和不使用身份验证令牌。
我提出了以下工作方案,但对我来说感觉有些笨拙。
defmodule MyApi.SecretControllerTest do
use MyApi.ConnCase
alias MyApi.{Repo, User, Session}
setup %{conn: conn} do
user = create_user(%{name: "john"})
session = create_session(user)
conn = conn
|> put_req_header("accept", "application/json")
|> put_req_header("authorization", "Bearer " <> session.token)
{:ok, conn: conn}
end
def create_user(%{name: name}) do
User.changeset(%User{}, %{email: "#{name}@gmail.com"})
|> Repo.insert!
end
def create_session(user) do
Session.create_changeset(%Session{user_id: user.id}, %{})
|> Repo.insert!
end
test "returns 401 error when user is not authenticated" do
conn = get build_conn, "/api/secrets"
assert json_response(conn, 401)["error"] != %{}
end
test "renders secret resource when user is authenticated", %{conn: conn} do
conn = get conn, secret_path(conn, :index)
assert json_response(conn, 200)["message"] != %{}
end
end
答案 0 :(得分:2)
如果您正在使用Guardian进行身份验证,并且端点是API(例如,通过:api
管道),则可以使用api_sign_in辅助方法,不依赖于现有会话(因此您可以删除与会话相关的代码)。
以下是&#34;登录&#34;的示例逻辑到测试标记中,您可以应用于需要登录用户的测试:
setup %{conn: conn} = config do
cond do
config[:login] ->
user = insert_user()
signed_conn = Guardian.Plug.api_sign_in(conn, user)
{:ok, conn: signed_conn}
true ->
:ok
end
end
@tag :login
test "shows page only when logged in", %{conn: conn} do
conn = get(conn, some_page_path(conn, :index))
assert html_response(conn, 200)
end