towerops/test/towerops_web/graphql/resolvers/unauthenticated_test.exs
Graham McIntire fde6158251 ci: enable PostGIS in test workflows + add tests covering ~3pp more
CI: switch postgres service image to timescale/timescaledb-ha:pg17-all
which bundles PostGIS, fixing the lidar migration failure in PR and
production workflows.

Tests: ~30 new test files / extensions, ~600+ new tests, taking total
coverage from 70.42% to 73.4%. Targets included GraphQL resolver
unauthenticated paths, SNMP context queries (mempools, processors,
ip_addresses, neighbors, wireless_clients, arp_entries), worker
routing/lifecycle (alert notification, alert digest, weather sync,
job cleanup, cn_maestro, uisp, mikrotik backup, report worker),
SNMP monitoring executors (storage, interface, processor) end-to-end
via stub adapter, NetBox + Sonar sync integration paths, ConfigChanges
listing and correlator, organizations membership query, and live-view
smoke tests for org-scoped settings, integrations, maintenance, agent,
device deep paths, schedules. Property tests used for query
composition and pure helpers where natural.
2026-05-05 10:35:22 -05:00

323 lines
9.7 KiB
Elixir

defmodule ToweropsWeb.GraphQL.Resolvers.UnauthenticatedTest do
@moduledoc """
Verifies that every public resolver function returns an authentication error
when invoked without an `organization_id` in the resolution context.
Catches accidental drift where someone adds a new resolver clause that
accepts requests without auth.
"""
use ExUnit.Case, async: true
alias ToweropsWeb.GraphQL.Resolvers
@auth_error {:error, "Authentication required"}
@no_auth %{}
describe "Activity" do
test "list/3 unauthenticated" do
assert @auth_error = Resolvers.Activity.list(nil, %{}, @no_auth)
end
end
describe "Agent" do
test "list/3 unauthenticated" do
assert @auth_error = Resolvers.Agent.list(nil, %{}, @no_auth)
end
test "get/3 unauthenticated" do
assert @auth_error = Resolvers.Agent.get(nil, %{id: "x"}, @no_auth)
end
test "create/3 unauthenticated" do
assert @auth_error = Resolvers.Agent.create(nil, %{name: "x"}, @no_auth)
end
test "delete/3 unauthenticated" do
assert @auth_error = Resolvers.Agent.delete(nil, %{id: "x"}, @no_auth)
end
end
describe "Alert" do
test "list/3 unauthenticated" do
assert @auth_error = Resolvers.Alert.list(nil, %{}, @no_auth)
end
test "get/3 unauthenticated" do
assert @auth_error = Resolvers.Alert.get(nil, %{id: "x"}, @no_auth)
end
test "acknowledge/3 unauthenticated" do
assert @auth_error = Resolvers.Alert.acknowledge(nil, %{id: "x"}, @no_auth)
end
test "resolve_alert/3 unauthenticated" do
assert @auth_error = Resolvers.Alert.resolve_alert(nil, %{id: "x"}, @no_auth)
end
end
describe "Device" do
test "list/3 unauthenticated" do
assert @auth_error = Resolvers.Device.list(nil, %{}, @no_auth)
end
test "get/3 unauthenticated" do
assert @auth_error = Resolvers.Device.get(nil, %{id: "x"}, @no_auth)
end
test "create/3 unauthenticated" do
assert @auth_error = Resolvers.Device.create(nil, %{input: %{}}, @no_auth)
end
test "update/3 unauthenticated" do
assert @auth_error = Resolvers.Device.update(nil, %{id: "x", input: %{}}, @no_auth)
end
test "delete/3 unauthenticated" do
assert @auth_error = Resolvers.Device.delete(nil, %{id: "x"}, @no_auth)
end
test "metrics/3 unauthenticated" do
assert @auth_error = Resolvers.Device.metrics(nil, %{device_id: "x"}, @no_auth)
end
test "interfaces/3 unauthenticated" do
assert @auth_error = Resolvers.Device.interfaces(nil, %{device_id: "x"}, @no_auth)
end
end
describe "EscalationPolicy" do
test "list/3 unauthenticated" do
assert @auth_error = Resolvers.EscalationPolicy.list(nil, %{}, @no_auth)
end
test "get/3 unauthenticated" do
assert @auth_error = Resolvers.EscalationPolicy.get(nil, %{id: "x"}, @no_auth)
end
test "create/3 unauthenticated" do
assert @auth_error = Resolvers.EscalationPolicy.create(nil, %{input: %{}}, @no_auth)
end
test "update/3 unauthenticated" do
assert @auth_error = Resolvers.EscalationPolicy.update(nil, %{id: "x", input: %{}}, @no_auth)
end
test "delete/3 unauthenticated" do
assert @auth_error = Resolvers.EscalationPolicy.delete(nil, %{id: "x"}, @no_auth)
end
test "create_rule/3 unauthenticated" do
assert @auth_error =
Resolvers.EscalationPolicy.create_rule(
nil,
%{escalation_policy_id: "x", input: %{}},
@no_auth
)
end
test "update_rule/3 unauthenticated" do
assert @auth_error =
Resolvers.EscalationPolicy.update_rule(nil, %{id: "x", input: %{}}, @no_auth)
end
test "delete_rule/3 unauthenticated" do
assert @auth_error = Resolvers.EscalationPolicy.delete_rule(nil, %{id: "x"}, @no_auth)
end
test "create_target/3 unauthenticated" do
assert @auth_error =
Resolvers.EscalationPolicy.create_target(
nil,
%{escalation_rule_id: "x", input: %{}},
@no_auth
)
end
test "delete_target/3 unauthenticated" do
assert @auth_error = Resolvers.EscalationPolicy.delete_target(nil, %{id: "x"}, @no_auth)
end
end
describe "Integration" do
test "list/3 unauthenticated" do
assert @auth_error = Resolvers.Integration.list(nil, %{}, @no_auth)
end
test "create/3 unauthenticated" do
assert @auth_error = Resolvers.Integration.create(nil, %{input: %{}}, @no_auth)
end
test "update/3 unauthenticated" do
assert @auth_error =
Resolvers.Integration.update(nil, %{id: "x", input: %{}}, @no_auth)
end
test "delete/3 unauthenticated" do
assert @auth_error = Resolvers.Integration.delete(nil, %{id: "x"}, @no_auth)
end
test "test_connection/3 unauthenticated" do
assert @auth_error = Resolvers.Integration.test_connection(nil, %{id: "x"}, @no_auth)
end
end
describe "MaintenanceWindow" do
test "list/3 unauthenticated" do
assert @auth_error = Resolvers.MaintenanceWindow.list(nil, %{}, @no_auth)
end
test "get/3 unauthenticated" do
assert @auth_error = Resolvers.MaintenanceWindow.get(nil, %{id: "x"}, @no_auth)
end
test "create/3 unauthenticated" do
assert @auth_error =
Resolvers.MaintenanceWindow.create(nil, %{input: %{}}, @no_auth)
end
test "update/3 unauthenticated" do
assert @auth_error =
Resolvers.MaintenanceWindow.update(nil, %{id: "x", input: %{}}, @no_auth)
end
test "delete/3 unauthenticated" do
assert @auth_error = Resolvers.MaintenanceWindow.delete(nil, %{id: "x"}, @no_auth)
end
end
describe "Member" do
test "list/3 unauthenticated" do
assert @auth_error = Resolvers.Member.list(nil, %{}, @no_auth)
end
test "invite/3 unauthenticated" do
assert @auth_error = Resolvers.Member.invite(nil, %{email: "x"}, @no_auth)
end
test "cancel_invitation/3 unauthenticated" do
assert @auth_error = Resolvers.Member.cancel_invitation(nil, %{id: "x"}, @no_auth)
end
test "remove/3 unauthenticated" do
assert @auth_error = Resolvers.Member.remove(nil, %{id: "x"}, @no_auth)
end
test "update_role/3 unauthenticated" do
assert @auth_error =
Resolvers.Member.update_role(nil, %{id: "x", role: "admin"}, @no_auth)
end
end
describe "Organization" do
test "list_mine/3 unauthenticated" do
assert @auth_error = Resolvers.Organization.list_mine(nil, %{}, @no_auth)
end
test "get/3 unauthenticated" do
assert @auth_error = Resolvers.Organization.get(nil, %{}, @no_auth)
end
test "update/3 unauthenticated" do
assert @auth_error = Resolvers.Organization.update(nil, %{input: %{}}, @no_auth)
end
end
describe "Schedule" do
test "list/3 unauthenticated" do
assert @auth_error = Resolvers.Schedule.list(nil, %{}, @no_auth)
end
test "get/3 unauthenticated" do
assert @auth_error = Resolvers.Schedule.get(nil, %{id: "x"}, @no_auth)
end
test "on_call/3 unauthenticated" do
assert @auth_error = Resolvers.Schedule.on_call(nil, %{schedule_id: "x"}, @no_auth)
end
test "create/3 unauthenticated" do
assert @auth_error = Resolvers.Schedule.create(nil, %{input: %{}}, @no_auth)
end
test "update/3 unauthenticated" do
assert @auth_error =
Resolvers.Schedule.update(nil, %{id: "x", input: %{}}, @no_auth)
end
test "delete/3 unauthenticated" do
assert @auth_error = Resolvers.Schedule.delete(nil, %{id: "x"}, @no_auth)
end
test "create_layer/3 unauthenticated" do
assert @auth_error =
Resolvers.Schedule.create_layer(
nil,
%{schedule_id: "x", input: %{}},
@no_auth
)
end
test "update_layer/3 unauthenticated" do
assert @auth_error =
Resolvers.Schedule.update_layer(nil, %{id: "x", input: %{}}, @no_auth)
end
test "delete_layer/3 unauthenticated" do
assert @auth_error = Resolvers.Schedule.delete_layer(nil, %{id: "x"}, @no_auth)
end
test "add_member/3 unauthenticated" do
assert @auth_error =
Resolvers.Schedule.add_member(
nil,
%{layer_id: "x", user_id: "u", position: 1},
@no_auth
)
end
test "remove_member/3 unauthenticated" do
assert @auth_error = Resolvers.Schedule.remove_member(nil, %{id: "x"}, @no_auth)
end
test "create_override/3 unauthenticated" do
assert @auth_error =
Resolvers.Schedule.create_override(
nil,
%{schedule_id: "x", input: %{}},
@no_auth
)
end
test "delete_override/3 unauthenticated" do
assert @auth_error = Resolvers.Schedule.delete_override(nil, %{id: "x"}, @no_auth)
end
end
describe "Site" do
test "list/3 unauthenticated" do
assert @auth_error = Resolvers.Site.list(nil, %{}, @no_auth)
end
test "get/3 unauthenticated" do
assert @auth_error = Resolvers.Site.get(nil, %{id: "x"}, @no_auth)
end
test "create/3 unauthenticated" do
assert @auth_error = Resolvers.Site.create(nil, %{input: %{}}, @no_auth)
end
test "update/3 unauthenticated" do
assert @auth_error = Resolvers.Site.update(nil, %{id: "x", input: %{}}, @no_auth)
end
test "delete/3 unauthenticated" do
assert @auth_error = Resolvers.Site.delete(nil, %{id: "x"}, @no_auth)
end
end
describe "Helpers" do
test "authentication_error/0 returns canonical tuple" do
assert Resolvers.Helpers.authentication_error() == @auth_error
end
end
end