153 lines
5.0 KiB
TypeScript
153 lines
5.0 KiB
TypeScript
import test from 'node:test'
|
|
import assert from 'node:assert/strict'
|
|
|
|
import {
|
|
canViewerCloseTask,
|
|
createAdminViewerContext,
|
|
mapKuaishouCloudFulfillmentContext,
|
|
resolveAdminTaskScreenshotUrl,
|
|
resolveOrderItemSkuNick,
|
|
resolveOrderItemTitle,
|
|
} from './admin-read-shared-helpers.js'
|
|
|
|
test('resolveAdminTaskScreenshotUrl lets support view final redeemed screenshot', async () => {
|
|
const task = {
|
|
id: 12,
|
|
screenshot_path: '/tmp/redeemed-12.png',
|
|
runtime_session_id: '',
|
|
}
|
|
|
|
const screenshotUrl = await resolveAdminTaskScreenshotUrl(
|
|
task,
|
|
createAdminViewerContext({ role: 'support' }),
|
|
)
|
|
|
|
assert.equal(screenshotUrl, '/api/v1/admin/tasks/12/screenshot')
|
|
})
|
|
|
|
test('resolveAdminTaskScreenshotUrl falls back to review screenshot when runtime session exists', async () => {
|
|
const task = {
|
|
id: 13,
|
|
screenshot_path: '',
|
|
runtime_session_id: 'runtime-session-13',
|
|
}
|
|
|
|
const screenshotUrl = await resolveAdminTaskScreenshotUrl(
|
|
task,
|
|
createAdminViewerContext({ role: 'support' }),
|
|
)
|
|
|
|
assert.equal(screenshotUrl, '/api/v1/admin/tasks/13/screenshot')
|
|
})
|
|
|
|
test('canViewerCloseTask allows support to close active task but not redeemed task', () => {
|
|
const viewerContext = createAdminViewerContext({ role: 'support' })
|
|
|
|
assert.equal(canViewerCloseTask({ task_status: 'link_generated' }, viewerContext), true)
|
|
assert.equal(canViewerCloseTask({ task_status: 'redeemed' }, viewerContext), false)
|
|
})
|
|
|
|
test('createAdminViewerContext lets support operate vouchers without lifecycle permissions', () => {
|
|
const viewerContext = createAdminViewerContext({ role: 'support' })
|
|
|
|
assert.equal(viewerContext.canOperateKuaishouIndustryVoucher, true)
|
|
assert.equal(viewerContext.canOperateAssistedTask, true)
|
|
assert.equal(viewerContext.canManageTaskLifecycle, false)
|
|
})
|
|
|
|
test('createAdminViewerContext lets support rebind-assisted actions without full lifecycle', () => {
|
|
const support = createAdminViewerContext({ role: 'support' })
|
|
const operator = createAdminViewerContext({ role: 'operator' })
|
|
|
|
// 客服:可协助换绑/刷新角色,不可管理任务生命周期(重试/发货/退号等)
|
|
assert.equal(support.canOperateAssistedTask, true)
|
|
assert.equal(support.canManageTaskLifecycle, false)
|
|
|
|
// 运营:两者皆可
|
|
assert.equal(operator.canOperateAssistedTask, true)
|
|
assert.equal(operator.canManageTaskLifecycle, true)
|
|
})
|
|
|
|
test('mapKuaishouCloudFulfillmentContext exposes cloud account display labels', () => {
|
|
const flow = mapKuaishouCloudFulfillmentContext(
|
|
{
|
|
binding: {
|
|
cloudSourceKeys: [' account_a ', 'account_b'],
|
|
resolvedSourceKey: 'account_b',
|
|
},
|
|
},
|
|
{
|
|
cloudSourceLabelMap: new Map([
|
|
['account_a', '白班账号'],
|
|
['account_b', '夜班账号'],
|
|
]),
|
|
},
|
|
)
|
|
|
|
assert.deepEqual(flow?.binding.cloudSourceKeys, ['account_a', 'account_b'])
|
|
assert.deepEqual(flow?.binding.cloudSourceLabels, ['白班账号', '夜班账号'])
|
|
assert.equal(flow?.binding.resolvedSourceLabel, '夜班账号')
|
|
})
|
|
|
|
test('resolveOrderItemTitle and resolveOrderItemSkuNick with spec_json and snapshot', () => {
|
|
const item = {
|
|
id: 1,
|
|
order_id: 100,
|
|
sku_code: '26079757920762',
|
|
sku_name: '安卓血宴2钻',
|
|
quantity: 1,
|
|
spec_json: JSON.stringify({
|
|
itemTitle: '和平精英地铁逃生装备满钻低价苏尔南怒嚎暗潮手枪璀璨无暇1到7钻',
|
|
skuNick: '安卓血宴2钻',
|
|
}),
|
|
item_snapshot_json: JSON.stringify({
|
|
kuaishouSendCode: {
|
|
itemTitle: '和平精英地铁逃生装备满钻低价苏尔南怒嚎暗潮手枪璀璨无暇1到7钻',
|
|
skuNick: '安卓血宴2钻',
|
|
},
|
|
}),
|
|
}
|
|
|
|
assert.equal(
|
|
resolveOrderItemTitle(item),
|
|
'和平精英地铁逃生装备满钻低价苏尔南怒嚎暗潮手枪璀璨无暇1到7钻',
|
|
)
|
|
assert.equal(resolveOrderItemSkuNick(item), '安卓血宴2钻')
|
|
})
|
|
|
|
test('resolveOrderItemTitle and resolveOrderItemSkuNick fallback to order raw_payload_json with stringified ext', () => {
|
|
const order = {
|
|
id: 100,
|
|
raw_payload_json: {
|
|
source: 'kuaishou_send_code',
|
|
body: {
|
|
itemTitle: '和平精英地铁逃生装备满钻低价苏尔南怒嚎暗潮手枪璀璨无暇1到7钻',
|
|
ext: '{"relItemId":26079757920762,"relSkuId":0,"skuNick":"安卓血宴2钻"}',
|
|
},
|
|
},
|
|
} as any
|
|
|
|
assert.equal(
|
|
resolveOrderItemTitle(null, order),
|
|
'和平精英地铁逃生装备满钻低价苏尔南怒嚎暗潮手枪璀璨无暇1到7钻',
|
|
)
|
|
assert.equal(resolveOrderItemSkuNick(null, order), '安卓血宴2钻')
|
|
})
|
|
|
|
test('resolveOrderItemTitle and resolveOrderItemSkuNick fallback to vouchers when order item and order payload are missing', () => {
|
|
const vouchers = [
|
|
{
|
|
oid: '2625301761098133',
|
|
raw_payload_json: {
|
|
body: {
|
|
itemTitle: '测试商品标题',
|
|
ext: '{"skuNick":"测试SKU规格"}',
|
|
},
|
|
},
|
|
},
|
|
] as any
|
|
|
|
assert.equal(resolveOrderItemTitle(null, null, vouchers), '测试商品标题')
|
|
assert.equal(resolveOrderItemSkuNick(null, null, vouchers), '测试SKU规格')
|
|
})
|