Files
baiyue-firstleg/scripts/admin-test-env-modules/procurement-sample-fulfillment-contract.test.mjs
T

51 lines
2.6 KiB
JavaScript

import test from 'node:test'
import assert from 'node:assert/strict'
import { verifyProcurementSample } from './procurement-sample-fulfillment.mjs'
function fixture() {
const events = []
const context = { marker: 'PROC-TEST', token: 'admin-token', createdResources: {},
async checkpoint() { events.push('checkpoint') },
async request(method, path) { events.push(`${method} ${path}`); throw new Error('network outcome unknown') } }
const inputs = { marker: context.marker, customerId: '101', warehouseId: '201', customerName: 'QA', customerToken: 'customer-token',
async upload() { throw new Error('must not upload yet') },
async readWallet() { return { actualBalance: '10.00', availableBalance: '10.00', frozenBalance: '0.00', creditUsed: '0.00' } } }
return { context, inputs, events }
}
test('missing owned fixture is rejected before any HTTP', async () => {
const { context, inputs, events } = fixture()
inputs.marker = 'other-run'
await assert.rejects(verifyProcurementSample(context, inputs), /本轮独立客户/)
assert.deepEqual(events, [])
})
test('insufficient independent cash stops before creating an order', async () => {
const { context, inputs, events } = fixture()
inputs.readWallet = async () => ({ actualBalance: '1.00', availableBalance: '1.00', frozenBalance: '0.00', creditUsed: '0.00' })
await assert.rejects(verifyProcurementSample(context, inputs), /现金余额/)
assert.equal(events.some(event => event.startsWith('POST')), false)
assert.equal(context.createdResources.procurementSample.status, 'FAILED')
})
test('unknown create outcome is persisted and never automatically retried', async () => {
const { context, inputs, events } = fixture()
await assert.rejects(verifyProcurementSample(context, inputs), /network outcome unknown/)
const proof = context.createdResources.procurementSample
assert.equal(proof.requests.length, 1)
assert.equal(proof.requests[0].status, 'UNKNOWN_RESULT')
assert.ok(proof.requests[0].body.idempotencyKey)
assert.equal(events.filter(event => event.startsWith('POST')).length, 1)
const write = events.findIndex(event => event.startsWith('POST'))
assert.equal(events[write - 1], 'checkpoint')
assert.equal(JSON.stringify(proof).includes('customer-token'), false)
await assert.rejects(verifyProcurementSample(context, inputs), /不自动重跑/)
})
test('failure to persist the request prevents network dispatch', async () => {
const { context, inputs, events } = fixture()
context.checkpoint = async () => { throw new Error('disk write failed') }
await assert.rejects(verifyProcurementSample(context, inputs), /disk write failed/)
assert.equal(events.length, 0)
})