Project

General

Profile

Feature #124 » 124-rapport-technique-qa.txt

Redmine Admin, 06/15/2026 12:59 PM

 
================================================================================
RAPPORT TECHNIQUE QA — Ticket #124 (GetYourJob)
"Recuperer automatiquement la photo de profil LinkedIn a la connexion"
================================================================================
Branche : feat/124-linkedin-profile-picture
Commit teste : b99ff5d feat(auth): auto-fetch LinkedIn profile picture + DP initials fallback (#124)
PR : #255 (base dev)
Worktree QA : .worktrees/qa-124 (dedie, cree depuis origin/feat/124-linkedin-profile-picture)
Date : 2026-06-15
Note : secrets/tokens/CLIENT_ID/CLIENT_SECRET volontairement absents (jamais imprimes ni joints).

--------------------------------------------------------------------------------
PERIMETRE MODIFIE (git diff origin/dev...HEAD)
--------------------------------------------------------------------------------
src/components/atoms/ConnectionButton.tsx | 42 +-- (avatar en-tete -> UserAvatar)
src/components/atoms/UserAvatar.tsx | 82 ++ (NOUVEAU : avatar rond + fallback)
src/components/atoms/__tests__/UserAvatar.test.tsx | 59 ++ (NOUVEAU : tests)
src/lib/__tests__/auth-providers.test.ts | 63 ++ (NOUVEAU : tests)
src/lib/auth-providers.ts | 45 ++ (NOUVEAU : mapLinkedInProfileToUser)
src/lib/auth.ts | 15 +- (provider LinkedIn delegue au helper)

--------------------------------------------------------------------------------
1) SUITES VITEST TOUCHEES
--------------------------------------------------------------------------------
Commande : npx vitest run src/lib/__tests__/auth-providers.test.ts \
src/components/atoms/__tests__/UserAvatar.test.tsx

OK src/lib/__tests__/auth-providers.test.ts (4 tests)
OK src/components/atoms/__tests__/UserAvatar.test.tsx (7 tests)

Test Files : 2 passed (2)
Tests : 11 passed (11)

Couverture des tests :
- mapLinkedInProfileToUser : claim OIDC `picture` -> `image` ; id<-sub, name, email ;
defaut JOB_SEEKER/hasSelectedRole=false ; `image` null quand `picture` absent.
- UserAvatar / getAvatarInitials : "Dupont Pierre"->"DP", "pierre"->"P", null/""->"DP" ;
priorite manuel > provider > initiales ; rendu rond + fond colore quand aucune photo.

--------------------------------------------------------------------------------
2) TYPECHECK (tsc --noEmit) — FICHIERS TOUCHES
--------------------------------------------------------------------------------
Commande : npx tsc --noEmit -p tsconfig.json (puis filtre sur les fichiers du diff)

Fichiers du ticket : 0 erreur
- src/lib/auth-providers.ts : clean
- src/components/atoms/UserAvatar.tsx : clean
- src/components/atoms/ConnectionButton.tsx : clean

Une (1) erreur subsiste dans src/lib/auth.ts(46) — typage Prisma de
`subscription.createMany` dans ensureDefaultSubscriptions. VERIFIE PRE-EXISTANT :
ce bloc est IDENTIQUE sur origin/dev et n'est PAS touche par le diff #124
(le diff ne touche que l'import du helper et le provider LinkedIn).
=> hors perimetre, non bloquant pour ce ticket.

(Le reste de la base affiche des erreurs tsc pre-existantes hors perimetre — non liees a #124.)

--------------------------------------------------------------------------------
3) INSPECTION SOURCE — MAPPING CRITERES D'ACCEPTATION
--------------------------------------------------------------------------------
AC1 Photo LinkedIn recuperee auto a la connexion, affichee en haut a droite
-> OK. auth.ts: provider LinkedIn, scope `openid profile email ...` deja demande ;
profile() delegue a mapLinkedInProfileToUser() qui mappe `picture` -> `image`
(auth-providers.ts l.41), comme Google. ConnectionButton.tsx (avatar en-tete,
coin haut-droit) rend <UserAvatar image={user.image} ...>.

AC2 Sans photo LinkedIn : icone ronde, initiales "DP", fond colore
-> OK. UserAvatar.tsx l.70-81 : div rounded-full bg-sky-100 text-sky-700,
initiales via getAvatarInitials (defaut "DP"). Preuve visuelle: 124-avatar-states.png.

AC3 Photo manuelle GetYourJob prime toujours sur l'auto (LinkedIn/Google)
-> OK. Double garantie :
(a) structurel : l'image provider n'est ecrite qu'a la creation du compte
(PrismaAdapter) et jamais reecrite a la reconnexion (auth.ts) ;
(b) affichage : UserAvatar.tsx l.53 resolvedImageUrl = profileImageUrl || image
-> l'upload manuel (DeveloperProfile.profileImageUrl) passe avant le provider.

AC4 Comportement coherent avec Google (meme logique fallback + priorite)
-> OK. Meme forme de retour profile() que GoogleProvider ; meme composant UserAvatar
et meme chaine de priorite quel que soit le provider.

AC5 Aucun message de confirmation demande a l'utilisateur
-> OK. Aucun prompt/modal sur le chemin de recuperation/affichage de la photo ;
mapping + rendu purement automatiques (auth-providers.ts / UserAvatar.tsx).

--------------------------------------------------------------------------------
4) PIECES JOINTES
--------------------------------------------------------------------------------
- 124-rapport-technique-qa.txt (ce fichier)
- 124-avatar-states.png (preuve visuelle des 3 etats : manuel / provider / "DP")

--------------------------------------------------------------------------------
VERDICT : PASS (5/5 criteres OK). Ticket maintenu en QA.
================================================================================
(2-2/3)