import { 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, 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', 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', 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.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(); });