Lorsqu'un super-admin crée un établissement via l'interface, le système doit automatiquement créer la base tenant, exécuter les migrations, créer le premier utilisateur admin et envoyer l'invitation — le tout de manière asynchrone pour ne pas bloquer la réponse HTTP. Ce mécanisme rend chaque établissement opérationnel dès sa création sans intervention manuelle sur l'infrastructure.
83 lines
2.6 KiB
PHP
83 lines
2.6 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Tests\Unit\Scolarite\Application\Service;
|
|
|
|
use App\Scolarite\Application\Query\GetClassStatisticsDetail\ClassStatisticsDetailDto;
|
|
use App\Scolarite\Application\Query\GetClassStatisticsDetail\StudentAverageDto;
|
|
use App\Scolarite\Application\Service\StatisticsExporter;
|
|
use PHPUnit\Framework\Attributes\Test;
|
|
use PHPUnit\Framework\TestCase;
|
|
|
|
use function str_contains;
|
|
|
|
final class StatisticsExporterTest extends TestCase
|
|
{
|
|
private StatisticsExporter $exporter;
|
|
|
|
protected function setUp(): void
|
|
{
|
|
$this->exporter = new StatisticsExporter();
|
|
}
|
|
|
|
#[Test]
|
|
public function itExportsClassStatisticsToCsv(): void
|
|
{
|
|
$stats = new ClassStatisticsDetailDto(
|
|
average: 12.5,
|
|
successRate: 72.0,
|
|
distribution: [0, 0, 1, 2, 3, 2, 1, 0],
|
|
evolution: [],
|
|
students: [
|
|
new StudentAverageDto(
|
|
studentId: 's1',
|
|
studentName: 'Alice Dupont',
|
|
average: 14.0,
|
|
inDifficulty: false,
|
|
trend: 'improving',
|
|
),
|
|
new StudentAverageDto(
|
|
studentId: 's2',
|
|
studentName: 'Bob Martin',
|
|
average: 7.0,
|
|
inDifficulty: true,
|
|
trend: 'declining',
|
|
),
|
|
],
|
|
);
|
|
|
|
$csv = $this->exporter->exportClassToCsv($stats, '6ème A', 'Mathématiques');
|
|
|
|
self::assertNotSame('', $csv);
|
|
self::assertTrue(str_contains($csv, '6ème A'));
|
|
self::assertTrue(str_contains($csv, 'Mathématiques'));
|
|
self::assertTrue(str_contains($csv, '12.5'));
|
|
self::assertTrue(str_contains($csv, '72%'));
|
|
self::assertTrue(str_contains($csv, 'Alice Dupont'));
|
|
self::assertTrue(str_contains($csv, '14'));
|
|
self::assertTrue(str_contains($csv, 'Progression'));
|
|
self::assertTrue(str_contains($csv, 'Bob Martin'));
|
|
self::assertTrue(str_contains($csv, 'Oui'));
|
|
self::assertTrue(str_contains($csv, 'Régression'));
|
|
}
|
|
|
|
#[Test]
|
|
public function itHandlesEmptyStudentList(): void
|
|
{
|
|
$stats = new ClassStatisticsDetailDto(
|
|
average: null,
|
|
successRate: 0.0,
|
|
distribution: [0, 0, 0, 0, 0, 0, 0, 0],
|
|
evolution: [],
|
|
students: [],
|
|
);
|
|
|
|
$csv = $this->exporter->exportClassToCsv($stats, '5ème B', 'Français');
|
|
|
|
self::assertNotSame('', $csv);
|
|
self::assertTrue(str_contains($csv, '5ème B'));
|
|
self::assertTrue(str_contains($csv, 'N/A'));
|
|
}
|
|
}
|