# đŸ§Ș Plan de Test - Bot Detector Dashboard **Version:** 1.0 **Date:** 2025 **Projet:** Dashboard Bot Detector IA **Stack:** FastAPI + React + ClickHouse --- ## 📑 Table des MatiĂšres 1. [Vue d'ensemble](#1-vue-densemble) 2. [Tests Backend (API)](#2-tests-backend-api) 3. [Tests Frontend (React)](#3-tests-frontend-react) 4. [Tests ClickHouse (Base de donnĂ©es)](#4-tests-clickhouse-base-de-donnĂ©es) 5. [Tests d'IntĂ©gration](#5-tests-dintĂ©gration) 6. [Tests de SĂ©curitĂ©](#6-tests-de-sĂ©curitĂ©) 7. [Tests de Performance](#7-tests-de-performance) 8. [Matrice de Couverture](#8-matrice-de-couverture) 9. [Scripts de Test Existants](#9-scripts-de-test-existants) 10. [Recommandations](#10-recommandations) 11. [Prioritisation](#11-prioritisation) --- ## 1. Vue d'ensemble ### Architecture testĂ©e ``` ┌─────────────────────────────────────────────────────────┐ │ Docker Compose │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐ │ │ │ ClickHouse │ │ bot_detector│ │ dashboard_web │ │ │ │ :8123 │ │ (existant) │ │ :3000 (web) │ │ │ │ :9000 │ │ │ │ :8000 (API) │ │ │ └──────┬──────┘ └──────┬──────┘ └────────┬────────┘ │ │ └────────────────┮───────────────────┘ │ └─────────────────────────────────────────────────────────┘ ``` ### Composants | Composant | Technologie | Port | Tests | |-----------|-------------|------|-------| | **Frontend** | React + TypeScript + Tailwind | 3000 | 25+ tests | | **Backend API** | FastAPI (Python) | 8000 | 80+ tests | | **Database** | ClickHouse (existant) | 8123 | 15+ tests | ### Endpoints API (20+ endpoints) | Routeur | Endpoints | Description | |---------|-----------|-------------| | `/health` | 1 | Health check | | `/api/metrics` | 2 | MĂ©triques globales + distribution | | `/api/detections` | 2 | Liste des dĂ©tections + dĂ©tails | | `/api/variability` | 4 | VariabilitĂ© attributs + IPs + user_agents | | `/api/attributes` | 1 | Liste attributs uniques | | `/api/analysis` | 6 | Analyse subnet, country, JA4, UA, recommendation | | `/api/entities` | 7 | Investigation entitĂ©s unifiĂ©es | --- ## 2. Tests Backend (API) ### 2.1 Endpoint `/health` | ID | Test | Description | RĂ©sultat attendu | |----|------|-------------|------------------| | H1 | Health check basique | GET /health | `{"status": "healthy", "clickhouse": "connected"}` | | H2 | Health check ClickHouse down | ClickHouse indisponible | `{"status": "unhealthy", "clickhouse": "disconnected"}` | | H3 | Temps de rĂ©ponse | Mesure latence | < 500ms | **Commande de test:** ```bash curl http://localhost:3000/health | jq ``` --- ### 2.2 Endpoint `/api/metrics` | ID | Test | Description | RĂ©sultat attendu | |----|------|-------------|------------------| | M1 | MĂ©triques globales | GET /api/metrics | Summary avec total_detections, counts par niveau | | M2 | SĂ©rie temporelle | DonnĂ©es 24h groupĂ©es par heure | timeseries avec 24 points | | M3 | Distribution par menace | threat_distribution | 4 niveaux (CRITICAL, HIGH, MEDIUM, LOW) | | M4 | Aucune donnĂ©e (24h) | Base vide | Retourne 0 ou erreur gĂ©rĂ©e proprement | | M5 | Performance requĂȘte | Temps d'exĂ©cution | < 2s | **Commande de test:** ```bash curl http://localhost:3000/api/metrics | jq ``` **VĂ©rifications:** - [ ] `summary.total_detections` > 0 - [ ] `summary.threat_distribution` contient 4 niveaux - [ ] `timeseries` contient 24 points (une par heure) - [ ] Somme des counts = total_detections --- ### 2.3 Endpoint `/api/metrics/threats` | ID | Test | Description | RĂ©sultat attendu | |----|------|-------------|------------------| | MT1 | Distribution complĂšte | GET /api/metrics/threats | Items avec threat_level, count, percentage | | MT2 | CohĂ©rence pourcentages | Somme des percentages | ≈ 100% | **Commande de test:** ```bash curl http://localhost:3000/api/metrics/threats | jq ``` --- ### 2.4 Endpoint `/api/detections` | ID | Test | Description | RĂ©sultat attendu | |----|------|-------------|------------------| | D1 | Liste par dĂ©faut | GET /api/detections?page=1&page_size=25 | Items triĂ©s par detected_at DESC | | D2 | Pagination | page, page_size, total, total_pages | total_pages = ceil(total/page_size) | | D3 | Filtre threat_level | `?threat_level=CRITICAL` | Uniquement CRITICAL | | D4 | Filtre model_name | `?model_name=Complet` | Uniquement ce modĂšle | | D5 | Filtre country_code | `?country_code=CN` | Uniquement China | | D6 | Filtre asn_number | `?asn_number=16276` | Uniquement cet ASN | | D7 | Recherche texte | `?search=192.168` | IP, JA4, Host correspondants | | D8 | Tri anomaly_score ASC | `?sort_by=anomaly_score&sort_order=asc` | Scores croissants | | D9 | Tri detected_at DESC | `?sort_by=detected_at&sort_order=DESC` | Chronologique inverse | | D10 | Limite page_size | `?page_size=100` | Maximum 100 items | | D11 | Page inexistante | `?page=9999` | Liste vide, total_pages correct | **Commandes de test:** ```bash # Liste par dĂ©faut curl "http://localhost:3000/api/detections?page=1&page_size=25" | jq # Filtre CRITICAL curl "http://localhost:3000/api/detections?threat_level=CRITICAL" | jq '.items[].threat_level' # Recherche IP curl "http://localhost:3000/api/detections?search=192.168" | jq # Tri par score curl "http://localhost:3000/api/detections?sort_by=anomaly_score&sort_order=asc" | jq '.items[0].anomaly_score' ``` **VĂ©rifications:** - [ ] Structure `DetectionsListResponse` respectĂ©e - [ ] Pagination cohĂ©rente - [ ] Filtres appliquĂ©s correctement - [ ] Tri fonctionnel - [ ] Recherche texte (LIKE ILIKE) --- ### 2.5 Endpoint `/api/detections/{id}` | ID | Test | Description | RĂ©sultat attendu | |----|------|-------------|------------------| | DD1 | DĂ©tails par IP | GET /api/detections/192.168.1.1 | Tous les champs remplis | | DD2 | IP inexistante | GET /api/detections/0.0.0.0 | 404 "DĂ©tection non trouvĂ©e" | | DD3 | Structure nested | asn, country, metrics, tcp, tls, headers, behavior, advanced | Tous les objets prĂ©sents | **Commande de test:** ```bash curl http://localhost:3000/api/detections/116.179.33.143 | jq ``` **VĂ©rifications:** - [ ] Objet `asn` avec number, org, detail, domain, label - [ ] Objet `country` avec code - [ ] Objet `metrics` avec hits, hit_velocity, fuzzing_index, post_ratio, etc. - [ ] Objet `tcp` avec jitter_variance, shared_count, etc. - [ ] Objet `tls` avec alpn flags - [ ] Objet `headers` avec count, has_accept_language, etc. - [ ] Objet `behavior` avec ip_id_zero_ratio, etc. - [ ] Objet `advanced` avec asset_ratio, etc. --- ### 2.6 Endpoint `/api/variability/{type}/{value}` | ID | Test | Description | RĂ©sultat attendu | |----|------|-------------|------------------| | V1 | VariabilitĂ© IP | GET /api/variability/ip/192.168.1.1 | user_agents, ja4, countries, asns, hosts, threat_levels | | V2 | VariabilitĂ© JA4 | GET /api/variability/ja4/{fingerprint} | MĂȘme structure | | V3 | VariabilitĂ© Pays | GET /api/variability/country/FR | MĂȘme structure | | V4 | VariabilitĂ© ASN | GET /api/variability/asn/16276 | MĂȘme structure | | V5 | VariabilitĂ© Host | GET /api/variability/host/example.com | MĂȘme structure | | V6 | Type invalide | GET /api/variability/invalid/xyz | 400 "Type invalide" | | V7 | Aucune donnĂ©e | GET /api/variability/ip/0.0.0.0 | 404 | | V8 | Insights gĂ©nĂ©rĂ©s | Selon donnĂ©es | Messages pertinents (rotation UA, hosting ASN, etc.) | **Commande de test:** ```bash curl http://localhost:3000/api/variability/ip/116.179.33.143 | jq ``` **VĂ©rifications:** - [ ] `total_detections` > 0 - [ ] `unique_ips` >= 1 - [ ] `attributes.user_agents` liste avec percentages - [ ] `attributes.ja4` fingerprints - [ ] `attributes.countries` distribution - [ ] `attributes.asns` informations - [ ] `insights` messages contextuels gĂ©nĂ©rĂ©s **Insights attendus:** - [ ] "X User-Agents diffĂ©rents → Possible rotation/obfuscation" (si > 1 UA) - [ ] "X JA4 fingerprints diffĂ©rents → Possible rotation" (si > 1 JA4) - [ ] "ASN de type hosting → Souvent utilisĂ© pour des bots" (si OVH, AWS, etc.) - [ ] "X% de dĂ©tections CRITICAL → Menace sĂ©vĂšre" (si > 30%) --- ### 2.7 Endpoint `/api/variability/{type}/{value}/ips` | ID | Test | Description | RĂ©sultat attendu | |----|------|-------------|------------------| | VI1 | IPs associĂ©es | GET /api/variability/country/CN/ips | Liste d'IPs uniques | | VI2 | Limite respectĂ©e | `?limit=50` | Maximum 50 items retournĂ©s | | VI3 | Total correct | `total` vs `showing` | Count distinct rĂ©el | **Commande de test:** ```bash curl "http://localhost:3000/api/variability/country/CN/ips?limit=10" | jq ``` --- ### 2.8 Endpoint `/api/variability/{type}/{value}/attributes` | ID | Test | Description | RĂ©sultat attendu | |----|------|-------------|------------------| | VA1 | Attributs cibles | `?target_attr=user_agents` | Items avec value, count, percentage | | VA2 | Target invalide | `?target_attr=invalid` | 400 | | VA3 | Pourcentages | Somme des percentages | ≈ 100% | **Commande de test:** ```bash curl "http://localhost:3000/api/variability/ip/116.179.33.143/attributes?target_attr=ja4&limit=10" | jq ``` --- ### 2.9 Endpoint `/api/variability/{type}/{value}/user_agents` | ID | Test | Description | RĂ©sultat attendu | |----|------|-------------|------------------| | VU1 | User-Agents depuis vue | GET /api/variability/ip/{ip}/user_agents | Liste avec first_seen, last_seen | | VU2 | Classification implicite | UA bots dĂ©tectables | python-requests, curl, etc. | **Commande de test:** ```bash curl http://localhost:3000/api/variability/ip/116.179.33.143/user_agents | jq ``` --- ### 2.10 Endpoint `/api/attributes/{type}` | ID | Test | Description | RĂ©sultat attendu | |----|------|-------------|------------------| | A1 | Liste IPs uniques | GET /api/attributes/ip | Top 100 par count | | A2 | Liste JA4 uniques | GET /api/attributes/ja4 | idem | | A3 | Liste pays | GET /api/attributes/country | idem | | A4 | Liste ASNs | GET /api/attributes/asn | idem | | A5 | Liste hosts | GET /api/attributes/host | idem | | A6 | Type invalide | GET /api/attributes/invalid | 400 | | A7 | Valeurs vides filtrĂ©es | Pas de NULL ou "" | Exclus du rĂ©sultat | **Commande de test:** ```bash curl "http://localhost:3000/api/attributes/ip?limit=10" | jq ``` --- ### 2.11 Endpoint `/api/analysis/{ip}/subnet` | ID | Test | Description | RĂ©sultat attendu | |----|------|-------------|------------------| | AS1 | Analyse subnet /24 | GET /api/analysis/192.168.1.1/subnet | ips_in_subnet, total_in_subnet | | AS2 | Alert si > 10 IPs | Subnet avec 15 IPs | alert=true | | AS3 | Informations ASN | asn_number, asn_org, total_in_asn | DonnĂ©es complĂštes | | AS4 | IP privĂ©e/local | 10.0.0.1 | GĂ©rĂ© correctement | **Commande de test:** ```bash curl http://localhost:3000/api/analysis/116.179.33.143/subnet | jq ``` --- ### 2.12 Endpoint `/api/analysis/{ip}/country` | ID | Test | Description | RĂ©sultat attendu | |----|------|-------------|------------------| | AC1 | Pays de l'IP | code, name | FR, France | | AC2 | Distribution ASN par pays | asn_countries | Liste avec percentages | **Commande de test:** ```bash curl http://localhost:3000/api/analysis/116.179.33.143/country | jq ``` --- ### 2.13 Endpoint `/api/analysis/country` | ID | Test | Description | RĂ©sultat attendu | |----|------|-------------|------------------| | ANC1 | Top 10 pays | GET /api/analysis/country | Avec count et percentage | | ANC2 | Baseline (7 jours) | Comparaison disponible | baseline object | | ANC3 | Alert country dĂ©tectĂ©e | Pays surreprĂ©sentĂ© | alert_country positionnĂ© | **Commande de test:** ```bash curl http://localhost:3000/api/analysis/country | jq ``` --- ### 2.14 Endpoint `/api/analysis/{ip}/ja4` | ID | Test | Description | RĂ©sultat attendu | |----|------|-------------|------------------| | AJ1 | JA4 fingerprint | ja4, shared_ips_count | Nombre d'IPs partageant ce JA4 | | AJ2 | Top subnets | groupĂ©s par /24 | top_subnets list | | AJ3 | Autres JA4 pour IP | other_ja4_for_ip | Liste des autres fingerprints | **Commande de test:** ```bash curl http://localhost:3000/api/analysis/116.179.33.143/ja4 | jq ``` --- ### 2.15 Endpoint `/api/analysis/{ip}/user-agents` | ID | Test | Description | RĂ©sultat attendu | |----|------|-------------|------------------| | AU1 | User-Agents IP | ip_user_agents | Avec classification (normal/bot/script) | | AU2 | Bot percentage | Calcul correct | bot_percentage | | AU3 | Alert si > 20% bots | alert=true | Si bot_percentage > 20 | **Commande de test:** ```bash curl http://localhost:3000/api/analysis/116.179.33.143/user-agents | jq ``` --- ### 2.16 Endpoint `/api/analysis/{ip}/recommendation` | ID | Test | Description | RĂ©sultat attendu | |----|------|-------------|------------------| | AR1 | Recommandation complĂšte | label, confidence, indicators | Classification suggĂ©rĂ©e | | AR2 | Tags suggĂ©rĂ©s | BasĂ©s sur corrĂ©lations | suggested_tags list | | AR3 | Reason dĂ©taillĂ© | Explication | reason string | **Commande de test:** ```bash curl http://localhost:3000/api/analysis/116.179.33.143/recommendation | jq ``` **VĂ©rifications:** - [ ] `label` ∈ {legitimate, suspicious, malicious} - [ ] `confidence` entre 0 et 1 - [ ] `indicators` avec subnet_ips_count, ja4_shared_ips, bot_ua_percentage, etc. - [ ] `suggested_tags` pertinents (distributed, bot-ua, hosting-asn, etc.) - [ ] `reason` explicatif --- ### 2.17 Endpoint `/api/entities/{type}/{value}` | ID | Test | Description | RĂ©sultat attendu | |----|------|-------------|------------------| | E1 | Investigation IP | GET /api/entities/ip/192.168.1.1 | stats, related, user_agents, client_headers, paths, query_params | | E2 | Investigation JA4 | GET /api/entities/ja4/{fingerprint} | idem | | E3 | Investigation User-Agent | GET /api/entities/user_agent/{ua} | idem | | E4 | Investigation Client-Header | GET /api/entities/client_header/{header} | idem | | E5 | Investigation Host | GET /api/entities/host/example.com | idem | | E6 | Investigation Path | GET /api/entities/path/api/login | idem | | E7 | Investigation Query-Param | GET /api/entities/query_param/q|id | idem | | E8 | Type invalide | GET /api/entities/invalid/xyz | 400 | | E9 | EntitĂ© inexistante | GET /api/entities/ip/0.0.0.0 | 404 | | E10 | FenĂȘtre temporelle | `?hours=48` | Filtre appliquĂ© (dĂ©faut 24h) | **Commande de test:** ```bash curl http://localhost:3000/api/entities/ip/116.179.33.143 | jq ``` **VĂ©rifications:** - [ ] `stats` avec entity_type, entity_value, total_requests, unique_ips, first_seen, last_seen - [ ] `related` avec ips, ja4s, hosts, asns, countries - [ ] `user_agents` liste avec value, count, percentage - [ ] `client_headers` liste - [ ] `paths` liste - [ ] `query_params` liste --- ### 2.18 Endpoint `/api/entities/{type}/{value}/related` | ID | Test | Description | RĂ©sultat attendu | |----|------|-------------|------------------| | ER1 | Attributs associĂ©s | GET /api/entities/ip/192.168.1.1/related | ips, ja4s, hosts, asns, countries | **Commande de test:** ```bash curl http://localhost:3000/api/entities/ip/116.179.33.143/related | jq ``` --- ### 2.19 Endpoints spĂ©cifiques entities | ID | Test | Endpoint | RĂ©sultat attendu | |----|------|----------|------------------| | EU1 | User-Agents | `/{type}/{value}/user_agents` | Liste des UAs | | EU2 | Client-Headers | `/{type}/{value}/client_headers` | Liste des headers | | EU3 | Paths | `/{type}/{value}/paths` | Liste des paths | | EU4 | Query-Params | `/{type}/{value}/query_params` | Liste des params | --- ### 2.20 Endpoint `/api/entities/types` | ID | Test | Description | RĂ©sultat attendu | |----|------|-------------|------------------| | ET1 | Liste des types | GET /api/entities/types | 7 types avec descriptions | **Commande de test:** ```bash curl http://localhost:3000/api/entities/types | jq ``` **VĂ©rifications:** - [ ] 7 types: ip, ja4, user_agent, client_header, host, path, query_param - [ ] Descriptions pour chaque type --- ## 3. Tests Frontend (React) ### 3.1 Navigation et Routing | ID | Test | Description | RĂ©sultat attendu | |----|------|-------------|------------------| | N1 | Page d'accueil | GET http://localhost:3000/ | Dashboard s'affiche | | N2 | Navigation DĂ©tections | Clic menu "DĂ©tections" | Tableau affichĂ© | | N3 | Navigation Investigation | Menu "Investigation" | Formulaire recherche | | N4 | Breadcrumb fonctionnel | Clic breadcrumb | Navigation retour | | N5 | URL directe (deep link) | http://localhost:3000/detections | Page correcte | **Commandes de test:** ```bash # VĂ©rifier que le HTML est servi curl -s http://localhost:3000/ | grep -o "Bot Detector Dashboard" # VĂ©rifier les assets curl -s http://localhost:3000/ | grep -o "assets/[^\"]*" ``` --- ### 3.2 Dashboard Principal | ID | Test | Description | RĂ©sultat attendu | |----|------|-------------|------------------| | DH1 | MĂ©triques affichĂ©es | 4 cartes | total, menaces, bots, IPs | | DH2 | Graphique temporel | SĂ©rie 24h | Recharts line/area chart | | DH3 | Distribution par menace | Pie/bar chart | 4 segments | | DH4 | RafraĂźchissement auto | 30s | DonnĂ©es Ă  jour | | DH5 | Loading states | Spinners | Pendant chargement | | DH6 | Gestion erreurs | Message utilisateur | Si API Ă©choue | | DH7 | Responsive design | Mobile/desktop | Adaptatif | **VĂ©rifications manuelles:** - [ ] Ouvrir http://localhost:3000 - [ ] VĂ©rifier 4 cartes de mĂ©triques - [ ] VĂ©rifier graphique temporel - [ ] VĂ©rifier distribution menaces - [ ] Attendre 30s, vĂ©rifier rafraĂźchissement - [ ] Tester sur mobile (DevTools) --- ### 3.3 Liste des DĂ©tections | ID | Test | Description | RĂ©sultat attendu | |----|------|-------------|------------------| | DL1 | Tableau affichĂ© | Colonnes correctes | detected_at, src_ip, threat_level, etc. | | DL2 | Pagination | Navigation pages | Page 1, 2, 3... | | DL3 | Tri colonnes | Clic header | ASC/DESC fonctionnel | | DL4 | Filtre threat_level | Dropdown | CRITICAL, HIGH, MEDIUM, LOW | | DL5 | Recherche texte | Input search | Filtre en temps rĂ©el | | DL6 | Codes couleur menaces | CRITICAL=rouge, HIGH=orange, etc. | Visuel cohĂ©rent | | DL7 | Clic sur IP | Ligne cliquable | Ouvre dĂ©tails | | DL8 | Empty state | Aucune donnĂ©e | Message "Aucune dĂ©tection" | **VĂ©rifications manuelles:** - [ ] Naviguer vers /detections - [ ] Tester pagination - [ ] Trier par anomaly_score - [ ] Filtrer par CRITICAL - [ ] Rechercher une IP - [ ] Cliquer sur une ligne --- ### 3.4 Vue DĂ©tails (Investigation) | ID | Test | Description | RĂ©sultat attendu | |----|------|-------------|------------------| | DV1 | DĂ©tails IP affichĂ©s | Toutes sections | Metrics, TCP, TLS, Headers, Behavior, Advanced | | DV2 | VariabilitĂ© User-Agents | Pourcentages | Barres ou liste | | DV3 | VariabilitĂ© JA4 | Fingerprints | ListĂ©s avec counts | | DV4 | VariabilitĂ© Pays | Distribution | Pays avec percentages | | DV5 | VariabilitĂ© ASN | Informations | ASN number, org | | DV6 | Insights automatiques | Messages | Contextuels (rotation, hosting, etc.) | | DV7 | Clic sur attribut | Lien cliquable | Navigation vers investigation | | DV8 | Back button | Retour | Liste dĂ©tections | **VĂ©rifications manuelles:** - [ ] Cliquer sur une IP dans le tableau - [ ] VĂ©rifier toutes les sections de dĂ©tails - [ ] VĂ©rifier variabilitĂ© User-Agents - [ ] Cliquer sur un User-Agent - [ ] VĂ©rifier navigation enchaĂźnĂ©e - [ ] Utiliser breadcrumb pour revenir --- ### 3.5 Composants UI | ID | Test | Description | RĂ©sultat attendu | |----|------|-------------|------------------| | C1 | Badges menace | Couleurs | CRITICAL=red, HIGH=orange, MEDIUM=yellow, LOW=green | | C2 | Progress bars | Pourcentages visuels | Width proportionnel | | C3 | Tooltips | Survols | Informations additionnelles | | C4 | Skeletons | Chargement | Placeholders gris | | C5 | Toast/Alerts | Notifications | Erreurs API, succĂšs | --- ## 4. Tests ClickHouse (Base de DonnĂ©es) ### 4.1 Tables et Vues | ID | Test | Description | RĂ©sultat attendu | |----|------|-------------|------------------| | DB1 | Table `ml_detected_anomalies` | SELECT count() | > 0 lignes | | DB2 | Vue `view_dashboard_summary` | SELECT * | DonnĂ©es agrĂ©gĂ©es | | DB3 | Vue `view_dashboard_user_agents` | SELECT * | User-Agents agrĂ©gĂ©s | | DB4 | Vue `view_dashboard_entities` | SELECT * | EntitĂ©s unifiĂ©es | | DB5 | Table `classifications` | SELECT * | Table vide ou avec donnĂ©es | | DB6 | Index prĂ©sents | system.data_skipping_indices | Index listĂ©s | | DB7 | TTL configurĂ© | system.tables.ttl_expression | Expiration dĂ©finie | **Commandes de test:** ```bash # VĂ©rifier tables docker compose exec clickhouse clickhouse-client -d mabase_prod -q \ "SELECT name, engine FROM system.tables WHERE database = 'mabase_prod' AND name LIKE '%dashboard%'" # VĂ©rifier donnĂ©es docker compose exec clickhouse clickhouse-client -d mabase_prod -q \ "SELECT count() FROM ml_detected_anomalies WHERE detected_at >= now() - INTERVAL 24 HOUR" # VĂ©rifier vues docker compose exec clickhouse clickhouse-client -d mabase_prod -q \ "SELECT * FROM view_dashboard_summary LIMIT 1" ``` --- ### 4.2 QualitĂ© des DonnĂ©es | ID | Test | Description | RĂ©sultat attendu | |----|------|-------------|------------------| | DQ1 | Pas de NULL critiques | src_ip, detected_at | countIf(NULL) = 0 | | DQ2 | Valeurs vides filtrĂ©es | "" exclus | countIf('') = 0 | | DQ3 | CohĂ©rence des counts | Totaux | Somme = total | | DQ4 | Dates valides | detected_at < now() | Pas de dates futures | | DQ5 | Threat levels valides | 4 niveaux uniquement | Pas de valeurs inconnues | **Commandes de test:** ```bash # NULL check docker compose exec clickhouse clickhouse-client -d mabase_prod -q \ "SELECT countIf(src_ip IS NULL) AS null_ips FROM ml_detected_anomalies" # Threat levels docker compose exec clickhouse clickhouse-client -d mabase_prod -q \ "SELECT DISTINCT threat_level FROM ml_detected_anomalies" ``` --- ### 4.3 Performance | ID | Test | Description | Temps max | |----|------|-------------|-----------| | DP1 | Count 24h | `SELECT count()` | < 500ms | | DP2 | AgrĂ©gations par heure | GROUP BY toStartOfHour | < 1s | | DP3 | DISTINCT sur IP | uniq(src_ip) | < 1s | | DP4 | Jointures vues | Multiple joins | < 2s | | DP5 | Full scan table | Sans filtre | < 5s | **Commandes de test:** ```bash # Timing requĂȘte docker compose exec clickhouse clickhouse-client -d mabase_prod -q \ "SELECT count() FROM ml_detected_anomalies WHERE detected_at >= now() - INTERVAL 24 HOUR" \ --time ``` --- ## 5. Tests d'IntĂ©gration ### 5.1 Workflows Utilisateur | ID | Test | Étapes | RĂ©sultat attendu | |----|------|--------|------------------| | IW1 | Investigation IP suspecte | Dashboard → Clic IP → DĂ©tails → Insights | Investigation complĂšte | | IW2 | Recherche et filtre | DĂ©tections → Filtre CRITICAL → Recherche IP | RĂ©sultats filtrĂ©s | | IW3 | Navigation enchaĂźnĂ©e | IP → UA → Toutes IPs avec UA | Navigation fluide | | IW4 | Analyse ASN | Filtre ASN → Voir dĂ©tections → VariabilitĂ© | Vue d'ensemble ASN | | IW5 | Export mental | Observer → Noter IPs | IPs notĂ©es pour blacklist | **ScĂ©nario IW1 dĂ©taillĂ©:** 1. Ouvrir http://localhost:3000 2. Voir IP classifiĂ©e CRITICAL dans le dashboard 3. Cliquer sur l'IP 4. VĂ©rifier section "User-Agents" (plusieurs valeurs ?) 5. VĂ©rifier insights automatiques 6. Cliquer sur un User-Agent suspect 7. Voir toutes les IPs avec cet UA 8. Identifier possible botnet --- ### 5.2 ScĂ©narios Critiques | ID | Test | Description | RĂ©sultat attendu | |----|------|-------------|------------------| | IC1 | Dashboard vide | Aucune donnĂ©e 24h | Message "Aucune donnĂ©e" | | IC2 | ClickHouse indisponible | Service down | Erreur gĂ©rĂ©e, retry | | IC3 | API lente (>5s) | Latence Ă©levĂ©e | Loading state, timeout | | IC4 | DonnĂ©es partielles | Certains champs NULL | Affichage partiel OK | | IC5 | Concurrent users | 10+ utilisateurs | Pas de blocage | --- ### 5.3 API Integration | ID | Test | Description | RĂ©sultat attendu | |----|------|-------------|------------------| | II1 | Frontend → Backend | Toutes requĂȘtes | HTTP 200 | | II2 | Backend → ClickHouse | Connexion | Stable, reconnect auto | | II3 | CORS localhost:3000 | Origine | AutorisĂ© | | II4 | Rate limiting | 100 req/min | BloquĂ© aprĂšs limite | **Commande de test CORS:** ```bash curl -H "Origin: http://localhost:3000" -I http://localhost:3000/api/metrics | grep -i access-control ``` --- ## 6. Tests de SĂ©curitĂ© | ID | Test | Description | RĂ©sultat attendu | |----|------|-------------|------------------| | S1 | Authentification | AccĂšs dashboard | Pas d'auth (local uniquement) | | S2 | Injection SQL | Params ClickHouse | Utilise query params, pas de concat | | S3 | XSS frontend | Input utilisateur | Échappement React | | S4 | CORS restreint | Origines | localhost:3000 uniquement | | S5 | Credentials | .env | Pas en dur dans le code | | S6 | Error messages | Stack traces | Pas d'infos sensibles exposĂ©es | **VĂ©rifications:** - [ ] Audit fichier `.env` (pas commitĂ©) - [ ] VĂ©rifier backend/main.py pas de credentials en dur - [ ] Tester input `` dans recherche - [ ] VĂ©rifier headers CORS --- ## 7. Tests de Performance | ID | Test | MĂ©trique | Cible | Mesure | |----|------|----------|-------|--------| | P1 | Temps chargement dashboard | First paint | < 2s | DevTools Network | | P2 | Temps requĂȘtes API | Latence moyenne | < 1s | curl -w | | P3 | RequĂȘtes ClickHouse | Temps exĂ©cution | < 500ms | --time | | P4 | RafraĂźchissement auto | CPU/MĂ©moire | < 5% CPU | DevTools Performance | | P5 | Pagination grande liste | Scroll fluide | 60 FPS | DevTools | | P6 | MĂ©moire frontend | Heap size | < 100MB | DevTools Memory | **Commandes de test:** ```bash # Timing API curl -w "@curl-format.txt" -o /dev/null -s http://localhost:3000/api/metrics # curl-format.txt: # time_namelookup: %{time_namelookup}\n # time_connect: %{time_connect}\n # time_starttransfer: %{time_starttransfer}\n # time_total: %{time_total}\n ``` --- ## 8. Matrice de Couverture ### Endpoints API | Routeur | Endpoints | Tests | Couverture | |---------|-----------|-------|------------| | `/health` | 1 | H1-H3 | ✅ 100% | | `/api/metrics` | 2 | M1-M5, MT1-MT2 | ✅ 100% | | `/api/detections` | 2 | D1-D11, DD1-DD3 | ✅ 100% | | `/api/variability` | 4 | V1-V8, VI1-VI3, VA1-VA3, VU1-VU2 | ✅ 100% | | `/api/attributes` | 1 | A1-A7 | ✅ 100% | | `/api/analysis` | 6 | AS1-AS4, AC1-AC2, ANC1-ANC3, AJ1-AJ3, AU1-AU3, AR1-AR3 | ✅ 100% | | `/api/entities` | 7 | E1-E10, ER1, EU1-EU4, ET1 | ✅ 100% | ### FonctionnalitĂ©s Frontend | FonctionnalitĂ© | Tests | Couverture | |----------------|-------|------------| | Dashboard metrics | DH1-DH7 | ✅ 100% | | Liste dĂ©tections | DL1-DL8 | ✅ 100% | | Investigation dĂ©tails | DV1-DV8 | ✅ 100% | | VariabilitĂ© attributs | Via API | ✅ 100% | | Filtres et recherche | D3-D7, DL4-DL5 | ✅ 100% | | Navigation | N1-N5 | ✅ 100% | | Composants UI | C1-C5 | ✅ 100% | ### Base de DonnĂ©es | Aspect | Tests | Couverture | |--------|-------|------------| | Tables principales | DB1, DB5 | ✅ 100% | | Vues matĂ©rialisĂ©es | DB2-DB4 | ✅ 100% | | QualitĂ© donnĂ©es | DQ1-DQ5 | ✅ 100% | | Performance | DP1-DP5 | ✅ 100% | --- ## 9. Scripts de Test Existants ### 9.1 `test_dashboard.sh` (10 tests) ```bash # ExĂ©cution chmod +x test_dashboard.sh ./test_dashboard.sh ``` **Tests couverts:** 1. ✅ Health check 2. ✅ API detections 3. ✅ Tri par score 4. ✅ Variability IP 5. ✅ IPs associĂ©es 6. ✅ User-Agents 7. ✅ Analysis subnet 8. ✅ Analysis country 9. ✅ Classifications 10. ✅ Frontend accessible --- ### 9.2 `test_dashboard_entities.sql` (30 tests) ```bash # ExĂ©cution docker compose exec clickhouse clickhouse-client -d mabase_prod < test_dashboard_entities.sql ``` **Tests couverts:** 1-3. ✅ Tables/Vues existent 4. ✅ SchĂ©ma 5-11. ✅ Samples par entitĂ© 12-13. ✅ Validation ASN/Country 14-18. ✅ Top 10 par type 19. ✅ ActivitĂ© par date 20. ✅ CorrĂ©lation 21-22. ✅ Types de donnĂ©es, NULL 23. ✅ Stats globales 24. ✅ Index 25. ✅ Performance 26. ✅ TTL 27-30. ✅ Distributions --- ## 10. Recommandations ### Tests manquants Ă  ajouter 1. **Tests unitaires backend** (pytest) ```bash # Structure recommandĂ©e backend/tests/ ├── test_metrics.py ├── test_detections.py ├── test_variability.py ├── test_analysis.py └── test_entities.py ``` 2. **Tests frontend** (Jest + React Testing Library) ```bash # Structure recommandĂ©e frontend/src/ ├── __tests__/ │ ├── App.test.tsx │ ├── components/ │ │ ├── Dashboard.test.tsx │ │ ├── DetectionsList.test.tsx │ │ └── DetailsView.test.tsx │ └── hooks/ │ ├── useMetrics.test.ts │ └── useDetections.test.ts ``` 3. **Tests E2E** (Playwright/Cypress) ```bash # Structure recommandĂ©e tests/e2e/ ├── dashboard.spec.ts ├── detections.spec.ts └── investigation.spec.ts ``` 4. **Tests de charge** (locust) ```python # locustfile.py from locust import HttpUser, task class DashboardUser(HttpUser): @task def load_metrics(self): self.client.get("/api/metrics") @task(3) def load_detections(self): self.client.get("/api/detections?page=1") ``` 5. **Tests de rĂ©gression API** ```bash # Utiliser Newman avec collections Postman # Ou Insomnia avec tests automatisĂ©s ``` ### Couverture actuelle estimĂ©e | Domaine | Couverture | MĂ©thode | |---------|------------|---------| | Backend API | 70% | Tests manuels + scripts | | Frontend | 30% | Tests manuels | | Database | 60% | SQL tests | | IntĂ©gration | 40% | Workflows manuels | | **Total** | **50%** | | ### Objectif de couverture | Domaine | Actuel | Cible | |---------|--------|-------| | Backend API | 70% | 90% | | Frontend | 30% | 80% | | Database | 60% | 90% | | IntĂ©gration | 40% | 85% | --- ## 11. Prioritisation ### PrioritĂ© 1 (Critique) 🔮 | Test | ID | Importance | |------|----|------------| | Health check | H1-H3 | Service disponible | | API metrics | M1-M5 | Dashboard fonctionnel | | API detections | D1-D11 | Liste dĂ©tections | | Connexion ClickHouse | DB1-DB7 | DonnĂ©es accessibles | | Navigation basique | N1-N5 | UX fonctionnel | **À tester avant chaque dĂ©ploiement.** --- ### PrioritĂ© 2 (Important) 🟡 | Test | ID | Importance | |------|----|------------| | Filtres et recherche | D3-D7, DL4-DL5 | Investigation efficace | | Investigation IP/JA4 | V1-V8, E1-E10 | Core feature | | VariabilitĂ© | VI1-VI3, VA1-VA3 | Analyse comportement | | Pagination | D2, D10-D11, DL2 | UX grande liste | | Insights automatiques | V8 | Valeur ajoutĂ©e | **À tester chaque sprint.** --- ### PrioritĂ© 3 (Secondaire) 🟱 | Test | ID | Importance | |------|----|------------| | Recommandations | AR1-AR3 | Feature avancĂ©e | | Analysis avancĂ©e | AS1-AS4, AJ1-AJ3 | Investigation profonde | | Responsive design | DH7 | Mobile support | | Performance | P1-P6 | Optimisation | | SĂ©curitĂ© | S1-S6 | Audit rĂ©gulier | **À tester avant release majeure.** --- ## 📊 Checklist de DĂ©ploiement ### Avant dĂ©ploiement - [ ] Tests PrioritĂ© 1 passants (100%) - [ ] Tests PrioritĂ© 2 passants (>80%) - [ ] Aucun bug critique ouvert - [ ] Logs vĂ©rifiĂ©s (pas d'erreurs) - [ ] Performance OK (< 2s chargement) ### AprĂšs dĂ©ploiement - [ ] Health check OK - [ ] Dashboard accessible - [ ] MĂ©triques affichĂ©es - [ ] DĂ©tections listĂ©es - [ ] Investigation fonctionnelle - [ ] Logs propres --- ## 📝 Notes ### Commandes utiles ```bash # Lancer tous les tests ./test_dashboard.sh # Tests SQL docker compose exec clickhouse clickhouse-client -d mabase_prod < test_dashboard_entities.sql # Logs en temps rĂ©el docker compose logs -f dashboard_web # RedĂ©marrer le dashboard docker compose restart dashboard_web # VĂ©rifier donnĂ©es ClickHouse docker compose exec clickhouse clickhouse-client -d mabase_prod -q \ "SELECT count() FROM ml_detected_anomalies WHERE detected_at >= now() - INTERVAL 24 HOUR" ``` ### Contacts et Support - **Documentation API:** http://localhost:3000/docs - **Logs:** `docker compose logs dashboard_web` - **ClickHouse:** `docker compose exec clickhouse clickhouse-client -d mabase_prod` --- **Document créé:** 2025 **DerniĂšre mise Ă  jour:** 2025 **Version:** 1.0