Settings.test.tsx 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. import { fireEvent, render, screen } from '@testing-library/react';
  2. import { beforeEach, expect, test, vi } from 'vitest';
  3. import SettingsPage from '@/pages/Settings';
  4. import { apiRequest } from '@/services/api';
  5. vi.mock('@/services/api', () => ({
  6. apiRequest: vi.fn(),
  7. jsonOptions: vi.fn((method, body) => ({ method, body: JSON.stringify(body) })),
  8. setCsrfToken: vi.fn(),
  9. setSelectedBotId: vi.fn(),
  10. }));
  11. beforeEach(() => {
  12. vi.mocked(apiRequest).mockImplementation(async (path) => {
  13. if (path === '/settings') {
  14. return {
  15. web_address: 'http://127.0.0.1:8088/admin',
  16. bind_host: '127.0.0.1',
  17. upload_limit_mb: 20,
  18. supervisor_mode: true,
  19. bot: { connected: false, id: '', username: '', name: '' },
  20. };
  21. }
  22. if (path === '/settings/telegram') {
  23. return {
  24. api_id: 12345,
  25. api_hash_configured: true,
  26. api_ready: true,
  27. permission_catalog: [
  28. {
  29. key: 'points.manage',
  30. name: '积分',
  31. group: '社区运营',
  32. description: '管理积分',
  33. },
  34. ],
  35. roles: [
  36. {
  37. role_id: 'full_access',
  38. name: '全部职责',
  39. description: '全部权限',
  40. permissions: ['points.manage'],
  41. builtin: true,
  42. },
  43. {
  44. role_id: 'points',
  45. name: '积分专员',
  46. description: '负责积分',
  47. permissions: ['points.manage'],
  48. builtin: false,
  49. },
  50. ],
  51. bots: [
  52. {
  53. bot_id: 'one',
  54. label: '主 Bot',
  55. enabled: true,
  56. bot_token_configured: true,
  57. sudo_users_id: [],
  58. log_group_id: '0',
  59. gban_log_group_id: '0',
  60. message_dump_chat: '-100123',
  61. role_ids: ['points'],
  62. permissions: ['points.manage'],
  63. identity: { id: '1', username: 'primary_bot', name: 'Primary' },
  64. ready_to_connect: true,
  65. runtime: { state: 'running' },
  66. },
  67. {
  68. bot_id: 'two',
  69. label: '备用 Bot',
  70. enabled: false,
  71. bot_token_configured: true,
  72. sudo_users_id: [],
  73. log_group_id: '0',
  74. gban_log_group_id: '0',
  75. message_dump_chat: '0',
  76. role_ids: [],
  77. permissions: [],
  78. identity: null,
  79. ready_to_connect: true,
  80. runtime: { state: 'stopped' },
  81. },
  82. ],
  83. };
  84. }
  85. throw new Error(`Unexpected request: ${path}`);
  86. });
  87. });
  88. test('展示多个机器人、脱敏凭据状态和运行状态', async () => {
  89. render(<SettingsPage />);
  90. expect(await screen.findByText('@primary_bot')).toBeInTheDocument();
  91. expect(screen.getByText('备用 Bot')).toBeInTheDocument();
  92. expect(screen.getAllByText('积分专员').length).toBeGreaterThan(0);
  93. expect(screen.getByText('未分配职责')).toBeInTheDocument();
  94. expect(screen.getByText('运行中')).toBeInTheDocument();
  95. expect(screen.getByText('已停用')).toBeInTheDocument();
  96. expect(screen.getAllByText('已配置')).toHaveLength(2);
  97. const credentialsLink = screen.getByRole('link', { name: 'my.telegram.org/apps' });
  98. expect(credentialsLink).toHaveAttribute('href', 'https://my.telegram.org/apps');
  99. expect(credentialsLink.parentElement).toHaveTextContent('不是机器人编号。');
  100. expect(screen.getByText('32 位十六进制字符串,不是机器人令牌。')).toBeInTheDocument();
  101. expect(screen.queryByText(/AA[A-Za-z0-9_-]{20}/)).not.toBeInTheDocument();
  102. fireEvent.click(screen.getByRole('button', { name: '新建角色' }));
  103. expect(await screen.findByText('新建职责角色')).toBeInTheDocument();
  104. expect(screen.getByRole('checkbox', { name: /积分/ })).toBeInTheDocument();
  105. });