61 lines
1.8 KiB
JavaScript
61 lines
1.8 KiB
JavaScript
import test from "node:test";
|
|
import assert from "node:assert/strict";
|
|
|
|
const {
|
|
DEFAULT_PIPELINE_FALLBACK_POLICIES,
|
|
} = await import("../dist/ai/user-request-pipeline/blueprint.js");
|
|
const {
|
|
decidePipelineFallback,
|
|
fallbackReasonFromStageStatus,
|
|
resolvePipelineFallbackAction,
|
|
} = await import("../dist/ai/user-request-pipeline/fallback-executor.js");
|
|
|
|
test("fallback executor resolves configured failed action", () => {
|
|
assert.equal(
|
|
resolvePipelineFallbackAction({
|
|
stage: "input_size_gate",
|
|
reason: "failed",
|
|
policies: DEFAULT_PIPELINE_FALLBACK_POLICIES,
|
|
}),
|
|
"notify_user",
|
|
);
|
|
});
|
|
|
|
test("fallback executor uses default action for missing policy", () => {
|
|
assert.equal(
|
|
resolvePipelineFallbackAction({
|
|
stage: "send_response",
|
|
reason: "failed",
|
|
policies: [],
|
|
}),
|
|
"fail_request",
|
|
);
|
|
assert.equal(
|
|
resolvePipelineFallbackAction({
|
|
stage: "send_response",
|
|
reason: "unavailable",
|
|
policies: [],
|
|
}),
|
|
"continue_without_stage",
|
|
);
|
|
});
|
|
|
|
test("fallback decision exposes notify and continuation flags", () => {
|
|
const decision = decidePipelineFallback({
|
|
stage: "document_rag",
|
|
reason: "failed",
|
|
policies: DEFAULT_PIPELINE_FALLBACK_POLICIES,
|
|
});
|
|
|
|
assert.equal(decision.action, "notify_user");
|
|
assert.equal(decision.shouldNotifyUser, true);
|
|
assert.equal(decision.shouldContinue, true);
|
|
assert.equal(decision.shouldFailRequest, false);
|
|
});
|
|
|
|
test("fallback reason maps only failed and skipped statuses", () => {
|
|
assert.equal(fallbackReasonFromStageStatus("failed"), "failed");
|
|
assert.equal(fallbackReasonFromStageStatus("skipped"), "unavailable");
|
|
assert.equal(fallbackReasonFromStageStatus("succeeded"), undefined);
|
|
});
|