onyx-tasks/apps/tauri/src/lib/paths.test.ts
Claude 67ac43e527
Add Vitest suite covering the smoke-test fixes
Extracts two pure helpers out of Svelte components so they can be
exercised without the reactive runtime, and adds component tests for
ConfirmDialog's Escape-handling behavior.

- apps/tauri/src/lib/grouping.ts (new): `groupTasksByDate` lifted out of
  the `groupedPendingTasks` $derived in the app store.
- apps/tauri/src/lib/paths.ts (new): `workspaceNameFromPath` lifted out
  of SetupScreen.handleOpen.
- apps/tauri/src/lib/grouping.test.ts: 8 cases — "No Date" placed last
  (regression), full bucket ordering, empty input, within-bucket
  stable sort, earlier-today stays in Today, multi-task same-day,
  No Date preserves insertion order.
- apps/tauri/src/lib/paths.test.ts: 8 cases — POSIX/Windows/mixed
  separators, trailing slash regression ("…/Tasks/" → "Tasks"), empty
  and root-only fallback, names with spaces.
- apps/tauri/src/lib/components/ConfirmDialog.test.ts: 6 cases —
  renders message/detail/custom confirm text, Cancel/Confirm fire the
  right callbacks, Escape calls oncancel and does NOT reach an outer
  window listener (regression), non-Escape keys are ignored, and the
  module-level open-count increments/decrements correctly (including
  when two dialogs are mounted at once).

Test harness: Vitest + jsdom + @testing-library/svelte. `npm test`
runs the suite; `resolve.conditions` is set to "browser" under VITEST
so Svelte resolves its client entry and mount() works.

23/23 tests pass. cargo check, cargo test -p onyx-core (162/162),
and npm run build all still green.
2026-04-17 14:33:12 +00:00

39 lines
1.3 KiB
TypeScript

import { describe, it, expect } from "vitest";
import { workspaceNameFromPath } from "./paths";
describe("workspaceNameFromPath", () => {
it("returns the last path component of a POSIX path", () => {
expect(workspaceNameFromPath("/home/me/Tasks")).toBe("Tasks");
});
it("strips a trailing slash (regression: used to fall back to 'workspace')", () => {
expect(workspaceNameFromPath("/home/me/Tasks/")).toBe("Tasks");
});
it("strips multiple trailing slashes", () => {
expect(workspaceNameFromPath("/home/me/Tasks///")).toBe("Tasks");
});
it("handles Windows-style backslash paths", () => {
expect(workspaceNameFromPath("C:\\Users\\me\\Tasks")).toBe("Tasks");
});
it("strips a trailing backslash on Windows paths", () => {
expect(workspaceNameFromPath("C:\\Users\\me\\Tasks\\")).toBe("Tasks");
});
it("handles mixed separators", () => {
expect(workspaceNameFromPath("C:\\Users/me\\Tasks")).toBe("Tasks");
});
it("falls back to 'workspace' when the path has no usable tail", () => {
expect(workspaceNameFromPath("/")).toBe("workspace");
expect(workspaceNameFromPath("\\")).toBe("workspace");
expect(workspaceNameFromPath("")).toBe("workspace");
});
it("preserves names with spaces", () => {
expect(workspaceNameFromPath("/home/me/My Tasks/")).toBe("My Tasks");
});
});