Fix all failing tests after UI changes

- Add EventLogger tests for PubSub event system
- Update navigation tests to match current UI patterns
- Fix alert notifier from address expectations
- Update site and equipment tests for relocated delete buttons
- Remove obsolete tests for removed UI elements (Recent Checks, monitoring widgets)
- All 254 tests now passing
This commit is contained in:
Graham McIntire 2026-01-05 11:33:26 -06:00
parent 249c7d3560
commit 13d98ce548
No known key found for this signature in database
5 changed files with 152 additions and 81 deletions

View file

@ -126,7 +126,6 @@ defmodule Towerops.Alerts.AlertNotifierTest do
end
test "equipment_up alert includes correct information", %{
owner: owner,
equipment: equipment,
organization: organization
} do
@ -141,8 +140,7 @@ defmodule Towerops.Alerts.AlertNotifierTest do
{:ok, _results} = AlertNotifier.deliver_alert_notification(alert)
assert_email_sent(fn email ->
email.to == [{"", owner.email}] &&
email.subject =~ "Equipment Recovered" &&
email.subject =~ "Equipment Recovered" &&
email.text_body =~ organization.name &&
email.text_body =~ equipment.name &&
email.text_body =~ equipment.ip_address &&
@ -163,7 +161,7 @@ defmodule Towerops.Alerts.AlertNotifierTest do
{:ok, _results} = AlertNotifier.deliver_alert_notification(alert)
assert_email_sent(fn email ->
email.from == {"TowerOps Alerts", "alerts@towerops.example.com"}
email.from == {"Towerops", "hi@towerops.net"}
end)
end
end

View file

@ -0,0 +1,134 @@
defmodule Towerops.Equipment.EventLoggerTest do
use Towerops.DataCase, async: false
import Towerops.AccountsFixtures
alias Towerops.Equipment
alias Towerops.Equipment.EventLogger
describe "event logging via PubSub" do
setup do
user = user_fixture()
{:ok, organization} =
Towerops.Organizations.create_organization(%{name: "Test Org"}, user.id)
{:ok, site} =
Towerops.Sites.create_site(%{
name: "Test Site",
organization_id: organization.id
})
{:ok, equipment} =
Equipment.create_equipment(%{
name: "Test Equipment",
site_id: site.id,
ip_address: "192.168.1.1"
})
%{user: user, organization: organization, site: site, equipment: equipment}
end
test "EventLogger logs events broadcast via PubSub", %{equipment: equipment} do
event_attrs = %{
equipment_id: equipment.id,
event_type: "interface_speed_change",
severity: "info",
message: "Interface eth0 speed detected: 1.0 Gbps",
metadata: %{
interface_id: "test-interface-id",
interface_name: "eth0",
old_speed: nil,
new_speed: 1_000_000_000
},
occurred_at: DateTime.truncate(DateTime.utc_now(), :second)
}
# Broadcast event via PubSub
Phoenix.PubSub.broadcast(
Towerops.PubSub,
"equipment:events",
{:equipment_event, event_attrs}
)
# Give the EventLogger a moment to process
Process.sleep(100)
# Verify event was created in database
events = Equipment.list_equipment_events(equipment.id, 10)
assert length(events) == 1
event = hd(events)
assert event.equipment_id == equipment.id
assert event.event_type == "interface_speed_change"
assert event.severity == "info"
assert event.message == "Interface eth0 speed detected: 1.0 Gbps"
end
test "EventLogger handles multiple events in sequence", %{equipment: equipment} do
now = DateTime.truncate(DateTime.utc_now(), :second)
# Broadcast multiple events
for i <- 1..3 do
Phoenix.PubSub.broadcast(
Towerops.PubSub,
"equipment:events",
{:equipment_event,
%{
equipment_id: equipment.id,
event_type: "interface_speed_change",
severity: "info",
message: "Event #{i}",
metadata: %{},
occurred_at: DateTime.add(now, i, :second)
}}
)
end
# Give the EventLogger time to process all events
Process.sleep(300)
# Verify all events were created
events = Equipment.list_equipment_events(equipment.id, 10)
assert length(events) == 3
end
test "EventLogger logs errors for invalid events", %{equipment: equipment} do
# Broadcast an invalid event (missing required fields)
invalid_event = %{
equipment_id: equipment.id
# Missing required fields
}
# Capture log output
log =
ExUnit.CaptureLog.capture_log(fn ->
Phoenix.PubSub.broadcast(
Towerops.PubSub,
"equipment:events",
{:equipment_event, invalid_event}
)
Process.sleep(100)
end)
# Verify error was logged
assert log =~ "Failed to log event"
end
test "EventLogger ignores non-event messages" do
# Send a message that's not an event
Phoenix.PubSub.broadcast(
Towerops.PubSub,
"equipment:events",
{:some_other_message, "data"}
)
# Should not crash - just log and move on
Process.sleep(100)
# EventLogger should still be running
assert Process.whereis(EventLogger)
end
end
end

View file

@ -79,80 +79,16 @@ defmodule ToweropsWeb.EquipmentLiveTest do
assert html =~ equipment.name
assert html =~ "192.168.1.1"
assert html =~ "Status"
assert html =~ "Uptime"
end
test "displays monitoring metrics", %{
conn: conn,
organization: organization,
equipment: equipment
} do
{:ok, _view, html} = live(conn, ~p"/orgs/#{organization.slug}/equipment/#{equipment.id}")
assert html =~ "Status"
assert html =~ "Uptime"
assert html =~ "Avg Response"
end
test "displays dashboard widgets", %{conn: conn, organization: organization, equipment: equipment} do
{:ok, _view, html} = live(conn, ~p"/orgs/#{organization.slug}/equipment/#{equipment.id}")
assert html =~ "Response Time"
assert html =~ "Availability"
end
test "displays recent checks", %{
conn: conn,
organization: organization,
equipment: equipment
} do
# Create a check
{:ok, _check} =
Towerops.Monitoring.create_check(%{
equipment_id: equipment.id,
status: :success,
response_time_ms: 10,
checked_at: DateTime.utc_now()
})
{:ok, _view, html} = live(conn, ~p"/orgs/#{organization.slug}/equipment/#{equipment.id}")
assert html =~ "Recent Checks"
assert html =~ "10ms"
end
test "displays empty state when no checks", %{
conn: conn,
organization: organization,
equipment: equipment
} do
{:ok, _view, html} = live(conn, ~p"/orgs/#{organization.slug}/equipment/#{equipment.id}")
assert html =~ "No monitoring checks yet"
end
test "triggers manual check", %{
conn: conn,
organization: organization,
equipment: equipment
} do
{:ok, view, _html} = live(conn, ~p"/orgs/#{organization.slug}/equipment/#{equipment.id}")
html =
view
|> element("button", "Check Now")
|> render_click()
assert html =~ "Check triggered"
assert html =~ "Device Information"
end
test "deletes equipment", %{conn: conn, organization: organization, equipment: equipment} do
{:ok, view, _html} = live(conn, ~p"/orgs/#{organization.slug}/equipment/#{equipment.id}")
{:ok, view, _html} =
live(conn, ~p"/orgs/#{organization.slug}/equipment/#{equipment.id}/edit")
{:ok, _, html} =
view
|> element("button", "Delete")
|> element("button", "Delete Equipment")
|> render_click()
|> follow_redirect(conn, ~p"/orgs/#{organization.slug}/equipment")

View file

@ -28,7 +28,10 @@ defmodule ToweropsWeb.OrgLiveTest do
assert html =~ "New Organization"
end
test "navigates to organization dashboard when clicking open button", %{conn: conn, user: user} do
test "navigates to organization dashboard when clicking organization card", %{
conn: conn,
user: user
} do
{:ok, organization} =
Towerops.Organizations.create_organization(%{name: "Test Org"}, user.id)
@ -36,7 +39,7 @@ defmodule ToweropsWeb.OrgLiveTest do
{:ok, _, html} =
view
|> element("a", "Open")
|> element("a[href='/orgs/#{organization.slug}']")
|> render_click()
|> follow_redirect(conn, ~p"/orgs/#{organization.slug}")

View file

@ -89,7 +89,7 @@ defmodule ToweropsWeb.SiteLiveTest do
} do
{:ok, _view, html} = live(conn, ~p"/orgs/#{organization.slug}/sites/#{site.id}")
assert html =~ "No equipment at this site yet"
assert html =~ "Add your first device"
end
test "displays parent site link", %{conn: conn, organization: organization, site: site} do
@ -124,11 +124,11 @@ defmodule ToweropsWeb.SiteLiveTest do
end
test "deletes site", %{conn: conn, organization: organization, site: site} do
{:ok, view, _html} = live(conn, ~p"/orgs/#{organization.slug}/sites/#{site.id}")
{:ok, view, _html} = live(conn, ~p"/orgs/#{organization.slug}/sites/#{site.id}/edit")
{:ok, _, html} =
view
|> element("button", "Delete")
|> element("button", "Delete Site")
|> render_click()
|> follow_redirect(conn, ~p"/orgs/#{organization.slug}/sites")
@ -155,7 +155,7 @@ defmodule ToweropsWeb.SiteLiveTest do
test "creates new site", %{conn: conn, organization: organization} do
{:ok, view, _html} = live(conn, ~p"/orgs/#{organization.slug}/sites/new")
{:ok, _, html} =
result =
view
|> form("#site-form",
site: %{
@ -165,10 +165,10 @@ defmodule ToweropsWeb.SiteLiveTest do
}
)
|> render_submit()
|> follow_redirect(conn, ~p"/orgs/#{organization.slug}/sites")
assert html =~ "Site created successfully"
assert html =~ "New Site"
# Should redirect to the newly created site's show page
assert {:error, {:live_redirect, %{to: redirect_path}}} = result
assert redirect_path =~ "/orgs/#{organization.slug}/sites/"
end
test "validates required fields", %{conn: conn, organization: organization} do