71 lines
2.2 KiB
TypeScript
Vendored
71 lines
2.2 KiB
TypeScript
Vendored
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 '<tag>' AS "name" & col`)).toBe("SELECT '<tag>' AS "name" & col");
|
|
});
|
|
});
|
|
|
|
describe("createSafeSqlHighlighter", () => {
|
|
it("keeps the default GitHub themes", () => {
|
|
const codeToHtml = vi.fn(() => "<span>SELECT 1</span>");
|
|
const highlighter = createSafeSqlHighlighter({ codeToHtml }, { appearance: () => "light" });
|
|
|
|
expect(highlighter("SELECT 1")).toBe("<span>SELECT 1</span>");
|
|
expect(highlighter("SELECT 2", "dark")).toBe("<span>SELECT 1</span>");
|
|
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(() => "<span>SELECT 1</span>");
|
|
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 "<x>" INT;`)).toBe("ALTER TABLE t ADD "<x>" INT;");
|
|
expect(warn).toHaveBeenCalledOnce();
|
|
|
|
warn.mockRestore();
|
|
});
|
|
});
|