Files
novalon-website/src/components/sections/hero-section.test.tsx
T

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);
});
});
});