优化 UID 履约闸门、运营可见性与一键兑换

lewan 发货强制 expectedUid 并取消无 UID 旧路径回落;任务详情展示 UID 匹配态;领取页匹配后可一键兑换;补充 identity 单测并收口短链说明。
This commit is contained in:
yml2213
2026-07-10 13:51:02 +08:00
parent dc89188f7a
commit 8de56b0354
13 changed files with 383 additions and 152 deletions
@@ -3,7 +3,9 @@ import test from 'node:test'
import {
appendUidToUrl,
assertLewanAutoFulfillmentUidReady,
assertValidClaimUid,
buildClaimIdentityAdminSummary,
isClaimUidMatched,
normalizeClaimUid,
} from './claim-identity.js'
@@ -38,3 +40,61 @@ test('appendUidToUrl overwrites existing uid', () => {
const next = appendUidToUrl('https://example.com/h5/bind?code=abc&uid=old', 'new-uid')
assert.equal(new URL(next).searchParams.get('uid'), 'new-uid')
})
test('assertLewanAutoFulfillmentUidReady rejects legacy task without uid', () => {
assert.throws(
() =>
assertLewanAutoFulfillmentUidReady({
context_json: JSON.stringify({ kuaishouCloudFulfillment: {} }),
}),
/尚未填写游戏 UID/,
)
})
test('assertLewanAutoFulfillmentUidReady allows mock without uid', () => {
assert.equal(
assertLewanAutoFulfillmentUidReady({
context_json: JSON.stringify({
kuaishouCloudFulfillment: { mock: { enabled: true } },
}),
}),
'',
)
})
test('assertLewanAutoFulfillmentUidReady accepts submitted uid', () => {
assert.equal(
assertLewanAutoFulfillmentUidReady({
context_json: JSON.stringify({
claimIdentity: { expectedUid: '10001', submittedAt: '2026-07-10T00:00:00.000Z' },
kuaishouCloudFulfillment: {},
}),
}),
'10001',
)
})
test('buildClaimIdentityAdminSummary reports match state', () => {
const summary = buildClaimIdentityAdminSummary(
{
claimIdentity: { expectedUid: '10001', submittedAt: 't', source: 'claim_page' },
},
{
flowLike: {
binding: { roleId: '10001', roleName: '测试角色' },
role: { rid: '10001', name: '测试角色' },
},
},
)
assert.equal(summary.ready, true)
assert.equal(summary.uidMatched, true)
assert.equal(summary.compatibilityMode, 'uid')
assert.equal(summary.boundUid, '10001')
})
test('buildClaimIdentityAdminSummary marks legacy without uid', () => {
const summary = buildClaimIdentityAdminSummary({}, { flowLike: { binding: {} } })
assert.equal(summary.ready, false)
assert.equal(summary.compatibilityMode, 'legacy_no_uid')
assert.equal(summary.uidMatched, null)
})