import { describe, expect, it } from "vitest";
import { validateFileDeclaration, validateStoredFile } from "./file-validation";

describe("file upload validation", () => {
  it("accepts a PNG only when extension, MIME and signature agree", () => {
    const png = Uint8Array.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);
    expect(validateStoredFile("diagram.png", "image/png", png.length, png).category).toBe("image");
    expect(() => validateStoredFile("diagram.png", "image/png", 8, Uint8Array.from([0x50, 0x4b, 3, 4]))).toThrow(/contents/);
  });

  it("rejects extension and MIME mismatches", () => {
    expect(() => validateFileDeclaration("invoice.pdf", "image/png", 1024)).toThrow(/does not match/);
  });

  it("enforces category-specific size limits", () => {
    expect(() => validateFileDeclaration("notes.txt", "text/plain", 11 * 1024 * 1024)).toThrow(/10 MB/);
    expect(validateFileDeclaration("clip.mp4", "video/mp4", 200 * 1024 * 1024).category).toBe("video");
  });

  it("treats audio/webm clips as audio", () => {
    expect(validateFileDeclaration("voice-clip.webm", "audio/webm", 1024).category).toBe("audio");
  });

  it("recognizes ZIP-based Office documents", () => {
    const zip = Uint8Array.from([0x50, 0x4b, 0x03, 0x04]);
    expect(validateStoredFile(
      "proposal.docx",
      "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
      zip.length,
      zip,
    ).category).toBe("document");
  });
});
