import React from 'react'
import { render, screen, waitFor } from '../../../../test-utils'
import userEvent from '@testing-library/user-event'
import Dashboard from '../page'
import useDashboard from '../../../../hooks/useDashboard'
// Mock des hooks
jest.mock('../../../../hooks/useDashboard')
jest.mock('../../../../components/auth/ProtectedRoute', () => {
return function MockProtectedRoute({ children }: { children: React.ReactNode }) {
return
{children}
}
})
const mockUseDashboard = useDashboard as jest.MockedFunction
const mockDashboardData = {
stats: {
totalChantiers: 12,
chiffreAffaires: 125000,
totalClients: 34,
facturesEnRetard: 3,
},
chantiersRecents: [
{
id: '1',
nom: 'Rénovation Bureau',
client: 'Entreprise ABC',
statut: 'EN_COURS' as const,
dateDebut: '2024-01-15',
montantPrevu: 45000,
},
{
id: '2',
nom: 'Construction Garage',
client: 'Client XYZ',
statut: 'PLANIFIE' as const,
dateDebut: '2024-02-01',
montantPrevu: 25000,
},
],
facturesEnRetard: [
{
id: '1',
numero: 'F2024-001',
client: 'Client A',
montant: 5000,
dateEcheance: '2024-01-01',
},
],
devisEnAttente: [
{
id: '1',
numero: 'D2024-001',
client: 'Client B',
montant: 8000,
dateCreation: '2024-01-10',
},
],
loading: false,
error: null,
refresh: jest.fn(),
}
describe('Page Dashboard', () => {
beforeEach(() => {
jest.clearAllMocks()
mockUseDashboard.mockReturnValue(mockDashboardData)
})
it('devrait afficher le dashboard avec toutes les sections', () => {
render()
expect(screen.getByTestId('protected-route')).toBeInTheDocument()
expect(screen.getByText('Tableau de Bord BTP Xpress')).toBeInTheDocument()
expect(screen.getByText('Bienvenue sur votre plateforme de gestion BTP. Voici un aperçu de vos projets en cours.')).toBeInTheDocument()
})
it('devrait afficher les cartes de statistiques', () => {
render()
expect(screen.getByText('Projets actifs')).toBeInTheDocument()
expect(screen.getByText('Budget total')).toBeInTheDocument()
expect(screen.getByText('Clients')).toBeInTheDocument()
expect(screen.getByText('Factures impayées')).toBeInTheDocument()
// Vérifier les valeurs
expect(screen.getByText('12')).toBeInTheDocument()
expect(screen.getByText('125 000 €')).toBeInTheDocument()
expect(screen.getByText('34')).toBeInTheDocument()
expect(screen.getByText('3')).toBeInTheDocument()
})
it('devrait afficher les chantiers récents', () => {
render()
expect(screen.getByText('Rénovation Bureau')).toBeInTheDocument()
expect(screen.getByText('Construction Garage')).toBeInTheDocument()
expect(screen.getByText('Entreprise ABC')).toBeInTheDocument()
expect(screen.getByText('Client XYZ')).toBeInTheDocument()
})
it('devrait permettre d\'actualiser les données', async () => {
const user = userEvent.setup()
const mockRefresh = jest.fn()
mockUseDashboard.mockReturnValue({
...mockDashboardData,
refresh: mockRefresh,
})
render()
const refreshButton = screen.getByText('Actualiser')
await user.click(refreshButton)
expect(mockRefresh).toHaveBeenCalledTimes(1)
})
it('devrait afficher l\'état de chargement', () => {
mockUseDashboard.mockReturnValue({
...mockDashboardData,
loading: true,
})
render()
const refreshButton = screen.getByText('Actualiser')
expect(refreshButton).toHaveAttribute('data-pc-section', 'loadingicon')
})
it('devrait afficher les erreurs', () => {
mockUseDashboard.mockReturnValue({
...mockDashboardData,
error: 'Erreur de connexion au serveur',
})
render()
expect(screen.getByText('Erreur de connexion au serveur')).toBeInTheDocument()
expect(screen.getByText('Réessayer')).toBeInTheDocument()
})
it('devrait permettre de réessayer après une erreur', async () => {
const user = userEvent.setup()
const mockRefresh = jest.fn()
mockUseDashboard.mockReturnValue({
...mockDashboardData,
error: 'Erreur de connexion',
refresh: mockRefresh,
})
render()
const retryButton = screen.getByText('Réessayer')
await user.click(retryButton)
expect(mockRefresh).toHaveBeenCalledTimes(1)
})
it('devrait afficher les valeurs par défaut quand les stats sont vides', () => {
mockUseDashboard.mockReturnValue({
...mockDashboardData,
stats: null,
})
render()
// Vérifier que les valeurs par défaut (0) sont affichées
expect(screen.getByText('0')).toBeInTheDocument()
})
it('devrait afficher les icônes correctes pour chaque statistique', () => {
render()
expect(document.querySelector('.pi-building')).toBeInTheDocument()
expect(document.querySelector('.pi-euro')).toBeInTheDocument()
expect(document.querySelector('.pi-users')).toBeInTheDocument()
expect(document.querySelector('.pi-exclamation-triangle')).toBeInTheDocument()
})
it('devrait afficher les tendances sur les cartes', () => {
render()
// Vérifier que les tendances sont affichées
expect(screen.getByText('+12%')).toBeInTheDocument()
expect(screen.getByText('+8%')).toBeInTheDocument()
expect(screen.getByText('+15%')).toBeInTheDocument()
expect(screen.getByText('-5%')).toBeInTheDocument()
})
it('devrait avoir une mise en page responsive', () => {
const { container } = render()
// Vérifier la structure en grille
expect(container.querySelector('.grid')).toBeInTheDocument()
expect(container.querySelector('.col-12')).toBeInTheDocument()
expect(container.querySelector('.col-12.md\\:col-3')).toBeInTheDocument()
expect(container.querySelector('.col-12.md\\:col-8')).toBeInTheDocument()
expect(container.querySelector('.col-12.md\\:col-4')).toBeInTheDocument()
})
it('devrait gérer les actions sur les chantiers', () => {
// Spy sur console.log pour vérifier les handlers
const consoleSpy = jest.spyOn(console, 'log').mockImplementation()
render()
// Les handlers sont appelés dans le composant mais pas directement testables
// On peut vérifier leur présence dans le code
expect(consoleSpy).not.toHaveBeenCalled()
consoleSpy.mockRestore()
})
it('devrait utiliser le ProtectedRoute avec les bonnes permissions', () => {
render()
// Vérifier que le composant est wrappé dans ProtectedRoute
expect(screen.getByTestId('protected-route')).toBeInTheDocument()
})
it('devrait afficher un toast après actualisation', async () => {
const user = userEvent.setup()
render()
const refreshButton = screen.getByText('Actualiser')
await user.click(refreshButton)
// Le toast est géré par PrimeReact, on vérifie juste que la fonction est appelée
await waitFor(() => {
expect(mockDashboardData.refresh).toHaveBeenCalled()
})
})
it('devrait formater correctement les montants', () => {
render()
// Vérifier que le chiffre d'affaires est formaté
expect(screen.getByText('125 000 €')).toBeInTheDocument()
})
})