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); } }