2026-08-13 11:57:33 +08:00
import assert from 'node:assert/strict'
import { readFileSync } from 'node:fs'
import test from 'node:test'
const source = readFileSync ( new URL ( './suppliers.mjs' , import . meta . url ), 'utf8' )
const orchestrator = readFileSync ( new URL ( '../admin-test-env-acceptance.mjs' , import . meta . url ), 'utf8' )
2026-08-15 09:57:46 +08:00
const openapi = readFileSync ( new URL ( '../../warehouse/src/main/resources/openapi/supplier-v1.yaml' , import . meta . url ), 'utf8' )
2026-08-13 11:57:33 +08:00
test ( 'supplier acceptance covers full CRUD-like lifecycle and boundary failures' ,()=>{
2026-08-17 14:46:44 +08:00
for ( const marker of [ '列表分页与订舱筛选' , '查询四类供应商统计' , '新增供应商' , '查询供应商详情' , '编辑供应商' , '停用供应商' , '重复名称返回冲突' , 'tenantId非0被拒绝' , '客户账号调用平台供应商接口被拒绝' , 'requestId' , 'traceId' ]) assert . match ( source , new RegExp ( marker ))
assert . doesNotMatch ( source , /scope\s*:/ )
2026-08-13 11:57:33 +08:00
})
2026-08-15 09:57:46 +08:00
test ( 'supplier module is registered in the default full acceptance orchestration' ,()=> assert . match ( orchestrator , /CONFIGURED_MODULES = \[[^\]]*'suppliers'/s))
2026-08-13 11:57:33 +08:00
test ( 'supplier fixture is retained only as inactive because API has no delete contract' ,()=>{ assert . match ( source , /finalStatus:inactive\?'INACTIVE'/ ); assert . doesNotMatch ( source , /context\.request\('DELETE'/ )})
2026-08-17 14:46:44 +08:00
test ( 'supplier OpenAPI exposes the internal active category validation contract without scope' ,()=>{
2026-08-15 09:57:46 +08:00
for ( const marker of [ '/internal/warehouse/v1/suppliers/{supplierId}' , 'X-Internal-Service-Token' , 'requireActive' , 'InternalSnapshot' , 'SupplierPageResponse' , 'platform:supplier:list' ]) assert . match ( openapi , new RegExp ( marker . replace ( /[{}]/g , '\\$&' )))
2026-08-17 14:46:44 +08:00
assert . doesNotMatch ( openapi , /\bscope\b/ )
2026-08-15 09:57:46 +08:00
assert . doesNotMatch ( openapi , /platform:supplier:view/ )
})