import assert from 'node:assert/strict' import { readFileSync } from 'node:fs' import test from 'node:test' /** * 寄卖规格口径(2026-09 定案): * - 操作后台全量:系统 苹果/安卓/通用,区服 微信区/QQ区/互通; * - 打手端发布按物品类型展示:苏尔南 = 系统二选一(苹果/安卓,不给通用), * 区服固定「互通」且默认选中(互通 = QQ/微信都能收); * - 「互通」是区服通配值(互通现货匹配微信/QQ 订单,反之亦然), * 订单文案里的「通用/全区/不限」由后端归一化成通配别名。 */ test('后台全量选项:系统含通用,区服含互通', () => { const source = readFileSync( new URL('../src/utils/consignment-spec.ts', import.meta.url).pathname, 'utf8', ) assert.ok(source.includes("{ label: '通用', value: '通用' }"), '系统全量选项必须含「通用」') assert.ok(source.includes("value: '互通'"), '区服选项必须包含「互通」') }) test('苏尔南默认配置:取消代码内置字段,由迁移 144 提供五个单选字段', () => { const utils = readFileSync( new URL('../src/utils/consignment-spec.ts', import.meta.url).pathname, 'utf8', ) assert.ok(!utils.includes('SURNAN_PUBLISH_SYSTEM_OPTIONS'), '前端不再写死苏尔南发布选项') assert.ok(!utils.includes('DEFAULT_SPEC_FIELDS'), '前端不再内置默认 5 个字段') assert.ok(utils.includes('SPEC_FIELD_TYPE_OPTIONS'), '字段类型选项必须集中维护') }) test('打手端发布表单:按寄卖配置动态渲规格,不再回退内置字段', () => { const source = readFileSync( new URL('../src/pages/worker/WorkerConsignmentPage.tsx', import.meta.url).pathname, 'utf8', ) assert.ok(source.includes('selectedSpecs.map'), '规格字段必须来自配置动态渲染') assert.ok(source.includes('config.specs'), '必须读取寄卖配置的 specs') assert.ok(!source.includes('DEFAULT_SPEC_FIELDS'), '空配置不能回退内置 5 项') assert.ok(source.includes('fetchWorkerConsignmentPricePreview'), '价格必须走动态预览接口') assert.ok(source.includes('buildSpecItemName'), '物品名必须按名称模板生成') assert.ok(!source.includes('[...CONSIGNMENT_'), '发布端不直接引用后台全量选项') }) test('客服端两个表单(提报审核 / 库存编辑)用后台全量选项,不再自由填写', () => { for (const file of ['ConsignmentSubmissionsPanel.tsx', 'ConsignmentInventoryPanel.tsx']) { const source = readFileSync( new URL(`../src/pages/admin/panels/${file}`, import.meta.url).pathname, 'utf8', ) assert.ok(source.includes('CONSIGNMENT_SYSTEM_OPTIONS'), `${file} 应引用全量系统选项`) assert.ok(source.includes('CONSIGNMENT_ZONE_OPTIONS'), `${file} 应引用全量区服选项`) } })