From 1f4b09f0c924fcb21de8307944a7c729daa3733c Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Tue, 11 Aug 2026 20:02:04 +0800 Subject: [PATCH] test(admin): align fee item acceptance payload --- .../fee-items-contract.test.mjs | 22 +++++++++++++++++++ scripts/admin-test-env-modules/fee-items.mjs | 12 +++++++--- 2 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 scripts/admin-test-env-modules/fee-items-contract.test.mjs diff --git a/scripts/admin-test-env-modules/fee-items-contract.test.mjs b/scripts/admin-test-env-modules/fee-items-contract.test.mjs new file mode 100644 index 000000000..b8b150715 --- /dev/null +++ b/scripts/admin-test-env-modules/fee-items-contract.test.mjs @@ -0,0 +1,22 @@ +import assert from 'node:assert/strict' +import { readFileSync } from 'node:fs' +import test from 'node:test' + +import { cleanupSucceeded } from './fee-items.mjs' + +const source = readFileSync(new URL('./fee-items.mjs', import.meta.url), 'utf8') + +test('fee detail binding explicitly sends the settlement inclusion contract field', () => { + assert.match(source, /const detailPayload = \{[\s\S]*settlementIncluded: false/) +}) + +test('referenced fee-item deletion remains a conflict assertion', () => { + assert.match(source, /'任意客户费用明细引用后公共项目不可删除'[\s\S]*conflict\(protectedDeleteResponse\)/) +}) + +test('cleanup treats successful deletion and an already absent resource as clean', () => { + assert.equal(cleanupSucceeded({ http: 200, body: { code: '200' } }), true) + assert.equal(cleanupSucceeded({ http: 200, body: { code: 'A0404' } }), true) + assert.equal(cleanupSucceeded({ http: 404, body: {} }), true) + assert.equal(cleanupSucceeded({ http: 200, body: { code: 'A0422' } }), false) +}) diff --git a/scripts/admin-test-env-modules/fee-items.mjs b/scripts/admin-test-env-modules/fee-items.mjs index adfc88468..68f351a86 100644 --- a/scripts/admin-test-env-modules/fee-items.mjs +++ b/scripts/admin-test-env-modules/fee-items.mjs @@ -8,6 +8,10 @@ const MERCHANT_PASSWORD = process.env.MERCHANT_TEST_PASSWORD || 'ChangeMe123!' function id(value) { return value == null ? '' : String(value) } function records(value) { return Array.isArray(value?.records) ? value.records : [] } function success(response) { return response.http === 200 && String(response.body?.code) === '200' } +export function cleanupSucceeded(response) { + return success(response) || response.http === 404 + || (response.http === 200 && ['A0404', '404'].includes(String(response.body?.code))) +} function conflict(response) { return response.http === 200 && ['A0409', '409'].includes(String(response.body?.code)) } @@ -182,7 +186,8 @@ export async function run(context) { const feeDetailPath = `/api/platform/v1/inbounds/${encodeURIComponent(inbound.inboundId)}/fee-details?accountId=${encodeURIComponent(inbound.tenantId)}` const detailPayload = { feeItemId, direction: 'RECEIVABLE', businessDate: new Date().toISOString().slice(0, 10), - unitPrice: 1.25, currency: 'CNY', amount: 1.25, remark: context.marker, + unitPrice: 1.25, currency: 'CNY', amount: 1.25, settlementIncluded: false, + remark: context.marker, } const disabledBindingResponse = await context.request('POST', feeDetailPath, detailPayload) context.assert(MODULE, '停用费用项目不可绑定新的入库费用', disabledBindingResponse, @@ -205,6 +210,7 @@ export async function run(context) { context.assert(MODULE, '任意客户费用明细引用后公共项目不可删除', protectedDeleteResponse, conflict(protectedDeleteResponse), `HTTP=${protectedDeleteResponse.http}, code=${protectedDeleteResponse.body?.code ?? 'missing'}, customer=${inbound.tenantId}`, OPTIONS) + itemDeleted = success(protectedDeleteResponse) if (detailId) { const detailDeleteResponse = await context.request('DELETE', @@ -226,13 +232,13 @@ export async function run(context) { if (detailId && !detailDeleted && inbound) { const cleanupDetailResponse = await context.request('DELETE', `/api/platform/v1/inbounds/${encodeURIComponent(inbound.inboundId)}/fee-details/${encodeURIComponent(detailId)}?accountId=${encodeURIComponent(inbound.tenantId)}`) - detailDeleted = success(cleanupDetailResponse) + detailDeleted = cleanupSucceeded(cleanupDetailResponse) context.assert(MODULE, '异常路径清理本轮费用明细', cleanupDetailResponse, detailDeleted, `detailId=${detailId}`, OPTIONS) } if (!itemDeleted && (!detailId || detailDeleted)) { const cleanupItemResponse = await context.request('DELETE', `${BASE}/${encodeURIComponent(feeItemId)}`) - itemDeleted = success(cleanupItemResponse) + itemDeleted = cleanupSucceeded(cleanupItemResponse) context.assert(MODULE, '异常路径清理本轮费用项目', cleanupItemResponse, itemDeleted, `feeItemId=${feeItemId}`, OPTIONS) }