// @vitest-environment happy-dom import React, { act } from "react"; import { createRoot, type Root } from "react-dom/client"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { ImpactPreview, workspaceResourceMutationMessage, } from "./workspace-resource-impact-preview"; const queryState = vi.hoisted(() => ({ result: { data: null as any, isLoading: false }, calls: [] as any[], })); vi.mock("@agent-native/core/client/hooks", () => ({ useActionQuery: (...args: any[]) => { queryState.calls.push(args); return queryState.result; }, })); describe("ImpactPreview", () => { let container: HTMLDivElement; let root: Root; beforeEach(() => { vi.stubGlobal("IS_REACT_ACT_ENVIRONMENT", true); queryState.calls = []; queryState.result = { data: null, isLoading: false }; container = document.createElement("div"); document.body.appendChild(container); root = createRoot(container); }); afterEach(() => { act(() => root.unmount()); container.remove(); vi.unstubAllGlobals(); }); it("renders All-app approval impact and override details", () => { queryState.result = { isLoading: false, data: { affectsAllApps: true, affectedApps: { count: 4 }, approval: { willRequestApproval: true }, overrides: { count: 2, items: [ { scope: "shared", owner: "__shared__", label: "Organization/app override", updatedAt: 1, }, { scope: "personal", owner: "person@example.test", label: "Personal override (person@example.test)", updatedAt: 2, }, ], }, }, }; act(() => { root.render( , ); }); expect(queryState.calls[0]).toEqual([ "preview-workspace-resource-change", { operation: "update", resourceId: "resource_1", path: undefined, scope: "all", }, { enabled: true }, ]); expect(container.textContent).toContain("All apps impact"); expect(container.textContent).toContain("Approval required"); expect(container.textContent).toContain("2 overrides"); expect(container.textContent).toContain( "This change applies to every workspace app (4 discovered).", ); expect(container.textContent).toContain( "It will be queued for approval before it takes effect.", ); expect(container.textContent).toContain("Organization/app override"); expect(container.textContent).toContain( "Personal override (person@example.test)", ); }); it("renders selected-only changes as immediate", () => { queryState.result = { isLoading: false, data: { affectsAllApps: false, affectedApps: { count: null }, approval: { willRequestApproval: false }, overrides: { count: 0, items: [] }, }, }; act(() => { root.render( , ); }); expect(container.textContent).toContain("Selected only"); expect(container.textContent).toContain( "This change only applies to explicitly granted apps.", ); expect(container.textContent).toContain( "It will take effect immediately when saved.", ); }); it("uses approval-request mutation copy only for workspace resource approvals", () => { expect( workspaceResourceMutationMessage( { status: "pending", changeType: "workspace-resource.update" }, "Resource updated", ), ).toBe("Approval requested"); expect( workspaceResourceMutationMessage( { status: "pending", changeType: "dream-proposal.apply" }, "Resource updated", ), ).toBe("Resource updated"); }); });