Files
HiveGrid-Wireframes/03 Quellen und Referenzen/hivegrid-cloud/apps/web/app/utils/integrations/fileService.chunk-integrity.test.ts
T

65 lines
2.1 KiB
TypeScript

import { describe, expect, it } from "vitest";
import { FILE_UPLOAD_CHUNK_SIZE_BYTES } from "@hivegrid/view-models";
import { assertUploadChunkManifest, expectedUploadChunkSize, FileServiceError } from "./fileService.server";
describe("chunked file upload integrity", () => {
it("requires full-sized intermediate chunks and the exact final remainder", () => {
const totalSizeBytes = FILE_UPLOAD_CHUNK_SIZE_BYTES * 2 + 17;
expect(expectedUploadChunkSize({ totalSizeBytes, totalChunks: 3, chunkIndex: 0 })).toBe(FILE_UPLOAD_CHUNK_SIZE_BYTES);
expect(expectedUploadChunkSize({ totalSizeBytes, totalChunks: 3, chunkIndex: 1 })).toBe(FILE_UPLOAD_CHUNK_SIZE_BYTES);
expect(expectedUploadChunkSize({ totalSizeBytes, totalChunks: 3, chunkIndex: 2 })).toBe(17);
});
it("accepts only a contiguous manifest whose byte sum matches the session", () => {
const totalSizeBytes = FILE_UPLOAD_CHUNK_SIZE_BYTES + 7;
expect(() =>
assertUploadChunkManifest({
totalSizeBytes,
totalChunks: 2,
chunks: [
{ chunkIndex: 0, sizeBytes: FILE_UPLOAD_CHUNK_SIZE_BYTES },
{ chunkIndex: 1, sizeBytes: 7 },
],
})
).not.toThrow();
});
it.each([
{
name: "under-declared first chunk",
chunks: [
{ chunkIndex: 0, sizeBytes: FILE_UPLOAD_CHUNK_SIZE_BYTES - 1 },
{ chunkIndex: 1, sizeBytes: 7 },
],
},
{
name: "wrong final remainder",
chunks: [
{ chunkIndex: 0, sizeBytes: FILE_UPLOAD_CHUNK_SIZE_BYTES },
{ chunkIndex: 1, sizeBytes: 8 },
],
},
{
name: "non-contiguous index",
chunks: [
{ chunkIndex: 0, sizeBytes: FILE_UPLOAD_CHUNK_SIZE_BYTES },
{ chunkIndex: 2, sizeBytes: 7 },
],
},
])("rejects $name", ({ chunks }) => {
expect(() =>
assertUploadChunkManifest({
totalSizeBytes: FILE_UPLOAD_CHUNK_SIZE_BYTES + 7,
totalChunks: 2,
chunks,
})
).toThrow(
expect.objectContaining<FileServiceError>({
messageKey: "files.error.uploadIncomplete",
})
);
});
});