import React from 'react' import { render, screen } from '../../../test-utils' import StatsCard from '../StatsCard' describe('Composant StatsCard', () => { const defaultProps = { title: 'Projets actifs', value: 42, icon: 'pi pi-building', color: 'primary' as const, } it('devrait afficher les informations de base', () => { render() expect(screen.getByText('Projets actifs')).toBeInTheDocument() expect(screen.getByText('42')).toBeInTheDocument() expect(document.querySelector('.pi-building')).toBeInTheDocument() }) it('devrait formater les nombres avec des séparateurs', () => { render() // Le format peut varier selon la locale expect(screen.getByText(/1[,\s]?234[,\s]?567/)).toBeInTheDocument() }) it('devrait afficher les valeurs string directement', () => { render() expect(screen.getByText('50 000 €')).toBeInTheDocument() }) it('devrait afficher le sous-titre si fourni', () => { render() expect(screen.getByText('En cours ce mois')).toBeInTheDocument() }) it('devrait afficher la tendance positive', () => { render( ) expect(screen.getByText('+15%')).toBeInTheDocument() expect(screen.getByText('Augmentation ce mois')).toBeInTheDocument() }) it('devrait afficher la tendance négative', () => { render( ) expect(screen.getByText('-5%')).toBeInTheDocument() expect(screen.getByText('Diminution ce mois')).toBeInTheDocument() }) it('devrait appliquer la bonne couleur', () => { const colors = [ { color: 'primary' as const, textClass: 'text-blue-500', bgClass: 'bg-blue-100' }, { color: 'success' as const, textClass: 'text-green-500', bgClass: 'bg-green-100' }, { color: 'info' as const, textClass: 'text-cyan-500', bgClass: 'bg-cyan-100' }, { color: 'warning' as const, textClass: 'text-yellow-500', bgClass: 'bg-yellow-100' }, { color: 'danger' as const, textClass: 'text-red-500', bgClass: 'bg-red-100' }, ] colors.forEach(({ color, textClass, bgClass }) => { const { container } = render() const icon = container.querySelector(`.${defaultProps.icon.replace(' ', '.')}`) const iconContainer = icon?.parentElement expect(icon).toHaveClass(textClass) expect(iconContainer).toHaveClass(bgClass) }) }) it('devrait afficher l\'état de chargement', () => { render() // Vérifier la présence des skeletons expect(screen.queryByText('Projets actifs')).not.toBeInTheDocument() expect(screen.queryByText('42')).not.toBeInTheDocument() // PrimeReact Skeleton crée des éléments avec data-pc-name="skeleton" const skeletons = document.querySelectorAll('[data-pc-name="skeleton"]') expect(skeletons.length).toBeGreaterThan(0) }) it('devrait avoir une hauteur complète', () => { const { container } = render() const card = container.querySelector('[data-pc-name="card"]') expect(card).toHaveClass('h-full') }) it('devrait gérer tous les types d\'icônes PrimeIcons', () => { const icons = ['pi pi-users', 'pi pi-euro', 'pi pi-exclamation-triangle'] icons.forEach(icon => { const { container } = render() const iconElement = container.querySelector(`.${icon.split(' ').join('.')}`) expect(iconElement).toBeInTheDocument() }) }) it('devrait afficher correctement avec toutes les props', () => { render( ) expect(screen.getByText("Chiffre d'affaires")).toBeInTheDocument() expect(screen.getByText("125 450 €")).toBeInTheDocument() expect(screen.getByText("Total ce mois")).toBeInTheDocument() expect(screen.getByText("+8%")).toBeInTheDocument() expect(screen.getByText("Augmentation ce mois")).toBeInTheDocument() expect(document.querySelector('.pi-euro')).toBeInTheDocument() }) })