feature #28985 [Messenger] Move MiddlewareTestCase in Test ns (ogizanagi)

This PR was merged into the 4.2-dev branch.

Discussion
----------

[Messenger] Move MiddlewareTestCase in Test ns

| Q             | A
| ------------- | ---
| Branch?       | master <!-- see below -->
| Bug fix?      | no
| New feature?  | yes <!-- don't forget to update src/**/CHANGELOG.md files -->
| BC breaks?    | no     <!-- see https://symfony.com/bc -->
| Deprecations? | no <!-- don't forget to update UPGRADE-*.md and src/**/CHANGELOG.md files -->
| Tests pass?   | yes (AppVeyor failure unrelated)    <!-- please add some, will be required by reviewers -->
| Fixed tickets | N/A   <!-- #-prefixed issue number(s), if any -->
| License       | MIT
| Doc PR        | N/A

Just a quick suggestion after #28943 being merged. Wouldn't it make sense to move this in `Test` namespace to be used by anyone wanting to unit test their middleware?

Commits
-------

215c895a55 [Messenger] Move MiddlewareTestCase in Test ns
This commit is contained in:
Fabien Potencier 2018-10-27 20:08:52 +02:00
commit b6758e9614
10 changed files with 47 additions and 77 deletions

View File

@ -1,15 +0,0 @@
<?php
namespace Symfony\Bridge\Doctrine\Tests\Fixtures\Messenger;
use Symfony\Component\Messenger\Envelope;
use Symfony\Component\Messenger\Middleware\MiddlewareInterface;
use Symfony\Component\Messenger\Middleware\StackInterface;
class DummyMiddleware implements MiddlewareInterface
{
public function handle(Envelope $envelope, StackInterface $stack): Envelope
{
return $envelope;
}
}

View File

@ -1,15 +0,0 @@
<?php
namespace Symfony\Bridge\Doctrine\Tests\Fixtures\Messenger;
use Symfony\Component\Messenger\Envelope;
use Symfony\Component\Messenger\Middleware\MiddlewareInterface;
use Symfony\Component\Messenger\Middleware\StackInterface;
class ThrowingMiddleware implements MiddlewareInterface
{
public function handle(Envelope $envelope, StackInterface $stack): Envelope
{
throw new \RuntimeException('Thrown from middleware.');
}
}

View File

@ -14,19 +14,15 @@ namespace Symfony\Bridge\Doctrine\Tests\Messenger;
use Doctrine\Common\Persistence\ManagerRegistry;
use Doctrine\DBAL\Connection;
use Doctrine\ORM\EntityManagerInterface;
use PHPUnit\Framework\TestCase;
use Symfony\Bridge\Doctrine\Messenger\DoctrineTransactionMiddleware;
use Symfony\Bridge\Doctrine\Tests\Fixtures\Messenger\DummyMiddleware;
use Symfony\Bridge\Doctrine\Tests\Fixtures\Messenger\ThrowingMiddleware;
use Symfony\Component\Messenger\Envelope;
use Symfony\Component\Messenger\Middleware\StackInterface;
use Symfony\Component\Messenger\Test\Middleware\MiddlewareTestCase;
class DoctrineTransactionMiddlewareTest extends TestCase
class DoctrineTransactionMiddlewareTest extends MiddlewareTestCase
{
private $connection;
private $entityManager;
private $middleware;
private $stack;
public function setUp()
{
@ -39,8 +35,6 @@ class DoctrineTransactionMiddlewareTest extends TestCase
$managerRegistry->method('getManager')->willReturn($this->entityManager);
$this->middleware = new DoctrineTransactionMiddleware($managerRegistry, null);
$this->stack = $this->createMock(StackInterface::class);
}
public function testMiddlewareWrapsInTransactionAndFlushes()
@ -54,15 +48,14 @@ class DoctrineTransactionMiddlewareTest extends TestCase
$this->entityManager->expects($this->once())
->method('flush')
;
$this->stack
->expects($this->once())
->method('next')
->willReturn(new DummyMiddleware())
;
$this->middleware->handle(new Envelope(new \stdClass()), $this->stack);
$this->middleware->handle(new Envelope(new \stdClass()), $this->getStackMock());
}
/**
* @expectedException \RuntimeException
* @expectedExceptionMessage Thrown from next middleware.
*/
public function testTransactionIsRolledBackOnException()
{
$this->connection->expects($this->once())
@ -71,14 +64,7 @@ class DoctrineTransactionMiddlewareTest extends TestCase
$this->connection->expects($this->once())
->method('rollBack')
;
$this->stack
->expects($this->once())
->method('next')
->willReturn(new ThrowingMiddleware())
;
$this->expectException(\RuntimeException::class);
$this->expectExceptionMessage('Thrown from middleware.');
$this->middleware->handle(new Envelope(new \stdClass()), $this->stack);
$this->middleware->handle(new Envelope(new \stdClass()), $this->getThrowingStackMock());
}
}

