Skip to content

Commit

Permalink
refactor Plupload Test
Browse files Browse the repository at this point in the history
  • Loading branch information
recca0120 committed Apr 26, 2023
1 parent bd907c6 commit 714884b
Show file tree
Hide file tree
Showing 6 changed files with 65 additions and 95 deletions.
10 changes: 3 additions & 7 deletions src/ChunkFile.php
Original file line number Diff line number Diff line change
Expand Up @@ -108,24 +108,20 @@ public function appendFile($source, int $index = 0): ChunkFile
public function createUploadedFile($chunks = null, $storageFile = null)
{
$chunkFile = $this->chunkFile();

$storageFile = $storageFile ?: $this->storageFile();

if (is_null($chunks) === false) {
for ($i = 0; $i < $chunks; $i++) {
$chunk = $chunkFile.'.'.$i;
$this->files->append(
$storageFile,
$this->files->get($chunk)
);
$this->files->append($storageFile, $this->files->get($chunk));
$this->files->delete($chunk);
}
} else {
$this->files->move($chunkFile, $storageFile);
}

return $this->files->createUploadedFile(
$storageFile, $this->name, $this->getMimeType()
);
return $this->files->createUploadedFile($storageFile, $this->name, $this->files->mimeType($storageFile));
}

protected function tmpfilename(): ?string
Expand Down
3 changes: 1 addition & 2 deletions src/Filesystem.php
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,8 @@ public function createUploadedFile(string $path, string $originalName, string $m
$class = class_exists(UploadedFile::class) === true ? UploadedFile::class : SymfonyUploadedFile::class;

$mimeType = $mimeType ?: $this->mimeType($path);
$size = $size ?: $this->size($path);

return new $class($path, $originalName, $mimeType, $size, UPLOAD_ERR_OK, true);
return new $class($path, $originalName, $mimeType, UPLOAD_ERR_OK, true);
}

