defmodule ToweropsWeb.IntegrationsSmokeTest do @moduledoc """ Smoke tests for low-coverage org-scoped integration LiveViews and device-scoped LiveViews. These tests exercise the mount/render/handle_params paths without asserting deep behavior, which is sufficient for coverage of happy-path code. """ use ToweropsWeb.ConnCase, async: true import Phoenix.LiveViewTest alias Towerops.Devices.MikrotikBackups alias Towerops.MaintenanceFixtures setup :register_and_log_in_user setup %{user: user} do {:ok, organization} = Towerops.Organizations.create_organization(%{name: "Smoke Org"}, user.id) %{organization: organization} end defp assert_mount_or_redirect(result) do assert match?({:ok, _, _}, result) or match?({:error, {:redirect, _}}, result) or match?({:error, {:live_redirect, _}}, result) end describe "smoke: gaiia integration LiveViews" do test "GET /orgs/:slug/settings/integrations/gaiia/mapping", %{conn: conn, organization: org} do assert_mount_or_redirect(live(conn, ~p"/orgs/#{org.slug}/settings/integrations/gaiia/mapping")) end test "GET /orgs/:slug/settings/integrations/gaiia/mapping?tab=sites", %{ conn: conn, organization: org } do assert_mount_or_redirect(live(conn, ~p"/orgs/#{org.slug}/settings/integrations/gaiia/mapping?tab=sites")) end test "GET /orgs/:slug/settings/integrations/gaiia/mapping?filter=linked", %{ conn: conn, organization: org } do assert_mount_or_redirect(live(conn, ~p"/orgs/#{org.slug}/settings/integrations/gaiia/mapping?filter=linked")) end test "GET /orgs/:slug/settings/integrations/gaiia/mapping?filter=unlinked", %{ conn: conn, organization: org } do assert_mount_or_redirect(live(conn, ~p"/orgs/#{org.slug}/settings/integrations/gaiia/mapping?filter=unlinked")) end test "GET /orgs/:slug/settings/integrations/gaiia/reconciliation", %{ conn: conn, organization: org } do assert_mount_or_redirect(live(conn, ~p"/orgs/#{org.slug}/settings/integrations/gaiia/reconciliation")) end test "GET /orgs/:slug/settings/integrations/gaiia/reconciliation?tab=devices", %{ conn: conn, organization: org } do assert_mount_or_redirect(live(conn, ~p"/orgs/#{org.slug}/settings/integrations/gaiia/reconciliation?tab=devices")) end test "GET /orgs/:slug/settings/integrations/gaiia/reconciliation?tab=sites", %{ conn: conn, organization: org } do assert_mount_or_redirect(live(conn, ~p"/orgs/#{org.slug}/settings/integrations/gaiia/reconciliation?tab=sites")) end end describe "smoke: preseem integration LiveViews" do test "GET /orgs/:slug/settings/integrations/preseem/devices", %{ conn: conn, organization: org } do assert_mount_or_redirect(live(conn, ~p"/orgs/#{org.slug}/settings/integrations/preseem/devices")) end test "GET /orgs/:slug/settings/integrations/preseem/devices?filter=matched", %{ conn: conn, organization: org } do assert_mount_or_redirect(live(conn, ~p"/orgs/#{org.slug}/settings/integrations/preseem/devices?filter=matched")) end test "GET /orgs/:slug/settings/integrations/preseem/devices?filter=unmatched", %{ conn: conn, organization: org } do assert_mount_or_redirect(live(conn, ~p"/orgs/#{org.slug}/settings/integrations/preseem/devices?filter=unmatched")) end test "GET /orgs/:slug/settings/integrations/preseem/insights", %{ conn: conn, organization: org } do assert_mount_or_redirect(live(conn, ~p"/orgs/#{org.slug}/settings/integrations/preseem/insights")) end test "GET /orgs/:slug/settings/integrations/preseem/insights?status=resolved", %{ conn: conn, organization: org } do assert_mount_or_redirect(live(conn, ~p"/orgs/#{org.slug}/settings/integrations/preseem/insights?status=resolved")) end test "GET /orgs/:slug/settings/integrations/preseem/insights?type=qoe&urgency=high", %{ conn: conn, organization: org } do assert_mount_or_redirect( live( conn, ~p"/orgs/#{org.slug}/settings/integrations/preseem/insights?type=qoe&urgency=high" ) ) end end describe "smoke: user settings sub-tabs (SessionManager / TotpManager)" do test "GET /users/settings (default index)", %{conn: conn} do assert_mount_or_redirect(live(conn, ~p"/users/settings")) end test "GET /users/settings?tab=sessions", %{conn: conn} do assert_mount_or_redirect(live(conn, ~p"/users/settings?tab=sessions")) end test "GET /users/settings?tab=security", %{conn: conn} do assert_mount_or_redirect(live(conn, ~p"/users/settings?tab=security")) end test "GET /users/settings?tab=personal", %{conn: conn} do assert_mount_or_redirect(live(conn, ~p"/users/settings?tab=personal")) end test "GET /users/settings?tab=account", %{conn: conn} do assert_mount_or_redirect(live(conn, ~p"/users/settings?tab=account")) end test "GET /users/settings?tab=notifications", %{conn: conn} do assert_mount_or_redirect(live(conn, ~p"/users/settings?tab=notifications")) end test "GET /users/settings?tab=api", %{conn: conn} do assert_mount_or_redirect(live(conn, ~p"/users/settings?tab=api")) end end describe "smoke: device-scoped LiveViews (ConfigTimeline / Compare)" do setup %{organization: org} do {:ok, site} = Towerops.Sites.create_site(%{ name: "Site-#{System.unique_integer([:positive])}", organization_id: org.id }) device = Towerops.DevicesFixtures.device_fixture(%{ organization_id: org.id, site_id: site.id }) %{site: site, device: device} end test "GET /devices/:device_id/config-timeline", %{conn: conn, device: device} do assert_mount_or_redirect(live(conn, ~p"/devices/#{device.id}/config-timeline")) end test "GET /devices/:device_id/config-timeline?range=24h", %{conn: conn, device: device} do assert_mount_or_redirect(live(conn, ~p"/devices/#{device.id}/config-timeline?range=24h")) end test "GET /devices/:device_id/config-timeline?range=30d", %{conn: conn, device: device} do assert_mount_or_redirect(live(conn, ~p"/devices/#{device.id}/config-timeline?range=30d")) end test "GET /devices/:device_id/backups/compare without backup params redirects", %{ conn: conn, device: device } do # Compare requires backup_a + backup_b query params; without them it redirects. assert_mount_or_redirect(live(conn, ~p"/devices/#{device.id}/backups/compare")) end test "GET /devices/:device_id/backups/compare with two backups", %{ conn: conn, device: device } do {:ok, backup_a} = MikrotikBackups.create_backup(device.id, "/system identity\nset name=router-a", "manual") {:ok, backup_b} = MikrotikBackups.create_backup(device.id, "/system identity\nset name=router-b", "manual") assert_mount_or_redirect( live( conn, ~p"/devices/#{device.id}/backups/compare?backup_a=#{backup_a.id}&backup_b=#{backup_b.id}" ) ) end end describe "smoke: maintenance show extra params" do setup %{organization: org, user: user} do window = MaintenanceFixtures.maintenance_window_fixture(%{ name: "Smoke Window 2", organization_id: org.id, created_by_id: user.id }) %{window: window} end test "GET /maintenance/:id with tab param", %{conn: conn, window: window} do assert_mount_or_redirect(live(conn, ~p"/maintenance/#{window.id}?tab=devices")) end test "GET /maintenance/:id/edit with section", %{conn: conn, window: window} do assert_mount_or_redirect(live(conn, ~p"/maintenance/#{window.id}/edit")) end end end