Ash Authentication - How To Test Liveview with Authentication

I am getting error (ArgumentError) session not fetched, call fetch_session/2 while testing liveview that require authentication. I am using Ash Authentication.

How do I test liveviews with Ash Authentication?

Here is the helper function I am using to login while testing

def login(conn, email\\ "test@example.com", hashed_password \\  "$2b$12$mZjy/lPACxT/WcwL8V9og.MtGzgOZc9VEuDdbnRZ2mmHbRV/9xvdK") do
    {:ok, user} = Accounts.create_user(email, hashed_password)
  
    conn
    |> assign(:current_user, user)
    |> put_session(:user, user)
  end

Here is a test I am trying to run.

    @tag run: true
    test "User can list stock categories", %{conn: conn} do
     {:ok, view, html} = 
              conn
              |> login()
              |> live(~p"/stock/categories")

      # Click on each one of them to be edited
      for category <- Category.all!() do
        assert html =~ category.name
        assert html =~ category.description
      end
    end

I don’t believe a helper exists, but you can write your own. This thread has an example How to test live views with ash authentication plugs - #5 by zachdaniel

1 Like

Out of curiosity, I noticed that you had asked this question before but deleted it. Why?

You can use Phoenix.ConnTest — Phoenix v1.7.12 in your pipeline to get rid of the fetch_session/2 error.

Your tests will run your router pipeline, and somewhere there will be some code that will read the session and try to load the user from it. So all you need to do is add to session whatever will please that logic.

If I’m not mistaken, Ash will store a key user with value like user?id=ce7969f9-afa5-474c-bc52-ac23a103cef6.

This way you might be able to just do:

  conn
  |> Phoenix.ConnTest.init_test_session(%{})
  |> Plug.Conn.put_session(:user, "user?id=#{user.id}")
4 Likes

That looks nice :slight_smile:

1 Like

@zachdaniel, for some reasons, I could not edit that question hours after I notice it was not well framed. So, I had to ask again and delete the former one.

1 Like

Thanks! This worked well.

We should add it to the documentation.

1 Like