114 lines
4.3 KiB
PHP
114 lines
4.3 KiB
PHP
|
<?php
|
||
|
|
||
|
namespace RetailCrm\ServiceBundle\Tests\Messenger\Middleware;
|
||
|
|
||
|
use PHPUnit\Framework\TestCase;
|
||
|
use RetailCrm\ServiceBundle\Messenger\Middleware\LockableMessageMiddleware;
|
||
|
use RetailCrm\ServiceBundle\Tests\DataFixtures\TestMessage;
|
||
|
use Symfony\Component\Lock\Exception\LockConflictedException;
|
||
|
use Symfony\Component\Lock\Key;
|
||
|
use Symfony\Component\Lock\Lock;
|
||
|
use Symfony\Component\Lock\LockFactory;
|
||
|
use Symfony\Component\Lock\PersistingStoreInterface;
|
||
|
use Symfony\Component\Messenger\Envelope;
|
||
|
use Symfony\Component\Messenger\Middleware\MiddlewareInterface;
|
||
|
use Symfony\Component\Messenger\Middleware\StackInterface;
|
||
|
use Symfony\Component\Messenger\Stamp\ReceivedStamp;
|
||
|
|
||
|
/**
|
||
|
* Class LockableMessageMiddlewareTest
|
||
|
*
|
||
|
* @package RetailCrm\ServiceBundle\Tests\Messenger\Middleware
|
||
|
*/
|
||
|
class LockableMessageMiddlewareTest extends TestCase
|
||
|
{
|
||
|
/**
|
||
|
* @var LockFactory
|
||
|
*/
|
||
|
private $lockFactory;
|
||
|
|
||
|
protected function setUp(): void
|
||
|
{
|
||
|
$this->lockFactory = $this->createMock(LockFactory::class);
|
||
|
}
|
||
|
|
||
|
public function testHandle(): void
|
||
|
{
|
||
|
$store = $this->createMock(PersistingStoreInterface::class);
|
||
|
$key = new Key(uniqid());
|
||
|
$lock = new Lock($key, $store);
|
||
|
$this->lockFactory->expects(static::once())->method('createLock')->willReturn($lock);
|
||
|
$envelope = new Envelope(new TestMessage(), [new ReceivedStamp('test')]);
|
||
|
|
||
|
$next = $this->createMock(MiddlewareInterface::class);
|
||
|
$next->method('handle')->willReturn($envelope);
|
||
|
$stack = $this->createMock(StackInterface::class);
|
||
|
$stack->method('next')->willReturn($next);
|
||
|
|
||
|
$middleware = new LockableMessageMiddleware($this->lockFactory);
|
||
|
$result = $middleware->handle($envelope, $stack);
|
||
|
|
||
|
static::assertInstanceOf(Envelope::class, $result);
|
||
|
}
|
||
|
|
||
|
public function testLockHandle(): void
|
||
|
{
|
||
|
$store = $this->createMock(PersistingStoreInterface::class);
|
||
|
$store->method('save')->willThrowException(new LockConflictedException);
|
||
|
$key = new Key(uniqid());
|
||
|
$lock = new Lock($key, $store);
|
||
|
$this->lockFactory->expects(static::once())->method('createLock')->willReturn($lock);
|
||
|
$envelope = new Envelope(new TestMessage(), [new ReceivedStamp('test')]);
|
||
|
|
||
|
$next = $this->createMock(MiddlewareInterface::class);
|
||
|
$next->method('handle')->willReturn($envelope);
|
||
|
$stack = $this->createMock(StackInterface::class);
|
||
|
$stack->method('next')->willReturn($next);
|
||
|
|
||
|
$middleware = new LockableMessageMiddleware($this->lockFactory);
|
||
|
$result = $middleware->handle($envelope, $stack);
|
||
|
|
||
|
static::assertInstanceOf(Envelope::class, $result);
|
||
|
}
|
||
|
|
||
|
public function testNonLockableHandle(): void
|
||
|
{
|
||
|
$store = $this->createMock(PersistingStoreInterface::class);
|
||
|
$store->method('save')->willThrowException(new LockConflictedException);
|
||
|
$key = new Key(uniqid());
|
||
|
$lock = new Lock($key, $store);
|
||
|
$this->lockFactory->expects(static::never())->method('createLock')->willReturn($lock);
|
||
|
$envelope = new Envelope(new \stdClass(), [new ReceivedStamp('test')]);
|
||
|
|
||
|
$next = $this->createMock(MiddlewareInterface::class);
|
||
|
$next->method('handle')->willReturn($envelope);
|
||
|
$stack = $this->createMock(StackInterface::class);
|
||
|
$stack->method('next')->willReturn($next);
|
||
|
|
||
|
$middleware = new LockableMessageMiddleware($this->lockFactory);
|
||
|
$result = $middleware->handle($envelope, $stack);
|
||
|
|
||
|
static::assertInstanceOf(Envelope::class, $result);
|
||
|
}
|
||
|
|
||
|
public function testNonReceivedHandle(): void
|
||
|
{
|
||
|
$store = $this->createMock(PersistingStoreInterface::class);
|
||
|
$store->method('save')->willThrowException(new LockConflictedException);
|
||
|
$key = new Key(uniqid());
|
||
|
$lock = new Lock($key, $store);
|
||
|
$this->lockFactory->expects(static::never())->method('createLock')->willReturn($lock);
|
||
|
$envelope = new Envelope(new TestMessage());
|
||
|
|
||
|
$next = $this->createMock(MiddlewareInterface::class);
|
||
|
$next->method('handle')->willReturn($envelope);
|
||
|
$stack = $this->createMock(StackInterface::class);
|
||
|
$stack->method('next')->willReturn($next);
|
||
|
|
||
|
$middleware = new LockableMessageMiddleware($this->lockFactory);
|
||
|
$result = $middleware->handle($envelope, $stack);
|
||
|
|
||
|
static::assertInstanceOf(Envelope::class, $result);
|
||
|
}
|
||
|
}
|