import assert from 'node:assert/strict' import test from 'node:test' import type { ConsignmentSpecField } from '../src/types/consignment.ts' import { formatLegacyConsignmentSpec, resolveConsignmentDisplayItemName, resolveConsignmentSpecDisplayItems, resolveConsignmentSpecTagItems, resolveConsignmentSpecText, resolveConsignmentSpecValueText, } from '../src/utils/consignment-spec-display.ts' function makeSpec( overrides: Partial & Pick, ): ConsignmentSpecField { return { type: 'text', required: false, options: [], placeholder: '', helpText: '', matchMode: 'exact', wildcardValues: [], showInItemName: false, sortOrder: 0, ...overrides, } } const productSpec = makeSpec({ key: 'product', label: '商品', type: 'select', required: true, sortOrder: 10, options: [ { label: '碎梦浮光珍宝礼盒', value: '15', enabled: true }, { label: '指挥官密钥', value: '9', enabled: true }, ], }) const systemSpec = makeSpec({ key: 'system', label: '系统', type: 'select', sortOrder: 1, options: [ { label: '苹果', value: 'ios', enabled: true }, { label: '安卓', value: 'android', enabled: true }, ], }) const levelSpec = makeSpec({ key: 'diamondLevel', label: '钻石等级', type: 'number', sortOrder: 2, }) test('动态规格:选项值映射成选项名称(密钥分类 product=15)', () => { const items = resolveConsignmentSpecDisplayItems([productSpec], { product: '15' }) assert.deepEqual(items, [{ key: 'product', label: '商品', value: '碎梦浮光珍宝礼盒' }]) }) test('动态规格:按模板 sortOrder 排序,空值不展示', () => { const items = resolveConsignmentSpecDisplayItems([productSpec, levelSpec, systemSpec], { product: '15', system: 'ios', diamondLevel: '', }) assert.deepEqual( items.map((item) => item.key), ['system', 'product'], ) assert.equal(items[0]?.value, '苹果') }) test('动态规格:没有模板字段时返回空数组', () => { assert.deepEqual(resolveConsignmentSpecDisplayItems([], { product: '15' }), []) assert.deepEqual(resolveConsignmentSpecDisplayItems(undefined, undefined), []) }) test('规格文本:后端 specText 优先', () => { assert.equal( resolveConsignmentSpecText({ specText: '商品 碎梦浮光珍宝礼盒', specs: [productSpec], specValues: { product: '9' }, }), '商品 碎梦浮光珍宝礼盒', ) }) test('规格文本:无 specText 时按模板现拼', () => { assert.equal( resolveConsignmentSpecText({ specs: [productSpec], specValues: { product: '15' } }), '商品 碎梦浮光珍宝礼盒', ) }) test('规格文本:没有模板规格时回退旧列,0 璀璨不展示', () => { assert.equal( resolveConsignmentSpecText({ system: '苹果', serverZone: '微信区', series: '暗潮', diamondLevel: 3, brillianceCount: 2, }), '苹果 / 微信区 / 暗潮 / 3钻 / 2璀璨', ) assert.equal(formatLegacyConsignmentSpec({ diamondLevel: 1, brillianceCount: 0 }), '1钻') assert.equal(resolveConsignmentSpecText({}), '-') }) const diamondSpec = makeSpec({ key: 'diamondLevel', label: '钻石等级', type: 'select', sortOrder: 2, options: [ { label: '3钻', value: '3', enabled: true }, { label: '4钻', value: '4', enabled: true }, ], }) const brillianceSpec = makeSpec({ key: 'brillianceCount', label: '璀璨数', type: 'select', sortOrder: 3, options: [ { label: '无', value: '0', enabled: true }, { label: '1璀璨', value: '1', enabled: true }, { label: '2璀璨', value: '2', enabled: true }, ], }) test('列表规格标签:只保留值,0 璀璨不占标签位', () => { const zero = resolveConsignmentSpecTagItems([systemSpec, diamondSpec, brillianceSpec], { system: 'ios', diamondLevel: '4', brillianceCount: '0', }) assert.deepEqual( zero.map((item) => item.value), ['苹果', '4钻'], ) const withBrilliance = resolveConsignmentSpecTagItems([systemSpec, diamondSpec, brillianceSpec], { system: 'ios', diamondLevel: '4', brillianceCount: '2', }) assert.deepEqual( withBrilliance.map((item) => item.value), ['苹果', '4钻', '2璀璨'], ) }) test('列表规格纯值文本:不含字段名,0 璀璨省略', () => { assert.equal( resolveConsignmentSpecValueText( { specs: [systemSpec, diamondSpec, brillianceSpec], specValues: { system: 'ios', diamondLevel: '4', brillianceCount: '0' }, }, { omitZeroBrilliance: true }, ), '苹果 / 4钻', ) assert.equal( resolveConsignmentSpecValueText( { specs: [systemSpec, diamondSpec, brillianceSpec], specValues: { system: 'ios', diamondLevel: '4', brillianceCount: '1' }, }, { omitZeroBrilliance: true }, ), '苹果 / 4钻 / 1璀璨', ) // 没有动态规格的历史提报/库存回退旧字段,本身就是纯值 assert.equal( resolveConsignmentSpecValueText({ system: '苹果', serverZone: '微信区', series: '暗潮', diamondLevel: 3, brillianceCount: 2, }), '苹果 / 微信区 / 暗潮 / 3钻 / 2璀璨', ) }) test('列表物品名:0 璀璨的历史断尾单位只在展示层清掉', () => { assert.equal( resolveConsignmentDisplayItemName({ itemName: '安卓暗潮2钻璀璨 苏尔南', brillianceCount: 0, }), '安卓暗潮2钻 苏尔南', ) assert.equal( resolveConsignmentDisplayItemName({ itemName: '安卓暗潮2钻0璀璨 苏尔南', brillianceCount: 0, }), '安卓暗潮2钻 苏尔南', ) assert.equal( resolveConsignmentDisplayItemName({ itemName: '苹果血宴1钻1璀璨 苏尔南', brillianceCount: 1, }), '苹果血宴1钻1璀璨 苏尔南', ) // 系列名本身含「璀璨」时不能误删 assert.equal( resolveConsignmentDisplayItemName({ itemName: '璀璨系列2钻 苏尔南', brillianceCount: 0, }), '璀璨系列2钻 苏尔南', ) })