80 lines
2.5 KiB
JavaScript
80 lines
2.5 KiB
JavaScript
import test from "node:test";
|
|
import assert from "node:assert/strict";
|
|
|
|
import { BreadcrumbTrail } from "../static/js/wiki/breadcrumb-trail.js";
|
|
|
|
class MemoryStorage {
|
|
constructor() {
|
|
this.values = new Map();
|
|
}
|
|
|
|
getItem(key) {
|
|
return this.values.has(key) ? this.values.get(key) : null;
|
|
}
|
|
|
|
setItem(key, value) {
|
|
this.values.set(key, String(value));
|
|
}
|
|
}
|
|
|
|
test("stored breadcrumbs are limited to current readable pages", () => {
|
|
const storage = new MemoryStorage();
|
|
storage.setItem("racket-wiki-breadcrumb-trail", JSON.stringify([
|
|
"first", "removed", 42, "second"
|
|
]));
|
|
const trail = new BreadcrumbTrail(storage);
|
|
|
|
assert.deepEqual(trail.load(["first", "second"]), ["first", "second"]);
|
|
assert.equal(
|
|
storage.getItem("racket-wiki-breadcrumb-trail"),
|
|
JSON.stringify(["first", "second"]));
|
|
});
|
|
|
|
test("invalid stored JSON starts with an empty trail", () => {
|
|
const storage = new MemoryStorage();
|
|
storage.setItem("racket-wiki-breadcrumb-trail", "not JSON");
|
|
const trail = new BreadcrumbTrail(storage);
|
|
|
|
assert.deepEqual(trail.load(["first"]), []);
|
|
});
|
|
|
|
test("page visits append, truncate revisits and clear at home", () => {
|
|
const storage = new MemoryStorage();
|
|
const trail = new BreadcrumbTrail(storage);
|
|
trail.load(["home", "first", "second", "third"]);
|
|
|
|
trail.record("first", "home");
|
|
trail.record("second", "home");
|
|
trail.record("third", "home");
|
|
assert.deepEqual(trail.slugs, ["first", "second", "third"]);
|
|
|
|
assert.deepEqual(trail.record("second", "home"), ["first", "second"]);
|
|
const returnedSlugs = trail.slugs;
|
|
returnedSlugs.push("outside-change");
|
|
assert.deepEqual(trail.slugs, ["first", "second"]);
|
|
assert.deepEqual(trail.record("home", "home"), []);
|
|
});
|
|
|
|
test("the trail retains at most eight non-home pages", () => {
|
|
const storage = new MemoryStorage();
|
|
const trail = new BreadcrumbTrail(storage);
|
|
const pages = Array.from({ length: 10 }, (_value, index) => `page-${index}`);
|
|
trail.load(["home", ...pages]);
|
|
|
|
for (const page of pages) trail.record(page, "home");
|
|
|
|
assert.deepEqual(trail.slugs, pages.slice(-8));
|
|
});
|
|
|
|
test("selecting a breadcrumb discards only its successors", () => {
|
|
const storage = new MemoryStorage();
|
|
const trail = new BreadcrumbTrail(storage);
|
|
trail.load(["home", "first", "second", "third"]);
|
|
trail.record("first", "home");
|
|
trail.record("second", "home");
|
|
trail.record("third", "home");
|
|
|
|
assert.deepEqual(trail.truncate("first", "home"), ["first"]);
|
|
assert.deepEqual(trail.truncate("missing", "home"), ["first"]);
|
|
});
|