]> source.dussan.org Git - nextcloud-server.git/commitdiff
Phpunit
authorJohn Molakvoæ <skjnldsv@protonmail.com>
Wed, 20 Apr 2022 12:21:42 +0000 (14:21 +0200)
committerJohn Molakvoæ <skjnldsv@protonmail.com>
Thu, 21 Apr 2022 17:00:28 +0000 (19:00 +0200)
Signed-off-by: John Molakvoæ <skjnldsv@protonmail.com>
apps/theming/lib/Service/ThemesService.php
apps/theming/lib/Util.php
apps/theming/tests/Controller/ThemingControllerTest.php
apps/theming/tests/Controller/UserThemeControllerTest.php [new file with mode: 0644]
apps/theming/tests/Service/ThemesServiceTest.php [new file with mode: 0644]
apps/theming/tests/ServicesTest.php
apps/theming/tests/Settings/AdminTest.php
apps/theming/tests/Settings/SectionTest.php
apps/theming/tests/UtilTest.php
tests/Core/Command/Apps/AppsEnableTest.php

index 8b39da6bb5d3a42695e7681c084c2a7295a3cfca..d8101c5b48a654a70d8bfb1df4cd414403252b89 100644 (file)
@@ -44,8 +44,8 @@ class ThemesService {
                                                                IConfig $config,
                                                                DefaultTheme $defaultTheme,
                                                                DarkTheme $darkTheme,
-                                                               DarkHighContrastTheme $darkHighContrastTheme,
                                                                HighContrastTheme $highContrastTheme,
+                                                               DarkHighContrastTheme $darkHighContrastTheme,
                                                                DyslexiaFont $dyslexiaFont) {
                $this->userSession = $userSession;
                $this->config = $config;
@@ -73,44 +73,54 @@ class ThemesService {
         * Enable a theme for the logged-in user
         * 
         * @param ITheme $theme the theme to enable
+        * @return string[] the enabled themes
         */
-       public function enableTheme(ITheme $theme): void {
+       public function enableTheme(ITheme $theme): array {
                $themesIds = $this->getEnabledThemes();
 
+               // If already enabled, ignore
+               if (in_array($theme->getId(), $themesIds)) {
+                       return $themesIds;
+               }
+
                /** @var ITheme[] */
                $themes = array_map(function($themeId) {
                        return $this->getThemes()[$themeId];
                }, $themesIds);
 
                // Filtering all themes with the same type
-               $filteredThemes = array_filter($themes, function($t) use ($theme) {
+               $filteredThemes = array_filter($themes, function(ITheme $t) use ($theme) {
                        return $theme->getType() === $t->getType();
                });
 
-               // Disable all the other themes of the same type
-               // as there can only be one enabled at the same time
-               foreach ($filteredThemes as $t) {
-                       $this->disableTheme($t);
-               }
+               // Retrieve IDs only
+               $filteredThemesIds = array_map(function(ITheme $t) {
+                       return $t->getId();
+               }, $filteredThemes);
 
-               $this->setEnabledThemes([...$this->getEnabledThemes(), $theme->getId()]);
+               $enabledThemes = [...array_diff($themesIds, $filteredThemesIds), $theme->getId()];
+               $this->setEnabledThemes($enabledThemes);
+
+               return $enabledThemes;
        }
 
        /**
         * Disable a theme for the logged-in user
         * 
         * @param ITheme $theme the theme to disable
+        * @return string[] the enabled themes
         */
-       public function disableTheme(ITheme $theme): void {
-               // Using keys as it's faster
-               $themes = $this->getEnabledThemes();
+       public function disableTheme(ITheme $theme): array {
+               $themesIds = $this->getEnabledThemes();
 
                // If enabled, removing it
-               if (in_array($theme->getId(), $themes)) {
-                       $this->setEnabledThemes(array_filter($themes, function($themeId) use ($theme) {
-                               return $themeId !== $theme->getId();
-                       }));
+               if (in_array($theme->getId(), $themesIds)) {
+                       $enabledThemes = array_diff($themesIds, [$theme->getId()]);
+                       $this->setEnabledThemes($enabledThemes);
+                       return $enabledThemes;
                }
+               
+               return $themesIds;
        }
 
        /**
@@ -136,6 +146,10 @@ class ThemesService {
         */
        public function getEnabledThemes(): array {
                $user = $this->userSession->getUser();
+               if ($user === null) {
+                       return [];
+               }
+
                try {
                        return json_decode($this->config->getUserValue($user->getUID(), Application::APP_ID, 'enabled-themes', '[]'));
                } catch (\Exception $e) {
@@ -151,6 +165,6 @@ class ThemesService {
         */
        private function setEnabledThemes(array $themes): void {
                $user = $this->userSession->getUser();
-               $this->config->setUserValue($user->getUID(), Application::APP_ID, 'enabled-themes', json_encode(array_unique($themes)));
+               $this->config->setUserValue($user->getUID(), Application::APP_ID, 'enabled-themes', json_encode(array_unique(array_values($themes))));
        }
 }
index beaca679149129aa560b3b1df963ce5f0ade65fe..35c7703bd45ecd2fc9c3d3a9d3ac30fe36e74afc 100644 (file)
@@ -129,7 +129,7 @@ class Util {
        public function calculateLuminance(string $color): float {
                [$red, $green, $blue] = $this->hexToRGB($color);
                $hsl = $this->toHSL($red, $green, $blue);
-               return $hsl[2] / 100;
+               return $hsl[2];
        }
 
        /**
index cff2028809dc9516e8f3beb2f52ffdc8579649ac..511f7a6d528f3d44f65bf6b543dc7444d27c3af5 100644 (file)
@@ -34,8 +34,8 @@
 namespace OCA\Theming\Tests\Controller;
 
 use OC\L10N\L10N;
-use OC\Template\SCSSCacher;
 use OCA\Theming\Controller\ThemingController;
+use OCA\Theming\Service\ThemesService;
 use OCA\Theming\ImageManager;
 use OCA\Theming\ThemingDefaults;
 use OCP\App\IAppManager;
@@ -72,10 +72,10 @@ class ThemingControllerTest extends TestCase {
        private $appData;
        /** @var ImageManager|MockObject */
        private $imageManager;
-       /** @var SCSSCacher */
-       private $scssCacher;
-       /** @var IURLGenerator */
+       /** @var IURLGenerator|MockObject */
        private $urlGenerator;
+       /** @var ThemeService|MockObject */
+       private $themesService;
 
        protected function setUp(): void {
                $this->request = $this->createMock(IRequest::class);
@@ -85,9 +85,9 @@ class ThemingControllerTest extends TestCase {
                $this->appData = $this->createMock(IAppData::class);
                $this->appManager = $this->createMock(IAppManager::class);
                $this->tempManager = \OC::$server->getTempManager();
-               $this->scssCacher = $this->createMock(SCSSCacher::class);
                $this->urlGenerator = $this->createMock(IURLGenerator::class);
                $this->imageManager = $this->createMock(ImageManager::class);
+               $this->themesService = $this->createMock(ThemesService::class);
 
                $timeFactory = $this->createMock(ITimeFactory::class);
                $timeFactory->expects($this->any())
@@ -104,10 +104,10 @@ class ThemingControllerTest extends TestCase {
                        $this->l10n,
                        $this->tempManager,
                        $this->appData,
-                       $this->scssCacher,
                        $this->urlGenerator,
                        $this->appManager,
-                       $this->imageManager
+                       $this->imageManager,
+                       $this->themesService,
                );
 
                parent::setUp();
@@ -144,23 +144,12 @@ class ThemingControllerTest extends TestCase {
                        ->willReturnCallback(function ($str) {
                                return $str;
                        });
-               $this->scssCacher
-                       ->expects($this->once())
-                       ->method('getCachedSCSS')
-                       ->with('core', '/core/css/css-variables.scss')
-                       ->willReturn('/core/css/someHash-css-variables.scss');
-               $this->urlGenerator
-                       ->expects($this->once())
-                       ->method('linkTo')
-                       ->with('', '/core/css/someHash-css-variables.scss')
-                       ->willReturn('/nextcloudWebroot/core/css/someHash-css-variables.scss');
 
                $expected = new DataResponse(
                        [
                                'data' =>
                                        [
                                                'message' => $message,
-                                               'serverCssUrl' => '/nextcloudWebroot/core/css/someHash-css-variables.scss',
                                        ],
                                'status' => 'success',
                        ]
@@ -382,9 +371,6 @@ class ThemingControllerTest extends TestCase {
                                return $str;
                        });
 
-               $this->urlGenerator->expects($this->once())
-                       ->method('linkTo')
-                       ->willReturn('serverCss');
                $this->imageManager->expects($this->once())
                        ->method('getImageUrl')
                        ->with('logo')
@@ -400,7 +386,6 @@ class ThemingControllerTest extends TestCase {
                                                'name' => 'logo.svg',
                                                'message' => 'Saved',
                                                'url' => 'imageUrl',
-                                               'serverCssUrl' => 'serverCss'
                                        ],
                                'status' => 'success'
                        ]
@@ -440,9 +425,6 @@ class ThemingControllerTest extends TestCase {
                $this->imageManager->expects($this->once())
                        ->method('updateImage');
 
-               $this->urlGenerator->expects($this->once())
-                       ->method('linkTo')
-                       ->willReturn('serverCss');
                $this->imageManager->expects($this->once())
                        ->method('getImageUrl')
                        ->with('background')
@@ -454,7 +436,6 @@ class ThemingControllerTest extends TestCase {
                                                'name' => 'logo.svg',
                                                'message' => 'Saved',
                                                'url' => 'imageUrl',
-                                               'serverCssUrl' => 'serverCss'
                                        ],
                                'status' => 'success'
                        ]
@@ -607,24 +588,13 @@ class ThemingControllerTest extends TestCase {
                        ->method('undo')
                        ->with('MySetting')
                        ->willReturn('MyValue');
-               $this->scssCacher
-                       ->expects($this->once())
-                       ->method('getCachedSCSS')
-                       ->with('core', '/core/css/css-variables.scss')
-                       ->willReturn('/core/css/someHash-css-variables.scss');
-               $this->urlGenerator
-                       ->expects($this->once())
-                       ->method('linkTo')
-                       ->with('', '/core/css/someHash-css-variables.scss')
-                       ->willReturn('/nextcloudWebroot/core/css/someHash-css-variables.scss');
 
                $expected = new DataResponse(
                        [
                                'data' =>
                                        [
                                                'value' => 'MyValue',
-                                               'message' => 'Saved',
-                                               'serverCssUrl' => '/nextcloudWebroot/core/css/someHash-css-variables.scss',
+                                               'message' => 'Saved'
                                        ],
                                'status' => 'success'
                        ]
@@ -651,16 +621,6 @@ class ThemingControllerTest extends TestCase {
                        ->method('undo')
                        ->with($value)
                        ->willReturn($value);
-               $this->scssCacher
-                       ->expects($this->once())
-                       ->method('getCachedSCSS')
-                       ->with('core', '/core/css/css-variables.scss')
-                       ->willReturn('/core/css/someHash-css-variables.scss');
-               $this->urlGenerator
-                       ->expects($this->once())
-                       ->method('linkTo')
-                       ->with('', '/core/css/someHash-css-variables.scss')
-                       ->willReturn('/nextcloudWebroot/core/css/someHash-css-variables.scss');
 
                $expected = new DataResponse(
                        [
@@ -668,7 +628,6 @@ class ThemingControllerTest extends TestCase {
                                        [
                                                'value' => $value,
                                                'message' => 'Saved',
-                                               'serverCssUrl' => '/nextcloudWebroot/core/css/someHash-css-variables.scss',
                                        ],
                                'status' => 'success'
                        ]
@@ -743,53 +702,6 @@ class ThemingControllerTest extends TestCase {
                @$this->assertEquals($expected, $this->themingController->getImage('background'));
        }
 
-
-       public function testGetStylesheet() {
-               $this->appManager->expects($this->once())->method('getAppPath')->with('theming')->willReturn(\OC::$SERVERROOT . '/theming');
-               $file = $this->createMock(ISimpleFile::class);
-               $file->expects($this->any())->method('getName')->willReturn('theming.css');
-               $file->expects($this->any())->method('getMTime')->willReturn(42);
-               $file->expects($this->any())->method('getContent')->willReturn('compiled');
-               $this->scssCacher->expects($this->once())->method('process')->willReturn(true);
-               $this->scssCacher->expects($this->once())->method('getCachedCSS')->willReturn($file);
-
-               $response = new Http\FileDisplayResponse($file, Http::STATUS_OK, ['Content-Type' => 'text/css']);
-               $response->cacheFor(86400);
-
-               $actual = $this->themingController->getStylesheet();
-               $this->assertEquals($response, $actual);
-       }
-
-       public function testGetStylesheetFails() {
-               $this->appManager->expects($this->once())->method('getAppPath')->with('theming')->willReturn(\OC::$SERVERROOT . '/theming');
-               $file = $this->createMock(ISimpleFile::class);
-               $file->expects($this->any())->method('getName')->willReturn('theming.css');
-               $file->expects($this->any())->method('getMTime')->willReturn(42);
-               $file->expects($this->any())->method('getContent')->willReturn('compiled');
-               $this->scssCacher->expects($this->once())->method('process')->willReturn(true);
-               $this->scssCacher->expects($this->once())->method('getCachedCSS')->willThrowException(new NotFoundException());
-               $response = new Http\NotFoundResponse();
-
-               $actual = $this->themingController->getStylesheet();
-               $this->assertEquals($response, $actual);
-       }
-
-       public function testGetStylesheetOutsideServerroot() {
-               $this->appManager->expects($this->once())->method('getAppPath')->with('theming')->willReturn('/outside/serverroot/theming');
-               $file = $this->createMock(ISimpleFile::class);
-               $file->expects($this->any())->method('getName')->willReturn('theming.css');
-               $file->expects($this->any())->method('getMTime')->willReturn(42);
-               $file->expects($this->any())->method('getContent')->willReturn('compiled');
-               $this->scssCacher->expects($this->once())->method('process')->with('/outside/serverroot/theming', 'css/theming.scss', 'theming')->willReturn(true);
-               $this->scssCacher->expects($this->once())->method('getCachedCSS')->willReturn($file);
-
-               $response = new Http\FileDisplayResponse($file, Http::STATUS_OK, ['Content-Type' => 'text/css']);
-               $response->cacheFor(86400);
-
-               $actual = $this->themingController->getStylesheet();
-               $this->assertEquals($response, $actual);
-       }
-
        public function testGetManifest() {
                $this->config
                        ->expects($this->once())
diff --git a/apps/theming/tests/Controller/UserThemeControllerTest.php b/apps/theming/tests/Controller/UserThemeControllerTest.php
new file mode 100644 (file)
index 0000000..99e3693
--- /dev/null
@@ -0,0 +1,153 @@
+<?php
+/**
+ * @copyright Copyright (c) 2016 Lukas Reschke <lukas@statuscode.ch>
+ *
+ * @author Bjoern Schiessle <bjoern@schiessle.org>
+ * @author Christoph Wurst <christoph@winzerhof-wurst.at>
+ * @author Daniel Calviño Sánchez <danxuliu@gmail.com>
+ * @author Joas Schilling <coding@schilljs.com>
+ * @author John Molakvoæ <skjnldsv@protonmail.com>
+ * @author Julius Haertl <jus@bitgrid.net>
+ * @author Julius Härtl <jus@bitgrid.net>
+ * @author Kyle Fazzari <kyrofa@ubuntu.com>
+ * @author Lukas Reschke <lukas@statuscode.ch>
+ * @author Michael Weimann <mail@michael-weimann.eu>
+ * @author rakekniven <mark.ziegler@rakekniven.de>
+ * @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 OCA\Theming\Tests\Controller;
+
+use OCA\Theming\Controller\UserThemeController;
+use OCA\Theming\ITheme;
+use OCA\Theming\Themes\DarkHighContrastTheme;
+use OCA\Theming\Themes\DarkTheme;
+use OCA\Theming\Themes\DefaultTheme;
+use OCA\Theming\Themes\DyslexiaFont;
+use OCA\Theming\Themes\HighContrastTheme;
+use OCA\Theming\Service\ThemesService;
+use OCP\AppFramework\Http\DataResponse;
+use OCP\AppFramework\OCS\OCSBadRequestException;
+use OCP\IConfig;
+use OCP\IRequest;
+use OCP\IUser;
+use OCP\IUserSession;
+use PHPUnit\Framework\MockObject\MockObject;
+use Test\TestCase;
+
+class UserThemeControllerTest extends TestCase {
+       /** @var UserThemeController */
+       private $userThemeController;
+
+       /** @var IRequest|MockObject */
+       private $request;
+       /** @var IConfig|MockObject */
+       private $config;
+       /** @var IUserSession|MockObject */
+       private $userSession;
+       /** @var ThemeService|MockObject */
+       private $themesService;
+
+       /** @var ITheme[] */
+       private $themes;
+
+       protected function setUp(): void {
+               $this->request = $this->createMock(IRequest::class);
+               $this->config = $this->createMock(IConfig::class);
+               $this->userSession = $this->createMock(IUserSession::class);
+               $this->themesService = $this->createMock(ThemesService::class);
+
+               $this->themes = [
+                       'default' => $this->createMock(DefaultTheme::class),
+                       'dark' => $this->createMock(DarkTheme::class),
+                       'highcontrast' => $this->createMock(HighContrastTheme::class),
+                       'dark-highcontrast' => $this->createMock(DarkHighContrastTheme::class),
+                       'opendyslexic' => $this->createMock(DyslexiaFont::class),
+               ];
+
+               $user = $this->createMock(IUser::class);
+               $this->userSession->expects($this->any())
+                       ->method('getUser')
+                       ->willReturn($user);
+               $user->expects($this->any())
+                       ->method('getUID')
+                       ->willReturn('user');
+
+               $this->userThemeController = new UserThemeController(
+                       'theming',
+                       $this->request,
+                       $this->config,
+                       $this->userSession,
+                       $this->themesService,
+               );
+
+               parent::setUp();
+       }
+
+       public function dataTestThemes() {
+               return [
+                       ['default'],
+                       ['dark'],
+                       ['highcontrast'],
+                       ['dark-highcontrast'],
+                       ['opendyslexic'],
+                       ['', OCSBadRequestException::class],
+                       ['badTheme', OCSBadRequestException::class],
+               ];
+       }
+
+       /**
+        * @dataProvider dataTestThemes
+        *
+        * @param string $themeId
+        * @param string $exception
+        */
+       public function testEnableTheme($themeId, string $exception = null) {
+               $this->themesService
+                       ->expects($this->any())
+                       ->method('getThemes')
+                       ->willReturn($this->themes);
+
+               if ($exception) {
+                       $this->expectException($exception);
+               }
+
+               $expected = new DataResponse();
+               $this->assertEquals($expected, $this->userThemeController->enableTheme($themeId));
+       }
+
+       /**
+        * @dataProvider dataTestThemes
+        *
+        * @param string $themeId
+        * @param string $exception
+        */
+       public function testDisableTheme($themeId, string $exception = null) {
+               $this->themesService
+                       ->expects($this->any())
+                       ->method('getThemes')
+                       ->willReturn($this->themes);
+
+               if ($exception) {
+                       $this->expectException($exception);
+               }
+
+               $expected = new DataResponse();
+               $this->assertEquals($expected, $this->userThemeController->disableTheme($themeId));
+       }
+}
diff --git a/apps/theming/tests/Service/ThemesServiceTest.php b/apps/theming/tests/Service/ThemesServiceTest.php
new file mode 100644 (file)
index 0000000..64f461c
--- /dev/null
@@ -0,0 +1,255 @@
+<?php
+/**
+ * @copyright Copyright (c) 2016 Lukas Reschke <lukas@statuscode.ch>
+ *
+ * @author Bjoern Schiessle <bjoern@schiessle.org>
+ * @author Christoph Wurst <christoph@winzerhof-wurst.at>
+ * @author Daniel Calviño Sánchez <danxuliu@gmail.com>
+ * @author Joas Schilling <coding@schilljs.com>
+ * @author John Molakvoæ <skjnldsv@protonmail.com>
+ * @author Julius Haertl <jus@bitgrid.net>
+ * @author Julius Härtl <jus@bitgrid.net>
+ * @author Kyle Fazzari <kyrofa@ubuntu.com>
+ * @author Lukas Reschke <lukas@statuscode.ch>
+ * @author Michael Weimann <mail@michael-weimann.eu>
+ * @author rakekniven <mark.ziegler@rakekniven.de>
+ * @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 OCA\Theming\Tests\Service;
+
+use OCA\Theming\AppInfo\Application;
+use OCA\Theming\ImageManager;
+use OCA\Theming\ITheme;
+use OCA\Theming\Themes\DarkHighContrastTheme;
+use OCA\Theming\Themes\DarkTheme;
+use OCA\Theming\Themes\DefaultTheme;
+use OCA\Theming\Themes\DyslexiaFont;
+use OCA\Theming\Themes\HighContrastTheme;
+use OCA\Theming\Service\ThemesService;
+use OCA\Theming\ThemingDefaults;
+use OCA\Theming\Util;
+use OCP\AppFramework\Http\DataResponse;
+use OCP\AppFramework\OCS\OCSBadRequestException;
+use OCP\IConfig;
+use OCP\IL10N;
+use OCP\IRequest;
+use OCP\IURLGenerator;
+use OCP\IUser;
+use OCP\IUserSession;
+use PHPUnit\Framework\MockObject\MockObject;
+use Test\TestCase;
+
+class UserThemeControllerTest extends TestCase {
+       /** @var ThemesService */
+       private $themesService;
+
+       /** @var IUserSession|MockObject */
+       private $userSession;
+       /** @var IConfig|MockObject */
+       private $config;
+       /** @var ThemingDefaults|MockObject */
+       private $themingDefaults;
+
+       /** @var ITheme[] */
+       private $themes;
+
+       protected function setUp(): void {
+               $this->userSession = $this->createMock(IUserSession::class);
+               $this->config = $this->createMock(IConfig::class);
+               $this->themingDefaults = $this->createMock(ThemingDefaults::class);
+
+               $this->themingDefaults->expects($this->any())
+                       ->method('getColorPrimary')
+                       ->willReturn('#0082c9');
+
+               $this->initThemes();
+
+               $this->themesService = new ThemesService(
+                       $this->userSession,
+                       $this->config,
+                       ...array_values($this->themes)
+               );
+
+               parent::setUp();
+       }
+
+       public function testGetThemes() {
+               $expected = [
+                       'default',
+                       'dark',
+                       'highcontrast',
+                       'dark-highcontrast',
+                       'opendyslexic',
+               ];
+               $this->assertEquals($expected, array_keys($this->themesService->getThemes()));
+       }
+
+
+       public function dataTestEnableTheme() {
+               return [
+                       ['dark', [], ['dark']],
+                       ['dark', ['dark'], ['dark']],
+                       ['opendyslexic', ['dark'], ['dark', 'opendyslexic']],
+                       ['dark', ['highcontrast', 'opendyslexic'], ['opendyslexic', 'dark']],
+               ];
+       }
+
+       /**
+        * @dataProvider dataTestEnableTheme
+        *
+        * @param string $toEnable
+        * @param string[] $enabledThemes
+        * @param string[] $expectedEnabled
+        */
+       public function testEnableTheme(string $toEnable, array $enabledThemes, array $expectedEnabled) {
+               $user = $this->createMock(IUser::class);
+               $this->userSession->expects($this->any())
+                       ->method('getUser')
+                       ->willReturn($user);
+               $user->expects($this->any())
+                       ->method('getUID')
+                       ->willReturn('user');
+
+               $this->config->expects($this->once())
+                       ->method('getUserValue')
+                       ->with('user', Application::APP_ID, 'enabled-themes', '[]')
+                       ->willReturn(json_encode($enabledThemes));
+
+               $this->assertEquals($expectedEnabled, $this->themesService->enableTheme($this->themes[$toEnable]));
+       }
+
+
+       public function dataTestDisableTheme() {
+               return [
+                       ['dark', [], []],
+                       ['dark', ['dark'], []],
+                       ['opendyslexic', ['dark', 'opendyslexic'], ['dark'], ],
+                       ['highcontrast', ['opendyslexic'], ['opendyslexic']],
+               ];
+       }
+
+       /**
+        * @dataProvider dataTestDisableTheme
+        *
+        * @param string $toEnable
+        * @param string[] $enabledThemes
+        * @param string[] $expectedEnabled
+        */
+       public function testDisableTheme(string $toDisable, array $enabledThemes, array $expectedEnabled) {
+               $user = $this->createMock(IUser::class);
+               $this->userSession->expects($this->any())
+                       ->method('getUser')
+                       ->willReturn($user);
+               $user->expects($this->any())
+                       ->method('getUID')
+                       ->willReturn('user');
+
+               $this->config->expects($this->once())
+                       ->method('getUserValue')
+                       ->with('user', Application::APP_ID, 'enabled-themes', '[]')
+                       ->willReturn(json_encode($enabledThemes));
+       
+
+               $this->assertEquals($expectedEnabled, $this->themesService->disableTheme($this->themes[$toDisable]));
+       }
+
+
+       public function dataTestIsEnabled() {
+               return [
+                       ['dark', [], false],
+                       ['dark', ['dark'], true],
+                       ['opendyslexic', ['dark', 'opendyslexic'], true],
+                       ['highcontrast', ['opendyslexic'], false],
+               ];
+       }
+
+       /**
+        * @dataProvider dataTestIsEnabled
+        *
+        * @param string $toEnable
+        * @param string[] $enabledThemes
+        */
+       public function testisEnabled(string $themeId, array $enabledThemes, $expected) {
+               $user = $this->createMock(IUser::class);
+               $this->userSession->expects($this->any())
+                       ->method('getUser')
+                       ->willReturn($user);
+               $user->expects($this->any())
+                       ->method('getUID')
+                       ->willReturn('user');
+
+               $this->config->expects($this->once())
+                       ->method('getUserValue')
+                       ->with('user', Application::APP_ID, 'enabled-themes', '[]')
+                       ->willReturn(json_encode($enabledThemes));
+       
+
+               $this->assertEquals($expected, $this->themesService->isEnabled($this->themes[$themeId]));
+       }
+
+       private function initThemes() {
+               $util = $this->createMock(Util::class);
+               $urlGenerator = $this->createMock(IURLGenerator::class);
+               $imageManager = $this->createMock(ImageManager::class);
+               $l10n = $this->createMock(IL10N::class);
+
+               $this->themes = [
+                       'default' => new DefaultTheme(
+                               $util,
+                               $this->themingDefaults,
+                               $urlGenerator,
+                               $imageManager,
+                               $this->config,
+                               $l10n,
+                       ),
+                       'dark' => new DarkTheme(
+                               $util,
+                               $this->themingDefaults,
+                               $urlGenerator,
+                               $imageManager,
+                               $this->config,
+                               $l10n,
+                       ),
+                       'highcontrast' => new HighContrastTheme(
+                               $util,
+                               $this->themingDefaults,
+                               $urlGenerator,
+                               $imageManager,
+                               $this->config,
+                               $l10n,
+                       ),
+                       'dark-highcontrast' => new DarkHighContrastTheme(
+                               $util,
+                               $this->themingDefaults,
+                               $urlGenerator,
+                               $imageManager,
+                               $this->config,
+                               $l10n,
+                       ),
+                       'opendyslexic' => new DyslexiaFont(
+                               $util,
+                               $this->themingDefaults,
+                               $urlGenerator,
+                               $imageManager,
+                               $this->config,
+                               $l10n,
+                       ),
+               ];
+       }
+}
index fdd49deddd8ea2befb3b764b88b64fcda1ae0788..441e5d5504444acc1b3fff08db3e9ae655a7c2dc 100644 (file)
@@ -28,7 +28,7 @@ namespace OCA\Theming\Tests;
 use OCA\Theming\Capabilities;
 use OCA\Theming\Controller\ThemingController;
 use OCA\Theming\Settings\Admin;
-use OCA\Theming\Settings\Section;
+use OCA\Theming\Settings\PersonalSection;
 use OCA\Theming\ThemingDefaults;
 use OCA\Theming\Util;
 use OCP\AppFramework\App;
@@ -74,8 +74,8 @@ class ServicesTest extends TestCase {
                        // Settings
                        [Admin::class],
                        [Admin::class, ISettings::class],
-                       [Section::class],
-                       [Section::class, IIconSection::class],
+                       [PersonalSection::class],
+                       [PersonalSection::class, IIconSection::class],
                ];
        }
 
index 50b95fe7e9931bc49121dc3b09fc6cda21f2f26f..b10196a1ac5630cfc94e919fe4dd3ed50a5bbe55 100644 (file)
@@ -27,6 +27,7 @@
  */
 namespace OCA\Theming\Tests\Settings;
 
+use OCA\Theming\AppInfo\Application;
 use OCA\Theming\ImageManager;
 use OCA\Theming\Settings\Admin;
 use OCA\Theming\ThemingDefaults;
@@ -59,6 +60,7 @@ class AdminTest extends TestCase {
                $this->imageManager = $this->createMock(ImageManager::class);
 
                $this->admin = new Admin(
+                       Application::APP_ID,
                        $this->config,
                        $this->l10n,
                        $this->themingDefaults,
index 496c24b3e52e3e450a592e051e2a2d12e54f65ad..c168f13728d2db923dd9400a95bd85e0ce85c841 100644 (file)
@@ -23,7 +23,8 @@
  */
 namespace OCA\Theming\Tests\Settings;
 
-use OCA\Theming\Settings\Section;
+use OCA\Theming\AppInfo\Application;
+use OCA\Theming\Settings\AdminSection;
 use OCP\IL10N;
 use OCP\IURLGenerator;
 use Test\TestCase;
@@ -33,7 +34,7 @@ class SectionTest extends TestCase {
        private $url;
        /** @var IL10N|\PHPUnit\Framework\MockObject\MockObject */
        private $l;
-       /** @var Section */
+       /** @var AdminSection */
        private $section;
 
        protected function setUp(): void {
@@ -41,7 +42,8 @@ class SectionTest extends TestCase {
                $this->url = $this->createMock(IURLGenerator::class);
                $this->l = $this->createMock(IL10N::class);
 
-               $this->section = new Section(
+               $this->section = new AdminSection(
+                       Application::APP_ID,
                        $this->url,
                        $this->l
                );
index f805d083e27ebc3d408f536fcc22930611f6edb4..914ad8b073f693d329933185e3ec50cae275619b 100644 (file)
@@ -90,14 +90,15 @@ class UtilTest extends TestCase {
                $luminance = $this->util->calculateLuminance('#000');
                $this->assertEquals(0, $luminance);
        }
+
        public function testInvertTextColorInvalid() {
-               $invert = $this->util->invertTextColor('aaabbbcccddd123');
-               $this->assertEquals(false, $invert);
+               $this->expectException(\Exception::class);
+               $this->util->invertTextColor('aaabbbcccddd123');
        }
 
        public function testInvertTextColorEmpty() {
-               $invert = $this->util->invertTextColor('');
-               $this->assertEquals(false, $invert);
+               $this->expectException(\Exception::class);
+               $this->util->invertTextColor('');
        }
 
        public function testElementColorDefault() {
index 73a7d3f449fb5939ceec31858937d50f0ea3bb66..0c45362d997b8e7d7fcd79600cf36510770d33cc 100644 (file)
@@ -85,11 +85,11 @@ class AppsEnableTest extends TestCase {
                        [['comments'], ['admin'], 1, "comments can't be enabled for groups"],
 
                        [['updatenotification'], ['admin'], 0, 'updatenotification ([\d\.]*) enabled for groups: admin'],
-                       [['updatenotification', 'accessibility'], ['admin'], 0, "updatenotification ([\d\.]*) enabled for groups: admin\naccessibility ([\d\.]*) enabled for groups: admin"],
+                       [['updatenotification', 'dashboard'], ['admin'], 0, "updatenotification ([\d\.]*) enabled for groups: admin\ndashboard ([\d\.]*) enabled for groups: admin"],
 
                        [['updatenotification'], ['admin', 'invalid_group'], 0, 'updatenotification ([\d\.]*) enabled for groups: admin'],
-                       [['updatenotification', 'accessibility'], ['admin', 'invalid_group'], 0, "updatenotification ([\d\.]*) enabled for groups: admin\naccessibility ([\d\.]*) enabled for groups: admin"],
-                       [['updatenotification', 'accessibility', 'invalid_app'], ['admin', 'invalid_group'], 1, "updatenotification ([\d\.]*) enabled for groups: admin\naccessibility ([\d\.]*) enabled for groups: admin\nCould not download app invalid_app"],
+                       [['updatenotification', 'dashboard'], ['admin', 'invalid_group'], 0, "updatenotification ([\d\.]*) enabled for groups: admin\ndashboard ([\d\.]*) enabled for groups: admin"],
+                       [['updatenotification', 'dashboard', 'invalid_app'], ['admin', 'invalid_group'], 1, "updatenotification ([\d\.]*) enabled for groups: admin\ndashboard ([\d\.]*) enabled for groups: admin\nCould not download app invalid_app"],
                ];
        }
 }