View File

@ -9,12 +9,16 @@
* file that was distributed with this source code.
*/
namespace Symfony\Component\Messenger\Tests\Middleware;
namespace Symfony\Component\Messenger\Test\Middleware;
use PHPUnit\Framework\TestCase;
use Symfony\Component\Messenger\Envelope;
use Symfony\Component\Messenger\Middleware\MiddlewareInterface;
use Symfony\Component\Messenger\Middleware\StackInterface;
/**
* @author Nicolas Grekas <p@tchwork.com>
*/
abstract class MiddlewareTestCase extends TestCase
{
protected function getStackMock(bool $nextIsCalled = true)
@ -23,9 +27,9 @@ abstract class MiddlewareTestCase extends TestCase
$nextMiddleware
->expects($nextIsCalled ? $this->once() : $this->never())
->method('handle')
->will($this->returnCallback(function ($envelope, StackInterface $stack) {
->willReturnCallback(function (Envelope $envelope, StackInterface $stack): Envelope {
return $envelope;
}))
})
;
$stack = $this->createMock(StackInterface::class);
@ -37,4 +41,23 @@ abstract class MiddlewareTestCase extends TestCase
return $stack;
}
protected function getThrowingStackMock(\Throwable $throwable = null)
{
$nextMiddleware = $this->getMockBuilder(MiddlewareInterface::class)->getMock();
$nextMiddleware
->expects($this->once())
->method('handle')
->willThrowException($throwable ?? new \RuntimeException('Thrown from next middleware.'))
;
$stack = $this->createMock(StackInterface::class);
$stack
->expects($this->once())
->method('next')
->willReturn($nextMiddleware)
;
return $stack;
}
}

View File

@ -14,7 +14,7 @@ namespace Symfony\Component\Messenger\Tests\Middleware;
use Symfony\Component\Messenger\Envelope;
use Symfony\Component\Messenger\Middleware\ActivationMiddleware;
use Symfony\Component\Messenger\Middleware\MiddlewareInterface;
use Symfony\Component\Messenger\Middleware\StackInterface;
use Symfony\Component\Messenger\Test\Middleware\MiddlewareTestCase;
use Symfony\Component\Messenger\Tests\Fixtures\DummyMessage;
/**
@ -27,8 +27,7 @@ class ActivationMiddlewareTest extends MiddlewareTestCase
$message = new DummyMessage('Hello');
$envelope = new Envelope($message);
$stack = $this->createMock(StackInterface::class);
$stack->expects($this->never())->method('next');
$stack = $this->getStackMock(false);
$middleware = $this->createMock(MiddlewareInterface::class);
$middleware->expects($this->once())->method('handle')->with($envelope, $stack)->willReturn($envelope);
@ -46,8 +45,7 @@ class ActivationMiddlewareTest extends MiddlewareTestCase
$activated = $this->createPartialMock(\stdClass::class, array('__invoke'));
$activated->expects($this->once())->method('__invoke')->with($envelope)->willReturn(true);
$stack = $this->createMock(StackInterface::class);
$stack->expects($this->never())->method('next');
$stack = $this->getStackMock(false);
$middleware = $this->createMock(MiddlewareInterface::class);
$middleware->expects($this->once())->method('handle')->with($envelope, $stack)->willReturn($envelope);

View File

@ -15,6 +15,7 @@ use Symfony\Component\Messenger\Envelope;
use Symfony\Component\Messenger\Handler\Locator\HandlerLocator;
use Symfony\Component\Messenger\Middleware\HandleMessageMiddleware;
use Symfony\Component\Messenger\Middleware\StackMiddleware;
use Symfony\Component\Messenger\Test\Middleware\MiddlewareTestCase;
use Symfony\Component\Messenger\Tests\Fixtures\DummyMessage;
class HandleMessageMiddlewareTest extends MiddlewareTestCase

View File

@ -14,7 +14,7 @@ namespace Symfony\Component\Messenger\Tests\Middleware;
use Psr\Log\LoggerInterface;
use Symfony\Component\Messenger\Envelope;
use Symfony\Component\Messenger\Middleware\LoggingMiddleware;
use Symfony\Component\Messenger\Middleware\StackInterface;
use Symfony\Component\Messenger\Test\Middleware\MiddlewareTestCase;
use Symfony\Component\Messenger\Tests\Fixtures\DummyMessage;
class LoggingMiddlewareTest extends MiddlewareTestCase
@ -34,7 +34,8 @@ class LoggingMiddlewareTest extends MiddlewareTestCase
}
/**
* @expectedException \Exception
* @expectedException \RuntimeException
* @expectedExceptionMessage Thrown from next middleware.
*/
public function testWarningLogOnException()
{
@ -50,12 +51,7 @@ class LoggingMiddlewareTest extends MiddlewareTestCase
->expects($this->once())
->method('warning')
;
$stack = $this->createMock(StackInterface::class);
$stack
->expects($this->once())
->method('next')
->willThrowException(new \Exception())
;
$stack = $this->getThrowingStackMock();
(new LoggingMiddleware($logger))->handle($envelope, $stack);
}

