96 lines
2.9 KiB
PHP
96 lines
2.9 KiB
PHP
<?php
|
|
|
|
namespace App\Tests\Entity;
|
|
|
|
use App\Entity\User;
|
|
use PHPUnit\Framework\TestCase;
|
|
use Symfony\Component\Uid\UuidV7;
|
|
|
|
final class UserTest extends TestCase
|
|
{
|
|
public function testGetIdReturnsAUuidV7AssignedAtConstruction(): void
|
|
{
|
|
$user = new User();
|
|
|
|
$this->assertInstanceOf(UuidV7::class, $user->getId());
|
|
}
|
|
|
|
public function testGetRolesAlwaysIncludesRoleUserEvenWhenNoRolesAreSet(): void
|
|
{
|
|
$user = new User();
|
|
|
|
$this->assertContains('ROLE_USER', $user->getRoles());
|
|
}
|
|
|
|
public function testGetRolesMergesExplicitlySetRolesWithRoleUser(): void
|
|
{
|
|
$user = new User();
|
|
$user->setRoles(['ROLE_ADMIN']);
|
|
|
|
$roles = $user->getRoles();
|
|
|
|
$this->assertContains('ROLE_ADMIN', $roles);
|
|
$this->assertContains('ROLE_USER', $roles);
|
|
}
|
|
|
|
public function testGetRolesDeduplicatesRoleUserWhenExplicitlySet(): void
|
|
{
|
|
$user = new User();
|
|
$user->setRoles(['ROLE_USER']);
|
|
|
|
$roles = $user->getRoles();
|
|
|
|
$this->assertSame(['ROLE_USER'], array_values(array_unique($roles)));
|
|
$this->assertCount(1, array_keys($roles, 'ROLE_USER'));
|
|
}
|
|
|
|
public function testGetUserIdentifierReturnsTheEmail(): void
|
|
{
|
|
$user = new User();
|
|
$user->setEmail('alice@example.com');
|
|
|
|
$this->assertSame('alice@example.com', $user->getUserIdentifier());
|
|
}
|
|
|
|
public function testEmailGetterAndSetterRoundTrip(): void
|
|
{
|
|
$user = new User();
|
|
$returned = $user->setEmail('bob@example.com');
|
|
|
|
$this->assertSame('bob@example.com', $user->getEmail());
|
|
$this->assertSame($user, $returned, 'setEmail should return $this for fluent chaining.');
|
|
}
|
|
|
|
public function testRolesGetterAndSetterRoundTrip(): void
|
|
{
|
|
$user = new User();
|
|
$returned = $user->setRoles(['ROLE_ADMIN', 'ROLE_USER']);
|
|
|
|
$this->assertContains('ROLE_ADMIN', $user->getRoles());
|
|
$this->assertSame($user, $returned, 'setRoles should return $this for fluent chaining.');
|
|
}
|
|
|
|
public function testPasswordGetterAndSetterRoundTrip(): void
|
|
{
|
|
$user = new User();
|
|
$returned = $user->setPassword('hashed-password');
|
|
|
|
$this->assertSame('hashed-password', $user->getPassword());
|
|
$this->assertSame($user, $returned, 'setPassword should return $this for fluent chaining.');
|
|
}
|
|
|
|
public function testSerializeReplacesThePasswordWithItsCrc32cHashAndDropsTheRawValue(): void
|
|
{
|
|
$user = new User();
|
|
$user->setEmail('alice@example.com');
|
|
$user->setPassword('raw-hashed-password');
|
|
|
|
$serialized = $user->__serialize();
|
|
|
|
$key = "\0".User::class."\0password";
|
|
|
|
$this->assertArrayHasKey($key, $serialized);
|
|
$this->assertSame(hash('crc32c', 'raw-hashed-password'), $serialized[$key]);
|
|
$this->assertNotSame('raw-hashed-password', $serialized[$key]);
|
|
}
|
|
}
|