Skip to content
This repository was archived by the owner on Jan 29, 2020. It is now read-only.

Commit a37be06

Browse files
committed
The MiddlewareListener should bail out if an MVC result is already present in the dispatched event
1 parent a46ae7e commit a37be06

File tree

1 file changed

+64
-0
lines changed

1 file changed

+64
-0
lines changed

test/MiddlewareListenerTest.php

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -509,4 +509,68 @@ public function testValidMiddlewareFiresDispatchableInterfaceEventListeners()
509509

510510
$listener->onDispatch($event);
511511
}
512+
513+
/**
514+
* @dataProvider alreadySetMvcEventResultProvider
515+
*
516+
* @param mixed $alreadySetResult
517+
*/
518+
public function testWillNotDispatchWhenAnMvcEventResultIsAlreadySet($alreadySetResult)
519+
{
520+
$middlewareName = uniqid('middleware', true);
521+
$routeMatch = new RouteMatch(['middleware' => $middlewareName]);
522+
/* @var $application Application|\PHPUnit_Framework_MockObject_MockObject */
523+
$application = $this->createMock(Application::class);
524+
$middleware = $this->getMockBuilder(\stdClass::class)->setMethods(['__invoke'])->getMock();
525+
$serviceManager = new ServiceManager([
526+
'factories' => [
527+
'EventManager' => function () {
528+
return new EventManager();
529+
},
530+
],
531+
'services' => [
532+
$middlewareName => $middleware,
533+
],
534+
]);
535+
536+
$application->expects(self::any())->method('getRequest')->willReturn(new Request());
537+
$application->expects(self::any())->method('getEventManager')->willReturn(new EventManager());
538+
$application->expects(self::any())->method('getServiceManager')->willReturn($serviceManager);
539+
$application->expects(self::any())->method('getResponse')->willReturn(new Response());
540+
$middleware->expects(self::never())->method('__invoke');
541+
542+
$event = new MvcEvent();
543+
544+
$event->setResult($alreadySetResult); // a result is already there - listener should bail out early
545+
$event->setRequest(new Request());
546+
$event->setApplication($application);
547+
$event->setError(Application::ERROR_CONTROLLER_CANNOT_DISPATCH);
548+
$event->setRouteMatch($routeMatch);
549+
550+
$listener = new MiddlewareListener();
551+
552+
$listener->onDispatch($event);
553+
554+
self::assertSame($alreadySetResult, $event->getResult(), 'The event result was not replaced');
555+
}
556+
557+
/**
558+
* @return mixed[][]
559+
*/
560+
public function alreadySetMvcEventResultProvider()
561+
{
562+
return [
563+
[123],
564+
[true],
565+
[false],
566+
[[]],
567+
[new \stdClass()],
568+
[$this],
569+
[$this->createMock(ModelInterface::class)],
570+
[$this->createMock(Response::class)],
571+
[['view model data' => 'as an array']],
572+
[['foo' => new \stdClass()]],
573+
['a response string'],
574+
];
575+
}
512576
}

0 commit comments

Comments
 (0)