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 4f1576b
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 89 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->getMimeType());
}

protected function tmpfilename(): ?string
Expand Down
6 changes: 4 additions & 2 deletions src/Plupload.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,12 @@ 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;
dump($chunk, $chunks);
dump($completed);

$chunkFile = $this->createChunkFile($originalName, $uuid);
$chunkFile->appendStream($uploadedFile->getPathname(), $start);
Expand All @@ -39,8 +42,7 @@ public function receive(string $name)

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

return $response;
}
Expand Down
127 changes: 49 additions & 78 deletions tests/PluploadTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,36 +5,56 @@
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 $root;

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();
$this->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]);

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

$this->api = new Plupload(
$this->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 +63,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');

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

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

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

/**
Expand All @@ -80,50 +80,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');
$this->request->replace(['chunk' => 0, 'chunks' => 2]);
$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));

$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 4f1576b

Please sign in to comment.