```
✨ feat(ReserverController): Ajoute vérification de disponibilité produit. 🛠️ refactor(BackupCommand): Utilise DatabaseDumper et ZipArchiver. ✨ feat(GitSyncLogCommand): Utilise Gemini pour messages plus clairs. ✨ feat(GenerateVideoThumbsCommand): Utilise VideoThumbnailer service. ✨ feat(AppWarmupImagesCommand): Utilise StorageInterface pour warmup. 🔒️ security(nelmio_security): Renforce la sécurité avec des en-têtes. 🔧 chore(caddy): Améliore la configuration de Caddy pour la performance. 🐛 fix(makefile): Corrige les commandes de test. 🧪 chore(.env.test): Supprime la ligne vide à la fin du fichier. 🔧 chore(doctrine): Active native_lazy_objects. 🔧 chore(cache): Ajoute un cache system. ```
This commit is contained in:
150
tests/Command/MailCommandTest.php
Normal file
150
tests/Command/MailCommandTest.php
Normal file
@@ -0,0 +1,150 @@
|
||||
<?php
|
||||
|
||||
namespace App\Tests\Command;
|
||||
|
||||
use App\Command\MailCommand;
|
||||
use App\Entity\Contrats;
|
||||
use App\Entity\Customer;
|
||||
use App\Entity\Devis;
|
||||
use App\Service\Mailer\Mailer;
|
||||
use App\Service\Signature\Client;
|
||||
use Doctrine\Common\Collections\ArrayCollection;
|
||||
use Doctrine\ORM\EntityManagerInterface;
|
||||
use Doctrine\ORM\EntityRepository;
|
||||
use Doctrine\ORM\Query;
|
||||
use Doctrine\ORM\QueryBuilder;
|
||||
use PHPUnit\Framework\MockObject\MockObject;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use Symfony\Component\Console\Application;
|
||||
use Symfony\Component\Console\Tester\CommandTester;
|
||||
use Symfony\Component\HttpKernel\KernelInterface;
|
||||
|
||||
class MailCommandTest extends TestCase
|
||||
{
|
||||
private MockObject&KernelInterface $kernel;
|
||||
private MockObject&Client $client;
|
||||
private MockObject&Mailer $mailer;
|
||||
private MockObject&EntityManagerInterface $entityManager;
|
||||
private MockObject&EntityRepository $devisRepository;
|
||||
private MockObject&EntityRepository $contratsRepository;
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
$this->kernel = $this->createMock(KernelInterface::class);
|
||||
$this->client = $this->createMock(Client::class);
|
||||
$this->mailer = $this->createMock(Mailer::class);
|
||||
$this->entityManager = $this->createMock(EntityManagerInterface::class);
|
||||
$this->devisRepository = $this->createMock(EntityRepository::class);
|
||||
$this->contratsRepository = $this->createMock(EntityRepository::class);
|
||||
|
||||
// Setup repository mocks
|
||||
$this->entityManager->method('getRepository')
|
||||
->willReturnMap([
|
||||
[Devis::class, $this->devisRepository],
|
||||
[Contrats::class, $this->contratsRepository],
|
||||
]);
|
||||
}
|
||||
|
||||
public function testExecuteProcessUnsignedDevisDeletion()
|
||||
{
|
||||
// Setup Devis to be deleted (> 3 days)
|
||||
$devis = $this->createMock(Devis::class);
|
||||
$devis->method('getCreateA')->willReturn(new \DateTimeImmutable('-4 days'));
|
||||
$devis->method('getNum')->willReturn('D-123');
|
||||
// Ensure getDevisLines/Options return iterables
|
||||
$devis->method('getDevisLines')->willReturn(new ArrayCollection([]));
|
||||
$devis->method('getDevisOptions')->willReturn(new ArrayCollection([]));
|
||||
|
||||
$this->devisRepository->expects($this->once())
|
||||
->method('findBy')
|
||||
->with(['state' => 'wait-sign'])
|
||||
->willReturn([$devis]);
|
||||
|
||||
// Expect removal
|
||||
$this->entityManager->expects($this->once())->method('remove')->with($devis);
|
||||
|
||||
// Mock other calls to return empty to isolate this test case
|
||||
$this->contratsRepository->method('findBy')->willReturn([]);
|
||||
|
||||
// Mock QueryBuilder for sendEventReminders and Satisfaction which use createQueryBuilder
|
||||
$qb = $this->createMock(QueryBuilder::class);
|
||||
$query = $this->createMock(Query::class);
|
||||
$qb->method('where')->willReturnSelf();
|
||||
$qb->method('andWhere')->willReturnSelf();
|
||||
$qb->method('setParameter')->willReturnSelf();
|
||||
$qb->method('getQuery')->willReturn($query);
|
||||
$query->method('getResult')->willReturn([]);
|
||||
|
||||
$this->contratsRepository->method('createQueryBuilder')->willReturn($qb);
|
||||
|
||||
// Execute
|
||||
$command = new MailCommand(
|
||||
$this->kernel,
|
||||
$this->client,
|
||||
$this->mailer,
|
||||
$this->entityManager
|
||||
);
|
||||
$application = new Application();
|
||||
$application->add($command);
|
||||
$commandTester = new CommandTester($application->find('app:mail'));
|
||||
|
||||
$commandTester->execute([]);
|
||||
|
||||
$output = $commandTester->getDisplay();
|
||||
$this->assertStringContainsString('Suppression du devis N°D-123', $output);
|
||||
}
|
||||
|
||||
public function testExecuteProcessUnsignedDevisReminder()
|
||||
{
|
||||
// Setup Devis to be reminded (1 day)
|
||||
$customer = $this->createMock(Customer::class);
|
||||
$customer->method('getEmail')->willReturn('test@example.com');
|
||||
$customer->method('getName')->willReturn('John');
|
||||
|
||||
$devis = $this->createMock(Devis::class);
|
||||
$devis->method('getCreateA')->willReturn(new \DateTimeImmutable('-1 day -2 hours'));
|
||||
$devis->method('getNum')->willReturn('D-456');
|
||||
$devis->method('getCustomer')->willReturn($customer);
|
||||
$devis->method('getSignatureId')->willReturn('sign_123');
|
||||
|
||||
$this->devisRepository->expects($this->once())
|
||||
->method('findBy')
|
||||
->with(['state' => 'wait-sign'])
|
||||
->willReturn([$devis]);
|
||||
|
||||
// Expect Mailer call
|
||||
$this->mailer->expects($this->once())
|
||||
->method('send')
|
||||
->with('test@example.com', 'John', $this->stringContains('Devis N°D-456'));
|
||||
|
||||
// Mock other calls to return empty
|
||||
$this->contratsRepository->method('findBy')->willReturn([]);
|
||||
|
||||
// Mock QueryBuilder
|
||||
$qb = $this->createMock(QueryBuilder::class);
|
||||
$query = $this->createMock(Query::class);
|
||||
$qb->method('where')->willReturnSelf();
|
||||
$qb->method('andWhere')->willReturnSelf();
|
||||
$qb->method('setParameter')->willReturnSelf();
|
||||
$qb->method('getQuery')->willReturn($query);
|
||||
$query->method('getResult')->willReturn([]);
|
||||
|
||||
$this->contratsRepository->method('createQueryBuilder')->willReturn($qb);
|
||||
|
||||
// Execute
|
||||
$command = new MailCommand(
|
||||
$this->kernel,
|
||||
$this->client,
|
||||
$this->mailer,
|
||||
$this->entityManager
|
||||
);
|
||||
$application = new Application();
|
||||
$application->add($command);
|
||||
$commandTester = new CommandTester($application->find('app:mail'));
|
||||
|
||||
$commandTester->execute([]);
|
||||
|
||||
$output = $commandTester->getDisplay();
|
||||
$this->assertStringContainsString('Relance envoyée pour le devis : D-456', $output);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user