import { EnvironmentId, ThreadId } from "@t3tools/contracts"; import { describe, expect, it, vi } from "vite-plus/test"; const mocks = vi.hoisted(() => ({ readThreadPreviewState: vi.fn(), })); vi.mock("~/previewStateStore", () => ({ applyPreviewServerSnapshot: vi.fn(), readThreadPreviewState: mocks.readThreadPreviewState, reconcilePreviewServerSessions: vi.fn(), updatePreviewServerSnapshot: vi.fn(), })); vi.mock("./previewBridge", () => ({ previewBridge: { automation: { evaluate: vi.fn(), status: vi.fn(), }, }, })); import { previewRuntimeTabId } from "~/browser/previewRuntimeTabId"; import { PreviewAutomationTargetUnavailableError } from "./previewAutomationErrors"; import { waitForNavigationReadiness } from "./previewNavigationReadiness"; describe("waitForNavigationReadiness", () => { it("rejects a replaced runtime target even when readiness polling is disabled", async () => { const threadRef = { environmentId: EnvironmentId.make("environment-2"), threadId: ThreadId.make("thread-1"), }; const tabId = "tab_1"; const staleRuntimeTabId = previewRuntimeTabId(threadRef, "epoch-1", tabId); mocks.readThreadPreviewState.mockReturnValue({ serverEpoch: "epoch-2", sessions: { [tabId]: { tabId }, }, }); await expect( waitForNavigationReadiness( threadRef, "request-1", tabId, staleRuntimeTabId, "navigate", "none", 100, ), ).rejects.toBeInstanceOf(PreviewAutomationTargetUnavailableError); }); });