From 674d38a9a76badd8a8f45fa2a0a3b061003acea1 Mon Sep 17 00:00:00 2001 From: yeuimu <2197651308@qq.com> Date: Sun, 30 Aug 2026 03:15:18 +0800 Subject: [PATCH] =?UTF-8?q?fix(api,admin):=20stop=20test=20fixture=20junk?= =?UTF-8?q?=20leaking=20to=20shared=20dev=20DB;=20badge=20text=20x?= =?UTF-8?q?=E4=B8=AA=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 清理标签筛选里的「Upd {ts}-v2」空分组与原产品库树里的 「Tree Cat {ts}」垃圾分类——两者均为集成测试夹具残留: - tag-groups spec「改名」用例把分组改成 -v2 后缀,afterAll 按原名 删除永远漏掉它(累积 31 个空分组);修复:改名前把 v2 名一并登记 - origin-goods spec getTree 用例的 finally 先删 good,被 goodOriginGood 外键限制挡住且错误被 .catch 吞掉,分类/商品/国家/ 链接全部残留;修复:先删引用行再删 good - 已清库:31 个 Upd 空分组、Tree Cat 分类 + Tree Good 商品 + Tree Country 国家 + 2 条 tree-a/b 链接;复跑两 spec 复核零残留 左树一族一行徽标文案按用户反馈去掉「N 条链接」,仅显示「M 个配置」 (memberCount 字段保留在 DTO,悬浮弹层行为不变) 验证:tag-groups + origin-goods spec 13/13 绿且零残留;admin vue-tsc 干净 + vitest 22/22 --- apps/admin/src/views/goods/GoodsView.vue | 2 +- apps/api/src/origin-goods/origin-goods.service.spec.ts | 6 ++++-- apps/api/src/tag-groups/tag-groups.service.spec.ts | 3 ++- docs/references/product-center.md | 4 ++-- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/apps/admin/src/views/goods/GoodsView.vue b/apps/admin/src/views/goods/GoodsView.vue index 37bbff0..e1fab31 100644 --- a/apps/admin/src/views/goods/GoodsView.vue +++ b/apps/admin/src/views/goods/GoodsView.vue @@ -1180,7 +1180,7 @@ onMounted(() => loadAll()) popper-class="cfg-pop-popper" >
diff --git a/apps/api/src/origin-goods/origin-goods.service.spec.ts b/apps/api/src/origin-goods/origin-goods.service.spec.ts index 1e2f335..717e72c 100644 --- a/apps/api/src/origin-goods/origin-goods.service.spec.ts +++ b/apps/api/src/origin-goods/origin-goods.service.spec.ts @@ -1,7 +1,7 @@ import { Test } from '@nestjs/testing'; import { OriginGoodsService } from './origin-goods.service'; -import { FamilyRecomputeService } from '../product-families/family-recompute.service'; -import { ProductFamiliesService } from '../product-families/product-families.service'; +import { FamilyRecomputeService } from '../product-families/family-recompute.service'; +import { ProductFamiliesService } from '../product-families/product-families.service'; import { OrganizeService } from '../product-families/organize.service'; import { PrismaService } from '../prisma/prisma.service'; @@ -153,6 +153,8 @@ describe('OriginGoodsService', () => { expect(nodeB.configuredCount).toBeGreaterThanOrEqual(1); expect(nodeB.configuredCountries).toContain(`Tree Country ${stamp}`); } finally { + // 先删引用行,否则 good.delete 被外键限制挡住(错误被吞后分类/商品/国家全残留) + await prisma.goodOriginGood.deleteMany({ where: { goodId: good.id } }).catch(() => undefined); await prisma.good.delete({ where: { id: good.id } }).catch(() => undefined); await prisma.country.delete({ where: { id: country.id } }).catch(() => undefined); await prisma.category.delete({ where: { id: cat.id } }).catch(() => undefined); diff --git a/apps/api/src/tag-groups/tag-groups.service.spec.ts b/apps/api/src/tag-groups/tag-groups.service.spec.ts index a3b9fc3..c09ddef 100644 --- a/apps/api/src/tag-groups/tag-groups.service.spec.ts +++ b/apps/api/src/tag-groups/tag-groups.service.spec.ts @@ -50,7 +50,8 @@ describe('TagGroupsService', () => { it('updates group name and color', async () => { const name = `Upd ${Date.now()}`; - createdNames.push(name); + // 改名后的行也要纳入清理,否则 -v2 行会残留在共享开发库 + createdNames.push(name, `${name}-v2`); const g = await service.create({ groupName: name }); const updated = await service.update(g.id, { groupName: `${name}-v2`, diff --git a/docs/references/product-center.md b/docs/references/product-center.md index b30a67a..eaff6e5 100644 --- a/docs/references/product-center.md +++ b/docs/references/product-center.md @@ -174,8 +174,8 @@ curl -X POST /product-families/organize -H "$AUTH" # 后台「整理 拖拽到左侧分类/国家的路径同样被拦截(提示同款已配置、不允许重复配置); - 族分组头部计数与「仅未配置」筛选同样按族语义(族已配置 → 计入已配置)。 - **左树一族一行**(国家/品类模式):同款多条配置只显示排序最前的一条,名称旁常显 - 「N 条链接 · M 个配置」徽标(链接数=族成员数,配置数=该族官网商品数;单链接单配置也显示, - 避免漏看),悬浮列出全部配置(名称/国家·分类/打开),分组头部计数仍按全部商品统计。 + 「M 个配置」徽标(M=该族官网商品数;单配置也显示,避免漏看),悬浮列出全部配置 + (名称/国家·分类/打开),分组头部计数仍按全部商品统计。 - 人工改价/自动成族等族管理 API(`/product-families/*`)保留,供脚本或后续界面使用; - 页面组件化:`GoodsView.vue` 拆出 `components/` 下的 GoodsEditDialog(编辑弹窗)、 GoodsConfigDialog(配置弹窗)、CustomGoodDialog(自定义商品)、TagFilterPopover(标签筛选弹层)。