import { mkdtemp, rm } from 'node:fs/promises';
import { tmpdir } from 'node:os';
import { join } from 'node:path';
import { PrivateDocumentStorage } from './private-document.storage';

describe('PrivateDocumentStorage', () => {
  let dir: string;
  let store: PrivateDocumentStorage;

  beforeEach(async () => {
    dir = await mkdtemp(join(tmpdir(), 'dmc-private-'));
    store = new PrivateDocumentStorage(dir);
  });

  afterEach(async () => {
    await rm(dir, { recursive: true, force: true });
  });

  it('writes under doc/ with a generated filename', async () => {
    const name = await store.save('.pdf', Buffer.from('%PDF-1.4 test'));
    expect(name).toMatch(/^\d+-[a-f0-9]+\.pdf$/);
    expect(await store.exists(name)).toBe(true);
    const body = await store.read(name);
    expect(body.toString()).toContain('%PDF-1.4');
  });

  it('rejects video extensions', async () => {
    await expect(store.save('.mp4', Buffer.alloc(16))).rejects.toThrow(/Unsupported file extension/);
  });

  it('rejects traversal filenames on read', async () => {
    await expect(store.read('../etc/passwd')).rejects.toThrow(/Unsafe private document filename/);
    await expect(store.read('..')).rejects.toThrow(/Unsafe private document filename/);
    await expect(store.read('a/b.pdf')).rejects.toThrow(/Unsafe private document filename/);
  });
});
