From a254c6960762895bf2e9b8e7b270da6215aac310 Mon Sep 17 00:00:00 2001 From: PJ Dietz Date: Sun, 26 Apr 2015 11:21:55 -0400 Subject: [PATCH] Reorganize ServerRequest and test --- src/Message/ServerRequest.php | 83 ++- test/tests/unit/Message/ServerRequestTest.php | 487 ++++++++++-------- 2 files changed, 293 insertions(+), 277 deletions(-) diff --git a/src/Message/ServerRequest.php b/src/Message/ServerRequest.php index 48a5f4a..1001055 100644 --- a/src/Message/ServerRequest.php +++ b/src/Message/ServerRequest.php @@ -21,12 +21,22 @@ class ServerRequest extends Request implements ServerRequestInterface /** @var mixed */ private $parsedBody; + // ------------------------------------------------------------------------ + public function __construct() { parent::__construct(); $this->attributes = []; } + public function __clone() + { + if (is_object($this->parsedBody)) { + $this->parsedBody = clone $this->parsedBody; + } + parent::__clone(); + } + // ------------------------------------------------------------------------ // Psr\Http\Message\ServerRequestInterface @@ -127,20 +137,36 @@ class ServerRequest extends Request implements ServerRequestInterface } /** - * Retrieve the upload file metadata. + * Retrieve normalized file upload data. * - * This method MUST return file upload metadata in the same structure - * as PHP's $_FILES superglobal. + * This method returns upload metadata in a normalized tree, with each leaf + * an instance of Psr\Http\Message\UploadedFileInterface. * - * These values MUST remain immutable over the course of the incoming - * request. They SHOULD be injected during instantiation, such as from PHP's - * $_FILES superglobal, but MAY be derived from other sources. + * These values MAY be prepared from $_FILES or the message body during + * instantiation, or MAY be injected via withUploadedFiles(). * - * @return array Upload file(s) metadata, if any. + * @return array An array tree of UploadedFileInterface instances; an empty + * array MUST be returned if no data is present. */ - public function getFileParams() + public function getUploadedFiles() { - return $this->fileParams; + // TODO: Implement getUploadedFiles() method. + } + + /** + * Create a new instance with the specified uploaded files. + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that has the + * updated body parameters. + * + * @param array An array tree of UploadedFileInterface instances. + * @return self + * @throws \InvalidArgumentException if an invalid structure is provided. + */ + public function withUploadedFiles(array $uploadedFiles) + { + // TODO: Implement withUploadedFiles() method. } /** @@ -281,13 +307,6 @@ class ServerRequest extends Request implements ServerRequestInterface // ------------------------------------------------------------------------ - public function __clone() - { - if (is_object($this->parsedBody)) { - $this->parsedBody = clone $this->parsedBody; - } - parent::__clone(); - } protected function readFromServerRequest(array $attributes = null) { @@ -364,36 +383,4 @@ class ServerRequest extends Request implements ServerRequestInterface return $headers; } - /** - * Retrieve normalized file upload data. - * - * This method returns upload metadata in a normalized tree, with each leaf - * an instance of Psr\Http\Message\UploadedFileInterface. - * - * These values MAY be prepared from $_FILES or the message body during - * instantiation, or MAY be injected via withUploadedFiles(). - * - * @return array An array tree of UploadedFileInterface instances; an empty - * array MUST be returned if no data is present. - */ - public function getUploadedFiles() - { - // TODO: Implement getUploadedFiles() method. - } - - /** - * Create a new instance with the specified uploaded files. - * - * This method MUST be implemented in such a way as to retain the - * immutability of the message, and MUST return an instance that has the - * updated body parameters. - * - * @param array An array tree of UploadedFileInterface instances. - * @return self - * @throws \InvalidArgumentException if an invalid structure is provided. - */ - public function withUploadedFiles(array $uploadedFiles) - { - // TODO: Implement withUploadedFiles() method. - } } diff --git a/test/tests/unit/Message/ServerRequestTest.php b/test/tests/unit/Message/ServerRequestTest.php index 546596e..83f5e96 100644 --- a/test/tests/unit/Message/ServerRequestTest.php +++ b/test/tests/unit/Message/ServerRequestTest.php @@ -13,6 +13,9 @@ use WellRESTed\Message\ServerRequest; */ class ServerRequestTest extends \PHPUnit_Framework_TestCase { + // ------------------------------------------------------------------------ + // Construction and Marshalling + /** * @covers WellRESTed\Message\ServerRequest::__construct */ @@ -50,7 +53,7 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase ] ]; $_POST = [ - "dog" => "Bear" + "dog" => "Bear" ]; $attributes = ["guinea_pig" => "Claude"]; $request = ServerRequest::getServerRequest($attributes); @@ -58,233 +61,8 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase return $request; } - /** - * @covers WellRESTed\Message\ServerRequest::getServerParams - * @depends testGetServerRequestReadsFromRequest - */ - public function testServerRequestProvidesServerParams($request) - { - /** @var ServerRequest $request */ - $this->assertEquals("localhost", $request->getServerParams()["HTTP_HOST"]); - } - - /** - * @covers WellRESTed\Message\ServerRequest::getCookieParams - * @depends testGetServerRequestReadsFromRequest - */ - public function testServerRequestProvidesCookieParams($request) - { - /** @var ServerRequest $request */ - $this->assertEquals("Molly", $request->getCookieParams()["cat"]); - } - - /** - * @covers WellRESTed\Message\ServerRequest::getQueryParams - * @depends testGetServerRequestReadsFromRequest - */ - public function testServerRequestProvidesQueryParams($request) - { - /** @var ServerRequest $request */ - $this->assertEquals("Claude", $request->getQueryParams()["guinea_pig"]); - } - - /** - * @covers WellRESTed\Message\ServerRequest::getFileParams - * @depends testGetServerRequestReadsFromRequest - */ - public function testServerRequestProvidesFilesParams($request) - { - /** @var ServerRequest $request */ - $this->assertEquals("MyFile.jpg", $request->getFileParams()["file"]["name"]); - } - - /** - * @covers WellRESTed\Message\ServerRequest::getHeader - * @depends testGetServerRequestReadsFromRequest - */ - public function testServerRequestProvidesHeaders($request) - { - /** @var ServerRequest $request */ - $this->assertEquals(["application/json"], $request->getHeader("Accept")); - } - - public function testServerRequestProvidesBody() - { - $body = $this->prophesize('Psr\Http\Message\StreamInterface'); - MockServerRequestTest::$bodyStream = $body->reveal(); - $request = MockServerRequestTest::getServerRequest(); - $this->assertSame($body->reveal(), $request->getBody()); - } - - /** - * @covers WellRESTed\Message\ServerRequest::getAttribute - * @depends testGetServerRequestReadsFromRequest - */ - public function testServerRequestProvidesAttributesIfPassed($request) - { - /** @var ServerRequest $request */ - $this->assertEquals("Claude", $request->getAttribute("guinea_pig")); - } - - /** - * @covers WellRESTed\Message\ServerRequest::withCookieParams - * @depends testGetServerRequestReadsFromRequest - */ - public function testWithCookieParamsCreatesNewInstance($request1) - { - /** @var ServerRequest $request1 */ - $request2 = $request1->withCookieParams([ - "cat" => "Oscar" - ]); - $this->assertEquals("Molly", $request1->getCookieParams()["cat"]); - $this->assertEquals("Oscar", $request2->getCookieParams()["cat"]); - } - - /** - * @covers WellRESTed\Message\ServerRequest::withQueryParams - * @depends testGetServerRequestReadsFromRequest - */ - public function testWithQueryParamsCreatesNewInstance($request1) - { - /** @var ServerRequest $request1 */ - $request2 = $request1->withQueryParams([ - "guinea_pig" => "Clyde" - ]); - $this->assertEquals("Claude", $request1->getQueryParams()["guinea_pig"]); - $this->assertEquals("Clyde", $request2->getQueryParams()["guinea_pig"]); - } - - /** - * @covers WellRESTed\Message\ServerRequest::withParsedBody - * @depends testGetServerRequestReadsFromRequest - */ - public function testWithParsedBodyCreatesNewInstance($request1) - { - /** @var ServerRequest $request1 */ - $body1 = $request1->getParsedBody(); - - $request2 = $request1->withParsedBody([ - "guinea_pig" => "Clyde" - ]); - $body2 = $request2->getParsedBody(); - - $this->assertEquals("Bear", $body1["dog"]); - $this->assertEquals("Clyde", $body2["guinea_pig"]); - } - - /** - * @covers WellRESTed\Message\ServerRequest::getServerRequest - * @covers WellRESTed\Message\ServerRequest::getParsedBody - * @preserveGlobalState disabled - * @dataProvider formContentTypeProvider - */ - public function testGetServerRequestParsesFormBody($contentType) - { - $_SERVER = [ - "HTTP_HOST" => "localhost", - "HTTP_CONTENT_TYPE" => $contentType, - ]; - $_COOKIE = []; - $_FILES = []; - $_POST = [ - "dog" => "Bear" - ]; - $request = ServerRequest::getServerRequest(); - $this->assertEquals("Bear", $request->getParsedBody()["dog"]); - } - - public function formContentTypeProvider() - { - return [ - ["application/x-www-form-urlencoded"], - ["multipart/form-data"] - ]; - } - - /** - * @covers WellRESTed\Message\ServerRequest::__clone - */ - public function testCloneMakesDeepCopiesOfParsedBody() - { - $body = (object) [ - "cat" => "Dog" - ]; - - $request1 = new ServerRequest(); - $request1 = $request1->withParsedBody($body); - $request2 = $request1->withHeader("X-extra", "hello world"); - $this->assertEquals($request1->getParsedBody(), $request2->getParsedBody()); - $this->assertNotSame($request1->getParsedBody(), $request2->getParsedBody()); - } - - /** - * @covers WellRESTed\Message\ServerRequest::withAttribute - * @covers WellRESTed\Message\ServerRequest::getAttribute - */ - public function testWithAttributeCreatesNewInstance() - { - $request = new ServerRequest(); - $request = $request->withAttribute("cat", "Molly"); - $this->assertEquals("Molly", $request->getAttribute("cat")); - } - - /** - * @covers WellRESTed\Message\ServerRequest::withAttribute - */ - public function testWithAttributePreserversOtherAttributes() - { - $request = new ServerRequest(); - $request = $request->withAttribute("cat", "Molly"); - $request = $request->withAttribute("dog", "Bear"); - $this->assertEquals("Molly", $request->getAttribute("cat")); - $this->assertEquals("Bear", $request->getAttribute("dog")); - } - - /** - * @covers WellRESTed\Message\ServerRequest::getAttribute - */ - public function testGetAttributeReturnsDefaultIfNotSet() - { - $request = new ServerRequest(); - $this->assertEquals("Oscar", $request->getAttribute("cat", "Oscar")); - } - - /** - * @covers WellRESTed\Message\ServerRequest::withoutAttribute - */ - public function testWithoutAttributeCreatesNewInstance() - { - $request = new ServerRequest(); - $request = $request->withAttribute("cat", "Molly"); - $request = $request->withoutAttribute("cat"); - $this->assertEquals("Oscar", $request->getAttribute("cat", "Oscar")); - } - - /** - * @covers WellRESTed\Message\ServerRequest::withoutAttribute - */ - public function testWithoutAttributePreservesOtherAttributes() - { - $request = new ServerRequest(); - $request = $request->withAttribute("cat", "Molly"); - $request = $request->withAttribute("dog", "Bear"); - $request = $request->withoutAttribute("cat"); - $this->assertEquals("Bear", $request->getAttribute("dog")); - $this->assertEquals("Oscar", $request->getAttribute("cat", "Oscar")); - } - - /** - * @covers WellRESTed\Message\ServerRequest::getAttributes - */ - public function testGetAttributesReturnsAllAttributes() - { - $request = new ServerRequest(); - $request = $request->withAttribute("cat", "Molly"); - $request = $request->withAttribute("dog", "Bear"); - $attributes = $request->getAttributes(); - $this->assertEquals("Molly", $attributes["cat"]); - $this->assertEquals("Bear", $attributes["dog"]); - } + // ------------------------------------------------------------------------ + // Request /** * @covers WellRESTed\Message\ServerRequest::readFromServerRequest @@ -363,11 +141,262 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase ["/", null] ]; } + + /** + * @covers WellRESTed\Message\ServerRequest::getHeader + * @depends testGetServerRequestReadsFromRequest + */ + public function testServerRequestProvidesHeaders($request) + { + /** @var ServerRequest $request */ + $this->assertEquals(["application/json"], $request->getHeader("Accept")); + } + + /** + * @covers WellRESTed\Message\ServerRequest::getBody + */ + public function testServerRequestProvidesBody() + { + $body = $this->prophesize('Psr\Http\Message\StreamInterface'); + MockServerRequest::$bodyStream = $body->reveal(); + $request = MockServerRequest::getServerRequest(); + $this->assertSame($body->reveal(), $request->getBody()); + } + + // ------------------------------------------------------------------------ + // Server Params + + /** + * @covers WellRESTed\Message\ServerRequest::getServerParams + * @depends testGetServerRequestReadsFromRequest + */ + public function testServerRequestProvidesServerParams($request) + { + /** @var ServerRequest $request */ + $this->assertEquals("localhost", $request->getServerParams()["HTTP_HOST"]); + } + + // ------------------------------------------------------------------------ + // Cookies + + /** + * @covers WellRESTed\Message\ServerRequest::getCookieParams + * @depends testGetServerRequestReadsFromRequest + */ + public function testServerRequestProvidesCookieParams($request) + { + /** @var ServerRequest $request */ + $this->assertEquals("Molly", $request->getCookieParams()["cat"]); + } + + /** + * @covers WellRESTed\Message\ServerRequest::withCookieParams + * @depends testGetServerRequestReadsFromRequest + */ + public function testWithCookieParamsCreatesNewInstance($request1) + { + /** @var ServerRequest $request1 */ + $request2 = $request1->withCookieParams([ + "cat" => "Oscar" + ]); + $this->assertEquals("Molly", $request1->getCookieParams()["cat"]); + $this->assertEquals("Oscar", $request2->getCookieParams()["cat"]); + } + + // ------------------------------------------------------------------------ + // Query + + /** + * @covers WellRESTed\Message\ServerRequest::getQueryParams + * @depends testGetServerRequestReadsFromRequest + */ + public function testServerRequestProvidesQueryParams($request) + { + /** @var ServerRequest $request */ + $this->assertEquals("Claude", $request->getQueryParams()["guinea_pig"]); + } + + /** + * @covers WellRESTed\Message\ServerRequest::withQueryParams + * @depends testGetServerRequestReadsFromRequest + */ + public function testWithQueryParamsCreatesNewInstance($request1) + { + /** @var ServerRequest $request1 */ + $request2 = $request1->withQueryParams([ + "guinea_pig" => "Clyde" + ]); + $this->assertEquals("Claude", $request1->getQueryParams()["guinea_pig"]); + $this->assertEquals("Clyde", $request2->getQueryParams()["guinea_pig"]); + } + + // ------------------------------------------------------------------------ + // Uploaded Files + + // ------------------------------------------------------------------------ + // Parsed Body + + /** + * @covers WellRESTed\Message\ServerRequest::getServerRequest + * @covers WellRESTed\Message\ServerRequest::getParsedBody + * @preserveGlobalState disabled + * @dataProvider formContentTypeProvider + */ + public function testGetServerRequestParsesFormBody($contentType) + { + $_SERVER = [ + "HTTP_HOST" => "localhost", + "HTTP_CONTENT_TYPE" => $contentType, + ]; + $_COOKIE = []; + $_FILES = []; + $_POST = [ + "dog" => "Bear" + ]; + $request = ServerRequest::getServerRequest(); + $this->assertEquals("Bear", $request->getParsedBody()["dog"]); + } + + public function formContentTypeProvider() + { + return [ + ["application/x-www-form-urlencoded"], + ["multipart/form-data"] + ]; + } + + /** + * @covers WellRESTed\Message\ServerRequest::withParsedBody + * @depends testGetServerRequestReadsFromRequest + */ + public function testWithParsedBodyCreatesNewInstance($request1) + { + /** @var ServerRequest $request1 */ + $body1 = $request1->getParsedBody(); + + $request2 = $request1->withParsedBody([ + "guinea_pig" => "Clyde" + ]); + $body2 = $request2->getParsedBody(); + + $this->assertEquals("Bear", $body1["dog"]); + $this->assertEquals("Clyde", $body2["guinea_pig"]); + } + + /** + * @covers WellRESTed\Message\ServerRequest::__clone + */ + public function testCloneMakesDeepCopiesOfParsedBody() + { + $body = (object) [ + "cat" => "Dog" + ]; + + $request1 = new ServerRequest(); + $request1 = $request1->withParsedBody($body); + $request2 = $request1->withHeader("X-extra", "hello world"); + $this->assertEquals($request1->getParsedBody(), $request2->getParsedBody()); + $this->assertNotSame($request1->getParsedBody(), $request2->getParsedBody()); + } + + // ------------------------------------------------------------------------ + // Attributes + + /** + * @covers WellRESTed\Message\ServerRequest::getAttribute + * @depends testGetServerRequestReadsFromRequest + */ + public function testServerRequestProvidesAttributesIfPassed($request) + { + /** @var ServerRequest $request */ + $this->assertEquals("Claude", $request->getAttribute("guinea_pig")); + } + + /** + * @covers WellRESTed\Message\ServerRequest::getAttribute + */ + public function testGetAttributeReturnsDefaultIfNotSet() + { + $request = new ServerRequest(); + $this->assertEquals("Oscar", $request->getAttribute("cat", "Oscar")); + } + + /** + * @covers WellRESTed\Message\ServerRequest::withAttribute + * @covers WellRESTed\Message\ServerRequest::getAttribute + */ + public function testWithAttributeCreatesNewInstance() + { + $request = new ServerRequest(); + $request = $request->withAttribute("cat", "Molly"); + $this->assertEquals("Molly", $request->getAttribute("cat")); + } + + /** + * @covers WellRESTed\Message\ServerRequest::withAttribute + */ + public function testWithAttributePreserversOtherAttributes() + { + $request = new ServerRequest(); + $request = $request->withAttribute("cat", "Molly"); + $request = $request->withAttribute("dog", "Bear"); + $this->assertEquals("Molly", $request->getAttribute("cat")); + $this->assertEquals("Bear", $request->getAttribute("dog")); + } + + /** + * @covers WellRESTed\Message\ServerRequest::withoutAttribute + */ + public function testWithoutAttributeCreatesNewInstance() + { + $request = new ServerRequest(); + $request = $request->withAttribute("cat", "Molly"); + $request = $request->withoutAttribute("cat"); + $this->assertEquals("Oscar", $request->getAttribute("cat", "Oscar")); + } + + /** + * @covers WellRESTed\Message\ServerRequest::withoutAttribute + */ + public function testWithoutAttributePreservesOtherAttributes() + { + $request = new ServerRequest(); + $request = $request->withAttribute("cat", "Molly"); + $request = $request->withAttribute("dog", "Bear"); + $request = $request->withoutAttribute("cat"); + $this->assertEquals("Bear", $request->getAttribute("dog")); + $this->assertEquals("Oscar", $request->getAttribute("cat", "Oscar")); + } + + /** + * @covers WellRESTed\Message\ServerRequest::getAttributes + */ + public function testGetAttributesReturnsAllAttributes() + { + $request = new ServerRequest(); + $request = $request->withAttribute("cat", "Molly"); + $request = $request->withAttribute("dog", "Bear"); + $attributes = $request->getAttributes(); + $this->assertEquals("Molly", $attributes["cat"]); + $this->assertEquals("Bear", $attributes["dog"]); + } + +// +// /** +// * @covers WellRESTed\Message\ServerRequest::getFileParams +// * @depends testGetServerRequestReadsFromRequest +// */ +// public function testServerRequestProvidesFilesParams($request) +// { +// /** @var ServerRequest $request */ +// $this->assertEquals("MyFile.jpg", $request->getFileParams()["file"]["name"]); +// } +// } // ---------------------------------------------------------------------------- -class MockServerRequestTest extends ServerRequest +class MockServerRequest extends ServerRequest { public static $bodyStream;