- Añade `scanDirectory` support para listar entradas internas de ZIP/7z - Añade test unitario que mockea `archiveReader.listArchiveEntries` - Añade límite configurable `ARCHIVE_MAX_ENTRIES` y comprobación básica de seguridad
36 lines
1.2 KiB
TypeScript
36 lines
1.2 KiB
TypeScript
import path from 'path';
|
|
import os from 'os';
|
|
import { promises as fs } from 'fs';
|
|
import { afterEach, it, expect, vi } from 'vitest';
|
|
|
|
vi.mock('../../src/services/archiveReader', () => ({ listArchiveEntries: vi.fn() }));
|
|
|
|
import scanDirectory from '../../src/services/fsScanner';
|
|
import { listArchiveEntries } from '../../src/services/archiveReader';
|
|
|
|
afterEach(() => vi.restoreAllMocks());
|
|
|
|
it('expone entradas internas de archivos como items virtuales', async () => {
|
|
const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'fsScanner-test-'));
|
|
const collectionFile = path.join(tmpDir, 'collection.zip');
|
|
await fs.writeFile(collectionFile, '');
|
|
|
|
(listArchiveEntries as unknown as vi.Mock).mockResolvedValue([
|
|
{ name: 'inner/rom1.bin', size: 1234 },
|
|
]);
|
|
|
|
const results = await scanDirectory(tmpDir);
|
|
|
|
const expectedPath = `${collectionFile}::inner/rom1.bin`;
|
|
const found = results.find((r: any) => r.path === expectedPath);
|
|
|
|
expect(found).toBeDefined();
|
|
expect(found.isArchiveEntry).toBe(true);
|
|
expect(found.containerPath).toBe(collectionFile);
|
|
expect(found.entryPath).toBe('inner/rom1.bin');
|
|
expect(found.filename).toBe('rom1.bin');
|
|
expect(found.format).toBe('bin');
|
|
|
|
await fs.rm(tmpDir, { recursive: true, force: true });
|
|
});
|