281 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			281 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| namespace GuzzleHttp\Tests\Psr7;
 | |
| 
 | |
| use ReflectionProperty;
 | |
| use GuzzleHttp\Psr7\Stream;
 | |
| use GuzzleHttp\Psr7\UploadedFile;
 | |
| 
 | |
| /**
 | |
|  * @covers GuzzleHttp\Psr7\UploadedFile
 | |
|  */
 | |
| class UploadedFileTest extends \PHPUnit_Framework_TestCase
 | |
| {
 | |
|     protected $cleanup;
 | |
| 
 | |
|     public function setUp()
 | |
|     {
 | |
|         $this->cleanup = [];
 | |
|     }
 | |
| 
 | |
|     public function tearDown()
 | |
|     {
 | |
|         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->setExpectedException('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->setExpectedException('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->setExpectedException('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->setExpectedException('InvalidArgumentException', 'filename');
 | |
| 
 | |
|         new UploadedFile(fopen('php://temp', 'wb+'), 0, UPLOAD_ERR_OK, $filename);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @dataProvider invalidFilenamesAndMediaTypes
 | |
|      */
 | |
|     public function testRaisesExceptionOnInvalidClientMediaType($mediaType)
 | |
|     {
 | |
|         $this->setExpectedException('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);
 | |
| 
 | |
|         $this->assertSame($stream, $upload->getStream());
 | |
|     }
 | |
| 
 | |
|     public function testGetStreamReturnsWrappedPhpStream()
 | |
|     {
 | |
|         $stream = fopen('php://temp', 'wb+');
 | |
|         $upload = new UploadedFile($stream, 0, UPLOAD_ERR_OK);
 | |
|         $uploadStream = $upload->getStream()->detach();
 | |
| 
 | |
|         $this->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);
 | |
| 
 | |
|         $this->assertSame($stream, $r->getValue($uploadStream));
 | |
|     }
 | |
| 
 | |
|     public function testSuccessful()
 | |
|     {
 | |
|         $stream = \GuzzleHttp\Psr7\stream_for('Foo bar!');
 | |
|         $upload = new UploadedFile($stream, $stream->getSize(), UPLOAD_ERR_OK, 'filename.txt', 'text/plain');
 | |
| 
 | |
|         $this->assertEquals($stream->getSize(), $upload->getSize());
 | |
|         $this->assertEquals('filename.txt', $upload->getClientFilename());
 | |
|         $this->assertEquals('text/plain', $upload->getClientMediaType());
 | |
| 
 | |
|         $this->cleanup[] = $to = tempnam(sys_get_temp_dir(), 'successful');
 | |
|         $upload->moveTo($to);
 | |
|         $this->assertFileExists($to);
 | |
|         $this->assertEquals($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\stream_for('Foo bar!');
 | |
|         $upload = new UploadedFile($stream, 0, UPLOAD_ERR_OK);
 | |
| 
 | |
|         $this->cleanup[] = $path;
 | |
| 
 | |
|         $this->setExpectedException('InvalidArgumentException', 'path');
 | |
|         $upload->moveTo($path);
 | |
|     }
 | |
| 
 | |
|     public function testMoveCannotBeCalledMoreThanOnce()
 | |
|     {
 | |
|         $stream = \GuzzleHttp\Psr7\stream_for('Foo bar!');
 | |
|         $upload = new UploadedFile($stream, 0, UPLOAD_ERR_OK);
 | |
| 
 | |
|         $this->cleanup[] = $to = tempnam(sys_get_temp_dir(), 'diac');
 | |
|         $upload->moveTo($to);
 | |
|         $this->assertTrue(file_exists($to));
 | |
| 
 | |
|         $this->setExpectedException('RuntimeException', 'moved');
 | |
|         $upload->moveTo($to);
 | |
|     }
 | |
| 
 | |
|     public function testCannotRetrieveStreamAfterMove()
 | |
|     {
 | |
|         $stream = \GuzzleHttp\Psr7\stream_for('Foo bar!');
 | |
|         $upload = new UploadedFile($stream, 0, UPLOAD_ERR_OK);
 | |
| 
 | |
|         $this->cleanup[] = $to = tempnam(sys_get_temp_dir(), 'diac');
 | |
|         $upload->moveTo($to);
 | |
|         $this->assertFileExists($to);
 | |
| 
 | |
|         $this->setExpectedException('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);
 | |
|         $this->assertSame($status, $uploadedFile->getError());
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @dataProvider nonOkErrorStatus
 | |
|      */
 | |
|     public function testMoveToRaisesExceptionWhenErrorStatusPresent($status)
 | |
|     {
 | |
|         $uploadedFile = new UploadedFile('not ok', 0, $status);
 | |
|         $this->setExpectedException('RuntimeException', 'upload error');
 | |
|         $uploadedFile->moveTo(__DIR__ . '/' . uniqid());
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @dataProvider nonOkErrorStatus
 | |
|      */
 | |
|     public function testGetStreamRaisesExceptionWhenErrorStatusPresent($status)
 | |
|     {
 | |
|         $uploadedFile = new UploadedFile('not ok', 0, $status);
 | |
|         $this->setExpectedException('RuntimeException', 'upload error');
 | |
|         $stream = $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);
 | |
| 
 | |
|         $this->assertFileEquals(__FILE__, $to);
 | |
|     }
 | |
| }
 | 
