- 品牌叙事内核(价值主张/定位/承诺/三支柱/语气)下沉 site-config,经 SiteConfigProvider 注入全站 - 新增 page-copy 内容模型承载结构性文案(章节标题/眉标/描述/CTA/空状态),覆盖首页+服务/方案/产品/案例/新闻列表页,「CMS 优先 + 硬编码兜底」不白屏 - 首页「首批客户共创计划」板块(earlyAccessTitle/CtaLabel/Status 驱动)替代单行标签,如实呈现共创/内测/授权公开三档状态 - 关于页资质区数据空时如实展示「建设中」空态 - 零编造:不虚构客户/数据/资质
98 lines
2.8 KiB
TypeScript
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();
|
|
});
|
|
});
|