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>
tests/Controller/StatusPageControllerTest.php (reecrit, 6 tests):
- Helper addServiceToCategory(): utilise ReflectionProperty pour
ajouter un Service a la Collection services de ServiceCategory
(Doctrine ne gere pas l'inverse en dehors de l'ORM)
- Helper createContainer() et createEm() pour factoriser les stubs
- testIndexEmpty: aucune categorie, globalStatus up
- testIndexWithUpService: 1 service up, couvre le foreach services
+ getHistoryForDays + getDailyStatus + computeUptimeRatio +
query ServiceMessage + query ServiceLog
- testIndexWithDownService: service down, globalStatus passe a down
- testIndexWithDegradedService: service degraded, globalStatus degraded
- testIndexWithMaintenanceService: service maintenance, globalStatus
maintenance (branche elseif up === globalStatus)
- testIndexMixedStatuses: 3 services (up + degraded + down), couvre
toutes les branches de calcul globalStatus simultanement
Resultat: 378 tests, 731 assertions, 0 failures
StatusPageController: 100% methodes (1/1), 100% lignes (53/53)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
tests/Controller/StatusPageControllerTest.php (2 nouveaux tests):
- testIndexWithDownService: service avec status 'down', verifie que
le globalStatus passe a 'down' et la page retourne 200
- testIndexWithDegradedAndMaintenanceServices: 2 services avec status
'degraded' et 'maintenance', couvre les branches de calcul du
globalStatus (degraded si pas down, maintenance si up)
tests/Controller/WebhookDocuSealControllerTest.php (5 nouveaux tests):
- testFormCompletedAttestationNotFound: form.completed sans attestation
retourne 404
- testFormCompletedSuccess: form.completed avec attestation, verifie
markAsSigned + markAsSent + status 'sent' + reponse completed
- testBodySecretVerification: verification du secret dans le body
JSON quand le header ne correspond pas
- testSyncSubmitterIdFromMetadata: verifie que le submitterId est
synchronise depuis les metadata (reference → attestation → setSubmitterId)
- testFormStartedNotFound / testFormDeclinedNotFound: retournent 404
quand l'attestation n'est pas trouvee
Resultat: 376 tests, 729 assertions, 0 failures
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
tests/Entity/AnalyticsTest.php:
- 16 nouveaux tests pour les methodes statiques de parsing:
- parseDeviceType: desktop (UA Windows), mobile (iPhone, Android),
tablet (iPad)
- parseOs: Windows (Windows NT), macOS (Macintosh), iOS (iPhone sans
Mac OS X dans le UA), Android, Linux, unknown (retourne null)
- parseBrowser: Chrome, Firefox, Edge (Edg/), Safari (sans Chrome),
Opera (OPR/), unknown (retourne null)
AnalyticsUniqId passe de 89.66% (26/29) a 100% (29/29) methodes
et de 56.72% (38/67) a 100% (67/67) lignes
Resultat: 351 tests, 699 assertions, 0 failures
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
tests/Entity/AnalyticsTest.php:
- testUniqIdSetters fusionne avec Screen et Optionals en un seul test
testUniqIdSettersFluentAndGetters qui verifie que chaque setter
retourne $this (fluent interface) puis que le getter retourne
la bonne valeur pour les 10 proprietes: uid, hash, ipHash,
userAgent, deviceType, screenWidth, screenHeight, language, os, browser
- testUniqIdUser: ajout verification fluent sur setUser() et test
du set a null
Resultat: 336 tests, 683 assertions, 0 failures
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Probleme: PHPUnit 13 genere des notices quand createMock() est utilise
sans expects(), et des deprecations pour \$this->any() et ->with()
sans expects().
Corrections:
- tests/Service/AppLoggerServiceTest.php: suppression du setUp() partage,
chaque test cree ses propres stubs/mocks selon ses besoins
(bus createMock avec expects dans les tests log, createStub dans verify)
- tests/EventSubscriber/CsrfProtectionSubscriberTest.php: csrfTokenManager
change de createMock a createStub (aucun expects utilise)
- tests/EventSubscriber/MessengerFailureSubscriberTest.php: em et mailer
changes de createMock a createStub (aucun expects utilise)
- tests/EventListener/AdminLogListenerTest.php: testLogThrowsDoesNotBlock
cree son propre stub local au lieu d'utiliser le mock du setUp,
attribut #[AllowMockObjectsWithoutExpectations] ajoute pour le mock
du setUp qui reste instancie mais non utilise dans ce test
- tests/Controller/SmallControllersTest.php: mocks sans expects remplaces
par createStub via script automatise
- tests/Controller/MainControllersTest.php: idem
- tests/Controller/Admin/ClientsControllerTest.php: idem
- tests/MessageHandler/AnalyticsMessageHandlerTest.php: idem
- tests/EventListener/ExceptionListenerTest.php: idem
Resultat: 262 tests, 454 assertions, 0 failures, 0 deprecations, 0 notices
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Deprecation corrigee: "The any() invoked count expectation is deprecated"
- Remplacement de ->expects(\$this->any())->method() par ->method()
sur les stubs dans 6 fichiers:
tests/Controller/Admin/AdminControllersTest.php,
tests/Controller/SmallControllersTest.php,
tests/Controller/MainControllersTest.php,
tests/EventListener/ExceptionListenerTest.php,
tests/EventSubscriber/MessengerFailureSubscriberTest.php,
tests/MessageHandler/AnalyticsMessageHandlerTest.php
Deprecation corrigee: "Using with() without expects() is deprecated"
- Suppression des ->with() sur les stubs qui n'ont pas de expects()
dans SmallControllersTest, MessengerFailureSubscriberTest,
AnalyticsMessageHandlerTest
AdminControllersTest::testStatusIndex:
- EntityManagerInterface change de createMock a createStub
(pas d'expects() sur getRepository)
Resultat: 262 tests, 454 assertions, 0 failures, 0 deprecations
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
tests/Entity/ServiceStatusHistoryTest.php (nouveau, 2 tests):
- testConstructor: verifie id null, service, status, message et createdAt
- testConstructorWithoutMessage: message nullable a null par defaut
tests/Entity/UserExtendedTest.php (nouveau, 9 tests):
- testKeycloakId: get/set keycloakId nullable
- testTempPassword: get/set/has tempPassword nullable
- testGoogleAuthenticator: isEnabled (false par defaut, true quand
secret set + isGoogleAuthEnabled true), get/set secret, getUsername
- testEmailAuth: isEnabled (false par defaut), getRecipient, get/set code
- testBackupCodes: get/set codes, isBackupCode, invalidateBackupCode
(supprime du tableau)
- testAvatar: get/set avatar nullable
- testFullName: retourne "FirstName LastName"
- testRoles: contient toujours ROLE_USER, set/get custom roles
- testUserIdentifier: retourne l'email
tests/EventListener/AdminLogListenerTest.php (nouveau, 7 tests):
- testLogsAdminRoute: appelle log() pour une route app_admin_*
- testLogsAdminRouteWithUser: passe le User depuis le TokenStorage
- testIgnoresNonAdminRoute: ne log pas les routes non admin
- testIgnoresSubRequest: ne log pas les sous-requetes
- testIgnoresAjaxSearch: ne log pas les recherches AJAX
- testLogThrowsDoesNotBlock: exception dans log() ne bloque pas
la requete (catch silencieux)
- testNoTokenReturnsNullUser: token null passe null comme user
Resultat global: 262 tests, 463 assertions, 0 failures
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
tests/Service/KeycloakAdminServiceTest.php:
- testListGroups: liste les groupes, verifie 2 resultats et le nom du premier
- testCreateGroup: creation reussie retourne true (status 201)
- testCreateGroupFailure: creation echouee retourne false (status 409)
- testGetRequiredGroups: verifie que la liste contient siteconseil_admin,
siteconseil_member, esy-web, esy-mail et fait 15 elements au total
- testEnsureRequiredGroupsAllExist: tous les groupes existent deja,
retourne un tableau vide (aucune creation)
- testEnsureRequiredGroupsCreatesMissing: seul siteconseil_admin existe,
les 14 autres sont crees, le resultat ne contient pas siteconseil_admin
Resultat global: 244 tests, 420 assertions, 0 failures
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
tests/Controller/Admin/ClientsControllerTest.php (nouveau, 7 tests):
- testIndex: liste des clients avec repo vide
- testCreateGet: affichage du formulaire de creation
- testCreatePostInvalidData: soumission avec champs vides,
UserManagementService lance InvalidArgumentException
- testCreatePostThrowsGenericError: soumission qui lance RuntimeException
- testSearchEmpty: recherche avec query vide retourne []
- testSearchWithQuery: recherche retourne les resultats Meilisearch
- testToggle: bascule actif/suspendu d'un client, verifie flush + redirect
Helper createController() avec RequestStack pour supporter les flash
messages et le router pour les redirections
Resultat global: 238 tests, 408 assertions, 0 failures
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
tests/Service/MeilisearchServiceTest.php:
- testIndexPriceSuccess: indexe un PriceAutomatic sans erreur
- testIndexPriceThrows: indexation echoue, log l'erreur sans throw
- testRemovePriceSuccess: supprime un price de l'index
- testRemovePriceThrows: suppression echoue, log sans throw
- testSearchPricesSuccess: recherche retourne les hits avec type/title
- testSearchPricesThrows: recherche echoue, retourne tableau vide
Total: 20 tests (6 nouveaux)
tests/Service/AppLoggerServiceTest.php (nouveau):
- testLogDispatchesMessage: verifie que log() dispatch un AppLogMessage
via le bus Messenger avec method, url, route, action corrects
- testLogWithUser: log avec utilisateur, userId passe au message
- testLogPostAddsSubmission: les POST ajoutent "(soumission)" a l'action
- testLogUnknownRoute: route inconnue genere "Acces a {route}"
- testLogDirectPersistsImmediately: logDirect() appelle persist+flush
- testLogDirectWithUser: logDirect avec user et IP
- testVerifyLogValid: HMAC valide avec le meme secret
- testVerifyLogInvalid: HMAC invalide avec un secret different
Total: 8 tests
Resultat global: 231 tests, 398 assertions, 0 failures
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
tests/TestUserProvider.php (nouveau):
- Implementation de UserProviderInterface pour l'environnement test
- loadUserByIdentifier(), refreshUser(), supportsClass()
- Le service etait reference dans security.yaml when@test mais
n'existait pas
config/services_test.yaml (nouveau):
- Enregistrement de App\Tests\TestUserProvider comme service public
pour que le container test puisse le resoudre
tests/Controller/LegalControllerTest.php:
- Selecteurs CSS mis a jour: .border-red-600 remplace par .border-red-300
et .border-green-600 par .border-green-300 (glassmorphism)
tests/Controller/Admin/AdminControllersTest.php:
- testSyncIndex(): ajout de PriceAutomaticRepository et
StripeWebhookSecretRepository dans les arguments de
SyncController::index() (4 arguments au lieu de 2)
tests/Controller/MainControllersTest.php:
- testForgotPasswordFullFlow(): sendEmail attendu 2 fois au lieu de 1
(step 2 envoie le code, step 3 envoie la confirmation de changement)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Problem: OAuth login failed because the authenticator was checking for
old Keycloak group names (super_admin_asso, gp_member) that no longer
exist in the master realm.
Changes:
- src/Security/KeycloakAuthenticator.php:106: resolveRoles() now checks
for 'siteconseil_admin' instead of 'super_admin_asso' to grant ROLE_ROOT
- src/Controller/Admin/MembresController.php:140: member creation role
resolution updated from 'super_admin_asso' to 'siteconseil_admin'
- templates/admin/membres.html.twig: checkbox values updated from
'gp_member' to 'siteconseil_member' and 'super_admin_asso' to
'siteconseil_admin' in the member management form
- assets/app.js:5-6: JS mutual exclusion logic updated to use new
group values 'siteconseil_member' and 'siteconseil_admin'
- tests/Security/KeycloakAuthenticatorTest.php:79: test data updated
from 'super_admin_asso' to 'siteconseil_admin'
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add for/id attributes to all form labels for accessibility compliance
- Add <title> tags to PDF templates (rgpd_access, rgpd_no_data, rgpd_deletion, contrat_revendeur)
- Add role="presentation" to email layout tables
- Remove deprecated cellpadding/cellspacing attributes from all templates
- Fix PHPUnit notices by replacing createMock with createStub where no expectations are set
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Reduce cognitive complexity and fix code smells across multiple files:
- Extract helper methods in DocuSealService, ForgotPasswordController, WebhookDocuSealController
- Reduce MembresController.persistLocalUser from 8 to 3 parameters using typed array
- Replace chained if/returns with ROLE_ROUTES map in LoginSuccessHandler
- Add 100% test coverage for AnalyticsCryptoService (15 tests)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>