288 lines
8.3 KiB
PHP
288 lines
8.3 KiB
PHP
<?php
|
|
|
|
namespace GuzzleHttp\Tests\Psr7;
|
|
|
|
use GuzzleHttp\Psr7\Stream;
|
|
use GuzzleHttp\Psr7\UploadedFile;
|
|
use ReflectionProperty;
|
|
|
|
/**
|
|
* @covers GuzzleHttp\Psr7\UploadedFile
|
|
*/
|
|
class UploadedFileTest extends BaseTest
|
|
{
|
|
private $cleanup;
|
|
|
|
/**
|
|
* @before
|
|
*/
|
|
public function setUpTest()
|
|
{
|
|
$this->cleanup = [];
|
|
}
|
|
|
|
/**
|
|
* @after
|
|
*/
|
|
public function tearDownTest()
|
|
{
|
|
foreach ($this->cleanup as $file) {
|
|
if (is_scalar($file) && file_exists($file)) {
|
|
unlink($file);
|
|
}
|
|
}
|
|
}
|
|
|
|
public function invalidStreams()
|
|
{
|
|
return [
|
|
'null' => [null],
|
|
'true' => [true],
|
|
'false' => [false],
|
|
'int' => [1],
|
|
'float' => [1.1],
|
|
'array' => [['filename']],
|
|
'object' => [(object) ['filename']],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @dataProvider invalidStreams
|
|
*/
|
|
public function testRaisesExceptionOnInvalidStreamOrFile($streamOrFile)
|
|
{
|
|
$this->expectExceptionGuzzle('InvalidArgumentException');
|
|
|
|
new UploadedFile($streamOrFile, 0, UPLOAD_ERR_OK);
|
|
}
|
|
|
|
public function invalidSizes()
|
|
{
|
|
return [
|
|
'null' => [null],
|
|
'float' => [1.1],
|
|
'array' => [[1]],
|
|
'object' => [(object) [1]],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @dataProvider invalidSizes
|
|
*/
|
|
public function testRaisesExceptionOnInvalidSize($size)
|
|
{
|
|
$this->expectExceptionGuzzle('InvalidArgumentException', 'size');
|
|
|
|
new UploadedFile(fopen('php://temp', 'wb+'), $size, UPLOAD_ERR_OK);
|
|
}
|
|
|
|
public function invalidErrorStatuses()
|
|
{
|
|
return [
|
|
'null' => [null],
|
|
'true' => [true],
|
|
'false' => [false],
|
|
'float' => [1.1],
|
|
'string' => ['1'],
|
|
'array' => [[1]],
|
|
'object' => [(object) [1]],
|
|
'negative' => [-1],
|
|
'too-big' => [9],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @dataProvider invalidErrorStatuses
|
|
*/
|
|
public function testRaisesExceptionOnInvalidErrorStatus($status)
|
|
{
|
|
$this->expectExceptionGuzzle('InvalidArgumentException', 'status');
|
|
|
|
new UploadedFile(fopen('php://temp', 'wb+'), 0, $status);
|
|
}
|
|
|
|
public function invalidFilenamesAndMediaTypes()
|
|
{
|
|
return [
|
|
'true' => [true],
|
|
'false' => [false],
|
|
'int' => [1],
|
|
'float' => [1.1],
|
|
'array' => [['string']],
|
|
'object' => [(object) ['string']],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @dataProvider invalidFilenamesAndMediaTypes
|
|
*/
|
|
public function testRaisesExceptionOnInvalidClientFilename($filename)
|
|
{
|
|
$this->expectExceptionGuzzle('InvalidArgumentException', 'filename');
|
|
|
|
new UploadedFile(fopen('php://temp', 'wb+'), 0, UPLOAD_ERR_OK, $filename);
|
|
}
|
|
|
|
/**
|
|
* @dataProvider invalidFilenamesAndMediaTypes
|
|
*/
|
|
public function testRaisesExceptionOnInvalidClientMediaType($mediaType)
|
|
{
|
|
$this->expectExceptionGuzzle('InvalidArgumentException', 'media type');
|
|
|
|
new UploadedFile(fopen('php://temp', 'wb+'), 0, UPLOAD_ERR_OK, 'foobar.baz', $mediaType);
|
|
}
|
|
|
|
public function testGetStreamReturnsOriginalStreamObject()
|
|
{
|
|
$stream = new Stream(fopen('php://temp', 'r'));
|
|
$upload = new UploadedFile($stream, 0, UPLOAD_ERR_OK);
|
|
|
|
self::assertSame($stream, $upload->getStream());
|
|
}
|
|
|
|
public function testGetStreamReturnsWrappedPhpStream()
|
|
{
|
|
$stream = fopen('php://temp', 'wb+');
|
|
$upload = new UploadedFile($stream, 0, UPLOAD_ERR_OK);
|
|
$uploadStream = $upload->getStream()->detach();
|
|
|
|
self::assertSame($stream, $uploadStream);
|
|
}
|
|
|
|
public function testGetStreamReturnsStreamForFile()
|
|
{
|
|
$this->cleanup[] = $stream = tempnam(sys_get_temp_dir(), 'stream_file');
|
|
$upload = new UploadedFile($stream, 0, UPLOAD_ERR_OK);
|
|
$uploadStream = $upload->getStream();
|
|
$r = new ReflectionProperty($uploadStream, 'filename');
|
|
$r->setAccessible(true);
|
|
|
|
self::assertSame($stream, $r->getValue($uploadStream));
|
|
}
|
|
|
|
public function testSuccessful()
|
|
{
|
|
$stream = \GuzzleHttp\Psr7\Utils::streamFor('Foo bar!');
|
|
$upload = new UploadedFile($stream, $stream->getSize(), UPLOAD_ERR_OK, 'filename.txt', 'text/plain');
|
|
|
|
self::assertSame($stream->getSize(), $upload->getSize());
|
|
self::assertSame('filename.txt', $upload->getClientFilename());
|
|
self::assertSame('text/plain', $upload->getClientMediaType());
|
|
|
|
$this->cleanup[] = $to = tempnam(sys_get_temp_dir(), 'successful');
|
|
$upload->moveTo($to);
|
|
self::assertFileExists($to);
|
|
self::assertSame($stream->__toString(), file_get_contents($to));
|
|
}
|
|
|
|
public function invalidMovePaths()
|
|
{
|
|
return [
|
|
'null' => [null],
|
|
'true' => [true],
|
|
'false' => [false],
|
|
'int' => [1],
|
|
'float' => [1.1],
|
|
'empty' => [''],
|
|
'array' => [['filename']],
|
|
'object' => [(object) ['filename']],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @dataProvider invalidMovePaths
|
|
*/
|
|
public function testMoveRaisesExceptionForInvalidPath($path)
|
|
{
|
|
$stream = \GuzzleHttp\Psr7\Utils::streamFor('Foo bar!');
|
|
$upload = new UploadedFile($stream, 0, UPLOAD_ERR_OK);
|
|
|
|
$this->cleanup[] = $path;
|
|
|
|
$this->expectExceptionGuzzle('InvalidArgumentException', 'path');
|
|
$upload->moveTo($path);
|
|
}
|
|
|
|
public function testMoveCannotBeCalledMoreThanOnce()
|
|
{
|
|
$stream = \GuzzleHttp\Psr7\Utils::streamFor('Foo bar!');
|
|
$upload = new UploadedFile($stream, 0, UPLOAD_ERR_OK);
|
|
|
|
$this->cleanup[] = $to = tempnam(sys_get_temp_dir(), 'diac');
|
|
$upload->moveTo($to);
|
|
self::assertFileExists($to);
|
|
|
|
$this->expectExceptionGuzzle('RuntimeException', 'moved');
|
|
$upload->moveTo($to);
|
|
}
|
|
|
|
public function testCannotRetrieveStreamAfterMove()
|
|
{
|
|
$stream = \GuzzleHttp\Psr7\Utils::streamFor('Foo bar!');
|
|
$upload = new UploadedFile($stream, 0, UPLOAD_ERR_OK);
|
|
|
|
$this->cleanup[] = $to = tempnam(sys_get_temp_dir(), 'diac');
|
|
$upload->moveTo($to);
|
|
self::assertFileExists($to);
|
|
|
|
$this->expectExceptionGuzzle('RuntimeException', 'moved');
|
|
$upload->getStream();
|
|
}
|
|
|
|
public function nonOkErrorStatus()
|
|
{
|
|
return [
|
|
'UPLOAD_ERR_INI_SIZE' => [ UPLOAD_ERR_INI_SIZE ],
|
|
'UPLOAD_ERR_FORM_SIZE' => [ UPLOAD_ERR_FORM_SIZE ],
|
|
'UPLOAD_ERR_PARTIAL' => [ UPLOAD_ERR_PARTIAL ],
|
|
'UPLOAD_ERR_NO_FILE' => [ UPLOAD_ERR_NO_FILE ],
|
|
'UPLOAD_ERR_NO_TMP_DIR' => [ UPLOAD_ERR_NO_TMP_DIR ],
|
|
'UPLOAD_ERR_CANT_WRITE' => [ UPLOAD_ERR_CANT_WRITE ],
|
|
'UPLOAD_ERR_EXTENSION' => [ UPLOAD_ERR_EXTENSION ],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @dataProvider nonOkErrorStatus
|
|
*/
|
|
public function testConstructorDoesNotRaiseExceptionForInvalidStreamWhenErrorStatusPresent($status)
|
|
{
|
|
$uploadedFile = new UploadedFile('not ok', 0, $status);
|
|
self::assertSame($status, $uploadedFile->getError());
|
|
}
|
|
|
|
/**
|
|
* @dataProvider nonOkErrorStatus
|
|
*/
|
|
public function testMoveToRaisesExceptionWhenErrorStatusPresent($status)
|
|
{
|
|
$uploadedFile = new UploadedFile('not ok', 0, $status);
|
|
$this->expectExceptionGuzzle('RuntimeException', 'upload error');
|
|
$uploadedFile->moveTo(__DIR__ . '/' . sha1(uniqid('', true)));
|
|
}
|
|
|
|
/**
|
|
* @dataProvider nonOkErrorStatus
|
|
*/
|
|
public function testGetStreamRaisesExceptionWhenErrorStatusPresent($status)
|
|
{
|
|
$uploadedFile = new UploadedFile('not ok', 0, $status);
|
|
$this->expectExceptionGuzzle('RuntimeException', 'upload error');
|
|
$uploadedFile->getStream();
|
|
}
|
|
|
|
public function testMoveToCreatesStreamIfOnlyAFilenameWasProvided()
|
|
{
|
|
$this->cleanup[] = $from = tempnam(sys_get_temp_dir(), 'copy_from');
|
|
$this->cleanup[] = $to = tempnam(sys_get_temp_dir(), 'copy_to');
|
|
|
|
copy(__FILE__, $from);
|
|
|
|
$uploadedFile = new UploadedFile($from, 100, UPLOAD_ERR_OK, basename($from), 'text/plain');
|
|
$uploadedFile->moveTo($to);
|
|
|
|
self::assertFileEquals(__FILE__, $to);
|
|
}
|
|
}
|