Testing
View SourceTips and tricks to help test your apps.
When using the Password strategy
AshAuthentication uses bcrypt_elixir for hashing passwords for secure storage, which by design has a high computational cost. To reduce the cost (make hashing faster), you can reduce the number of computation rounds it performs in tests:
# in config/test.exs
# Do NOT set this value for production
config :bcrypt_elixir, log_rounds: 1Testing authenticated LiveViews
In order to test authenticated LiveViews, you will need to seed a test user and log in it. While you may certainly use a helper that logs in through the UI each time, it's a little more efficient to call the sign-in code directly.
This can be done by adding a helper function in MyAppWeb.ConnCase found in
test/support/conn_case.ex.  In this example it's called
register_and_log_in_user.
defmodule MyAppWeb.ConnCase do
  use ExUnit.CaseTemplate
  using do
    # ...
  end
  def register_and_log_in_user(%{conn: conn} = context) do
    email = "user@example.com"
    password = "password"
    {:ok, hashed_password} = AshAuthentication.BcryptProvider.hash(password)
    Ash.Seed.seed!(MyApp.Accounts.User, %{
      email: email,
      hashed_password: hashed_password
    })
    # Replace `:password` with the appropriate strategy for your application.
    strategy = AshAuthentication.Info.strategy!(MyApp.Accounts.User, :password)
    {:ok, user} =
      AshAuthentication.Strategy.action(strategy, :sign_in, %{
        email: email,
        password: password
      })
    new_conn =
      conn
      |> Phoenix.ConnTest.init_test_session(%{})
      |> AshAuthentication.Plug.Helpers.store_in_session(user)
   %{context | conn: new_conn}
  end
endNow in your LiveView tests you can pass this function to setup:
defmodule MyAppWeb.MyLiveTest do
  use MyAppWeb.ConnCase
  setup :register_and_log_in_user
  test "some test", %{conn: conn} do
    {:ok, lv, _html} = live(conn, ~p"/authenticated-route")
    # ...
  end
endIf required, it can also be called directly inside a test block:
test "some test", context do
  %{conn: conn} = register_and_log_in_user(context)
  {:ok, lv, _html} = live(conn, ~p"/authenticated-route")
  # ...
end