Update ServerRequest:: addUploadedFilesToBranch to allow associate array at last level of $_FILES

This commit is contained in:
PJ Dietz 2015-05-02 13:27:38 -04:00
parent a93b37a548
commit 81055c3bd9
2 changed files with 110 additions and 64 deletions

View File

@ -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
*/

View File

@ -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
*/