import { assertEquals, assertRejects } from "@std/assert"; import { BACKGROUND_CONTEXT as context } from "@earendil-works/chord/context"; import { ok } from "@earendil-works/pi-durable/env"; import { localEnvironment } from "@berry/api/environment.ts"; import { join, win32 } from "node:path"; import { localOnly } from "./environment.ts"; import { folders } from "./folders.ts"; import { setup } from "./fixture.ts"; import { tempDir } from "@berry/util"; Deno.test("folder suggestions list only matching directories, including spaces, hidden folders, and directory symlinks", async () => { await using rootDir = await tempDir(); const root = rootDir.path; for (const name of ["alpha", "another folder", ".hidden", "Beta"]) { await Deno.mkdir(join(root, name)); } await Deno.writeTextFile(join(root, "a-file"), ""); await Deno.symlink(join(root, "alpha"), join(root, "a-link")); await Deno.symlink(join(root, "a-file"), join(root, "a-file-link")); await Deno.symlink(join(root, "missing"), join(root, "a-broken")); const env = localEnvironment(root); assertEquals(await folders(env, "a", context), ["a-link/", "alpha/", "another folder/"]); assertEquals(await folders(env, ".", context), [".hidden/"]); assertEquals(await folders(env, "b", context), []); assertEquals( await folders(env, `${root}/a`, context), ["a-link", "alpha", "another folder"].map((name) => `${root}/${name}/`), ); assertEquals(await folders(env, "alpha/", context), []); await assertRejects(() => folders(env, "missing/", context)); await assertRejects(() => folders(env, "a\0", context)); for (let i = 0; i < 60; i++) await Deno.mkdir(join(root, `many-${i}`)); assertEquals((await folders(env, "many-", context)).length, 50); }); Deno.test("folder completion uses the selected machine and base", async () => { await using rootDir = await tempDir(); const root = rootDir.path; await Deno.mkdir(join(root, "remote-folder")); await Deno.mkdir(join(root, "nested")); await Deno.mkdir(join(root, "nested", "child")); await using harness = await setup({ open(name, cwd, during) { if (name !== "other") return localOnly.open(name, cwd, during); return Promise.resolve(Object.assign(localEnvironment(cwd ?? root), { name, home: root })); }, close: () => Promise.resolve(), }); const { berry } = harness; assertEquals(await berry.folders("other", null, "remote"), ["remote-folder/"]); assertEquals(await berry.folders("other", join(root, "nested"), "c"), ["child/"]); assertEquals(await berry.folders("other", null, "~/remote"), [`${root}/remote-folder/`]); await assertRejects(() => berry.folders("missing", null, "")); }); Deno.test("Windows suggestions use the remote machine's separators and case-insensitive prefixes", async () => { const parents: string[] = []; const env = Object.assign(localEnvironment("/"), { platform: "win32", home: "C:\\Users\\char", absolutePath(path: string) { parents.push(path); return Promise.resolve(ok(win32.resolve("C:\\Users\\char", path))); }, listDir: () => Promise.resolve(ok([ { name: "Berry", path: "C:\\Users\\char\\Berry", kind: "directory" as const, size: 0, mtime: 0, }, { name: "Book", path: "C:\\Users\\char\\Book", kind: "directory" as const, size: 0, mtime: 0, }, ])), }); assertEquals(await folders(env, "b", context), ["Berry\\", "Book\\"]); assertEquals(await folders(env, "~\\b", context), [ "C:\\Users\\char\\Berry\\", "C:\\Users\\char\\Book\\", ]); assertEquals(parents, [".", "C:\\Users\\char"]); });