Add PHPUnit tests with coverage for all src classes

- 21 test files covering controllers, services, entities, enums, messages
- CI: add test job with Xdebug coverage (clover + text)
- SonarQube: configure coverage report path and test sources

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Serreau Jovann
2026-03-18 22:50:23 +01:00
parent d13e9b6b80
commit dc3d464b17
24 changed files with 1120 additions and 0 deletions

View File

@@ -0,0 +1,42 @@
<?php
namespace App\Tests\Entity;
use App\Entity\EmailTracking;
use PHPUnit\Framework\TestCase;
class EmailTrackingTest extends TestCase
{
public function testConstructorSetsFields(): void
{
$tracking = new EmailTracking('msg-123', 'user@example.com', 'Hello');
self::assertSame('msg-123', $tracking->getMessageId());
self::assertSame('user@example.com', $tracking->getRecipient());
self::assertSame('Hello', $tracking->getSubject());
self::assertSame('sent', $tracking->getState());
self::assertInstanceOf(\DateTimeImmutable::class, $tracking->getSentAt());
self::assertNull($tracking->getOpenedAt());
self::assertNull($tracking->getId());
}
public function testMarkAsOpenedTransitionsState(): void
{
$tracking = new EmailTracking('msg-123', 'user@example.com', 'Hello');
$tracking->markAsOpened();
self::assertSame('opened', $tracking->getState());
self::assertInstanceOf(\DateTimeImmutable::class, $tracking->getOpenedAt());
}
public function testMarkAsOpenedDoesNotTransitionTwice(): void
{
$tracking = new EmailTracking('msg-123', 'user@example.com', 'Hello');
$tracking->markAsOpened();
$firstOpenedAt = $tracking->getOpenedAt();
$tracking->markAsOpened();
self::assertSame($firstOpenedAt, $tracking->getOpenedAt());
}
}

View File

@@ -0,0 +1,49 @@
<?php
namespace App\Tests\Entity;
use App\Entity\MessengerLog;
use PHPUnit\Framework\TestCase;
class MessengerLogTest extends TestCase
{
public function testConstructorSetsFields(): void
{
$log = new MessengerLog(
messageClass: 'App\\Message\\TestMessage',
messageBody: 'serialized-body',
errorMessage: 'Something failed',
stackTrace: '#0 trace',
transportName: 'async',
retryCount: 2,
);
self::assertSame('App\\Message\\TestMessage', $log->getMessageClass());
self::assertSame('serialized-body', $log->getMessageBody());
self::assertSame('failed', $log->getStatus());
self::assertSame('Something failed', $log->getErrorMessage());
self::assertSame('#0 trace', $log->getStackTrace());
self::assertSame('async', $log->getTransportName());
self::assertSame(2, $log->getRetryCount());
self::assertInstanceOf(\DateTimeImmutable::class, $log->getCreatedAt());
self::assertInstanceOf(\DateTimeImmutable::class, $log->getFailedAt());
self::assertNull($log->getId());
}
public function testMarkAsResolved(): void
{
$log = new MessengerLog('Class', null, 'error');
$log->markAsResolved();
self::assertSame('resolved', $log->getStatus());
}
public function testSetStatus(): void
{
$log = new MessengerLog('Class', null, 'error');
$result = $log->setStatus('retrying');
self::assertSame('retrying', $log->getStatus());
self::assertSame($log, $result);
}
}

66
tests/Entity/UserTest.php Normal file
View File

@@ -0,0 +1,66 @@
<?php
namespace App\Tests\Entity;
use App\Entity\User;
use PHPUnit\Framework\TestCase;
class UserTest extends TestCase
{
public function testNewUserHasCreatedAt(): void
{
$user = new User();
self::assertInstanceOf(\DateTimeImmutable::class, $user->getCreatedAt());
}
public function testGetRolesAlwaysIncludesRoleUser(): void
{
$user = new User();
self::assertContains('ROLE_USER', $user->getRoles());
}
public function testSetRolesDeduplicatesRoleUser(): void
{
$user = new User();
$user->setRoles(['ROLE_ADMIN', 'ROLE_USER']);
$roles = $user->getRoles();
self::assertCount(2, $roles);
self::assertContains('ROLE_ADMIN', $roles);
self::assertContains('ROLE_USER', $roles);
}
public function testGetUserIdentifierReturnsEmail(): void
{
$user = new User();
$user->setEmail('test@example.com');
self::assertSame('test@example.com', $user->getUserIdentifier());
}
public function testFluentSetters(): void
{
$user = new User();
$result = $user->setEmail('a@b.com')
->setFirstName('John')
->setLastName('Doe')
->setPassword('hashed');
self::assertSame($user, $result);
self::assertSame('a@b.com', $user->getEmail());
self::assertSame('John', $user->getFirstName());
self::assertSame('Doe', $user->getLastName());
self::assertSame('hashed', $user->getPassword());
}
public function testEraseCredentialsDoesNotThrow(): void
{
$user = new User();
$user->eraseCredentials();
self::assertNull($user->getId());
}
}