diff --git a/src/ControllerRepository.php b/src/ControllerRepository.php index faafff63..2fc2e26b 100644 --- a/src/ControllerRepository.php +++ b/src/ControllerRepository.php @@ -1,7 +1,7 @@ router = $router; + $this->httpHelper = $httpHelper; + + //if script fails prematurely, mark it as fail from advance + $this->httpHelper->setResponseCode(500); + foreach ($controllerRepository->getControllers() as $controller) $controller->registerRoutes($router); } @@ -23,7 +26,9 @@ final class Dispatcher try { $code = 200; - $json = $this->router->handle($_SERVER['REQUEST_METHOD'], $_SERVER['REQUEST_URI']); + $json = (array) $this->router->handle( + $this->httpHelper->getRequestMethod(), + $this->httpHelper->getRequestUri()); } catch (\Exception $e) { @@ -36,8 +41,10 @@ final class Dispatcher $end = microtime(true); $json['__time'] = $end - $start; - http_response_code($code); - header('Content-Type: application/json'); - echo json_encode($json); + $this->httpHelper->setResponseCode($code); + $this->httpHelper->setHeader('Content-Type', 'application/json'); + $this->httpHelper->outputJSON($json); + + return $json; } } diff --git a/src/Helpers/HttpHelper.php b/src/Helpers/HttpHelper.php new file mode 100644 index 00000000..b8af7809 --- /dev/null +++ b/src/Helpers/HttpHelper.php @@ -0,0 +1,35 @@ +output(json_encode((array) $data)); + } + + public function getRequestMethod() + { + return $_SERVER['REQUEST_METHOD']; + } + + public function getRequestUri() + { + return $_SERVER['REQUEST_URI']; + } +} diff --git a/src/Router.php b/src/Router.php index d1223a18..fbc2fe49 100644 --- a/src/Router.php +++ b/src/Router.php @@ -1,7 +1,7 @@ 'toy']; + + $httpHelperMock = $this->getHttpHelperMock(); + $httpHelperMock + ->expects($this->exactly(2)) + ->method('setResponseCode') + ->withConsecutive([$this->equalTo(500)], [$this->equalTo(200)]); + + $routerMock = $this->getRouterMock(); + $routerMock->expects($this->once())->method('handle')->willReturn($expected); + + $controllerRepositoryMock = $this->getControllerRepositoryMock(); + $controllerRepositoryMock->method('getControllers')->willReturn([]); + + $dispatcher = new \Szurubooru\Dispatcher($routerMock, $httpHelperMock, $controllerRepositoryMock); + $actual = $dispatcher->run(); + + unset($actual['__time']); + $this->assertEquals($expected, $actual); + } + + public function testDispatchingObjects() + { + $classData = new \StdClass; + $classData->bunny = 5; + $expected = ['bunny' => 5]; + + $httpHelperMock = $this->getHttpHelperMock(); + + $routerMock = $this->getRouterMock(); + $routerMock->expects($this->once())->method('handle')->willReturn($classData); + + $controllerRepositoryMock = $this->getControllerRepositoryMock(); + $controllerRepositoryMock->method('getControllers')->willReturn([]); + + $dispatcher = new \Szurubooru\Dispatcher($routerMock, $httpHelperMock, $controllerRepositoryMock); + $actual = $dispatcher->run(); + + unset($actual['__time']); + $this->assertEquals($expected, $actual); + } + + private function getHttpHelperMock() + { + return $this->getMockBuilder(\Szurubooru\Helpers\HttpHelper::class)->disableOriginalConstructor()->getMock(); + } + + private function getRouterMock() + { + return $this->getMockBuilder(\Szurubooru\Router::class)->disableOriginalConstructor()->getMock(); + } + + private function getControllerRepositoryMock() + { + return $this->getMockBuilder(\Szurubooru\ControllerRepository::class)->disableOriginalConstructor()->getMock(); + } +}