95 lines
2.7 KiB
PHP
95 lines
2.7 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
|
|
namespace Tests\Shared;
|
|
|
|
use App\Shared\Util\DateParser;
|
|
use DateTime;
|
|
use PHPUnit\Framework\TestCase;
|
|
|
|
/**
|
|
* Tests unitaires pour DateParser::parse().
|
|
*
|
|
* Couvre la conversion de valeurs brutes de base de données en DateTime,
|
|
* ainsi que les cas silencieux (null, chaîne vide, valeur invalide).
|
|
*/
|
|
#[\PHPUnit\Framework\Attributes\AllowMockObjectsWithoutExpectations]
|
|
final class DateParserTest extends TestCase
|
|
{
|
|
|
|
// ── Valeurs valides ────────────────────────────────────────────
|
|
|
|
/**
|
|
* Une date au format SQLite standard doit produire un DateTime correct.
|
|
*/
|
|
public function testStandardSqliteDate(): void
|
|
{
|
|
$result = DateParser::parse('2024-06-15 10:30:00');
|
|
|
|
$this->assertInstanceOf(DateTime::class, $result);
|
|
$this->assertSame('2024-06-15', $result->format('Y-m-d'));
|
|
$this->assertSame('10:30:00', $result->format('H:i:s'));
|
|
}
|
|
|
|
/**
|
|
* Une date ISO 8601 doit être correctement parsée.
|
|
*/
|
|
public function testIso8601Date(): void
|
|
{
|
|
$result = DateParser::parse('2024-01-01T00:00:00');
|
|
|
|
$this->assertInstanceOf(DateTime::class, $result);
|
|
$this->assertSame('2024-01-01', $result->format('Y-m-d'));
|
|
}
|
|
|
|
/**
|
|
* Une date seule (sans heure) doit être parsée correctement.
|
|
*/
|
|
public function testDateOnly(): void
|
|
{
|
|
$result = DateParser::parse('2024-12-31');
|
|
|
|
$this->assertInstanceOf(DateTime::class, $result);
|
|
$this->assertSame('2024-12-31', $result->format('Y-m-d'));
|
|
}
|
|
|
|
|
|
// ── Valeurs silencieuses — doit retourner null sans exception ────
|
|
|
|
/**
|
|
* null doit retourner null.
|
|
*/
|
|
public function testNullReturnsNull(): void
|
|
{
|
|
$this->assertNull(DateParser::parse(null));
|
|
}
|
|
|
|
/**
|
|
* Une chaîne vide doit retourner null.
|
|
*/
|
|
public function testEmptyStringReturnsNull(): void
|
|
{
|
|
$this->assertNull(DateParser::parse(''));
|
|
}
|
|
|
|
/**
|
|
* Une valeur non parseable doit retourner null sans lever d'exception.
|
|
*/
|
|
public function testInvalidValueReturnsNull(): void
|
|
{
|
|
$this->assertNull(DateParser::parse('pas-une-date'));
|
|
}
|
|
|
|
/**
|
|
* Un entier doit être interprété comme un timestamp si valide,
|
|
* ou retourner null si la conversion échoue.
|
|
* Ici on vérifie simplement qu'aucune exception n'est levée.
|
|
*/
|
|
public function testIntegerThrowsNoException(): void
|
|
{
|
|
$result = DateParser::parse(0);
|
|
// Pas d'assertion sur la valeur — on vérifie juste la robustesse
|
|
$this->assertTrue($result === null || $result instanceof DateTime);
|
|
}
|
|
}
|