* feat(schedules): polish schedules list and editing Adds host filtering, status grouping, and target resolution to the schedules screen. Extracts a shared HostFilter from sessions. Improves schedule editing with project targets and model hydration. Handles missing targets server-side instead of retrying forever. * test(mcp): update schedule mocks for createOrReplace * fix(schedules): only show host name when multiple hosts exist
74 lines
2.0 KiB
TypeScript
74 lines
2.0 KiB
TypeScript
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>): ProjectSummary {
|
|
return {
|
|
projectKey: "proj",
|
|
projectName: "Project",
|
|
hosts: [],
|
|
totalWorkspaceCount: 0,
|
|
hostCount: 0,
|
|
onlineHostCount: 0,
|
|
...overrides,
|
|
};
|
|
}
|
|
|
|
function makeHost(overrides: Partial<ProjectSummary["hosts"][number]>) {
|
|
return {
|
|
serverId: "host-1",
|
|
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({ repoRoot: "/tmp/alpha" }), makeHost({ serverId: "host-2" })],
|
|
}),
|
|
]);
|
|
expect(targets).toHaveLength(2);
|
|
expect(targets[0]).toMatchObject({
|
|
serverId: "host-1",
|
|
cwd: "/tmp/alpha",
|
|
projectName: "Alpha",
|
|
});
|
|
});
|
|
|
|
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: "Alpha", hosts: [makeHost({ repoRoot: "/tmp/alpha" })] }),
|
|
]),
|
|
);
|
|
expect(
|
|
describeScheduleCwd({ serverId: "host-1", cwd: "/tmp/alpha", projectNameByCwd: byCwd }),
|
|
).toBe("Alpha");
|
|
expect(
|
|
describeScheduleCwd({ serverId: "host-1", cwd: "/Users/sam/api", projectNameByCwd: byCwd }),
|
|
).toBe("~/api");
|
|
});
|
|
});
|