1import { AuthDiagnosticsReadScope, AuthOrchestrationReadScope } from "@t3tools/contracts";
2import { describe, expect, it } from "vite-plus/test";
3
4import { resolveUsageAccess } from "./usageAccess.ts";
5
6describe("resolveUsageAccess", () => {
7 it.each(["available", "offline", "error"] as const)(
8 "reports %s connections without a session instead of keeping totals pending",
9 (connectionPhase) => {
10 expect(
11 resolveUsageAccess({ connectionPhase, session: null, hasSessionError: false }),
12 ).toEqual({
13 canReadDiagnostics: false,
14 isPending: false,
15 error: "This environment is not connected.",
16 });
17 },
18 );
19
20 it.each(["connecting", "reconnecting", "connected"] as const)(
21 "waits for a session check while %s",
22 (connectionPhase) => {
23 expect(
24 resolveUsageAccess({ connectionPhase, session: null, hasSessionError: false }),
25 ).toEqual({ canReadDiagnostics: false, isPending: true, error: null });
26 },
27 );
28
29 it("preserves a known grant so disconnected usage can retain its cached summary", () => {
30 expect(
31 resolveUsageAccess({
32 connectionPhase: "offline",
33 session: { authenticated: true, scopes: [AuthDiagnosticsReadScope] },
34 hasSessionError: false,
35 }),
36 ).toEqual({ canReadDiagnostics: true, isPending: false, error: null });
37 });
38
39 it("distinguishes a failed check from a resolved grant without diagnostics access", () => {
40 const denied = resolveUsageAccess({
41 connectionPhase: "connected",
42 session: {
43 authenticated: true,
44 scopes: [AuthOrchestrationReadScope],
45 auth: { serverUpdateScope: "environment:maintain" },
46 },
47 hasSessionError: false,
48 });
49 const failed = resolveUsageAccess({
50 connectionPhase: "connected",
51 session: null,
52 hasSessionError: true,
53 });
54
55 expect(denied).toEqual({
56 canReadDiagnostics: false,
57 isPending: false,
58 error: "This connection does not have access to diagnostics and usage.",
59 });
60 expect(failed).toEqual({
61 canReadDiagnostics: false,
62 isPending: false,
63 error: "Could not check this connection's access to diagnostics and usage.",
64 });
65 });
66});