const assert = require("node:assert/strict"); const { test } = require("node:test"); const { loadApplication } = require("./support/application.cjs"); test("preparation runs once, shares pending work and reports loading and completion", async () => { const app = loadApplication("content"); const progress = []; let requests = 0; let resourceRequests = 0; let resolveUser, resolveSession; app.currentUser.ensure = () => new Promise(resolve => { resolveUser = resolve; }); app.currentUser.allowsCrmActivities = () => true; app.currentUser.getUserId = () => "test@example.invalid"; app.activityProgress.update = (...args) => progress.push(args); app.debugContentLog.appendBackgroundRequestLog = () => {}; app.platformContentMessages.sendRuntimeMessage = message => { if (message.type === "opportunitiesExtension.requestResourceUser") { resourceRequests += 1; assert.equal(message.emailAddress, "test@example.invalid"); assert.deepEqual(progress.at(-1), ["session", "complete"]); return Promise.resolve({ ok: true, resource: { resourcePartyId: 123 } }); } assert.equal(message.type, "opportunitiesExtension.prepareSrSession"); requests += 1; return new Promise(resolve => { resolveSession = resolve; }); }; const first = app.srSessionPreparation.ensure(); assert.equal(app.srSessionPreparation.ensure(), first); assert.equal(requests, 0, "identity must load first"); resolveUser(); await new Promise(resolve => setImmediate(resolve)); assert.deepEqual(progress, [["session", "running"]]); resolveSession({ ok: true }); await first; await app.srSessionPreparation.ensure(); assert.equal(requests, 1); assert.equal(resourceRequests, 1); assert.deepEqual(progress.at(-1), ["session", "complete"]); }); test("SALES_REP skips preparation; failed preparation does not auto-repeat or reject modal loading", async () => { for (const allowed of [false, true]) { const app = loadApplication("content"); let requests = 0; const progress = []; app.currentUser.ensure = async () => {}; app.currentUser.allowsCrmActivities = () => allowed; app.activityProgress.update = (...args) => progress.push(args); app.debugContentLog.appendBackgroundRequestLog = () => {}; app.platformContentMessages.sendRuntimeMessage = async () => { requests += 1; return { ok: false }; }; await app.srSessionPreparation.ensure(); await app.srSessionPreparation.ensure(); assert.equal(requests, allowed ? 1 : 0); assert.deepEqual(progress, allowed ? [["session", "running"], ["session", "error"]] : []); } });