import { describe, expect, it } from "vitest"; import type { ProjectSummary } from "@/utils/projects"; import { buildProjectNameByCwd, buildScheduleProjectTargets, describeScheduleCwd, } from "./schedule-project-targets"; function makeProject(overrides: Partial): ProjectSummary { return { viewKey: "proj", projectName: "Project", hosts: [], totalWorkspaceCount: 0, hostCount: 0, onlineHostCount: 0, ...overrides, }; } function makeHost(overrides: Partial) { return { serverId: "host-1", projectId: "project-1", projectName: "Project", projectCustomName: null, serverName: "Host 1", isOnline: true, repoRoot: "/tmp/project", workspaceCount: 0, workspaces: [], ...overrides, }; } describe("buildScheduleProjectTargets", () => { it("emits one target per online host with a repo root", () => { const targets = buildScheduleProjectTargets([ makeProject({ projectName: "Alpha", hosts: [ makeHost({ projectName: "Alpha on Host 1", repoRoot: "/tmp/alpha" }), makeHost({ serverId: "host-2", projectName: "Alpha on Host 2" }), ], }), ]); expect(targets).toHaveLength(2); expect(targets[0]).toMatchObject({ serverId: "host-1", cwd: "/tmp/alpha", projectName: "Alpha on Host 1", }); }); it("skips offline hosts and blank repo roots", () => { const targets = buildScheduleProjectTargets([ makeProject({ hosts: [makeHost({ isOnline: false }), makeHost({ serverId: "host-3", repoRoot: " " })], }), ]); expect(targets).toHaveLength(0); }); }); describe("describeScheduleCwd", () => { it("prefers a matched project name and shortens unmatched paths", () => { const byCwd = buildProjectNameByCwd( buildScheduleProjectTargets([ makeProject({ projectName: "Grouped Alpha", hosts: [makeHost({ projectName: "Alpha on Host 1", repoRoot: "/tmp/alpha" })], }), ]), ); expect( describeScheduleCwd({ serverId: "host-1", cwd: "/tmp/alpha", projectNameByCwd: byCwd }), ).toBe("Alpha on Host 1"); expect( describeScheduleCwd({ serverId: "host-1", cwd: "/Users/sam/api", projectNameByCwd: byCwd }), ).toBe("~/api"); }); });