62 lines
1.6 KiB
JavaScript
62 lines
1.6 KiB
JavaScript
import { describe, it, expect, beforeEach } from "vitest";
|
|
import { initPrefs } from "../scripts/init-prefs.mjs";
|
|
|
|
function makeSelect(options = ["10", "25", "50", "100"]) {
|
|
const sel = document.createElement("select");
|
|
sel.id = "items-per-page-dropdown";
|
|
for (const v of options) {
|
|
const o = document.createElement("option");
|
|
o.value = v;
|
|
o.textContent = v;
|
|
sel.appendChild(o);
|
|
}
|
|
document.body.appendChild(sel);
|
|
return sel;
|
|
}
|
|
|
|
describe("init-prefs DOM binding", () => {
|
|
beforeEach(() => {
|
|
document.body.innerHTML = "";
|
|
localStorage.clear();
|
|
});
|
|
|
|
it("initializes select to default (25) when storage empty", () => {
|
|
const sel = makeSelect();
|
|
initPrefs();
|
|
expect(sel.value).toBe("25");
|
|
});
|
|
|
|
it("respects stored value when option exists", () => {
|
|
localStorage.setItem("qedit:itemsPerPage", "50");
|
|
const sel = makeSelect();
|
|
initPrefs();
|
|
expect(sel.value).toBe("50");
|
|
});
|
|
|
|
it("writes back on change and emits event", () => {
|
|
const sel = makeSelect();
|
|
let seen = null;
|
|
document.addEventListener(
|
|
"qedit:prefs:updated",
|
|
(e) => {
|
|
seen = e.detail.itemsPerPage;
|
|
},
|
|
{ once: true }
|
|
);
|
|
initPrefs();
|
|
sel.value = "100";
|
|
sel.dispatchEvent(new Event("change"));
|
|
expect(localStorage.getItem("qedit:itemsPerPage")).toBe("100");
|
|
expect(seen).toBe(100);
|
|
});
|
|
|
|
it("is idempotent (no double-binding)", () => {
|
|
const sel = makeSelect();
|
|
initPrefs();
|
|
initPrefs();
|
|
sel.value = "50";
|
|
sel.dispatchEvent(new Event("change"));
|
|
expect(localStorage.getItem("qedit:itemsPerPage")).toBe("50");
|
|
});
|
|
});
|