L'élève avait accès à ses compétences mais pas à ses notes numériques. Cette fonctionnalité lui donne une vue complète de sa progression scolaire avec moyennes par matière, détail par évaluation, statistiques de classe, et un mode "découverte" pour révéler ses notes à son rythme (FR14, FR15). Les notes ne sont visibles qu'après publication par l'enseignant, ce qui garantit que l'élève les découvre avant ses parents (délai 24h story 6.7).
99 lines
2.8 KiB
PHP
99 lines
2.8 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Tests\Unit\Scolarite\Infrastructure\Service;
|
|
|
|
use App\Scolarite\Infrastructure\Service\DatabaseParentGradeDelayReader;
|
|
use App\Shared\Domain\Tenant\TenantId;
|
|
use Doctrine\DBAL\Connection;
|
|
use PHPUnit\Framework\Attributes\Test;
|
|
use PHPUnit\Framework\TestCase;
|
|
|
|
final class DatabaseParentGradeDelayReaderTest extends TestCase
|
|
{
|
|
private const string TENANT_ID = '550e8400-e29b-41d4-a716-446655440001';
|
|
|
|
#[Test]
|
|
public function itReturnsConfiguredDelayWhenRowExists(): void
|
|
{
|
|
$connection = $this->createMock(Connection::class);
|
|
$connection
|
|
->method('fetchOne')
|
|
->willReturn('48');
|
|
|
|
$reader = new DatabaseParentGradeDelayReader($connection);
|
|
|
|
$result = $reader->delayHoursForTenant(TenantId::fromString(self::TENANT_ID));
|
|
|
|
self::assertSame(48, $result);
|
|
}
|
|
|
|
#[Test]
|
|
public function itReturnsDefault24HoursWhenNoRowFound(): void
|
|
{
|
|
$connection = $this->createMock(Connection::class);
|
|
$connection
|
|
->method('fetchOne')
|
|
->willReturn(false);
|
|
|
|
$reader = new DatabaseParentGradeDelayReader($connection);
|
|
|
|
$result = $reader->delayHoursForTenant(TenantId::fromString(self::TENANT_ID));
|
|
|
|
self::assertSame(24, $result);
|
|
}
|
|
|
|
#[Test]
|
|
public function itReturnsDefault24HoursWhenResultIsNonNumeric(): void
|
|
{
|
|
$connection = $this->createMock(Connection::class);
|
|
$connection
|
|
->method('fetchOne')
|
|
->willReturn('not-a-number');
|
|
|
|
$reader = new DatabaseParentGradeDelayReader($connection);
|
|
|
|
$result = $reader->delayHoursForTenant(TenantId::fromString(self::TENANT_ID));
|
|
|
|
self::assertSame(24, $result);
|
|
}
|
|
|
|
#[Test]
|
|
public function itPassesTenantIdToQuery(): void
|
|
{
|
|
$tenantId = TenantId::fromString(self::TENANT_ID);
|
|
|
|
$connection = $this->createMock(Connection::class);
|
|
$connection
|
|
->expects(self::once())
|
|
->method('fetchOne')
|
|
->with(
|
|
self::stringContains('tenant_id'),
|
|
self::equalTo(['tenant_id' => (string) $tenantId]),
|
|
)
|
|
->willReturn('12');
|
|
|
|
$reader = new DatabaseParentGradeDelayReader($connection);
|
|
|
|
$result = $reader->delayHoursForTenant($tenantId);
|
|
|
|
self::assertSame(12, $result);
|
|
}
|
|
|
|
#[Test]
|
|
public function itCastsNumericStringToInt(): void
|
|
{
|
|
$connection = $this->createMock(Connection::class);
|
|
$connection
|
|
->method('fetchOne')
|
|
->willReturn('0');
|
|
|
|
$reader = new DatabaseParentGradeDelayReader($connection);
|
|
|
|
$result = $reader->delayHoursForTenant(TenantId::fromString(self::TENANT_ID));
|
|
|
|
self::assertSame(0, $result);
|
|
}
|
|
}
|