131 lines
3.8 KiB
TypeScript
131 lines
3.8 KiB
TypeScript
import assert from 'node:assert/strict'
|
|
import test from 'node:test'
|
|
|
|
import { planFulfillmentTaskForOrderItem } from './planner.js'
|
|
import type { OrderItemRow, OrderRow } from '../../types/repository/rows.js'
|
|
|
|
test('planFulfillmentTaskForOrderItem 为 cloudtentacles 商品生成 cloud 履约计划', async () => {
|
|
const plan = await planFulfillmentTaskForOrderItem({
|
|
order: createOrder(),
|
|
item: createOrderItem({
|
|
sku_code: '荣耀勋章礼包(30个)',
|
|
sku_name: '荣耀勋章礼包(30个)',
|
|
item_snapshot_json: {
|
|
cloudtentacles: {
|
|
matchMode: 'cloudtentacles_name',
|
|
normalizedProductName: '荣耀勋章礼包(30个)',
|
|
cloudSourceKeys: ['account-a'],
|
|
cloudSkuId: 74,
|
|
cloudSkuName: '荣耀勋章礼包(30个)',
|
|
},
|
|
},
|
|
}),
|
|
getProfileByKey: async (profileKey) => ({
|
|
id: 9,
|
|
profile_key: profileKey,
|
|
name: '快手 cloud 履约',
|
|
executor_key: profileKey,
|
|
requires_claim: true,
|
|
auto_dispatch: true,
|
|
}),
|
|
})
|
|
|
|
assert.ok(plan)
|
|
assert.equal(plan.executorKey, 'kuaishou_ct_assisted')
|
|
assert.equal(plan.requiresClaim, false)
|
|
assert.equal(plan.autoDispatch, false)
|
|
assert.equal(plan.context.profileKey, 'kuaishou_ct_assisted')
|
|
assert.equal(
|
|
(plan.context.kuaishouCloudFulfillment as any).binding.resolvedSourceKey,
|
|
'account-a',
|
|
)
|
|
assert.equal((plan.context.kuaishouCloudFulfillment as any).binding.skuId, 74)
|
|
assert.equal(plan.context.kuaishouFeifei, null)
|
|
})
|
|
|
|
test('planFulfillmentTaskForOrderItem 为 feifei 商品生成 feifei 履约计划', async () => {
|
|
const plan = await planFulfillmentTaskForOrderItem({
|
|
order: createOrder(),
|
|
item: createOrderItem({
|
|
sku_code: 'FF-1001',
|
|
sku_name: '测试皮肤',
|
|
item_snapshot_json: {
|
|
kuaishouFeifei: {
|
|
productCode: 'FF-1001',
|
|
skuName: '测试皮肤',
|
|
matchMode: 'kuaishou_feifei_name',
|
|
},
|
|
},
|
|
}),
|
|
getProfileByKey: async (profileKey) => ({
|
|
id: 10,
|
|
profile_key: profileKey,
|
|
name: 'kuaishou-feifei 履约',
|
|
executor_key: profileKey,
|
|
requires_claim: false,
|
|
auto_dispatch: true,
|
|
}),
|
|
})
|
|
|
|
assert.ok(plan)
|
|
assert.equal(plan.executorKey, 'kuaishou_feifei')
|
|
assert.equal(plan.requiresClaim, true)
|
|
assert.equal(plan.autoDispatch, false)
|
|
assert.equal(plan.context.kuaishouCloudFulfillment, null)
|
|
assert.equal((plan.context.kuaishouFeifei as any).productCode, 'FF-1001')
|
|
assert.equal((plan.context.kuaishouFeifei as any).productName, '测试皮肤')
|
|
})
|
|
|
|
test('planFulfillmentTaskForOrderItem 未命中平台配置时返回 null', async () => {
|
|
const plan = await planFulfillmentTaskForOrderItem({
|
|
order: createOrder(),
|
|
item: createOrderItem({
|
|
item_snapshot_json: {
|
|
cloudtentacles: null,
|
|
kuaishouFeifei: null,
|
|
},
|
|
}),
|
|
getProfileByKey: async () => null,
|
|
})
|
|
|
|
assert.equal(plan, null)
|
|
})
|
|
|
|
function createOrder(patch: Partial<OrderRow> = {}): OrderRow {
|
|
return {
|
|
id: 1,
|
|
provider: '91kaquan',
|
|
platform: 'kuaishou',
|
|
shop_id: '91kaquan',
|
|
shop_name: '91卡券',
|
|
platform_order_id: '2614900602069169',
|
|
order_status: 'paid',
|
|
pay_status: 'paid',
|
|
buyer_id: '',
|
|
buyer_name: '',
|
|
receiver_contact: '',
|
|
total_amount: 0,
|
|
currency: 'CNY',
|
|
raw_payload_json: '{}',
|
|
paid_at: '2026-07-08T00:00:00.000Z',
|
|
created_at: '2026-07-08T00:00:00.000Z',
|
|
updated_at: '2026-07-08T00:00:00.000Z',
|
|
...patch,
|
|
}
|
|
}
|
|
|
|
function createOrderItem(patch: Partial<OrderItemRow> = {}): OrderItemRow {
|
|
return {
|
|
id: 10,
|
|
order_id: 1,
|
|
sku_code: 'SKU-1',
|
|
sku_name: '测试商品',
|
|
quantity: 1,
|
|
spec_json: '{}',
|
|
item_snapshot_json: {},
|
|
created_at: '2026-07-08T00:00:00.000Z',
|
|
updated_at: '2026-07-08T00:00:00.000Z',
|
|
...patch,
|
|
}
|
|
}
|