Files

79 lines
2.8 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { test } from 'node:test'
import assert from 'node:assert/strict'
import { getJavaDownloadUrl } from '../src/shared/api/download-url.ts'
/** task-215:下载 URL 格式契约(公开直链、绝对 schema、origin 补齐、user_id 附加、query 拼接)。 */
function setup(uid = '42', origin = 'http://localhost:5173') {
;(globalThis as Record<string, unknown>).window = {
localStorage: { getItem: (k: string) => (k === 'uid' ? uid : null) },
location: { origin },
}
}
test('绝对 https 直链被保留并追加 user_id', () => {
setup()
const url = getJavaDownloadUrl('https://api.example.com/result/a.xlsx')
assert.ok(url.startsWith('https://api.example.com/result/a.xlsx'), url)
assert.ok(url.includes('?user_id=42'), url)
})
test('相对路径在 window 环境补齐 originschema 完整)', () => {
setup()
const url = getJavaDownloadUrl('/newApi/download/x')
assert.ok(url.startsWith('http://localhost:5173'), url)
assert.ok(url.includes('user_id=42'), url)
})
test('绝对 http 直链不被 origin 包裹', () => {
setup()
const url = getJavaDownloadUrl('http://cdn.example.com/result/b.xlsx')
assert.ok(url.startsWith('http://cdn.example.com/result/b.xlsx'), url)
assert.ok(!url.startsWith('http://localhost:5173'), url)
})
test('已带 query 的 URL 用 & 拼接 user_id', () => {
setup()
const url = getJavaDownloadUrl('https://api.example.com/result/c.xlsx?k=1')
assert.ok(url.includes('k=1&user_id=42'), url)
assert.ok(!/\?user_id=42/.test(url), '不应出现第二个 ?')
})
test('user_id 为当前 uid 且 URL 编码可解析', () => {
setup('42')
const url = getJavaDownloadUrl('https://api.example.com/result/d.xlsx')
const params = new URL(url).searchParams
assert.equal(params.get('user_id'), '42')
})
test('相对产物 query 仅含 user_id(无签名/多余参数)', () => {
setup('42')
const url = getJavaDownloadUrl('/api/result/e.xlsx')
const params = new URL(url).searchParams
const keys = [...params.keys()]
assert.deepEqual(keys, ['user_id'], url)
assert.ok(!url.includes('X-Amz-Signature'), '不应出现签名参数')
})
test('不含重复问号', () => {
setup()
const url = getJavaDownloadUrl('https://api.example.com/result/e.xlsx')
const questionMarks = (url.match(/\?/g) ?? []).length
assert.equal(questionMarks, 1, url)
})
test('返回 URL 始终带 schemasave_file 兼容)', () => {
setup()
for (const p of ['/a', 'relative', '/newApi/result/f.xlsx']) {
const url = getJavaDownloadUrl(p)
assert.ok(url.startsWith('http://') || url.startsWith('https://'), `${p} -> ${url}`)
}
})
test('结果稳定可复现', () => {
setup()
const a = getJavaDownloadUrl('https://api.example.com/result/g.xlsx')
const b = getJavaDownloadUrl('https://api.example.com/result/g.xlsx')
assert.equal(a, b)
})