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:
@@ -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({});
|
||||
});
|
||||
});
|
||||
Generated
+2677
File diff suppressed because it is too large
Load Diff
+11
-1
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user