优化
This commit is contained in:
@@ -416,7 +416,18 @@ export class AcceptanceRun {
|
||||
}
|
||||
const customerAudit = this.apiSuccess(module, '按客户查询操作日志', customerAuditResponse)
|
||||
const customerAuditRow = customerAudit?.records?.find((item) => item.eventType === 'PLATFORM_TENANT_UPDATE' && String(item.accountId) === tenantId)
|
||||
this.assert(module, '客户操作日志包含本轮编辑事件', customerAuditResponse, Boolean(customerAuditRow), `tenantId=${tenantId}, event=${customerAuditRow?.eventType || 'missing'}`)
|
||||
let auditDiagnostic = 'event=missing'
|
||||
if (!customerAuditRow) {
|
||||
const unscopedResponse = await this.request('GET', `/api/platform/v1/audit/logs?eventType=PLATFORM_TENANT_UPDATE&resourceType=TENANT&resourceId=${tenantId}&page=1&size=20`)
|
||||
const unscopedPage = unscopedResponse.http === 200 && String(unscopedResponse.body?.code) === '200'
|
||||
? unscopedResponse.body?.data : null
|
||||
const misplaced = unscopedPage?.records?.find((item) => item.eventType === 'PLATFORM_TENANT_UPDATE')
|
||||
auditDiagnostic = misplaced
|
||||
? `eventAccountId=${misplaced.accountId ?? 'missing'}, expectedAccountId=${tenantId}`
|
||||
: `event=not-delivered, editRequestId=${editResponse.requestId || 'missing'}, editTraceId=${editResponse.traceId || 'missing'}`
|
||||
}
|
||||
this.assert(module, '客户操作日志包含本轮编辑事件', customerAuditResponse, Boolean(customerAuditRow),
|
||||
`tenantId=${tenantId}, ${customerAuditRow ? `event=${customerAuditRow.eventType}` : auditDiagnostic}`)
|
||||
if (customerAuditRow?.id) {
|
||||
const auditDetailResponse = await this.request('GET', `/api/platform/v1/audit/logs/${customerAuditRow.id}`)
|
||||
const auditDetail = this.apiSuccess(module, '查询客户操作日志详情', auditDetailResponse)
|
||||
@@ -434,7 +445,7 @@ export class AcceptanceRun {
|
||||
const qualificationImage = Uint8Array.from(Buffer.from('iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk+A8AAQUBAScY42YAAAAASUVORK5CYII=', 'base64'))
|
||||
qualificationPackage.append('businessLicense', new Blob([qualificationImage], { type: 'image/png' }), `business-license-${suffix}.png`)
|
||||
qualificationPackage.append('legalPersonId', new Blob([qualificationImage], { type: 'image/png' }), `legal-person-id-${suffix}.png`)
|
||||
qualificationPackage.append('unifiedSocialCreditCode', `91440300${suffix.replace(/[^0-9A-Z]/gi, '').toUpperCase().padStart(10, '0').slice(-10)}`)
|
||||
qualificationPackage.append('unifiedSocialCreditCode', `91440301${suffix.replace(/[^0-9A-Z]/gi, '').toUpperCase().padStart(10, '0').slice(-10)}`)
|
||||
const packageResponse = await this.requestWithBody('POST', `/api/platform/v1/files/qualifications/${tenantId}/required-package`, qualificationPackage)
|
||||
this.apiSuccess(module, '上传审核所需客户资质包', packageResponse, `tenantId=${tenantId}`)
|
||||
const qualificationResponse = await this.request('GET', `${detailPath}/qualifications`); const qualifications = this.apiSuccess(module, '业务概况查询资质', qualificationResponse)
|
||||
|
||||
@@ -36,6 +36,13 @@ test('客户验收覆盖客户维度操作日志列表和详情快照', () => {
|
||||
assert.match(acceptance, /audit\/logs\/\$\{customerAuditRow\.id\}/)
|
||||
assert.match(acceptance, /JSON\.parse\(auditDetail\[field\]\)/)
|
||||
assert.match(acceptance, /snapshotsAreRedacted/)
|
||||
assert.match(acceptance, /eventAccountId=.*expectedAccountId=/)
|
||||
assert.match(acceptance, /event=not-delivered, editRequestId=/)
|
||||
})
|
||||
|
||||
test('客户资质场景使用独立社会信用代码命名空间', () => {
|
||||
assert.match(acceptance, /unifiedSocialCreditCode', `91440301/)
|
||||
assert.doesNotMatch(operatingStatistics, /unifiedSocialCreditCode/)
|
||||
})
|
||||
|
||||
test('客户详情经营统计模块登记三项独立正式接口与精度字段', () => {
|
||||
|
||||
@@ -2,7 +2,7 @@ import assert from 'node:assert/strict'
|
||||
import { readFileSync } from 'node:fs'
|
||||
import test from 'node:test'
|
||||
|
||||
import { cleanupSucceeded } from './fee-items.mjs'
|
||||
import { cleanupSucceeded, isAcceptanceFeeItem } from './fee-items.mjs'
|
||||
|
||||
const source = readFileSync(new URL('./fee-items.mjs', import.meta.url), 'utf8')
|
||||
|
||||
@@ -20,3 +20,14 @@ test('cleanup treats successful deletion and an already absent resource as clean
|
||||
assert.equal(cleanupSucceeded({ http: 404, body: {} }), true)
|
||||
assert.equal(cleanupSucceeded({ http: 200, body: { code: 'A0422' } }), false)
|
||||
})
|
||||
|
||||
test('stale cleanup only recognizes the acceptance-owned code and name pair', () => {
|
||||
assert.equal(isAcceptanceFeeItem({ feeCode: 'ACPT_813083345572', feeTypeName: '全量验收费用-813083345572-已编辑' }), true)
|
||||
assert.equal(isAcceptanceFeeItem({ feeCode: 'FEE_TYPE_001', feeTypeName: '全量验收费用-001' }), false)
|
||||
assert.equal(isAcceptanceFeeItem({ feeCode: 'ACPT_813083345572', feeTypeName: '正式费用项目' }), false)
|
||||
})
|
||||
|
||||
test('baseline checks run only after stale acceptance cleanup', () => {
|
||||
assert.ok(source.indexOf('cleanupStaleAcceptanceItems(context)')
|
||||
< source.indexOf("'分页总数110且默认20条对应6页'"))
|
||||
})
|
||||
|
||||
@@ -44,6 +44,10 @@ function payload(suffix, overrides = {}) {
|
||||
function expectedCodes() {
|
||||
return Array.from({ length: 110 }, (_, index) => `FEE_TYPE_${String(index + 1).padStart(3, '0')}`)
|
||||
}
|
||||
export function isAcceptanceFeeItem(row) {
|
||||
return /^ACPT_\d+$/.test(String(row?.feeCode || ''))
|
||||
&& String(row?.feeTypeName || '').startsWith('全量验收费用-')
|
||||
}
|
||||
function fixture(context) {
|
||||
const candidates = [context.createdResources?.orders, context.createdResources?.testInbound,
|
||||
context.createdResources?.inboundMeasurement, context.context?.testInbound]
|
||||
@@ -57,7 +61,26 @@ async function listAll(context) {
|
||||
return { response, page, rows: records(page) }
|
||||
}
|
||||
|
||||
async function cleanupStaleAcceptanceItems(context) {
|
||||
const listed = await listAll(context)
|
||||
const stale = listed.rows.filter(isAcceptanceFeeItem)
|
||||
const failed = []
|
||||
for (const row of stale) {
|
||||
const response = await context.request('DELETE', `${BASE}/${encodeURIComponent(id(row.id))}`)
|
||||
if (!cleanupSucceeded(response)) failed.push({ row, response })
|
||||
}
|
||||
const response = failed[0]?.response || listed.response
|
||||
context.assert(MODULE, '前置清理历史验收临时费用项目', response, failed.length === 0,
|
||||
failed.length === 0
|
||||
? `stale=${stale.length}, cleaned=${stale.length}`
|
||||
: `failed=${failed.map(({ row, response: failure }) => `${row.feeCode}:${failure.body?.code || failure.http}`).join(',')}`,
|
||||
OPTIONS)
|
||||
return failed.length === 0
|
||||
}
|
||||
|
||||
export async function run(context) {
|
||||
if (!await cleanupStaleAcceptanceItems(context)) return
|
||||
|
||||
const initialPageResponse = await context.request('GET', query({ page: 1, size: 20 }))
|
||||
const initialPage = context.apiSuccess(MODULE, '费用项目查看权限与分页查询', initialPageResponse,
|
||||
'page=1,size=20', OPTIONS)
|
||||
|
||||
@@ -42,5 +42,6 @@ test('客户详情财务账单验收覆盖客户过滤、详情结构与查看
|
||||
assert.match(finance, /statementId\(statementDetail\) === createdStatementId/)
|
||||
assert.match(finance, /Array\.isArray\(statementDetail\?\.lines\)/)
|
||||
assert.match(finance, /Array\.isArray\(statementDetail\?\.revisions\)/)
|
||||
assert.match(finance, /platform:finance:bill:view/)
|
||||
assert.match(finance, /grantedPermissions\.has\(['"]platform:finance:customer-statement:list['"]\)/)
|
||||
assert.doesNotMatch(finance, /platform:finance:bill:view/)
|
||||
})
|
||||
|
||||
@@ -83,7 +83,7 @@ export async function run(context) {
|
||||
const permissions = context.apiSuccess(MODULE, '客户详情财务账单查看权限链可用', permissionResponse, '', OPTIONS)
|
||||
const grantedPermissions = new Set(rows(permissions).map((item) => id(item?.permissionCode ?? item)))
|
||||
context.assert(MODULE, '财务账单列表查看权限已授予', permissionResponse,
|
||||
grantedPermissions.has('platform:finance:bill:view') || grantedPermissions.has('platform:finance:customer-statement:list'),
|
||||
grantedPermissions.has('platform:finance:customer-statement:list'),
|
||||
`permissions=${[...grantedPermissions].filter((item) => item.includes('finance')).join(',')}`, OPTIONS)
|
||||
|
||||
const statementListResponse = await context.request('GET', `${BASE}/statements?customerId=${encodeURIComponent(customerId)}`)
|
||||
|
||||
Reference in New Issue
Block a user