first commit

This commit is contained in:
julien
2026-03-20 22:13:41 +01:00
commit 41f8b3afb4
323 changed files with 27222 additions and 0 deletions

View File

@@ -0,0 +1,66 @@
<?php
declare(strict_types=1);
namespace Tests\Notifications;
use Netig\Netslim\Kernel\Mail\Application\MailServiceInterface;
use Netig\Netslim\Notifications\Application\NotificationApplicationService;
use Netig\Netslim\Notifications\Infrastructure\PdoNotificationDispatchRepository;
use PDO;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
final class NotificationServiceTest extends TestCase
{
private PDO $db;
/** @var MailServiceInterface&MockObject */
private MailServiceInterface $mailer;
private NotificationApplicationService $service;
protected function setUp(): void
{
$this->db = new PDO('sqlite::memory:', options: [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]);
$this->db->exec('CREATE TABLE notification_dispatches (id INTEGER PRIMARY KEY AUTOINCREMENT, recipient TEXT NOT NULL, subject TEXT NOT NULL, template TEXT NOT NULL, status TEXT NOT NULL, notification_key TEXT DEFAULT NULL, error_message TEXT DEFAULT NULL, created_at TEXT NOT NULL, sent_at TEXT DEFAULT NULL)');
$this->mailer = $this->createMock(MailServiceInterface::class);
$this->service = new NotificationApplicationService($this->mailer, new PdoNotificationDispatchRepository($this->db));
}
public function testSendTemplateRecordsSuccessfulDispatch(): void
{
$this->mailer->expects($this->once())
->method('send')
->with('user@example.test', 'Sujet', '@Identity/emails/password-reset.twig', ['name' => 'Ada']);
$this->service->sendTemplate('user@example.test', 'Sujet', '@Identity/emails/password-reset.twig', ['name' => 'Ada'], 'password-reset');
$history = $this->service->recent();
self::assertCount(1, $history);
self::assertSame('sent', $history[0]->status);
self::assertSame('password-reset', $history[0]->notificationKey);
}
public function testFailureIsRecordedAndRethrown(): void
{
$this->mailer->expects($this->once())
->method('send')
->willThrowException(new \RuntimeException('SMTP indisponible'));
$this->expectException(\RuntimeException::class);
$this->expectExceptionMessage('SMTP indisponible');
try {
$this->service->sendTemplate('user@example.test', 'Sujet', '@Identity/emails/password-reset.twig');
} finally {
$history = $this->service->recent();
self::assertCount(1, $history);
self::assertSame('failed', $history[0]->status);
self::assertSame('SMTP indisponible', $history[0]->errorMessage);
}
}
}