summaryrefslogtreecommitdiffstats
path: root/apps/theming
diff options
context:
space:
mode:
authorJulius Haertl <jus@bitgrid.net>2016-08-25 16:26:28 +0200
committerJulius Haertl <jus@bitgrid.net>2016-11-18 10:23:23 +0100
commitac7f852ed996079785e6b5f1c1789f76a7a26386 (patch)
tree76a498aa5ac62a2d9b77dbf0b6b77fe57f46beb0 /apps/theming
parent9ac5476c4eb4d286ae1c48996e916180e3a54035 (diff)
downloadnextcloud-server-ac7f852ed996079785e6b5f1c1789f76a7a26386.tar.gz
nextcloud-server-ac7f852ed996079785e6b5f1c1789f76a7a26386.zip
Theming: Add IconController tests
Signed-off-by: Julius Haertl <jus@bitgrid.net>
Diffstat (limited to 'apps/theming')
-rw-r--r--apps/theming/lib/Controller/IconController.php25
-rw-r--r--apps/theming/tests/Controller/IconControllerTest.php201
2 files changed, 207 insertions, 19 deletions
diff --git a/apps/theming/lib/Controller/IconController.php b/apps/theming/lib/Controller/IconController.php
index 716d590fe55..56782992ab3 100644
--- a/apps/theming/lib/Controller/IconController.php
+++ b/apps/theming/lib/Controller/IconController.php
@@ -136,7 +136,6 @@ class IconController extends Controller {
*/
public function getTouchIcon($app="core") {
$icon = $this->renderAppIcon($app);
- $icon->resizeImage(512, 512, Imagick::FILTER_LANCZOS, 1);
$icon->setImageFormat("png24");
$response = new DataDisplayResponse($icon, Http::STATUS_OK, ['Content-Type' => 'image/png']);
@@ -156,6 +155,7 @@ class IconController extends Controller {
$appIcon = $this->getAppIcon($app);
$color = $this->themingDefaults->getMailHeaderColor();
$mime = mime_content_type($appIcon);
+ // FIXME: test if we need this
if ($color === "") {
$color = '#0082c9';
}
@@ -169,10 +169,7 @@ class IconController extends Controller {
// resize svg magic as this seems broken in Imagemagick
if($mime === "image/svg+xml") {
$svg = file_get_contents($appIcon);
- if ($this->util->invertTextColor($color)) {
- $svg = $this->svgInvert($svg);
- }
-
+
$tmp = new Imagick();
$tmp->readImageBlob($svg);
$x = $tmp->getImageWidth();
@@ -211,6 +208,8 @@ class IconController extends Controller {
$finalIconFile->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_TRANSPARENT);
$finalIconFile->setImageArtifact('compose:args', "1,0,-0.5,0.5");
$finalIconFile->compositeImage($appIconFile, Imagick::COMPOSITE_ATOP, $offset_w, $offset_h);
+ $finalIconFile->resizeImage(512, 512, Imagick::FILTER_LANCZOS, 1);
+
$appIconFile->destroy();
return $finalIconFile;
}
@@ -272,21 +271,9 @@ class IconController extends Controller {
if(file_exists($icon)) {
return $icon;
}
+ return false;
}
-
- /**
- * replace black with white and white with black
- *
- * @param $svg content of a svg file
- * @return string
- */
- private function svgInvert($svg) {
- $svg = preg_replace('/#(f{3,6})/i', '#REPLACECOLOR', $svg);
- $svg = preg_replace('/#(0{3,6})/i', '#ffffff', $svg);
- $svg = preg_replace('/#(REPLACECOLOR)/i', '#000000', $svg);
- return $svg;
- }
-
+
/**
* replace default color with a custom one
*
diff --git a/apps/theming/tests/Controller/IconControllerTest.php b/apps/theming/tests/Controller/IconControllerTest.php
new file mode 100644
index 00000000000..e22369aa744
--- /dev/null
+++ b/apps/theming/tests/Controller/IconControllerTest.php
@@ -0,0 +1,201 @@
+<?php
+/**
+ * @copyright Copyright (c) 2016 Julius Härtl <jus@bitgrid.net>
+ *
+ * @author Julius Haertl <jus@bitgrid.net>
+ *
+ * @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 OCA\Theming\Tests\Controller;
+
+use OCA\Theming\Controller\IconController;
+use OCA\Theming\Util;
+use OCP\AppFramework\Http;
+use OCP\AppFramework\Http\DataResponse;
+use OCP\AppFramework\Http\DataDisplayResponse;
+use OCP\Files\IRootFolder;
+use OCP\IConfig;
+use OCP\IL10N;
+use OCP\IRequest;
+use Test\TestCase;
+use OCA\Theming\ThemingDefaults;
+use \Imagick;
+
+class ThemingControllerTest extends TestCase {
+ /** @var IRequest|\PHPUnit_Framework_MockObject_MockObject */
+ private $request;
+ /** @var IConfig|\PHPUnit_Framework_MockObject_MockObject */
+ private $config;
+ /** @var ThemingDefaults|\PHPUnit_Framework_MockObject_MockObject */
+ private $themingDefaults;
+ /** @var Util */
+ private $util;
+ /** @var \OCP\AppFramework\Utility\ITimeFactory */
+ private $timeFactory;
+ /** @var IL10N|\PHPUnit_Framework_MockObject_MockObject */
+ private $l10n;
+ /** @var IconController */
+ private $iconController;
+ /** @var IRootFolder|\PHPUnit_Framework_MockObject_MockObject */
+ private $rootFolder;
+
+ public function setUp() {
+ $this->request = $this->getMockBuilder('OCP\IRequest')->getMock();
+ $this->config = $this->getMockBuilder('OCP\IConfig')->getMock();
+ $this->themingDefaults = $this->getMockBuilder('OCA\Theming\ThemingDefaults')
+ ->disableOriginalConstructor()->getMock();
+ $this->util = new Util();
+ $this->timeFactory = $this->getMockBuilder('OCP\AppFramework\Utility\ITimeFactory')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $this->l10n = $this->getMockBuilder('OCP\IL10N')->getMock();
+ $this->rootFolder = $this->getMockBuilder('OCP\Files\IRootFolder')->getMock();
+
+ $this->timeFactory->expects($this->any())
+ ->method('getTime')
+ ->willReturn(123);
+
+ $this->iconController = new IconController(
+ 'theming',
+ $this->request,
+ $this->config,
+ $this->themingDefaults,
+ $this->util,
+ $this->timeFactory,
+ $this->l10n,
+ $this->rootFolder
+ );
+
+ return parent::setUp();
+ }
+
+ public function testGetThemedIcon() {
+ $this->themingDefaults
+ ->expects($this->once())
+ ->method('getMailHeaderColor')
+ ->willReturn('#000000');
+ $svg = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>
+<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"16\" width=\"16\" version=\"1.0\">
+ <g fill-rule=\"evenodd\" transform=\"matrix(.86667 0 0 .86667 -172.05 -864.43)\" fill=\"#000000\">
+ <path d=\"m200.2 999.72c-0.28913 0-0.53125 0.2421-0.53125 0.53117v12.784c0 0.2985 0.23264 0.5312 0.53125 0.5312h15.091c0.2986 0 0.53124-0.2327 0.53124-0.5312l0.0004-10.474c0-0.2889-0.24211-0.5338-0.53124-0.5338l-7.5457 0.0005-2.3076-2.3078z\" fill-rule=\"evenodd\" fill=\"#000000\"/>
+ </g>
+</svg>
+";
+ $expected = new DataDisplayResponse($svg, Http::STATUS_OK, ['Content-Type' => 'image/svg+xml']);
+ $expected->cacheFor(86400);
+ $expected->addHeader('Expires', date(\DateTime::RFC2822, $this->timeFactory->getTime()));
+ @$this->assertEquals($expected, $this->iconController->getThemedIcon('core','filetypes/folder.svg'));
+ }
+
+ public function testGetFaviconDefault() {
+ $favicon = $this->iconController->getFavicon();
+
+ $expectedIcon = $this->invokePrivate($this->iconController, 'renderAppIcon', ["core"]);
+ $expectedIcon->resizeImage(32, 32, Imagick::FILTER_LANCZOS, 1);
+ $expectedIcon->setImageFormat("png24");
+
+ $expected = new DataDisplayResponse($expectedIcon, Http::STATUS_OK, ['Content-Type' => 'image/x-icon']);
+ $expected->cacheFor(86400);
+ $expected->addHeader('Expires', date(\DateTime::RFC2822, $this->timeFactory->getTime()));
+ $this->assertEquals($expected, $favicon);
+ }
+ public function testGetTouchIconDefault() {
+ $favicon = $this->iconController->getTouchIcon();
+
+ $expectedIcon = $this->invokePrivate($this->iconController, 'renderAppIcon', ["core"]);
+ $expectedIcon->resizeImage(512, 512, Imagick::FILTER_LANCZOS, 1);
+ $expectedIcon->setImageFormat("png24");
+
+ $expected = new DataDisplayResponse($expectedIcon, Http::STATUS_OK, ['Content-Type' => 'image/png']);
+ $expected->cacheFor(86400);
+ $expected->addHeader('Expires', date(\DateTime::RFC2822, $this->timeFactory->getTime()));
+ $this->assertEquals($expected, $favicon);
+ }
+
+ public function testRenderAppIcon() {
+ $this->themingDefaults->expects($this->once())
+ ->method('getMailHeaderColor')
+ ->willReturn('#000000');
+
+ $icon = $this->invokePrivate($this->iconController, 'renderAppIcon', ['core']);
+ $this->assertEquals(true, $icon->valid());
+ $this->assertEquals(512, $icon->getImageWidth());
+ $this->assertEquals(512, $icon->getImageHeight());
+
+ }
+ public function testRenderAppIconColor() {
+ $this->themingDefaults->expects($this->once())
+ ->method('getMailHeaderColor')
+ ->willReturn('#0082c9');
+
+ $icon = $this->invokePrivate($this->iconController, 'renderAppIcon', ['core']);
+ $this->assertEquals(true, $icon->valid());
+ $this->assertEquals(512, $icon->getImageWidth());
+ $this->assertEquals(512, $icon->getImageHeight());
+
+ }
+
+
+ /**
+ * @dataProvider dataGetAppIcon
+ */
+ public function testGetAppIcon($app, $expected) {
+ $icon = $this->invokePrivate($this->iconController, 'getAppIcon', [$app]);
+ $this->assertEquals($expected, $icon);
+ }
+
+ public function dataGetAppIcon() {
+ return [
+ ['user_ldap', \OC_App::getAppPath('user_ldap') . '/img/app.svg'],
+ ['noapplikethis', \OC::$SERVERROOT . '/core/img/logo.svg'],
+ ['comments', \OC_App::getAppPath('comments') . '/img/comments.svg'],
+ ];
+ }
+
+ public function testGetAppIconThemed() {
+ $this->rootFolder->expects($this->once())
+ ->method('nodeExists')
+ ->with('/themedinstancelogo')
+ ->willReturn(true);
+ $expected = '/themedinstancelogo';
+ $icon = $this->invokePrivate($this->iconController, 'getAppIcon', ['noapplikethis']);
+ $this->assertEquals($expected, $icon);
+ }
+
+ /**
+ * @dataProvider dataGetAppImage
+ */
+ public function testGetAppImage($app, $image, $expected) {
+ $this->assertEquals($expected, $this->invokePrivate($this->iconController, 'getAppImage', [$app, $image]));
+ }
+ public function dataGetAppImage() {
+ return [
+ ['core', 'logo.svg', \OC::$SERVERROOT . '/core/img/logo.svg'],
+ ['files', 'external', \OC::$SERVERROOT . '/apps/files/img/external.svg'],
+ ['files', 'external.svg', \OC::$SERVERROOT . '/apps/files/img/external.svg'],
+ ['noapplikethis', 'foobar.svg', false],
+ ];
+ }
+
+ public function testColorizeSvg() {
+ $input = "#0082c9 #0082C9 #000000 #FFFFFF";
+ $expected = "#AAAAAA #AAAAAA #000000 #FFFFFF";
+ $result = $this->invokePrivate($this->iconController, 'colorizeSvg', [$input, '#AAAAAA']);
+ $this->assertEquals($expected, $result);
+ }
+
+}