Reorganize ServerRequest and test

This commit is contained in:
PJ Dietz 2015-04-26 11:21:55 -04:00
parent 26d71bd792
commit a254c69607
2 changed files with 293 additions and 277 deletions

View File

@ -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.
}
}

View File

@ -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;