/**
Expand Down
9 changes: 5 additions & 4 deletions src/Plupload.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ public function receive(string $name)

$chunk = $this->request->get('chunk');
$originalName = $this->request->get('name');
$originalName = empty($originalName) ? $uploadedFile->getClientOriginalName() : $originalName;
$start = $chunk * $this->request->header('content-length');
$uuid = $this->request->get('token');
$completed = $chunk >= $chunks - 1;
Expand All @@ -39,9 +40,9 @@ public function receive(string $name)

public function completedResponse(JsonResponse $response): JsonResponse
{
$data = $response->getData();
$response->setData(['jsonrpc' => '2.0', 'result' => $data]);

return $response;
return $response->setData([
'jsonrpc' => '2.0',
'result' => $response->getData(),
]);
}
}
6 changes: 4 additions & 2 deletions src/Receiver.php
Original file line number Diff line number Diff line change
Expand Up @@ -57,13 +57,15 @@ protected function callback(UploadedFile $uploadedFile, $path, $domain): JsonRes
$clientPathInfo = $this->pathInfo($uploadedFile->getClientOriginalName());
$basePathInfo = $this->pathInfo($uploadedFile->getBasename());
$filename = md5($basePathInfo['basename']).'.'.$clientPathInfo['extension'];
$mimeType = $uploadedFile->getMimeType();
$size = $uploadedFile->getSize();
$uploadedFile->move($path, $filename);

return new JsonResponse([
'name' => $clientPathInfo['filename'].'.'.$clientPathInfo['extension'],
'tmp_name' => $path.$filename,
'type' => $uploadedFile->getMimeType(),
'size' => $uploadedFile->getSize(),
'type' => $mimeType,
'size' => $size,
'url' => $domain.$path.$filename,
]);
}
Expand Down
125 changes: 47 additions & 78 deletions tests/PluploadTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,36 +5,54 @@
use Illuminate\Contracts\Filesystem\FileNotFoundException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Http\UploadedFile;
use Mockery\Adapter\Phpunit\MockeryPHPUnitIntegration;
use Mockery as m;
use org\bovigo\vfs\vfsStream;
use PHPUnit\Framework\TestCase;
use Recca0120\Upload\ChunkFile;
use Recca0120\Upload\ChunkFileFactory;
use Recca0120\Upload\Exceptions\ChunkedResponseException;
use Recca0120\Upload\Exceptions\ResourceOpenException;
use Recca0120\Upload\Filesystem;
use Recca0120\Upload\Plupload;
use Symfony\Component\HttpFoundation\File\UploadedFile;

class PluploadTest extends TestCase
{
use MockeryPHPUnitIntegration;

public function testReceiveUploadSingleFile(): void
private $request;

private $uploadedFile;

protected function setUp(): void
{
$request = m::mock(Request::class);
$request->allows('root')->once()->andReturn('root');
$api = new Plupload(
['chunks' => $chunksPath = 'foo/', 'storage' => 'foo/'],
$request,
m::mock(Filesystem::class),
m::mock(ChunkFileFactory::class)
parent::setUp();
$root = vfsStream::setup('root', null, [
'chunks' => [],
'storage' => [],
]);

$this->uploadedFile = UploadedFile::fake()->image('test.png');

$this->request = Request::createFromGlobals();
$this->request->files->replace(['foo' => $this->uploadedFile]);

$config = ['chunks' => $root->url().'/chunks', 'storage' => $root->url().'/storage'];

$this->api = new Plupload(
$config,
$this->request,
new Filesystem(),
new ChunkFileFactory(new Filesystem())
);
$inputName = 'foo';
$request->allows('file')->once()->with($inputName)->andReturn($uploadedFile = m::mock(UploadedFile::class));
$request->allows('get')->once()->with('chunks')->andReturn('');
}

$this->assertSame($uploadedFile, $api->receive($inputName));
/**
* @throws FileNotFoundException
* @throws ResourceOpenException
*/
public function testReceiveUploadSingleFile(): void
{
$this->assertSame($this->uploadedFile, $this->api->receive('foo'));
}

/**
Expand All @@ -43,32 +61,12 @@ public function testReceiveUploadSingleFile(): void
*/
public function testReceiveChunkedFile(): void
{
$request = m::mock(Request::class);
$request->allows('root')->once()->andReturn('root');
$api = new Plupload(
['chunks' => $chunksPath = 'foo/', 'storage' => $storagePath = 'foo/'],
$request,
$files = m::mock(Filesystem::class),
$chunkFileFactory = m::mock(ChunkFileFactory::class)
);
$files->allows('isDirectory')->twice()->andReturn(true);

$inputName = 'foo';
$request->allows('file')->once()->with($inputName)->andReturn($uploadedFile = m::mock(UploadedFile::class));
$request->allows('get')->once()->with('chunks')->andReturn($chunks = 8);
$request->allows('get')->once()->with('chunk')->andReturn($chunk = 8);
$request->allows('get')->once()->with('name')->andReturn($originalName = 'foo.php');
$uploadedFile->allows('getPathname')->once()->andReturn($pathname = 'foo');
$request->allows('header')->once()->with('content-length')->andReturn($contentLength = 1049073);
$request->allows('get')->once()->with('token')->andReturn($token = 'foo');
$this->request->replace(['chunk' => 0, 'chunks' => 1, 'name' => '']);
$this->request->headers->replace(['content-length' => $this->uploadedFile->getSize()]);

$chunkFileFactory->allows('create')->once()->with($originalName, $chunksPath, $storagePath, $token,
null)->andReturn($chunkFile = m::mock(ChunkFile::class));
$uploadedFile = $this->api->receive('foo');

$chunkFile->allows('appendStream')->once()->with($pathname, $chunk * $contentLength)->andReturnSelf();
$chunkFile->allows('createUploadedFile')->once()->andReturn($uploadedFile = m::mock(UploadedFile::class));

$this->assertSame($uploadedFile, $api->receive($inputName));
self::assertEquals($this->uploadedFile->getSize(), $uploadedFile->getSize());
}

