import { fireEvent, render, screen, waitFor } from '@testing-library/react';
import { beforeEach, expect, it, vi } from 'vitest';
import { history } from '@umijs/max';
import ChatsPage from '@/pages/Chats';
import { apiRequest } from '@/services/api';
vi.mock('@/services/api', () => ({ apiRequest: vi.fn() }));
beforeEach(() => vi.clearAllMocks());
const chatPage = {
items: [
{
chat_id: '-100123',
title: '测试运营群',
username: 'ops_test',
type: 'supergroup',
accessible: true,
member_count: 42,
bot_status: 'administrator',
},
{
chat_id: '-100456',
title: '机器人已退出的群',
type: 'supergroup',
accessible: false,
member_count: 8,
bot_status: 'left',
},
],
total: 2,
page: 1,
page_size: 20,
};
it('可用群进入管理页,不可用群提供移除入口', async () => {
vi.mocked(apiRequest).mockResolvedValue(chatPage);
render();
expect(await screen.findByText('测试运营群')).toBeInTheDocument();
fireEvent.click(screen.getByRole('button', { name: '管理' }));
expect(history.push).toHaveBeenCalledWith('/chats/-100123');
expect(
screen.getByRole('button', { name: '移除不可用群 机器人已退出的群' }),
).toBeInTheDocument();
await waitFor(() => expect(apiRequest).toHaveBeenCalledTimes(1));
});
it('确认后移除不可用群并刷新列表', async () => {
vi.mocked(apiRequest)
.mockResolvedValueOnce(chatPage)
.mockResolvedValueOnce({ removed: true })
.mockResolvedValueOnce({ ...chatPage, items: chatPage.items.slice(0, 1), total: 1 });
render();
fireEvent.click(
await screen.findByRole('button', { name: '移除不可用群 机器人已退出的群' }),
);
expect(await screen.findByText('仅移除当前 Bot 的管理列表记录,不会删除群消息、积分或抽奖数据;Bot 以后重新在群里活动时会再次出现。')).toBeInTheDocument();
fireEvent.click(screen.getByRole('button', { name: /^移\s*除$/ }));
await waitFor(() => {
expect(apiRequest).toHaveBeenNthCalledWith(
2,
'/chats/-100456',
{ method: 'DELETE' },
);
expect(apiRequest).toHaveBeenCalledTimes(3);
});
});