Docker
Change-Id: I2aefd96a43bcf3a3c41c079ecfc04a3fee48bed6
diff --git a/test/homepage.test.tsx b/test/homepage.test.tsx
new file mode 100644
index 0000000..1087fa6
--- /dev/null
+++ b/test/homepage.test.tsx
@@ -0,0 +1,101 @@
+import React from 'react';
+import { render, screen, waitFor } from '@testing-library/react';
+import '@testing-library/jest-dom';
+import Homepage from '@/views/homepage/homepage';
+import { useApi } from '@/hooks/request';
+import { useSelector } from 'react-redux';
+import { useNavigate } from 'react-router';
+
+jest.mock('@/hooks/request', () => ({
+ useApi: jest.fn(),
+}));
+
+jest.mock('react-redux', () => ({
+ useSelector: jest.fn(),
+}));
+
+jest.mock('react-router', () => ({
+ useNavigate: jest.fn(),
+}));
+
+const mockUseApi = useApi as jest.MockedFunction<typeof useApi>;
+const mockUseSelector = useSelector as jest.MockedFunction<typeof useSelector>;
+const mockUseNavigate = useNavigate as jest.MockedFunction<typeof useNavigate>;
+
+describe('Homepage Component', () => {
+ const mockRefresh = jest.fn();
+ const mockNavigate = jest.fn();
+
+ beforeEach(() => {
+ mockUseNavigate.mockReturnValue(mockNavigate);
+ mockUseSelector.mockImplementation((selector) =>
+ selector({ user: { avatar: 'https://example.com/avatar.jpg' } })
+ );
+
+ mockUseApi.mockReturnValue({
+ data: {
+ username: '测试用户',
+ inviteCode: '123456',
+ stats: {
+ likes: 99,
+ following: 10,
+ followers: 20,
+ mutualFollows: 5,
+ },
+ upload: '15',
+ level: 'Lv3',
+ works: [
+ {
+ postId: 2,
+ userId: 0,
+ postTitle: '凡高',
+ postContent: '',
+ createdAt: 0,
+ postType: '',
+ viewCount: 100,
+ hotScore: 0.0,
+ lastCalculated: 0
+ },
+ ],
+ petImage: '',
+ trafficImage: '',
+ },
+ loading: false,
+ error: null,
+ refresh: mockRefresh,
+ });
+ });
+
+ afterEach(() => {
+ jest.clearAllMocks();
+ });
+
+ it('renders user stats and works correctly', async () => {
+ render(<Homepage />);
+
+ await waitFor(() => {
+ expect(screen.getByText('获赞')).toBeInTheDocument();
+ expect(screen.getByText('99')).toBeInTheDocument();
+
+ expect(screen.getByText('关注')).toBeInTheDocument();
+ expect(screen.getByText('10')).toBeInTheDocument();
+
+ expect(screen.getByText('粉丝')).toBeInTheDocument();
+ expect(screen.getByText('20')).toBeInTheDocument();
+
+ expect(screen.getByText('互关')).toBeInTheDocument();
+ expect(screen.getByText('5')).toBeInTheDocument();
+
+ expect(screen.getByText('您的总上传量为:')).toBeInTheDocument();
+ expect(screen.getByText('15')).toBeInTheDocument();
+
+ expect(screen.getByText('您的用户等级为:')).toBeInTheDocument();
+ expect(screen.getByText('Lv3')).toBeInTheDocument();
+
+ expect(screen.getByText('我的作品')).toBeInTheDocument();
+ expect(screen.getByText('凡高')).toBeInTheDocument();
+ expect(screen.getByText(/发布时间:0/)).toBeInTheDocument();
+ expect(screen.getByText(/下载量:100 做种数:待定/)).toBeInTheDocument();
+ });
+ });
+});
diff --git a/test/upload.test.tsx b/test/upload.test.tsx
new file mode 100644
index 0000000..c36eb68
--- /dev/null
+++ b/test/upload.test.tsx
@@ -0,0 +1,27 @@
+// test/upload.test.tsx
+import React from 'react'
+import { render, screen, fireEvent } from '@testing-library/react'
+import UploadComponent from '@/components/upload/upload'
+import '@testing-library/jest-dom'
+
+describe('UploadComponent', () => {
+ it('should render upload component correctly', () => {
+ render(<UploadComponent />)
+
+ const input = screen.getByTestId('upload-input')
+ const uploadButton = screen.getByTestId('upload-button')
+
+ expect(input).toBeInTheDocument()
+ expect(uploadButton).toBeInTheDocument()
+ })
+
+ it('should update selected file on file change', () => {
+ render(<UploadComponent />)
+
+ const input = screen.getByTestId('upload-input') as HTMLInputElement
+ const file = new File(['hello'], 'hello.png', { type: 'image/png' })
+
+ fireEvent.change(input, { target: { files: [file] } })
+ expect(input.files?.[0]).toEqual(file)
+ })
+})