2016-06-29 3 views
0

토큰 헤더가 필요한 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

에 오신 것을 환영에 유래합니다! 코드가 예상대로 작동하는 것처럼 보이므로 여기서 할 수있는 일은별로 없습니다. 정말로 뭔가 잘못되었다고 생각하면 예상되는 행동/결과를 설명해보십시오. –

+0

네,이 코드가 예상대로 작동하고 있다는 것을 압니다. 이런 종류의 것들을 테스트 할 더 편리한 방법이 있는지 묻고 있습니다. 실제로 401 오류에 대한 테스트는 연결 설정을 피하지 않고 이것을 관리하는 방법을 모르기 때문에 특히 추악합니다. – Slyfest

+0

@Slyfest 귀하의 앱에 어떤 인증 라이브러리를 사용하고 있습니까? 약간 더 나은 방법이 있지만 Guardian을 사용하는 경우에만 적용되므로 내 질문에 답하십시오. – Svilen

답변

1

당신이 인증을 위해 Guardian를 사용하고, 엔드 포인트가 너무 (기존 세션에 의존하지 않는 당신이 api_sign_in 도우미 방법을 사용할 수 있습니다 (AN :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