93 lines
4.1 KiB
PHP
93 lines
4.1 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Tests\Service;
|
|
|
|
use App\BpnConnect\Model\TravelMailingRecipient;
|
|
use App\Entity\TravelMailingList;
|
|
use App\Exception\NewsletterProviderException;
|
|
use App\Mailjet\ApiClient;
|
|
use App\Service\TravelMailingListManager;
|
|
use Doctrine\ORM\EntityManagerInterface;
|
|
use PHPUnit\Framework\TestCase;
|
|
use Psr\Log\NullLogger;
|
|
|
|
class TravelMailingListManagerTest extends TestCase
|
|
{
|
|
public function testCreateTracksTheListAndAddsDeduplicatedContacts(): void
|
|
{
|
|
$mailjet = $this->createMock(ApiClient::class);
|
|
$mailjet->expects(self::once())->method('createContactsList')->with('LPJMP281126')->willReturn(42);
|
|
$mailjet->expects(self::once())->method('addContactsToList')->with(42, [
|
|
['email' => '[email protected]', 'firstName' => 'Mia'],
|
|
['email' => '[email protected]', 'firstName' => null],
|
|
])->willReturn(555);
|
|
|
|
$entityManager = $this->createMock(EntityManagerInterface::class);
|
|
$entityManager->expects(self::once())->method('persist')->with(self::isInstanceOf(TravelMailingList::class));
|
|
$entityManager->expects(self::never())->method('remove');
|
|
|
|
$mailingList = (new TravelMailingListManager($mailjet, $entityManager, new NullLogger()))->create('LPJMP281126', [
|
|
new TravelMailingRecipient('[email protected]', 'Mia', 'Muster'),
|
|
new TravelMailingRecipient('[email protected]', 'Lea', 'Muster'),
|
|
new TravelMailingRecipient('[email protected]', '', 'Test'),
|
|
], new \DateTimeImmutable('2026-11-28'));
|
|
|
|
self::assertSame(42, $mailingList->getMailjetListId());
|
|
self::assertEquals(new \DateTimeImmutable('2026-12-28'), $mailingList->getDeleteAfter());
|
|
}
|
|
|
|
public function testCreateDiscardsTheListWhenTheContactsCannotBeAdded(): void
|
|
{
|
|
$mailjet = $this->createMock(ApiClient::class);
|
|
$mailjet->method('createContactsList')->willReturn(42);
|
|
$mailjet->method('addContactsToList')->willThrowException(new NewsletterProviderException('boom'));
|
|
$mailjet->expects(self::once())->method('deleteContactsList')->with(42);
|
|
|
|
$entityManager = $this->createMock(EntityManagerInterface::class);
|
|
$entityManager->expects(self::once())->method('remove')->with(self::isInstanceOf(TravelMailingList::class));
|
|
|
|
$this->expectException(NewsletterProviderException::class);
|
|
|
|
(new TravelMailingListManager($mailjet, $entityManager, new NullLogger()))->create('LPJMP281126', [
|
|
new TravelMailingRecipient('[email protected]', 'Mia', 'Muster'),
|
|
], new \DateTimeImmutable('2026-11-28'));
|
|
}
|
|
|
|
public function testDeleteRemovesOnlyContactsOnNoOtherList(): void
|
|
{
|
|
$mailjet = $this->createMock(ApiClient::class);
|
|
$mailjet->method('getListContactIds')->with(42)->willReturn([1, 2]);
|
|
$mailjet->method('getContactListIds')->willReturnMap([
|
|
[1, [42]],
|
|
[2, [42, 10321569]],
|
|
]);
|
|
$mailjet->expects(self::once())->method('deleteContact')->with(1);
|
|
$mailjet->expects(self::once())->method('deleteContactsList')->with(42);
|
|
|
|
$entityManager = $this->createMock(EntityManagerInterface::class);
|
|
$entityManager->expects(self::once())->method('remove');
|
|
|
|
$deleted = (new TravelMailingListManager($mailjet, $entityManager, new NullLogger()))
|
|
->delete(new TravelMailingList('LPJMP281126', 42, new \DateTimeImmutable('2026-12-28')));
|
|
|
|
self::assertSame(1, $deleted);
|
|
}
|
|
|
|
public function testDeleteKeepsTheRowWhenMailjetFails(): void
|
|
{
|
|
$mailjet = $this->createMock(ApiClient::class);
|
|
$mailjet->method('getListContactIds')->willReturn([]);
|
|
$mailjet->expects(self::once())->method('deleteContactsList')->willThrowException(new NewsletterProviderException('boom'));
|
|
|
|
$entityManager = $this->createMock(EntityManagerInterface::class);
|
|
$entityManager->expects(self::never())->method('remove');
|
|
|
|
$this->expectException(NewsletterProviderException::class);
|
|
|
|
(new TravelMailingListManager($mailjet, $entityManager, new NullLogger()))
|
|
->delete(new TravelMailingList('LPJMP281126', 42, new \DateTimeImmutable('2026-12-28')));
|
|
}
|
|
}
|