74 lines
3.8 KiB
JavaScript
74 lines
3.8 KiB
JavaScript
"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 });
|
|
});
|