You are here

StackedHttpKernelTest.php in Zircon Profile 8

Same filename and directory in other branches
  1. 8.0 vendor/stack/builder/tests/unit/Stack/StackedHttpKernelTest.php

Namespace

Stack

File

vendor/stack/builder/tests/unit/Stack/StackedHttpKernelTest.php
View source
<?php

namespace Stack;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\TerminableInterface;
class StackedHttpKernelTest extends \PHPUnit_Framework_TestCase {

  /** @test */
  public function handleShouldDelegateToApp() {
    $app = $this
      ->getHttpKernelMock(new Response('ok'));
    $kernel = new StackedHttpKernel($app, array(
      $app,
    ));
    $request = Request::create('/');
    $response = $kernel
      ->handle($request);
    $this
      ->assertSame('ok', $response
      ->getContent());
  }

  /** @test */
  public function handleShouldStillDelegateToAppWithMiddlewares() {
    $app = $this
      ->getHttpKernelMock(new Response('ok'));
    $bar = $this
      ->getHttpKernelMock(new Response('bar'));
    $foo = $this
      ->getHttpKernelMock(new Response('foo'));
    $kernel = new StackedHttpKernel($app, array(
      $foo,
      $bar,
      $app,
    ));
    $request = Request::create('/');
    $response = $kernel
      ->handle($request);
    $this
      ->assertSame('ok', $response
      ->getContent());
  }

  /** @test */
  public function terminateShouldDelegateToMiddlewares() {
    $first = new TerminableKernelSpy();
    $second = new TerminableKernelSpy($first);
    $third = new KernelSpy($second);
    $fourth = new TerminableKernelSpy($third);
    $fifth = new TerminableKernelSpy($fourth);
    $kernel = new StackedHttpKernel($fifth, $middlewares = array(
      $fifth,
      $fourth,
      $third,
      $second,
      $first,
    ));
    $request = Request::create('/');
    $response = $kernel
      ->handle($request);
    $kernel
      ->terminate($request, $response);
    $this
      ->assertTerminablesCalledOnce($middlewares);
  }
  private function assertTerminablesCalledOnce(array $middlewares) {
    foreach ($middlewares as $kernel) {
      if ($kernel instanceof TerminableInterface) {
        $this
          ->assertEquals(1, $kernel
          ->terminateCallCount(), "Terminate was called {$kernel->terminateCallCount()} times");
      }
    }
  }
  private function getHttpKernelMock(Response $response) {
    $app = $this
      ->getMock('Symfony\\Component\\HttpKernel\\HttpKernelInterface');
    $app
      ->expects($this
      ->any())
      ->method('handle')
      ->with($this
      ->isInstanceOf('Symfony\\Component\\HttpFoundation\\Request'))
      ->will($this
      ->returnValue($response));
    return $app;
  }
  private function getTerminableMock(Response $response = null) {
    $app = $this
      ->getMock('Stack\\TerminableHttpKernel');
    if ($response) {
      $app
        ->expects($this
        ->any())
        ->method('handle')
        ->with($this
        ->isInstanceOf('Symfony\\Component\\HttpFoundation\\Request'))
        ->will($this
        ->returnValue($response));
    }
    $app
      ->expects($this
      ->once())
      ->method('terminate')
      ->with($this
      ->isInstanceOf('Symfony\\Component\\HttpFoundation\\Request'), $this
      ->isInstanceOf('Symfony\\Component\\HttpFoundation\\Response'));
    return $app;
  }
  private function getDelegatingTerminableMock(TerminableInterface $next) {
    $app = $this
      ->getMock('Stack\\TerminableHttpKernel');
    $app
      ->expects($this
      ->once())
      ->method('terminate')
      ->with($this
      ->isInstanceOf('Symfony\\Component\\HttpFoundation\\Request'), $this
      ->isInstanceOf('Symfony\\Component\\HttpFoundation\\Response'))
      ->will($this
      ->returnCallback(function ($request, $response) use ($next) {
      $next
        ->terminate($request, $response);
    }));
    return $app;
  }

}
class KernelSpy implements HttpKernelInterface {
  private $handleCallCount = 0;
  public function __construct(HttpKernelInterface $kernel = null) {
    $this->kernel = $kernel;
  }
  public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true) {
    $this->handleCallCount++;
    if ($this->kernel) {
      return $this->kernel
        ->handle($request, $type, $catch);
    }
    return new Response('OK');
  }
  public function handleCallCount() {
    return $this->handleCallCount;
  }

}
class TerminableKernelSpy extends KernelSpy implements TerminableInterface {
  private $terminateCallCount = 0;
  public function terminate(Request $request, Response $response) {
    $this->terminateCallCount++;
    if ($this->kernel && $this->kernel instanceof TerminableInterface) {
      return $this->kernel
        ->terminate($request, $response);
    }
  }
  public function terminateCallCount() {
    return $this->terminateCallCount;
  }

}