2026-08-29 11:10:28 +08:00
|
|
|
import test from 'node:test'
|
|
|
|
|
import assert from 'node:assert/strict'
|
|
|
|
|
import { readFile } from 'node:fs/promises'
|
|
|
|
|
|
|
|
|
|
test('同柜不可拆组HTTP验收锁定公开接口与防绕过矩阵', async () => {
|
|
|
|
|
const source = await readFile(new URL('./coload-groups.mjs', import.meta.url), 'utf8')
|
|
|
|
|
for (const fragment of [
|
|
|
|
|
'/api/platform/v1/first-leg/coload-groups',
|
|
|
|
|
'/api/platform/v1/first-leg/coload-groups/batch-query',
|
|
|
|
|
'/group-assignments',
|
|
|
|
|
'/inbound-assignments',
|
|
|
|
|
'/push-preload',
|
|
|
|
|
'创建同键同载荷精确重放',
|
|
|
|
|
'创建同键异载荷返回并发冲突',
|
2026-08-30 15:55:48 +08:00
|
|
|
'不同目的仓港仍可创建同柜不可拆组',
|
|
|
|
|
'跨国内仓或跨渠道创建整组被拒绝且不落组',
|
|
|
|
|
'批查只返回组内订单且长ID保持字符串',
|
|
|
|
|
'/recommend',
|
|
|
|
|
'智能推荐容量足够时整组全取',
|
|
|
|
|
'智能推荐不会只取同柜组部分成员或部分箱数',
|
2026-08-29 11:10:28 +08:00
|
|
|
'组成员不能单独调整箱数',
|
|
|
|
|
'组成员不能单独删除',
|
|
|
|
|
'整组原子移除',
|
2026-08-29 11:59:11 +08:00
|
|
|
'目标同柜组整体超容时智能推荐明确拒绝',
|
|
|
|
|
'整组容量不足时推荐事务零漂移',
|
2026-08-29 11:42:52 +08:00
|
|
|
'推荐候选仅含当前目标同柜组且成员身份精确',
|
|
|
|
|
'ACTIVE同柜组整组取消成功',
|
|
|
|
|
'同柜组PDA原子批次记录部分拣货异常',
|
|
|
|
|
'同柜组任一成员短拣时完成被拒绝',
|
|
|
|
|
'短拣完成拒绝后任务、父子树和组锁零漂移',
|
|
|
|
|
'同柜组足量完成命令可靠受理',
|
2026-08-29 11:59:11 +08:00
|
|
|
'足量完成整组已消费、全部入库完成且不生成余量子单',
|
2026-08-29 11:42:52 +08:00
|
|
|
'未成组普通单推送预装不回归',
|
|
|
|
|
'未成组普通单仍按既有规则生成唯一余量子单',
|
2026-08-30 15:55:48 +08:00
|
|
|
'拆分余量子单仍可与同仓同渠道订单创建同柜组',
|
|
|
|
|
'拆分身份不影响当前WAIT_SPLIT片段完整纳组',
|
|
|
|
|
'拆分余量建组不改写既有父子数量事实',
|
2026-08-29 11:10:28 +08:00
|
|
|
]) assert.match(source, new RegExp(fragment.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')))
|
2026-08-30 15:55:48 +08:00
|
|
|
|
|
|
|
|
assert.doesNotMatch(source, /跨仓库渠道或目的仓港创建整组被拒绝/)
|
|
|
|
|
assert.doesNotMatch(source, /已有父子拆分订单创建同柜组被拒绝/)
|
2026-08-29 11:10:28 +08:00
|
|
|
})
|