151 lines
4.3 KiB
TypeScript
151 lines
4.3 KiB
TypeScript
import { describe, it, expect, jest, beforeAll } from '@jest/globals';
|
|
import { render, screen } from '@testing-library/react';
|
|
import '@testing-library/jest-dom';
|
|
|
|
jest.mock('framer-motion', () => ({
|
|
motion: {
|
|
div: ({ children, className, ...props }: any) => (
|
|
<div className={className} {...props}>
|
|
{children}
|
|
</div>
|
|
),
|
|
section: ({ children, className, ...props }: any) => (
|
|
<section className={className} {...props}>
|
|
{children}
|
|
</section>
|
|
),
|
|
span: ({ children, className, ...props }: any) => (
|
|
<span className={className} {...props}>
|
|
{children}
|
|
</span>
|
|
),
|
|
h1: ({ children, className, ...props }: any) => (
|
|
<h1 className={className} {...props}>
|
|
{children}
|
|
</h1>
|
|
),
|
|
},
|
|
AnimatePresence: ({ children }: any) => <>{children}</>,
|
|
}));
|
|
|
|
jest.mock('next/link', () => {
|
|
return ({ children, href, ...props }: any) => (
|
|
<a href={href} {...props}>
|
|
{children}
|
|
</a>
|
|
);
|
|
});
|
|
|
|
jest.mock('lucide-react', () => ({
|
|
ArrowRight: () => <span data-testid="arrow-right" />,
|
|
Shield: () => <span data-testid="shield-icon" />,
|
|
Zap: () => <span data-testid="zap-icon" />,
|
|
Award: () => <span data-testid="award-icon" />,
|
|
}));
|
|
|
|
jest.mock('next/dynamic', () => {
|
|
const React = require('react');
|
|
return {
|
|
__esModule: true,
|
|
default: (importFn: any, options: any) => {
|
|
return React.forwardRef((props: any, ref: any) => {
|
|
return null;
|
|
});
|
|
},
|
|
};
|
|
});
|
|
|
|
jest.mock('@/components/ui/ripple-button', () => ({
|
|
RippleButton: ({ children, className, ...props }: any) => (
|
|
<button className={className} {...props}>
|
|
{children}
|
|
</button>
|
|
),
|
|
SealButton: ({ children, className, ...props }: any) => (
|
|
<button className={className} {...props}>
|
|
{children}
|
|
</button>
|
|
),
|
|
}));
|
|
|
|
jest.mock('@/lib/animations', () => ({
|
|
GradientText: ({ children, className }: any) => (
|
|
<span className={className}>{children}</span>
|
|
),
|
|
MagneticButton: ({ children, className }: any) => (
|
|
<button className={className}>{children}</button>
|
|
),
|
|
BlurReveal: ({ children, className }: any) => (
|
|
<div className={className}>{children}</div>
|
|
),
|
|
CounterWithEffect: ({ end, suffix, className }: any) => (
|
|
<span className={className}>{end}{suffix || ''}</span>
|
|
),
|
|
}));
|
|
|
|
jest.mock('@/lib/constants', () => ({
|
|
COMPANY_INFO: {
|
|
name: '四川睿新致远科技有限公司',
|
|
shortName: '睿新致遠',
|
|
description: '以智慧连接数字趋势,以伙伴身份陪您成长',
|
|
},
|
|
STATS: [
|
|
{ value: '10+', label: '企业客户' },
|
|
{ value: '20+', label: '成功案例' },
|
|
{ value: '30+', label: '项目交付' },
|
|
{ value: '12+', label: '年行业经验' },
|
|
],
|
|
}));
|
|
|
|
import { HeroSection } from './hero-section';
|
|
|
|
describe('HeroSection', () => {
|
|
beforeAll(() => {
|
|
jest.clearAllMocks();
|
|
});
|
|
|
|
describe('Rendering', () => {
|
|
it('should render hero section', () => {
|
|
render(<HeroSection />);
|
|
const section = document.querySelector('section#home');
|
|
expect(section).toBeInTheDocument();
|
|
});
|
|
|
|
it('should render company name', () => {
|
|
render(<HeroSection />);
|
|
expect(screen.getByText('睿新致遠')).toBeInTheDocument();
|
|
});
|
|
|
|
it('should render features', () => {
|
|
render(<HeroSection />);
|
|
expect(screen.getByText('安全可靠')).toBeInTheDocument();
|
|
expect(screen.getByText('高效便捷')).toBeInTheDocument();
|
|
expect(screen.getByText('专业服务')).toBeInTheDocument();
|
|
});
|
|
});
|
|
|
|
describe('Statistics', () => {
|
|
it('should render statistics section', () => {
|
|
render(<HeroSection />);
|
|
expect(screen.getByText('企业客户')).toBeInTheDocument();
|
|
expect(screen.getByText('成功案例')).toBeInTheDocument();
|
|
expect(screen.getByText('项目交付')).toBeInTheDocument();
|
|
expect(screen.getByText('年行业经验')).toBeInTheDocument();
|
|
});
|
|
});
|
|
|
|
describe('Accessibility', () => {
|
|
it('should have proper ARIA labels', () => {
|
|
render(<HeroSection />);
|
|
const section = document.querySelector('section#home');
|
|
expect(section).toHaveAttribute('aria-labelledby', 'hero-heading');
|
|
});
|
|
|
|
it('should have accessible buttons', () => {
|
|
render(<HeroSection />);
|
|
const buttons = screen.getAllByRole('button');
|
|
expect(buttons.length).toBeGreaterThan(0);
|
|
});
|
|
});
|
|
});
|