2016-06-29 2 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

Добро пожаловать в StackOverflow! Ваш код, похоже, работает так, как вы ожидаете, поэтому мы не можем здесь много сделать. Если вы действительно думаете, что что-то не так, попробуйте объяснить ожидаемое поведение/результат в вопросе. –

+0

Да, я знаю, что этот код работает должным образом, я спрашиваю, есть ли более удобный способ проверить такие вещи. На самом деле тест на ошибку 401 особенно уродлив, потому что я не знаю, как управлять этим, не избегая установки соединения. – Slyfest

+0

@Slestfest, какую библиотеку аутентификации вы используете для своего приложения? Есть немного лучший способ сделать это, но применяется только в том случае, если вы используете Guardian, следовательно, мой вопрос. – Svilen

ответ

1

Если вы используете Guardian для аутентификации, а конечная точка представляет собой API один (например, происходит через :api трубопровода), вы можете использовать метод api_sign_in помощника, который не опирается на существующий сеанс (так вы можете удалить этот код, связанный с сеансом).

Вот пример того, чтобы поместить «знак в» логике в тестовый тег, который вы можете применить к тестам, которые требуют зарегистрированного пользователя:

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 
Смежные вопросы