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:
42
tests/Entity/EmailTrackingTest.php
Normal file
42
tests/Entity/EmailTrackingTest.php
Normal 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());
|
||||
}
|
||||
}
|
||||
49
tests/Entity/MessengerLogTest.php
Normal file
49
tests/Entity/MessengerLogTest.php
Normal 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
66
tests/Entity/UserTest.php
Normal 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());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user