import { useAccessStore, useUserStore } from '@vben/stores'; import { useAuthStore } from '@test-source/apps/web-antdv-next/src/store/auth'; import { createPinia, setActivePinia } from 'pinia'; import { beforeEach, describe, expect, it, vi } from 'vitest'; const apiMocks = vi.hoisted(() => ({ getAccessCodesApi: vi.fn(), getUserInfoApi: vi.fn(), loginApi: vi.fn(), logoutApi: vi.fn(), refreshTokenApi: vi.fn(), })); vi.mock('#/api', () => apiMocks); vi.mock('#/locales', () => ({ $t: (key: string) => key, })); vi.mock('antdv-next', () => ({ notification: { success: vi.fn(), }, })); vi.mock('vue-router', () => ({ useRouter: () => ({ currentRoute: { value: { query: {}, }, }, push: vi.fn(), replace: vi.fn(), }), })); describe('admin auth SSO restoration', () => { beforeEach(() => { setActivePinia(createPinia()); vi.clearAllMocks(); }); it('restores an access token from the Admin-origin HttpOnly refresh cookie', async () => { apiMocks.refreshTokenApi.mockResolvedValue({ data: 'fresh-access-token', status: 200, }); const restored = await useAuthStore().restoreSessionFromCookie(); expect(restored).toBe(true); expect(useAccessStore().accessToken).toBe('fresh-access-token'); expect(apiMocks.refreshTokenApi).toHaveBeenCalledTimes(1); }); it('clears stale client state and falls back when the refresh cookie is invalid', async () => { const accessStore = useAccessStore(); const userStore = useUserStore(); accessStore.setAccessCodes(['Blog:Article:List']); accessStore.setWordpressAuth({ nonce: 'stale', type: 'cookie' }); userStore.setUserInfo({ avatar: '', realName: 'stale user', userId: '1', username: 'stale', }); apiMocks.refreshTokenApi.mockRejectedValue(new Error('Forbidden')); const restored = await useAuthStore().restoreSessionFromCookie(); expect(restored).toBe(false); expect(accessStore.accessToken).toBeNull(); expect(accessStore.accessCodes).toEqual([]); expect(accessStore.wordpressAuth).toBeNull(); expect(userStore.userInfo).toBeNull(); }); });