View File

@ -12,9 +12,9 @@
namespace Symfony\Component\Messenger\Tests\Middleware;
use Symfony\Component\Messenger\Envelope;
use Symfony\Component\Messenger\Middleware\MiddlewareInterface;
use Symfony\Component\Messenger\Middleware\SendMessageMiddleware;
use Symfony\Component\Messenger\Stamp\ReceivedStamp;
use Symfony\Component\Messenger\Test\Middleware\MiddlewareTestCase;
use Symfony\Component\Messenger\Tests\Fixtures\ChildDummyMessage;
use Symfony\Component\Messenger\Tests\Fixtures\DummyMessage;
use Symfony\Component\Messenger\Tests\Fixtures\DummyMessageInterface;
@ -114,7 +114,6 @@ class SendMessageMiddlewareTest extends MiddlewareTestCase
$envelope = new Envelope($message);
$middleware = new SendMessageMiddleware(new InMemorySenderLocator(null));
$handler = $this->getMockBuilder(MiddlewareInterface::class)->getMock();
$middleware->handle($envelope, $this->getStackMock());
}

View File

@ -15,6 +15,7 @@ use Symfony\Component\Messenger\Envelope;
use Symfony\Component\Messenger\Middleware\MiddlewareInterface;
use Symfony\Component\Messenger\Middleware\StackInterface;
use Symfony\Component\Messenger\Middleware\TraceableMiddleware;
use Symfony\Component\Messenger\Test\Middleware\MiddlewareTestCase;
use Symfony\Component\Messenger\Tests\Fixtures\DummyMessage;
use Symfony\Component\Stopwatch\Stopwatch;
@ -55,7 +56,7 @@ class TraceableMiddlewareTest extends MiddlewareTestCase
/**
* @expectedException \RuntimeException
* @expectedExceptionMessage Foo exception from next callable
* @expectedExceptionMessage Thrown from next middleware.
*/
public function testHandleWithException()
{
@ -71,12 +72,7 @@ class TraceableMiddlewareTest extends MiddlewareTestCase
}))
;
$stack = $this->createMock(StackInterface::class);
$stack
->expects($this->once())
->method('next')
->willThrowException(new \RuntimeException('Foo exception from next callable'))
;
$stack = $this->getThrowingStackMock();
$stopwatch = $this->createMock(Stopwatch::class);
$stopwatch->expects($this->once())->method('isStarted')->willReturn(true);

View File

@ -14,6 +14,7 @@ namespace Symfony\Component\Messenger\Tests\Middleware;
use Symfony\Component\Messenger\Envelope;
use Symfony\Component\Messenger\Middleware\ValidationMiddleware;
use Symfony\Component\Messenger\Stamp\ValidationStamp;
use Symfony\Component\Messenger\Test\Middleware\MiddlewareTestCase;
use Symfony\Component\Messenger\Tests\Fixtures\DummyMessage;
use Symfony\Component\Validator\ConstraintViolationListInterface;
use Symfony\Component\Validator\Validator\ValidatorInterface;