import { isValidElement, type FunctionComponent, type ReactElement } from "react";import { EnvironmentId, ProviderDriverKind, ProviderInstanceId, type ProviderAuthState, type ProviderInstallState, type ServerProvider,} from "@t3tools/contracts";import { beforeEach, describe, expect, it, vi } from "vite-plus/test"; import { visitElements } from "../../test/reactElementTree";import { reactHookHarness as hooks } from "../../test/reactHookHarness"; const setup = vi.hoisted(() => ({ auth: null as ProviderAuthState | null, installation: null as ProviderInstallState | null, authState: vi.fn(() => "auth"), installState: vi.fn(() => "installation"), startAuth: vi.fn(), completeAuth: vi.fn(), cancelAuth: vi.fn(), logoutAuth: vi.fn(), startInstall: vi.fn(), cancelInstall: vi.fn(), removeInstall: vi.fn(), confirm: vi.fn(),})); vi.mock("react", async (importOriginal) => { const actual = await importOriginal<typeof import("react")>(); const { reactHookHarness } = await import("../../test/reactHookHarness"); return { ...actual, useRef: reactHookHarness.useRef, useState: reactHookHarness.useState, };}); vi.mock("react/compiler-runtime", async () => { const { reactHookHarness } = await import("../../test/reactHookHarness"); return { c: reactHookHarness.useMemoCache };}); vi.mock("../../state/server", () => ({ serverEnvironment: { providerAuthState: setup.authState, providerInstallState: setup.installState, startProviderAuth: setup.startAuth, completeProviderAuth: setup.completeAuth, cancelProviderAuth: setup.cancelAuth, logoutProviderAuth: setup.logoutAuth, startProviderInstall: setup.startInstall, cancelProviderInstall: setup.cancelInstall, removeProviderInstallation: setup.removeInstall, },})); vi.mock("../../state/use-atom-command", () => ({ useAtomCommand: (command: unknown) => command,})); vi.mock("../../state/query", () => ({ useEnvironmentQuery: (atom: string) => ({ data: atom === "auth" ? setup.auth : setup.installation, error: null, isPending: false, refresh: vi.fn(), }),})); vi.mock("../../localApi", () => ({ ensureLocalApi: () => ({ dialogs: { confirm: setup.confirm } }),})); import { ProviderSetupSection } from "./ProviderSetupSection"; const environmentId = EnvironmentId.make("remote-google");const instanceId = ProviderInstanceId.make("antigravity_work");const provider: ServerProvider = { instanceId, driver: ProviderDriverKind.make("antigravity"), installed: true, enabled: true, version: "test-version", status: "error", auth: { status: "unauthenticated" }, checkedAt: "2026-09-02T00:00:00.000Z", models: [], skills: [], slashCommands: [], setup: { canAuthenticate: true, canInstall: true },}; function authState(patch: Partial<ProviderAuthState> = {}): ProviderAuthState { return { instanceId, phase: "waiting", flowId: "flow-1", authorizationUrl: "https://accounts.google.com/o/oauth2/v2/auth?state=test-only", expiresAt: "2026-09-02T00:05:00.000Z", message: null, ...patch, };} function renderSetup( options: { readOnly?: boolean; provider?: ServerProvider; enabled?: boolean; binaryPath?: string; } = {},) { hooks.beginRender(); const view = ProviderSetupSection({ environmentId, environmentLabel: "Remote Google device", instanceId, provider: options.provider ?? provider, binaryPath: options.binaryPath, enabled: options.enabled ?? true, readOnly: options.readOnly ?? false, onEnable: vi.fn(), }); const actions = visitElements( view, (element) => typeof element.type === "function" && element.props.environmentId === environmentId && element.props.instanceId === instanceId, ); if (!actions) return view; const Actions = actions.type as FunctionComponent<Record<string, unknown>>; return Actions(actions.props) as ReactElement<Record<string, unknown>>;} function button(view: unknown, label: string) { return visitElements( view, (element) => element.props.children === label && typeof element.props.onClick === "function", );} function countElements( node: unknown, predicate: (element: ReactElement<Record<string, unknown>>) => boolean,): number { if (Array.isArray(node)) { return node.reduce((total, child) => total + countElements(child, predicate), 0); } if (!isValidElement<Record<string, unknown>>(node)) return 0; return ( Number(predicate(node)) + Object.values(node.props).reduce<number>( (total, value) => total + countElements(value, predicate), 0, ) );} function click(view: unknown, label: string) { const target = button(view, label); if (!target) throw new Error(`Missing button: ${label}`); if (target.props.disabled) throw new Error(`Button is disabled: ${label}`); (target.props.onClick as () => void)();} function setCallback(view: unknown, value: string) { const input = visitElements( view, (element) => element.props.id === `provider-callback-${instanceId}`, ); if (!input) throw new Error("Missing callback input."); (input.props.onChange as (event: { target: { value: string } }) => void)({ target: { value } });} function submitCallback(view: unknown) { const form = visitElements(view, (element) => element.type === "form"); if (!form) throw new Error("Missing callback form."); (form.props.onSubmit as (event: { preventDefault: () => void }) => void)({ preventDefault: vi.fn(), });} async function flushPromises() { await Promise.resolve(); await Promise.resolve(); await Promise.resolve();} describe("Antigravity setup", () => { beforeEach(() => { hooks.reset(); vi.clearAllMocks(); setup.auth = authState(); setup.installation = { driver: ProviderDriverKind.make("antigravity"), operationId: null, phase: "idle", downloadedBytes: 0, totalBytes: null, version: null, installedVersion: null, canRemove: false, message: null, }; for (const command of [ setup.startAuth, setup.completeAuth, setup.cancelAuth, setup.logoutAuth, setup.startInstall, setup.cancelInstall, setup.removeInstall, ]) { command.mockReset().mockResolvedValue({ _tag: "Success", value: undefined }); } setup.confirm.mockReset().mockResolvedValue(false); }); it("waits for verified auth after submitting a callback to the selected environment", async () => { const callbackUrl = "http://127.0.0.1:5555/?state=test-only&code=test-only"; setCallback(renderSetup(), callbackUrl); submitCallback(renderSetup()); await flushPromises(); expect(setup.completeAuth).toHaveBeenCalledWith({ environmentId, input: { instanceId, flowId: "flow-1", callbackUrl }, }); let view = renderSetup(); expect( visitElements(view, (element) => element.props.children === "Signed in with Google."), ).toBeNull(); expect( visitElements(view, (element) => element.props.id === `provider-callback-${instanceId}`) ?.props.value, ).toBe(""); setup.auth = authState({ phase: "verifying", authorizationUrl: null }); expect( visitElements( renderSetup(), (element) => element.props.children === "Signed in with Google.", ), ).toBeNull(); setup.auth = authState({ phase: "succeeded", authorizationUrl: null }); view = renderSetup({ provider: { ...provider, status: "ready", auth: { status: "authenticated" } }, }); expect( visitElements(view, (element) => element.props.children === "Signed in with Google."), ).not.toBeNull(); }); it("offers sign-in again when credentials expire after a completed auth flow", () => { setup.auth = authState({ phase: "succeeded", authorizationUrl: null, message: "Google sign-in complete.", }); renderSetup({ provider: { ...provider, status: "ready", auth: { status: "authenticated" } }, }); const expired = renderSetup(); expect(button(expired, "Sign in with Google")).not.toBeNull(); expect( visitElements(expired, (element) => element.props.children === "Signed in with Google."), ).toBeNull(); expect( visitElements(expired, (element) => element.props.children === "Google sign-in complete."), ).toBeNull(); }); it("does not send a callback left over from a replaced sign-in flow", async () => { setCallback(renderSetup(), "http://127.0.0.1:5555/?state=old-flow&code=test-only"); setup.auth = authState({ flowId: "flow-2" }); submitCallback(renderSetup()); await flushPromises(); expect(setup.completeAuth).not.toHaveBeenCalled(); expect(setup.authState).toHaveBeenLastCalledWith({ environmentId, input: { instanceId } }); }); it("coalesces repeated sign-in clicks while start is pending", async () => { setup.auth = authState({ phase: "idle", flowId: null, authorizationUrl: null }); let completeStart: (value: { _tag: "Success"; value: undefined }) => void = () => { throw new Error("Missing start resolver."); }; const pending = new Promise<{ _tag: "Success"; value: undefined }>((resolve) => { completeStart = resolve; }); setup.startAuth.mockReturnValueOnce(pending); const view = renderSetup(); click(view, "Sign in with Google"); click(view, "Sign in with Google"); expect(setup.startAuth).toHaveBeenCalledTimes(1); expect(setup.startAuth).toHaveBeenCalledWith({ environmentId, input: { instanceId } }); completeStart({ _tag: "Success", value: undefined }); await flushPromises(); }); it("shows a repeated runtime status message only once", () => { setup.installation = { ...setup.installation!, operationId: "install-1", phase: "verifying", message: "Checking the downloaded runtime.", }; const view = renderSetup(); expect( countElements( view, (element) => element.props.children === "Checking the downloaded runtime.", ), ).toBe(1); }); it("removes an owned damaged runtime only after confirmation", async () => { setup.auth = authState({ phase: "idle", flowId: null, authorizationUrl: null }); setup.installation = { ...setup.installation!, phase: "failed", canRemove: true, installedVersion: null, }; const view = renderSetup(); click(view, "Remove downloaded runtime"); await flushPromises(); expect(setup.removeInstall).not.toHaveBeenCalled(); setup.confirm.mockResolvedValue(true); click(view, "Remove downloaded runtime"); await flushPromises(); expect(setup.removeInstall).toHaveBeenCalledWith({ environmentId, input: { instanceId } }); }); it.each([true, false])( "can sign out an unchecked account when its instance is enabled=%s", async (enabled) => { setup.auth = authState({ phase: "idle", flowId: null, authorizationUrl: null }); setup.confirm.mockResolvedValue(true); const view = renderSetup({ enabled, provider: { ...provider, enabled, installed: false, status: enabled ? "warning" : "disabled", auth: { status: "unknown" }, }, }); click(view, "Sign out of Google"); await flushPromises(); expect(setup.logoutAuth).toHaveBeenCalledWith({ environmentId, input: { instanceId } }); }, ); it("does not let a shared managed install hide an invalid custom binary path", () => { setup.auth = authState({ phase: "idle", flowId: null, authorizationUrl: null }); setup.installation = { ...setup.installation!, installedVersion: "test-version", canRemove: true, }; const view = renderSetup({ provider: { ...provider, installed: false }, binaryPath: "/missing/antigravity", }); expect(button(view, "Sign in with Google")?.props.disabled).toBe(true); expect(setup.startAuth).not.toHaveBeenCalled(); }); it.each(["read-only", "older-server"] as const)( "does not open private setup subscriptions for a %s view", (mode) => { const { setup: _setup, ...olderProvider } = provider; renderSetup(mode === "read-only" ? { readOnly: true } : { provider: olderProvider }); expect(setup.authState).not.toHaveBeenCalled(); expect(setup.installState).not.toHaveBeenCalled(); expect(setup.startAuth).not.toHaveBeenCalled(); }, );});
import { isValidElement, type FunctionComponent, type ReactElement } from "react";
import {
EnvironmentId,
ProviderDriverKind,
ProviderInstanceId,
type ProviderAuthState,
type ProviderInstallState,
type ServerProvider,
} from "@t3tools/contracts";
import { beforeEach, describe, expect, it, vi } from "vite-plus/test";
import { visitElements } from "../../test/reactElementTree";
import { reactHookHarness as hooks } from "../../test/reactHookHarness";
const setup = vi.hoisted(() => ({
auth: null as ProviderAuthState | null,
installation: null as ProviderInstallState | null,
authState: vi.fn(() => "auth"),
installState: vi.fn(() => "installation"),
startAuth: vi.fn(),
completeAuth: vi.fn(),
cancelAuth: vi.fn(),
logoutAuth: vi.fn(),
startInstall: vi.fn(),
cancelInstall: vi.fn(),
removeInstall: vi.fn(),
confirm: vi.fn(),
}));
vi.mock("react", async (importOriginal) => {
const actual = await importOriginal<typeof import("react")>();
const { reactHookHarness } = await import("../../test/reactHookHarness");
return {
...actual,
useRef: reactHookHarness.useRef,
useState: reactHookHarness.useState,
};
});
vi.mock("react/compiler-runtime", async () => {
const { reactHookHarness } = await import("../../test/reactHookHarness");
return { c: reactHookHarness.useMemoCache };
});
vi.mock("../../state/server", () => ({
serverEnvironment: {
providerAuthState: setup.authState,
providerInstallState: setup.installState,
startProviderAuth: setup.startAuth,
completeProviderAuth: setup.completeAuth,
cancelProviderAuth: setup.cancelAuth,
logoutProviderAuth: setup.logoutAuth,
startProviderInstall: setup.startInstall,
cancelProviderInstall: setup.cancelInstall,
removeProviderInstallation: setup.removeInstall,
},
}));
vi.mock("../../state/use-atom-command", () => ({
useAtomCommand: (command: unknown) => command,
}));
vi.mock("../../state/query", () => ({
useEnvironmentQuery: (atom: string) => ({
data: atom === "auth" ? setup.auth : setup.installation,
error: null,
isPending: false,
refresh: vi.fn(),
}),
}));
vi.mock("../../localApi", () => ({
ensureLocalApi: () => ({ dialogs: { confirm: setup.confirm } }),
}));
import { ProviderSetupSection } from "./ProviderSetupSection";
const environmentId = EnvironmentId.make("remote-google");
const instanceId = ProviderInstanceId.make("antigravity_work");
const provider: ServerProvider = {
instanceId,
driver: ProviderDriverKind.make("antigravity"),
installed: true,
enabled: true,
version: "test-version",
status: "error",
auth: { status: "unauthenticated" },
checkedAt: "2026-09-02T00:00:00.000Z",
models: [],
skills: [],
slashCommands: [],
setup: { canAuthenticate: true, canInstall: true },
};
function authState(patch: Partial<ProviderAuthState> = {}): ProviderAuthState {
return {
instanceId,
phase: "waiting",
flowId: "flow-1",
authorizationUrl: "https://accounts.google.com/o/oauth2/v2/auth?state=test-only",
expiresAt: "2026-09-02T00:05:00.000Z",
message: null,
...patch,
};
}
function renderSetup(
options: {
readOnly?: boolean;
provider?: ServerProvider;
enabled?: boolean;
binaryPath?: string;
} = {},
) {
hooks.beginRender();
const view = ProviderSetupSection({
environmentId,
environmentLabel: "Remote Google device",
instanceId,
provider: options.provider ?? provider,
binaryPath: options.binaryPath,
enabled: options.enabled ?? true,
readOnly: options.readOnly ?? false,
onEnable: vi.fn(),
});
const actions = visitElements(
view,
(element) =>
typeof element.type === "function" &&
element.props.environmentId === environmentId &&
element.props.instanceId === instanceId,
);
if (!actions) return view;
const Actions = actions.type as FunctionComponent<Record<string, unknown>>;
return Actions(actions.props) as ReactElement<Record<string, unknown>>;
}
function button(view: unknown, label: string) {
return visitElements(
view,
(element) => element.props.children === label && typeof element.props.onClick === "function",
);
}
function countElements(
node: unknown,
predicate: (element: ReactElement<Record<string, unknown>>) => boolean,
): number {
if (Array.isArray(node)) {
return node.reduce((total, child) => total + countElements(child, predicate), 0);
}
if (!isValidElement<Record<string, unknown>>(node)) return 0;
return (
Number(predicate(node)) +
Object.values(node.props).reduce<number>(
(total, value) => total + countElements(value, predicate),
0,
)
);
}
function click(view: unknown, label: string) {
const target = button(view, label);
if (!target) throw new Error(`Missing button: ${label}`);
if (target.props.disabled) throw new Error(`Button is disabled: ${label}`);
(target.props.onClick as () => void)();
}
function setCallback(view: unknown, value: string) {
const input = visitElements(
view,
(element) => element.props.id === `provider-callback-${instanceId}`,
);
if (!input) throw new Error("Missing callback input.");
(input.props.onChange as (event: { target: { value: string } }) => void)({ target: { value } });
}
function submitCallback(view: unknown) {
const form = visitElements(view, (element) => element.type === "form");
if (!form) throw new Error("Missing callback form.");
(form.props.onSubmit as (event: { preventDefault: () => void }) => void)({
preventDefault: vi.fn(),
});
}
async function flushPromises() {
await Promise.resolve();
await Promise.resolve();
await Promise.resolve();
}
describe("Antigravity setup", () => {
beforeEach(() => {
hooks.reset();
vi.clearAllMocks();
setup.auth = authState();
setup.installation = {
driver: ProviderDriverKind.make("antigravity"),
operationId: null,
phase: "idle",
downloadedBytes: 0,
totalBytes: null,
version: null,
installedVersion: null,
canRemove: false,
message: null,
};
for (const command of [
setup.startAuth,
setup.completeAuth,
setup.cancelAuth,
setup.logoutAuth,
setup.startInstall,
setup.cancelInstall,
setup.removeInstall,
]) {
command.mockReset().mockResolvedValue({ _tag: "Success", value: undefined });
}
setup.confirm.mockReset().mockResolvedValue(false);
});
it("waits for verified auth after submitting a callback to the selected environment", async () => {
const callbackUrl = "http://127.0.0.1:5555/?state=test-only&code=test-only";
setCallback(renderSetup(), callbackUrl);
submitCallback(renderSetup());
await flushPromises();
expect(setup.completeAuth).toHaveBeenCalledWith({
environmentId,
input: { instanceId, flowId: "flow-1", callbackUrl },
});
let view = renderSetup();
expect(
visitElements(view, (element) => element.props.children === "Signed in with Google."),
).toBeNull();
expect(
visitElements(view, (element) => element.props.id === `provider-callback-${instanceId}`)
?.props.value,
).toBe("");
setup.auth = authState({ phase: "verifying", authorizationUrl: null });
expect(
visitElements(
renderSetup(),
(element) => element.props.children === "Signed in with Google.",
),
).toBeNull();
setup.auth = authState({ phase: "succeeded", authorizationUrl: null });
view = renderSetup({
provider: { ...provider, status: "ready", auth: { status: "authenticated" } },
});
expect(
visitElements(view, (element) => element.props.children === "Signed in with Google."),
).not.toBeNull();
});
it("offers sign-in again when credentials expire after a completed auth flow", () => {
setup.auth = authState({
phase: "succeeded",
authorizationUrl: null,
message: "Google sign-in complete.",
});
renderSetup({
provider: { ...provider, status: "ready", auth: { status: "authenticated" } },
});
const expired = renderSetup();
expect(button(expired, "Sign in with Google")).not.toBeNull();
expect(
visitElements(expired, (element) => element.props.children === "Signed in with Google."),
).toBeNull();
expect(
visitElements(expired, (element) => element.props.children === "Google sign-in complete."),
).toBeNull();
});
it("does not send a callback left over from a replaced sign-in flow", async () => {
setCallback(renderSetup(), "http://127.0.0.1:5555/?state=old-flow&code=test-only");
setup.auth = authState({ flowId: "flow-2" });
submitCallback(renderSetup());
await flushPromises();
expect(setup.completeAuth).not.toHaveBeenCalled();
expect(setup.authState).toHaveBeenLastCalledWith({ environmentId, input: { instanceId } });
});
it("coalesces repeated sign-in clicks while start is pending", async () => {
setup.auth = authState({ phase: "idle", flowId: null, authorizationUrl: null });
let completeStart: (value: { _tag: "Success"; value: undefined }) => void = () => {
throw new Error("Missing start resolver.");
};
const pending = new Promise<{ _tag: "Success"; value: undefined }>((resolve) => {
completeStart = resolve;
});
setup.startAuth.mockReturnValueOnce(pending);
const view = renderSetup();
click(view, "Sign in with Google");
click(view, "Sign in with Google");
expect(setup.startAuth).toHaveBeenCalledTimes(1);
expect(setup.startAuth).toHaveBeenCalledWith({ environmentId, input: { instanceId } });
completeStart({ _tag: "Success", value: undefined });
await flushPromises();
});
it("shows a repeated runtime status message only once", () => {
setup.installation = {
...setup.installation!,
operationId: "install-1",
phase: "verifying",
message: "Checking the downloaded runtime.",
};
const view = renderSetup();
expect(
countElements(
view,
(element) => element.props.children === "Checking the downloaded runtime.",
),
).toBe(1);
});
it("removes an owned damaged runtime only after confirmation", async () => {
setup.auth = authState({ phase: "idle", flowId: null, authorizationUrl: null });
setup.installation = {
...setup.installation!,
phase: "failed",
canRemove: true,
installedVersion: null,
};
const view = renderSetup();
click(view, "Remove downloaded runtime");
await flushPromises();
expect(setup.removeInstall).not.toHaveBeenCalled();
setup.confirm.mockResolvedValue(true);
click(view, "Remove downloaded runtime");
await flushPromises();
expect(setup.removeInstall).toHaveBeenCalledWith({ environmentId, input: { instanceId } });
});
it.each([true, false])(
"can sign out an unchecked account when its instance is enabled=%s",
async (enabled) => {
setup.auth = authState({ phase: "idle", flowId: null, authorizationUrl: null });
setup.confirm.mockResolvedValue(true);
const view = renderSetup({
enabled,
provider: {
...provider,
enabled,
installed: false,
status: enabled ? "warning" : "disabled",
auth: { status: "unknown" },
},
});
click(view, "Sign out of Google");
await flushPromises();
expect(setup.logoutAuth).toHaveBeenCalledWith({ environmentId, input: { instanceId } });
},
);
it("does not let a shared managed install hide an invalid custom binary path", () => {
setup.auth = authState({ phase: "idle", flowId: null, authorizationUrl: null });
setup.installation = {
...setup.installation!,
installedVersion: "test-version",
canRemove: true,
};
const view = renderSetup({
provider: { ...provider, installed: false },
binaryPath: "/missing/antigravity",
});
expect(button(view, "Sign in with Google")?.props.disabled).toBe(true);
expect(setup.startAuth).not.toHaveBeenCalled();
});
it.each(["read-only", "older-server"] as const)(
"does not open private setup subscriptions for a %s view",
(mode) => {
const { setup: _setup, ...olderProvider } = provider;
renderSetup(mode === "read-only" ? { readOnly: true } : { provider: olderProvider });
expect(setup.authState).not.toHaveBeenCalled();
expect(setup.installState).not.toHaveBeenCalled();
expect(setup.startAuth).not.toHaveBeenCalled();
},
);
});