task-130(记录与版本中心): 实现软件版本下载链接展示
新增 version-display.ts:公开下载 URL 校验与超长 URL 中段省略展示。 TDD: task-130.test.ts 8 用例 RED→GREEN。
This commit is contained in:
@@ -0,0 +1,16 @@
|
|||||||
|
/** 版本下载链接展示(任务 130):公开下载 URL 校验与超长 URL 中段省略;不写入日志;纯逻辑。 */
|
||||||
|
|
||||||
|
export function isPublicDownloadUrl(value: unknown): boolean {
|
||||||
|
const url = typeof value === 'string' ? value.trim() : ''
|
||||||
|
return /^https?:\/\//i.test(url)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 展示用下载地址:超长时保留首尾并中段省略;非法/空返回空串。 */
|
||||||
|
export function displayDownloadUrl(value: unknown, maxLength = 80): string {
|
||||||
|
const url = typeof value === 'string' ? value.trim() : ''
|
||||||
|
if (!isPublicDownloadUrl(url)) return ''
|
||||||
|
const max = typeof maxLength === 'number' && Number.isFinite(maxLength) && maxLength > 8 ? Math.floor(maxLength) : 80
|
||||||
|
if (url.length <= max) return url
|
||||||
|
const keep = Math.max(4, Math.floor((max - 1) / 2))
|
||||||
|
return `${url.slice(0, keep)}…${url.slice(url.length - keep)}`
|
||||||
|
}
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
import test from 'node:test'
|
||||||
|
import assert from 'node:assert/strict'
|
||||||
|
import { readSource } from './helpers.ts'
|
||||||
|
import { displayDownloadUrl, isPublicDownloadUrl } from '../src/pages/records/version-display.ts'
|
||||||
|
|
||||||
|
test('test_task_130_version_download_normal_primary_path', () => {
|
||||||
|
// 正常主路径:长 URL 显示为省略中段的可读文本。
|
||||||
|
const long = 'https://oss.aishufu.top/nanri-image/versions/package-1.0.46-20260101.zip'
|
||||||
|
const shown = displayDownloadUrl(long, 24)
|
||||||
|
assert.ok(shown.length < long.length)
|
||||||
|
assert.ok(shown.includes('…'))
|
||||||
|
})
|
||||||
|
|
||||||
|
test('test_task_130_version_download_normal_variant_input', () => {
|
||||||
|
// 正常变体:短 URL 原样显示。
|
||||||
|
const url = 'https://oss/a.zip'
|
||||||
|
assert.equal(displayDownloadUrl(url, 64), url)
|
||||||
|
})
|
||||||
|
|
||||||
|
test('test_task_130_version_download_repeated_is_idempotent', () => {
|
||||||
|
// 正常重复:展示稳定。
|
||||||
|
const url = 'https://oss/a.zip'
|
||||||
|
assert.equal(displayDownloadUrl(url, 64), displayDownloadUrl(url, 64))
|
||||||
|
})
|
||||||
|
|
||||||
|
test('test_task_130_version_download_boundary_empty_input', () => {
|
||||||
|
// 边界空值:空/非法地址回空。
|
||||||
|
assert.equal(displayDownloadUrl('', 64), '')
|
||||||
|
assert.equal(isPublicDownloadUrl(''), false)
|
||||||
|
})
|
||||||
|
|
||||||
|
test('test_task_130_version_download_boundary_single_item', () => {
|
||||||
|
// 边界单元素:https 可下载。
|
||||||
|
assert.equal(isPublicDownloadUrl('https://oss/a.zip'), true)
|
||||||
|
})
|
||||||
|
|
||||||
|
test('test_task_130_version_download_boundary_limit_or_missing_field', () => {
|
||||||
|
// 边界上限:非 http 地址不可下载。
|
||||||
|
assert.equal(isPublicDownloadUrl('ftp://x'), false)
|
||||||
|
})
|
||||||
|
|
||||||
|
test('test_task_130_version_download_invalid_input_rejected', () => {
|
||||||
|
// 异常输入:非字符串按空处理。
|
||||||
|
assert.equal(displayDownloadUrl(null as unknown as string, 64), '')
|
||||||
|
})
|
||||||
|
|
||||||
|
test('test_task_130_version_download_dependency_failure_returns_actionable_message', () => {
|
||||||
|
// 依赖失败/可操作:展示纯逻辑、无框架/http;不把完整 URL 写入日志。
|
||||||
|
const mod = readSource('src/pages/records/version-display.ts')
|
||||||
|
assert.equal(/axios|http\.|vue|console\./.test(mod), false, '展示模块保持纯逻辑')
|
||||||
|
assert.match(mod, /displayDownloadUrl/)
|
||||||
|
})
|
||||||
Reference in New Issue
Block a user