← Files Biological Sequence & Alignment ViewerARCHIVED FILE
src/workspace-export-authorization.test.ts
3.77 KB · Sep 30, 2026 · 23:01 UTC
import { randomUUID } from "node:crypto";
import { describe, expect, it } from "vitest";
import { SequenceWorkspaceExportAuthorizationStore } from "./workspace-export-authorization";
import { sequencePrepareWorkspaceExportInputSchema } from "./workbench-persistence-protocol";
describe("SequenceWorkspaceExportAuthorizationStore", () => {
it("binds UI preflight to the exact session, source binding, destination, and declaration", () => {
const store = new SequenceWorkspaceExportAuthorizationStore();
const input = request();
const bindingId = randomUUID();
const commandId = store.create(input, bindingId);
const callerId = randomUUID();
const uploadId = randomUUID();
const declaration = {
...input,
callerId,
commandId,
kind: "artifact" as const,
uploadId,
};
expect(store.assertDeclaration(declaration)).toBe(bindingId);
expect(
store.assertIdentity({ callerId, commandId, sessionId: input.sessionId, uploadId }),
).toBe(bindingId);
for (const changed of [
{ sha256: "b".repeat(64) },
{ name: "retargeted.fasta" },
{
destination: {
...input.destination,
relativePath: "exports/retargeted.fasta",
},
},
{ format: "json" as const },
]) {
expect(() =>
store.assertDeclaration({ ...declaration, ...changed }),
).toThrow("does not match");
}
expect(() =>
store.assertIdentity({ callerId, commandId, sessionId: randomUUID(), uploadId }),
).toThrow("another viewer session");
expect(() =>
store.assertIdentity({
callerId,
commandId,
sessionId: input.sessionId,
uploadId: randomUUID(),
}),
).toThrow("another upload");
});
it("consumes terminal authorizations without breaking exact response retries", () => {
const store = new SequenceWorkspaceExportAuthorizationStore();
const input = request();
const commandId = store.create(input, randomUUID());
const declaration = {
...input,
callerId: randomUUID(),
commandId,
kind: "artifact" as const,
uploadId: randomUUID(),
};
store.assertDeclaration(declaration);
expect(store.consumeIfPresent(declaration)).toBe(true);
expect(store.assertDeclaration(declaration)).toBeTypeOf("string");
expect(store.consumeIfPresent(declaration)).toBe(true);
for (let index = 0; index < 65; index += 1) {
const requestInput = request();
const nextCommandId = store.create(requestInput, randomUUID());
const identity = {
...requestInput,
callerId: randomUUID(),
commandId: nextCommandId,
kind: "artifact" as const,
uploadId: randomUUID(),
};
store.assertDeclaration(identity);
expect(store.consumeIfPresent(identity)).toBe(true);
}
});
it("expires unused authorizations", () => {
let now = 100;
const store = new SequenceWorkspaceExportAuthorizationStore(() => now);
const input = request();
const commandId = store.create(input, randomUUID());
const identity = {
callerId: randomUUID(),
commandId,
sessionId: input.sessionId,
uploadId: randomUUID(),
};
now += 5 * 60 * 1_000 + 1;
expect(() => store.assertIdentity(identity)).toThrow("expired");
});
});
function request() {
return sequencePrepareWorkspaceExportInputSchema.parse({
byteLength: 10,
destination: {
base: "opened-source",
kind: "workspace",
relativePath: "exports/derived.fasta",
},
format: "fasta",
mediaType: "text/x-fasta",
name: "derived.fasta",
provenance: {
engine: "sequence-viewer-browser-export-v1",
parameters: { scope: "all" },
sourceRevision: 0,
},
sessionId: randomUUID(),
sha256: "a".repeat(64),
});
}
SHA-256: 81fd5df51f923832d3358e7ee225db87d037e0f146bf3782b5af82b74dc3d6ac