Skip to content

Commit c5f2de5

Browse files
committed
Complete Jest to Vitest migration for frontend tests
1 parent 3eddfac commit c5f2de5

7 files changed

Lines changed: 270 additions & 264 deletions

File tree

.github/workflows/ci.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,7 @@ jobs:
3838
continue-on-error: true
3939

4040
- name: Run type checking
41-
run: echo "Skipping type checking for now - test files need Vitest migration"
42-
continue-on-error: true
41+
run: npm run type-check
4342

4443
- name: Run tests
4544
run: npm run test

frontend/src/__tests__/app/login/page.test.tsx

Lines changed: 28 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -6,37 +6,38 @@
66

77
import React from 'react';
88
import { render, screen, fireEvent } from '@testing-library/react';
9+
import { describe, it, expect, beforeEach, vi, type MockedFunction } from 'vitest';
910
import LoginPage from '@/app/login/page';
1011
import { useAuth } from '@/components/auth/AuthProvider';
1112

1213
// Mock the auth context
13-
jest.mock('@/components/auth/AuthProvider', () => ({
14-
useAuth: jest.fn(),
14+
vi.mock('@/components/auth/AuthProvider', () => ({
15+
useAuth: vi.fn(),
1516
}));
1617

1718
// Mock Next.js navigation
18-
jest.mock('next/navigation', () => ({
19+
vi.mock('next/navigation', () => ({
1920
useRouter: () => ({
20-
push: jest.fn(),
21+
push: vi.fn(),
2122
}),
2223
useSearchParams: () => new URLSearchParams(),
2324
}));
2425

25-
const mockUseAuth = useAuth as jest.MockedFunction<typeof useAuth>;
26+
const mockUseAuth = useAuth as MockedFunction<typeof useAuth>;
2627

2728
describe('Login Page', () => {
2829
beforeEach(() => {
29-
jest.clearAllMocks();
30+
vi.clearAllMocks();
3031
mockUseAuth.mockReturnValue({
3132
user: null,
3233
accessToken: null,
3334
isAuthenticated: false,
3435
isLoading: false,
3536
error: null,
36-
login: jest.fn(),
37-
logout: jest.fn(),
38-
refreshToken: jest.fn(),
39-
setError: jest.fn(),
37+
login: vi.fn(),
38+
logout: vi.fn(),
39+
refreshToken: vi.fn(),
40+
setError: vi.fn(),
4041
});
4142
});
4243

@@ -74,22 +75,22 @@ describe('Login Page', () => {
7475

7576
describe('Authentication States', () => {
7677
it('should redirect to dashboard when already authenticated', () => {
77-
const mockPush = jest.fn();
78-
jest.doMock('next/navigation', () => ({
78+
const mockPush = vi.fn();
79+
vi.doMock('next/navigation', () => ({
7980
useRouter: () => ({ push: mockPush }),
8081
useSearchParams: () => new URLSearchParams(),
8182
}));
8283

8384
mockUseAuth.mockReturnValue({
84-
user: { id: '1', name: 'Test User', email: 'test@example.com' },
85+
user: { id: '1', name: 'Test User', email: 'test@example.com', avatar_url: '', created_at: '2024-01-01T00:00:00Z', last_sign_in_at: '2024-01-01T12:00:00Z' },
8586
accessToken: 'token',
8687
isAuthenticated: true,
8788
isLoading: false,
8889
error: null,
89-
login: jest.fn(),
90-
logout: jest.fn(),
91-
refreshToken: jest.fn(),
92-
setError: jest.fn(),
90+
login: vi.fn(),
91+
logout: vi.fn(),
92+
refreshToken: vi.fn(),
93+
setError: vi.fn(),
9394
});
9495

9596
render(<LoginPage />);
@@ -98,16 +99,16 @@ describe('Login Page', () => {
9899
});
99100

100101
it('should show error message when authentication fails', () => {
101-
const mockSetError = jest.fn();
102+
const mockSetError = vi.fn();
102103
mockUseAuth.mockReturnValue({
103104
user: null,
104105
accessToken: null,
105106
isAuthenticated: false,
106107
isLoading: false,
107108
error: 'Authentication failed',
108-
login: jest.fn(),
109-
logout: jest.fn(),
110-
refreshToken: jest.fn(),
109+
login: vi.fn(),
110+
logout: vi.fn(),
111+
refreshToken: vi.fn(),
111112
setError: mockSetError,
112113
});
113114

@@ -118,22 +119,22 @@ describe('Login Page', () => {
118119
});
119120

120121
it('should handle OAuth errors from URL parameters', () => {
121-
const mockSetError = jest.fn();
122+
const mockSetError = vi.fn();
122123
mockUseAuth.mockReturnValue({
123124
user: null,
124125
accessToken: null,
125126
isAuthenticated: false,
126127
isLoading: false,
127128
error: null,
128-
login: jest.fn(),
129-
logout: jest.fn(),
130-
refreshToken: jest.fn(),
129+
login: vi.fn(),
130+
logout: vi.fn(),
131+
refreshToken: vi.fn(),
131132
setError: mockSetError,
132133
});
133134

134135
// Mock useSearchParams to return an error
135-
jest.doMock('next/navigation', () => ({
136-
useRouter: () => ({ push: jest.fn() }),
136+
vi.doMock('next/navigation', () => ({
137+
useRouter: () => ({ push: vi.fn() }),
137138
useSearchParams: () => new URLSearchParams('?error=access_denied'),
138139
}));
139140

0 commit comments

Comments
 (0)