towerops/test/towerops_web/live/my_data_live_test.exs
2026-03-19 14:28:31 -05:00

241 lines
7.2 KiB
Elixir

defmodule ToweropsWeb.AccountLive.MyDataTest do
use ToweropsWeb.ConnCase
import Phoenix.LiveViewTest
import Towerops.AccountsFixtures
import Towerops.OrganizationsFixtures
alias Towerops.Accounts
alias Towerops.Organizations
setup :register_and_log_in_user_with_sudo
describe "My Data page" do
test "renders profile information", %{conn: conn, user: user} do
{:ok, _view, html} = live(conn, ~p"/users/my-data")
assert html =~ "My Data"
assert html =~ "Profile Information"
assert html =~ user.email
end
test "displays user name when set", %{conn: conn, user: user} do
{:ok, _user} = Accounts.update_user_profile(user, %{first_name: "Jane", last_name: "Doe"})
{:ok, _view, html} = live(conn, ~p"/users/my-data")
assert html =~ "Jane"
assert html =~ "Doe"
end
test "shows consent records from registration", %{conn: conn} do
{:ok, _view, html} = live(conn, ~p"/users/my-data")
assert html =~ "Consent Records"
# User fixture grants privacy_policy and terms_of_service consents
assert html =~ "Privacy policy"
assert html =~ "Terms of service"
assert html =~ "Active"
end
test "shows revoke consent button for active consents", %{conn: conn} do
{:ok, _view, html} = live(conn, ~p"/users/my-data")
assert html =~ "Revoke Consent"
end
test "revoking consent updates the display", %{conn: conn, user: user} do
consent = Accounts.get_active_consent(user.id, "privacy_policy")
{:ok, view, _html} = live(conn, ~p"/users/my-data")
html =
view
|> element(~s|button[phx-click=revoke_consent][phx-value-consent-id="#{consent.id}"]|)
|> render_click()
assert html =~ "Consent revoked successfully"
assert html =~ "Revoked"
end
test "hides org/device/alert sections when user has no orgs", %{conn: conn} do
{:ok, _view, html} = live(conn, ~p"/users/my-data")
# User from fixture has no organizations, so owner-only sections are hidden
refute html =~ "Organizations you own"
refute html =~ "Network devices monitored"
refute html =~ "Recent Alerts"
end
test "shows export data section with download link", %{conn: conn} do
{:ok, _view, html} = live(conn, ~p"/users/my-data")
assert html =~ "Export Your Data"
assert html =~ "Download My Data (JSON)"
assert html =~ "/api/v1/account/data"
end
test "shows data processing information", %{conn: conn} do
{:ok, _view, html} = live(conn, ~p"/users/my-data")
assert html =~ "How We Use Your Data"
assert html =~ "Profile Information"
assert html =~ "Email Address"
assert html =~ "Privacy Policy"
end
test "shows navigation links to settings tabs", %{conn: conn} do
{:ok, _view, html} = live(conn, ~p"/users/my-data")
assert html =~ "Personal"
assert html =~ "Account"
assert html =~ "Sessions"
assert html =~ "Security"
end
end
describe "My Data page with organization data" do
setup %{user: user} do
{:ok, org} = Organizations.create_organization(%{name: "WISP Corp"}, user.id)
{:ok, site} =
Towerops.Sites.create_site(%{
name: "Tower Alpha",
organization_id: org.id
})
{:ok, device} =
Towerops.Devices.create_device(%{
name: "MikroTik Router",
ip_address: "10.0.0.1",
site_id: site.id,
organization_id: org.id,
monitoring_enabled: true
})
%{org: org, site: site, device: device}
end
test "shows organizations section for owners", %{conn: conn} do
{:ok, _view, html} = live(conn, ~p"/users/my-data")
assert html =~ "Organizations"
assert html =~ "WISP Corp"
assert html =~ "Owner"
end
test "shows devices section with device details", %{conn: conn} do
{:ok, _view, html} = live(conn, ~p"/users/my-data")
assert html =~ "Devices"
assert html =~ "MikroTik Router"
assert html =~ "10.0.0.1"
assert html =~ "WISP Corp"
end
test "shows device count", %{conn: conn} do
{:ok, _view, html} = live(conn, ~p"/users/my-data")
assert html =~ "Total devices: 1"
end
test "shows alerts section with alert data", %{conn: conn, device: device} do
{:ok, _alert} =
Towerops.Alerts.create_alert(%{
device_id: device.id,
alert_type: "device_down",
triggered_at: DateTime.utc_now(),
message: "Device unreachable"
})
{:ok, _view, html} = live(conn, ~p"/users/my-data")
assert html =~ "Recent Alerts"
assert html =~ "device_down"
assert html =~ "MikroTik Router"
end
test "shows correct alert status badges", %{conn: conn, device: device} do
# Active alert
{:ok, _} =
Towerops.Alerts.create_alert(%{
device_id: device.id,
alert_type: "device_down",
triggered_at: DateTime.utc_now(),
message: "Still down"
})
# Resolved alert
{:ok, _} =
Towerops.Alerts.create_alert(%{
device_id: device.id,
alert_type: "high_latency",
triggered_at: DateTime.add(DateTime.utc_now(), -3600, :second),
resolved_at: DateTime.utc_now(),
message: "Latency normalized"
})
{:ok, _view, html} = live(conn, ~p"/users/my-data")
assert html =~ "Active"
assert html =~ "Resolved"
end
test "shows no alerts message when none exist", %{conn: conn} do
{:ok, _view, html} = live(conn, ~p"/users/my-data")
assert html =~ "No alerts in the last 90 days"
end
end
describe "My Data page as non-owner member" do
setup %{user: user} do
# Create org owned by someone else, add test user as viewer
owner = user_fixture()
org = organization_fixture(owner.id, %{name: "Other Org"})
membership_fixture(org.id, user.id, :viewer)
%{org: org}
end
test "hides org/device/alert sections for non-owner members", %{conn: conn} do
{:ok, _view, html} = live(conn, ~p"/users/my-data")
# Non-owner members should not see org-level data
refute html =~ "Organizations you own"
refute html =~ "Network devices monitored"
refute html =~ "Recent Alerts"
end
test "still shows profile and consent sections", %{conn: conn} do
{:ok, _view, html} = live(conn, ~p"/users/my-data")
assert html =~ "Profile Information"
assert html =~ "Consent Records"
assert html =~ "Export Your Data"
end
end
describe "My Data page audit logs" do
test "shows audit log section", %{conn: conn} do
{:ok, _view, html} = live(conn, ~p"/users/my-data")
assert html =~ "Audit Log"
end
test "shows audit log entries when they exist", %{conn: conn, user: user} do
# The sudo_mode_granted event from setup creates an audit log
{:ok, _} =
Towerops.Admin.create_audit_log(%{
action: "user_data_viewed",
superuser_id: user.id,
target_user_id: user.id,
metadata: %{}
})
{:ok, _view, html} = live(conn, ~p"/users/my-data")
assert html =~ "user_data_viewed"
end
end
end