feat: Provisionner automatiquement un nouvel établissement
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.
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
<?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'));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user