Files
order_site/apps/frontend/tests/claim-path.test.ts
T
yml2213 1339c6887e refactor(claim): 删除自建皮肤领取页,路径式 /claim/<token> 复用现成领取页 + 物品图片
**删掉上一轮自建的领取页**
- `pages/claim-skin/*`、`services/claim-skin.ts`、`types/claim-skin.ts`、`tests/claim-skin.test.ts`
  及其样式(client.css 里 `.claim-skin-*` 整段 254 行)
- 后台我加的展示项:「皮肤自动发货」筛选项、执行器标签、「买家提交信息」卡片

**路径式链接复用现成领取页**
- `utils/claim-path.ts`(中性命名 `isClaimPath` / `resolveClaimToken`)+ 单测
- `App.tsx`:pathname 命中 `/claim/<token>` → 独立 BrowserRouter 渲染**现成的 `ClaimPage`**
  (页面零复制零改动:它只用 `useParams`,不读 hash);`#/claim/:token` 仍走主站 HashRouter,
  两者互不影响,且有用例断言 hash 入口不命中路径判定

**物品图片**
- 后端领取详情的 `product.imageUrl` 接上(内部 SKU 在 `spec_json.code` / `sku_code` /
  `sku_name` 哪个字段都能回退找到图,映射不到返回空串)
- 领取页新增 `ClaimProductImage`:居中大图(宽度 min(220px,62%)、圆角 16px),
  空值或加载失败都降级虚线占位块,不出现破图

`npm run check`:前端 128 / 128 全绿(去掉旧用例 17 个、新增路径与图片用例)
2026-10-09 16:13:46 +08:00

41 lines
1.8 KiB
TypeScript
Raw 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 assert from 'node:assert/strict'
import test from 'node:test'
import { isClaimPath, resolveClaimToken } from '../src/utils/claim-path.ts'
test('isClaimPath:只认路径式 /claim/<token>,容忍结尾斜杠', () => {
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/<token>: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'), '')
})