['setThemeOptions', 100]], ThemeOptionsSubscriber::getSubscribedEvents()); } public function testUsesAuthenticationThemeWithoutAuthenticatedUser(): void { $storage = $this->createMock(TokenStorageInterface::class); $storage->expects($this->once())->method('getToken')->willReturn(null); $helper = new ContextHelper(); $sut = $this->createSut($storage, $helper, ['user' => ['theme' => 'dark']]); $sut->setThemeOptions($this->createMainRequestEvent('ar')); self::assertTrue($helper->isRightToLeft()); self::assertTrue($helper->isDarkMode()); self::assertFalse($helper->isThemeAuto()); self::assertTrue($helper->isHeaderDark()); self::assertTrue($helper->isNavbarDark()); self::assertFalse($helper->isBoxedLayout()); self::assertFalse($helper->isCondensedUserMenu()); self::assertFalse($helper->isCondensedNavbar()); self::assertFalse($helper->isNavbarOverlapping()); } public function testUsesAuthenticationThemeForNonKimaiUserToken(): void { $securityUser = $this->createMock(UserInterface::class); $token = $this->createMock(TokenInterface::class); $token->expects($this->once())->method('getUser')->willReturn($securityUser); $storage = $this->createMock(TokenStorageInterface::class); $storage->expects($this->once())->method('getToken')->willReturn($token); $helper = new ContextHelper(); $sut = $this->createSut($storage, $helper, ['user' => ['theme' => 'auto']]); $sut->setThemeOptions($this->createMainRequestEvent()); self::assertFalse($helper->isDarkMode()); self::assertTrue($helper->isThemeAuto()); self::assertFalse($helper->isHeaderDark()); } public function testUserThemeOverridesAuthenticationTheme(): void { $user = new User(); $user->setPreferenceValue(UserPreference::SKIN, 'dark'); $token = $this->createMock(TokenInterface::class); $token->expects($this->once())->method('getUser')->willReturn($user); $storage = $this->createMock(TokenStorageInterface::class); $storage->expects($this->once())->method('getToken')->willReturn($token); $helper = new ContextHelper(); $sut = $this->createSut($storage, $helper, ['user' => ['theme' => 'auto']]); $sut->setThemeOptions($this->createMainRequestEvent()); self::assertFalse($helper->isRightToLeft()); self::assertTrue($helper->isDarkMode()); self::assertFalse($helper->isThemeAuto()); self::assertTrue($helper->isHeaderDark()); } private function createSut(TokenStorageInterface $storage, ContextHelper $helper, array $settings = []): ThemeOptionsSubscriber { return new ThemeOptionsSubscriber( $storage, $helper, new LocaleService([ 'en' => LocaleService::DEFAULT_SETTINGS, 'ar' => [ 'date' => 'dd.MM.y', 'time' => 'H:mm', 'rtl' => true, 'translation' => false, ], ]), SystemConfigurationFactory::createStub($settings) ); } private function createMainRequestEvent(string $locale = 'en'): KernelEvent { $request = new Request(); $request->setLocale($locale); $event = $this->createMock(KernelEvent::class); $event->expects($this->once())->method('isMainRequest')->willReturn(true); $event->expects($this->once())->method('getRequest')->willReturn($request); return $event; } }