openVikingSessionSyncPanel.test.ts 1.1 KB

123456789101112131415161718
  1. import { flushPromises, mount } from '@vue/test-utils'
  2. import { afterEach, expect, it, vi } from 'vitest'
  3. import OpenVikingSessionSyncPanel from '@/components/app/OpenVikingSessionSyncPanel.vue'
  4. import { apiRequest } from '@/api/client'
  5. vi.mock('@/api/client', () => ({ apiRequest: vi.fn() }))
  6. afterEach(() => { vi.useRealTimers(); vi.resetAllMocks() })
  7. it('shows failures, retries them, and stops polling when closed', async () => {
  8. vi.useFakeTimers()
  9. vi.mocked(apiRequest).mockResolvedValue({ enabled: true, pending: 2, complete: 3, failed: 1, lastError: 'offline' })
  10. const wrapper = mount(OpenVikingSessionSyncPanel); await flushPromises()
  11. expect(wrapper.text()).toContain('待同步 2 · 已完成 3 · 失败 1')
  12. expect(wrapper.get('[role=alert]').text()).toBe('offline')
  13. await wrapper.get('button').trigger('click'); await flushPromises()
  14. expect(apiRequest).toHaveBeenCalledWith('/api/app/admin/openviking/session-sync/retry', { method: 'POST', body: {} })
  15. wrapper.unmount(); const count = vi.mocked(apiRequest).mock.calls.length
  16. await vi.advanceTimersByTimeAsync(10000)
  17. expect(apiRequest).toHaveBeenCalledTimes(count)
  18. })