From e39d1fb9e101fa4532646be4368ba8f2c868d31d Mon Sep 17 00:00:00 2001 From: Graham McIntire Date: Sat, 9 May 2026 10:12:19 -0500 Subject: [PATCH] test: alert severity badges, maintenance form save success paths --- test/towerops_web/live/alert_live_test.exs | 38 +++++++++++++ .../maintenance_live/form_events_test.exs | 54 +++++++++++++++++++ 2 files changed, 92 insertions(+) diff --git a/test/towerops_web/live/alert_live_test.exs b/test/towerops_web/live/alert_live_test.exs index 59b5bc86..cfd7c753 100644 --- a/test/towerops_web/live/alert_live_test.exs +++ b/test/towerops_web/live/alert_live_test.exs @@ -56,6 +56,44 @@ defmodule ToweropsWeb.AlertLive.IndexTest do assert html =~ "DOWN" end + test "renders alerts with different severity ages (drives severity_badge_class branches)", + %{conn: conn, device: device} do + now = DateTime.utc_now() + + # Yellow: <= 15 min old + {:ok, _yellow} = + Towerops.Alerts.create_alert(%{ + device_id: device.id, + alert_type: "device_down", + triggered_at: DateTime.add(now, -5, :minute), + message: "Recent" + }) + + # Orange: 15–60 min old + {:ok, _orange} = + Towerops.Alerts.create_alert(%{ + device_id: device.id, + alert_type: "device_down", + triggered_at: DateTime.add(now, -30, :minute), + message: "Half hour" + }) + + # Red: > 60 min old + {:ok, _red} = + Towerops.Alerts.create_alert(%{ + device_id: device.id, + alert_type: "device_down", + triggered_at: DateTime.add(now, -2, :hour), + message: "Two hours" + }) + + {:ok, _view, html} = live(conn, ~p"/alerts") + + assert html =~ "bg-yellow-500" + assert html =~ "bg-orange-500" + assert html =~ "bg-red-500" + end + test "filters critical alerts", %{conn: conn, organization: _organization, device: device} do # Create a critical device_down alert (unresolved) {:ok, _active_alert} = diff --git a/test/towerops_web/live/maintenance_live/form_events_test.exs b/test/towerops_web/live/maintenance_live/form_events_test.exs index 7a6a8c4b..9e8a8027 100644 --- a/test/towerops_web/live/maintenance_live/form_events_test.exs +++ b/test/towerops_web/live/maintenance_live/form_events_test.exs @@ -84,5 +84,59 @@ defmodule ToweropsWeb.MaintenanceLive.FormEventsTest do assert true end + + test "save :new with valid params navigates to the new window's show page", %{conn: conn} do + {:ok, view, _html} = live(conn, ~p"/maintenance/new") + + now = DateTime.truncate(DateTime.utc_now(), :second) + starts = DateTime.add(now, 60, :second) + ends = DateTime.add(now, 7200, :second) + + result = + render_hook(view, "save", %{ + "maintenance_window" => %{ + "name" => "Test create window", + "reason" => "test", + "scope_type" => "org", + "starts_at" => Calendar.strftime(starts, "%Y-%m-%dT%H:%M"), + "ends_at" => Calendar.strftime(ends, "%Y-%m-%dT%H:%M") + } + }) + + # On success, save_window/3 push_navigates → result is a redirect tuple. + assert match?({:error, {:live_redirect, _}}, result) or is_binary(result) + end + + test "save :edit with valid params navigates", %{conn: conn, user: user, organization: org} do + now = DateTime.truncate(DateTime.utc_now(), :second) + + {:ok, window} = + Towerops.Maintenance.create_window(%{ + name: "Existing", + reason: "test", + organization_id: org.id, + created_by_id: user.id, + starts_at: DateTime.add(now, 60, :second), + ends_at: DateTime.add(now, 7200, :second) + }) + + {:ok, view, _html} = live(conn, ~p"/maintenance/#{window.id}/edit") + + starts = DateTime.add(now, 120, :second) + ends = DateTime.add(now, 8000, :second) + + result = + render_hook(view, "save", %{ + "maintenance_window" => %{ + "name" => "Edited", + "reason" => "still test", + "scope_type" => "org", + "starts_at" => Calendar.strftime(starts, "%Y-%m-%dT%H:%M"), + "ends_at" => Calendar.strftime(ends, "%Y-%m-%dT%H:%M") + } + }) + + assert match?({:error, {:live_redirect, _}}, result) or is_binary(result) + end end end