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]); } }