From 43a9ff01a6046d00d822c9643457bbe7b055d70f Mon Sep 17 00:00:00 2001 From: Graham McIntire Date: Tue, 13 Jan 2026 08:01:45 -0600 Subject: [PATCH] Add comprehensive tests for Equipment context Added 6 new tests to improve coverage: - list_snmp_enabled_equipment/0 for SNMP-enabled equipment filtering - update_snmp_poll_time/1 for updating polling timestamps - create_event/1 for creating equipment events with proper schema - list_equipment_events/2 for event retrieval and ordering - list_equipment_events/2 with limit parameter This improves Equipment coverage from 87.50% to higher. --- test/towerops/equipment_test.exs | 128 +++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) diff --git a/test/towerops/equipment_test.exs b/test/towerops/equipment_test.exs index d11d0c3c..86ec9e63 100644 --- a/test/towerops/equipment_test.exs +++ b/test/towerops/equipment_test.exs @@ -163,5 +163,133 @@ defmodule Towerops.EquipmentTest do # But checked_at should be updated assert DateTime.after?(updated.last_checked_at, first_checked_at) end + + test "list_snmp_enabled_equipment/0 returns only equipment with SNMP enabled", %{site: site} do + {:ok, snmp_enabled} = + Equipment.create_equipment(%{ + name: "SNMP Router", + ip_address: "192.168.1.1", + site_id: site.id, + snmp_enabled: true, + snmp_community: "public" + }) + + {:ok, _snmp_disabled} = + Equipment.create_equipment(%{ + name: "Non-SNMP Router", + ip_address: "192.168.1.2", + site_id: site.id, + snmp_enabled: false + }) + + result = Equipment.list_snmp_enabled_equipment() + assert length(result) == 1 + assert hd(result).id == snmp_enabled.id + end + + test "update_snmp_poll_time/1 updates last_snmp_poll_at timestamp", %{site: site} do + {:ok, equipment} = Equipment.create_equipment(Map.put(@valid_attrs, :site_id, site.id)) + assert equipment.last_snmp_poll_at == nil + + assert {:ok, updated} = Equipment.update_snmp_poll_time(equipment) + assert updated.last_snmp_poll_at + assert DateTime.before?(updated.last_snmp_poll_at, DateTime.utc_now()) + end + end + + describe "events" do + import Towerops.AccountsFixtures + + alias Towerops.Equipment.Event + + 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: "Router 1", + ip_address: "192.168.1.1", + site_id: site.id + }) + + %{equipment: equipment} + end + + test "create_event/1 creates an equipment event", %{equipment: equipment} do + attrs = %{ + equipment_id: equipment.id, + event_type: "interface_up", + severity: "info", + message: "Interface came online", + metadata: %{"interface" => "eth0"}, + occurred_at: DateTime.truncate(DateTime.utc_now(), :second) + } + + assert {:ok, %Event{} = event} = Equipment.create_event(attrs) + assert event.equipment_id == equipment.id + assert event.event_type == "interface_up" + assert event.severity == "info" + assert event.message == "Interface came online" + assert event.metadata == %{"interface" => "eth0"} + end + + test "create_event/1 with invalid data returns error changeset" do + assert {:error, %Ecto.Changeset{}} = Equipment.create_event(%{}) + end + + test "list_equipment_events/2 returns events for equipment ordered by most recent", %{ + equipment: equipment + } do + now = DateTime.utc_now() + + {:ok, event1} = + Equipment.create_event(%{ + equipment_id: equipment.id, + event_type: "interface_up", + severity: "info", + message: "Interface came up", + occurred_at: DateTime.add(now, -3600, :second) + }) + + {:ok, event2} = + Equipment.create_event(%{ + equipment_id: equipment.id, + event_type: "interface_down", + severity: "warning", + message: "Interface went down", + occurred_at: DateTime.add(now, -1800, :second) + }) + + events = Equipment.list_equipment_events(equipment.id) + assert length(events) == 2 + # Should be ordered by most recent first + assert hd(events).id == event2.id + assert List.last(events).id == event1.id + end + + test "list_equipment_events/2 limits results", %{equipment: equipment} do + now = DateTime.utc_now() + + # Create 10 events + for i <- 1..10 do + Equipment.create_event(%{ + equipment_id: equipment.id, + event_type: "interface_down", + severity: "warning", + message: "Interface down event #{i}", + occurred_at: DateTime.add(now, -i * 60, :second) + }) + end + + events = Equipment.list_equipment_events(equipment.id, 5) + assert length(events) == 5 + end end end