import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { useSessionStore } from "@/stores/session-store"; import { __resetCheckoutGitActionsStoreForTests, useCheckoutGitActionsStore, } from "@/stores/checkout-git-actions-store"; function createDeferred() { let resolve!: (value: T) => void; let reject!: (reason?: unknown) => void; const promise = new Promise((res, rej) => { resolve = res; reject = rej; }); return { promise, resolve, reject }; } describe("checkout-git-actions-store", () => { const serverId = "server-1"; const cwd = "/tmp/repo"; beforeEach(() => { vi.useFakeTimers(); __resetCheckoutGitActionsStoreForTests(); useSessionStore.setState((state) => ({ ...state, sessions: {} as any })); }); afterEach(() => { vi.useRealTimers(); __resetCheckoutGitActionsStoreForTests(); useSessionStore.setState((state) => ({ ...state, sessions: {} as any })); }); it("shares pending state per checkout and de-dupes in-flight calls", async () => { const deferred = createDeferred(); const client = { checkoutCommit: vi.fn(() => deferred.promise), }; useSessionStore.setState((state) => ({ ...state, sessions: { ...(state.sessions as any), [serverId]: { client } as any, }, })); const store = useCheckoutGitActionsStore.getState(); const first = store.commit({ serverId, cwd }); const second = store.commit({ serverId, cwd }); expect(client.checkoutCommit).toHaveBeenCalledTimes(1); expect( store.getStatus({ serverId, cwd, actionId: "commit" }) ).toBe("pending"); deferred.resolve({}); await Promise.all([first, second]); expect(store.getStatus({ serverId, cwd, actionId: "commit" })).toBe("success"); vi.advanceTimersByTime(1000); expect(store.getStatus({ serverId, cwd, actionId: "commit" })).toBe("idle"); }); });