文件
shanghaipeiwan/server/tests/expert-service-crud.spec.ts
xcbyy 500aac306e feat(expert): 大神服务包自助维护(新增/编辑/删除/上下架)+ 去掉演示服务包
- 后端:新增 POST/PUT/DELETE /api/companions/:id/services[...](仅本人大神或管理员),含名称/单价区间(平台定价规范)/长度/内容安全/每人20个上限校验
- 仓储:createExpertService/updateExpertService/deleteExpertService/countExpertServices/getCompanionByUserId;移除"首次读取自动生成 3 个演示服务包",并在建表后一次性清理历史演示数据
- 新增 GET /api/expert/me:工作台按登录用户解析真实大神档案(不再固定演示 id 101)
- 小程序:api.js 增加 getMyExpertProfile/createExpertService/updateExpertService/deleteExpertService;工作台新增「新增服务」入口、每项「编辑/删除」按钮与服务包表单弹窗,收益/服务统计改用真实大神 id
- 新增回归护栏 expert-service-crud.spec.ts(93 套件/662 用例全绿);冒烟 9/9(含跨大神越权 403、低价 400)
2026-10-19 14:46:05 +08:00

49 行
2.3 KiB
TypeScript

// 已读取AGENTS.md
import * as fs from 'fs';
import * as path from 'path';
/**
* 第七十七批:大神服务包自助维护(新增/编辑/删除 + 校验)+ 去演示服务包。
*/
describe('第七十七批大神服务包自助维护闸门', () => {
const root = path.resolve(__dirname, '../../');
const indexCode = fs.readFileSync(path.join(root, 'server/src/index.ts'), 'utf-8');
const repo = fs.readFileSync(path.join(root, 'server/src/db/repository.ts'), 'utf-8');
const api = fs.readFileSync(path.join(root, 'pwuniapp/common/api.js'), 'utf-8');
const workspace = fs.readFileSync(path.join(root, 'pwuniapp/pages/expert/workspace.vue'), 'utf-8');
it('仓储提供真实 CRUD 与按用户解析大神', () => {
expect(repo).toContain('async createExpertService(');
expect(repo).toContain('async updateExpertService(');
expect(repo).toContain('async deleteExpertService(');
expect(repo).toContain('async countExpertServices(');
expect(repo).toContain('async getCompanionByUserId(');
});
it('不再自动生成演示服务包', () => {
expect(repo).not.toContain('排位保星连胜局');
expect(repo).not.toContain('娱乐匹配快乐唠嗑局');
expect(repo).not.toContain('英雄技术单项教学指导');
});
it('后端提供新增/编辑/删除路由与校验', () => {
expect(indexCode).toContain("app.post('/api/companions/:id/services'");
expect(indexCode).toContain("app.put('/api/companions/:id/services/:serviceId'");
expect(indexCode).toContain("app.delete('/api/companions/:id/services/:serviceId'");
expect(indexCode).toContain('validateExpertServicePayload');
expect(indexCode).toContain('SERVICE_MAX_PER_EXPERT');
expect(indexCode).toContain("app.get('/api/expert/me'");
});
it('小程序工作台具备自助维护入口并解析真实大神 id', () => {
expect(api).toContain('export async function createExpertService(');
expect(api).toContain('export async function updateExpertService(');
expect(api).toContain('export async function deleteExpertService(');
expect(api).toContain('export async function getMyExpertProfile(');
expect(workspace).toContain('currentExpertId');
expect(workspace).toContain('openServiceForm');
expect(workspace).toContain('removeService');
expect(workspace).toContain('getMyExpertProfile');
});
});