diff options
Diffstat (limited to 'apps/theming/tests/Controller/IconControllerTest.php')
-rw-r--r-- | apps/theming/tests/Controller/IconControllerTest.php | 185 |
1 files changed, 185 insertions, 0 deletions
diff --git a/apps/theming/tests/Controller/IconControllerTest.php b/apps/theming/tests/Controller/IconControllerTest.php new file mode 100644 index 00000000000..c5034600e03 --- /dev/null +++ b/apps/theming/tests/Controller/IconControllerTest.php @@ -0,0 +1,185 @@ +<?php + +declare(strict_types=1); +/** + * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming\Tests\Controller; + +use OC\Files\SimpleFS\SimpleFile; +use OC\IntegrityCheck\Helpers\FileAccessHelper; +use OCA\Theming\Controller\IconController; +use OCA\Theming\IconBuilder; +use OCA\Theming\ImageManager; +use OCA\Theming\ThemingDefaults; +use OCP\App\IAppManager; +use OCP\AppFramework\Http; +use OCP\AppFramework\Http\DataDisplayResponse; +use OCP\AppFramework\Http\FileDisplayResponse; +use OCP\AppFramework\Utility\ITimeFactory; +use OCP\Files\NotFoundException; +use OCP\IRequest; +use PHPUnit\Framework\MockObject\MockObject; +use Test\TestCase; + +class IconControllerTest extends TestCase { + private IRequest&MockObject $request; + private ThemingDefaults&MockObject $themingDefaults; + private ITimeFactory&MockObject $timeFactory; + private IconBuilder&MockObject $iconBuilder; + private FileAccessHelper&MockObject $fileAccessHelper; + private IAppManager&MockObject $appManager; + private ImageManager&MockObject $imageManager; + private IconController $iconController; + + protected function setUp(): void { + $this->request = $this->createMock(IRequest::class); + $this->themingDefaults = $this->createMock(ThemingDefaults::class); + $this->iconBuilder = $this->createMock(IconBuilder::class); + $this->imageManager = $this->createMock(ImageManager::class); + $this->fileAccessHelper = $this->createMock(FileAccessHelper::class); + $this->appManager = $this->createMock(IAppManager::class); + + $this->timeFactory = $this->createMock(ITimeFactory::class); + $this->timeFactory->expects($this->any()) + ->method('getTime') + ->willReturn(123); + + $this->overwriteService(ITimeFactory::class, $this->timeFactory); + + $this->iconController = new IconController( + 'theming', + $this->request, + $this->themingDefaults, + $this->iconBuilder, + $this->imageManager, + $this->fileAccessHelper, + $this->appManager, + ); + + parent::setUp(); + } + + private function iconFileMock($filename, $data) { + $icon = $this->getMockBuilder('OCP\Files\File')->getMock(); + $icon->expects($this->any())->method('getContent')->willReturn($data); + $icon->expects($this->any())->method('getMimeType')->willReturn('image type'); + $icon->expects($this->any())->method('getEtag')->willReturn('my etag'); + $icon->expects($this->any())->method('getName')->willReturn('my name'); + $icon->expects($this->any())->method('getMTime')->willReturn(42); + $icon->method('getName')->willReturn($filename); + return new SimpleFile($icon); + } + + public function testGetThemedIcon(): void { + $file = $this->iconFileMock('icon-core-filetypes_folder.svg', 'filecontent'); + $this->imageManager->expects($this->once()) + ->method('getCachedImage') + ->with('icon-core-filetypes_folder.svg') + ->willReturn($file); + $expected = new FileDisplayResponse($file, Http::STATUS_OK, ['Content-Type' => 'image/svg+xml']); + $expected->cacheFor(86400, false, true); + $this->assertEquals($expected, $this->iconController->getThemedIcon('core', 'filetypes/folder.svg')); + } + + public function testGetFaviconDefault(): void { + if (!extension_loaded('imagick')) { + $this->markTestSkipped('Imagemagick is required for dynamic icon generation.'); + } + $checkImagick = new \Imagick(); + if (count($checkImagick->queryFormats('SVG')) < 1) { + $this->markTestSkipped('No SVG provider present.'); + } + $file = $this->iconFileMock('filename', 'filecontent'); + $this->imageManager->expects($this->once()) + ->method('getImage', false) + ->with('favicon') + ->willThrowException(new NotFoundException()); + $this->imageManager->expects($this->any()) + ->method('shouldReplaceIcons') + ->willReturn(true); + $this->imageManager->expects($this->once()) + ->method('getCachedImage') + ->willThrowException(new NotFoundException()); + $this->iconBuilder->expects($this->once()) + ->method('getFavicon') + ->with('core') + ->willReturn('filecontent'); + $this->imageManager->expects($this->once()) + ->method('setCachedImage') + ->willReturn($file); + + $expected = new FileDisplayResponse($file, Http::STATUS_OK, ['Content-Type' => 'image/x-icon']); + $expected->cacheFor(86400); + $this->assertEquals($expected, $this->iconController->getFavicon()); + } + + public function testGetFaviconFail(): void { + $this->imageManager->expects($this->once()) + ->method('getImage') + ->with('favicon', false) + ->willThrowException(new NotFoundException()); + $this->imageManager->expects($this->any()) + ->method('shouldReplaceIcons') + ->willReturn(false); + $fallbackLogo = \OC::$SERVERROOT . '/core/img/favicon.png'; + $this->fileAccessHelper->expects($this->once()) + ->method('file_get_contents') + ->with($fallbackLogo) + ->willReturn(file_get_contents($fallbackLogo)); + $expected = new DataDisplayResponse(file_get_contents($fallbackLogo), Http::STATUS_OK, ['Content-Type' => 'image/x-icon']); + $expected->cacheFor(86400); + $this->assertEquals($expected, $this->iconController->getFavicon()); + } + + public function testGetTouchIconDefault(): void { + if (!extension_loaded('imagick')) { + $this->markTestSkipped('Imagemagick is required for dynamic icon generation.'); + } + $checkImagick = new \Imagick(); + if (count($checkImagick->queryFormats('SVG')) < 1) { + $this->markTestSkipped('No SVG provider present.'); + } + + $this->imageManager->expects($this->once()) + ->method('getImage') + ->willThrowException(new NotFoundException()); + $this->imageManager->expects($this->any()) + ->method('shouldReplaceIcons') + ->willReturn(true); + $this->iconBuilder->expects($this->once()) + ->method('getTouchIcon') + ->with('core') + ->willReturn('filecontent'); + $file = $this->iconFileMock('filename', 'filecontent'); + $this->imageManager->expects($this->once()) + ->method('getCachedImage') + ->willThrowException(new NotFoundException()); + $this->imageManager->expects($this->once()) + ->method('setCachedImage') + ->willReturn($file); + + $expected = new FileDisplayResponse($file, Http::STATUS_OK, ['Content-Type' => 'image/png']); + $expected->cacheFor(86400); + $this->assertEquals($expected, $this->iconController->getTouchIcon()); + } + + public function testGetTouchIconFail(): void { + $this->imageManager->expects($this->once()) + ->method('getImage') + ->with('favicon') + ->willThrowException(new NotFoundException()); + $this->imageManager->expects($this->any()) + ->method('shouldReplaceIcons') + ->willReturn(false); + $fallbackLogo = \OC::$SERVERROOT . '/core/img/favicon-touch.png'; + $this->fileAccessHelper->expects($this->once()) + ->method('file_get_contents') + ->with($fallbackLogo) + ->willReturn(file_get_contents($fallbackLogo)); + $expected = new DataDisplayResponse(file_get_contents($fallbackLogo), Http::STATUS_OK, ['Content-Type' => 'image/png']); + $expected->cacheFor(86400); + $this->assertEquals($expected, $this->iconController->getTouchIcon()); + } +} |