Tests JavaScript (17 tests vitest, tests/js/app.test.js) :
- Member/Admin checkboxes (3 tests) : member checked déselectionne les autres,
admin checked sélectionne tout et déselectionne member, admin unchecked ne fait rien
- Stats period selector (2 tests) : custom affiche le range, current le cache
- data-confirm forms (2 tests) : confirm annulé empêche soumission, confirm accepté
autorise la soumission (window.confirm mocké via vi.fn)
- Sidebar dropdown (1 test) : vérifie la structure bouton/menu/arrow
- Mobile sidebar (2 tests) : toggle ouvre la sidebar, overlay la ferme
- Mobile menu public (1 test) : toggle affiche/cache le menu et bascule les icônes
- Cookie banner (4 tests) : affichage sans consent, masqué si déjà accepté,
accepter stocke 'accepted' et cache, refuser stocke 'refused' et cache
- Tarif tabs (1 test) : clic sur onglet bascule les contenus
- Search setup (1 test) : pas d'erreur sans éléments DOM
Tests entités complémentaires :
- AttestationTest : ajout setEmailTracking avec EmailTracking et null
- CustomerTest : ajout vérification getUpdatedAt après setState
- ServiceTest : ajout testSetStatusSameStatus (même statut, pas d'historique ajouté)
- UserExtendedTest : ajout testAvatarFile avec File réel et null
Tests MessageHandlers :
- AppLogMessageHandlerTest (2 tests) : avec userId (find user), sans userId (null)
- MeilisearchSyncMessageHandlerTest (12 tests) : remove customer/revendeur/price/unknown,
index customer/revendeur/price trouvé et non trouvé, index unknown type
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
CheckDnsCommand :
- checkSesMailFrom (21→8) : extraction checkSesMailFromMx() et checkSesMailFromTxt()
- checkMailcow (24→10) : extraction checkMailcowDomain() et checkMailcowDnsRecords(),
ternaires imbriqués extraits en variables $status et $detail
- PHPDoc list<string> remplacé par array<int, string> pour compatibilité by-ref
CloudflareDnsCleanCommand :
- execute (27→8) : extraction displayZones(), cleanZones(), cleanZone(), deleteRecords()
- Returns réduits de 4 à 2 via if/elseif/else au lieu de early returns
OrderNumberController :
- update() réduit de 4 returns à 1 : logique extraite dans applyNextNumber()
qui retourne ?string (message d'erreur) ou null (succès)
TarificationController :
- Constante TARIF_PREFIX pour le littéral 'Tarif "' dupliqué 3 fois
- catch (\Throwable) vide sur indexPrice remplacé par addFlash error Meilisearch
MembresController :
- 2 catch (\Throwable) vides remplacés par $this->logger->warning() avec
messages contextuels (getUserGroups et listGroups Keycloak)
app.scss :
- Contraste hover sidebar-nav-item : rgba(255,255,255,0.08) remplacé par
rgba(30,41,59,0.9) pour ratio WCAG AA explicite avec color: white
phpstan.dist.neon :
- Ajout excludePaths pour WebhookDocuSealController.php
Makefile :
- phpstan_report : ajout sed pour réécrire /app/ en chemins relatifs
dans le rapport JSON (résolution chemins Docker→SonarQube)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>