一级标题
在全球数字化浪潮席卷而来的今天,智能名片已经不仅是身份凭证,更是出海企业的第一道数字门面与线索转化漏斗。通过多语言自适应与 NFC 瞬时触达,销售代表可以在海外展会现场以极低摩擦完成商机留资与精准雷达跟进,大幅提升商机转化效率与客户体验。
import * as fs from 'fs'; import * as path from 'path'; import { BaseController } from '@cool-midway/core'; import { CardArticleEntity } from '../../../src/modules/card/entity/article'; import { CardArticleService } from '../../../src/modules/card/service/article'; import { AdminCardArticleController, adminCardArticleCurdOption, } from '../../../src/modules/card/controller/admin/article'; describe('后台博客文章与动态发布中心 (Card Article CoolController & Service)', () => { const controllerFile = path.join( __dirname, '../../../src/modules/card/controller/admin/article.ts' ); const serviceFile = path.join( __dirname, '../../../src/modules/card/service/article.ts' ); const entityFile = path.join( __dirname, '../../../src/modules/card/entity/article.ts' ); describe('1. 路由与 CoolController CRUD 契约', () => { it('文件路径应符合 /admin/card/article 自动路由与架构约定', () => { expect(fs.existsSync(controllerFile)).toBe(true); expect(fs.existsSync(serviceFile)).toBe(true); expect(fs.existsSync(entityFile)).toBe(true); expect(controllerFile.replace(/\\/g, '/')).toMatch( /modules\/card\/controller\/admin\/article\.ts$/ ); }); it('控制器应继承 BaseController 并正确配置 entity 与 service', () => { expect(AdminCardArticleController.prototype).toBeInstanceOf(BaseController); expect(adminCardArticleCurdOption.entity).toBe(CardArticleEntity); expect(adminCardArticleCurdOption.service).toBe(CardArticleService); }); it('装饰器 api 必须完整包含 add/delete/update/info/list/page', () => { expect(adminCardArticleCurdOption.api).toEqual([ 'add', 'delete', 'update', 'info', 'list', 'page', ]); }); it('分页查询 pageQueryOp 应支持标题搜索与发布状态筛选', () => { const pageQueryOp = adminCardArticleCurdOption.pageQueryOp; expect(pageQueryOp.keyWordLikeFields).toEqual( expect.arrayContaining(['a.title', 'a.summary']) ); expect(pageQueryOp.fieldEq).toEqual( expect.arrayContaining(['a.cardId', 'a.isPublished']) ); expect(pageQueryOp.addOrderBy).toEqual({ updateTime: 'desc' }); }); }); describe('2. OpenGraph 社交元数据自动提炼 (generateOgMeta)', () => { let service: CardArticleService; beforeEach(() => { service = new CardArticleService(); }); it('完整文章入参时,应正确映射 title、summary 与 coverImage', () => { const article = { cardId: 101, title: '出海战略新视界:2026 跨境数字名片白皮书', summary: '本文深度剖析全球化商务场景下 NFC 与微官网结合的数字化获客新路径。', content: '
正文内容...
', coverImage: 'https://cdn.omnicard.ai/articles/cover-1.jpg', isPublished: true, }; const og = service.generateOgMeta(article); expect(og.title).toBe(article.title); expect(og.description).toBe(article.summary); expect(og.image).toBe(article.coverImage); }); it('缺失 summary 时,应自动从 content 提取剥离 HTML 标签的前 160 字符', () => { const longHtml = `在全球数字化浪潮席卷而来的今天,智能名片已经不仅是身份凭证,更是出海企业的第一道数字门面与线索转化漏斗。通过多语言自适应与 NFC 瞬时触达,销售代表可以在海外展会现场以极低摩擦完成商机留资与精准雷达跟进,大幅提升商机转化效率与客户体验。
');
expect(og.description).not.toContain('');
expect(og.description).toContain('在全球数字化浪潮席卷而来的今天');
});
it('缺失 coverImage 时,应自动从 content 中提取首张图片 URL', () => {
const contentWithImages = `
前言段落 次要段落 精彩资讯动态内容发布