import * as fs from 'fs'; import * as path from 'path'; import { BaseController } from '@cool-midway/core'; import { CardInfoEntity } from '../../../src/modules/card/entity/info'; import { CardPortalService } from '../../../src/modules/card/service/portal'; import { AdminCardInfoController, adminCardInfoCurdOption, } from '../../../src/modules/card/controller/admin/info'; import { CardInfoService } from '../../../src/modules/card/service/info'; describe('后台名片 CRUD (Admin Card Info CoolController)', () => { const controllerFile = path.join( __dirname, '../../../src/modules/card/controller/admin/info.ts' ); describe('1. 控制器装饰器与路由约定', () => { it('文件路径应符合 /admin/card/info 自动路由约定', () => { expect(fs.existsSync(controllerFile)).toBe(true); expect(controllerFile.replace(/\\/g, '/')).toMatch( /modules\/card\/controller\/admin\/info\.ts$/ ); }); it('控制器应继承 BaseController 并挂载 CoolController CRUD', () => { expect(AdminCardInfoController.prototype).toBeInstanceOf(BaseController); expect(adminCardInfoCurdOption.entity).toBe(CardInfoEntity); expect(adminCardInfoCurdOption.service).toBe(CardInfoService); }); it('装饰器 api 必须包含 add/delete/update/info/list/page', () => { expect(adminCardInfoCurdOption.api).toEqual([ 'add', 'delete', 'update', 'info', 'list', 'page', ]); }); it('infoIgnoreProperty 必须包含 remark 与 internalConfig', () => { expect(adminCardInfoCurdOption.infoIgnoreProperty).toEqual( expect.arrayContaining(['remark', 'internalConfig']) ); }); it('pageQueryOp 应支持 name 模糊搜索与 status 精确筛选', () => { const pageQueryOp = adminCardInfoCurdOption.pageQueryOp; expect(pageQueryOp.keyWordLikeFields).toEqual( expect.arrayContaining(['a.name']) ); expect(pageQueryOp.fieldEq).toEqual(expect.arrayContaining(['a.status'])); expect(pageQueryOp.addOrderBy).toEqual({ update_time: 'desc' }); }); it('insertParam 应从后台登录态写入 userId', () => { expect( adminCardInfoCurdOption.insertParam({ admin: { userId: 42 } }) ).toEqual({ userId: 42 }); expect(adminCardInfoCurdOption.insertParam({})).toEqual({ userId: undefined, }); }); }); describe('2. modifyAfter 发布后清缓存', () => { let service: CardInfoService; let clearPortalCache: jest.Mock; beforeEach(() => { clearPortalCache = jest.fn().mockResolvedValue(undefined); service = new CardInfoService(); service.cardPortalService = { clearPortalCache, } as unknown as CardPortalService; }); it('add 时应按 id 或 slug 调用 clearPortalCache', async () => { await service.modifyAfter({ id: 101, slug: 'alex-zheng' }, 'add'); expect(clearPortalCache).toHaveBeenCalledWith(101); expect(clearPortalCache).toHaveBeenCalledWith('alex-zheng'); }); it('update 时应清缓存', async () => { await service.modifyAfter({ id: 101 }, 'update'); expect(clearPortalCache).toHaveBeenCalledWith(101); }); it('delete 时应按 id 列表清缓存', async () => { await service.modifyAfter([101, 102], 'delete'); expect(clearPortalCache).toHaveBeenCalledWith(101); expect(clearPortalCache).toHaveBeenCalledWith(102); }); }); });