import { sniffUpload, isAllowedUploadExtension } from './file-sniff';

function padded(header: Buffer, total = 16): Buffer {
  const out = Buffer.alloc(total);
  header.copy(out);
  return out;
}

describe('sniffUpload', () => {
  it('accepts JPEG / PNG / GIF / WEBP / ICO / PDF', () => {
    expect(sniffUpload(padded(Buffer.from([0xff, 0xd8, 0xff, 0xe0])))?.ext).toBe('.jpg');
    expect(sniffUpload(padded(Buffer.from([0x89, 0x50, 0x4e, 0x47])))?.ext).toBe('.png');
    expect(sniffUpload(padded(Buffer.from('GIF89a')))?.ext).toBe('.gif');
    expect(
      sniffUpload(Buffer.concat([Buffer.from('RIFF'), Buffer.alloc(4), Buffer.from('WEBP')]))?.ext,
    ).toBe('.webp');
    expect(sniffUpload(padded(Buffer.from([0x00, 0x00, 0x01, 0x00])))?.ext).toBe('.ico');
    expect(sniffUpload(padded(Buffer.from('%PDF-1.4')))?.kind).toBe('pdf');
  });

  it('accepts MP4 / MOV / WEBM / AVI', () => {
    const mp4 = Buffer.alloc(16);
    mp4.write('ftyp', 4, 'ascii');
    mp4.write('isom', 8, 'ascii');
    expect(sniffUpload(mp4)?.ext).toBe('.mp4');

    const mov = Buffer.alloc(16);
    mov.write('ftyp', 4, 'ascii');
    mov.write('qt  ', 8, 'ascii');
    expect(sniffUpload(mov)?.ext).toBe('.mov');

    expect(sniffUpload(padded(Buffer.from([0x1a, 0x45, 0xdf, 0xa3])))?.ext).toBe('.webm');
    expect(
      sniffUpload(Buffer.concat([Buffer.from('RIFF'), Buffer.alloc(4), Buffer.from('AVI ')]))?.ext,
    ).toBe('.avi');
  });

  it('rejects SVG, HTML, empty, and short buffers', () => {
    expect(sniffUpload(Buffer.from('<svg xmlns="http://www.w3.org/2000/svg"></svg>'))).toBeNull();
    expect(sniffUpload(Buffer.from('<!doctype html><html></html>'))).toBeNull();
    expect(sniffUpload(Buffer.alloc(0))).toBeNull();
    expect(sniffUpload(Buffer.from('%PD'))).toBeNull();
  });

  it('whitelists upload extensions and excludes svg', () => {
    expect(isAllowedUploadExtension('.pdf')).toBe(true);
    expect(isAllowedUploadExtension('.PNG')).toBe(true);
    expect(isAllowedUploadExtension('.svg')).toBe(false);
    expect(isAllowedUploadExtension('.html')).toBe(false);
  });
});
