spazio-solazzo/test/spazio_solazzo_web/live/user/profile_live_test.exs
2026-01-10 19:03:02 +01:00

235 lines
5.8 KiB
Elixir

defmodule SpazioSolazzoWeb.ProfileLiveTest do
use SpazioSolazzoWeb.ConnCase, async: true
import Phoenix.LiveViewTest
alias SpazioSolazzo.Accounts.User
alias SpazioSolazzo.BookingSystem
alias SpazioSolazzo.BookingSystem.Booking
setup %{conn: conn} do
conn = Plug.Test.init_test_session(conn, %{})
{conn, user} = log_in_user(conn)
%{user: user, conn: conn}
end
describe "ProfileLive - Profile Update" do
test "displays current user information", %{conn: conn, user: user} do
{:ok, _view, html} = live(conn, ~p"/profile")
assert html =~ user.name
assert html =~ user.phone_number
assert html =~ to_string(user.email)
end
test "successfully updates profile with valid data", %{conn: conn} do
{:ok, view, _html} = live(conn, ~p"/profile")
result =
view
|> form("#profile-form", %{
form: %{
name: "Updated Test Name",
phone_number: "+9876543210"
}
})
|> render_submit()
assert result =~ "Profile updated successfully"
assert result =~ "+9876543210"
assert result =~ "Updated Test Name"
end
test "shows validation errors for invalid data", %{conn: conn} do
{:ok, view, _html} = live(conn, ~p"/profile")
result =
view
|> form("#profile-form", %{
form: %{
name: "",
phone_number: "+9876543210"
}
})
|> render_change()
assert result =~ "is required" || result =~ "can't be blank"
end
test "email field is read-only", %{conn: conn, user: user} do
{:ok, _view, html} = live(conn, ~p"/profile")
assert html =~ "readonly"
assert html =~ to_string(user.email)
assert html =~ "Email cannot be changed"
end
end
describe "ProfileLive - Account Deletion" do
test "displays danger zone with delete account button", %{conn: conn} do
{:ok, view, html} = live(conn, ~p"/profile")
assert html =~ "Danger Zone"
assert has_element?(view, "button", "Delete My Account")
end
test "shows confirmation modal when delete button is clicked", %{conn: conn} do
{:ok, view, html} = live(conn, ~p"/profile")
refute html =~ "Confirm Account Deletion"
html =
view
|> element("button", "Delete My Account")
|> render_click()
assert html =~ "Confirm Account Deletion"
assert html =~ "Yes, Delete My Account"
end
test "can toggle delete history checkbox", %{conn: conn} do
{:ok, view, _html} = live(conn, ~p"/profile")
view
|> element("button", "Delete My Account")
|> render_click()
html =
view
|> element("#gdpr-consent")
|> render_click()
assert html =~ "checked"
end
test "successfully deletes account and redirects to sign out", %{conn: conn, user: user} do
{:ok, view, _html} = live(conn, ~p"/profile")
view
|> element("button", "Delete My Account")
|> render_click()
view
|> element("button", "Yes, Delete My Account")
|> render_click()
assert_redirect(view, "/sign-out")
assert {:error, _} = Ash.get(User, user.id)
end
test "account deletion with delete_history=false preserves bookings", %{
conn: conn,
user: user
} do
{_space, asset, time_slot} = create_booking_fixtures()
{:ok, booking} =
BookingSystem.create_booking(
time_slot.id,
asset.id,
user.id,
Date.utc_today(),
"Test User",
"test@example.com",
"+1234567890",
"test booking"
)
booking_id = booking.id
{:ok, view, _html} = live(conn, ~p"/profile")
view
|> element("button", "Delete My Account")
|> render_click()
view
|> element("button", "Yes, Delete My Account")
|> render_click()
{:ok, preserved_booking} = Ash.get(Booking, booking_id)
assert preserved_booking.user_id == nil
assert preserved_booking.customer_name == "Test User"
end
test "account deletion with delete_history=true removes all bookings", %{
conn: conn,
user: user
} do
{_space, asset, time_slot} = create_booking_fixtures()
{:ok, booking} =
BookingSystem.create_booking(
time_slot.id,
asset.id,
user.id,
Date.utc_today(),
"Test User",
"test@example.com",
"+1234567890",
"test booking"
)
booking_id = booking.id
{:ok, view, _html} = live(conn, ~p"/profile")
view
|> element("button", "Delete My Account")
|> render_click()
view
|> element("#gdpr-consent")
|> render_click()
view
|> element("button", "Yes, Delete My Account")
|> render_click()
assert {:error, _} = Ash.get(Booking, booking_id)
end
end
defp log_in_user(conn) do
user =
SpazioSolazzo.Repo.insert!(%User{
id: Ash.UUID.generate(),
email: "test@example.com",
name: "Test User",
phone_number: "+1234567890"
})
{:ok, token, _claims} = AshAuthentication.Jwt.token_for_user(user)
conn =
conn
|> Plug.Test.init_test_session(%{})
|> Plug.Conn.put_session("user_token", token)
{conn, user}
end
defp create_booking_fixtures do
unique_id = :erlang.unique_integer([:positive, :monotonic])
{:ok, space} =
BookingSystem.create_space(
"Test Space #{unique_id}",
"test-space-#{unique_id}",
"Test description"
)
{:ok, asset} = BookingSystem.create_asset("Test Asset", space.id)
{:ok, time_slot} =
BookingSystem.create_time_slot_template(
~T[09:00:00],
~T[18:00:00],
:monday,
space.id
)
{space, asset, time_slot}
end
end