diff options
Diffstat (limited to 'apps/theming/tests/Service/ThemesServiceTest.php')
-rw-r--r-- | apps/theming/tests/Service/ThemesServiceTest.php | 241 |
1 files changed, 183 insertions, 58 deletions
diff --git a/apps/theming/tests/Service/ThemesServiceTest.php b/apps/theming/tests/Service/ThemesServiceTest.php index 56f96d29637..354ed1dec85 100644 --- a/apps/theming/tests/Service/ThemesServiceTest.php +++ b/apps/theming/tests/Service/ThemesServiceTest.php @@ -1,112 +1,137 @@ <?php + +declare(strict_types=1); /** - * @copyright Copyright (c) 2022 John Molakvoæ <skjnldsv@protonmail.com> - * - * @author John Molakvoæ <skjnldsv@protonmail.com> - * - * @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/>. - * + * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\Theming\Tests\Service; use OCA\Theming\AppInfo\Application; use OCA\Theming\ImageManager; use OCA\Theming\ITheme; +use OCA\Theming\Service\ThemesService; 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\Themes\LightTheme; use OCA\Theming\ThemingDefaults; use OCA\Theming\Util; -use OCP\AppFramework\Http\DataResponse; -use OCP\AppFramework\OCS\OCSBadRequestException; +use OCP\App\IAppManager; use OCP\IConfig; use OCP\IL10N; -use OCP\IRequest; use OCP\IURLGenerator; use OCP\IUser; use OCP\IUserSession; use PHPUnit\Framework\MockObject\MockObject; +use Psr\Log\LoggerInterface; use Test\TestCase; class ThemesServiceTest extends TestCase { - /** @var ThemesService */ - private $themesService; + private IUserSession&MockObject $userSession; + private IConfig&MockObject $config; + private LoggerInterface&MockObject $logger; - /** @var IUserSession|MockObject */ - private $userSession; - /** @var IConfig|MockObject */ - private $config; - /** @var ThemingDefaults|MockObject */ - private $themingDefaults; + private ThemingDefaults&MockObject $themingDefaults; + private ThemesService $themesService; /** @var ITheme[] */ - private $themes; + private array $themes; protected function setUp(): void { $this->userSession = $this->createMock(IUserSession::class); $this->config = $this->createMock(IConfig::class); + $this->logger = $this->createMock(LoggerInterface::class); $this->themingDefaults = $this->createMock(ThemingDefaults::class); $this->themingDefaults->expects($this->any()) ->method('getColorPrimary') ->willReturn('#0082c9'); + $this->themingDefaults->expects($this->any()) + ->method('getDefaultColorPrimary') + ->willReturn('#0082c9'); + $this->initThemes(); $this->themesService = new ThemesService( $this->userSession, $this->config, + $this->logger, ...array_values($this->themes) ); parent::setUp(); } - public function testGetThemes() { + public function testGetThemes(): void { $expected = [ 'default', + 'light', 'dark', - 'highcontrast', + 'light-highcontrast', 'dark-highcontrast', 'opendyslexic', ]; $this->assertEquals($expected, array_keys($this->themesService->getThemes())); } + public function testGetThemesEnforced(): void { + $this->config->expects($this->once()) + ->method('getSystemValueString') + ->with('enforce_theme', '') + ->willReturn('dark'); + $this->logger->expects($this->never()) + ->method('error'); + + $expected = [ + 'default', + 'dark', + ]; + + $this->assertEquals($expected, array_keys($this->themesService->getThemes())); + } + + public function testGetThemesEnforcedInvalid(): void { + $this->config->expects($this->once()) + ->method('getSystemValueString') + ->with('enforce_theme', '') + ->willReturn('invalid'); + $this->logger->expects($this->once()) + ->method('error') + ->with('Enforced theme not found', ['theme' => 'invalid']); + + $expected = [ + 'default', + 'light', + 'dark', + 'light-highcontrast', + 'dark-highcontrast', + 'opendyslexic', + ]; + + $this->assertEquals($expected, array_keys($this->themesService->getThemes())); + } - public function dataTestEnableTheme() { + public static function dataTestEnableTheme(): array { return [ - ['dark', [], ['dark']], + ['default', ['default'], ['default']], + ['dark', ['default'], ['dark']], ['dark', ['dark'], ['dark']], ['opendyslexic', ['dark'], ['dark', 'opendyslexic']], - ['dark', ['highcontrast', 'opendyslexic'], ['opendyslexic', 'dark']], + ['dark', ['light-highcontrast', 'opendyslexic'], ['opendyslexic', 'dark']], ]; } /** - * @dataProvider dataTestEnableTheme * - * @param string $toEnable * @param string[] $enabledThemes * @param string[] $expectedEnabled */ - public function testEnableTheme(string $toEnable, array $enabledThemes, array $expectedEnabled) { + #[\PHPUnit\Framework\Attributes\DataProvider('dataTestEnableTheme')] + public function testEnableTheme(string $toEnable, array $enabledThemes, array $expectedEnabled): void { $user = $this->createMock(IUser::class); $this->userSession->expects($this->any()) ->method('getUser') @@ -117,30 +142,29 @@ class ThemesServiceTest extends TestCase { $this->config->expects($this->once()) ->method('getUserValue') - ->with('user', Application::APP_ID, 'enabled-themes', '[]') + ->with('user', Application::APP_ID, 'enabled-themes', '["default"]') ->willReturn(json_encode($enabledThemes)); $this->assertEquals($expectedEnabled, $this->themesService->enableTheme($this->themes[$toEnable])); } - public function dataTestDisableTheme() { + public static function dataTestDisableTheme(): array { return [ - ['dark', [], []], + ['dark', ['default'], ['default']], ['dark', ['dark'], []], ['opendyslexic', ['dark', 'opendyslexic'], ['dark'], ], - ['highcontrast', ['opendyslexic'], ['opendyslexic']], + ['light-highcontrast', ['opendyslexic'], ['opendyslexic']], ]; } /** - * @dataProvider dataTestDisableTheme * - * @param string $toEnable * @param string[] $enabledThemes * @param string[] $expectedEnabled */ - public function testDisableTheme(string $toDisable, array $enabledThemes, array $expectedEnabled) { + #[\PHPUnit\Framework\Attributes\DataProvider('dataTestDisableTheme')] + public function testDisableTheme(string $toDisable, array $enabledThemes, array $expectedEnabled): void { $user = $this->createMock(IUser::class); $this->userSession->expects($this->any()) ->method('getUser') @@ -151,30 +175,28 @@ class ThemesServiceTest extends TestCase { $this->config->expects($this->once()) ->method('getUserValue') - ->with('user', Application::APP_ID, 'enabled-themes', '[]') + ->with('user', Application::APP_ID, 'enabled-themes', '["default"]') ->willReturn(json_encode($enabledThemes)); - + $this->assertEquals($expectedEnabled, $this->themesService->disableTheme($this->themes[$toDisable])); } - public function dataTestIsEnabled() { + public static function dataTestIsEnabled(): array { return [ ['dark', [], false], ['dark', ['dark'], true], ['opendyslexic', ['dark', 'opendyslexic'], true], - ['highcontrast', ['opendyslexic'], false], + ['light-highcontrast', ['opendyslexic'], false], ]; } /** - * @dataProvider dataTestIsEnabled - * - * @param string $toEnable * @param string[] $enabledThemes */ - public function testisEnabled(string $themeId, array $enabledThemes, $expected) { + #[\PHPUnit\Framework\Attributes\DataProvider('dataTestIsEnabled')] + public function testIsEnabled(string $themeId, array $enabledThemes, bool $expected): void { $user = $this->createMock(IUser::class); $this->userSession->expects($this->any()) ->method('getUser') @@ -185,59 +207,162 @@ class ThemesServiceTest extends TestCase { $this->config->expects($this->once()) ->method('getUserValue') - ->with('user', Application::APP_ID, 'enabled-themes', '[]') + ->with('user', Application::APP_ID, 'enabled-themes', '["default"]') ->willReturn(json_encode($enabledThemes)); - + $this->assertEquals($expected, $this->themesService->isEnabled($this->themes[$themeId])); } + public function testGetEnabledThemes(): void { + $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', '["default"]') + ->willReturn(json_encode(['default'])); + $this->config->expects($this->once()) + ->method('getSystemValueString') + ->with('enforce_theme', '') + ->willReturn(''); + + $this->assertEquals(['default'], $this->themesService->getEnabledThemes()); + } + + public function testGetEnabledThemesEnforced(): void { + $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', '["default"]') + ->willReturn(json_encode([])); + $this->config->expects($this->once()) + ->method('getSystemValueString') + ->with('enforce_theme', '') + ->willReturn('light'); + + $this->assertEquals(['light'], $this->themesService->getEnabledThemes()); + } + + + public static function dataTestSetEnabledThemes(): array { + return [ + [[], []], + [['light'], ['light']], + [['dark'], ['dark']], + [['dark', 'dark', 'opendyslexic'], ['dark', 'opendyslexic']], + ]; + } + + /** + * + * @param string[] $enabledThemes + * @param string[] $expected + */ + #[\PHPUnit\Framework\Attributes\DataProvider('dataTestSetEnabledThemes')] + public function testSetEnabledThemes(array $enabledThemes, array $expected): void { + $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('setUserValue') + ->with('user', Application::APP_ID, 'enabled-themes', json_encode($expected)); + + $this->invokePrivate($this->themesService, 'setEnabledThemes', [$enabledThemes]); + } + private function initThemes() { $util = $this->createMock(Util::class); $urlGenerator = $this->createMock(IURLGenerator::class); $imageManager = $this->createMock(ImageManager::class); $l10n = $this->createMock(IL10N::class); + $appManager = $this->createMock(IAppManager::class); $this->themes = [ 'default' => new DefaultTheme( $util, $this->themingDefaults, + $this->userSession, + $urlGenerator, + $imageManager, + $this->config, + $l10n, + $appManager, + null, + ), + 'light' => new LightTheme( + $util, + $this->themingDefaults, + $this->userSession, $urlGenerator, $imageManager, $this->config, $l10n, + $appManager, + null, ), 'dark' => new DarkTheme( $util, $this->themingDefaults, + $this->userSession, $urlGenerator, $imageManager, $this->config, $l10n, + $appManager, + null, ), - 'highcontrast' => new HighContrastTheme( + 'light-highcontrast' => new HighContrastTheme( $util, $this->themingDefaults, + $this->userSession, $urlGenerator, $imageManager, $this->config, $l10n, + $appManager, + null, ), 'dark-highcontrast' => new DarkHighContrastTheme( $util, $this->themingDefaults, + $this->userSession, $urlGenerator, $imageManager, $this->config, $l10n, + $appManager, + null, ), 'opendyslexic' => new DyslexiaFont( $util, $this->themingDefaults, + $this->userSession, $urlGenerator, $imageManager, $this->config, $l10n, + $appManager, + null, ), ]; } |