2016-06-29 13 views
0

トークンヘッダーを必要とするapiエンドポイントのテストに苦労しています。この考え方は、認証トークンの有無にかかわらず、2つのケースをテストすることです。トークン認証のテスト

私は以下の作業方法を考え出しましたが、やや不器用な気がします。

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

はStackOverflowのへようこそ!あなたのコードは期待どおりに動作するようですので、ここではあまりできません。あなたが本当に何かが間違っていると思うなら、その質問の期待される行動/結果を説明しようとします。 –

+0

はい、私はこのコードが期待どおりに動作していることを知っています。私はこの種のものをテストするより便利な方法があるかどうか尋ねています。実際に401エラーのテストは、接続設定を避けないようにこれを管理する方法がわからないので、特に醜いです。 – Slyfest

+0

@Slyfestどの認証ライブラリをあなたのアプリに使用していますか?それを行うには少し良い方法がありますが、Guardianを使用している場合にのみ適用されますので、私の質問です。 – Svilen

答えて

1

あなたは認証のためにGuardianを使用している、およびエンドポイントは、そう(既存のセッションに依存していないあなたはapi_sign_inヘルパーメソッドを使用することができます(:apiパイプラインを経由するなど)APIの一つである場合そのセッション関連のコードを削除することができます)。

ここでは、ユーザーのログインが必要ですテストに適用できることをテストタグにロジック「の看板を」、入れての例です:

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