Fix MainContainer beforeRouteEnter missing try-catch and next() call

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-06 07:43:17 +08:00
parent 2768b5d052
commit fba2efe21e
2 changed files with 103 additions and 3 deletions

View File

@@ -0,0 +1,89 @@
import { describe, it, expect, beforeEach, vi } from 'vitest';
import { setActivePinia, createPinia } from 'pinia';
// Mock all heavy imports that MainContainer.vue pulls in
vi.mock('@/stores/loading.js', () => ({
default: () => ({ isLoading: false }),
}));
vi.mock('@/stores/allMapData.js', () => ({
default: () => ({}),
}));
vi.mock('@/stores/conformance.js', () => ({
default: () => ({}),
}));
vi.mock('@/stores/pageAdmin.js', () => ({
default: () => ({}),
}));
vi.mock('@/module/alertModal.js', () => ({
leaveFilter: vi.fn(),
leaveConformance: vi.fn(),
}));
vi.mock('@/module/apiError.js', () => ({
default: vi.fn(),
}));
vi.mock('@/router/index.ts', () => ({
default: { push: vi.fn(), currentRoute: { value: { path: '/' } } },
}));
vi.mock('@/module/cytoscapeMap.js', () => ({}));
import LoginStore from '@/stores/login.ts';
import * as cookieUtil from '@/utils/cookieUtil.js';
// Import the component definition to access beforeRouteEnter
import MainContainer from '@/views/MainContainer.vue';
describe('MainContainer beforeRouteEnter', () => {
let loginStore;
let next;
beforeEach(() => {
setActivePinia(createPinia());
loginStore = LoginStore();
loginStore.$router = { push: vi.fn() };
next = vi.fn();
vi.clearAllMocks();
// Clear cookies
document.cookie.split(';').forEach((c) => {
const name = c.split('=')[0].trim();
if (name) {
document.cookie = name + '=; Max-Age=-99999999; path=/';
}
});
});
const callGuard = () => {
const guard = MainContainer.beforeRouteEnter;
return guard({}, {}, next);
};
it('calls next() after successful refreshToken', async () => {
// Not logged in, but has refresh token
document.cookie = 'luciaRefreshToken=some-token';
vi.spyOn(loginStore, 'refreshToken').mockResolvedValue();
await callGuard();
expect(loginStore.refreshToken).toHaveBeenCalled();
expect(next).toHaveBeenCalled();
});
it('redirects to login when refreshToken fails', async () => {
// Not logged in, has refresh token, but refresh fails
document.cookie = 'luciaRefreshToken=some-token';
vi.spyOn(loginStore, 'refreshToken').mockRejectedValue(new Error('401'));
await callGuard();
expect(next).toHaveBeenCalledWith(
expect.objectContaining({ path: '/login' }),
);
});
it('calls next() when already logged in', async () => {
document.cookie = 'isLuciaLoggedIn=true';
await callGuard();
expect(next).toHaveBeenCalled();
});
});