test: ajoute des tests automatisés frontend (Vitest) et mobile (Jest)

- Frontend Next.js : Vitest + Testing Library
  - Button (rendu, clic, état loading)
  - auth-store (setAuth, déconnexion, persistance token)
  - script `npm test`, config jsdom + alias @/
- Mobile Expo : Jest (preset jest-expo)
  - getApiError (erreur Axios, validation, erreur générique, sans réponse)
  - script `npm test`, transformIgnorePatterns adapté
- Cahier de tests : section « Outils de test automatisés » (PHPUnit + Vitest + Jest)
  et entrée 6.4 (PV de recette) au sommaire

Suites vertes : backend 15, frontend 6, mobile 4. tsc/lint/build OK, expo-doctor 18/18.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Azmog
2026-06-18 22:17:20 +02:00
parent 8904e6127a
commit 0e07f5a57e
11 changed files with 4713 additions and 32 deletions
+36
View File
@@ -0,0 +1,36 @@
import axios from 'axios';
import { getApiError } from '../lib/api';
// expo-secure-store touche un module natif : on le mocke pour les tests unitaires.
jest.mock('expo-secure-store', () => ({
getItemAsync: jest.fn(),
setItemAsync: jest.fn(),
deleteItemAsync: jest.fn(),
}));
describe('getApiError', () => {
it("extrait le message d'une erreur Axios", () => {
const err = new axios.AxiosError('échec');
err.response = {
data: { message: 'Identifiants incorrects' },
} as never;
expect(getApiError(err).message).toBe('Identifiants incorrects');
});
it('extrait les erreurs de validation par champ', () => {
const err = new axios.AxiosError('422');
err.response = {
data: { errors: { email: ['Cet email est déjà utilisé'] } },
} as never;
expect(getApiError(err).errors?.email).toEqual(['Cet email est déjà utilisé']);
});
it('retourne un objet vide pour une erreur non-Axios', () => {
expect(getApiError(new Error('boom'))).toEqual({});
});
it('retourne un objet vide quand la réponse Axios est absente', () => {
const err = new axios.AxiosError('réseau');
expect(getApiError(err)).toEqual({});
});
});
+2677
View File
File diff suppressed because it is too large Load Diff
+11 -1
View File
@@ -6,7 +6,14 @@
"start": "expo start",
"android": "expo start --android",
"ios": "expo start --ios",
"web": "expo start --web"
"web": "expo start --web",
"test": "jest"
},
"jest": {
"preset": "jest-expo",
"transformIgnorePatterns": [
"node_modules/(?!((jest-)?react-native|@react-native(-community)?|expo(nent)?|@expo(nent)?/.*|@expo-google-fonts/.*|react-navigation|@react-navigation/.*|@unimodules/.*|unimodules|sentry-expo|native-base|react-native-svg|axios))"
]
},
"dependencies": {
"@expo/vector-icons": "^14.0.0",
@@ -30,7 +37,10 @@
},
"devDependencies": {
"@babel/core": "^7.25.0",
"@types/jest": "^30.0.0",
"@types/react": "~19.0.0",
"jest": "^29.7.0",
"jest-expo": "~53.0.0",
"typescript": "~5.8.0"
},
"private": true