122 lines
3.5 KiB
PHP
122 lines
3.5 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
|
|
namespace Tests\Shared;
|
|
|
|
use App\Shared\Util\SlugHelper;
|
|
use PHPUnit\Framework\TestCase;
|
|
|
|
/**
|
|
* Tests unitaires pour SlugHelper::generate().
|
|
*
|
|
* Couvre la translittération ASCII, la normalisation en minuscules,
|
|
* le remplacement des caractères non alphanumériques, et les cas limites.
|
|
*/
|
|
final class SlugHelperTest extends TestCase
|
|
{
|
|
|
|
// ── Cas nominaux ───────────────────────────────────────────────
|
|
|
|
/**
|
|
* Une chaîne ASCII simple doit être mise en minuscules.
|
|
*/
|
|
public function testSimpleAsciiString(): void
|
|
{
|
|
$this->assertSame('hello-world', SlugHelper::generate('Hello World'));
|
|
}
|
|
|
|
/**
|
|
* Les caractères accentués doivent être translittérés en ASCII.
|
|
*/
|
|
public function testAccentedCharacters(): void
|
|
{
|
|
$this->assertSame('ete-en-foret', SlugHelper::generate('Été en forêt'));
|
|
}
|
|
|
|
/**
|
|
* La cédille et les caractères spéciaux courants doivent être translittérés.
|
|
*/
|
|
public function testCedillaAndSpecialCharacters(): void
|
|
{
|
|
$this->assertSame('ca-la', SlugHelper::generate('Ça & Là !'));
|
|
}
|
|
|
|
/**
|
|
* Les tirets multiples consécutifs doivent être fusionnés en un seul.
|
|
*/
|
|
public function testMultipleConsecutiveHyphens(): void
|
|
{
|
|
$this->assertSame('foo-bar', SlugHelper::generate('foo bar'));
|
|
}
|
|
|
|
/**
|
|
* Les tirets en début et fin de slug doivent être supprimés.
|
|
*/
|
|
public function testLeadingAndTrailingHyphen(): void
|
|
{
|
|
$this->assertSame('foo', SlugHelper::generate(' foo '));
|
|
}
|
|
|
|
/**
|
|
* Les chiffres doivent être conservés dans le slug.
|
|
*/
|
|
public function testDigitsPreserved(): void
|
|
{
|
|
$this->assertSame('article-2024', SlugHelper::generate('Article 2024'));
|
|
}
|
|
|
|
/**
|
|
* Les tirets déjà présents dans la chaîne doivent être conservés (fusionnés si doublons).
|
|
*/
|
|
public function testHyphensInSourceString(): void
|
|
{
|
|
$this->assertSame('mon-article', SlugHelper::generate('mon-article'));
|
|
}
|
|
|
|
/**
|
|
* Une chaîne entièrement en majuscules doit être passée en minuscules.
|
|
*/
|
|
public function testUppercaseString(): void
|
|
{
|
|
$this->assertSame('php-est-super', SlugHelper::generate('PHP EST SUPER'));
|
|
}
|
|
|
|
|
|
// ── Cas limites ────────────────────────────────────────────────
|
|
|
|
/**
|
|
* Une chaîne vide doit retourner une chaîne vide.
|
|
*/
|
|
public function testEmptyString(): void
|
|
{
|
|
$this->assertSame('', SlugHelper::generate(''));
|
|
}
|
|
|
|
/**
|
|
* Une chaîne composée uniquement d'espaces doit retourner une chaîne vide.
|
|
*/
|
|
public function testSpacesOnlyString(): void
|
|
{
|
|
$this->assertSame('', SlugHelper::generate(' '));
|
|
}
|
|
|
|
/**
|
|
* Une chaîne composée uniquement de caractères spéciaux sans équivalent ASCII
|
|
* doit retourner une chaîne vide.
|
|
*/
|
|
public function testCharactersWithoutAsciiEquivalent(): void
|
|
{
|
|
// Les caractères CJK n'ont pas d'équivalent ASCII//TRANSLIT
|
|
$result = SlugHelper::generate('日本語');
|
|
$this->assertSame('', $result);
|
|
}
|
|
|
|
/**
|
|
* Un slug déjà valide doit rester identique.
|
|
*/
|
|
public function testAlreadyValidSlug(): void
|
|
{
|
|
$this->assertSame('mon-slug-valide', SlugHelper::generate('mon-slug-valide'));
|
|
}
|
|
}
|