65 lines
2.1 KiB
TypeScript
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",
|
|
})
|
|
);
|
|
});
|
|
});
|