文件
shanghaipeiwan/server/tests/null-service-guard.spec.ts
xcbyy 16f6419cba refactor(data): 全面移除小程序写死的演示/兜底数据,测试数据统一落库
- 删除无引用的 common/mock.js;登录页与个人中心的演示账号改为 DB 配置 demo_accounts + /api/auth/demo-accounts、/api/auth/demo-login(签发真实 token)

- 移除订单/活动/大神/动态/推广/工作台/门票/充值/举报等页面的演示列表与假兜底;新增真实空态

- 修复伪造成功:活动调价、评价回复、核销、海报保存、图片上传失败、提现/核销固定 1001、随机开黑房号、随机即时匹配、假语音播放等

- 服务端移除 101/2006 合成用户与合成大神兜底、移除默认服务包虚构价格;演示账号清单可在后台关闭

- 111 套件/733 用例全绿;已部署 20261021_162041,demo-accounts/demo-login 实测通过
2026-10-21 16:21:10 +08:00

36 行
1.7 KiB
TypeScript

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

// 已读取AGENTS.md
import * as fs from 'fs';
import * as path from 'path';
/**
* 第八十二批:服务包为空时的空指针防护。
* 背景:移除"系统自动生成演示服务包"后,大神可能没有任何服务包,
* 下单页模板直接取 selectedService.title 会崩(Cannot read properties of null)。
*/
describe('第八十二批服务包空值防护闸门', () => {
const root = path.resolve(__dirname, '../../');
const createPage = fs.readFileSync(path.join(root, 'pwuniapp/pages/order/create.vue'), 'utf-8');
const detailPage = fs.readFileSync(path.join(root, 'pwuniapp/pages/expert/detail.vue'), 'utf-8');
it('下单页提供 serviceView 安全视图,模板不再直接解引用 selectedService', () => {
expect(createPage).toContain('const serviceView = computed(');
expect(createPage).toContain('{{ serviceView.title }}');
expect(createPage).toContain('{{ serviceView.price }}');
expect(createPage).toContain('{{ serviceView.unit }}');
expect(createPage).not.toContain('selectedService.title');
expect(createPage).not.toContain('selectedService.price');
expect(createPage).not.toContain('selectedService.unit');
});
it('下单页在无服务包时必须阻止下单,不得伪造基础服务', () => {
expect(createPage).not.toContain("id: 'base'");
expect(createPage).toContain('该大神暂未配置服务包,无法下单');
expect(createPage).toContain('Array.isArray(liveExpert.services) ? liveExpert.services : []');
});
it('详情页取 services[0] 前先判空,并提供空态提示', () => {
expect(detailPage).toContain('expert.value.services && expert.value.services.length > 0');
expect(detailPage).toContain('该大神暂未配置服务项目');
});
});