6.5 KiB
6.5 KiB
Testing Patterns
Analysis Date: 2026-02-15
Test Framework
Runner:
- Not detected - no test runner configured in package.json
- No Vitest, Jest, Mocha, or other test framework installed
- No test scripts in
package.jsonfor either frontend or backend
Assertion Library:
- Not installed - no testing dependencies found
Run Commands:
- No test commands available
- Frontend:
npm run dev,npm run build,npm run preview - Backend:
npm start,npm run dev(nodemon)
Test File Organization
Location:
- No test files found in project
- No
.test.js,.spec.js,.test.jsx, or.spec.jsxfiles in source directories - No
__tests__directories present
Naming:
- Not applicable - no tests exist
Structure:
- Not applicable - no tests exist
Current Test Status
Coverage:
- Not tested - zero test files, no coverage tooling
- No test requirements or targets defined
- No test configuration files (vitest.config., jest.config., etc.)
View Coverage:
- Not applicable - no coverage tools present
Testing Gaps
High Priority
Authentication Flow:
- Location:
frontend/src/context/AuthContext.jsx,frontend/src/pages/LoginPage.jsx,frontend/src/pages/RegisterPage.jsx,backend/src/index.js(routes) - Missing: Token validation, login/register error handling, token expiration, protected route behavior
- Risk: Auth system could silently fail or allow unauthorized access
Workout Logging:
- Location:
frontend/src/App.jsx(logSet function),backend/src/index.js(POST /api/logs) - Missing: Set creation/update, duplicate handling, weight/reps validation, concurrent updates
- Risk: Incorrect workout data, lost entries, or duplicate logs
API Error Handling:
- Location: All fetch calls in
frontend/src/**, all route handlers inbackend/src/index.js - Missing: Network failures, timeout handling, malformed responses, edge cases
- Risk: Silent failures, infinite loading states, unhandled exceptions
Medium Priority
Profile Management:
- Location:
frontend/src/pages/ProfilePage.jsx,frontend/src/pages/OnboardingWizard.jsx,backend/src/index.js(user routes) - Missing: Profile updates, measurements tracking, strength tracking, optional field handling
- Risk: Lost user data, incorrect profile state
Program Navigation:
- Location:
frontend/src/pages/Dashboard.jsx,frontend/src/App.jsx,backend/src/index.js(program routes) - Missing: Week/day navigation, today's workout calculation, day cycling logic
- Risk: Wrong workout shown, incorrect day assignments
Data Validation:
- Location: All form submissions (Login, Register, Profile updates), API inputs
- Missing: Email format validation, password requirements, numeric field bounds, null checks
- Risk: Invalid data persisted, server errors, SQL injection (though using parameterized queries)
Low Priority
UI State Management:
- Location:
frontend/src/App.jsx,frontend/src/pages/Dashboard.jsx - Missing: View transitions, state consistency between pages, race conditions in state updates
- Risk: Inconsistent UI, stale data display
Warmup Tracking:
- Location:
frontend/src/pages/WorkoutPage.jsx - Missing: Warmup completion tracking, persistence, session state
- Risk: Lost warmup progress on page reload
Recommended Testing Strategy
Phase 1: Core Functionality
-
Auth Integration Tests
- Register → Login → Protected Route → Logout flow
- Error cases (invalid credentials, duplicate email)
- Token persistence across page reloads
-
Workout Logging Integration Tests
- Log set → Verify in state → Verify in API
- Update existing log vs create new
- Progression calculation
-
API Unit Tests
- Backend route handlers with mocked database
- Error handling (400, 401, 404, 500 status codes)
- Database constraint handling (duplicate email, foreign keys)
Phase 2: Data Integrity
- Form validation tests (Login, Register, Profile, Measurements)
- Profile update consistency tests
- Program/day/exercise relationship tests
Phase 3: UI/UX
- Component rendering tests (pages, conditional displays)
- State transition tests (view changes, navigation)
- Loading/error states display
Testing Patterns (When Tests Are Added)
Frontend (React) Pattern
// Expected pattern for future tests
import { render, screen, fireEvent, waitFor } from '@testing-library/react';
import { BrowserRouter } from 'react-router-dom';
import { AuthProvider } from '../context/AuthContext';
import LoginPage from '../pages/LoginPage';
describe('LoginPage', () => {
it('should submit login form with valid credentials', async () => {
render(
<BrowserRouter>
<AuthProvider>
<LoginPage />
</AuthProvider>
</BrowserRouter>
);
fireEvent.change(screen.getByPlaceholderText('E-post'), { target: { value: 'test@example.com' } });
fireEvent.change(screen.getByPlaceholderText('Lösenord'), { target: { value: 'password123' } });
fireEvent.click(screen.getByText('Logga in'));
await waitFor(() => {
expect(screen.queryByText('Loggar in...')).not.toBeInTheDocument();
});
});
});
Backend (Express) Pattern
// Expected pattern for future tests
const request = require('supertest');
const app = require('../index');
describe('POST /api/auth/login', () => {
it('should return 401 for invalid credentials', async () => {
const res = await request(app)
.post('/api/auth/login')
.send({ email: 'test@example.com', password: 'wrong' });
expect(res.status).toBe(401);
expect(res.body).toHaveProperty('error');
});
it('should return token for valid credentials', async () => {
const res = await request(app)
.post('/api/auth/login')
.send({ email: 'test@example.com', password: 'correct' });
expect(res.status).toBe(200);
expect(res.body).toHaveProperty('token');
expect(res.body).toHaveProperty('user');
});
});
Setup Recommendations
Install testing dependencies:
# Frontend
npm install --save-dev @testing-library/react @testing-library/jest-dom vitest
# Backend
npm install --save-dev supertest jest
Create config files:
frontend/vitest.config.js- Configure for React componentsbackend/jest.config.js- Configure for Node.js
Test structure:
frontend/src/
__tests__/
context/
AuthContext.test.jsx
pages/
LoginPage.test.jsx
Dashboard.test.jsx
components/
Icons.test.jsx
backend/src/
__tests__/
auth.test.js
programs.test.js
logs.test.js
Testing analysis: 2026-02-15