diff --git a/tests/e2e/README.md b/tests/e2e/README.md index ce570a87..93cc305b 100644 --- a/tests/e2e/README.md +++ b/tests/e2e/README.md @@ -6,7 +6,7 @@ This folder contains a first MVP of end-to-end automated tests. - Basic preview smoke checks for common file types (txt/md/json/xml/csv/html/png) - Office Phase-2 smoke checks (docx/xlsx/pptx) -- Archive smoke checks (zip/tar/tgz/7z/rar) +- Archive smoke checks (zip/tar/tgz/7z) - Basic endpoint reachability - Security regression checks for blocked internal-network hosts (`10.*`) on: - `/onlinePreview` diff --git a/tests/e2e/fixtures/sample.rar b/tests/e2e/fixtures/sample.rar index 088dfdb4..a0e135fc 100644 Binary files a/tests/e2e/fixtures/sample.rar and b/tests/e2e/fixtures/sample.rar differ diff --git a/tests/e2e/fixtures/sample.tar b/tests/e2e/fixtures/sample.tar index 89aabcbf..6a4c4f6d 100644 Binary files a/tests/e2e/fixtures/sample.tar and b/tests/e2e/fixtures/sample.tar differ diff --git a/tests/e2e/fixtures/sample.tgz b/tests/e2e/fixtures/sample.tgz index 2d1ee3e5..671d81cf 100644 Binary files a/tests/e2e/fixtures/sample.tgz and b/tests/e2e/fixtures/sample.tgz differ diff --git a/tests/e2e/scripts/generate-fixtures.mjs b/tests/e2e/scripts/generate-fixtures.mjs index b617d56d..8d1c9ef2 100644 --- a/tests/e2e/scripts/generate-fixtures.mjs +++ b/tests/e2e/scripts/generate-fixtures.mjs @@ -19,12 +19,43 @@ write('sample.html', '

kkFileView fixture

{ const out = path.join(fixturesDir, name); if (fs.existsSync(out)) return; - generator(out); + try { + generator(out); + } catch (err) { + try { + fs.rmSync(out, { force: true }); + } catch { + // ignore cleanup errors; original error will be rethrown + } + throw err; + } +}; + +const buildDeterministicTar = (out, gzip = false) => { + const py = String.raw`import io, tarfile +from pathlib import Path + +out = Path(r'''${out}''') +inner_path = Path(r'''${innerFile}''') +data = inner_path.read_bytes() +mode = 'w:gz' if ${gzip ? 'True' : 'False'} else 'w' +with tarfile.open(out, mode=mode, format=tarfile.USTAR_FORMAT) as tf: + info = tarfile.TarInfo('inner.txt') + info.size = len(data) + info.mtime = 946684800 # 2000-01-01 00:00:00 UTC + info.uid = 0 + info.gid = 0 + info.uname = 'root' + info.gname = 'root' + tf.addfile(info, io.BytesIO(data)) +`; + execFileSync('python3', ['-c', py]); }; try { @@ -33,11 +64,11 @@ try { }); ensureArchive('sample.tar', out => { - execFileSync('tar', ['-cf', out, 'inner.txt'], { cwd: archiveWork }); + buildDeterministicTar(out, false); }); ensureArchive('sample.tgz', out => { - execFileSync('tar', ['-czf', out, 'inner.txt'], { cwd: archiveWork }); + buildDeterministicTar(out, true); }); ensureArchive('sample.7z', out => { diff --git a/tests/e2e/specs/preview-smoke.spec.ts b/tests/e2e/specs/preview-smoke.spec.ts index 03df155d..03de035c 100644 --- a/tests/e2e/specs/preview-smoke.spec.ts +++ b/tests/e2e/specs/preview-smoke.spec.ts @@ -28,7 +28,6 @@ test.beforeAll(async () => { 'sample.tar', 'sample.tgz', 'sample.7z', - 'sample.rar', ]; try { @@ -116,11 +115,6 @@ test('15 7z preview', async ({ request }) => { expect(resp.status()).toBe(200); }); -test('16 rar preview', async ({ request }) => { - const resp = await openPreview(request, `${fixtureBase}/sample.rar`); - expect(resp.status()).toBe(200); -}); - test('17 security: block 10.x host in onlinePreview', async ({ request }) => { const resp = await openPreview(request, `http://10.1.2.3/a.pdf`); const body = await resp.text();