From 81055c3bd917412ef5fb7824c001dc61fc2bb558 Mon Sep 17 00:00:00 2001 From: PJ Dietz Date: Sat, 2 May 2015 13:27:38 -0400 Subject: [PATCH] Update ServerRequest:: addUploadedFilesToBranch to allow associate array at last level of $_FILES --- src/Message/ServerRequest.php | 36 +++-- test/tests/unit/Message/ServerRequestTest.php | 138 +++++++++++------- 2 files changed, 110 insertions(+), 64 deletions(-) diff --git a/src/Message/ServerRequest.php b/src/Message/ServerRequest.php index fa32ddc..6697638 100644 --- a/src/Message/ServerRequest.php +++ b/src/Message/ServerRequest.php @@ -186,7 +186,7 @@ class ServerRequest extends Request implements ServerRequestInterface /** * Create a new instance with the specified uploaded files. * - * @param array An array tree of UploadedFileInterface instances. + * @param array $uploadedFiles An array tree of UploadedFileInterface instances. * @return self * @throws \InvalidArgumentException if an invalid structure is provided. */ @@ -377,25 +377,32 @@ class ServerRequest extends Request implements ServerRequestInterface protected function addUploadedFilesToBranch(&$branch, $name, $value) { + // Check for each of the expected keys. if (isset($value["name"], $value["type"], $value["tmp_name"], $value["error"], $value["size"])) { // This is a file. It may be a single file, or a list of files. - // Check if the "name" element is a list array. - if (is_array($value["name"]) && (array_keys($value["name"]) === range(0, count($value["name"]) - 1))) { - $list = []; - for ($index = 0, $u = count($value["name"]); $index < $u; ++$index) { - $uploadedFile = new UploadedFile( - $value["name"][$index], - $value["type"][$index], - $value["size"][$index], - $value["tmp_name"][$index], - $value["error"][$index] + // Check if these items are arrays. + if (is_array($value["name"]) + && is_array($value["type"]) + && is_array($value["tmp_name"]) + && is_array($value["error"]) + && is_array($value["size"]) + ) { + // Each item is an array. This is a list of uploaded files. + $files = []; + $keys = array_keys($value["name"]); + foreach ($keys as $key) { + $files[$key] = new UploadedFile( + $value["name"][$key], + $value["type"][$key], + $value["size"][$key], + $value["tmp_name"][$key], + $value["error"][$key] ); - $list[] = $uploadedFile; } - $branch[$name] = $list; + $branch[$name] = $files; } else { - // All expected keys are present. This is an uploaded file. + // All expected keys are present and are not arrays. This is an uploaded file. $uploadedFile = new UploadedFile( $value["name"], $value["type"], $value["size"], $value["tmp_name"], $value["error"] ); @@ -437,6 +444,7 @@ class ServerRequest extends Request implements ServerRequestInterface * Return a reference to the singleton instance of the Request derived * from the server's information about the request sent to the server. * + * @param array $attributes Key-value pairs to add to the request. * @return self * @static */ diff --git a/test/tests/unit/Message/ServerRequestTest.php b/test/tests/unit/Message/ServerRequestTest.php index 9653bc6..b1c6134 100644 --- a/test/tests/unit/Message/ServerRequestTest.php +++ b/test/tests/unit/Message/ServerRequestTest.php @@ -6,7 +6,11 @@ use WellRESTed\Message\ServerRequest; use WellRESTed\Message\UploadedFile; use WellRESTed\Message\Uri; +// TODO Test nested $_FILES with associative array for last level +// TODO Remove concrete class used for testing + /** + * @coversDefaultClass WellRESTed\Message\ServerRequest * @uses WellRESTed\Message\ServerRequest * @uses WellRESTed\Message\Request * @uses WellRESTed\Message\Message @@ -21,7 +25,7 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase // Construction and Marshalling /** - * @covers WellRESTed\Message\ServerRequest::__construct + * @covers ::__construct */ public function testCreatesInstance() { @@ -30,10 +34,10 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase } /** - * @covers WellRESTed\Message\ServerRequest::getServerRequest - * @covers WellRESTed\Message\ServerRequest::getServerRequestHeaders - * @covers WellRESTed\Message\ServerRequest::readFromServerRequest - * @covers WellRESTed\Message\ServerRequest::getStreamForBody + * @covers ::getServerRequest + * @covers ::getServerRequestHeaders + * @covers ::readFromServerRequest + * @covers ::getStreamForBody * @preserveGlobalState disabled */ public function testGetServerRequestReadsFromRequest() @@ -61,7 +65,7 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase // Request /** - * @covers WellRESTed\Message\ServerRequest::readFromServerRequest + * @covers ::readFromServerRequest * @preserveGlobalState disabled * @dataProvider protocolVersionProvider */ @@ -87,7 +91,7 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase } /** - * @covers WellRESTed\Message\ServerRequest::readFromServerRequest + * @covers ::readFromServerRequest * @preserveGlobalState disabled * @dataProvider methodProvider */ @@ -114,7 +118,7 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase } /** - * @covers WellRESTed\Message\ServerRequest::readFromServerRequest + * @covers ::readFromServerRequest * @preserveGlobalState disabled * @dataProvider requestTargetProvider */ @@ -139,7 +143,7 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase } /** - * @covers WellRESTed\Message\ServerRequest::getHeader + * @covers ::getHeader * @depends testGetServerRequestReadsFromRequest */ public function testServerRequestProvidesHeaders($request) @@ -149,7 +153,7 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase } /** - * @covers WellRESTed\Message\ServerRequest::getBody + * @covers ::getBody */ public function testServerRequestProvidesBody() { @@ -163,7 +167,7 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase // Server Params /** - * @covers WellRESTed\Message\ServerRequest::getServerParams + * @covers ::getServerParams */ public function testServerParamsIsEmptyByDefault() { @@ -172,7 +176,7 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase } /** - * @covers WellRESTed\Message\ServerRequest::getServerParams + * @covers ::getServerParams * @depends testGetServerRequestReadsFromRequest */ public function testServerRequestProvidesServerParams($request) @@ -185,7 +189,7 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase // Cookies /** - * @covers WellRESTed\Message\ServerRequest::getCookieParams + * @covers ::getCookieParams */ public function testCookieParamsIsEmptyByDefault() { @@ -194,7 +198,7 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase } /** - * @covers WellRESTed\Message\ServerRequest::getCookieParams + * @covers ::getCookieParams * @depends testGetServerRequestReadsFromRequest */ public function testServerRequestProvidesCookieParams($request) @@ -204,7 +208,7 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase } /** - * @covers WellRESTed\Message\ServerRequest::withCookieParams + * @covers ::withCookieParams * @depends testGetServerRequestReadsFromRequest */ public function testWithCookieParamsCreatesNewInstance($request1) @@ -221,7 +225,7 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase // Query /** - * @covers WellRESTed\Message\ServerRequest::getQueryParams + * @covers ::getQueryParams */ public function testQueryParamsIsEmptyByDefault() { @@ -230,7 +234,7 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase } /** - * @covers WellRESTed\Message\ServerRequest::getQueryParams + * @covers ::getQueryParams * @depends testGetServerRequestReadsFromRequest */ public function testServerRequestProvidesQueryParams($request) @@ -240,7 +244,7 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase } /** - * @covers WellRESTed\Message\ServerRequest::withQueryParams + * @covers ::withQueryParams * @depends testGetServerRequestReadsFromRequest */ public function testWithQueryParamsCreatesNewInstance($request1) @@ -257,7 +261,7 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase // Uploaded Files /** - * @covers WellRESTed\Message\ServerRequest::getUploadedFiles + * @covers ::getUploadedFiles */ public function testUploadedFilesIsEmptyByDefault() { @@ -266,7 +270,7 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase } /** - * @covers WellRESTed\Message\ServerRequest::getUploadedFiles + * @covers ::getUploadedFiles * @preserveGlobalState disabled */ public function testGetUploadedFilesReturnsEmptyArrayWhenNoFilesAreUploaded() @@ -282,10 +286,10 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase } /** - * @covers WellRESTed\Message\ServerRequest::getServerRequest - * @covers WellRESTed\Message\ServerRequest::readUploadedFiles - * @covers WellRESTed\Message\ServerRequest::getUploadedFiles - * @covers WellRESTed\Message\ServerRequest::addUploadedFilesToBranch + * @covers ::getServerRequest + * @covers ::readUploadedFiles + * @covers ::getUploadedFiles + * @covers ::addUploadedFilesToBranch * @preserveGlobalState disabled * @dataProvider uploadedFileProvider */ @@ -341,6 +345,30 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase 2 => 0 ] ] + ], + "nestedDictionary" => [ + "level2" => [ + "name" => [ + "file0" => "nestedDictionary0.jpg", + "file1" => "nestedDictionary1.jpg" + ], + "type" => [ + "file0" => "image/png", + "file1" => "image/png" + ], + "tmp_name" => [ + "file0" => "/tmp/phppng0", + "file1" => "/tmp/phppng1" + ], + "error" => [ + "file0" => UPLOAD_ERR_OK, + "file1" => UPLOAD_ERR_OK + ], + "size" => [ + "file0" => 256, + "file1" => 4096 + ] + ] ] ]; $request = ServerRequest::getServerRequest(); @@ -358,13 +386,16 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase [new UploadedFile("nested.json", "application/json", 1024, "/tmp/phpadhjk", UPLOAD_ERR_OK), ["nested", "level2"]], [new UploadedFile("nestedList0.jpg", "image/jpeg", 256, "/tmp/phpjpg0", UPLOAD_ERR_OK), ["nestedList", "level2", 0]], [new UploadedFile("nestedList1.jpg", "image/jpeg", 4096, "/tmp/phpjpg1", UPLOAD_ERR_OK), ["nestedList", "level2", 1]], - [new UploadedFile("", "", 0, "", UPLOAD_ERR_NO_FILE), ["nestedList", "level2", 2]] + [new UploadedFile("", "", 0, "", UPLOAD_ERR_NO_FILE), ["nestedList", "level2", 2]], + [new UploadedFile("nestedDictionary0.jpg", "image/png", 256, "/tmp/phppng0", UPLOAD_ERR_OK), ["nestedDictionary", "level2", "file0"]], + [new UploadedFile("nestedDictionary1.jpg", "image/png", 4096, "/tmp/phppngg1", UPLOAD_ERR_OK), ["nestedDictionary", "level2", "file1"]] ]; } /** - * @covers WellRESTed\Message\ServerRequest::withUploadedFiles - * @covers WellRESTed\Message\ServerRequest::isValidUploadedFilesTree + * @covers ::withUploadedFiles + * @covers ::isValidUploadedFilesBranch + * @covers ::isValidUploadedFilesTree */ public function testWithUploadedFilesCreatesNewInstance() { @@ -378,8 +409,9 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase } /** - * @covers WellRESTed\Message\ServerRequest::withUploadedFiles - * @covers WellRESTed\Message\ServerRequest::isValidUploadedFilesTree + * @covers ::withUploadedFiles + * @covers ::isValidUploadedFilesTree + * @covers ::isValidUploadedFilesBranch * @dataProvider validUploadedFilesProvider */ public function testWithUploadedFilesReturnsPassedUploadedFiles($uploadedFiles) @@ -402,13 +434,19 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase new UploadedFile("file1.html", "text/html", 524, "/tmp/php9hNlHe", 0), new UploadedFile("file2.html", "text/html", 524, "/tmp/php9hNshj", 0) ] + ]]], + [["nestedDictionary" => [ + "level2" => [ + "file1" => new UploadedFile("file1.html", "text/html", 524, "/tmp/php9hNlHe", 0), + "file2" => new UploadedFile("file2.html", "text/html", 524, "/tmp/php9hNshj", 0) + ] ]]] ]; } /** - * @covers WellRESTed\Message\ServerRequest::withUploadedFiles - * @covers WellRESTed\Message\ServerRequest::isValidUploadedFilesTree + * @covers ::withUploadedFiles + * @covers ::isValidUploadedFilesTree * @expectedException \InvalidArgumentException * @dataProvider invalidUploadedFilesProvider */ @@ -481,7 +519,7 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase // Parsed Body /** - * @covers WellRESTed\Message\ServerRequest::getParsedBody + * @covers ::getParsedBody */ public function testParsedBodyIsNullByDefault() { @@ -490,8 +528,8 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase } /** - * @covers WellRESTed\Message\ServerRequest::getServerRequest - * @covers WellRESTed\Message\ServerRequest::getParsedBody + * @covers ::getServerRequest + * @covers ::getParsedBody * @preserveGlobalState disabled * @dataProvider formContentTypeProvider */ @@ -519,7 +557,7 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase } /** - * @covers WellRESTed\Message\ServerRequest::withParsedBody + * @covers ::withParsedBody * @depends testGetServerRequestReadsFromRequest */ public function testWithParsedBodyCreatesNewInstance($request1) @@ -537,7 +575,7 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase } /** - * @covers WellRESTed\Message\ServerRequest::withParsedBody + * @covers ::withParsedBody * @expectedException \InvalidArgumentException * @dataProvider invalidParsedBodyProvider */ @@ -556,7 +594,7 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase } /** - * @covers WellRESTed\Message\ServerRequest::__clone + * @covers ::__clone */ public function testCloneMakesDeepCopiesOfParsedBody() { @@ -575,7 +613,7 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase // Attributes /** - * @covers WellRESTed\Message\ServerRequest::getAttributes + * @covers ::getAttributes */ public function testAttributesIsEmptyByDefault() { @@ -584,7 +622,7 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase } /** - * @covers WellRESTed\Message\ServerRequest::getAttribute + * @covers ::getAttribute * @depends testGetServerRequestReadsFromRequest */ public function testServerRequestProvidesAttributesIfPassed($request) @@ -594,7 +632,7 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase } /** - * @covers WellRESTed\Message\ServerRequest::getAttribute + * @covers ::getAttribute */ public function testGetAttributeReturnsDefaultIfNotSet() { @@ -603,8 +641,8 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase } /** - * @covers WellRESTed\Message\ServerRequest::withAttribute - * @covers WellRESTed\Message\ServerRequest::getAttribute + * @covers ::withAttribute + * @covers ::getAttribute */ public function testWithAttributeCreatesNewInstance() { @@ -614,7 +652,7 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase } /** - * @covers WellRESTed\Message\ServerRequest::withAttribute + * @covers ::withAttribute */ public function testWithAttributePreserversOtherAttributes() { @@ -626,7 +664,7 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase } /** - * @covers WellRESTed\Message\ServerRequest::withoutAttribute + * @covers ::withoutAttribute */ public function testWithoutAttributeCreatesNewInstance() { @@ -637,7 +675,7 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase } /** - * @covers WellRESTed\Message\ServerRequest::withoutAttribute + * @covers ::withoutAttribute */ public function testWithoutAttributePreservesOtherAttributes() { @@ -650,7 +688,7 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase } /** - * @covers WellRESTed\Message\ServerRequest::getAttributes + * @covers ::getAttributes */ public function testGetAttributesReturnsAllAttributes() { @@ -666,10 +704,10 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase // URI /** - * @covers WellRESTed\Message\ServerRequest::getServerRequest - * @covers WellRESTed\Message\ServerRequest::getServerRequestHeaders - * @covers WellRESTed\Message\ServerRequest::readFromServerRequest - * @covers WellRESTed\Message\ServerRequest::readUri + * @covers ::getServerRequest + * @covers ::getServerRequestHeaders + * @covers ::readFromServerRequest + * @covers ::readUri * @preserveGlobalState disabled * @dataProvider uriProvider */