Loading comcipapic to establish a session for SR requests
This commit is contained in:
@@ -4,7 +4,7 @@ const fs = require("node:fs");
|
||||
const vm = require("node:vm");
|
||||
const path = require("node:path");
|
||||
const factory = vm.runInNewContext(`${fs.readFileSync(path.join(__dirname, "../src/features/opportunities/internal-sr-session.js"), "utf8")}\ncreateInternalSrSession`);
|
||||
function setup(query) {
|
||||
function setup(query, options = {}) {
|
||||
let elapsed = 0;
|
||||
const frames = [], removed = [], delays = [], stopped = [];
|
||||
const body = { append(frame) { frame.initialSrc = frame.src; frames.push(frame); } };
|
||||
@@ -13,9 +13,28 @@ function setup(query) {
|
||||
return { contentWindow: { stop() { stopped.push(true); } }, style: {}, attributes: {}, listeners: {}, setAttribute(k, v) { this.attributes[k] = v; },
|
||||
addEventListener(k, fn) { this.listeners[k] = fn; }, remove() { removed.push(this); } };
|
||||
} };
|
||||
const api = factory({ query, environment: { document, performance: { now: () => elapsed }, setTimeout: (fn, ms) => { delays.push(ms); elapsed += ms; return setImmediate(fn); } } });
|
||||
const api = factory({ ...options, query, environment: { document, performance: { now: () => elapsed }, setTimeout: (fn, ms) => { delays.push(ms); elapsed += ms; return setImmediate(fn); } } });
|
||||
return { api, frames, removed, delays, stopped };
|
||||
}
|
||||
|
||||
test("lookup requests recover together using the configured page and preserve each result", async () => {
|
||||
let authenticated = false;
|
||||
let calls = 0;
|
||||
const h = setup(async message => {
|
||||
if (++calls <= 4) return { ok: false, httpStatus: 401 };
|
||||
authenticated = true;
|
||||
return { ok: true, items: [message.type] };
|
||||
}, { sessionUrl: "https://eeho.fa.us2.oraclecloud.com/?view=Show%20Service%20Request", sessionLabel: "Service Request" });
|
||||
const types = ["pillar", "language", "platform", "services"];
|
||||
const results = await Promise.all(types.map(type => h.api.request({ type })));
|
||||
assert.deepEqual(results, types.map(type => [type]));
|
||||
assert.equal(authenticated, true);
|
||||
assert.equal(h.frames.length, 1);
|
||||
assert.match(h.frames[0].initialSrc, /Show%20Service%20Request$/);
|
||||
assert.equal(h.frames[0].title, "Service Request session initialization");
|
||||
assert.equal(h.removed.length, 1);
|
||||
assert.equal(h.stopped.length, 1);
|
||||
});
|
||||
test("401 initializes a hidden iframe in the calling document and removes it on success", async () => {
|
||||
let calls = 0;
|
||||
const h = setup(async () => ++calls < 3 ? { ok: false, httpStatus: 401 } : { ok: true, items: [{ SrId: 1 }] });
|
||||
@@ -44,6 +63,33 @@ test("an immediately available session stops the iframe without waiting for load
|
||||
assert.equal(h.removed.length, 1);
|
||||
});
|
||||
|
||||
test("lookup 401 errors from older background responses still initialize the session", async () => {
|
||||
for (const failure of [
|
||||
{ ok: false, error: "requestSrLookupLanguage failed with status 401." },
|
||||
{ ok: false, debugRequests: [{ httpStatus: 401 }] },
|
||||
{ ok: false, httpStatus: "401" }
|
||||
]) {
|
||||
let calls = 0;
|
||||
const h = setup(async () => ++calls <= 2 ? failure : { ok: true, items: ["ready"] });
|
||||
assert.deepEqual(await h.api.request("language"), ["ready"]);
|
||||
assert.equal(h.frames.length, 1);
|
||||
assert.equal(h.removed.length, 1);
|
||||
}
|
||||
});
|
||||
|
||||
test("a lookup that still returns 401 after shared recovery initializes its own session", async () => {
|
||||
const calls = new Map();
|
||||
const h = setup(async id => {
|
||||
const count = (calls.get(id) || 0) + 1;
|
||||
calls.set(id, count);
|
||||
return count <= (id === "language" ? 1 : 2)
|
||||
? { ok: false, httpStatus: 401 } : { ok: true, items: [id] };
|
||||
});
|
||||
assert.deepEqual(await Promise.all([h.api.request("language"), h.api.request("platform")]), [["language"], ["platform"]]);
|
||||
assert.equal(h.frames.length, 2);
|
||||
assert.equal(h.removed.length, 2);
|
||||
});
|
||||
|
||||
test("cross-origin redirects still allow iframe removal when stop is blocked", async () => {
|
||||
let calls = 0;
|
||||
const h = setup(async () => {
|
||||
|
||||
Reference in New Issue
Block a user