towerops/test/towerops_web/graphql/subscriptions_test.exs
Graham McIntire 72f81c572d
add real-time GraphQL API with time-series queries and subscriptions
- add absinthe_phoenix for WebSocket subscription support
- create GraphQL WebSocket socket with API token auth at /socket/graphql
- add time-series queries: deviceSensors, sensorReadings, interfaceTraffic, checkResults
- add subscriptions: deviceStatusChanged, alertEvent, sensorReadingsUpdated
- wire subscription triggers into agent_channel and alerts contexts
- add org-scoped access control for sensors/interfaces via join queries
- add 17 tests covering queries, org isolation, empty data edge cases, and auth
- update GraphQL API docs page with time-series and subscription sections
2026-03-12 10:24:39 -05:00

68 lines
2 KiB
Elixir

defmodule ToweropsWeb.GraphQL.SubscriptionsTest do
use Towerops.DataCase, async: true
alias ToweropsWeb.GraphQL.Subscriptions
describe "publish_device_status/3" do
test "publishes to both org-wide and device-specific topics" do
device_id = Ecto.UUID.generate()
org_id = Ecto.UUID.generate()
# Subscribe to org-wide topic
Phoenix.PubSub.subscribe(Towerops.PubSub, "__absinthe__:doc:gql:device_status:#{org_id}")
# Subscribe to device-specific topic
Phoenix.PubSub.subscribe(Towerops.PubSub, "__absinthe__:doc:gql:device_status:#{org_id}:#{device_id}")
Subscriptions.publish_device_status(device_id, org_id, %{
device_name: "Router 1",
status: "up"
})
# The publish call itself should succeed without error
# Actual subscription delivery requires a full Absinthe subscription setup
# which is tested in integration tests. Here we verify the function runs
# without crashing.
assert true
end
end
describe "publish_alert_event/2" do
test "publishes alert events without error" do
alert = %{
id: Ecto.UUID.generate(),
alert_type: "device_down",
severity: 2,
message: "Device is unreachable",
device_id: Ecto.UUID.generate(),
organization_id: Ecto.UUID.generate(),
triggered_at: DateTime.utc_now()
}
# Should not raise
Subscriptions.publish_alert_event(alert, "created")
assert true
end
end
describe "publish_sensor_readings/4" do
test "publishes sensor reading events without error" do
device_id = Ecto.UUID.generate()
org_id = Ecto.UUID.generate()
readings = [
%{
sensor_id: Ecto.UUID.generate(),
sensor_type: "temperature",
sensor_descr: "CPU Temp",
sensor_unit: "°C",
value: 42.5,
checked_at: to_string(DateTime.utc_now())
}
]
# Should not raise
Subscriptions.publish_sensor_readings(device_id, org_id, "Router 1", readings)
assert true
end
end
end