diff --git a/core/Controller/ContactsMenuController.php b/core/Controller/ContactsMenuController.php index edd2f2c8be..b0e0e0c6a7 100644 --- a/core/Controller/ContactsMenuController.php +++ b/core/Controller/ContactsMenuController.php @@ -28,23 +28,24 @@ use OC\Contacts\ContactsMenu\Manager; use OCP\AppFramework\Controller; use OCP\AppFramework\Http\JSONResponse; use OCP\IRequest; +use OCP\IUserSession; class ContactsMenuController extends Controller { /** @var Manager */ private $manager; - /** @var string */ - private $userId; + /** @var IUserSession */ + private $userSession; /** * @param IRequest $request - * @param string $UserId + * @param IUserSession $userSession * @param Manager $manager */ - public function __construct(IRequest $request, $UserId, Manager $manager) { + public function __construct(IRequest $request, IUserSession $userSession, Manager $manager) { parent::__construct('core', $request); - $this->userId = $UserId; + $this->userSession = $userSession; $this->manager = $manager; } @@ -55,7 +56,7 @@ class ContactsMenuController extends Controller { * @return JSONResponse */ public function index($filter = null) { - return $this->manager->getEntries($this->userId, $filter); + return $this->manager->getEntries($this->userSession->getUser(), $filter); } } diff --git a/lib/private/Contacts/ContactsMenu/ActionProviderStore.php b/lib/private/Contacts/ContactsMenu/ActionProviderStore.php index cc5996377d..ae6436095d 100644 --- a/lib/private/Contacts/ContactsMenu/ActionProviderStore.php +++ b/lib/private/Contacts/ContactsMenu/ActionProviderStore.php @@ -24,38 +24,49 @@ namespace OC\Contacts\ContactsMenu; +use Exception; +use OC\App\AppManager; use OC\Contacts\ContactsMenu\Providers\EMailProvider; use OCP\AppFramework\QueryException; use OCP\Contacts\ContactsMenu\IProvider; use OCP\ILogger; use OCP\IServerContainer; +use OCP\IUser; class ActionProviderStore { /** @var IServerContainer */ private $serverContainer; + /** @var AppManager */ + private $appManager; + /** @var ILogger */ private $logger; /** * @param IServerContainer $serverContainer + * @param AppManager $appManager + * @param ILogger $logger */ - public function __construct(IServerContainer $serverContainer, ILogger $logger) { + public function __construct(IServerContainer $serverContainer, AppManager $appManager, ILogger $logger) { $this->serverContainer = $serverContainer; + $this->appManager = $appManager; $this->logger = $logger; } /** + * @param IUser $user * @return IProvider[] * @throws Exception */ - public function getProviders() { - // TODO: include apps + public function getProviders(IUser $user) { + $appClasses = $this->getAppProviderClasses($user); $providerClasses = $this->getServerProviderClasses(); + $allClasses = array_merge($providerClasses, $appClasses); $providers = []; - foreach ($providerClasses as $class) { + foreach ($allClasses as $class) { try { $providers[] = $this->serverContainer->query($class); } catch (QueryException $ex) { @@ -63,7 +74,7 @@ class ActionProviderStore { 'message' => "Could not load contacts menu action provider $class", 'app' => 'core', ]); - throw new \Exception("Could not load contacts menu action provider"); + throw new Exception("Could not load contacts menu action provider"); } } @@ -79,4 +90,25 @@ class ActionProviderStore { ]; } + /** + * @param IUser $user + * @return string[] + */ + private function getAppProviderClasses(IUser $user) { + return array_reduce($this->appManager->getEnabledAppsForUser($user), function($all, $appId) { + $info = $this->appManager->getAppInfo($appId); + + if (!isset($info['contactsmenu']) || !isset($info['contactsmenu'])) { + // Nothing to add + return $all; + } + + $providers = array_reduce($info['contactsmenu'], function($all, $provider) { + return array_merge($all, [$provider]); + }, []); + + return array_merge($all, $providers); + }, []); + } + } diff --git a/lib/private/Contacts/ContactsMenu/Manager.php b/lib/private/Contacts/ContactsMenu/Manager.php index c759c4469d..40ceac7d78 100644 --- a/lib/private/Contacts/ContactsMenu/Manager.php +++ b/lib/private/Contacts/ContactsMenu/Manager.php @@ -27,6 +27,7 @@ namespace OC\Contacts\ContactsMenu; use OCP\App\IAppManager; use OCP\Contacts\ContactsMenu\IEntry; use OCP\IURLGenerator; +use OCP\IUser; class Manager { @@ -39,9 +40,6 @@ class Manager { /** @var IAppManager */ private $appManager; - /** @var IURLGenerator */ - private $urlGenerator; - /** * @param ContactsStore $store * @param ActionProviderStore $actionProviderStore @@ -54,18 +52,18 @@ class Manager { } /** - * @param string $userId + * @param string $user * @param string $filter * @return array */ - public function getEntries($userId, $filter) { + public function getEntries(IUser $user, $filter) { $entries = $this->store->getContacts($filter); $sortedEntries = $this->sortEntries($entries); $topEntries = array_slice($sortedEntries, 0, 25); - $this->processEntries($topEntries); + $this->processEntries($topEntries, $user); - $contactsEnabled = $this->appManager->isEnabledForUser('contacts', $userId); + $contactsEnabled = $this->appManager->isEnabledForUser('contacts', $user); return [ 'contacts' => $topEntries, 'contactsAppEnabled' => $contactsEnabled, @@ -85,9 +83,10 @@ class Manager { /** * @param IEntry[] $entries + * @param IUser $user */ - private function processEntries(array $entries) { - $providers = $this->actionProviderStore->getProviders(); + private function processEntries(array $entries, IUser $user) { + $providers = $this->actionProviderStore->getProviders($user); foreach ($entries as $entry) { foreach ($providers as $provider) { $provider->process($entry); diff --git a/tests/Core/Controller/ContactsMenuControllerTest.php b/tests/Core/Controller/ContactsMenuControllerTest.php index 2483d5e94c..bf6188e909 100644 --- a/tests/Core/Controller/ContactsMenuControllerTest.php +++ b/tests/Core/Controller/ContactsMenuControllerTest.php @@ -28,6 +28,8 @@ use OC\Contacts\ContactsMenu\Manager; use OC\Core\Controller\ContactsMenuController; use OCP\Contacts\ContactsMenu\IEntry; use OCP\IRequest; +use OCP\IUser; +use OCP\IUserSession; use PHPUnit_Framework_MockObject_MockObject; use Test\TestCase; @@ -36,8 +38,8 @@ class ContactsMenuControllerTest extends TestCase { /** @var IRequest|PHPUnit_Framework_MockObject_MockObject */ private $request; - /** @var string */ - private $userId; + /** @var IUserSession|PHPUnit_Framework_MockObject_MockObject */ + private $userSession; /** @var Manager|PHPUnit_Framework_MockObject_MockObject */ private $contactsManager; @@ -49,20 +51,24 @@ class ContactsMenuControllerTest extends TestCase { parent::setUp(); $this->request = $this->createMock(IRequest::class); - $this->userId = 'user4563'; + $this->userSession = $this->createMock(IUserSession::class); $this->contactsManager = $this->createMock(Manager::class); - $this->controller = new ContactsMenuController($this->request, $this->userId, $this->contactsManager); + $this->controller = new ContactsMenuController($this->request, $this->userSession, $this->contactsManager); } public function testIndex() { + $user = $this->createMock(IUser::class); $entries = [ $this->createMock(IEntry::class), $this->createMock(IEntry::class), ]; + $this->userSession->expects($this->once()) + ->method('getUser') + ->willReturn($user); $this->contactsManager->expects($this->once()) ->method('getEntries') - ->with($this->equalTo($this->userId), $this->equalTo(null)) + ->with($this->equalTo($user), $this->equalTo(null)) ->willReturn($entries); $response = $this->controller->index(); diff --git a/tests/lib/Contacts/ContactsMenu/ActionProviderStoreTest.php b/tests/lib/Contacts/ContactsMenu/ActionProviderStoreTest.php index 208ce94c6b..8738e19b51 100644 --- a/tests/lib/Contacts/ContactsMenu/ActionProviderStoreTest.php +++ b/tests/lib/Contacts/ContactsMenu/ActionProviderStoreTest.php @@ -25,11 +25,15 @@ namespace Tests\Contacts\ContactsMenu; use Exception; +use OC\App\AppManager; use OC\Contacts\ContactsMenu\ActionProviderStore; use OC\Contacts\ContactsMenu\Providers\EMailProvider; +use OCP\App\IAppManager; use OCP\AppFramework\QueryException; +use OCP\Contacts\ContactsMenu\IProvider; use OCP\ILogger; use OCP\IServerContainer; +use OCP\IUser; use PHPUnit_Framework_MockObject_MockObject; use Test\TestCase; @@ -38,6 +42,9 @@ class ActionProviderStoreTest extends TestCase { /** @var IServerContainer|PHPUnit_Framework_MockObject_MockObject */ private $serverContainer; + /** @var IAppManager|PHPUnit_Framework_MockObject_MockObject */ + private $appManager; + /** @var ILogger|PHPUnit_Framework_MockObject_MockObject */ private $logger; @@ -48,19 +55,61 @@ class ActionProviderStoreTest extends TestCase { parent::setUp(); $this->serverContainer = $this->createMock(IServerContainer::class); + $this->appManager = $this->createMock(AppManager::class); $this->logger = $this->createMock(ILogger::class); - $this->actionProviderStore = new ActionProviderStore($this->serverContainer, $this->logger); + + $this->actionProviderStore = new ActionProviderStore($this->serverContainer, $this->appManager, $this->logger); } public function testGetProviders() { - $emailProvider = $this->createMock(EMailProvider::class); + $user = $this->createMock(IUser::class); + $provider1 = $this->createMock(EMailProvider::class); + $provider2 = $this->createMock(IProvider::class); + + $this->appManager->expects($this->once()) + ->method('getEnabledAppsForUser') + ->with($user) + ->willReturn(['contacts']); + $this->appManager->expects($this->once()) + ->method('getAppInfo') + ->with('contacts') + ->willReturn([ + 'contactsmenu' => [ + 'OCA\Contacts\Provider1', + ], + ]); $this->serverContainer->expects($this->exactly(2)) ->method('query') ->will($this->returnValueMap([ - [EMailProvider::class, $emailProvider], + [EMailProvider::class, $provider1], + ['OCA\Contacts\Provider1', $provider2] ])); - $providers = $this->actionProviderStore->getProviders(); + $providers = $this->actionProviderStore->getProviders($user); + + $this->assertCount(2, $providers); + $this->assertInstanceOf(EMailProvider::class, $providers[0]); + } + + public function testGetProvidersOfAppWithIncompleInfo() { + $user = $this->createMock(IUser::class); + $provider1 = $this->createMock(EMailProvider::class); + + $this->appManager->expects($this->once()) + ->method('getEnabledAppsForUser') + ->with($user) + ->willReturn(['contacts']); + $this->appManager->expects($this->once()) + ->method('getAppInfo') + ->with('contacts') + ->willReturn([/* Empty info.xml */]); + $this->serverContainer->expects($this->once()) + ->method('query') + ->will($this->returnValueMap([ + [EMailProvider::class, $provider1], + ])); + + $providers = $this->actionProviderStore->getProviders($user); $this->assertCount(1, $providers); $this->assertInstanceOf(EMailProvider::class, $providers[0]); @@ -70,13 +119,16 @@ class ActionProviderStoreTest extends TestCase { * @expectedException Exception */ public function testGetProvidersWithQueryException() { - $emailProvider = $this->createMock(EMailProvider::class); - $detailsProvider = $this->createMock(DetailsProvider::class); + $user = $this->createMock(IUser::class); + $this->appManager->expects($this->once()) + ->method('getEnabledAppsForUser') + ->with($user) + ->willReturn([]); $this->serverContainer->expects($this->once()) ->method('query') ->willThrowException(new QueryException()); - $providers = $this->actionProviderStore->getProviders(); + $this->actionProviderStore->getProviders($user); } } diff --git a/tests/lib/Contacts/ContactsMenu/ManagerTest.php b/tests/lib/Contacts/ContactsMenu/ManagerTest.php index bcbcec9681..9b84bd7664 100644 --- a/tests/lib/Contacts/ContactsMenu/ManagerTest.php +++ b/tests/lib/Contacts/ContactsMenu/ManagerTest.php @@ -30,6 +30,7 @@ use OC\Contacts\ContactsMenu\Manager; use OCP\App\IAppManager; use OCP\Contacts\ContactsMenu\IEntry; use OCP\Contacts\ContactsMenu\IProvider; +use OCP\IUser; use PHPUnit_Framework_MockObject_MockObject; use Test\TestCase; @@ -71,7 +72,7 @@ class ManagerTest extends TestCase { public function testGetFilteredEntries() { $filter = 'con'; - $user = 'user849'; + $user = $this->createMock(IUser::class); $entries = $this->generateTestEntries(); $provider = $this->createMock(IProvider::class); $this->contactsStore->expects($this->once()) @@ -80,6 +81,7 @@ class ManagerTest extends TestCase { ->willReturn($entries); $this->actionProviderStore->expects($this->once()) ->method('getProviders') + ->with($user) ->willReturn([$provider]); $provider->expects($this->exactly(25)) ->method('process');