towerops/test/towerops_web/live/user_registration_live_test.exs

161 lines
4.8 KiB
Elixir

defmodule ToweropsWeb.UserRegistrationLiveTest do
use ToweropsWeb.ConnCase, async: true
import Phoenix.LiveViewTest
import Towerops.AccountsFixtures
import Towerops.OrganizationsFixtures
describe "registration page" do
test "renders registration page", %{conn: conn} do
{:ok, _view, html} = live(conn, ~p"/users/register")
assert html =~ "Register for an account"
assert html =~ "Create an account"
end
test "renders invitation-based registration page", %{conn: conn} do
user = user_fixture()
organization = organization_fixture(user.id)
{:ok, invitation} =
Towerops.Organizations.create_invitation(%{
organization_id: organization.id,
invited_by_id: user.id,
email: "invited@example.com",
role: "member"
})
{:ok, _view, html} = live(conn, ~p"/users/register?token=#{invitation.token}")
assert html =~ "Join #{organization.name}"
assert html =~ "Accept invitation and create account"
end
end
describe "form events" do
test "validate event re-renders the form", %{conn: conn} do
{:ok, lv, _html} = live(conn, ~p"/users/register")
html =
lv
|> form("form",
user: %{
"email" => "test@example.com",
"password" => "weak",
"privacy_policy_consent" => "on",
"terms_of_service_consent" => "on"
}
)
|> render_change()
assert html =~ "Register for an account"
end
test "save with valid params triggers form action", %{conn: conn} do
{:ok, lv, _html} = live(conn, ~p"/users/register")
html =
lv
|> form("form",
user: %{
"email" => "newuser-#{System.unique_integer([:positive])}@example.com",
"password" => "strong-password-12345!",
"privacy_policy_consent" => "on",
"terms_of_service_consent" => "on"
}
)
|> render_submit()
# Either trigger_action true (success) or re-renders with errors
assert is_binary(html)
end
test "check_password_breach with empty payload is a no-op", %{conn: conn} do
{:ok, lv, _html} = live(conn, ~p"/users/register")
assert render_hook(lv, "check_password_breach", %{})
end
test "save via invitation completes account creation when token is valid",
%{conn: conn} do
inviter = user_fixture()
org = organization_fixture(inviter.id)
{:ok, invitation} =
Towerops.Organizations.create_invitation(%{
organization_id: org.id,
invited_by_id: inviter.id,
email: "newjoin@example.com",
role: "technician"
})
{:ok, lv, _html} = live(conn, ~p"/users/register?token=#{invitation.token}")
result =
lv
|> form("form",
user: %{
"email" => "newjoin@example.com",
"password" => "very-strong-password-1234!",
"privacy_policy_consent" => "on",
"terms_of_service_consent" => "on"
}
)
|> render_submit()
# On success the LV redirects (returns binary or redirect tuple).
# On failure it stays alive and re-renders. Either is fine for
# coverage of the create_via_invitation/3 path.
assert is_binary(result) or match?({:error, {:redirect, _}}, result) or
match?({:error, {:live_redirect, _}}, result)
end
test "save via invitation with a stale token re-renders the page",
%{conn: conn} do
stale_token = "definitely-not-a-real-token-#{System.unique_integer([:positive])}"
{:ok, lv, _html} = live(conn, ~p"/users/register?token=#{stale_token}")
html =
lv
|> form("form",
user: %{
"email" => "stale@example.com",
"password" => "very-strong-password-1234!",
"privacy_policy_consent" => "on",
"terms_of_service_consent" => "on"
}
)
|> render_submit()
assert is_binary(html)
end
end
describe "normalize_consent_params/1" do
alias ToweropsWeb.UserRegistrationLive
test "converts 'on' to true" do
params = %{
"privacy_policy_consent" => "on",
"terms_of_service_consent" => "on",
"email" => "x@y.z"
}
result = UserRegistrationLive.normalize_consent_params(params)
assert result["privacy_policy_consent"] == true
assert result["terms_of_service_consent"] == true
assert result["email"] == "x@y.z"
end
test "leaves other values unchanged" do
params = %{
"privacy_policy_consent" => "off",
"terms_of_service_consent" => nil
}
result = UserRegistrationLive.normalize_consent_params(params)
assert result["privacy_policy_consent"] == "off"
assert result["terms_of_service_consent"] == nil
end
end
end