Files
easytier.github.io/tests/releaseUtils.test.ts
T
刚刚andCodex a3858db878 修复下载页面的稳定版、预发布版和 Nightly 通道 (#326)
下载页面目前只有稳定版和预发布版两个通道,并将 GitHub 返回的第一个预发布版本作为普通预发布版。官方新增 Nightly 后,这会误选
`nightly`,并拼出错误的版本标签和下载地址。

此次修改为中英文下载页面补齐稳定版、预发布版、开发版(Nightly)三个通道。普通预发布版明确排除 Nightly
和草稿;下载链接按发布资产中的真实文件名和地址匹配,支持 Nightly 标签与安装包版本号不同的情况。

各通道分别处理接口失败,稳定版和预发布版保留版本回退,Nightly 无法加载或暂无资产时提供官方发布页入口。同步将预发布版回退版本更新为
`2.7.0`。

验证:

- `pnpm docs:build` 构建通过。
- `pnpm exec eslint useLatestVersion.ts releaseUtils.ts metadata.data.ts
tests/releaseUtils.test.ts` 检查通过。
- `node --experimental-strip-types --test tests/releaseUtils.test.ts`:6
项回归测试通过,覆盖通道区分、Nightly 下载地址、GUI 资产版本差异、Android 安装包、缺失资产和接口失败回退。
- 浏览器验证中英文通道切换、操作系统和架构筛选、GitHub 加速前缀及构建后的页面预览。

Co-authored-by: Codex <codex@local>
2026-10-17 12:21:24 +08:00

55 lines
3.0 KiB
TypeScript

import type { Release } from '../releaseUtils.ts'
import assert from 'node:assert/strict'
// eslint-disable-next-line test/no-import-node-test -- Use the built-in runner without adding a test framework.
import { test } from 'node:test'
import { findPrerelease, resolveDownloadUrl } from '../releaseUtils.ts'
const cliTemplate = 'https://github.com/EasyTier/EasyTier/releases/download/v{}/easytier-linux-x86_64-v{}.zip'
const guiTemplate = 'https://github.com/EasyTier/EasyTier/releases/download/v{}/easytier-gui_{}_x64-setup.exe'
function release(tag_name: string, assets: string[] = [], prerelease = true): Release {
return {
tag_name,
prerelease,
assets: assets.map(name => ({ name, browser_download_url: `https://github.com/EasyTier/EasyTier/releases/download/${tag_name}/${name}` })),
}
}
test('ordinary prereleases exclude rolling nightly and draft releases', () => {
const prerelease = release('v2.7.0')
assert.equal(findPrerelease([
release('nightly'),
{ ...release('v2.8.0'), draft: true },
prerelease,
release('v2.6.4', [], false),
]), prerelease)
assert.equal(findPrerelease([release('nightly'), release('v2.6.4', [], false)]), null)
})
test('nightly uses the actual release tag and versioned asset name', () => {
const nightly = release('nightly', ['easytier-linux-x86_64-v2.7.0.zip'])
assert.equal(resolveDownloadUrl(cliTemplate, nightly), 'https://github.com/EasyTier/EasyTier/releases/download/nightly/easytier-linux-x86_64-v2.7.0.zip')
})
test('GUI asset versions can differ from the release version', () => {
const prerelease = release('v2.6.1', ['easytier-gui_2.6.0_x64-setup.exe'])
assert.equal(resolveDownloadUrl(guiTemplate, prerelease), 'https://github.com/EasyTier/EasyTier/releases/download/v2.6.1/easytier-gui_2.6.0_x64-setup.exe')
})
test('Android assets without a version placeholder also resolve', () => {
const nightly = release('nightly', ['app-arm64-release.apk'])
assert.equal(resolveDownloadUrl('https://github.com/EasyTier/EasyTier/releases/download/v{}/app-arm64-release.apk', nightly), 'https://github.com/EasyTier/EasyTier/releases/download/nightly/app-arm64-release.apk')
})
test('missing assets do not produce invented download links', () => {
assert.equal(resolveDownloadUrl(cliTemplate, release('nightly', ['easytier-linux-aarch64-v2.7.0.zip'])), undefined)
assert.equal(resolveDownloadUrl(guiTemplate, release('v2.6.4'), '2.6.4'), undefined)
assert.equal(resolveDownloadUrl(cliTemplate, release('nightly', ['easytier-linux-x86_64-v2.7.0Xzip'])), undefined)
})
test('API failure preserves stable and prerelease fallbacks without guessing nightly assets', () => {
assert.equal(resolveDownloadUrl(cliTemplate, null, '2.6.4'), 'https://github.com/EasyTier/EasyTier/releases/download/v2.6.4/easytier-linux-x86_64-v2.6.4.zip')
assert.equal(resolveDownloadUrl(guiTemplate, null, '2.7.0'), 'https://github.com/EasyTier/EasyTier/releases/download/v2.7.0/easytier-gui_2.7.0_x64-setup.exe')
assert.equal(resolveDownloadUrl(cliTemplate, null), undefined)
})