|
QA #50 — Frontend: classification & complexité éditables dans TicketDraftPanel
|
|
Branche: feat/50-draft-classification-complexity-editable PR #26 -> dev
|
|
Commit: 31cde4078eb713749589f1a9008d9aeea9a3c7c5
|
|
Date: 2026-06-11T19:49:52Z
|
|
================================================================
|
|
### Suites ciblées (preuve composant/hook)
|
|
|
|
RUN v2.1.9 /home/naqued/Development/omdev/Client-Dashboard/.claude/worktrees/agent-a408221ec46905860
|
|
|
|
✓ src/components/atoms/BfDisagreeTag.test.tsx (5 tests) 78ms
|
|
✓ src/features/chat/useCreateTicket.test.tsx (3 tests) 187ms
|
|
✓ src/components/organisms/TicketDraftPanel.test.tsx (17 tests) 590ms
|
|
|
|
Test Files 3 passed (3)
|
|
Tests 25 passed (25)
|
|
Start at 21:49:52
|
|
Duration 1.55s (transform 180ms, setup 265ms, collect 561ms, tests 855ms, environment 1.01s, prepare 408ms)
|
|
|
|
|
|
### npx vitest run (gate complet)
|
|
✓ src/components/providers/IntlProvider.test.tsx (2 tests) 197ms
|
|
✓ src/features/auth/useLogout.test.tsx (1 test) 145ms
|
|
✓ src/components/molecules/TicketingFirstRun.test.tsx (3 tests) 236ms
|
|
✓ src/components/molecules/ProjectTabs.test.tsx (2 tests) 205ms
|
|
✓ src/features/usage/ranges.test.ts (3 tests) 12ms
|
|
✓ src/components/molecules/KnowledgeStrip.test.tsx (2 tests) 172ms
|
|
✓ src/components/atoms/TaskStatusPill.test.tsx (3 tests) 184ms
|
|
✓ src/components/atoms/Badge.test.tsx (2 tests) 103ms
|
|
✓ src/components/atoms/HealthBadge.test.tsx (2 tests) 52ms
|
|
|
|
Test Files 84 passed (84)
|
|
Tests 439 passed (439)
|
|
Start at 21:50:00
|
|
Duration 15.36s (transform 5.01s, setup 22.83s, collect 37.50s, tests 51.98s, environment 68.45s, prepare 13.60s)
|
|
|
|
|
|
### npx tsc --noEmit
|
|
tsc exit=0
|
|
|
|
### npx eslint .
|
|
eslint exit=0
|
|
|
|
### npm run build
|
|
build exit=0
|
|
✓ Compiled successfully in 4.4s
|
|
Generating static pages using 12 workers (0/6) ...
|
|
Error: ENVIRONMENT_FALLBACK
|
|
code: 'ENVIRONMENT_FALLBACK'
|
|
Generating static pages using 12 workers (1/6)
|
|
Generating static pages using 12 workers (2/6)
|
|
Generating static pages using 12 workers (4/6)
|
|
✓ Generating static pages using 12 workers (6/6) in 423ms
|
|
Route (app)
|
|
|
|
================================================================
|
|
### Cartographie des critères d'acceptation (AC -> OK/KO)
|
|
|
|
[OK] AC1 — Classification + note affichées dans TicketDraftPanel à partir du draft backend.
|
|
Source: TicketDraftForm seed `proposedClassification = draft.classification ?? draft.issue_type`
|
|
et `seededComplexity = draft.complexity ?? {score:0,explanation:""}`
|
|
(TicketDraftPanel.tsx L312-324). Toggle Classification + champs Complexity score/explanation rendus.
|
|
|
|
[OK] AC2 — Le client peut éditer classification + note ; défauts conservés sinon.
|
|
Champs contrôlés (issueType, complexityScore, complexityExplanation) seedés sur le draft ;
|
|
non modifiés -> valeurs par défaut transmises telles quelles. Couvert par les tests
|
|
TicketDraftPanel (17 tests).
|
|
|
|
[OK] AC3 — Modifier la classification déclenche : avertissement + tag bf-disagree (#FF9800) + tooltip + champ argumentation.
|
|
`classificationChanged = issueType !== proposedClassification` (L328) ->
|
|
bloc role="alert" avec <BfDisagreeTag tooltip={t("bfDisagreeTooltip")} />,
|
|
message t("classificationChangedWarning"), et textarea d'argumentation (L459-491).
|
|
Atom BfDisagreeTag: pill orange exact `bg-[#FF9800]` + border `#E68900`, Tooltip §UH.2,
|
|
aria-label = tooltip (BfDisagreeTag.tsx L44-55). Suite BfDisagreeTag: 5 tests OK.
|
|
|
|
[OK] AC4 — Champ d'argumentation laissé vide -> validation non-bloquante.
|
|
`handleFile` ne dépend que de `titleEmpty` ; argumentation jamais requise.
|
|
`argumentation: classificationChanged ? argumentation : ""` (L392). Bouton "File" désactivé
|
|
uniquement sur titre vide. Couvert par TicketDraftPanel.test.tsx.
|
|
|
|
[OK] AC5 — Le payload de création transmet classification, note et argumentation.
|
|
extra -> useCreateTicket POST body: issue_type, complexity (complexity ?? draft.complexity),
|
|
proposed_classification (échoué seulement sur override), argumentation
|
|
(useCreateTicket.ts L51-62). Contrat aligné avec le backend #49 livré. Suite useCreateTicket: 3 tests OK.
|
|
|
|
[OK] AC6 — FR/EN (clés ajoutées dans en.ts uniquement ; fr.ts re-exporte).
|
|
Clés intake.* présentes dans en.ts (classification, complexity, complexityScore,
|
|
complexityExplanation, classificationChangedWarning, bfDisagreeTooltip,
|
|
argumentationLabel, argumentationHint). fr.ts: `export const fr: typeof en = en;`
|
|
|
|
[OK] AC7 — Gate vert : vitest, tsc --noEmit, eslint, build.
|
|
vitest: 84 fichiers / 439 tests OK. tsc exit=0. eslint exit=0. build exit=0
|
|
(le log /admin ENVIRONMENT_FALLBACK est le pré-existant non-fatal documenté).
|
|
|
|
================================================================
|
|
### Smoke test live
|
|
App https://pipeliner.omdev.tech joignable (HTTP 200) mais écran de connexion gardé ;
|
|
le flux d'aperçu TicketDraftPanel exige un client authentifié + projet lié Redmine + draft
|
|
généré, non atteignable de façon fiable sans identifiants (non exposés). Repli sur les suites
|
|
composant/rendu comme preuve (BfDisagreeTag + TicketDraftPanel + useCreateTicket).
|
|
|
|
VERDICT: PASS — tous les critères d'acceptation OK.
|