# 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 in `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
```