From fa2900a4adf24e5d663afd6d7d6e56a5a36da89f Mon Sep 17 00:00:00 2001 From: Tom Needham Date: Mon, 15 May 2017 12:59:09 +0100 Subject: [PATCH] Allow app to register multiple settings panels of same typ --- lib/private/Settings/SettingsManager.php | 6 ++-- tests/lib/Settings/ManagerTest.php | 46 ++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/lib/private/Settings/SettingsManager.php b/lib/private/Settings/SettingsManager.php index 68c20959b8a9..adfe8f7a039d 100644 --- a/lib/private/Settings/SettingsManager.php +++ b/lib/private/Settings/SettingsManager.php @@ -315,10 +315,12 @@ protected function findRegisteredPanels($type) { $panels = []; foreach($this->appManager->getEnabledAppsForUser($this->userSession->getUser()) as $app) { if(isset($this->appManager->getAppInfo($app)['settings'])) { - foreach($this->appManager->getAppInfo($app)['settings'] as $t => $panel) { + foreach($this->appManager->getAppInfo($app)['settings'] as $t => $detected) { if($t === $type) { - $panels[] = (string) $panel; + // Allow app to register multiple panels of the same type + $detected = is_array($detected) ? $detected : [$detected]; + $panels = array_merge($panels, $detected); } } } diff --git a/tests/lib/Settings/ManagerTest.php b/tests/lib/Settings/ManagerTest.php index 5fd31c66bb40..da093a161b03 100644 --- a/tests/lib/Settings/ManagerTest.php +++ b/tests/lib/Settings/ManagerTest.php @@ -90,6 +90,52 @@ public function testGetPanelsList() { $this->assertContains('OC\Settings\Panels\Personal\Profile', $list); } + public function testFindRegisteredPanelsAdmin() { + // Return a mock user + $user = $this->getMockBuilder('\OCP\IUser')->getMock(); + $this->userSession->expects($this->any())->method('getUser')->willReturn($user); + // Return encryption as example app with + $this->appManager->expects($this->exactly(1))->method('getEnabledAppsForUser')->with($user)->willReturn(['encryption']); + $settingsInfo = [ + 'settings' => + ['admin' => 'OCA\Encryption\TestPanel'] + ]; + $this->appManager->expects($this->exactly(2))->method('getAppInfo')->with('encryption')->willReturn($settingsInfo); + $panels = $this->invokePrivate($this->settingsManager, 'findRegisteredPanels', ['admin']); + $this->assertCount(1, $panels); + } + + public function testFindRegisteredPanelsPersonal() { + // Return a mock user + $user = $this->getMockBuilder('\OCP\IUser')->getMock(); + $this->userSession->expects($this->any())->method('getUser')->willReturn($user); + // Return encryption as example app with + $this->appManager->expects($this->exactly(1))->method('getEnabledAppsForUser')->with($user)->willReturn(['encryption']); + $settingsInfo = [ + 'settings' => + ['personal' => 'OCA\Encryption\TestPanel'] + ]; + $this->appManager->expects($this->exactly(2))->method('getAppInfo')->with('encryption')->willReturn($settingsInfo); + $panels = $this->invokePrivate($this->settingsManager, 'findRegisteredPanels', ['personal']); + $this->assertCount(1, $panels); + $this->assertEquals('OCA\Encryption\TestPanel', array_shift($panels)); + } + + public function testFindRegisteredPanelsPersonalMultiple() { + // Return a mock user + $user = $this->getMockBuilder('\OCP\IUser')->getMock(); + $this->userSession->expects($this->any())->method('getUser')->willReturn($user); + // Return encryption as example app with + $this->appManager->expects($this->exactly(1))->method('getEnabledAppsForUser')->with($user)->willReturn(['encryption']); + $settingsInfo = [ + 'settings' => + ['personal' => ['OCA\Encryption\TestPanel', 'OCA\Encryption\TestPanel2']] + ]; + $this->appManager->expects($this->exactly(2))->method('getAppInfo')->with('encryption')->willReturn($settingsInfo); + $panels = $this->invokePrivate($this->settingsManager, 'findRegisteredPanels', ['personal']); + $this->assertCount(2, $panels); + } + public function testLoadPersonalPanels() { $user = $this->getMockBuilder('\OCP\IUser')->getMock(); $this->userSession->expects($this->any())->method('getUser')->willReturn($user);