159 lines
4.5 KiB
Elixir
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
|