51 lines
2.2 KiB
JavaScript
51 lines
2.2 KiB
JavaScript
import assert from 'node:assert/strict'
|
|
import { readFileSync } from 'node:fs'
|
|
import test from 'node:test'
|
|
|
|
import { approvedInboundReady } from './orders.mjs'
|
|
|
|
const tenantId = '10001'
|
|
const orderId = '20001'
|
|
const taskResponse = {
|
|
http: 200,
|
|
body: { code: '200', data: { id: '30001', tenantId, orderId } },
|
|
}
|
|
|
|
test('draft inbound id alone does not mean approval outbox has converged', () => {
|
|
assert.equal(approvedInboundReady({
|
|
summary: { inboundId: '40001', mainStatus: 'PREPARING' },
|
|
}, taskResponse, tenantId, orderId), false)
|
|
})
|
|
|
|
test('measurable inbound without fulfillment task remains pending', () => {
|
|
assert.equal(approvedInboundReady({
|
|
summary: { inboundId: '40001', mainStatus: 'WAIT_MEASURE' },
|
|
}, { http: 200, body: { code: 'A0404' } }, tenantId, orderId), false)
|
|
})
|
|
|
|
test('approval polling remains pending before the first fulfillment task response', () => {
|
|
assert.equal(approvedInboundReady({
|
|
summary: { inboundId: null, mainStatus: 'PENDING_REVIEW' },
|
|
}, null, tenantId, orderId), false)
|
|
})
|
|
|
|
test('approval convergence requires matching inbound state, order and customer task identity', () => {
|
|
const detail = { summary: { inboundId: '40001', mainStatus: 'WAIT_MEASURE' } }
|
|
assert.equal(approvedInboundReady(detail, taskResponse, tenantId, orderId), true)
|
|
assert.equal(approvedInboundReady(detail, {
|
|
http: 200, body: { code: '200', data: { id: '30001', tenantId, orderId: '20002' } },
|
|
}, tenantId, orderId), false)
|
|
assert.equal(approvedInboundReady(detail, {
|
|
http: 200, body: { code: '200', data: { id: '30001', tenantId: '10002', orderId } },
|
|
}, tenantId, orderId), false)
|
|
})
|
|
|
|
test('orders acceptance polls approval convergence instead of only inbound id visibility', () => {
|
|
const source = readFileSync(new URL('orders.mjs', import.meta.url), 'utf8')
|
|
assert.match(source, /审核后入库单与履约任务异步收敛/)
|
|
assert.match(source, /approvedInboundReady\(candidate, taskResponse, tenantId, orderId\)/)
|
|
assert.match(source, /MEASURABLE_STATUSES\.has\(summary\?\.mainStatus\)/)
|
|
assert.doesNotMatch(source, /MEASURABLE_STATUSES\.has\(summary\?\.processStatus\)/)
|
|
assert.doesNotMatch(source, /if \(success\(response\) && response\.body\?\.data\?\.summary\?\.inboundId\)/)
|
|
})
|