kt-template-admin/test/store/auth.spec.ts

77 lines
2.1 KiB
TypeScript

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();
});
});