73 lines
2.6 KiB
TypeScript
Vendored
73 lines
2.6 KiB
TypeScript
Vendored
// @vitest-environment happy-dom
|
|
import { beforeEach, describe, expect, it } from "vitest";
|
|
import { applyDdlSearchMarks, clearDdlSearchMarks, DDL_SEARCH_MARK_CLASS } from "@/lib/sql/ddlSearchMarks";
|
|
|
|
let pre: HTMLElement;
|
|
|
|
function marks(): HTMLElement[] {
|
|
return Array.from(pre.querySelectorAll<HTMLElement>(`mark.${DDL_SEARCH_MARK_CLASS}`));
|
|
}
|
|
|
|
beforeEach(() => {
|
|
pre = document.createElement("pre");
|
|
document.body.replaceChildren(pre);
|
|
});
|
|
|
|
describe("applyDdlSearchMarks", () => {
|
|
it("marks every occurrence, ignoring case", () => {
|
|
pre.innerHTML = "<span>child wo</span><span>CHILD</span>";
|
|
applyDdlSearchMarks(pre, "chiLD");
|
|
expect(marks().map((mark) => mark.textContent)).toEqual(["child", "CHILD"]);
|
|
});
|
|
|
|
it("keeps the underlying DDL text unchanged", () => {
|
|
pre.innerHTML = "<span>CREATE TABLE [dbo].[Orders] (</span>";
|
|
const before = pre.textContent;
|
|
applyDdlSearchMarks(pre, "table");
|
|
expect(pre.textContent).toBe(before);
|
|
expect(marks()).toHaveLength(1);
|
|
});
|
|
|
|
it("treats the query literally instead of as a regex", () => {
|
|
pre.innerHTML = "<span>SUM(a+b) AND (b+c)</span>";
|
|
applyDdlSearchMarks(pre, "(b+c)");
|
|
expect(marks().map((mark) => mark.textContent)).toEqual(["(b+c)"]);
|
|
|
|
applyDdlSearchMarks(pre, "a+b");
|
|
expect(marks().map((mark) => mark.textContent)).toEqual(["a+b"]);
|
|
});
|
|
|
|
it("marks matches inside nested elements and next to each other", () => {
|
|
pre.innerHTML = '<span class="hl"><span>name_name</span></span>';
|
|
applyDdlSearchMarks(pre, "name");
|
|
expect(marks().map((mark) => mark.textContent)).toEqual(["name", "name"]);
|
|
expect(pre.textContent).toBe("name_name");
|
|
});
|
|
|
|
it("clears the previous marks when the query changes or empties", () => {
|
|
pre.innerHTML = "<span>alpha beta</span>";
|
|
applyDdlSearchMarks(pre, "alpha");
|
|
applyDdlSearchMarks(pre, "beta");
|
|
expect(marks().map((mark) => mark.textContent)).toEqual(["beta"]);
|
|
|
|
applyDdlSearchMarks(pre, "");
|
|
expect(marks()).toHaveLength(0);
|
|
expect(pre.textContent).toBe("alpha beta");
|
|
});
|
|
|
|
it("does not match across element boundaries", () => {
|
|
pre.innerHTML = "<span>child</span><span>worker</span>";
|
|
applyDdlSearchMarks(pre, "childworker");
|
|
expect(marks()).toHaveLength(0);
|
|
});
|
|
|
|
it("ignores missing elements and treats the query literally", () => {
|
|
expect(() => applyDdlSearchMarks(null, "x")).not.toThrow();
|
|
expect(() => clearDdlSearchMarks(undefined)).not.toThrow();
|
|
|
|
pre.innerHTML = "<span>[Id] int NOT NULL,</span>";
|
|
applyDdlSearchMarks(pre, "[Id] ");
|
|
expect(marks().map((mark) => mark.textContent)).toEqual(["[Id] "]);
|
|
});
|
|
});
|