40464-vm/backend/test/sessionLifecycle.test.js
2026-07-22 15:25:42 +00:00

47 lines
1.7 KiB
JavaScript

const test = require("node:test");
const assert = require("node:assert/strict");
const {
editableSessionPayload,
draftChanges,
approvalChanges,
shareChanges,
unshareChanges,
} = require("../src/security/sessionLifecycle");
test("session edits return shared content to private draft", () => {
const changes = draftChanges({ revision: 2 }, {
title: "Synthetic session",
shared_client_notes: "Approved-safe draft",
privateFieldFromBrowser: "blocked",
status: "shared",
}, "coach-a");
assert.equal(changes.status, "draft");
assert.equal(changes.revision, 3);
assert.equal(changes.approved_at, null);
assert.equal(changes.privateFieldFromBrowser, undefined);
});
test("approval requires client-safe notes", () => {
assert.throws(() => approvalChanges({ shared_client_notes: "" }, "coach-a"));
const changes = approvalChanges({ shared_client_notes: "Safe notes" }, "coach-a", new Date(0));
assert.equal(changes.status, "approved");
assert.equal(changes.approved_at.getTime(), 0);
});
test("only approved sessions can be shared", () => {
assert.throws(() => shareChanges({ status: "draft" }, "coach-a"));
assert.equal(shareChanges({ status: "approved" }, "coach-a").status, "shared");
});
test("unsharing removes portal visibility state", () => {
const changes = unshareChanges("coach-a", new Date(0));
assert.equal(changes.status, "unshared");
assert.equal(changes.unshared_at.getTime(), 0);
});
test("editable payload ignores ownership and lifecycle fields", () => {
const payload = editableSessionPayload({ title: "Allowed", clientId: "blocked", approved_by_id: "blocked" });
assert.deepEqual(payload, { title: "Allowed" });
});