import { EnvironmentId, ProjectId } from "@t3tools/contracts";import { describe, expect, it } from "vite-plus/test"; import type { EnvironmentProject } from "@t3tools/client-runtime/state/shell";import type { HomeProjectScope } from "../home/homeThreadList";import { getOnlySelectableProject, getProjectScopeSelectionTarget, resolveDraftProjectSelection,} from "./new-task-project-selection"; function makeProject(id: string, environmentId = "environment"): EnvironmentProject { return { environmentId: EnvironmentId.make(environmentId), id: ProjectId.make(id), title: id, workspaceRoot: `/work/${id}`, repositoryIdentity: null, defaultModelSelection: null, scripts: [], createdAt: "2026-07-01T00:00:00.000Z", updatedAt: "2026-07-01T00:00:00.000Z", };} function makeScope(projects: ReadonlyArray<EnvironmentProject>): HomeProjectScope { return { key: "github.com/t3tools/t3code", title: "T3 Code", representative: projects[0]!, projects, projectRefs: projects.map((project) => ({ environmentId: project.environmentId, projectId: project.id, })), };} describe("getOnlySelectableProject", () => { it("auto-selects when there is exactly one physical project", () => { const project = makeProject("t3code"); expect(getOnlySelectableProject([makeScope([project])])).toBe(project); }); it("selects the representative when one logical project has multiple workspaces", () => { const projects = [makeProject("t3code"), makeProject("t3code-2"), makeProject("t3code-3")]; expect(getOnlySelectableProject([makeScope(projects)])).toBe(projects[0]); });}); describe("getProjectScopeSelectionTarget", () => { it("keeps the current environment when it hosts the selected logical project", () => { const projects = [makeProject("t3code-mac", "mac"), makeProject("t3code-server", "server")]; expect(getProjectScopeSelectionTarget(makeScope(projects), EnvironmentId.make("server"))).toBe( projects[1], ); }); it("falls back to the representative when the current environment does not host the project", () => { const projects = [makeProject("t3code-mac", "mac"), makeProject("t3code-server", "server")]; expect(getProjectScopeSelectionTarget(makeScope(projects), EnvironmentId.make("other"))).toBe( projects[0], ); });}); describe("resolveDraftProjectSelection", () => { it("preserves an explicit project selection", () => { const project = makeProject("t3code"); expect( resolveDraftProjectSelection("environment:t3code", [project], [makeScope([project])]), ).toEqual({ kind: "preserve" }); }); it("selects the only physical project when no project was explicitly selected", () => { const project = makeProject("t3code"); expect(resolveDraftProjectSelection(null, [project], [makeScope([project])])).toEqual({ kind: "select", project, }); }); it("selects one logical project even when it has multiple physical workspaces", () => { const projects = [makeProject("t3code"), makeProject("t3code-2"), makeProject("t3code-3")]; expect(resolveDraftProjectSelection(null, projects, [makeScope(projects)])).toEqual({ kind: "select", project: projects[0], }); }); it("does not preserve a project key that is missing from the catalog", () => { const project = makeProject("t3code"); expect( resolveDraftProjectSelection("environment:removed", [project], [makeScope([project])]), ).toEqual({ kind: "select", project, }); });});
import { EnvironmentId, ProjectId } from "@t3tools/contracts";
import { describe, expect, it } from "vite-plus/test";
import type { EnvironmentProject } from "@t3tools/client-runtime/state/shell";
import type { HomeProjectScope } from "../home/homeThreadList";
import {
getOnlySelectableProject,
getProjectScopeSelectionTarget,
resolveDraftProjectSelection,
} from "./new-task-project-selection";
function makeProject(id: string, environmentId = "environment"): EnvironmentProject {
return {
environmentId: EnvironmentId.make(environmentId),
id: ProjectId.make(id),
title: id,
workspaceRoot: `/work/${id}`,
repositoryIdentity: null,
defaultModelSelection: null,
scripts: [],
createdAt: "2026-07-01T00:00:00.000Z",
updatedAt: "2026-07-01T00:00:00.000Z",
};
}
function makeScope(projects: ReadonlyArray<EnvironmentProject>): HomeProjectScope {
return {
key: "github.com/t3tools/t3code",
title: "T3 Code",
representative: projects[0]!,
projects,
projectRefs: projects.map((project) => ({
environmentId: project.environmentId,
projectId: project.id,
})),
};
}
describe("getOnlySelectableProject", () => {
it("auto-selects when there is exactly one physical project", () => {
const project = makeProject("t3code");
expect(getOnlySelectableProject([makeScope([project])])).toBe(project);
});
it("selects the representative when one logical project has multiple workspaces", () => {
const projects = [makeProject("t3code"), makeProject("t3code-2"), makeProject("t3code-3")];
expect(getOnlySelectableProject([makeScope(projects)])).toBe(projects[0]);
});
});
describe("getProjectScopeSelectionTarget", () => {
it("keeps the current environment when it hosts the selected logical project", () => {
const projects = [makeProject("t3code-mac", "mac"), makeProject("t3code-server", "server")];
expect(getProjectScopeSelectionTarget(makeScope(projects), EnvironmentId.make("server"))).toBe(
projects[1],
);
});
it("falls back to the representative when the current environment does not host the project", () => {
const projects = [makeProject("t3code-mac", "mac"), makeProject("t3code-server", "server")];
expect(getProjectScopeSelectionTarget(makeScope(projects), EnvironmentId.make("other"))).toBe(
projects[0],
);
});
});
describe("resolveDraftProjectSelection", () => {
it("preserves an explicit project selection", () => {
const project = makeProject("t3code");
expect(
resolveDraftProjectSelection("environment:t3code", [project], [makeScope([project])]),
).toEqual({ kind: "preserve" });
});
it("selects the only physical project when no project was explicitly selected", () => {
const project = makeProject("t3code");
expect(resolveDraftProjectSelection(null, [project], [makeScope([project])])).toEqual({
kind: "select",
project,
});
});
it("selects one logical project even when it has multiple physical workspaces", () => {
const projects = [makeProject("t3code"), makeProject("t3code-2"), makeProject("t3code-3")];
expect(resolveDraftProjectSelection(null, projects, [makeScope(projects)])).toEqual({
kind: "select",
project: projects[0],
});
});
it("does not preserve a project key that is missing from the catalog", () => {
const project = makeProject("t3code");
expect(
resolveDraftProjectSelection("environment:removed", [project], [makeScope([project])]),
).toEqual({
kind: "select",
project,
});
});
});