From 653a6725d2c417d5eb100947d24e96586f7025bb Mon Sep 17 00:00:00 2001 From: Arnold Daniels Date: Mon, 23 Jan 2017 12:35:30 +0100 Subject: [PATCH 1/3] Added RequestConvertor and ResponseConvertor Improved testability and code quality Converting a browserkit request to a psr-7 request has been moved from the Connector to a seperate class Same for response --- src/Connector.php | 144 +++++++----------- src/RequestConvertor.php | 149 +++++++++++++++++++ src/ResponseConvertor.php | 42 ++++++ tests/unit/ConnectorTest.php | 167 +++++++++++++-------- tests/unit/RequestConvertorTest.php | 215 +++++++++++++++++++++++++++ tests/unit/ResponseConvertorTest.php | 48 ++++++ 6 files changed, 614 insertions(+), 151 deletions(-) create mode 100644 src/RequestConvertor.php create mode 100644 src/ResponseConvertor.php create mode 100644 tests/unit/RequestConvertorTest.php create mode 100644 tests/unit/ResponseConvertorTest.php diff --git a/src/Connector.php b/src/Connector.php index 608d9e0..491910e 100644 --- a/src/Connector.php +++ b/src/Connector.php @@ -4,15 +4,12 @@ use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ResponseInterface; -use Psr\Http\Message\UploadedFileInterface; -use Psr\Http\Message\UriInterface; use Jasny\HttpMessage\Response; use Jasny\HttpMessage\ServerRequest; -use Jasny\HttpMessage\UploadedFile; -use Jasny\HttpMessage\Uri; -use Jasny\HttpMessage\Stream; use Jasny\HttpMessage\OutputBufferStream; use Jasny\Router; +use Jasny\Codeception\RequestConvertor; +use Jasny\Codeception\ResponseConvertor; use Symfony\Component\BrowserKit\Client; use Symfony\Component\BrowserKit\Request as BrowserKitRequest; use Symfony\Component\BrowserKit\Response as BrowserKitResponse; @@ -39,6 +36,16 @@ class Connector extends Client */ protected $baseResponse; + /** + * @var RequestConvertor + */ + protected $requestConvertor; + + /** + * @var ResponseConvertor + */ + protected $responseConvertor; + /** * Set the router @@ -118,16 +125,22 @@ public function getBaseResponse() return $this->baseResponse; } + /** - * Reset the request and response. - * This is only required when the request and/or response are bound to the global environment. + * Reset the request */ - public function reset() + protected function resetInput() { if (isset($this->baseRequest) && $this->baseRequest instanceof ServerRequest && $this->baseRequest->isStale()) { $this->baseRequest = $this->baseRequest->revive(); } + } + /** + * Reset the response + */ + protected function resetOutput() + { if (isset($this->baseResponse) && $this->baseResponse instanceof Response && $this->baseResponse->isStale()) { $this->baseResponse = $this->baseResponse->revive(); } @@ -137,120 +150,65 @@ public function reset() $this->baseResponse = $this->baseResponse->withBody(clone $this->baseResponse->getBody()); } } - - + /** - * Build a full URI from a request - * - * @param BrowserKitRequest $request - * @return array [Uri, queryParams] + * Reset the request and response. + * This is only required when the request and/or response are bound to the global environment. */ - protected function buildFullUri(BrowserKitRequest $request) + public function reset() { - $uri = new Uri($request->getUri()); - - $queryParams = []; - parse_str($uri->getQuery(), $queryParams); - - if ($request->getMethod() === 'GET') { - $queryParams = array_merge($queryParams, $request->getParameters()); - $uri = $uri->withQuery(http_build_query($queryParams)); - } - - return [$uri, $queryParams]; + $this->resetInput(); + $this->resetOutput(); } + /** - * Get additional server params from request. - * @internal It would be nicer if this was solved by Jasny Http Message + * Set the request convertor * - * @param BrowserKitRequest $request - * @param UriInterface $uri - * @param array $queryParams - * @return array + * @param RequestConvertor $convertor */ - protected function determineServerParams(BrowserKitRequest $request, UriInterface $uri, array $queryParams) + public function setRequestConvertor(RequestConvertor $convertor) { - return [ - 'REQUEST_METHOD' => $request->getMethod(), - 'QUERY_STRING' => http_build_query($queryParams), - 'REQUEST_URI' => (string)($uri->withScheme('')->withHost('')->withPort('')->withUserInfo('')) - ]; + $this->requestConvertor = $convertor; } /** - * Convert a codeception request to a Jasny PSR-7 server request + * Get the request convertor * - * @param BrowserKitRequest $request - * @return ServerRequest + * @return RequestConvertor */ - protected function convertRequest(BrowserKitRequest $request) + public function getRequestConvertor() { - list($uri, $queryParams) = $this->buildFullUri($request); - - $stream = fopen('php://temp', 'r+'); - fwrite($stream, $request->getContent()); - fseek($stream, 0); - - $baseRequest = $this->getBaseRequest(); - - if ($baseRequest instanceof ServerRequest) { - $serverParams = $this->determineServerParams($request, $uri, (array)$queryParams); - $baseRequest = $baseRequest->withServerParams($request->getServer() + $serverParams); + if (!isset($this->requestConvertor)) { + $this->requestConvertor = new RequestConvertor(); } - $psrRequest = $baseRequest - ->withBody(new Stream($stream)) - ->withMethod($request->getMethod()) - ->withRequestTarget((string)($uri->withScheme('')->withHost('')->withPort('')->withUserInfo(''))) - ->withCookieParams($request->getCookies()) - ->withUri($uri) - ->withQueryParams((array)$queryParams) - ->withUploadedFiles($this->convertUploadedFiles($request->getFiles())); - - if ($request->getMethod() !== 'GET' && !empty($request->getParameters())) { - $psrRequest = $psrRequest->withParsedBody($request->getParameters()); - } - - return $psrRequest; + return $this->requestConvertor; } + /** - * Convert a Jasny PSR-7 response to a codeception response + * Set the response convertor * - * @param ResponseInterface $psrResponse - * @return BrowserKitResponse + * @param ResponseConvertor $convertor */ - protected function convertResponse(ResponseInterface $psrResponse) + public function setResponseConvertor(ResponseConvertor $convertor) { - return new BrowserKitResponse( - (string)$psrResponse->getBody(), - $psrResponse->getStatusCode() ?: 200, - $psrResponse->getHeaders() - ); + $this->responseConvertor = $convertor; } /** - * Convert a list of uploaded files to a Jasny PSR-7 uploaded files + * Get the response convertor * - * @param array $files - * @return UploadedFile[]|array + * @return ResponseConvertor */ - protected function convertUploadedFiles(array $files) + public function getResponseConvertor() { - $fileObjects = []; - - foreach ($files as $fieldName => $file) { - if ($file instanceof UploadedFileInterface) { - $fileObjects[$fieldName] = $file; - } elseif (!isset($file['tmp_name']) && !isset($file['name'])) { - $fileObjects[$fieldName] = $this->convertUploadedFiles($file); - } else { - $fileObjects[$fieldName] = new UploadedFile($file); - } + if (!isset($this->responseConvertor)) { + $this->responseConvertor = new ResponseConvertor(); } - return $fileObjects; + return $this->responseConvertor; } @@ -268,11 +226,11 @@ protected function doRequest($request) $this->reset(); // Reset before each HTTP request - $psrRequest = $this->convertRequest($request); + $psrRequest = $this->getRequestConvertor()->convert($request, $this->getBaseRequest()); $router = $this->getRouter(); $psrResponse = $router->handle($psrRequest, $this->getBaseResponse()); - return $this->convertResponse($psrResponse); + return $this->getResponseConvertor()->convert($psrResponse); } } diff --git a/src/RequestConvertor.php b/src/RequestConvertor.php new file mode 100644 index 0000000..350f11f --- /dev/null +++ b/src/RequestConvertor.php @@ -0,0 +1,149 @@ +getContent()); + fseek($stream, 0); + + return $stream; + } + + /** + * Build a full URI from a request + * + * @param BrowserKitRequest $request + * @return array [Uri, queryParams] + */ + protected function buildFullUri(BrowserKitRequest $request) + { + $uri = new Uri($request->getUri()); + + $queryParams = []; + parse_str($uri->getQuery(), $queryParams); + + if ($request->getMethod() === 'GET') { + $queryParams = array_merge($queryParams, $request->getParameters()); + $uri = $uri->withQuery(http_build_query($queryParams)); + } + + return [$uri, $queryParams]; + } + + /** + * Get additional server params from request. + * @internal It would be nicer if this was solved by Jasny Http Message + * + * @param BrowserKitRequest $request + * @param UriInterface $uri + * @param array $queryParams + * @return array + */ + protected function determineServerParams(BrowserKitRequest $request, UriInterface $uri, array $queryParams) + { + return [ + 'REQUEST_METHOD' => $request->getMethod(), + 'QUERY_STRING' => http_build_query($queryParams), + 'REQUEST_URI' => (string)($uri->withScheme('')->withHost('')->withPort('')->withUserInfo('')) + ]; + } + + /** + * Set the server request properties + * + * @param ServerRequestInterface $baseRequest + * @param BrowserKitRequest $request + * @param resource $stream + * @param string $uri + * @param array $queryParams + * @return ServerRequestInterface + */ + protected function setRequestProperties( + ServerRequestInterface $baseRequest, + BrowserKitRequest $request, + $stream, + $uri, + array $queryParams + ) { + $psrRequest = $baseRequest + ->withBody(new Stream($stream)) + ->withMethod($request->getMethod()) + ->withRequestTarget((string)($uri->withScheme('')->withHost('')->withPort('')->withUserInfo(''))) + ->withCookieParams($request->getCookies()) + ->withUri($uri) + ->withQueryParams((array)$queryParams) + ->withUploadedFiles($this->convertUploadedFiles($request->getFiles())); + + if ($request->getMethod() !== 'GET' && !empty($request->getParameters())) { + $psrRequest = $psrRequest->withParsedBody($request->getParameters()); + } + + return $psrRequest; + } + + /** + * Convert a list of uploaded files to a Jasny PSR-7 uploaded files + * + * @param array $files + * @return UploadedFile[]|array + */ + protected function convertUploadedFiles(array $files) + { + $fileObjects = []; + + foreach ($files as $fieldName => $file) { + if ($file instanceof UploadedFileInterface) { + $fileObjects[$fieldName] = $file; + } elseif (!isset($file['tmp_name']) && !isset($file['error'])) { + $fileObjects[$fieldName] = $this->convertUploadedFiles($file); + } else { + $fileObjects[$fieldName] = new UploadedFile($file); + } + } + + return $fileObjects; + } + + + /** + * Convert a codeception request to a PSR-7 server request + * + * @param BrowserKitRequest $request + * @param ServerRequestInterface $baseRequest + * @return ServerRequest + */ + public function convert(BrowserKitRequest $request, ServerRequestInterface $baseRequest) + { + $stream = $this->createStream($request); + list($uri, $queryParams) = $this->buildFullUri($request); + + if ($baseRequest instanceof ServerRequest) { + $serverParams = $this->determineServerParams($request, $uri, (array)$queryParams); + $baseRequest = $baseRequest->withServerParams($request->getServer() + $serverParams); + } + + return $this->setRequestProperties($baseRequest, $request, $stream, $uri, (array)$queryParams); + } +} diff --git a/src/ResponseConvertor.php b/src/ResponseConvertor.php new file mode 100644 index 0000000..8954de2 --- /dev/null +++ b/src/ResponseConvertor.php @@ -0,0 +1,42 @@ +getBody(), + $psrResponse->getStatusCode() ?: 200, + $this->flattenHeaders($psrResponse->getHeaders()) + ); + } + + /** + * Flatten headers + * + * @param array $headers + * @return array + */ + protected function flattenHeaders(array $headers) + { + foreach ($headers as &$value) { + $value = is_array($value) ? end($value) : $value; + } + + return $headers; + } +} diff --git a/tests/unit/ConnectorTest.php b/tests/unit/ConnectorTest.php index 37a2947..2971be5 100644 --- a/tests/unit/ConnectorTest.php +++ b/tests/unit/ConnectorTest.php @@ -3,11 +3,15 @@ namespace Jasny\Codeception; use Jasny\Codeception\Connector; +use Jasny\Codeception\RequestConvertor; +use Jasny\Codeception\ResponseConvertor; use Jasny\Router; use Jasny\HttpMessage\ServerRequest; use Jasny\HttpMessage\Response; use Jasny\HttpMessage\OutputBufferStream; +use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ResponseInterface; +use Symfony\Component\BrowserKit\Request as BrowserKitRequest; use Symfony\Component\BrowserKit\Response as BrowserKitResponse; use org\bovigo\vfs\vfsStream; @@ -45,6 +49,14 @@ public function testSetRouter() $this->assertSame($router, $connector->getRouter()); } + public function testGetBaseRequest() + { + $connector = new Connector(); + $request = $connector->getBaseRequest(); + + $this->assertInstanceOf(ServerRequest::class, $request); + } + public function testSetBaseRequest() { $connector = new Connector(); @@ -71,7 +83,15 @@ public function testSetBaseRequestWithStale() $this->assertSame($request, $connector->getBaseRequest()); } - public function testSetResponse() + public function testGetBaseResponse() + { + $connector = new Connector(); + $request = $connector->getBaseResponse(); + + $this->assertInstanceOf(Response::class, $request); + } + + public function testSetBaseResponse() { $connector = new Connector(); $response = $this->createMock(Response::class); @@ -85,7 +105,7 @@ public function testSetResponse() * @expectedException RuntimeException * @expectedExceptionMessage Unable to set base response: Response is stale */ - public function testSetResponseWithStale() + public function testSetBaseResponseWithStale() { $connector = new Connector(); @@ -96,6 +116,43 @@ public function testSetResponseWithStale() } + public function testSetRequestConvertor() + { + $connector = new Connector(); + $convertor = $this->createMock(RequestConvertor::class); + + $connector->setRequestConvertor($convertor); + + $this->assertSame($convertor, $connector->getRequestConvertor()); + } + + public function testGetRequestConvertor() + { + $connector = new Connector(); + $convertor = $connector->getRequestConvertor(); + + $this->assertInstanceOf(RequestConvertor::class, $convertor); + } + + public function testSetResponseConvertor() + { + $connector = new Connector(); + $convertor = $this->createMock(ResponseConvertor::class); + + $connector->setResponseConvertor($convertor); + + $this->assertSame($convertor, $connector->getResponseConvertor()); + } + + public function testGetResponseConvertor() + { + $connector = new Connector(); + $convertor = $connector->getResponseConvertor(); + + $this->assertInstanceOf(ResponseConvertor::class, $convertor); + } + + public function testReset() { $connector = new Connector(); @@ -132,53 +189,34 @@ public function testReset() /** - * @param ServerRequest $request - * @return boolean - */ - public function assertPsrGetRequest($request) - { - $this->assertInstanceOf(ServerRequest::class, $request); - - $this->assertEquals('GET', $request->getMethod()); - $this->assertEquals('http://www.example.com/foo?bar=1&color=blue&mood=sunny', (string)$request->getUri()); - - $this->assertEquals(['bar' => 1, 'color' => 'blue', 'mood' => 'sunny'], $request->getQueryParams()); - $this->assertEmpty($request->getParsedBody()); - - $this->assertEquals([ - 'Referer' => ['http://www.example.com'], - 'User-Agent' => ['Test/1.0'], - 'Host' => ['www.example.com'] - ], $request->getHeaders()); - - return true; - } - - /** - * @param ServerRequest $request + * @param BrowserKitRequest $request + * @param string $method * @return boolean */ - public function assertPsrPostRequest($request) + public function assertRequest($request, $method) { - $this->assertInstanceOf(ServerRequest::class, $request); + $this->assertInstanceOf(BrowserKitRequest::class, $request); - $this->assertEquals('POST', $request->getMethod()); - $this->assertEquals('http://www.example.com/foo?bar=1', (string)$request->getUri()); + $this->assertEquals($method, $request->getMethod()); + $this->assertEquals('http://www.example.com/foo?bar=1', $request->getUri()); - $this->assertEquals(['bar' => 1], $request->getQueryParams()); - $this->assertEquals(['color' => 'blue', 'mood' => 'sunny'], $request->getParsedBody()); + $this->assertEquals(['color' => 'blue', 'mood' => 'sunny'], $request->getParameters()); - $uploadedFiles = $request->getUploadedFiles(); - $this->assertArrayHasKey('file', $uploadedFiles); - $this->assertEquals('one.txt', $uploadedFiles['file']->getClientFilename()); - $this->assertEquals('text/plain', $uploadedFiles['file']->getClientMediaType()); - $this->assertEquals('File Uno', (string)$uploadedFiles['file']->getStream()); + if ($method === 'POST') { + $uploadedFiles = $request->getFiles(); + $this->assertArrayHasKey('file', $uploadedFiles); + $this->assertEquals(UPLOAD_ERR_OK, $uploadedFiles['file']['error']); + $this->assertEquals('one.txt', $uploadedFiles['file']['name']); + $this->assertEquals('text/plain', $uploadedFiles['file']['type']); + $this->assertEquals('File Uno', file_get_contents($uploadedFiles['file']['tmp_name'])); + } $this->assertEquals([ - 'Referer' => ['http://www.example.com'], - 'User-Agent' => ['Test/1.0'], - 'Host' => ['www.example.com'] - ], $request->getHeaders()); + 'HTTP_REFERER' => 'http://www.example.com', + 'HTTP_USER_AGENT' => 'Test/1.0', + 'HTTP_HOST' => 'www.example.com', + 'HTTPS' => false + ], $request->getServer()); return true; } @@ -198,22 +236,41 @@ public function requestProvider() */ public function testRequest($method) { + $baseRequest = $this->createMock(ServerRequestInterface::class); + $baseResponse = $this->createMock(ResponseInterface::class); + + $psrRequest = $this->createMock(ServerRequestInterface::class); $psrResponse = $this->createMock(ResponseInterface::class); - $psrResponse->expects($this->once())->method('getStatusCode')->willReturn(200); - $psrResponse->expects($this->once())->method('getBody')->willReturn('hello body'); - $psrResponse->expects($this->once())->method('getHeaders')->willReturn([ - 'Content-Type' => 'text/plain', - 'Custom-Header' => 'abc' + + $response = $this->createMock(BrowserKitResponse::class); + $response->method('getHeader')->willReturnMap([ + ['Content-Type', true, 'text/plain'], + ['Set-Cookie', false, []] ]); $router = $this->createMock(Router::class); - $router->expects($this->once())->method('__invoke')->with( - $this->callback([$this, "assertPsr{$method}Request"]), - $this->isInstanceOf(Response::class) - )->willReturn($psrResponse); + $router->expects($this->once())->method('__invoke') + ->with($this->identicalTo($psrRequest), $this->identicalTo($baseResponse)) + ->willReturn($psrResponse); + + $requestConvertor = $this->createMock(RequestConvertor::class); + $requestConvertor->expects($this->once())->method('convert') + ->with($this->callback(function ($request) use ($method) { + return $this->assertRequest($request, $method); + }, $this->identicalTo($baseRequest))) + ->willReturn($psrRequest); + + $responseConvertor = $this->createMock(ResponseConvertor::class); + $responseConvertor->expects($this->once())->method('convert') + ->with($this->identicalTo($psrResponse)) + ->willReturn($response); $connector = new Connector(); $connector->setRouter($router); + $connector->setBaseRequest($baseRequest); + $connector->setBaseResponse($baseResponse); + $connector->setRequestConvertor($requestConvertor); + $connector->setResponseConvertor($responseConvertor); $uri = 'http://www.example.com/foo?bar=1'; $parameters = ['color' => 'blue', 'mood' => 'sunny']; @@ -233,15 +290,9 @@ public function testRequest($method) $connector->request($method, $uri, $parameters, $files, $server); - $response = $connector->getResponse(); + $ret = $connector->getResponse(); - $this->assertInstanceOf(BrowserKitResponse::class, $response); - $this->assertEquals(200, $response->getStatus()); - $this->assertEquals('hello body', $response->getContent()); - $this->assertEquals([ - 'Content-Type' => 'text/plain', - 'Custom-Header' => 'abc' - ], $response->getHeaders()); + $this->assertSame($response, $ret); } /** diff --git a/tests/unit/RequestConvertorTest.php b/tests/unit/RequestConvertorTest.php new file mode 100644 index 0000000..cbc1d5e --- /dev/null +++ b/tests/unit/RequestConvertorTest.php @@ -0,0 +1,215 @@ +root = vfsStream::setup('root', null, [ + 'one.txt' => 'File Uno', + 'two.txt' => 'File Dos', + 'three.txt' => 'File Tres' + ]); + } + + + /** + * @param ServerRequest $request + * @return boolean + */ + public function assertPsrGetRequest($request) + { + $this->assertInstanceOf(ServerRequest::class, $request); + + $this->assertEquals('GET', $request->getMethod()); + $this->assertEquals('http://www.example.com/foo?bar=1&color=blue&mood=sunny', (string)$request->getUri()); + + $this->assertEquals(['bar' => 1, 'color' => 'blue', 'mood' => 'sunny'], $request->getQueryParams()); + $this->assertEmpty($request->getParsedBody()); + + $this->assertEquals([ + 'Referer' => ['http://www.example.com'], + 'User-Agent' => ['Test/1.0'], + 'Host' => ['www.example.com'] + ], $request->getHeaders()); + + return true; + } + + /** + * @param ServerRequest $request + * @return boolean + */ + public function assertPsrPostRequest($request) + { + $this->assertInstanceOf(ServerRequest::class, $request); + + $this->assertEquals('POST', $request->getMethod()); + $this->assertEquals('http://www.example.com/foo?bar=1', (string)$request->getUri()); + + $this->assertEquals(['bar' => 1], $request->getQueryParams()); + $this->assertEquals(['color' => 'blue', 'mood' => 'sunny'], $request->getParsedBody()); + + $uploadedFiles = $request->getUploadedFiles(); + $this->assertArrayHasKey('file', $uploadedFiles); + $this->assertEquals('file-one.txt', $uploadedFiles['file']->getClientFilename()); + $this->assertEquals('text/plain', $uploadedFiles['file']->getClientMediaType()); + $this->assertEquals('File Uno', (string)$uploadedFiles['file']->getStream()); + + $this->assertEquals([ + 'Referer' => ['http://www.example.com'], + 'User-Agent' => ['Test/1.0'], + 'Host' => ['www.example.com'] + ], $request->getHeaders()); + + return true; + } + + + public function convertProvider() + { + return [ + ['GET'], + ['POST'] + ]; + } + + /** + * @dataProvider convertProvider + * + * @param string $method + */ + public function testConvert($method) + { + $baseRequest = new ServerRequest(); // Mocking would be better, but I'm lazy + + $request = $this->createConfiguredMock(BrowserKitRequest::class, [ + 'getUri' => 'http://www.example.com/foo?bar=1', + 'getMethod' => $method, + 'getParameters' => ['color' => 'blue', 'mood' => 'sunny'], + 'getFiles' => $method === 'POST' ? [ + 'file' => [ + 'name' => 'file-one.txt', + 'type' => 'text/plain', + 'error' => UPLOAD_ERR_OK, + 'size' => filesize(vfsStream::url('root/one.txt')), + 'tmp_name' => vfsStream::url('root/one.txt'), + ] + ] : [], + 'getServer' => [ + 'HTTP_REFERER' => 'http://www.example.com', + 'HTTP_USER_AGENT' => 'Test/1.0' + ], + 'getCookies' => [] + ]); + + $convertor = new RequestConvertor(); + + $psrRequest = $convertor->convert($request, $baseRequest); + + $fn = "assertPsr{$method}Request"; + $this->$fn($psrRequest); + } + + /** + * @depends testConvert + */ + public function testConvertUploadedFiles() + { + $one = [ + 'name' => 'file-one.txt', + 'type' => 'text/plain', + 'error' => UPLOAD_ERR_OK, + 'size' => filesize(vfsStream::url('root/one.txt')), + 'tmp_name' => vfsStream::url('root/one.txt') + ]; + + $more = [ + [ + 'name' => 'file-two.txt', + 'type' => 'text/plain', + 'error' => UPLOAD_ERR_OK, + 'size' => filesize(vfsStream::url('root/two.txt')), + 'tmp_name' => vfsStream::url('root/two.txt') + ], + [ + 'name' => 'file-three.txt', + 'type' => 'text/plain', + 'error' => UPLOAD_ERR_OK, + 'size' => filesize(vfsStream::url('root/three.txt')), + 'tmp_name' => vfsStream::url('root/three.txt') + ] + ]; + + $uploadedMock = $this->createMock(UploadedFileInterface::class); + + $oops = [ + 'error' => UPLOAD_ERR_NO_FILE + ]; + + $request = $this->createConfiguredMock(BrowserKitRequest::class, [ + 'getFiles' => [ + 'file' => $one, + 'more' => $more, + 'mock' => $uploadedMock, + 'oops' => $oops + ], + 'getMethod' => 'POST', + 'getParameters' => [], + 'getServer' => [], + 'getCookies' => [] + ]); + + $baseRequest = new ServerRequest(); // Mocking would be better, but I'm lazy + + $convertor = new RequestConvertor(); + + $psrRequest = $convertor->convert($request, $baseRequest); + $uploadedFiles = $psrRequest->getUploadedFiles(); + + $this->assertInternalType('array', $uploadedFiles); + $this->assertArrayHasKey('file', $uploadedFiles); + $this->assertEquals('file-one.txt', $uploadedFiles['file']->getClientFilename()); + $this->assertEquals('text/plain', $uploadedFiles['file']->getClientMediaType()); + $this->assertEquals('File Uno', (string)$uploadedFiles['file']->getStream()); + + $this->assertArrayHasKey('more', $uploadedFiles); + $this->assertInternalType('array', $uploadedFiles['more']); + $this->assertEquals([0, 1], array_keys($uploadedFiles['more'])); + + $this->assertEquals('file-two.txt', $uploadedFiles['more'][0]->getClientFilename()); + $this->assertEquals('text/plain', $uploadedFiles['more'][0]->getClientMediaType()); + $this->assertEquals('File Dos', (string)$uploadedFiles['more'][0]->getStream()); + + $this->assertEquals('file-three.txt', $uploadedFiles['more'][1]->getClientFilename()); + $this->assertEquals('text/plain', $uploadedFiles['more'][1]->getClientMediaType()); + $this->assertEquals('File Tres', (string)$uploadedFiles['more'][1]->getStream()); + + $this->assertArrayHasKey('mock', $uploadedFiles); + $this->assertSame($uploadedMock, $uploadedFiles['mock']); + + $this->assertArrayHasKey('oops', $uploadedFiles); + $this->assertEquals(UPLOAD_ERR_NO_FILE, $uploadedFiles['oops']->getError()); + } +} diff --git a/tests/unit/ResponseConvertorTest.php b/tests/unit/ResponseConvertorTest.php new file mode 100644 index 0000000..137f956 --- /dev/null +++ b/tests/unit/ResponseConvertorTest.php @@ -0,0 +1,48 @@ +createConfiguredMock(StreamInterface::class, [ + '__toString' => 'hello body' + ]); + + $response = $this->createConfiguredMock(ResponseInterface::class, [ + 'getStatusCode' => 200, + 'getBody' => $stream, + 'getHeaders' => [ + 'Content-Type' => ['text/plain'], + 'Custom-Header' => ['abc'] + ] + ]); + + $convertor = new ResponseConvertor(); + + $psrResponse = $convertor->convert($response); + + $this->assertInstanceOf(BrowserKitResponse::class, $psrResponse); + + $this->assertEquals(200, $psrResponse->getStatus()); + $this->assertEquals('hello body', $psrResponse->getContent()); + $this->assertEquals([ + 'Content-Type' => 'text/plain', + 'Custom-Header' => 'abc' + ], $psrResponse->getHeaders()); + } +} From c6a8c2ae0eb8bc81b686a9e6de8854e2940698ac Mon Sep 17 00:00:00 2001 From: Arnold Daniels Date: Mon, 23 Jan 2017 12:39:22 +0100 Subject: [PATCH 2/3] composer remove autoload-dev functional --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 774876b..a69aca9 100644 --- a/composer.json +++ b/composer.json @@ -27,6 +27,6 @@ } }, "autoload-dev": { - "classmap": ["tests/_support", "tests/functional"] + "classmap": ["tests/_support"] } } From 85fe912bbb1e31a3bf32cbcfa8b886d66bd0093e Mon Sep 17 00:00:00 2001 From: Arnold Daniels Date: Mon, 23 Jan 2017 12:42:03 +0100 Subject: [PATCH 3/3] Fixed uri type hinting --- src/RequestConvertor.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/RequestConvertor.php b/src/RequestConvertor.php index 350f11f..728c017 100644 --- a/src/RequestConvertor.php +++ b/src/RequestConvertor.php @@ -76,7 +76,7 @@ protected function determineServerParams(BrowserKitRequest $request, UriInterfac * @param ServerRequestInterface $baseRequest * @param BrowserKitRequest $request * @param resource $stream - * @param string $uri + * @param UriInterface $uri * @param array $queryParams * @return ServerRequestInterface */ @@ -84,7 +84,7 @@ protected function setRequestProperties( ServerRequestInterface $baseRequest, BrowserKitRequest $request, $stream, - $uri, + UriInterface $uri, array $queryParams ) { $psrRequest = $baseRequest