From 4ab383709cb6d45dc518135b82e67e5a67538abe Mon Sep 17 00:00:00 2001 From: kl Date: Mon, 9 Mar 2026 11:09:52 +0800 Subject: [PATCH] test: address copilot archive fixture review feedback --- tests/e2e/README.md | 2 +- tests/e2e/fixtures/sample.rar | Bin 18 -> 336 bytes tests/e2e/fixtures/sample.tar | Bin 4096 -> 10240 bytes tests/e2e/fixtures/sample.tgz | Bin 375 -> 154 bytes tests/e2e/scripts/generate-fixtures.mjs | 39 +++++++++++++++++++++--- tests/e2e/specs/preview-smoke.spec.ts | 6 ---- 6 files changed, 36 insertions(+), 11 deletions(-) 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 088dfdb4fed01f74b9078bbda815689865267177..a0e135fcf1d896265481f60ecef58776775ff300 100644 GIT binary patch literal 336 zcmWGaEK-zWXE;Bhn1O+p0RmcrN)#p-F^B+pAk6Hv=)}J5Ww-1^3^*8;G%_%hq!yRx zl~j~8aDYTX7$l-ll3G!skdmKVnwy$e!pk*RA8ZN-&;$@>u68-O?V`^Ouqpo+LQKiY z%*#H&0TK;}hnNB~_v{0pPAgRVlgmN&3&8D9$t;S2x#PeYkSqvebH~CHB@ZST0$l(B z%peM48au;VM~FLsra=rz0UGk`IZ%TcR5{S$AlBT~SAo{^z%``i7L-&1bv2v;$sCQn NWp~83n!$mc0RW=DZ@B;f literal 18 XcmWGaEK)43HcYH7tu_Z@gIX>CKY<33 diff --git a/tests/e2e/fixtures/sample.tar b/tests/e2e/fixtures/sample.tar index 89aabcbfdca2b847c570c6399dd7ad685b59fe5a..6a4c4f6d7ae19b5f5b20c431449d2c9b18b71fd4 100644 GIT binary patch delta 124 zcmZorXb70Zk#1&SW@5r%00HQv0stJ7A%_3} literal 4096 zcmeHI%}&BV5MD@(5zl(?v`j2BNni5FkM z7jpQCkRs@T#u#^!$2(3-&dg##Su!&2qA)Vj9|5eHC_puv23Y9kD7fiv)1@KOE({sVIwjoNhEsNxBHJ5iRI;X7`>XUHJvDkBK{L*+}~RVb51 zd(Y0p`|I0dqEx5rWS}bJl9E>{+)wWw0BNk&KP3tMb8ZQQ<8=g6 z+HmJGW-?(2lXA`u?0n9$aiv^zYKNtA^T>#06otlDaxFOLW#=TI#hZM!7zeE!&*M52 zRa&cx<}{vL_Ifm)E(7VQe%AMQ`X{E9&_A;%)Bpb&gXu+`&au~3O;6op8M@crP~q_> Wf!hG5_gHCPSXKhcZjmCtN9e#cR{_+fl1+qU4IN z&wrG~?7A?u`OxniyC0i470vo~u6ech)c1_ZNi}JoXRTT&d^dyR^^41Qs^uq(FW=N~ zdgr&LYlD`(e9LQh_Wu=woVQcTr{%BH|GhYN^X8wbcNSh{Vn7BzLiugKmWwiIFfafB Dng~bx literal 375 zcmV--0f_z|iwFRAEUsw)1MQVTPr@)1#|w!u;#m)#-Y2MSw{~*iFpLTbMg&6SWSUvx z1jd{b_bt2`FP{7)Ui<=nAv+*S2!aPDG3=MTy!P$A=5^b@#h0$8$_bj`XnpZTT@!YE4!@83E?Y~(6#NgBSKc_6c|Nnwc=h*G4rmG%62F|rRP%!)@psmBJ VZZ0JyB_$;>J^`(95R3p2004H?x#<7^ 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();