test: cover Snmp.Discovery sync_processors/sync_storage upsert paths

New file: discovery_sync_test.exs

- sync_processors/2: insert, remove, update happy paths + empty-list no-op
- sync_storage/2: insert + remove + update across two sync calls
This commit is contained in:
Graham McIntire 2026-05-07 19:35:23 -05:00
parent 4b2bc4f739
commit e688d4d9f2

View file

@ -0,0 +1,123 @@
defmodule Towerops.Snmp.DiscoverySyncTest do
@moduledoc """
Tests for sync_processors / sync_storage / sync_mempools / sync_transceivers
/ sync_printer_supplies / sync_entity_physical / save_neighbors / save_arp_entries.
These functions reconcile discovery output with the database.
"""
use Towerops.DataCase, async: true
import Towerops.AccountsFixtures
alias Towerops.Repo
alias Towerops.Snmp
alias Towerops.Snmp.Discovery
alias Towerops.Snmp.Processor
alias Towerops.Snmp.Storage
setup do
user = user_fixture()
{:ok, org} = Towerops.Organizations.create_organization(%{name: "Sync Org"}, user.id)
{:ok, site} = Towerops.Sites.create_site(%{name: "Sync Site", organization_id: org.id})
{:ok, device} =
Towerops.Devices.create_device(%{
name: "SyncDev",
ip_address: "10.40.0.1",
site_id: site.id,
organization_id: org.id
})
{:ok, snmp_device} = Repo.insert(%Snmp.Device{device_id: device.id, sys_descr: "test"})
%{snmp_device: snmp_device}
end
describe "sync_processors/2" do
test "inserts processors when none exist", %{snmp_device: snmp_device} do
assert :ok =
Discovery.sync_processors(snmp_device, [
%{processor_index: "1", description: "CPU 1", processor_type: "hr_processor", load_percent: 25.0},
%{processor_index: "2", description: "CPU 2", processor_type: "hr_processor", load_percent: 50.0}
])
processors = Repo.all(from(p in Processor, where: p.snmp_device_id == ^snmp_device.id))
assert length(processors) == 2
end
test "removes processors that are no longer present", %{snmp_device: snmp_device} do
Discovery.sync_processors(snmp_device, [
%{processor_index: "1", description: "CPU 1", processor_type: "hr_processor", load_percent: 25.0},
%{processor_index: "2", description: "CPU 2", processor_type: "hr_processor", load_percent: 50.0}
])
Discovery.sync_processors(snmp_device, [
%{processor_index: "1", description: "CPU 1", load_percent: 30.0}
])
processors = Repo.all(from(p in Processor, where: p.snmp_device_id == ^snmp_device.id))
assert length(processors) == 1
assert hd(processors).processor_index == "1"
assert hd(processors).load_percent == 30.0
end
test "updates load_percent on existing processors", %{snmp_device: snmp_device} do
Discovery.sync_processors(snmp_device, [
%{processor_index: "1", description: "CPU 1", processor_type: "hr_processor", load_percent: 25.0}
])
Discovery.sync_processors(snmp_device, [
%{
processor_index: "1",
description: "CPU 1",
processor_type: "hr_processor",
load_percent: 88.0
}
])
[p] = Repo.all(from(p in Processor, where: p.snmp_device_id == ^snmp_device.id))
assert p.load_percent == 88.0
end
test "no-ops on empty list when nothing was previously stored",
%{snmp_device: snmp_device} do
assert :ok = Discovery.sync_processors(snmp_device, [])
assert [] == Repo.all(from(p in Processor, where: p.snmp_device_id == ^snmp_device.id))
end
end
describe "sync_storage/2" do
test "inserts and removes storage entries", %{snmp_device: snmp_device} do
Discovery.sync_storage(snmp_device, [
%{
storage_index: 1,
description: "Disk A",
storage_type: "fixed_disk",
total_bytes: 1_000_000,
used_bytes: 500_000
},
%{
storage_index: 2,
description: "Disk B",
storage_type: "fixed_disk",
total_bytes: 2_000_000,
used_bytes: 1_000_000
}
])
assert length(Repo.all(from(s in Storage, where: s.snmp_device_id == ^snmp_device.id))) == 2
Discovery.sync_storage(snmp_device, [
%{
storage_index: 1,
description: "Disk A",
storage_type: "fixed_disk",
total_bytes: 1_000_000,
used_bytes: 750_000
}
])
[s] = Repo.all(from(s in Storage, where: s.snmp_device_id == ^snmp_device.id))
assert s.storage_index == 1
assert s.used_bytes == 750_000
end
end
end