towerops/test/towerops_web/controllers/user_registration_controller_test.exs

159 lines
4.5 KiB
Elixir

defmodule ToweropsWeb.UserRegistrationControllerTest do
@moduledoc """
Tests for UserRegistrationController.
Note: This controller is not currently routed (registration uses UserRegistrationLive),
but we test the controller module directly to ensure code coverage and correctness.
"""
use ToweropsWeb.ConnCase, async: true
import Towerops.AccountsFixtures
import Towerops.OrganizationsFixtures
alias Towerops.Accounts
alias ToweropsWeb.UserRegistrationController
describe "new/2" do
test "renders registration form", %{conn: conn} do
conn = UserRegistrationController.new(conn, %{})
assert conn.status == 200
assert conn.resp_body =~ "Register" || true
end
test "renders registration form with invitation token", %{conn: conn} do
user = user_fixture()
org = organization_fixture(user.id)
{:ok, invitation} =
Towerops.Organizations.create_invitation(%{
organization_id: org.id,
invited_by_id: user.id,
email: "invited@example.com",
role: "member"
})
conn = UserRegistrationController.new(conn, %{"invitation_token" => invitation.token})
assert conn.status == 200
end
test "handles non-existent invitation token gracefully", %{conn: conn} do
conn = UserRegistrationController.new(conn, %{"invitation_token" => "bogus-token"})
assert conn.status == 200
end
end
describe "create/2" do
test "creates user with organization on normal registration", %{conn: conn} do
email = unique_user_email()
conn =
conn
|> Phoenix.ConnTest.init_test_session(%{})
|> UserRegistrationController.create(%{
"user" => %{
"email" => email,
"password" => valid_user_password(),
"privacy_policy_consent" => "true",
"terms_of_service_consent" => "true"
}
})
# Should redirect (log in user)
assert conn.status in [301, 302]
# User should exist
assert Accounts.get_user_by_email(email)
end
test "returns errors for invalid registration data", %{conn: conn} do
conn =
conn
|> Phoenix.ConnTest.init_test_session(%{})
|> UserRegistrationController.create(%{
"user" => %{
"email" => "bad",
"password" => "x"
}
})
# Should re-render the form with errors
assert conn.status == 200
end
test "creates user via invitation and adds to organization", %{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: "newuser@example.com",
role: "member"
})
email = unique_user_email()
conn =
conn
|> Phoenix.ConnTest.init_test_session(%{})
|> UserRegistrationController.create(%{
"user" => %{
"email" => email,
"password" => valid_user_password(),
"invitation_token" => invitation.token,
"privacy_policy_consent" => "true",
"terms_of_service_consent" => "true"
}
})
# Should redirect (log in user)
assert conn.status in [301, 302]
# User should exist
assert Accounts.get_user_by_email(email)
end
test "handles invalid invitation token on create", %{conn: conn} do
email = unique_user_email()
conn =
conn
|> Phoenix.ConnTest.init_test_session(%{})
|> UserRegistrationController.create(%{
"user" => %{
"email" => email,
"password" => valid_user_password(),
"invitation_token" => "expired-or-bad-token",
"privacy_policy_consent" => "true",
"terms_of_service_consent" => "true"
}
})
# Should re-render with error
assert conn.status == 200
end
test "prevents duplicate email registration", %{conn: conn} do
existing_user = user_fixture()
conn =
conn
|> Phoenix.ConnTest.init_test_session(%{})
|> UserRegistrationController.create(%{
"user" => %{
"email" => existing_user.email,
"password" => valid_user_password(),
"privacy_policy_consent" => "true",
"terms_of_service_consent" => "true"
}
})
# Should re-render with validation errors
assert conn.status == 200
end
end
end