aboutsummaryrefslogtreecommitdiffstats
path: root/apps/theming/tests/Controller/IconControllerTest.php
diff options
context:
space:
mode:
Diffstat (limited to 'apps/theming/tests/Controller/IconControllerTest.php')
-rw-r--r--apps/theming/tests/Controller/IconControllerTest.php185
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());
+ }
+}