blob: 8307b1ef164766c0784589023e4ea702478001b2 [file] [log] [blame] [edit]
import React from 'react';
import { render, screen, fireEvent, waitFor } from '@testing-library/react';
import CreatePost from '../pages/Forum/posts-create/CreatePost';
import axios from 'axios';
// mock axios
jest.mock('axios');
describe('CreatePost Component', () => {
const mockUserId = 123;
beforeEach(() => {
axios.post.mockClear();
});
test('renders form inputs and button', () => {
render(<CreatePost user_id={mockUserId} />);
expect(screen.getByLabelText(/标题/)).toBeInTheDocument();
expect(screen.getByLabelText(/内容/)).toBeInTheDocument();
expect(screen.getByLabelText(/图片链接/)).toBeInTheDocument();
expect(screen.getByRole('button', { name: '发布' })).toBeInTheDocument();
});
test('shows error when title and content are empty', async () => {
render(<CreatePost user_id={mockUserId} />);
fireEvent.click(screen.getByRole('button', { name: '发布' }));
expect(await screen.findByText('标题和内容不能为空')).toBeInTheDocument();
});
test('submits post and shows success message', async () => {
axios.post.mockResolvedValueOnce({
data: { post_id: 456 },
});
render(<CreatePost user_id={mockUserId} />);
fireEvent.change(screen.getByLabelText(/标题/), {
target: { value: '测试标题' },
});
fireEvent.change(screen.getByLabelText(/内容/), {
target: { value: '测试内容' },
});
fireEvent.change(screen.getByLabelText(/图片链接/), {
target: { value: 'http://example.com/image.jpg' },
});
fireEvent.click(screen.getByRole('button', { name: '发布' }));
await waitFor(() =>
expect(axios.post).toHaveBeenCalledWith(
`/echo/forum/posts/${mockUserId}/createPost`,
{
title: '测试标题',
post_content: '测试内容',
image_url: 'http://example.com/image.jpg',
}
)
);
expect(await screen.findByText(/发帖成功,帖子ID:456/)).toBeInTheDocument();
});
test('shows error message on submission failure', async () => {
axios.post.mockRejectedValueOnce({
response: {
data: {
error: '服务器内部错误',
},
},
});
render(<CreatePost user_id={mockUserId} />);
fireEvent.change(screen.getByLabelText(/标题/), {
target: { value: '测试标题' },
});
fireEvent.change(screen.getByLabelText(/内容/), {
target: { value: '测试内容' },
});
fireEvent.click(screen.getByRole('button', { name: '发布' }));
expect(await screen.findByText('服务器内部错误')).toBeInTheDocument();
});
test('shows fallback error message when no response', async () => {
axios.post.mockRejectedValueOnce(new Error('Network error'));
render(<CreatePost user_id={mockUserId} />);
fireEvent.change(screen.getByLabelText(/标题/), {
target: { value: '测试标题' },
});
fireEvent.change(screen.getByLabelText(/内容/), {
target: { value: '测试内容' },
});
fireEvent.click(screen.getByRole('button', { name: '发布' }));
expect(await screen.findByText('发帖失败,请稍后重试')).toBeInTheDocument();
});
});