232 lines
7.9 KiB
Elixir
232 lines
7.9 KiB
Elixir
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 Enum.any?([
|
|
match?({:ok, _, _}, result),
|
|
match?({:error, {:redirect, _}}, result),
|
|
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
|