request = $this->createMock(IRequest::class); $this->navigationManager = $this->createMock(INavigationManager::class); $this->settingsManager = $this->createMock(IManager::class); $this->userSession = $this->createMock(IUserSession::class); $this->groupManager = $this->createMock(IGroupManager::class); $this->subAdmin = $this->createMock(ISubAdmin::class); $this->declarativeSettingsManager = $this->createMock(IDeclarativeManager::class); $this->initialState = $this->createMock(IInitialState::class); $this->personalSettingsController = new PersonalSettingsController( 'settings', $this->request, $this->navigationManager, $this->settingsManager, $this->userSession, $this->groupManager, $this->subAdmin, $this->declarativeSettingsManager, $this->initialState, ); $user = Server::get(IUserManager::class)->createUser($this->uid, 'mylongrandompassword'); \OC_User::setUserId($user->getUID()); } protected function tearDown(): void { Server::get(IUserManager::class) ->get($this->uid) ->delete(); \OC_User::setUserId(null); Server::get(IUserSession::class)->setUser(null); parent::tearDown(); } /** * Marks the section we are about to render so the rest of getIndexResponse() * has something to format. The actual content is irrelevant to these tests. */ private function stubSettingsFor(string $section): void { $user = $this->createMock(IUser::class); $user->method('getUID')->willReturn('user123'); $this->userSession->method('getUser')->willReturn($user); $form = new TemplateResponse('settings', 'settings/empty'); $setting = $this->createMock(ServerDevNotice::class); $setting->method('getForm')->willReturn($form); $this->settingsManager ->method('getPersonalSettings') ->with($section) ->willReturn([5 => [$setting]]); $this->settingsManager->method('getPersonalSections')->willReturn([]); $this->settingsManager->method('getAdminSections')->willReturn([]); $this->declarativeSettingsManager->method('getFormIDs')->willReturn([]); $this->declarativeSettingsManager->method('getFormsWithValues')->willReturn([]); } public function testIndexActivatesPersonalNavEntry(): void { $this->stubSettingsFor('additional'); // Must match the id the personal nav entry is registered under in // Application.php ('settings_personal'), otherwise the header // current-app button is hidden on personal settings pages. $this->navigationManager ->expects($this->once()) ->method('setActiveEntry') ->with('settings_personal'); $this->personalSettingsController->index('additional'); } public function testThemingSectionActivatesAccessibilityNavEntry(): void { $this->stubSettingsFor('theming'); // The appearance/accessibility section keeps its own nav entry. $this->navigationManager ->expects($this->once()) ->method('setActiveEntry') ->with('accessibility_settings'); $this->personalSettingsController->index('theming'); } }