From 6b8f85f8d605bffad8e8abe1815dab9d17b89b91 Mon Sep 17 00:00:00 2001 From: smail Date: Sun, 18 Oct 2026 02:53:28 +0800 Subject: [PATCH] =?UTF-8?q?fix(test):=20=E4=BF=AE=E5=A4=8DCI=E4=B8=ADzip?= =?UTF-8?q?=E5=BD=92=E6=A1=A3=E8=B7=A8=E5=B9=B3=E5=8F=B0=E8=A7=A3=E5=8E=8B?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E5=85=BC=E5=AE=B9=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/frontend/package-release.test.mjs | 28 ++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/test/frontend/package-release.test.mjs b/test/frontend/package-release.test.mjs index 817d28f1..03fd48f8 100644 --- a/test/frontend/package-release.test.mjs +++ b/test/frontend/package-release.test.mjs @@ -10,6 +10,25 @@ import { packagePlan, packageRelease } from '../../deploy/package.mjs' const execute = promisify(execFile) +async function listArchiveEntries(archivePath) { + const isZip = archivePath.endsWith('.zip') + if (isZip && process.platform !== 'win32') { + const { stdout } = await execute('unzip', ['-Z1', archivePath], { windowsHide: true }) + return stdout.trim().split(/\r?\n/).map(line => line.trim()).filter(Boolean) + } + const { stdout } = await execute('tar', ['-tf', archivePath], { windowsHide: true }) + return stdout.trim().split(/\r?\n/).map(line => line.trim()).filter(Boolean) +} + +async function extractArchive(archivePath, destination) { + const isZip = archivePath.endsWith('.zip') + if (isZip && process.platform !== 'win32') { + await execute('unzip', ['-q', archivePath, '-d', destination], { windowsHide: true }) + return + } + await execute('tar', ['-xf', archivePath, '-C', destination], { windowsHide: true }) +} + async function fixture(selectedTargets) { const directory = path.join(root, 'test-log', 'package-tests') await mkdir(directory, { recursive: true }) @@ -30,13 +49,13 @@ test('六个平台发布包只包含三个程序和四个空目录,解压后 const extension = release.target.startsWith('windows_') ? '.exe' : '' const programs = ['smail', 'smail-admin', 'smail-config'].map(name => name + extension) const directories = ['config', 'data', 'log', 'ssl'] - const { stdout } = await execute('tar', ['-tf', release.archive], { windowsHide: true }) - assert.deepEqual(stdout.trim().split(/\r?\n/).sort(), [ + const entries = await listArchiveEntries(release.archive) + assert.deepEqual(entries.sort(), [ 'smail/', ...programs.map(name => `smail/${name}`), ...directories.map(name => `smail/${name}/`) ].sort()) const extracted = path.join(workspace, 'extracted', release.target) await mkdir(extracted, { recursive: true }) - await execute('tar', ['-xf', release.archive, '-C', extracted], { windowsHide: true }) + await extractArchive(release.archive, extracted) const receipt = JSON.parse(await readFile(release.receipt, 'utf8')) assert.equal(receipt.files.length, 3) assert.equal(receipt.archive.name, path.basename(release.archive)) @@ -70,7 +89,8 @@ test('重复打包保留旧数据但不会将其带入新发布包', async () => await writeFile(database, 'private fixture') await writeFile(path.join(previous.directory, 'smail', 'release.json'), 'old metadata') await packageRelease([target], { workspace }) - const { stdout } = await execute('tar', ['-tf', previous.archive], { windowsHide: true }) + const entries = await listArchiveEntries(previous.archive) + const stdout = entries.join('\n') assert.doesNotMatch(stdout, /private\.db|release\.json/) const historyRoot = path.join(workspace, 'out', 'build-history') const history = await readdir(historyRoot)