ebs/tests/Unit/Controller/Payment/PlatformMembership/DoneActionTest.php
2024-10-08 09:50:58 +02:00

149 lines
4.8 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Tests\Unit\Controller\Payment\PlatformMembership;
use App\Controller\Payment\PlatformMembership\DoneAction;
use App\Entity\PaymentToken;
use App\Entity\PlatformOffer;
use App\Entity\User;
use App\MessageBus\CommandBusInterface;
use Payum\Core\Payum;
use Payum\Core\Request\GetHumanStatus;
use Payum\Core\Security\HttpRequestVerifierInterface;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use Psr\Container\ContainerInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Session\Flash\FlashBag;
use Symfony\Component\HttpFoundation\Session\FlashBagAwareSessionInterface;
use Symfony\Component\HttpKernel\Exception\UnprocessableEntityHttpException;
use Symfony\Component\Uid\Uuid;
use Symfony\Contracts\Translation\TranslatorInterface;
class DoneActionTest extends TestCase
{
/**
* Too complicated, the controller should be refactored.
*/
public function testUnprocessableEntityHttpException(): void
{
$httpRequestVerifierInterface = $this->getMockBuilder(HttpRequestVerifierInterface::class)
->disableOriginalConstructor()
->getMock();
$httpRequestVerifierInterface->method('verify')
->willThrowException(new UnprocessableEntityHttpException());
$payum = $this->getMockBuilder(Payum::class)
->disableOriginalConstructor()
->getMock();
$payum->method('getHttpRequestVerifier')
->willReturn($httpRequestVerifierInterface);
$translator = $this->getMockBuilder(TranslatorInterface::class)
->disableOriginalConstructor()
->getMock();
$doneAction = new DoneAction(
$this->getCommandBus(),
$payum,
$translator,
$this->getLogger(),
);
$this->expectException(\RuntimeException::class);
$this->expectExceptionMessage('Cannot verify Payum token');
$doneAction->__invoke(new Request(), $this->getPlatformOffer(), $this->getUser());
}
/**
* All this to test a line :/.
*/
public function testFlashWarning(): void
{
$httpRequestVerifierInterface = $this->getMockBuilder(HttpRequestVerifierInterface::class)
->disableOriginalConstructor()
->getMock();
$httpRequestVerifierInterface->method('verify')
->willReturn(new PaymentToken());
$payum = $this->getMockBuilder(Payum::class)
->disableOriginalConstructor()
->getMock();
$payum->method('getHttpRequestVerifier')
->willReturn($httpRequestVerifierInterface);
$translator = $this->getMockBuilder(TranslatorInterface::class)
->disableOriginalConstructor()
->getMock();
$comandBus = $this->getCommandBus();
$comandBus->method('dispatch')->willReturn(new GetHumanStatus(new PaymentToken()));
$doneAction = new DoneAction(
$this->getCommandBus(),
$payum,
$translator,
$this->getLogger(),
);
// set session!
$session = $this->getMockBuilder(FlashBagAwareSessionInterface::class)
->disableOriginalConstructor()
->getMock();
$session->method('getFlashBag')->willReturn(new FlashBag());
$requesStack = $this->getMockBuilder(RequestStack::class)
->disableOriginalConstructor()
->getMock();
$requesStack->method('getSession')->willReturn($session);
$container = $this->getMockBuilder(ContainerInterface::class)
->disableOriginalConstructor()
->getMock();
$container->method('get')->willReturn($requesStack);
$doneAction->setContainer($container);
$this->expectException(\Error::class); // or more mock are needed. To clean up later
$doneAction->__invoke(new Request(), $this->getPlatformOffer(), $this->getUser());
}
/**
* @return CommandBusInterface&MockObject
*/
private function getCommandBus(): MockObject
{
return $this->getMockBuilder(CommandBusInterface::class)
->disableOriginalConstructor()
->getMock();
}
private function getLogger(): MockObject&LoggerInterface
{
return $this->getMockBuilder(LoggerInterface::class)
->disableOriginalConstructor()
->getMock();
}
private function getUser(): User
{
return (new User())
->setId($this->getUuid());
}
private function getUuid(): Uuid
{
return Uuid::v6();
}
private function getPlatformOffer(): PlatformOffer
{
$platformOffer = new PlatformOffer();
$platformOffer->setId($this->getUuid());
return $platformOffer;
}
}