"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const path_1 = __importDefault(require("path")); const os_1 = __importDefault(require("os")); const fs_1 = require("fs"); const vitest_1 = require("vitest"); vitest_1.vi.mock('../../src/services/archiveReader', () => ({ listArchiveEntries: vitest_1.vi.fn() })); const fsScanner_1 = __importDefault(require("../../src/services/fsScanner")); const archiveReader_1 = require("../../src/services/archiveReader"); (0, vitest_1.afterEach)(() => { vitest_1.vi.restoreAllMocks(); }); (0, vitest_1.it)('expone entradas internas de archivos como items virtuales', async () => { const tmpDir = await fs_1.promises.mkdtemp(path_1.default.join(os_1.default.tmpdir(), 'fsScanner-test-')); const collectionFile = path_1.default.join(tmpDir, 'collection.zip'); await fs_1.promises.writeFile(collectionFile, ''); archiveReader_1.listArchiveEntries.mockResolvedValue([ { name: 'inner/rom1.bin', size: 1234 }, ]); const results = await (0, fsScanner_1.default)(tmpDir); const expectedPath = `${collectionFile}::inner/rom1.bin`; const found = results.find((r) => r.path === expectedPath); (0, vitest_1.expect)(found).toBeDefined(); if (found) { (0, vitest_1.expect)(found.isArchiveEntry).toBe(true); (0, vitest_1.expect)(found.containerPath).toBe(collectionFile); (0, vitest_1.expect)(found.entryPath).toBe('inner/rom1.bin'); (0, vitest_1.expect)(found.filename).toBe('rom1.bin'); (0, vitest_1.expect)(found.format).toBe('bin'); } await fs_1.promises.rm(tmpDir, { recursive: true, force: true }); }); (0, vitest_1.it)('ignora entradas con traversal o paths absolutos', async () => { const tmpDir = await fs_1.promises.mkdtemp(path_1.default.join(os_1.default.tmpdir(), 'fsScanner-test-')); const collectionFile = path_1.default.join(tmpDir, 'collection.zip'); await fs_1.promises.writeFile(collectionFile, ''); archiveReader_1.listArchiveEntries.mockResolvedValue([ { name: '../evil.rom', size: 10 }, { name: '/abs/evil.rom', size: 20 }, { name: 'good/rom.bin', size: 30 }, ]); const results = await (0, fsScanner_1.default)(tmpDir); const safePath = `${collectionFile}::good/rom.bin`; (0, vitest_1.expect)(results.find((r) => r.path === safePath)).toBeDefined(); (0, vitest_1.expect)(results.find((r) => r.path === `${collectionFile}::../evil.rom`)).toBeUndefined(); (0, vitest_1.expect)(results.find((r) => r.path === `${collectionFile}::/abs/evil.rom`)).toBeUndefined(); await fs_1.promises.rm(tmpDir, { recursive: true, force: true }); }); (0, vitest_1.it)('respeta ARCHIVE_MAX_ENTRIES', async () => { const tmpDir = await fs_1.promises.mkdtemp(path_1.default.join(os_1.default.tmpdir(), 'fsScanner-test-')); const collectionFile = path_1.default.join(tmpDir, 'collection.zip'); await fs_1.promises.writeFile(collectionFile, ''); // Set env var temporarily const prev = process.env.ARCHIVE_MAX_ENTRIES; process.env.ARCHIVE_MAX_ENTRIES = '1'; archiveReader_1.listArchiveEntries.mockResolvedValue([ { name: 'one.bin', size: 1 }, { name: 'two.bin', size: 2 }, { name: 'three.bin', size: 3 }, ]); const results = await (0, fsScanner_1.default)(tmpDir); const matches = results.filter((r) => String(r.path).startsWith(collectionFile + '::')); (0, vitest_1.expect)(matches.length).toBe(1); // restore if (prev === undefined) delete process.env.ARCHIVE_MAX_ENTRIES; else process.env.ARCHIVE_MAX_ENTRIES = prev; await fs_1.promises.rm(tmpDir, { recursive: true, force: true }); });