feat(public): dedupe merged variants and merge specs/options from secondary origins
This commit is contained in:
@@ -413,5 +413,84 @@ describe('PublicService', () => {
|
||||
await prisma.originGood.delete({ where: { id: secondary.id } }).catch(() => undefined);
|
||||
}
|
||||
});
|
||||
|
||||
it('dedupes variants by color+size (primary wins) and merges specs/options', async () => {
|
||||
const stamp2 = `${stamp}-merge2`;
|
||||
const primaryOg = await prisma.originGood.create({
|
||||
data: { sdsGoodId: `pub-pri-${stamp2}`, goodName: `Pub Pri ${stamp2}` },
|
||||
});
|
||||
const secondaryOg = await prisma.originGood.create({
|
||||
data: { sdsGoodId: `pub-sec-${stamp2}`, goodName: `Pub Sec ${stamp2}` },
|
||||
});
|
||||
// Primary: Black|S and Black|M, size chart S/M, package S, options S/M.
|
||||
await prisma.originGoodVariant.createMany({
|
||||
data: [
|
||||
{ originGoodId: primaryOg.id, sdsVariantId: `v1-${stamp2}`, sku: `SK1-${stamp2}`, colorName: 'Black', sizeName: 'S', price: 16 },
|
||||
{ originGoodId: primaryOg.id, sdsVariantId: `v2-${stamp2}`, sku: `SK2-${stamp2}`, colorName: 'black', sizeName: 'M', price: 16 },
|
||||
],
|
||||
});
|
||||
await prisma.originGoodDetail.create({
|
||||
data: {
|
||||
originGoodId: primaryOg.id,
|
||||
sizeChart: { rows: [{ sizeName: 'S', measurements: [{ key: 'chest', cm: '94' }] }, { sizeName: 'M', measurements: [{ key: 'chest', cm: '100' }] }] },
|
||||
packageSpecs: { rows: [{ sizeName: 'S' }] },
|
||||
options: { sizes: [{ name: 'S' }, { name: 'M' }] },
|
||||
},
|
||||
});
|
||||
// Secondary: duplicate Black|S with a DIFFERENT price (must be dropped,
|
||||
// primary wins), plus a unique color Kelly|S; specs add XXXL rows.
|
||||
await prisma.originGoodVariant.createMany({
|
||||
data: [
|
||||
{ originGoodId: secondaryOg.id, sdsVariantId: `v3-${stamp2}`, sku: `SK3-${stamp2}`, colorName: 'Black', sizeName: 'S', price: 20 },
|
||||
{ originGoodId: secondaryOg.id, sdsVariantId: `v4-${stamp2}`, sku: `SK4-${stamp2}`, colorName: 'Kelly', sizeName: 'S', price: 22 },
|
||||
],
|
||||
});
|
||||
await prisma.originGoodDetail.create({
|
||||
data: {
|
||||
originGoodId: secondaryOg.id,
|
||||
sizeChart: { rows: [{ sizeName: 'XXXL', measurements: [{ key: 'chest', cm: '120' }] }] },
|
||||
packageSpecs: { rows: [{ sizeName: 'M' }, { sizeName: 'XXXL' }] },
|
||||
options: { sizes: [{ name: 'XXXL' }] },
|
||||
},
|
||||
});
|
||||
const mergedGood = await prisma.good.create({
|
||||
data: {
|
||||
goodName: `Pub Merged ${stamp2}`,
|
||||
originGoodId: primaryOg.id,
|
||||
countryId,
|
||||
categoryId,
|
||||
},
|
||||
});
|
||||
await prisma.goodOriginGood.create({
|
||||
data: { goodId: mergedGood.id, originGoodId: secondaryOg.id },
|
||||
});
|
||||
|
||||
try {
|
||||
const detail = await service.getGood(`pub-pri-${stamp2}`);
|
||||
// Variants: 3 unique color+size combos (case-insensitive); duplicate
|
||||
// Black|S from the secondary deduped.
|
||||
expect(
|
||||
detail.variants.map((v) => `${v.colorName}/${v.sizeName}`.toLowerCase()).sort(),
|
||||
).toEqual(['black/m', 'black/s', 'kelly/s']);
|
||||
const blackS = detail.variants.find((v) => v.colorName === 'Black' && v.sizeName === 'S');
|
||||
expect(blackS!.price).toBe('16'); // primary price wins over secondary 20
|
||||
// Size chart: S/M from primary, XXXL appended from secondary.
|
||||
const chartSizes = (detail.sizeChart as any).rows.map((r: any) => r.sizeName).sort();
|
||||
expect(chartSizes).toEqual(['M', 'S', 'XXXL']);
|
||||
// Package specs: S from primary, M/XXXL appended from secondary.
|
||||
const pkgSizes = (detail.packageSpecs as any).rows.map((r: any) => r.sizeName).sort();
|
||||
expect(pkgSizes).toEqual(['M', 'S', 'XXXL']);
|
||||
// Options: sizes unioned S/M + XXXL.
|
||||
const optSizes = (detail.options as any).sizes.map((s: any) => s.name).sort();
|
||||
expect(optSizes).toEqual(['M', 'S', 'XXXL']);
|
||||
} finally {
|
||||
await prisma.goodOriginGood.deleteMany({ where: { goodId: mergedGood.id } });
|
||||
await prisma.good.delete({ where: { id: mergedGood.id } });
|
||||
await prisma.originGoodVariant.deleteMany({ where: { originGoodId: { in: [primaryOg.id, secondaryOg.id] } } });
|
||||
await prisma.originGoodDetail.deleteMany({ where: { originGoodId: { in: [primaryOg.id, secondaryOg.id] } } });
|
||||
await prisma.originGood.delete({ where: { id: primaryOg.id } });
|
||||
await prisma.originGood.delete({ where: { id: secondaryOg.id } }).catch(() => undefined);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user