import { describe, expect, it, vi } from "vitest"; import { createSafeSqlHighlighter, escapeHtml } from "@/lib/sql/sqlHighlighter"; describe("escapeHtml", () => { it("escapes SQL text for v-html fallback rendering", () => { expect(escapeHtml(`SELECT '' AS "name" & col`)).toBe("SELECT '<tag>' AS "name" & col"); }); }); describe("createSafeSqlHighlighter", () => { it("keeps the default GitHub themes", () => { const codeToHtml = vi.fn(() => "SELECT 1"); const highlighter = createSafeSqlHighlighter({ codeToHtml }, { appearance: () => "light" }); expect(highlighter("SELECT 1")).toBe("SELECT 1"); expect(highlighter("SELECT 2", "dark")).toBe("SELECT 1"); expect(codeToHtml).toHaveBeenNthCalledWith(1, "SELECT 1", { lang: "sql", structure: "inline", theme: "github-light", }); expect(codeToHtml).toHaveBeenNthCalledWith(2, "SELECT 2", { lang: "sql", structure: "inline", theme: "github-dark", }); }); it("uses the existing SQL preview themes", () => { const codeToHtml = vi.fn(() => "SELECT 1"); const highlighter = createSafeSqlHighlighter( { codeToHtml }, { appearance: () => "light", themePreset: "preview", }, ); highlighter("SELECT 1"); highlighter("SELECT 2", "dark"); expect(codeToHtml).toHaveBeenNthCalledWith(1, "SELECT 1", { lang: "sql", structure: "inline", theme: "min-light", }); expect(codeToHtml).toHaveBeenNthCalledWith(2, "SELECT 2", { lang: "sql", structure: "inline", theme: "dark-plus", }); }); it("falls back to escaped SQL when Shiki highlighting fails", () => { const warn = vi.spyOn(console, "warn").mockImplementation(() => {}); const highlighter = createSafeSqlHighlighter( { codeToHtml: () => { throw new SyntaxError("Invalid regular expression: invalid group specifier name"); }, }, { appearance: () => "light" }, ); expect(highlighter(`ALTER TABLE t ADD "" INT;`)).toBe("ALTER TABLE t ADD "<x>" INT;"); expect(warn).toHaveBeenCalledOnce(); warn.mockRestore(); }); });