227 lines
6.1 KiB
TypeScript
227 lines
6.1 KiB
TypeScript
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<ConsignmentSpecField> & Pick<ConsignmentSpecField, 'key' | 'label'>,
|
||
): 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钻 苏尔南',
|
||
)
|
||
})
|