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}") assert :ok = Subscriptions.publish_device_status(device_id, org_id, %{ device_name: "Router 1", status: "up" }) 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() } assert :ok = Subscriptions.publish_alert_event(alert, "created") 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()) } ] assert :ok = Subscriptions.publish_sensor_readings(device_id, org_id, "Router 1", readings) end end end