import assert from 'node:assert/strict' import test from 'node:test' import { isClaimPath, resolveClaimToken } from '../src/utils/claim-path.ts' test('isClaimPath:只认路径式 /claim/,容忍结尾斜杠', () => { assert.equal(isClaimPath('/claim/abc123'), true) assert.equal(isClaimPath('/claim/abc123/'), true) assert.equal(isClaimPath('/claim/abc123//'), true) }) test('isClaimPath:/claim、/claim/、多段路径、其它路径都不算', () => { assert.equal(isClaimPath('/claim'), false) assert.equal(isClaimPath('/claim/'), false) assert.equal(isClaimPath('/claim/a/b'), false) assert.equal(isClaimPath('/redeem'), false) assert.equal(isClaimPath('/admin/claim/abc'), false) assert.equal(isClaimPath('/'), false) assert.equal(isClaimPath(''), false) assert.equal(isClaimPath(null), false) assert.equal(isClaimPath(undefined), false) }) test('isClaimPath:打手页是 hash 路由,pathname 为 / 或 hash 串时不命中', () => { // 打手链接形如 https://<域名>/#/claim/:pathname 是 '/',hash 才是路由 assert.equal(isClaimPath('/'), false) assert.equal(isClaimPath('#/claim/abc123'), false) // 路径本身带 token 时,多出来的 hash 片段会被忽略 assert.equal(isClaimPath('/claim/abc123#/claim/other'), true) }) test('resolveClaimToken:取出并解码 token 片段', () => { assert.equal(resolveClaimToken('/claim/abc123'), 'abc123') assert.equal(resolveClaimToken('/claim/abc123/?x=1'), 'abc123') assert.equal(resolveClaimToken('/claim/a%2Fb'), 'a/b') assert.equal(resolveClaimToken('/claim/%E4%B8%AD%E6%96%87'), '中文') // 非法百分号编码退回原始片段,交给后端判定 assert.equal(resolveClaimToken('/claim/100%'), '100%') assert.equal(resolveClaimToken('/redeem'), '') })