Files
order_site/apps/backend/src/services/fulfillment/kuaishou-feifei/index.test.ts
T

161 lines
3.9 KiB
TypeScript

import test from 'node:test'
import assert from 'node:assert/strict'
import {
buildFeifeiPlatformOrderNo,
resolveKuaishouFeifeiClaimUrl,
resolveKuaishouFeifeiH5UrlWithUid,
resolveKuaishouFeifeiPlatformAmount,
} from './index.js'
import type { TaskRow } from '../../../types/repository/rows.js'
test('resolveKuaishouFeifeiClaimUrl prefers feifei h5 url over local claim url', () => {
assert.equal(
resolveKuaishouFeifeiClaimUrl({
claimUrl: 'https://ks.khhao.com/#/claim/local-token',
h5: {
entryUrl: 'https://feifei.example.com/h5/exchange',
rechargeUrl: 'https://feifei.example.com/h5/bind?code=abc',
},
}),
'https://feifei.example.com/h5/bind?code=abc',
)
})
test('resolveKuaishouFeifeiClaimUrl does not expose local claim token fallback', () => {
assert.equal(
resolveKuaishouFeifeiClaimUrl({
claimUrl: 'local-token',
h5: {},
}),
'',
)
})
test('resolveKuaishouFeifeiClaimUrl prefers direct h5 over historical short link url', () => {
assert.equal(
resolveKuaishouFeifeiClaimUrl({
shortLink: {
code: 'AbCd1234',
url: 'https://ks.khhao.com/s/AbCd1234',
targetUrl: 'https://feifei.example.com/h5/bind?code=very-long',
},
h5: {
rechargeUrl: 'https://feifei.example.com/h5/bind?code=very-long',
},
}),
'https://feifei.example.com/h5/bind?code=very-long',
)
})
test('resolveKuaishouFeifeiH5UrlWithUid appends uid query', () => {
const next = resolveKuaishouFeifeiH5UrlWithUid(
{
h5: {
rechargeUrl: 'http://skin-exchange.yiquyou.icu/h5/bind?code=eyJpdi&product_name=demo',
},
},
'166909256',
)
const url = new URL(next)
assert.equal(url.searchParams.get('uid'), '166909256')
assert.equal(url.searchParams.get('code'), 'eyJpdi')
})
test('buildFeifeiPlatformOrderNo prefers source order number', () => {
assert.equal(
buildFeifeiPlatformOrderNo(
createTask({
platform_order_id: 'KS202607080001',
task_no: 'DT600a8bd23b8',
}),
),
'KS202607080001',
)
})
test('buildFeifeiPlatformOrderNo falls back to task number', () => {
assert.equal(
buildFeifeiPlatformOrderNo(
createTask({
platform_order_id: '',
task_no: 'DT600a8bd23b8',
}),
),
'DT600a8bd23b8',
)
})
test('resolveKuaishouFeifeiPlatformAmount converts order fen amount to yuan', () => {
assert.equal(
resolveKuaishouFeifeiPlatformAmount({
totalAmountFen: 3800,
quantity: 1,
}),
38,
)
})
test('resolveKuaishouFeifeiPlatformAmount splits amount by item quantity', () => {
assert.equal(
resolveKuaishouFeifeiPlatformAmount({
totalAmountFen: 7600,
quantity: 2,
}),
38,
)
})
test('resolveKuaishouFeifeiPlatformAmount skips empty amount', () => {
assert.equal(
resolveKuaishouFeifeiPlatformAmount({
totalAmountFen: 0,
quantity: 1,
}),
0,
)
})
function createTask(patch: Partial<TaskRow> = {}): TaskRow {
return {
id: 123,
order_id: 456,
order_item_id: 789,
unit_index: 0,
platform_order_id: '',
profile_id: 0,
task_no: '',
executor_key: 'kuaishou_feifei',
task_status: 'pending',
delivery_status: 'pending',
result_code: '',
result_message: '',
automation_mode: 'auto',
requires_claim: true,
user_action_status: 'not_required',
attempt_count: 0,
runtime_session_id: '',
login_type: '',
nickname: '',
role_name: '',
role_id: '',
area: '',
partition_name: '',
claim_token: '',
primary_claim_token: '',
primary_claim_token_id: null,
primary_claim_token_status: '',
artifacts_json: '{}',
context_json: '{}',
screenshot_path: '',
last_error: '',
retry_count: 0,
created_at: '2026-07-08T00:00:00.000Z',
updated_at: '2026-07-08T00:00:00.000Z',
claimed_at: null,
role_confirmed_at: null,
redeemed_at: null,
...patch,
}
}