Project

General

Profile

Feature #21 » qa-reqa-21-rapport-technique.txt

Redmine Admin, 06/11/2026 09:57 PM

 
================================================================================
RE-QA — Redmine #21 (epic) — Enhance Matching Results & AI Assistant
with Company Enrichment and Market Insights
Projet : GetYourJob (id 11) PR #239 (base dev) branche feat/redmine-21-insights-ui
Commit du correctif : 549534e (fix i18n collision marketInsights)
Date : 2026-06-11 Statut entrant : In development -> draggé en QA avant tests
================================================================================
OBJET DE LA RE-QA
Vérifier que la régression i18n bloquante (collision de clé top-level
`marketInsights:` introduite par #66) est levée, ET que les 3 surfaces de
l'épic restent fonctionnelles (#64 carte entreprise, #66 section Tendances,
#67 assistant). Déclencheur d'échec dur : NO-FAKE-DATA.

ENVIRONNEMENT
Worktree : .worktrees/redmine-21-insights-ui (node_modules + .env présents)
npx prisma generate : OK
DB Postgres port 5436 : UP
App dev : npm run dev -- -p 3013 (Next.js 16.0.10 Turbopack, Ready)
(toutes les valeurs sensibles — env/clés/tokens/DB URL — filtrées de ce rapport)

--------------------------------------------------------------------------------
AC1 — RÉGRESSION i18n CORRIGÉE (le bloqueur) ===> OK
--------------------------------------------------------------------------------
1a. Exactement UNE clé top-level `marketInsights:` par fichier de locale :
en.ts -> ligne 2771 (page Statistiques) + marketInsightsSection: l.3114 (#66)
fr.ts -> ligne 2780 (page Statistiques) + marketInsightsSection: l.3123 (#66)
Le nouveau bloc #66 est bien renommé `marketInsightsSection:` (plus de doublon).

1b. tsc --noEmit — TS1117 dans en.ts / fr.ts :
grep "translations/(en|fr).ts" sur la sortie tsc => ZÉRO erreur.
Seul TS1117 restant : src/scripts/cron-geocode-jobs.ts(66,9) — fichier
NON touché par cette branche (pré-existant, hors scope). Confirmé via
`git diff --name-only de4b286~1 HEAD` (cron-geocode absent du diff).

1c. Résolution runtime des deux namespaces (import { en, fr } from '../index') :
EN marketInsights.title = "Market Statistics" (page restaurée)
EN marketInsights.tabs = object (n'est plus undefined)
EN marketInsights.kpi = object (n'est plus undefined)
EN marketInsights.compensation = object (n'est plus undefined)
FR marketInsights.title = "Statistiques Marché" (page restaurée)
FR marketInsights.tabs = object
FR marketInsights.kpi = object
EN marketInsightsSection.title = "Market insights" (distinct)
FR marketInsightsSection.title = "Tendances du marche" (distinct)
=> section != page : les deux namespaces résolvent séparément.

1d. Test garde-fou (anti-récidive) :
src/infrastructure/i18n/translations/__tests__/marketInsights-namespaces.test.ts
=> 5 tests PASS.

1e. Rendu LIVE de la page précédemment cassée
/profile/developer/market-insights (port 3013) :
- En-tête rendu : "Statistiques Marché" (libellé résolu, PAS la clé brute
`marketInsights.title`, PAS "undefined"), sous-titre + état de chargement
"Analyse du marché en cours...".
- Nav latérale : "Statistiques Marché" sous "Insights".
- Aucune clé brute `marketInsights.*` / `marketInsightsSection.*` ne fuit
dans le texte de la page (grep sur le DOM => NONE).
- Console navigateur : aucune erreur i18n / undefined.
- Page authentifiée au-delà de l'en-tête (OAuth Google/LinkedIn) ; le contenu
des graphes nécessite un login prod impraticable en QA -> preuve i18n via
en-tête rendu + test de résolution runtime déterministe.
Capture : qa-reqa-21-market-statistics-page.png

--------------------------------------------------------------------------------
AC2 — SECTION MARKET INSIGHTS (#66 / #61 / #63) ===> OK
--------------------------------------------------------------------------------
- MarketInsightsSection.tsx : 100% des t(...) utilisent `marketInsightsSection.*`
(title, skillsTitle, locationTitle, workModeTitle, offersCount, topLocation,
workModeShare, loading, error, retry, empty) — aucun `marketInsights.*` nu.
- Sous-blocs : compétences demandées (compteurs réels par offre), localisation
(phrase tendance), mode de travail (part %). Empty -> EmptyState
"Aucune tendance disponible..." (jamais de chiffre par défaut). NO-FAKE-DATA OK.
- Suites : MarketInsightsSection.test.tsx (5) + route.test.ts (8) +
MarketInsightsService.test.ts (11) => PASS.

--------------------------------------------------------------------------------
AC3 — CARTE #64 + ASSISTANT #67 (régression-check) ===> OK
--------------------------------------------------------------------------------
- #64 CompanyEnrichmentCard.test.tsx (5) PASS : rend seulement les champs
présents (jamais "N/A"), return null sans enrichment, lien /companies/<slug>.
- #67 SendAssistantMessageUseCase.prompt.test.ts (4) +
assistantCompanyAndInsights.test.ts (5) PASS : outils get_company_data /
get_market_insights déclarés + implémentés (present-only, "donnée indisponible"
sinon agrégat réel), prompt skills>locations + mention type société.

--------------------------------------------------------------------------------
SUITE COMPLÈTE DE L'ÉPIC
--------------------------------------------------------------------------------
npx vitest run (7 suites de l'épic) :
SendAssistantMessageUseCase.prompt.test.ts ... 4 PASS
MarketInsightsService.test.ts ............... 11 PASS
marketInsights-namespaces.test.ts ........... 5 PASS
route.test.ts (api/market-insights) ......... 8 PASS
MarketInsightsSection.test.tsx .............. 5 PASS
CompanyEnrichmentCard.test.tsx .............. 5 PASS
assistantCompanyAndInsights.test.ts ......... 5 PASS
--------------------------------------------------------
Test Files : 7 passed (7) Tests : 43 passed (43)

================================================================================
VERDICT : PASS (re-QA)
- Régression i18n marketInsights : CORRIGÉE (1 seule clé top-level/locale,
0 TS1117 dans en/fr, page "Statistiques Marché" résout ses libellés).
- 3 surfaces de l'épic : OK. NO-FAKE-DATA : respecté partout.
-> #21 LAISSÉ en QA (promotion preprod = autre agent).

PIÈCES JOINTES
- qa-reqa-21-rapport-technique.txt (ce rapport)
- qa-reqa-21-market-statistics-page.png (page précédemment cassée, en-tête
"Statistiques Marché" résolu)
================================================================================
(7-7/8)