47 lines
1.7 KiB
JavaScript
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" });
|
|
});
|