左栏商品名显示成光款号(如 PLTK016)的根因是双层解析不一致:api 写路径按 首括号对解析产出「童装…(DTG180) PLTK016」,admin 展示解析按末括号取品名 误显示成 PLTK016。 - admin parseLinkName 对齐 api 首括号对解析 + 无 SKU 段中文品名守卫, cleanLinkName 剥离 ASCII 型号限定词(中文括号内容保留) - api 新增 cleanGoodDisplayName/describePureSkuGoodName,接入 create/update/ batchCreate(batchCreate 补上缺失的 normalize);纯款号按 SDS 分类名补描述 - 新增幂等存量修复脚本 fix:good-names(默认 dry-run,--apply 写库) - 已执行:V2 栈 34 条限定词名、V1 栈 213 条原始链接名规范化,复跑幂等 0 Tests: api 22 suites/199 passed, admin 27 passed, tsc clean
162 lines
6.2 KiB
TypeScript
162 lines
6.2 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
||
import {
|
||
cleanLinkName,
|
||
deriveLinkTagNames,
|
||
linkDims,
|
||
parseLinkName,
|
||
sameOriginGroup,
|
||
truncateToProcess,
|
||
} from './origin-name';
|
||
|
||
describe('truncateToProcess', () => {
|
||
it('keeps first 3 dash segments (drops warehouse)', () => {
|
||
expect(truncateToProcess('美国(包邮)180g纯棉T恤成人款-DG001-单面印花-美西洛杉矶一仓'))
|
||
.toBe('美国(包邮)180g纯棉T恤成人款-DG001-单面印花');
|
||
});
|
||
it('is identity for 3-segment names', () => {
|
||
expect(truncateToProcess('美国(不包邮)230g水洗炒雪花T恤-KRHM003-直喷双面'))
|
||
.toBe('美国(不包邮)230g水洗炒雪花T恤-KRHM003-直喷双面');
|
||
});
|
||
it('handles malformed names without country prefix', () => {
|
||
expect(truncateToProcess('(不包邮)230g水洗炒雪花T恤-FRTM001-双面印花'))
|
||
.toBe('(不包邮)230g水洗炒雪花T恤-FRTM001-双面印花');
|
||
});
|
||
it('returns empty for null/empty', () => {
|
||
expect(truncateToProcess(null)).toBe('');
|
||
expect(truncateToProcess('')).toBe('');
|
||
});
|
||
});
|
||
|
||
describe('sameOriginGroup', () => {
|
||
it('matches same product across warehouses', () => {
|
||
expect(sameOriginGroup(
|
||
'美国(包邮)180g纯棉T恤成人款-DG001-单面印花-美西洛杉矶一仓',
|
||
'美国(包邮)180g纯棉T恤成人款-DG001-单面印花-美中亚特兰大仓',
|
||
)).toBe(true);
|
||
});
|
||
it('does not match different SKU', () => {
|
||
expect(sameOriginGroup(
|
||
'美国(包邮)180g纯棉T恤成人款-DG001-单面印花',
|
||
'美国(包邮)180g纯棉T恤成人款-DG002-单面印花',
|
||
)).toBe(false);
|
||
});
|
||
it('does not match different country', () => {
|
||
expect(sameOriginGroup(
|
||
'美国(包邮)T恤-DG001-单面印花',
|
||
'德国(不包邮)T恤-DG001-单面印花',
|
||
)).toBe(false);
|
||
});
|
||
it('does not match empty names', () => {
|
||
expect(sameOriginGroup(null, 'x-y-z')).toBe(false);
|
||
expect(sameOriginGroup('', '')).toBe(false);
|
||
});
|
||
});
|
||
|
||
describe('parseLinkName / cleanLinkName', () => {
|
||
it('parses 国家(物流)品名-SKU-工艺 → 品名 + 型号', () => {
|
||
expect(parseLinkName('美国(包邮)180g纯棉T恤成人款-DG001-单面印花')).toEqual({
|
||
productName: '180g纯棉T恤成人款',
|
||
skuCode: 'DG001',
|
||
});
|
||
expect(cleanLinkName('美国(包邮)180g纯棉T恤成人款-DG001-单面印花')).toBe(
|
||
'180g纯棉T恤成人款 DG001',
|
||
);
|
||
});
|
||
|
||
it('handles half-width parens and warehouse suffix', () => {
|
||
expect(
|
||
cleanLinkName('美国(不包邮光板)180GT恤成人款-JSA002-不打印·美西洛杉矶二仓'),
|
||
).toBe('180GT恤成人款 JSA002');
|
||
});
|
||
|
||
it('returns null / raw fallback for manual names without the country(remark) structure', () => {
|
||
expect(parseLinkName('180g纯棉T恤成人款')).toBeNull();
|
||
expect(cleanLinkName('180g纯棉T恤成人款')).toBe('180g纯棉T恤成人款');
|
||
expect(cleanLinkName(null)).toBe('');
|
||
});
|
||
|
||
it('returns null when product name after parens is empty', () => {
|
||
expect(parseLinkName('美国(包邮)-DG001-单面印花')).toBeNull();
|
||
});
|
||
});
|
||
|
||
describe('已规范化的「品名(型号限定词) SKU」防误解析 + 限定词剥离', () => {
|
||
it('品名内含(限定词)的已规范化名不再解析(否则展示会变成光款号)', () => {
|
||
expect(parseLinkName('童装纯色插肩短袖T恤(DTG180) PLTK016')).toBeNull();
|
||
expect(parseLinkName('牛奶丝T恤(女款) DG601')).toBeNull();
|
||
expect(parseLinkName('180G纯棉T恤 (JSA002) DG001')).toBeNull();
|
||
});
|
||
|
||
it('cleanLinkName 对已规范化名剥离 ASCII 型号限定词', () => {
|
||
expect(cleanLinkName('童装纯色插肩短袖T恤(DTG180) PLTK016')).toBe(
|
||
'童装纯色插肩短袖T恤 PLTK016',
|
||
);
|
||
expect(cleanLinkName('180G纯棉T恤 (JSA002) DG001')).toBe('180G纯棉T恤 DG001');
|
||
});
|
||
|
||
it('原始链接名品名内含限定词时,解析后一并剥离', () => {
|
||
expect(
|
||
cleanLinkName('波兰(包邮)童装纯色插肩短袖T恤(DTG180)-PLTK016-双面印花'),
|
||
).toBe('童装纯色插肩短袖T恤 PLTK016');
|
||
});
|
||
|
||
it('中文括号内容(如(女款))不剥离', () => {
|
||
expect(cleanLinkName('牛奶丝T恤(女款) DG601')).toBe('牛奶丝T恤(女款) DG601');
|
||
});
|
||
|
||
it('无 SKU 段的单段链接名仍按首括号对解析(与 api 端一致)', () => {
|
||
expect(parseLinkName('波兰(包邮)童装T恤')).toEqual({
|
||
productName: '童装T恤',
|
||
skuCode: null,
|
||
});
|
||
});
|
||
});
|
||
|
||
describe('deriveLinkTagNames', () => {
|
||
it('单面印花 + 包邮 + 无工艺关键字 → 单面印花/烫画/包邮', () => {
|
||
expect(deriveLinkTagNames('美国(包邮)180g纯棉T恤成人款-DG001-单面印花')).toEqual([
|
||
'单面印花',
|
||
'烫画',
|
||
'包邮',
|
||
]);
|
||
});
|
||
|
||
it('不打印 + 光板 + 不包邮 → 归并为单个不打印(光板即不打印)', () => {
|
||
expect(
|
||
deriveLinkTagNames('美国(不包邮光板)180GT恤成人款-JSA002-不打印·美西洛杉矶二仓'),
|
||
).toEqual(['不打印', '不包邮']);
|
||
});
|
||
|
||
it('双面印花 + 不包邮,且不误命中包邮', () => {
|
||
expect(deriveLinkTagNames('美国(不包邮)T恤-DG001-双面印花·美东新泽西仓')).toEqual([
|
||
'双面印花',
|
||
'烫画',
|
||
'不包邮',
|
||
]);
|
||
});
|
||
|
||
it('空名称返回空数组', () => {
|
||
expect(deriveLinkTagNames(null)).toEqual([]);
|
||
});
|
||
});
|
||
|
||
describe('linkDims', () => {
|
||
it('解析物流备注/工艺/印花数量', () => {
|
||
expect(linkDims('美国(包邮)180g纯棉T恤成人款-DG001-单面印花')).toEqual({
|
||
logistics: '包邮',
|
||
crafts: ['烫画'],
|
||
printCount: '单面印花',
|
||
});
|
||
expect(linkDims('美国(不包邮光板)180GT恤成人款-JSA002-不打印·美西洛杉矶二仓')).toEqual({
|
||
logistics: '不包邮光板',
|
||
crafts: ['不打印'],
|
||
printCount: null,
|
||
});
|
||
});
|
||
|
||
it('无括号结构时物流为 null,手工名称工艺默认烫画', () => {
|
||
expect(linkDims('纯棉T恤')).toEqual({ logistics: null, crafts: ['烫画'], printCount: null });
|
||
expect(linkDims(null)).toEqual({ logistics: null, crafts: [], printCount: null });
|
||
});
|
||
});
|