This commit is contained in:
2026-09-29 18:47:37 +08:00
parent 2c60a29e0f
commit c2927ab9a6
291 changed files with 4008 additions and 6298 deletions
@@ -10,13 +10,11 @@ import {
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..')
const serviceModules = [
'auth', 'iam', 'order', 'firstleg', 'finance', 'file', 'warehouse',
'integration-service', 'print', 'event-bridge-service', 'lastleg-service',
'warehouse-overseas-service'
]
// Discover all active Maven modules; unreviewed clients must fail equality checks.
const serviceModules = [...(await readFile(path.join(root, 'pom.xml'), 'utf8'))
.matchAll(/<module>([^<]+)<\/module>/g)].map(match => match[1])
const canonicalSource = new Map(serviceModules.map(name => [name, `${name}${name.endsWith('-service') ? '' : '-service'}`]))
const canonicalSource = new Map(serviceModules.map(name => [name, `${name}${name.endsWith('-service') || name.startsWith('common-') || name === 'gateway' || name === 'platform-bom' ? '' : '-service'}`]))
const expectedOnlineEdges = [
'auth-service->iam-service',
@@ -47,25 +45,22 @@ const expectedOnlineEdges = [
]
const expectedBackgroundEdges = [
'event-bridge-service->finance-service',
'event-bridge-service->firstleg-service',
'event-bridge-service->lastleg-service',
'file-service->finance-service',
'file-service->firstleg-service',
'file-service->iam-service',
'file-service->order-service',
'file-service->warehouse-service',
'finance-service->event-bridge-service',
'finance-service->lastleg-service',
'finance-service->firstleg-service',
'firstleg-service->event-bridge-service',
'firstleg-service->lastleg-service',
'firstleg-service->finance-service',
'firstleg-service->integration-service',
'firstleg-service->order-service',
'iam-service->event-bridge-service',
'iam-service->firstleg-service',
'lastleg-service->event-bridge-service',
'lastleg-service->finance-service',
'lastleg-service->firstleg-service',
'order-service->firstleg-service'
]
].sort()
const rawHttpPattern = /\b(?:RestClient|WebClient|HttpClient)\b/
@@ -78,7 +73,7 @@ async function javaFiles(directory) {
else if (entry.isFile() && entry.name.endsWith('.java')) result.push(target)
}
}
await visit(directory)
if (await readdir(directory).catch(error => { if (error.code === 'ENOENT') return null; throw error })) await visit(directory)
return result
}
@@ -111,17 +106,17 @@ test('all Feign clients have reviewed context, access and idempotency metadata',
test('all raw HTTP transports have reviewed context, access and idempotency metadata', async () => {
const discovered = []
for (const module of ['common-audit', 'event-bridge-service', 'gateway-overseas', 'lastleg-service', 'integration-service']) {
for (const module of serviceModules) {
for (const file of await javaFiles(path.join(root, module, 'src', 'main', 'java'))) {
const source = await readFile(file, 'utf8')
if (!rawHttpPattern.test(source)) continue
if (!/(?:private|final)\s+(?:RestClient|WebClient|HttpClient)\b|HttpClient\s+client\s*=/.test(source)) continue
if (!/(?:private|final)\s+(?:[\w.]+\.)?(?:RestClient|WebClient|HttpClient)\b|HttpClient\s+client\s*=/.test(source)) continue
discovered.push(path.relative(root, file).replaceAll('\\', '/'))
}
}
const reviewed = SYNCHRONOUS_CLIENTS.filter(client => client.transport === 'HTTP')
.map(client => client.path).sort()
assert.equal(reviewed.length, 24)
assert.equal(reviewed.length, 22)
assert.deepEqual(discovered.sort(), reviewed)
})
@@ -175,7 +170,7 @@ test('all six Lastleg RestClient gateways use explicit bounded transports', asyn
for (const configFile of [
'lastleg-service/src/main/resources/application.yml',
'config/nacos/overseas/lastleg-service.yml'
'config/nacos/test/lastleg-service.yml'
]) {
const source = await readFile(path.join(root, configFile), 'utf8')
for (const key of ['unload-photo-file', 'relabel-photo-file', 'customer-visit-file', 'procurement-file', 'warehouse-resource', 'pallet-physical']) {
@@ -191,26 +186,28 @@ test('REQUEST, BACKGROUND and full graphs remain separate executable baselines',
assert.deepEqual(graphEdges('BACKGROUND'), expectedBackgroundEdges)
assert.deepEqual(graphEdges('INFRASTRUCTURE'), [
'common-audit->audit-service',
'gateway-overseas->auth-service',
'gateway-overseas->lastleg-service'
'common-security->auth-service',
'gateway->auth-service'
])
assert.deepEqual(stronglyConnectedComponents(graphEdges('REQUEST')), [
['auth-service', 'iam-service'],
['finance-service', 'firstleg-service', 'order-service']
])
assert.deepEqual(stronglyConnectedComponents(graphEdges('BACKGROUND')), [[
'event-bridge-service', 'finance-service', 'firstleg-service', 'lastleg-service', 'order-service'
'finance-service', 'firstleg-service', 'lastleg-service', 'order-service'
]])
assert.deepEqual(stronglyConnectedComponents(graphEdges('ALL')), [[
'auth-service', 'event-bridge-service', 'file-service', 'finance-service',
'auth-service', 'file-service', 'finance-service',
'firstleg-service', 'iam-service', 'lastleg-service', 'order-service'
]])
})
test('overseas security projection stays in Lastleg infrastructure and background edges', () => {
assert.ok(!graphEdges('REQUEST').some(edge => edge === 'gateway-overseas->lastleg-service'))
assert.ok(graphEdges('INFRASTRUCTURE').includes('gateway-overseas->lastleg-service'))
assert.ok(graphEdges('BACKGROUND').includes('event-bridge-service->lastleg-service'))
test('unified authority checks remain infrastructure edges and direct events remain background', () => {
assert.ok(graphEdges('INFRASTRUCTURE').includes('gateway->auth-service'))
assert.ok(graphEdges('INFRASTRUCTURE').includes('common-security->auth-service'))
assert.ok(graphEdges('BACKGROUND').includes('lastleg-service->finance-service'))
assert.ok(!graphEdges('REQUEST').includes('lastleg-service->finance-service'))
assert.ok(!SYNCHRONOUS_CLIENTS.some(client => ['event-bridge-service','gateway-overseas'].includes(client.source) || ['event-bridge-service','gateway-overseas'].includes(client.target)))
})
test('Order, Firstleg and Finance form the reviewed REQUEST SCC', () => {
@@ -284,7 +281,7 @@ test('known user entries expose every longest simple REQUEST path over the two-h
})
test('shared Feign timeout defaults and long-running export overrides do not drift silently', async () => {
for (const profile of ['local', 'cn', 'overseas']) {
for (const profile of ['test']) {
const source = await readFile(path.join(root, 'config', 'nacos', profile, 'baiyue-common.yml'), 'utf8')
assert.match(source, /connect-timeout:\s*3000/)
assert.match(source, /read-timeout:\s*5000/)