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.
323 lines
9.7 KiB
Elixir
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
|