100 lines · 3.5 KB · TypeScript
RawDownload
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,    });  });});