Implemented filters for Service Requests and Actions
This commit is contained in:
@@ -2,6 +2,83 @@ const assert = require("node:assert/strict");
|
||||
const { test } = require("node:test");
|
||||
const { loadApplication } = require("./support/application.cjs");
|
||||
const flush = () => new Promise(resolve => setImmediate(resolve));
|
||||
function deferred() {
|
||||
let resolve, reject;
|
||||
const promise = new Promise((yes, no) => { resolve = yes; reject = no; });
|
||||
return { promise, resolve, reject };
|
||||
}
|
||||
|
||||
for (const first of ["SR", "Actions"]) {
|
||||
test(`Last update waits for every background call when ${first} finishes first`, async () => {
|
||||
const h = setup();
|
||||
const sr = deferred(), actions = deferred();
|
||||
let renders = 0;
|
||||
h.app.productsContentJobs.renderProductsProgress = () => { renders += 1; };
|
||||
h.app.productsContentState.productsLastCachedAt = 100;
|
||||
h.app.opportunityCrmServiceRequests.load = () => sr.promise;
|
||||
h.app.opportunityWorkloadActions.loadProducts = () => actions.promise;
|
||||
const id = h.start();
|
||||
h.progress(id, { state: "running", optyNumber: "A", items: [{ RevnId: "1" }], cachedAt: 200 });
|
||||
assert.equal(h.app.productsContentState.productsLastCachedAt, 100);
|
||||
h.progress(id, { state: "complete" });
|
||||
await flush();
|
||||
assert.equal(h.app.productsContentState.productsLastCachedAt, 100);
|
||||
(first === "SR" ? sr : actions).resolve();
|
||||
await flush();
|
||||
assert.equal(h.app.productsContentState.productsLastCachedAt, 100);
|
||||
(first === "SR" ? actions : sr).resolve();
|
||||
await flush();
|
||||
assert.equal(h.app.productsContentState.productsLastCachedAt, 200);
|
||||
assert.equal(renders, 1, "publish the completed cycle once");
|
||||
});
|
||||
}
|
||||
|
||||
test("Last update ignores superseded cycles and settles failures without changing the cache timestamp", async () => {
|
||||
const h = setup();
|
||||
const old = deferred(), current = deferred();
|
||||
h.app.productsContentState.productsLastCachedAt = 100;
|
||||
h.app.opportunityCrmServiceRequests.load = () => old.promise;
|
||||
const first = h.start();
|
||||
h.progress(first, { state: "complete", optyNumber: "A", items: [], cachedAt: 200 });
|
||||
h.app.opportunityCrmServiceRequests.load = () => current.promise;
|
||||
const second = h.start();
|
||||
h.progress(second, { state: "complete", optyNumber: "A", items: [], cachedAt: 300 });
|
||||
old.resolve();
|
||||
await flush();
|
||||
assert.equal(h.app.productsContentState.productsLastCachedAt, 100);
|
||||
current.reject(new Error("Synthetic failure"));
|
||||
await flush();
|
||||
assert.equal(h.app.productsContentState.productsLastCachedAt, 300);
|
||||
});
|
||||
|
||||
test("Last update waits for cache restoration and ignores a superseded Reference", async () => {
|
||||
const h = setup();
|
||||
const restore = deferred();
|
||||
h.app.productsContentState.productsLastCachedAt = 100;
|
||||
h.app.opportunityCrmServiceRequests.load = () => restore.promise;
|
||||
const id = h.start();
|
||||
h.progress(id, { state: "complete", optyNumber: "A", items: [], cachedAt: 200, fromCache: true });
|
||||
await flush();
|
||||
assert.equal(h.app.productsContentState.productsLastCachedAt, 100);
|
||||
h.app.opportunitiesQueryState.periodRequestVersion += 1;
|
||||
restore.resolve();
|
||||
await flush();
|
||||
assert.equal(h.app.productsContentState.productsLastCachedAt, 100);
|
||||
const next = h.start();
|
||||
h.progress(next, { state: "complete", optyNumber: "A", items: [], cachedAt: 200, fromCache: true });
|
||||
await flush();
|
||||
assert.equal(h.app.productsContentState.productsLastCachedAt, 200);
|
||||
});
|
||||
|
||||
test("Last update completes for SALES_REP without activity requests", async () => {
|
||||
const h = setup();
|
||||
h.app.opportunityCrmServiceRequests.load = () => undefined;
|
||||
h.app.opportunityWorkloadActions.loadProducts = () => undefined;
|
||||
const id = h.start();
|
||||
h.progress(id, { state: "complete", optyNumber: "A", items: [], cachedAt: 200 });
|
||||
await flush();
|
||||
assert.equal(h.app.productsContentState.productsLastCachedAt, 200);
|
||||
});
|
||||
|
||||
function setup() {
|
||||
let listener;
|
||||
|
||||
Reference in New Issue
Block a user