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({});
});
});