import { scopeThreadRef } from "@t3tools/client-runtime/environment"; import { EnvironmentId, ThreadId, TurnId } from "@t3tools/contracts"; import { beforeEach, describe, expect, it } from "vite-plus/test"; import { selectThreadDiffPanelSelection, useDiffPanelStore } from "./diffPanelStore"; const THREAD_REF = scopeThreadRef(EnvironmentId.make("environment-1"), ThreadId.make("thread-1")); describe("diffPanelStore", () => { beforeEach(() => useDiffPanelStore.setState({ byThreadKey: {}, branchBaseRefByThreadKey: {}, }), ); it("defaults each thread to branch changes when the working tree is clean", () => { expect( selectThreadDiffPanelSelection(useDiffPanelStore.getState().byThreadKey, THREAD_REF), ).toEqual({ kind: "branch", baseRef: null }); }); it("defaults each thread to working changes when the working tree is dirty", () => { expect( selectThreadDiffPanelSelection(useDiffPanelStore.getState().byThreadKey, THREAD_REF, true), ).toEqual({ kind: "unstaged" }); }); it("preserves an explicit scope selection when the working tree state changes", () => { useDiffPanelStore.getState().selectGitScope(THREAD_REF, "branch"); expect( selectThreadDiffPanelSelection(useDiffPanelStore.getState().byThreadKey, THREAD_REF, true), ).toEqual({ kind: "branch", baseRef: null }); }); it("clears incompatible selection fields when changing scopes", () => { const store = useDiffPanelStore.getState(); store.selectTurn(THREAD_REF, TurnId.make("turn-1"), "src/app.ts"); store.selectGitScope(THREAD_REF, "unstaged"); expect( selectThreadDiffPanelSelection(useDiffPanelStore.getState().byThreadKey, THREAD_REF), ).toEqual({ kind: "unstaged" }); useDiffPanelStore.getState().selectBranchBaseRef(THREAD_REF, " origin/main "); expect( selectThreadDiffPanelSelection(useDiffPanelStore.getState().byThreadKey, THREAD_REF), ).toEqual({ kind: "branch", baseRef: "origin/main" }); }); it("increments the reveal request when opening the same turn file again", () => { const turnId = TurnId.make("turn-1"); useDiffPanelStore.getState().selectTurn(THREAD_REF, turnId, "src/app.ts"); useDiffPanelStore.getState().selectTurn(THREAD_REF, turnId, "src/app.ts"); expect( selectThreadDiffPanelSelection(useDiffPanelStore.getState().byThreadKey, THREAD_REF), ).toEqual({ kind: "turn", turnId, filePath: "src/app.ts", revealRequestId: 2 }); }); it("restores the selected branch base after visiting another scope", () => { useDiffPanelStore.getState().selectBranchBaseRef(THREAD_REF, "origin/main"); useDiffPanelStore.getState().selectGitScope(THREAD_REF, "unstaged"); useDiffPanelStore.getState().selectGitScope(THREAD_REF, "branch"); expect( selectThreadDiffPanelSelection(useDiffPanelStore.getState().byThreadKey, THREAD_REF), ).toEqual({ kind: "branch", baseRef: "origin/main" }); }); it("reconciles a missing turn selection to the latest available turn", () => { const missingTurnId = TurnId.make("turn-missing"); const latestTurnId = TurnId.make("turn-latest"); useDiffPanelStore.getState().selectTurn(THREAD_REF, missingTurnId, "src/app.ts"); useDiffPanelStore.getState().reconcileTurnSelection(THREAD_REF, [latestTurnId]); expect( selectThreadDiffPanelSelection(useDiffPanelStore.getState().byThreadKey, THREAD_REF), ).toEqual({ kind: "turn", turnId: latestTurnId, filePath: "src/app.ts", revealRequestId: 1, }); }); });