fix(campaign): bound operator queue polling

This commit is contained in:
2026-07-22 09:39:03 +02:00
parent 99d44eeb8d
commit 735e874bd0
4 changed files with 136 additions and 21 deletions

View File

@@ -5,7 +5,9 @@ import {
OPERATOR_QUEUE_REASON,
campaignLifecycleTotals,
campaignVersionWorkItems,
operatorDeliveryStateCounts,
operatorQueueActionBlocks,
shouldRefreshOperatorVersionSummary,
type OperatorQueueFacts,
type OperatorQueuePermissions
} from "../src/features/operator/operatorQueueModel.ts";
@@ -112,3 +114,38 @@ test("campaign-wide lifecycle totals are not multiplied across version rows", ()
{ pausable: 0, paused: 2, cancellable: 2 }
]), { pausable: 3, paused: 3, cancellable: 6 });
});
test("paused jobs do not overlap with queued or active delivery counts", () => {
assert.deepEqual(operatorDeliveryStateCounts(
{ queued: 0 },
{ queued: 4, claimed: 0, sending: 0, smtpAccepted: 2, sent: 1 }
), {
queued: 0,
claimed: 0,
sending: 0,
completed: 3,
queuedOrActive: 0
});
});
test("fast polling refreshes only selected, changed, uncached, active, or attention versions", () => {
const baseline = {
fullDiscovery: false,
versionChanged: false,
selected: false,
cached: true,
queuedOrActive: 0,
needsAttention: 0
};
assert.equal(shouldRefreshOperatorVersionSummary(baseline), false);
for (const override of [
{ fullDiscovery: true },
{ versionChanged: true },
{ selected: true },
{ cached: false },
{ queuedOrActive: 1 },
{ needsAttention: 1 }
]) {
assert.equal(shouldRefreshOperatorVersionSummary({ ...baseline, ...override }), true);
}
});