test: make price-book acceptance portable

This commit is contained in:
2026-08-25 00:08:59 +08:00
parent 24149c062a
commit 84ad5e779a
2 changed files with 44 additions and 10 deletions
@@ -0,0 +1,16 @@
import assert from 'node:assert/strict'
import fs from 'node:fs'
import path from 'node:path'
import test from 'node:test'
import { fileURLToPath } from 'node:url'
const here = path.dirname(fileURLToPath(import.meta.url))
const source = fs.readFileSync(path.join(here, 'pricing.mjs'), 'utf8')
test('price-book acceptance is portable and reuses a deployed active source by default', () => {
assert.match(source, /process\.env\.ADMIN_TEST_PRICE_BOOK_FILE/)
assert.match(source, /activeBefore\[0\]/)
assert.match(source, /requestBinary\('GET', `\$\{PRICE_BOOK_PATH\}\/\$\{encodeURIComponent\(activeFixture\.id\)\}\/source`\)/)
assert.match(source, /复用当前生效价格源作为本轮隔离上传夹具/)
assert.doesNotMatch(source, /WXWork|Users\\BY-OY|DEFAULT_PRICE_BOOK_FILE/)
})
+28 -10
View File
@@ -5,7 +5,6 @@ import { basename } from 'node:path'
const PRICE_BOOK_PATH = '/api/platform/v1/fba-pricing/carrier-rates/price-books'
const DOMESTIC_WAREHOUSE_PATH = '/api/platform/v1/warehouse-admin?page=1&size=200&status=ACTIVE&warehouseType=DOMESTIC'
const OVERSEAS_WAREHOUSE_PATH = '/api/platform/v1/warehouse-admin?page=1&size=200&status=ACTIVE&warehouseType=OVERSEAS'
const DEFAULT_PRICE_BOOK_FILE = 'C:\\Users\\BY-OY\\Documents\\WXWork\\1688854456873012\\Cache\\File\\2026-08\\2026.08.03柏悦价格表 船期2026.08.12.xlsx'
const EXPECTED_CHANNEL_CODES = [
'MATSON_CLX_TRUCK', 'MATSON_MAX_TRUCK', 'EXX_TRUCK', 'HEDE_TRUCK', 'EXX_RAIL_NY',
'OA_LA_TRUCK', 'OA_LA_FULL_TRUCK', 'OA_CHICAGO_RAIL', 'OA_HOUSTON_TRUCK',
@@ -134,18 +133,37 @@ export async function run(context) {
Array.isArray(versionsBefore) && activeBefore.length <= 1,
`versions=${Array.isArray(versionsBefore) ? versionsBefore.length : 'n/a'}, active=${activeBefore.length}`, blocker)
const sourcePath = process.env.ADMIN_TEST_PRICE_BOOK_FILE || DEFAULT_PRICE_BOOK_FILE
const sourcePath = process.env.ADMIN_TEST_PRICE_BOOK_FILE
let sourceBytes
try {
sourceBytes = await readFile(sourcePath)
} catch (error) {
context.addStep(module, '读取船期价格测试文件', null, false,
`path=${sourcePath}, error=${error instanceof Error ? error.message : String(error)}`, blocker)
finishScenario(context, module, scenario, start)
return
let sourceName
if (sourcePath) {
try {
sourceBytes = await readFile(sourcePath)
sourceName = basename(sourcePath)
} catch (error) {
context.addStep(module, '读取显式船期价格测试文件', null, false,
`path=${sourcePath}, error=${error instanceof Error ? error.message : String(error)}`, blocker)
finishScenario(context, module, scenario, start)
return
}
} else {
const activeFixture = activeBefore[0]
const sourceResponse = activeFixture?.id
? await context.requestBinary('GET', `${PRICE_BOOK_PATH}/${encodeURIComponent(activeFixture.id)}/source`)
: null
const zipMagic = sourceResponse?.bytes?.[0] === 0x50 && sourceResponse?.bytes?.[1] === 0x4b
const fixtureReady = sourceResponse?.http === 200 && sourceResponse.bytes?.length > 0 && zipMagic
context.addStep(module, '复用当前生效价格源作为本轮隔离上传夹具', sourceResponse, fixtureReady,
`activeVersionId=${activeFixture?.id || 'missing'}, bytes=${sourceResponse?.bytes?.length || 0}, zipMagic=${zipMagic}`, blocker)
if (!fixtureReady) {
finishScenario(context, module, scenario, start)
return
}
sourceBytes = sourceResponse.bytes
sourceName = activeFixture.originalFileName || `price-book-${activeFixture.id}.xlsx`
}
const sourceHash = sha256(sourceBytes)
const uploadName = `${context.marker}-${basename(sourcePath)}`
const uploadName = `${context.marker}-${sourceName}`
context.addStep(module, '船期价格测试文件已隔离', null,
sourceBytes.length > 0 && uploadName.includes(context.marker) && uploadName.toLowerCase().endsWith('.xlsx'),
`fileName=${uploadName}, bytes=${sourceBytes.length}, sha256=${sourceHash}`, blocker)