Files
order_site/apps/backend/src/services/fulfillment/fulfillment-truth-model.test.ts
T

90 lines
3.9 KiB
TypeScript

import assert from 'node:assert/strict'
import { readFileSync } from 'node:fs'
import test from 'node:test'
const migration = readFileSync(
new URL('../../db/migrations/141_fulfillment_shadow_model.sql', import.meta.url),
'utf8',
)
const auditScript = readFileSync(
new URL('../../../scripts/audit-fulfillment-state.ts', import.meta.url),
'utf8',
)
const configSyncMigration = readFileSync(
new URL('../../db/migrations/144_fulfillment_shadow_configuration_sync.sql', import.meta.url),
'utf8',
)
const routeCutoverMigration = readFileSync(
new URL('../../db/migrations/147_internal_sku_product_routing.sql', import.meta.url),
'utf8',
)
const truthCutoverMigration = readFileSync(
new URL('../../db/migrations/148_fulfillment_execution_truth.sql', import.meta.url),
'utf8',
)
const insertSkuMigration = readFileSync(
new URL('../../db/migrations/148_fulfillment_execution_truth.sql', import.meta.url),
'utf8',
)
test('正式履约模型包含履约、尝试和异常三张表', () => {
assert.ok(migration.includes('CREATE TABLE IF NOT EXISTS fulfillments'))
assert.ok(migration.includes('CREATE TABLE IF NOT EXISTS fulfillment_attempts'))
assert.ok(migration.includes('CREATE TABLE IF NOT EXISTS fulfillment_issues'))
assert.ok(migration.includes('uq_fulfillment_attempts_current_unit'))
assert.ok(migration.includes('UNIQUE (fulfillment_id, issue_code)'))
})
test('迁移 148 删除影子双写并直接维护正式履约真源', () => {
assert.ok(
truthCutoverMigration.includes('DROP TRIGGER IF EXISTS trg_order_items_fulfillment_shadow'),
)
assert.ok(
truthCutoverMigration.includes('DROP FUNCTION IF EXISTS sync_fulfillment_shadow(BIGINT)'),
)
assert.ok(truthCutoverMigration.includes('CREATE TRIGGER trg_fulfillments_state_event'))
assert.ok(truthCutoverMigration.includes('CREATE TRIGGER trg_fulfillment_tasks_attempt'))
assert.ok(truthCutoverMigration.includes('CREATE TRIGGER trg_work_orders_attempt'))
assert.ok(truthCutoverMigration.includes('CREATE VIEW v_order_item_current'))
})
test('人工配置和路由变化直接刷新正式履约投影', () => {
assert.ok(truthCutoverMigration.includes('trg_manual_config_refresh_fulfillments'))
assert.ok(truthCutoverMigration.includes('trg_sku_route_refresh_fulfillments'))
assert.ok(truthCutoverMigration.includes('refresh_fulfillment_derived'))
assert.ok(
routeCutoverMigration.includes('DROP TRIGGER IF EXISTS trg_internal_sku_channel_shadow'),
)
})
test('人工履约配置不能关联其他来源商品', () => {
assert.ok(configSyncMigration.includes('trg_manual_config_product_source'))
assert.ok(configSyncMigration.includes("product.canonical_sku LIKE 'man:%'"))
assert.ok(configSyncMigration.includes("ERRCODE = '23514'"))
assert.ok(configSyncMigration.includes('BEFORE INSERT OR UPDATE ON manual_fulfillment_configs'))
assert.ok(configSyncMigration.includes('config.enabled = TRUE'))
assert.ok(configSyncMigration.includes("SET status = 'active'"))
})
test('履约读模型直接投影正式表,订单项旧列冻结', () => {
assert.ok(
truthCutoverMigration.includes('RENAME COLUMN fulfillment_status TO legacy_fulfillment_status'),
)
assert.ok(
truthCutoverMigration.includes(
'RENAME COLUMN canonical_product_id TO legacy_canonical_product_id',
),
)
assert.ok(truthCutoverMigration.includes('FROM fulfillments fulfillment'))
assert.ok(truthCutoverMigration.includes('FROM fulfillment_attempts attempt'))
assert.ok(insertSkuMigration.includes('COALESCE(resolve_internal_sku'))
})
test('审计脚本核对正式履约、执行尝试、开放异常和事件关联', () => {
assert.ok(auditScript.includes('正式履约缺失'))
assert.ok(auditScript.includes('正式履约状态差异'))
assert.ok(auditScript.includes('执行尝试缺失'))
assert.ok(auditScript.includes('开放异常缺失'))
assert.ok(auditScript.includes('履约事件未关联正式记录'))
})