buckets/tests/Entity/UserTest.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]);
}
}