/**
Expand All @@ -80,50 +78,21 @@ public function testReceiveChunkedFileAndThrowChunkedResponseException(): void
$this->expectException(ChunkedResponseException::class);
$this->expectExceptionMessage('');

$request = m::mock(Request::class);
$request->allows('root')->once()->andReturn($root = 'root');
$api = new Plupload(
['chunks' => $chunksPath = 'foo/', 'storage' => $storagePath = 'foo/'],
$request,
$files = m::mock(Filesystem::class),
$chunkFileFactory = m::mock(ChunkFileFactory::class)
);
$files->allows('isDirectory')->twice()->andReturn(true);

$inputName = 'foo';
$request->allows('file')->once()->with($inputName)->andReturn($uploadedFile = m::mock(UploadedFile::class));
$request->allows('get')->once()->with('chunks')->andReturn(8);
$request->allows('get')->once()->with('chunk')->andReturn($chunk = 6);
$request->allows('get')->once()->with('name')->andReturn($originalName = 'foo.php');
$uploadedFile->allows('getPathname')->once()->andReturn($pathname = 'foo');
$request->allows('header')->once()->with('content-length')->andReturn($contentLength = 1049073);

$request->allows('get')->once()->with('token')->andReturn($token = 'foo');

$chunkFileFactory->allows('create')
->once()
->with($originalName, $chunksPath, $storagePath, $token, null)
->andReturn($chunkFile = m::mock(ChunkFile::class));
$this->request->replace(['chunk' => 0, 'chunks' => 2]);
$this->request->headers->replace(['content-length' => $this->uploadedFile->getSize()]);

$chunkFile->allows('appendStream')->once()->with($pathname, $chunk * $contentLength)->andReturnSelf();

$api->receive($inputName);
$this->api->receive('foo');
}

/**
* @throws FileNotFoundException
* @throws ResourceOpenException
*/
public function testCompletedResponse()
{
$request = m::mock(Request::class);
$request->allows('root')->once()->andReturn('root');
$api = new Plupload(
['chunks' => 'foo/', 'storage' => 'foo/'],
$request,
m::mock(Filesystem::class),
m::mock(ChunkFileFactory::class)
);
$response = m::mock(JsonResponse::class);
$response->allows('getData')->once()->andReturn($data = []);
$response->allows('setData')->once()->with(['jsonrpc' => '2.0', 'result' => $data])->andReturnSelf();
$this->api->receive('foo');
$response = $this->api->completedResponse(new JsonResponse());

$this->assertSame($response, $api->completedResponse($response));
self::assertEquals('{"jsonrpc":"2.0","result":{}}', $response->getContent());
}
}
7 changes: 5 additions & 2 deletions tests/ReceiverTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,13 @@ public function testReceive(): void
$uploadedFile->allows('getBasename')->once()->andReturn($basename = 'foo');
$uploadedFile->allows('getMimeType')->once()->andReturn($mimeType = 'foo');
$uploadedFile->allows('getSize')->once()->andReturn($size = 1000);
$uploadedFile->allows('move')->once()->with($path, $filename = md5($basename).'.'.strtolower($clientOriginalExtension));
$uploadedFile->allows('move')->once()->with($path,
$filename = md5($basename).'.'.strtolower($clientOriginalExtension));

$api->allows('deleteUploadedFile')->once()->with($uploadedFile)->andReturnSelf();
$api->allows('completedResponse')->once()->with(m::type(JsonResponse::class))->andReturnUsing(function ($response) {
$api->allows('completedResponse')->once()->with(m::type(JsonResponse::class))->andReturnUsing(function (
$response
) {
return $response;
});

Expand Down

0 comments on commit 714884b

Please sign in to comment.