mirror of
https://github.com/MBombeck/HealthLog.git
synced 2026-11-14 22:50:51 +00:00
feat(documents): gate document, lab and medication reading on their capabilities
Reading a document, scanning a lab report and turning a medication description into a schedule follow documentAi, labsOcr and medicationExtract. Unavailable, the action is not offered. With only the document-reading consent missing, the place that reads asks for it and grants exactly that (ai_extraction), nothing wider. Refusals are read by meta.errorCode: a 403 is no longer always called a missing consent, and a spent daily budget no longer shows the rate-limit sentence.
This commit is contained in:
1 parent
48d97ef70d
commit
4449b34ac7
15 files changed
+466
-40
No files matched your search
@@ -0,0 +1,43 @@
|
||||
/**
|
||||
* A refused document read names its reason. Before the capability refusals
|
||||
* had codes of their own, a missing consent, the operator's switch and a
|
||||
* missing provider all fell through to the generic "couldn't read" line, and
|
||||
* the one thing the reader could fix (the consent) was never said.
|
||||
*/
|
||||
import { describe, expect, it } from "vitest";
|
||||
|
||||
import { ApiError } from "@/lib/api/api-fetch";
|
||||
|
||||
import { documentAiErrorKey } from "../use-document-assist";
|
||||
|
||||
const refusal = (errorCode: string, status = 403) =>
|
||||
new ApiError("refused", status, { errorCode });
|
||||
|
||||
describe("documentAiErrorKey", () => {
|
||||
it("maps each capability refusal to its own sentence", () => {
|
||||
expect(documentAiErrorKey(refusal("consent.ai.required"))).toBe(
|
||||
"documents.assist.errorConsent",
|
||||
);
|
||||
expect(documentAiErrorKey(refusal("assistant.disabled.documentAi"))).toBe(
|
||||
"documents.assist.errorUnavailable",
|
||||
);
|
||||
expect(documentAiErrorKey(refusal("assistant.disabled.enabled"))).toBe(
|
||||
"documents.assist.errorUnavailable",
|
||||
);
|
||||
expect(documentAiErrorKey(refusal("ai.record.notPermitted"))).toBe(
|
||||
"documents.assist.errorUnavailable",
|
||||
);
|
||||
expect(documentAiErrorKey(refusal("ai.provider.none", 422))).toBe(
|
||||
"documents.assist.errorProvider",
|
||||
);
|
||||
});
|
||||
|
||||
it("keeps the existing route codes", () => {
|
||||
expect(
|
||||
documentAiErrorKey(refusal("documents.inbound.budgetExceeded", 429)),
|
||||
).toBe("documents.assist.errorBudget");
|
||||
expect(documentAiErrorKey(refusal("something.else", 500))).toBe(
|
||||
"documents.assist.errorGeneric",
|
||||
);
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user