diff options
author | Lukas Reschke <lukas@statuscode.ch> | 2016-11-03 21:07:16 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-11-03 21:07:16 +0100 |
commit | c0bbae28f0bb1041a22645691fe653c642f0d1cb (patch) | |
tree | c75e0f48a2c0c44af5eca2062592855d044f1f10 /tests/lib | |
parent | 8bf57462ea52cc2f4300b6fa097ae23100882c83 (diff) | |
parent | f44cd7aed37d84137902ce8f65aabd115ae1adef (diff) | |
download | nextcloud-server-c0bbae28f0bb1041a22645691fe653c642f0d1cb.tar.gz nextcloud-server-c0bbae28f0bb1041a22645691fe653c642f0d1cb.zip |
Merge pull request #1741 from nextcloud/new_preview
Improve previews
Diffstat (limited to 'tests/lib')
-rw-r--r-- | tests/lib/Preview/GeneratorTest.php | 338 | ||||
-rw-r--r-- | tests/lib/UrlGeneratorTest.php | 2 |
2 files changed, 339 insertions, 1 deletions
diff --git a/tests/lib/Preview/GeneratorTest.php b/tests/lib/Preview/GeneratorTest.php new file mode 100644 index 00000000000..d64a0b912e1 --- /dev/null +++ b/tests/lib/Preview/GeneratorTest.php @@ -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); + } +} diff --git a/tests/lib/UrlGeneratorTest.php b/tests/lib/UrlGeneratorTest.php index c8d5b8ece2c..28fd2d336d2 100644 --- a/tests/lib/UrlGeneratorTest.php +++ b/tests/lib/UrlGeneratorTest.php @@ -63,7 +63,7 @@ class UrlGeneratorTest extends \Test\TestCase { public function provideRoutes() { return array( array('files_ajax_list', 'http://localhost/owncloud/index.php/apps/files/ajax/list.php'), - array('core_ajax_preview', 'http://localhost/owncloud/index.php/core/preview.png'), + array('core.Preview.getPreview', 'http://localhost/owncloud/index.php/core/preview.png'), ); } |