测试令牌认证

时间:2016-06-29 06:06:07

标签: elixir phoenix-framework

我正在努力测试需要令牌头的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

1 个答案:

答案 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