Files
novalon-website/src/app/(marketing)/services/page.test.tsx
T
zhangxiang 337e1e60c0 feat(cms): 品牌叙事与结构性文案全站 CMS 化并补齐信任证据阶段 0
- 品牌叙事内核(价值主张/定位/承诺/三支柱/语气)下沉 site-config,经 SiteConfigProvider 注入全站
- 新增 page-copy 内容模型承载结构性文案(章节标题/眉标/描述/CTA/空状态),覆盖首页+服务/方案/产品/案例/新闻列表页,「CMS 优先 + 硬编码兜底」不白屏
- 首页「首批客户共创计划」板块(earlyAccessTitle/CtaLabel/Status 驱动)替代单行标签,如实呈现共创/内测/授权公开三档状态
- 关于页资质区数据空时如实展示「建设中」空态
- 零编造:不虚构客户/数据/资质
2026-08-20 09:25:12 +08:00

98 lines
2.8 KiB
TypeScript

import { render, screen } from '@testing-library/react';
import '@testing-library/jest-dom';
import ServicesPage from './page';
jest.mock('@/lib/cms/data-server', () => ({
getPublishedItems: jest.fn(),
getPageCopy: jest.fn().mockResolvedValue(null),
}));
jest.mock('./services-content-v3', () => ({
__esModule: true,
default: function MockServicesContentV3({ services }: { services: Array<{ id: string; title: string }> }) {
return (
<div data-testid="services-content">
{services.map((item) => (
<div key={item.id} data-testid="service-item">{item.title}</div>
))}
</div>
);
},
}));
import { getPublishedItems } from '@/lib/cms/data-server';
const mockedGetPublishedItems = getPublishedItems as jest.MockedFunction<typeof getPublishedItems>;
const createMockService = (topOverrides: Record<string, unknown> = {}, dataOverrides: Record<string, unknown> = {}) => ({
id: 'item-1',
modelId: 'model-service',
modelCode: 'service',
title: '测试服务',
slug: 'test-service',
locale: 'zh-CN',
status: 'published',
data: {
id: 'test-service',
slug: 'test-service',
title: '测试服务',
description: '测试服务描述',
icon: 'Lightbulb',
overview: '测试服务概述',
features: ['能力一:描述一'],
benefits: ['价值一'],
capabilities: ['能力一'],
process: ['步骤一:描述一'],
heroThemeId: 'service',
caseStudies: [],
dataProofs: [],
...dataOverrides,
},
version: 1,
sortOrder: 0,
createdBy: 'system',
updatedBy: 'system',
createdAt: new Date().toISOString(),
updatedAt: new Date().toISOString(),
...topOverrides,
});
describe('ServicesPage', () => {
beforeEach(() => {
jest.clearAllMocks();
mockedGetPublishedItems.mockResolvedValue([]);
});
it('renders empty state when no CMS service items exist', async () => {
const page = await ServicesPage();
render(page);
expect(screen.getByTestId('services-content')).toBeInTheDocument();
expect(screen.queryByTestId('service-item')).not.toBeInTheDocument();
});
it('maps CMS items to Service shape', async () => {
mockedGetPublishedItems.mockResolvedValue([
createMockService(),
] as unknown as Awaited<ReturnType<typeof getPublishedItems>>);
const page = await ServicesPage();
render(page);
expect(screen.getByText('测试服务')).toBeInTheDocument();
});
it('falls back to item.title when data.title is missing', async () => {
mockedGetPublishedItems.mockResolvedValue([
createMockService(
{ title: 'Fallback Title' },
{ title: undefined },
),
] as unknown as Awaited<ReturnType<typeof getPublishedItems>>);
const page = await ServicesPage();
render(page);
expect(screen.getByText('Fallback Title')).toBeInTheDocument();
});
});