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 resolveUser, resolveSession; app.currentUser.ensure = () => new Promise(resolve => { resolveUser = resolve; }); app.currentUser.allowsCrmActivities = () => true; app.activityProgress.update = (...args) => progress.push(args); app.debugContentLog.appendBackgroundRequestLog = () => {}; app.platformContentMessages.sendRuntimeMessage = message => { 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.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"]] : []); } });