diff --git a/tests/js/view-router.test.js b/tests/js/view-router.test.js new file mode 100644 index 0000000..10c051b --- /dev/null +++ b/tests/js/view-router.test.js @@ -0,0 +1,30 @@ +// Run with: node --test tests/js/ +const test = require("node:test"); +const assert = require("node:assert/strict"); +const { resolveView, VIEWS } = require("../../web/js/view-router.js"); + +test("the tags deep link and its sub-routes resolve to the tags view", () => { + assert.equal(resolveView("#/tags"), "tags"); + assert.equal(resolveView("#/tags/"), "tags"); + assert.equal(resolveView("#/tags/landscape,portrait?mode=or"), "tags"); +}); + +test("an empty, bare or unknown hash resolves to the prompts dashboard", () => { + assert.equal(resolveView(""), "prompts"); + assert.equal(resolveView("#"), "prompts"); + assert.equal(resolveView("#/"), "prompts"); + assert.equal(resolveView("#/other"), "prompts"); + assert.equal(resolveView("#/tagsX"), "prompts", "prefix must end at a path boundary"); + assert.equal(resolveView("#tags"), "prompts"); +}); + +test("non-string input resolves to the prompts dashboard", () => { + assert.equal(resolveView(undefined), "prompts"); + assert.equal(resolveView(null), "prompts"); + assert.equal(resolveView(42), "prompts"); +}); + +test("every resolved value is a listed view", () => { + assert.ok(Object.isFrozen(VIEWS)); + for (const hash of ["#/tags", "", "#/x"]) assert.ok(VIEWS.includes(resolveView(hash))); +}); diff --git a/web/admin.html b/web/admin.html index c2c6e6e..2f08277 100644 --- a/web/admin.html +++ b/web/admin.html @@ -1043,7 +1043,7 @@