import { describe, expect, it } from "vitest"; import { OWNED_REPO_DIALECT, REPO_DIALECT } from "#lib/repoQuery.ts"; import { accept, suggest, tokenize } from "#lib/ticketQuery.ts"; const labels = (query: string, caret = query.length) => suggest(query, caret, {}, REPO_DIALECT)?.items.map((item) => item.label) ?? null; describe("repo query dialect", () => { it("knows the repo keys and not the ticket ones", () => { const known = (q: string) => tokenize(q, REPO_DIALECT.qualifiers).map((t) => t.kind === "qualifier" && t.known); expect(known("language:Go author:alice sort:newest")).toEqual([true, true, true]); expect(known("lang:Rust is:open label:bug")).toEqual([false, false, false]); }); it("suggests keys from a typed start", () => { expect(labels("la")).toEqual(["language:"]); expect(labels("is")).toBeNull(); expect(labels("kelp ")).toEqual(["language:", "author:", "sort:"]); }); it("leaves author out of an owner's repo list", () => { const keys = suggest("kelp ", 5, {}, OWNED_REPO_DIALECT)?.items.map((item) => item.label); expect(keys).toEqual(["language:", "sort:"]); }); it("suggests popular languages first and then matching ones", () => { expect(labels("language:")!.slice(0, 3)).toEqual(["Go", "JavaScript", "TypeScript"]); expect(labels("language:ru")!.slice(0, 2)).toEqual(["Rust", "Ruby"]); expect(labels("language:hask")).toContain("Haskell"); expect(labels("language:Rust,ru")).not.toContain("Rust"); }); it("quotes a language with a space when it is accepted", () => { const query = "language:jupyter"; const suggestions = suggest(query, query.length, {}, REPO_DIALECT)!; const item = suggestions.items.find((i) => i.label === "Jupyter Notebook")!; expect(accept(query, suggestions, item).query).toBe(`language:"Jupyter Notebook" `); }); it("flags empty values and unknown sorts only", () => { expect(REPO_DIALECT.problem("language", "")).not.toBeNull(); expect(REPO_DIALECT.problem("language", "Brainfreeze")).toBeNull(); expect(REPO_DIALECT.problem("sort", "newest")).toBeNull(); expect(REPO_DIALECT.problem("sort", "sideways")).not.toBeNull(); }); });