99 lines
6.1 KiB
JavaScript
99 lines
6.1 KiB
JavaScript
import assert from 'node:assert/strict'
|
|
import { readFile } from 'node:fs/promises'
|
|
import test from 'node:test'
|
|
|
|
const read = async (path) => (await readFile(new URL(`../${path}`, import.meta.url), 'utf8'))
|
|
.replaceAll('\r\n', '\n')
|
|
|
|
test('Jenkins pipelines recognize all overseas deployable modules', async () => {
|
|
const controller = await read('Jenkinsfile')
|
|
const service = await read('Jenkinsfile.service')
|
|
for (const module of ['gateway-overseas', 'lastleg-service', 'warehouse-overseas-service']) {
|
|
assert.match(controller, new RegExp(`'${module}'`))
|
|
assert.match(service, new RegExp(`'${module}'`))
|
|
}
|
|
assert.match(controller, /'gateway-overseas': 'SERVICE_GATEWAY_OVERSEAS'/)
|
|
assert.match(controller, /'lastleg-service': 'SERVICE_LASTLEG'/)
|
|
assert.match(controller, /'warehouse-overseas-service': 'SERVICE_WAREHOUSE_OVERSEAS'/)
|
|
assert.match(service, /gateway-overseas\/target\/gateway-overseas-1\.0\.0-SNAPSHOT\.jar/)
|
|
assert.match(service, /lastleg-service\/target\/lastleg-service-1\.0\.0-SNAPSHOT\.jar/)
|
|
assert.match(service, /warehouse-overseas-service\/target\/warehouse-overseas-service-1\.0\.0-SNAPSHOT\.jar/)
|
|
assert.match(controller, /EVENT_BRIDGE_REGION/)
|
|
assert.match(service, /EVENT_BRIDGE_REGION_OVERRIDE=\$\{bridgeRegion\}/)
|
|
assert.match(controller, /choices: \['BOTH', 'CN', 'OVERSEAS'\]/)
|
|
assert.match(service, /choices: \['BOTH', 'CN', 'OVERSEAS', 'SELECT'\]/)
|
|
assert.match(controller, /事件桥 BOTH 仅支持开发或测试环境/)
|
|
})
|
|
|
|
test('service map freezes unique internal ports and moves event bridge away from 9300', async () => {
|
|
const map = await read('deploy/service-map.yml')
|
|
assert.match(map, /^ gateway-overseas:[\s\S]*?port: 9300$/m)
|
|
assert.match(map, /^ lastleg-service:[\s\S]*?port: 9303$/m)
|
|
assert.match(map, /^ warehouse-overseas-service:[\s\S]*?port: 9305$/m)
|
|
assert.match(map, /^ event-bridge-service:[\s\S]*?port: 9312$/m)
|
|
assert.match(map, /^ gateway-overseas:[\s\S]*?regions: \[OVERSEAS\]$/m)
|
|
assert.match(map, /^ lastleg-service:[\s\S]*?regions: \[OVERSEAS\]$/m)
|
|
assert.match(map, /^ warehouse-overseas-service:[\s\S]*?regions: \[OVERSEAS\]$/m)
|
|
assert.match(map, /^ event-bridge-service:[\s\S]*?regions: \[CN, OVERSEAS\]$/m)
|
|
})
|
|
|
|
test('overseas compose is isolated from CN defaults and disables implicit schema execution', async () => {
|
|
const compose = await read('deploy/docker-compose.overseas.yml')
|
|
assert.match(compose, /^name: firstleg-\$\{DEPLOY_ENV:-test\}-overseas$/m)
|
|
assert.match(compose, /NACOS_NAMESPACE: \$\{OVERSEAS_NACOS_NAMESPACE:-prod-overseas\}/)
|
|
assert.match(compose, /REGION_CODE: OVERSEAS/)
|
|
assert.match(compose, /SPRING_SQL_INIT_MODE: never/)
|
|
assert.match(compose, /^ gateway-overseas:\s*$/m)
|
|
assert.match(compose, /^ lastleg-service:\s*$/m)
|
|
assert.match(compose, /^ warehouse-overseas-service:\s*$/m)
|
|
assert.match(compose, /^ event-bridge-service:\s*$/m)
|
|
assert.match(compose, /EVENT_BRIDGE_OVERSEAS_PORT:-9313}:9312/)
|
|
assert.match(compose, /INTERNAL_SERVICE_TOKEN: \$\{INTERNAL_SERVICE_TOKEN\}/)
|
|
assert.match(compose, /LASTLEG_DB_URL: \$\{LASTLEG_DB_URL\}/)
|
|
assert.match(compose, /EVENT_BRIDGE_DB_URL: \$\{EVENT_BRIDGE_OVERSEAS_DB_URL\}/)
|
|
assert.match(compose, /EVENT_BRIDGE_DB_USERNAME: \$\{EVENT_BRIDGE_OVERSEAS_DB_USERNAME\}/)
|
|
assert.match(compose, /EVENT_BRIDGE_DB_PASSWORD: \$\{EVENT_BRIDGE_OVERSEAS_DB_PASSWORD\}/)
|
|
})
|
|
|
|
test('CN and overseas event bridges have explicit opposite-region consumers', async () => {
|
|
const cnCompose = await read('deploy/docker-compose.yml')
|
|
const overseasCompose = await read('deploy/docker-compose.overseas.yml')
|
|
const cn = await read('config/nacos/cn/event-bridge-service.yml')
|
|
const overseas = await read('config/nacos/overseas/event-bridge-service.yml')
|
|
const firstleg = await read('config/nacos/cn/firstleg-service.yml')
|
|
const lastleg = await read('config/nacos/overseas/lastleg-service.yml')
|
|
const scripts = `${await read('deploy/scripts/deploy-built-service.sh')}\n${await read('deploy/scripts/deploy-services.sh')}`
|
|
assert.match(cn, /EVENT_CONSUMER_URL:http:\/\/firstleg:9202\/internal\/firstleg\/v1\/container-events/)
|
|
assert.match(overseas, /EVENT_CONSUMER_URL:http:\/\/lastleg-service:9303\/internal\/lastleg\/events/)
|
|
assert.match(cnCompose, /EVENT_CONSUMER_URL: \$\{FIRSTLEG_CONTAINER_EVENT_CONSUMER_URL:-http:\/\/firstleg:9202\/internal\/firstleg\/v1\/container-events\}/)
|
|
assert.match(overseasCompose, /EVENT_CONSUMER_URL: \$\{EVENT_CONSUMER_URL:-http:\/\/lastleg-service:9303\/internal\/lastleg\/events\}/)
|
|
assert.match(firstleg, /LASTLEG_EVENT_BRIDGE_URL/)
|
|
assert.match(firstleg, /LASTLEG_OUTBOX_RELAY_LEASE_SECONDS/)
|
|
assert.match(lastleg, /FIRSTLEG_EVENT_BRIDGE_URL/)
|
|
assert.match(lastleg, /WAREHOUSE_OVERSEAS_SERVICE_URL:http:\/\/warehouse-overseas-service:9305/)
|
|
assert.match(scripts, /FIRSTLEG_EVENT_BRIDGE_URL/)
|
|
assert.match(scripts, /LASTLEG_EVENT_BRIDGE_URL/)
|
|
assert.match(scripts, /docker-compose\.overseas\.yml/)
|
|
assert.match(scripts, /REGION_CODE=CN 或 REGION_CODE=OVERSEAS/)
|
|
assert.match(scripts, /env_file_value REGION_CODE/)
|
|
assert.match(scripts, /EVENT_BRIDGE_REGION_OVERRIDE/)
|
|
assert.match(scripts, /FIRSTLEG_CONTAINER_EVENT_CONSUMER_URL/)
|
|
assert.match(scripts, /COMPOSE_FILE="deploy\/docker-compose\.overseas\.yml"/)
|
|
assert.match(scripts, /PROJECT_NAME="firstleg-\$DEPLOY_ENV-overseas"/)
|
|
assert.match(scripts, /运行容器镜像与请求镜像不一致/)
|
|
assert.match(scripts, /REMOTE_ENV_NAME="\.env\.\$PROJECT_NAME"/)
|
|
assert.match(scripts, /REMOTE_COMPOSE_NAME="docker-compose\.\$PROJECT_NAME\.yml"/)
|
|
for (const key of [
|
|
'NACOS_SERVER_ADDR', 'OVERSEAS_NACOS_NAMESPACE', 'INTERNAL_SERVICE_TOKEN',
|
|
'JWT_ISSUER', 'OVERSEAS_JWT_AUDIENCE', 'JWT_JWK_SET_URI'
|
|
]) assert.match(scripts, new RegExp(key))
|
|
})
|
|
|
|
test('domestic Auth receives the overseas JWT signing configuration', async () => {
|
|
const compose = await read('deploy/docker-compose.yml')
|
|
for (const key of [
|
|
'OVERSEAS_JWT_ENABLED', 'OVERSEAS_JWT_ISSUER', 'OVERSEAS_JWT_AUDIENCE',
|
|
'OVERSEAS_JWT_RSA_JWK_SET', 'OVERSEAS_JWT_CURRENT_KID', 'OVERSEAS_ACCESS_TOKEN_TTL'
|
|
]) assert.match(compose, new RegExp(`${key}: \\$\\{${key}`))
|
|
})
|