import { beforeEach, describe, expect, it, vi } from 'vitest' import { flushPromises, mount } from '@vue/test-utils' const copyToClipboard = vi.fn().mockResolvedValue(true) const messages: Record = { 'keys.endpoints.title': 'API 端点', 'keys.endpoints.default': '默认', 'keys.endpoints.copied': '已复制', 'keys.endpoints.copiedHint': '已复制到剪贴板', 'keys.endpoints.clickToCopy': '点击可复制此端点', 'keys.endpoints.speedTest': '测速', } vi.mock('vue-i18n', () => ({ useI18n: () => ({ t: (key: string) => messages[key] ?? key, }), })) vi.mock('@/composables/useClipboard', () => ({ useClipboard: () => ({ copyToClipboard, }), })) import EndpointPopover from '../EndpointPopover.vue' describe('EndpointPopover', () => { beforeEach(() => { vi.clearAllMocks() }) it('将说明提示渲染到 URL 上方而不是旧的 title 图标上', () => { const wrapper = mount(EndpointPopover, { props: { apiBaseUrl: 'https://default.example.com/v1', customEndpoints: [ { name: '备用线路', endpoint: 'https://backup.example.com/v1', description: '自定义说明', }, ], }, }) expect(wrapper.text()).toContain('自定义说明') expect(wrapper.text()).toContain('点击可复制此端点') expect(wrapper.find('[role="button"]').attributes('title')).toBeUndefined() expect(wrapper.find('[title="自定义说明"]').exists()).toBe(false) }) it('点击 URL 后会复制并切换为已复制提示', async () => { const wrapper = mount(EndpointPopover, { props: { apiBaseUrl: 'https://default.example.com/v1', customEndpoints: [], }, }) await wrapper.find('[role="button"]').trigger('click') await flushPromises() expect(copyToClipboard).toHaveBeenCalledWith('https://default.example.com/v1', '已复制') expect(wrapper.text()).toContain('已复制到剪贴板') expect(wrapper.find('button[aria-label="已复制到剪贴板"]').exists()).toBe(true) }) })