123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193 |
- <?php
- /**
- * 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\IConfig;
- use OCP\IRequest;
- use Test\TestCase;
- class IconControllerTest extends TestCase {
- /** @var IRequest|\PHPUnit\Framework\MockObject\MockObject */
- private $request;
- /** @var ThemingDefaults|\PHPUnit\Framework\MockObject\MockObject */
- private $themingDefaults;
- /** @var \OCP\AppFramework\Utility\ITimeFactory */
- private $timeFactory;
- /** @var IconController|\PHPUnit\Framework\MockObject\MockObject */
- private $iconController;
- /** @var IConfig|\PHPUnit\Framework\MockObject\MockObject */
- private $config;
- /** @var IconBuilder|\PHPUnit\Framework\MockObject\MockObject */
- private $iconBuilder;
- /** @var FileAccessHelper|\PHPUnit\Framework\MockObject\MockObject */
- private $fileAccessHelper;
- /** @var IAppManager|\PHPUnit\Framework\MockObject\MockObject */
- private $appManager;
- /** @var ImageManager */
- private $imageManager;
- 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() {
- $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() {
- 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')
- ->will($this->throwException(new NotFoundException()));
- $this->imageManager->expects($this->any())
- ->method('shouldReplaceIcons')
- ->willReturn(true);
- $this->imageManager->expects($this->once())
- ->method('getCachedImage')
- ->will($this->throwException(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() {
- $this->imageManager->expects($this->once())
- ->method('getImage')
- ->with('favicon', false)
- ->will($this->throwException(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() {
- 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')
- ->will($this->throwException(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')
- ->will($this->throwException(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() {
- $this->imageManager->expects($this->once())
- ->method('getImage')
- ->with('favicon')
- ->will($this->throwException(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());
- }
- }
|