f5dec95a83
refactor: 重构页面导航和滚动逻辑,提升用户体验 test: 更新测试配置和用例,增加覆盖率和稳定性 perf: 优化性能指标和阈值,适应开发环境需求 ci: 添加Lighthouse CI工作流,集成性能测试 docs: 更新API文档和健康检查端点 fix: 修复登录页面和表单提交问题 style: 调整响应式布局和可访问性改进 chore: 更新依赖项和脚本配置
136 lines
4.1 KiB
TypeScript
136 lines
4.1 KiB
TypeScript
import { describe, it, expect, beforeEach } from '@jest/globals';
|
|
import { render, screen } from '@testing-library/react';
|
|
import '@testing-library/jest-dom';
|
|
import { ServicesSection } from './services-section';
|
|
|
|
jest.mock('framer-motion', () => ({
|
|
motion: {
|
|
div: ({ children, ...props }: any) => <div {...props}>{children}</div>,
|
|
},
|
|
useInView: () => true,
|
|
}));
|
|
|
|
jest.mock('next/link', () => {
|
|
return ({ children, href }: any) => <a href={href}>{children}</a>;
|
|
});
|
|
|
|
jest.mock('@/hooks/use-services', () => ({
|
|
useServices: () => ({
|
|
services: [
|
|
{
|
|
id: '1',
|
|
title: '测试服务1',
|
|
description: '这是测试服务1的描述',
|
|
icon: 'Code',
|
|
features: ['特性1', '特性2'],
|
|
},
|
|
{
|
|
id: '2',
|
|
title: '测试服务2',
|
|
description: '这是测试服务2的描述',
|
|
icon: 'Database',
|
|
features: ['特性3', '特性4'],
|
|
},
|
|
],
|
|
loading: false,
|
|
error: null,
|
|
}),
|
|
}));
|
|
|
|
describe('ServicesSection', () => {
|
|
beforeEach(() => {
|
|
jest.clearAllMocks();
|
|
});
|
|
|
|
describe('Rendering', () => {
|
|
it('should render services section', () => {
|
|
render(<ServicesSection />);
|
|
const section = document.querySelector('section#services');
|
|
expect(section).toBeInTheDocument();
|
|
});
|
|
|
|
it('should render section heading', () => {
|
|
render(<ServicesSection />);
|
|
expect(screen.getByRole('heading', { level: 2 })).toBeInTheDocument();
|
|
});
|
|
|
|
it('should render section description', () => {
|
|
render(<ServicesSection />);
|
|
expect(screen.getByText(/专业技术团队/)).toBeInTheDocument();
|
|
});
|
|
});
|
|
|
|
describe('Service Cards', () => {
|
|
it('should render service cards', () => {
|
|
render(<ServicesSection />);
|
|
const cards = document.querySelectorAll('.p-6');
|
|
expect(cards.length).toBeGreaterThan(0);
|
|
});
|
|
|
|
it('should display services in grid layout', () => {
|
|
const { container } = render(<ServicesSection />);
|
|
const grid = container.querySelector('.grid-cols-1');
|
|
expect(grid).toBeInTheDocument();
|
|
});
|
|
|
|
it('should render service icons', () => {
|
|
render(<ServicesSection />);
|
|
const icons = document.querySelectorAll('svg');
|
|
expect(icons.length).toBeGreaterThan(0);
|
|
});
|
|
});
|
|
|
|
describe('Call to Action', () => {
|
|
it('should render view all services button', () => {
|
|
render(<ServicesSection />);
|
|
expect(screen.getByRole('link', { name: /查看全部服务/ })).toBeInTheDocument();
|
|
});
|
|
|
|
it('should link to services page', () => {
|
|
render(<ServicesSection />);
|
|
const link = screen.getByRole('link', { name: /查看全部服务/ });
|
|
expect(link).toHaveAttribute('href', '/services');
|
|
});
|
|
});
|
|
|
|
describe('Accessibility', () => {
|
|
it('should have section with id', () => {
|
|
render(<ServicesSection />);
|
|
const section = document.querySelector('section#services');
|
|
expect(section).toBeInTheDocument();
|
|
});
|
|
|
|
it('should have aria-labelledby attribute', () => {
|
|
render(<ServicesSection />);
|
|
const section = document.querySelector('section#services');
|
|
expect(section).toHaveAttribute('aria-labelledby', 'services-heading');
|
|
});
|
|
|
|
it('should have accessible heading', () => {
|
|
render(<ServicesSection />);
|
|
const heading = screen.getByRole('heading', { level: 2 });
|
|
expect(heading).toHaveAttribute('id', 'services-heading');
|
|
});
|
|
});
|
|
|
|
describe('Styling', () => {
|
|
it('should have white background', () => {
|
|
render(<ServicesSection />);
|
|
const section = document.querySelector('section#services');
|
|
expect(section).toHaveClass('bg-white');
|
|
});
|
|
|
|
it('should have proper padding', () => {
|
|
render(<ServicesSection />);
|
|
const section = document.querySelector('section#services');
|
|
expect(section).toHaveClass('py-24');
|
|
});
|
|
|
|
it('should have decorative background elements', () => {
|
|
const { container } = render(<ServicesSection />);
|
|
const decorativeElements = container.querySelectorAll('.blur-3xl');
|
|
expect(decorativeElements.length).toBeGreaterThan(0);
|
|
});
|
|
});
|
|
});
|