# Testing Tips 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: ```elixir # in config/test.exs # Do NOT set this value for production config :bcrypt_elixir, log_rounds: 1 ``` ## Testing 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 called `MyAppWeb.ConnCase` found in `test/support/conn_case.ex`. In this example it's called `register_and_log_in_user`. ```elixir defmodule MyAppWeb.ConnCase do use ExUnit.CaseTemplate using do # ... end def register_and_log_in_user(%{conn: conn}) 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 }) conn = conn |> Phoenix.ConnTest.init_test_session(%{}) |> AshAuthentication.Plug.Helpers.store_in_session(user) %{conn: conn} end end ``` Now in your LiveView tests you can pass this function to `setup`: ```elixir 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 end ``` If required, it can also be called directly inside a `test` block: ```elixir test "some test", context do %{conn: conn} = register_and_log_in_user(context) {:ok, lv, _html} = live(conn, ~p"/authenticated-route") # ... end ```