Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>pull/1741/head
parent
3d6ee7ffc9
commit
87855aa97b
@ -0,0 +1,91 @@ |
||||
<?php |
||||
/** |
||||
* @copyright Copyright (c) 2016, Roeland Jago Douma <roeland@famdouma.nl> |
||||
* |
||||
* @author Roeland Jago Douma <roeland@famdouma.nl> |
||||
* |
||||
* @license GNU AGPL version 3 or any later version |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU Affero General Public License as |
||||
* published by the Free Software Foundation, either version 3 of the |
||||
* License, or (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU Affero General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU Affero General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
||||
* |
||||
*/ |
||||
namespace OC\Preview; |
||||
|
||||
use OC\Files\View; |
||||
use OCP\Files\File; |
||||
use OCP\Files\IRootFolder; |
||||
use OCP\Files\SimpleFS\ISimpleFile; |
||||
use OCP\IImage; |
||||
use OCP\Image as img; |
||||
use OCP\Preview\IProvider; |
||||
|
||||
/** |
||||
* Very small wrapper class to make the generator fully unit testable |
||||
*/ |
||||
class GeneratorHelper { |
||||
|
||||
/** @var IRootFolder */ |
||||
private $rootFolder; |
||||
|
||||
public function __construct(IRootFolder $rootFolder) { |
||||
$this->rootFolder = $rootFolder; |
||||
} |
||||
|
||||
/** |
||||
* @param IProvider $provider |
||||
* @param File $file |
||||
* @param int $maxWidth |
||||
* @param int $maxHeight |
||||
* @return bool|IImage |
||||
*/ |
||||
public function getThumbnail(IProvider $provider, File $file, $maxWidth, $maxHeight) { |
||||
list($view, $path) = $this->getViewAndPath($file); |
||||
return $provider->getThumbnail($path, $maxWidth, $maxHeight, false, $view); |
||||
} |
||||
|
||||
/** |
||||
* @param File $file |
||||
* @return array |
||||
* This is required to create the old view and path |
||||
*/ |
||||
private function getViewAndPath(File $file) { |
||||
$owner = $file->getOwner()->getUID(); |
||||
|
||||
$userFolder = $this->rootFolder->getUserFolder($owner)->getParent(); |
||||
|
||||
$nodes = $userFolder->getById($file->getId()); |
||||
$file = $nodes[0]; |
||||
|
||||
$view = new View($userFolder->getPath()); |
||||
$path = $userFolder->getRelativePath($file->getPath()); |
||||
|
||||
return [$view, $path]; |
||||
} |
||||
|
||||
/** |
||||
* @param ISimpleFile $maxPreview |
||||
* @return IImage |
||||
*/ |
||||
public function getImage(ISimpleFile $maxPreview) { |
||||
return new img($maxPreview->getContent()); |
||||
} |
||||
|
||||
/** |
||||
* @param $provider |
||||
* @return IProvider |
||||
*/ |
||||
public function getProvider($provider) { |
||||
return $provider(); |
||||
} |
||||
} |
||||
@ -0,0 +1,338 @@ |
||||
<?php |
||||
/** |
||||
* @copyright Copyright (c) 2016, Roeland Jago Douma <roeland@famdouma.nl> |
||||
* |
||||
* @author Roeland Jago Douma <roeland@famdouma.nl> |
||||
* |
||||
* @license GNU AGPL version 3 or any later version |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU Affero General Public License as |
||||
* published by the Free Software Foundation, either version 3 of the |
||||
* License, or (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU Affero General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU Affero General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
||||
* |
||||
*/ |
||||
namespace Test\Preview; |
||||
|
||||
use OC\Preview\Generator; |
||||
use OC\Preview\GeneratorHelper; |
||||
use OCP\Files\File; |
||||
use OCP\Files\IAppData; |
||||
use OCP\Files\NotFoundException; |
||||
use OCP\Files\SimpleFS\ISimpleFile; |
||||
use OCP\Files\SimpleFS\ISimpleFolder; |
||||
use OCP\IConfig; |
||||
use OCP\IImage; |
||||
use OCP\IPreview; |
||||
use OCP\Preview\IProvider; |
||||
|
||||
class GeneratorTest extends \Test\TestCase { |
||||
|
||||
/** @var IConfig|\PHPUnit_Framework_MockObject_MockObject */ |
||||
private $config; |
||||
|
||||
/** @var IPreview|\PHPUnit_Framework_MockObject_MockObject */ |
||||
private $previewManager; |
||||
|
||||
/** @var IAppData|\PHPUnit_Framework_MockObject_MockObject */ |
||||
private $appData; |
||||
|
||||
/** @var GeneratorHelper|\PHPUnit_Framework_MockObject_MockObject */ |
||||
private $helper; |
||||
|
||||
/** @var Generator */ |
||||
private $generator; |
||||
|
||||
public function setUp() { |
||||
parent::setUp(); |
||||
|
||||
$this->config = $this->createMock(IConfig::class); |
||||
$this->previewManager = $this->createMock(IPreview::class); |
||||
$this->appData = $this->createMock(IAppData::class); |
||||
$this->helper = $this->createMock(GeneratorHelper::class); |
||||
|
||||
$this->generator = new Generator( |
||||
$this->config, |
||||
$this->previewManager, |
||||
$this->appData, |
||||
$this->helper |
||||
); |
||||
} |
||||
|
||||
public function testGetCachedPreview() { |
||||
$file = $this->createMock(File::class); |
||||
$file->method('getMimeType') |
||||
->willReturn('myMimeType'); |
||||
$file->method('getId') |
||||
->willReturn(42); |
||||
|
||||
$this->previewManager->method('isMimeSupported') |
||||
->with($this->equalTo('myMimeType')) |
||||
->willReturn(true); |
||||
|
||||
$previewFolder = $this->createMock(ISimpleFolder::class); |
||||
$this->appData->method('getFolder') |
||||
->with($this->equalTo(42)) |
||||
->willReturn($previewFolder); |
||||
|
||||
$maxPreview = $this->createMock(ISimpleFile::class); |
||||
$maxPreview->method('getName') |
||||
->willReturn('1000-1000-max.png'); |
||||
|
||||
$previewFolder->method('getDirectoryListing') |
||||
->willReturn([$maxPreview]); |
||||
|
||||
$previewFile = $this->createMock(ISimpleFile::class); |
||||
|
||||
$previewFolder->method('getFile') |
||||
->with($this->equalTo('128-128.png')) |
||||
->willReturn($previewFile); |
||||
|
||||
$result = $this->generator->getPreview($file, 100, 100); |
||||
$this->assertSame($previewFile, $result); |
||||
} |
||||
|
||||
public function testGetNewPreview() { |
||||
$file = $this->createMock(File::class); |
||||
$file->method('getMimeType') |
||||
->willReturn('myMimeType'); |
||||
$file->method('getId') |
||||
->willReturn(42); |
||||
|
||||
$this->previewManager->method('isMimeSupported') |
||||
->with($this->equalTo('myMimeType')) |
||||
->willReturn(true); |
||||
|
||||
$previewFolder = $this->createMock(ISimpleFolder::class); |
||||
$this->appData->method('getFolder') |
||||
->with($this->equalTo(42)) |
||||
->willThrowException(new NotFoundException()); |
||||
|
||||
$this->appData->method('newFolder') |
||||
->with($this->equalTo(42)) |
||||
->willReturn($previewFolder); |
||||
|
||||
$this->config->method('getSystemValue') |
||||
->will($this->returnCallback(function($key, $defult) { |
||||
return $defult; |
||||
})); |
||||
|
||||
$invalidProvider = $this->createMock(IProvider::class); |
||||
$validProvider = $this->createMock(IProvider::class); |
||||
|
||||
$this->previewManager->method('getProviders') |
||||
->willReturn([ |
||||
'/image\/png/' => ['wrongProvider'], |
||||
'/myMimeType/' => ['brokenProvider', 'invalidProvider', 'validProvider'], |
||||
]); |
||||
|
||||
$this->helper->method('getProvider') |
||||
->will($this->returnCallback(function($provider) use ($invalidProvider, $validProvider) { |
||||
if ($provider === 'wrongProvider') { |
||||
$this->fail('Wrongprovider should not be constructed!'); |
||||
} else if ($provider === 'brokenProvider') { |
||||
return false; |
||||
} else if ($provider === 'invalidProvider') { |
||||
return $invalidProvider; |
||||
} else if ($provider === 'validProvider') { |
||||
return $validProvider; |
||||
} |
||||
$this->fail('Unexpected provider requested'); |
||||
})); |
||||
|
||||
$image = $this->createMock(IImage::class); |
||||
$image->method('width')->willReturn(2048); |
||||
$image->method('height')->willReturn(2048); |
||||
|
||||
$this->helper->method('getThumbnail') |
||||
->will($this->returnCallback(function ($provider, $file, $x, $y) use ($invalidProvider, $validProvider, $image) { |
||||
if ($provider === $validProvider) { |
||||
return $image; |
||||
} else { |
||||
return false; |
||||
} |
||||
})); |
||||
|
||||
$image->method('data') |
||||
->willReturn('my data'); |
||||
|
||||
$maxPreview = $this->createMock(ISimpleFile::class); |
||||
$maxPreview->method('getName')->willReturn('2048-2048-max.png'); |
||||
|
||||
$previewFile = $this->createMock(ISimpleFile::class); |
||||
|
||||
$previewFolder->method('getDirectoryListing') |
||||
->willReturn([]); |
||||
$previewFolder->method('newFile') |
||||
->will($this->returnCallback(function($filename) use ($maxPreview, $previewFile) { |
||||
if ($filename === '2048-2048-max.png') { |
||||
return $maxPreview; |
||||
} else if ($filename === '128-128.png') { |
||||
return $previewFile; |
||||
} |
||||
$this->fail('Unexpected file'); |
||||
})); |
||||
|
||||
$maxPreview->expects($this->once()) |
||||
->method('putContent') |
||||
->with($this->equalTo('my data')); |
||||
|
||||
$previewFolder->method('getFile') |
||||
->with($this->equalTo('128-128.png')) |
||||
->willThrowException(new NotFoundException()); |
||||
|
||||
$image = $this->createMock(IImage::class); |
||||
$this->helper->method('getImage') |
||||
->with($this->equalTo($maxPreview)) |
||||
->willReturn($image); |
||||
|
||||
$image->expects($this->once()) |
||||
->method('resize') |
||||
->with(128); |
||||
$image->method('data') |
||||
->willReturn('my resized data'); |
||||
|
||||
$previewFile->expects($this->once()) |
||||
->method('putContent') |
||||
->with('my resized data'); |
||||
|
||||
$result = $this->generator->getPreview($file, 100, 100); |
||||
$this->assertSame($previewFile, $result); |
||||
} |
||||
|
||||
public function testInvalidMimeType() { |
||||
$this->expectException(NotFoundException::class); |
||||
|
||||
$file = $this->createMock(File::class); |
||||
|
||||
$this->previewManager->method('isMimeSupported') |
||||
->with('invalidType') |
||||
->willReturn(false); |
||||
|
||||
$this->generator->getPreview($file, 0, 0, true, IPreview::MODE_COVER, 'invalidType'); |
||||
} |
||||
|
||||
public function testNoProvider() { |
||||
$file = $this->createMock(File::class); |
||||
$file->method('getMimeType') |
||||
->willReturn('myMimeType'); |
||||
$file->method('getId') |
||||
->willReturn(42); |
||||
|
||||
$this->previewManager->method('isMimeSupported') |
||||
->with($this->equalTo('myMimeType')) |
||||
->willReturn(true); |
||||
|
||||
$previewFolder = $this->createMock(ISimpleFolder::class); |
||||
$this->appData->method('getFolder') |
||||
->with($this->equalTo(42)) |
||||
->willReturn($previewFolder); |
||||
|
||||
$previewFolder->method('getDirectoryListing') |
||||
->willReturn([]); |
||||
|
||||
$this->previewManager->method('getProviders') |
||||
->willReturn([]); |
||||
|
||||
$this->expectException(NotFoundException::class); |
||||
$this->generator->getPreview($file, 100, 100); |
||||
} |
||||
|
||||
public function dataSize() { |
||||
return [ |
||||
[1024, 2048, 512, 512, false, IPreview::MODE_FILL, 256, 512], |
||||
[1024, 2048, 512, 512, false, IPreview::MODE_COVER, 512, 1024], |
||||
[1024, 2048, 512, 512, true, IPreview::MODE_FILL, 512, 512], |
||||
[1024, 2048, 512, 512, true, IPreview::MODE_COVER, 512, 512], |
||||
|
||||
[1024, 2048, -1, 512, false, IPreview::MODE_COVER, 256, 512], |
||||
[1024, 2048, 512, -1, false, IPreview::MODE_FILL, 512, 1024], |
||||
|
||||
[1024, 2048, 250, 1100, true, IPreview::MODE_COVER, 256, 1126], |
||||
[1024, 1100, 250, 1100, true, IPreview::MODE_COVER, 250, 1100], |
||||
|
||||
[1024, 2048, 4096, 2048, false, IPreview::MODE_FILL, 1024, 2048], |
||||
[1024, 2048, 4096, 2048, false, IPreview::MODE_COVER, 1024, 2048], |
||||
|
||||
|
||||
[2048, 1024, 512, 512, false, IPreview::MODE_FILL, 512, 256], |
||||
[2048, 1024, 512, 512, false, IPreview::MODE_COVER, 1024, 512], |
||||
[2048, 1024, 512, 512, true, IPreview::MODE_FILL, 512, 512], |
||||
[2048, 1024, 512, 512, true, IPreview::MODE_COVER, 512, 512], |
||||
|
||||
[2048, 1024, -1, 512, false, IPreview::MODE_FILL, 1024, 512], |
||||
[2048, 1024, 512, -1, false, IPreview::MODE_COVER, 512, 256], |
||||
|
||||
[2048, 1024, 4096, 1024, true, IPreview::MODE_FILL, 2048, 512], |
||||
[2048, 1024, 4096, 1024, true, IPreview::MODE_COVER, 2048, 512], |
||||
]; |
||||
} |
||||
|
||||
/** |
||||
* @dataProvider dataSize |
||||
* |
||||
* @param int $maxX |
||||
* @param int $maxY |
||||
* @param int $reqX |
||||
* @param int $reqY |
||||
* @param bool $crop |
||||
* @param string $mode |
||||
* @param int $expectedX |
||||
* @param int $expectedY |
||||
*/ |
||||
public function testCorrectSize($maxX, $maxY, $reqX, $reqY, $crop, $mode, $expectedX, $expectedY) { |
||||
$file = $this->createMock(File::class); |
||||
$file->method('getMimeType') |
||||
->willReturn('myMimeType'); |
||||
$file->method('getId') |
||||
->willReturn(42); |
||||
|
||||
$this->previewManager->method('isMimeSupported') |
||||
->with($this->equalTo('myMimeType')) |
||||
->willReturn(true); |
||||
|
||||
$previewFolder = $this->createMock(ISimpleFolder::class); |
||||
$this->appData->method('getFolder') |
||||
->with($this->equalTo(42)) |
||||
->willReturn($previewFolder); |
||||
|
||||
$maxPreview = $this->createMock(ISimpleFile::class); |
||||
$maxPreview->method('getName') |
||||
->willReturn($maxX . '-' . $maxY . '-max.png'); |
||||
|
||||
$previewFolder->method('getDirectoryListing') |
||||
->willReturn([$maxPreview]); |
||||
|
||||
$filename = $expectedX . '-' . $expectedY; |
||||
if ($crop) { |
||||
$filename .= '-crop'; |
||||
} |
||||
$filename .= '.png'; |
||||
$previewFolder->method('getFile') |
||||
->with($this->equalTo($filename)) |
||||
->willThrowException(new NotFoundException()); |
||||
|
||||
$image = $this->createMock(IImage::class); |
||||
$this->helper->method('getImage') |
||||
->with($this->equalTo($maxPreview)) |
||||
->willReturn($image); |
||||
$image->method('height')->willReturn($maxY); |
||||
$image->method('width')->willReturn($maxX); |
||||
|
||||
$preview = $this->createMock(ISimpleFile::class); |
||||
$previewFolder->method('newFile') |
||||
->with($this->equalTo($filename)) |
||||
->willReturn($preview); |
||||
|
||||
$result = $this->generator->getPreview($file, $reqX, $reqY, $crop, $mode); |
||||
$this->assertSame($preview, $result); |
||||
} |
||||
} |
||||
Loading…
Reference in new issue