@@ -33,6 +33,10 @@ const app = (
|
||||
indexedDb: true,
|
||||
crossOriginIsolated: false,
|
||||
},
|
||||
capabilities: {
|
||||
required: ["workers"],
|
||||
optional: [],
|
||||
},
|
||||
privacy: {
|
||||
processing: "local",
|
||||
fileUploads: false,
|
||||
@@ -117,6 +121,86 @@ describe("v1 runtime parsing", () => {
|
||||
).toThrow(/absolute HTTP\(S\) URL/u);
|
||||
});
|
||||
|
||||
it("normalizes declared formats and capability profiles", () => {
|
||||
const parsed = parseToolboxApp(
|
||||
app({
|
||||
io: {
|
||||
accepts: [
|
||||
{
|
||||
mediaType: "Application/PDF",
|
||||
extensions: [".PDF"],
|
||||
label: "PDF",
|
||||
},
|
||||
],
|
||||
produces: [{ mediaType: "image/*", extensions: [".png"] }],
|
||||
},
|
||||
capabilities: {
|
||||
required: ["workers"],
|
||||
optional: ["file-system-access"],
|
||||
},
|
||||
}),
|
||||
);
|
||||
expect(parsed.io?.accepts[0]).toEqual({
|
||||
mediaType: "application/pdf",
|
||||
extensions: [".pdf"],
|
||||
label: "PDF",
|
||||
});
|
||||
expect(parsed.capabilities).toEqual({
|
||||
required: ["workers"],
|
||||
optional: ["file-system-access"],
|
||||
});
|
||||
});
|
||||
|
||||
it("rejects malformed formats and duplicate capabilities", () => {
|
||||
expect(() =>
|
||||
parseToolboxApp(
|
||||
app({
|
||||
io: {
|
||||
accepts: [{ mediaType: "pdf", extensions: ["pdf"] }],
|
||||
produces: [],
|
||||
},
|
||||
}),
|
||||
),
|
||||
).toThrow(/mediaType|start with a dot/u);
|
||||
expect(() =>
|
||||
parseToolboxApp(
|
||||
app({
|
||||
capabilities: { required: ["workers"], optional: ["workers"] },
|
||||
}),
|
||||
),
|
||||
).toThrow(/already required/u);
|
||||
});
|
||||
|
||||
it("keeps worker requirements and required capabilities consistent", () => {
|
||||
const legacyManifest = app();
|
||||
delete legacyManifest.capabilities;
|
||||
expect(parseToolboxApp(legacyManifest).requirements.workers).toBe(true);
|
||||
|
||||
expect(() =>
|
||||
parseToolboxApp(
|
||||
app({
|
||||
capabilities: { required: [], optional: ["workers"] },
|
||||
}),
|
||||
),
|
||||
).toThrow(/required must include workers.*requirements\.workers is true/u);
|
||||
|
||||
expect(() =>
|
||||
parseToolboxApp(
|
||||
app({
|
||||
requirements: {
|
||||
secureContext: true,
|
||||
workers: false,
|
||||
indexedDb: true,
|
||||
crossOriginIsolated: false,
|
||||
},
|
||||
capabilities: { required: ["workers"], optional: [] },
|
||||
}),
|
||||
),
|
||||
).toThrow(
|
||||
/required must not include workers.*requirements\.workers is false/u,
|
||||
);
|
||||
});
|
||||
|
||||
it("parses manifest references and external inline catalog entries", () => {
|
||||
const parsed = parseToolboxCatalog(
|
||||
catalog({
|
||||
|
||||
Reference in New Issue
Block a user