defmodule Towerops.AlertsTest do use Towerops.DataCase alias Towerops.Alerts describe "alerts" do import Towerops.AccountsFixtures alias Towerops.Alerts.Alert 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} = Towerops.Equipment.create_equipment(%{ name: "Router 1", ip_address: "192.168.1.1", site_id: site.id }) %{equipment: equipment, organization: organization, user: user} end @valid_attrs %{ alert_type: :equipment_down, triggered_at: ~U[2025-12-21 12:00:00Z], message: "Equipment is not responding" } test "create_alert/1 with valid data creates an alert", %{equipment: equipment} do attrs = Map.put(@valid_attrs, :equipment_id, equipment.id) assert {:ok, %Alert{} = alert} = Alerts.create_alert(attrs) assert alert.alert_type == :equipment_down assert alert.message == "Equipment is not responding" end test "create_alert/1 with invalid data returns error changeset" do assert {:error, %Ecto.Changeset{}} = Alerts.create_alert(%{}) end test "list_equipment_alerts/2 returns alerts for equipment", %{equipment: equipment} do attrs = Map.put(@valid_attrs, :equipment_id, equipment.id) {:ok, alert} = Alerts.create_alert(attrs) [result] = Alerts.list_equipment_alerts(equipment.id) assert result.id == alert.id end test "list_organization_active_alerts/1 returns unresolved alerts", %{ equipment: equipment, organization: organization } do attrs = Map.put(@valid_attrs, :equipment_id, equipment.id) {:ok, alert} = Alerts.create_alert(attrs) # Create resolved alert {:ok, resolved_alert} = Alerts.create_alert(Map.put(attrs, :resolved_at, ~U[2025-12-21 13:00:00Z])) active = Alerts.list_organization_active_alerts(organization.id) assert length(active) == 1 assert hd(active).id == alert.id refute Enum.any?(active, fn a -> a.id == resolved_alert.id end) end test "list_organization_alerts/2 returns all alerts", %{ equipment: equipment, organization: organization } do attrs = Map.put(@valid_attrs, :equipment_id, equipment.id) {:ok, _alert1} = Alerts.create_alert(attrs) {:ok, _alert2} = Alerts.create_alert(Map.put(attrs, :alert_type, :equipment_up)) alerts = Alerts.list_organization_alerts(organization.id) assert length(alerts) == 2 end test "get_alert!/1 returns the alert with given id", %{equipment: equipment} do attrs = Map.put(@valid_attrs, :equipment_id, equipment.id) {:ok, alert} = Alerts.create_alert(attrs) assert Alerts.get_alert!(alert.id).id == alert.id end test "acknowledge_alert/2 marks alert as acknowledged", %{equipment: equipment, user: user} do attrs = Map.put(@valid_attrs, :equipment_id, equipment.id) {:ok, alert} = Alerts.create_alert(attrs) assert {:ok, acknowledged} = Alerts.acknowledge_alert(alert, user.id) assert acknowledged.acknowledged_at assert acknowledged.acknowledged_by_id == user.id end test "resolve_alert/1 marks alert as resolved", %{equipment: equipment} do attrs = Map.put(@valid_attrs, :equipment_id, equipment.id) {:ok, alert} = Alerts.create_alert(attrs) assert {:ok, resolved} = Alerts.resolve_alert(alert) assert resolved.resolved_at end test "has_active_alert?/2 returns true when active alert exists", %{equipment: equipment} do attrs = Map.put(@valid_attrs, :equipment_id, equipment.id) {:ok, _alert} = Alerts.create_alert(attrs) assert Alerts.has_active_alert?(equipment.id, :equipment_down) == true assert Alerts.has_active_alert?(equipment.id, :equipment_up) == false end test "has_active_alert?/2 returns false for resolved alerts", %{equipment: equipment} do attrs = Map.put(@valid_attrs, :equipment_id, equipment.id) {:ok, alert} = Alerts.create_alert(attrs) {:ok, _resolved} = Alerts.resolve_alert(alert) assert Alerts.has_active_alert?(equipment.id, :equipment_down) == false end test "get_active_alert/2 returns active alert of specific type", %{equipment: equipment} do attrs = Map.put(@valid_attrs, :equipment_id, equipment.id) {:ok, alert} = Alerts.create_alert(attrs) found = Alerts.get_active_alert(equipment.id, :equipment_down) assert found.id == alert.id end test "get_active_alert/2 returns nil when no active alert exists", %{equipment: equipment} do assert Alerts.get_active_alert(equipment.id, :equipment_down) == nil end test "get_active_alert/2 returns nil for resolved alerts", %{equipment: equipment} do attrs = Map.put(@valid_attrs, :equipment_id, equipment.id) {:ok, alert} = Alerts.create_alert(attrs) {:ok, _resolved} = Alerts.resolve_alert(alert) assert Alerts.get_active_alert(equipment.id, :equipment_down) == nil end end end