#!/usr/bin/env php $httpCode, 'body' => json_decode($response, true) ?: $response ]; } echo $blue . "=== Test de validation ultra-souple des usernames ===" . $reset . "\n"; echo "Nouvelles règles : 8-30 caractères UTF-8, tous caractères acceptés\n\n"; // Cas qui doivent ÉCHOUER (trop court ou trop long) $testsFail = [ ['username' => 'abc', 'desc' => 'Trop court (3 car.)'], ['username' => '1234567', 'desc' => 'Trop court (7 car.)'], ['username' => str_repeat('a', 31), 'desc' => 'Trop long (31 car.)'], ['username' => str_repeat('😀', 31), 'desc' => 'Trop long (31 émojis)'], ['username' => ' ', 'desc' => 'Espaces seulement (devient vide après trim)'], ]; // Cas qui doivent RÉUSSIR $testsSuccess = [ ['username' => 'Jean-Pierre', 'desc' => 'Nom avec tiret et majuscules'], ['username' => '12345678', 'desc' => 'Chiffres seulement (8 car.)'], ['username' => 'user@company', 'desc' => 'Avec arobase'], ['username' => 'Marie 2024', 'desc' => 'Avec espace'], ['username' => 'josé.garcía', 'desc' => 'Avec accents'], ['username' => '用户2024', 'desc' => 'Caractères chinois'], ['username' => 'مستخدم123', 'desc' => 'Caractères arabes'], ['username' => 'Admin_#123!', 'desc' => 'Caractères spéciaux'], ['username' => '😀🎉Party2024', 'desc' => 'Avec émojis'], ['username' => 'Пользователь', 'desc' => 'Cyrillique'], ['username' => ' espacé ', 'desc' => 'Espaces (seront trimés)'], ['username' => 'a' . str_repeat('b', 28) . 'c', 'desc' => 'Exactement 30 car.'], ]; echo $yellow . "Tests qui doivent ÉCHOUER :" . $reset . "\n\n"; foreach ($testsFail as $index => $test) { echo "Test " . ($index + 1) . ": " . $test['desc'] . "\n"; echo "Username: \"" . $test['username'] . "\"\n"; $result = testRequest($apiUrl . '/users/check-username', 'POST', ['username' => $test['username']], $sessionId); $isExpectedFailure = ($result['code'] == 400); echo "Code HTTP: " . ($isExpectedFailure ? $green : $red) . $result['code'] . $reset; echo " - " . ($isExpectedFailure ? $green . "✓ OK" : $red . "✗ ERREUR") . $reset . "\n"; if (is_array($result['body'])) { echo "Message: " . $result['body']['message'] . "\n"; if (isset($result['body']['details'])) { echo "Détails: " . $result['body']['details'] . "\n"; } } echo "\n"; } echo $yellow . "Tests qui doivent RÉUSSIR :" . $reset . "\n\n"; foreach ($testsSuccess as $index => $test) { echo "Test " . ($index + 1) . ": " . $test['desc'] . "\n"; echo "Username: \"" . $test['username'] . "\"\n"; echo "Longueur: " . mb_strlen(trim($test['username']), 'UTF-8') . " caractères\n"; $result = testRequest($apiUrl . '/users/check-username', 'POST', ['username' => $test['username']], $sessionId); $isExpectedSuccess = ($result['code'] == 200); echo "Code HTTP: " . ($isExpectedSuccess ? $green : $red) . $result['code'] . $reset; echo " - " . ($isExpectedSuccess ? $green . "✓ OK" : $red . "✗ ERREUR") . $reset . "\n"; if (is_array($result['body'])) { if ($result['code'] == 200) { echo "Disponible: " . ($result['body']['available'] ? $green . "Oui" : $yellow . "Non (déjà pris)") . $reset . "\n"; } else { echo "Message: " . $result['body']['message'] . "\n"; if (isset($result['body']['details'])) { echo "Détails: " . $result['body']['details'] . "\n"; } } } echo "\n"; } echo $blue . "=== Résumé des nouvelles règles ===" . $reset . "\n"; echo "✓ Minimum : 8 caractères UTF-8\n"; echo "✓ Maximum : 30 caractères UTF-8\n"; echo "✓ Tous caractères acceptés (lettres, chiffres, espaces, émojis, accents, etc.)\n"; echo "✓ Trim automatique des espaces début/fin\n"; echo "✓ Sensible à la casse (Jean ≠ jean)\n"; echo "✓ Unicité vérifiée dans toute la base\n\n"; echo $yellow . "Note: N'oubliez pas d'exécuter le script SQL de migration !" . $reset . "\n"; echo "scripts/sql/migration_username_utf8_support.sql\n";