the-tip-top-backend/scripts/test-statistics-api.js
2025-11-17 23:47:54 +01:00

191 lines
7.1 KiB
JavaScript

/**
* Script pour tester l'endpoint /api/admin/statistics
*/
import { pool } from '../db.js';
async function testStatisticsAPI() {
try {
console.log('🔄 Test de l\'endpoint /admin/statistics...\n');
// D'abord, récupérer un admin pour avoir le token
const adminResult = await pool.query(`
SELECT id, email, first_name, last_name
FROM users
WHERE role = 'ADMIN'
LIMIT 1
`);
if (adminResult.rows.length === 0) {
console.log('⚠️ Aucun admin trouvé dans la base de données');
console.log(' Créez un admin d\'abord avec:');
console.log(' npm run db:seed');
process.exit(1);
}
const admin = adminResult.rows[0];
console.log(`✅ Admin trouvé: ${admin.email} (${admin.first_name} ${admin.last_name})`);
console.log(' Note: Pour tester l\'API, vous devez vous connecter via l\'interface ou utiliser curl/Postman\n');
// Simuler ce que l'endpoint retournerait en appelant directement les mêmes requêtes
console.log('📊 Simulation des statistiques (requêtes SQL directes):\n');
// Statistiques utilisateurs
const usersStats = await pool.query(`
SELECT
COUNT(*) as total_users,
COUNT(CASE WHEN role = 'CLIENT' THEN 1 END) as clients,
COUNT(CASE WHEN role = 'EMPLOYEE' THEN 1 END) as employees,
COUNT(CASE WHEN role = 'ADMIN' THEN 1 END) as admins,
COUNT(CASE WHEN is_verified = TRUE THEN 1 END) as verified_users
FROM users
`);
console.log('👥 Utilisateurs:');
console.log(` - Total: ${usersStats.rows[0].total_users}`);
console.log(` - Clients: ${usersStats.rows[0].clients}`);
console.log(` - Employés: ${usersStats.rows[0].employees}`);
console.log(` - Admins: ${usersStats.rows[0].admins}`);
console.log(` - Emails vérifiés: ${usersStats.rows[0].verified_users}\n`);
// Statistiques tickets
const ticketsStats = await pool.query(`
SELECT
COUNT(*) as total_tickets,
COUNT(CASE WHEN user_id IS NOT NULL THEN 1 END) as distributed,
COUNT(CASE WHEN played_at IS NOT NULL THEN 1 END) as used,
COUNT(CASE WHEN status = 'PENDING' THEN 1 END) as pending,
COUNT(CASE WHEN status = 'CLAIMED' THEN 1 END) as claimed,
COUNT(CASE WHEN status = 'REJECTED' THEN 1 END) as rejected,
COUNT(CASE WHEN validated_at IS NOT NULL THEN 1 END) as validated
FROM tickets
`);
console.log('🎫 Tickets:');
console.log(` - Total: ${ticketsStats.rows[0].total_tickets}`);
console.log(` - Distribués: ${ticketsStats.rows[0].distributed}`);
console.log(` - Utilisés: ${ticketsStats.rows[0].used}`);
console.log(` - En attente: ${ticketsStats.rows[0].pending}`);
console.log(` - Validés: ${ticketsStats.rows[0].validated}`);
console.log(` - Réclamés: ${ticketsStats.rows[0].claimed}`);
console.log(` - Rejetés: ${ticketsStats.rows[0].rejected}\n`);
// Répartition des lots
const prizeDistribution = await pool.query(`
SELECT
p.id as prize_id,
p.name as prize_name,
p.type as prize_type,
COUNT(t.id) as count,
CASE
WHEN (SELECT COUNT(*) FROM tickets) > 0
THEN ROUND((COUNT(t.id)::DECIMAL / (SELECT COUNT(*) FROM tickets)) * 100, 2)
ELSE 0
END as percentage
FROM prizes p
LEFT JOIN tickets t ON p.id = t.prize_id
GROUP BY p.id, p.name, p.type
ORDER BY count DESC
`);
console.log('🎁 Répartition des lots:');
prizeDistribution.rows.forEach(prize => {
console.log(` - ${prize.prize_name}: ${prize.count} (${prize.percentage}%)`);
});
console.log('');
// Statistiques démographiques - Genre
const genderStats = await pool.query(`
SELECT
COUNT(CASE WHEN gender = 'MALE' THEN 1 END) as male,
COUNT(CASE WHEN gender = 'FEMALE' THEN 1 END) as female,
COUNT(CASE WHEN gender = 'OTHER' THEN 1 END) as other,
COUNT(CASE WHEN gender = 'NOT_SPECIFIED' OR gender IS NULL THEN 1 END) as not_specified
FROM users
WHERE role = 'CLIENT'
`);
console.log('👤 Démographie - Genre:');
console.log(` - Hommes: ${genderStats.rows[0].male}`);
console.log(` - Femmes: ${genderStats.rows[0].female}`);
console.log(` - Autre: ${genderStats.rows[0].other}`);
console.log(` - Non spécifié: ${genderStats.rows[0].not_specified}\n`);
// Statistiques démographiques - Âge
const ageStats = await pool.query(`
SELECT
age_range as range,
COUNT(*) as count,
ROUND((COUNT(*)::DECIMAL / (SELECT COUNT(*) FROM users WHERE role = 'CLIENT')) * 100, 2) as percentage
FROM (
SELECT
CASE
WHEN EXTRACT(YEAR FROM AGE(CURRENT_DATE, date_of_birth)) BETWEEN 18 AND 25 THEN '18-25'
WHEN EXTRACT(YEAR FROM AGE(CURRENT_DATE, date_of_birth)) BETWEEN 26 AND 35 THEN '26-35'
WHEN EXTRACT(YEAR FROM AGE(CURRENT_DATE, date_of_birth)) BETWEEN 36 AND 45 THEN '36-45'
WHEN EXTRACT(YEAR FROM AGE(CURRENT_DATE, date_of_birth)) BETWEEN 46 AND 55 THEN '46-55'
WHEN EXTRACT(YEAR FROM AGE(CURRENT_DATE, date_of_birth)) BETWEEN 56 AND 65 THEN '56-65'
WHEN EXTRACT(YEAR FROM AGE(CURRENT_DATE, date_of_birth)) > 65 THEN '65+'
ELSE 'Non spécifié'
END as age_range
FROM users
WHERE role = 'CLIENT'
) subquery
GROUP BY age_range
ORDER BY
CASE age_range
WHEN '18-25' THEN 1
WHEN '26-35' THEN 2
WHEN '36-45' THEN 3
WHEN '46-55' THEN 4
WHEN '56-65' THEN 5
WHEN '65+' THEN 6
ELSE 7
END
`);
console.log('📅 Démographie - Âge:');
ageStats.rows.forEach(age => {
console.log(` - ${age.range}: ${age.count} (${age.percentage}%)`);
});
console.log('');
// Top villes
const topCities = await pool.query(`
SELECT
city,
COUNT(*) as count,
ROUND((COUNT(*)::DECIMAL / (SELECT COUNT(*) FROM users WHERE role = 'CLIENT')) * 100, 2) as percentage
FROM users
WHERE role = 'CLIENT' AND city IS NOT NULL AND city != ''
GROUP BY city
ORDER BY count DESC
LIMIT 10
`);
console.log('📍 Top villes:');
topCities.rows.forEach((city, index) => {
console.log(` ${index + 1}. ${city.city}: ${city.count} (${city.percentage}%)`);
});
console.log('');
console.log('✅ Test terminé !');
console.log('\n📝 Pour tester l\'API complète:');
console.log(' 1. Connectez-vous à l\'application avec un compte admin');
console.log(' 2. Ouvrez la console du navigateur (F12)');
console.log(' 3. Allez sur la page Dashboard admin');
console.log(' 4. Vérifiez que les statistiques s\'affichent correctement');
console.log('\n Ou utilisez curl/Postman:');
console.log(' GET http://localhost:4000/api/admin/statistics');
console.log(' Header: Authorization: Bearer <votre_token_admin>');
} catch (error) {
console.error('❌ Erreur:', error.message);
console.error(error);
process.exit(1);
} finally {
await pool.end();
}
}
testStatisticsAPI();