# Étape 6 — Tests, soutenance et rendu école > **Prérequis :** étapes 2–5 OK sur device (OAuth `public` + `projects`, recherche, profil, retour, layout). ## Objectif 1. Valider la **partie obligatoire** du sujet avant peer-eval. 2. Préparer le **dépôt Vogosphere** (sans `docs/`, sans `.env`). 3. Savoir **quoi montrer** à l’évaluateur et dans quel ordre. Référence correcteurs : [swiftyCompanion/README.md](../../swiftyCompanion/README.md). --- ## Commandes avant soutenance Depuis le package Flutter : ```bash cd ~/projets/42School/swifty_companion/swiftyCompanion/swifty_companion flutter pub get flutter analyze flutter test flutter doctor ``` Sur téléphone (USB ou Wi‑Fi ADB) : ```bash flutter devices flutter run -d ``` Après changement de `.env` ou de scopes OAuth : **arrêter** `flutter run` et relancer ; **reconnexion** 42 dans l’app. --- ## Checklist peer-eval (détaillée) | # | Test | Comment le montrer | Où c’est géré dans l’app | |---|------|--------------------|---------------------------| | 1 | `flutter test` | Terminal sur la machine de dev | `test/widget_test.dart` | | 2 | Parcours nominal | Connexion → login valide → profil | `SearchScreen` → `ProfileScreen` | | 3 | Profil complet | Photo, ≥ 4 champs, skills (niveau + %), projets validés **et** failed | `IntraProfileService` + `profile_screen.dart` | | 4 | Login invalide | `zzzzinvalid` → message, pas de crash | `IntraUserNotFoundException` | | 5 | Hors ligne | Mode avion sur recherche **ou** sur profil (erreur + réessai) | `IntraNetworkException`, retry profil | | 6 | Navigation | Retour AppBar → nouvelle recherche, session conservée | `Navigator.pop` | | 7 | Petit écran / rotation | Paysage, clavier ouvert sur la recherche | `ResponsiveScrollBody`, `swifty_ui.dart` | | 8 | Bonus | Access invalide → refresh → recherche OK | [étape 7](etape-07-bonus-token.md) | **Ordre de démo suggéré :** connexion → profil riche (skills + failed) → login faux → mode avion → retour → `flutter test`. --- ## Correspondance sujet v4 ↔ app | Critère sujet | Statut attendu | |---------------|----------------| | 2 vues | `SearchScreen` + `ProfileScreen` | | Erreurs | Login vide, inconnu, réseau, 401, 403, 429 | | Token unique | `IntraAuthService.instance` partout | | OAuth Intra | `flutter_appauth` + `.env` | | Layout adaptatif | Étape 5 (`wideBreakpoint` 720 px) | Champs masqués par l’API (`—`) : normal (confidentialité sujet). --- ## Rendu Git école ### Ce qui part sur Vogosphere Racine du dépôt Intra = contenu de **`swiftyCompanion/`** : - `README.md`, `.gitignore`, `.env.example` - `swifty_companion/` (code Flutter) ### Ce qui ne part **pas** - `docs/` (dépôt perso uniquement) - `.env` (secrets) - Fichiers de backup type `.env copy` ### Vérifier avant push ```bash cd ~/projets/42School/swifty_companion/swiftyCompanion git status # si repo école initialisé ici ``` - Aucun `.env` listé - `REDIRECT_URI` dans `.env.example` = URI enregistrée sur l’Intra - README école à jour pour les correcteurs Workflow détaillé : [README racine](../../README.md) (section « Pousser vers l’école »). --- ## Parler en soutenance (30 s) > « Swifty Companion : OAuth2 Intra une fois, puis recherche par login. Le profil charge cursus, skills et projects_users avec le même token. Erreurs réseau et API gérées ; layout scrollable et deux colonnes sur grand écran. Secrets dans `.env` local, non versionné. » --- ## Critères « étape 6 terminée » | # | Fait ? | |---|--------| | 1 | `flutter analyze` + `flutter test` verts | | 2 | Checklist peer-eval cochée sur device | | 3 | `.env` absent du futur commit école | | 4 | Tu sais lancer la démo sans notes | --- ## Ensuite — étape 7 (bonus) → [etape-07-bonus-token.md](etape-07-bonus-token.md) : refresh token à l’expiration (optionnel si obligatoire parfaite).