// Signing out is a POST and csrfGuard rejects any POST whose _csrf does not
// match the mc_csrf cookie. The Sign out form shipped without that field, so
// every click answered "bad csrf token" and nobody could log out. These pin the
// hidden input in place.
import assert from "node:assert/strict";
import test from "node:test";
import { appBar } from "../src/lib/html.mjs";
const req = (extra = {}) => ({ csrfToken: "deadbeefdeadbeef", user: { email: "a@example.com" }, ...extra });
test("the sign-out form carries the CSRF token", () => {
const html = appBar(req());
assert.match(html, /action="\/auth\/logout"/);
assert.match(html, //);
// the field has to be inside the form, not merely somewhere on the page
const form = html.slice(html.indexOf('action="/auth/logout"'));
assert.ok(
form.indexOf('name="_csrf"') < form.indexOf(""),
"the _csrf input must be inside the sign-out form",
);
});
test("signed-out visitors get no sign-out form at all", () => {
const html = appBar({ user: null, csrfToken: "x" });
assert.doesNotMatch(html, /\/auth\/logout/);
assert.match(html, /Sign in/);
});
test("survives a request with no CSRF token rather than printing undefined", () => {
const html = appBar(req({ csrfToken: undefined }));
assert.match(html, /name="_csrf" value=""/);
});
test("the signed-in identity is escaped", () => {
const html = appBar(req({ user: { email: '' } }));
assert.doesNotMatch(html, /