import { fireEvent, render, screen } from '@testing-library/react'; import { beforeEach, expect, test, vi } from 'vitest'; import SettingsPage from '@/pages/Settings'; import { apiRequest } from '@/services/api'; vi.mock('@/services/api', () => ({ apiRequest: vi.fn(), jsonOptions: vi.fn((method, body) => ({ method, body: JSON.stringify(body) })), setCsrfToken: vi.fn(), setSelectedBotId: vi.fn(), })); beforeEach(() => { vi.mocked(apiRequest).mockImplementation(async (path) => { if (path === '/settings') { return { web_address: 'http://127.0.0.1:8088/admin', bind_host: '127.0.0.1', upload_limit_mb: 20, supervisor_mode: true, bot: { connected: false, id: '', username: '', name: '' }, }; } if (path === '/settings/telegram') { return { api_id: 12345, api_hash_configured: true, api_ready: true, permission_catalog: [ { key: 'points.manage', name: '积分', group: '社区运营', description: '管理积分', }, ], roles: [ { role_id: 'full_access', name: '全部职责', description: '全部权限', permissions: ['points.manage'], builtin: true, }, { role_id: 'points', name: '积分专员', description: '负责积分', permissions: ['points.manage'], builtin: false, }, ], bots: [ { bot_id: 'one', label: '主 Bot', enabled: true, bot_token_configured: true, sudo_users_id: [], log_group_id: '0', gban_log_group_id: '0', message_dump_chat: '-100123', role_ids: ['points'], permissions: ['points.manage'], identity: { id: '1', username: 'primary_bot', name: 'Primary' }, ready_to_connect: true, runtime: { state: 'running' }, }, { bot_id: 'two', label: '备用 Bot', enabled: false, bot_token_configured: true, sudo_users_id: [], log_group_id: '0', gban_log_group_id: '0', message_dump_chat: '0', role_ids: [], permissions: [], identity: null, ready_to_connect: true, runtime: { state: 'stopped' }, }, ], }; } throw new Error(`Unexpected request: ${path}`); }); }); test('展示多个机器人、脱敏凭据状态和运行状态', async () => { render(); expect(await screen.findByText('@primary_bot')).toBeInTheDocument(); expect(screen.getByText('备用 Bot')).toBeInTheDocument(); expect(screen.getAllByText('积分专员').length).toBeGreaterThan(0); expect(screen.getByText('未分配职责')).toBeInTheDocument(); expect(screen.getByText('运行中')).toBeInTheDocument(); expect(screen.getByText('已停用')).toBeInTheDocument(); expect(screen.getAllByText('已配置')).toHaveLength(2); const credentialsLink = screen.getByRole('link', { name: 'my.telegram.org/apps' }); expect(credentialsLink).toHaveAttribute('href', 'https://my.telegram.org/apps'); expect(credentialsLink.parentElement).toHaveTextContent('不是机器人编号。'); expect(screen.getByText('32 位十六进制字符串,不是机器人令牌。')).toBeInTheDocument(); expect(screen.queryByText(/AA[A-Za-z0-9_-]{20}/)).not.toBeInTheDocument(); fireEvent.click(screen.getByRole('button', { name: '新建角色' })); expect(await screen.findByText('新建职责角色')).toBeInTheDocument(); expect(screen.getByRole('checkbox', { name: /积分/ })).toBeInTheDocument(); });