diff options
Diffstat (limited to 'apps/user_ldap/tests/User/UserTest.php')
-rw-r--r-- | apps/user_ldap/tests/User/UserTest.php | 1506 |
1 files changed, 716 insertions, 790 deletions
diff --git a/apps/user_ldap/tests/User/UserTest.php b/apps/user_ldap/tests/User/UserTest.php index 27bd7762e39..00edd8b3f9b 100644 --- a/apps/user_ldap/tests/User/UserTest.php +++ b/apps/user_ldap/tests/User/UserTest.php @@ -1,50 +1,28 @@ <?php + +declare(strict_types=1); /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Joas Schilling <coding@schilljs.com> - * @author Juan Pablo Villafáñez <jvillafanez@solidgear.es> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * @author Roger Szabo <roger.szabo@web.de> - * @author Thomas Müller <thomas.mueller@tmit.eu> - * @author Victor Dubiniuk <dubiniuk@owncloud.com> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * 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, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ - namespace OCA\User_LDAP\Tests\User; use OCA\User_LDAP\Access; use OCA\User_LDAP\Connection; -use OCA\User_LDAP\FilesystemHelper; use OCA\User_LDAP\ILDAPWrapper; -use OCA\User_LDAP\LogWrapper; -use OCA\User_LDAP\User\IUserTools; use OCA\User_LDAP\User\User; use OCP\IAvatar; use OCP\IAvatarManager; use OCP\IConfig; -use OCP\IDBConnection; use OCP\Image; use OCP\IUser; use OCP\IUserManager; use OCP\Notification\IManager as INotificationManager; use OCP\Notification\INotification; +use OCP\Util; +use PHPUnit\Framework\MockObject\MockObject; +use Psr\Log\LoggerInterface; /** * Class UserTest @@ -54,410 +32,309 @@ use OCP\Notification\INotification; * @package OCA\User_LDAP\Tests\User */ class UserTest extends \Test\TestCase { - /** @var Access|\PHPUnit_Framework_MockObject_MockObject */ - protected $access; - /** @var Connection|\PHPUnit_Framework_MockObject_MockObject */ - protected $connection; + protected Access&MockObject $access; + protected Connection&MockObject $connection; + protected IConfig&MockObject $config; + protected INotificationManager&MockObject $notificationManager; + protected IUserManager&MockObject $userManager; + protected Image&MockObject $image; + protected IAvatarManager&MockObject $avatarManager; + protected LoggerInterface&MockObject $logger; + protected string $uid = 'alice'; + protected string $dn = 'uid=alice,dc=foo,dc=bar'; + protected User $user; + + protected function setUp(): void { + parent::setUp(); - public function setUp() { - /** @var Access|\PHPUnit_Framework_MockObject_MockObject access */ - $this->access = $this->createMock(Access::class); - $this->connection = $this->createMock(Connection::class); + $this->connection = $this->getMockBuilder(Connection::class) + ->setConstructorArgs([$this->createMock(ILDAPWrapper::class)]) + ->getMock(); + $this->access = $this->createMock(Access::class); $this->access->connection = $this->connection; $this->access->expects($this->any()) ->method('getConnection') ->willReturn($this->connection); - parent::setUp(); + $this->config = $this->createMock(IConfig::class); + $this->logger = $this->createMock(LoggerInterface::class); + $this->avatarManager = $this->createMock(IAvatarManager::class); + $this->image = $this->createMock(Image::class); + $this->userManager = $this->createMock(IUserManager::class); + $this->notificationManager = $this->createMock(INotificationManager::class); + + $this->user = new User( + $this->uid, + $this->dn, + $this->access, + $this->config, + $this->image, + $this->logger, + $this->avatarManager, + $this->userManager, + $this->notificationManager + ); } - private function getTestInstances() { - $access = $this->createMock(IUserTools::class); - $config = $this->createMock(IConfig::class); - $filesys = $this->createMock(FilesystemHelper::class); - $log = $this->createMock(LogWrapper::class); - $avaMgr = $this->createMock(IAvatarManager::class); - $image = $this->createMock(Image::class); - $dbc = $this->createMock(IDBConnection::class); - $userMgr = $this->createMock(IUserManager::class); - $notiMgr = $this->createMock(INotificationManager::class); - - return array($access, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr, $notiMgr); + public function testGetDNandUsername(): void { + $this->assertSame($this->dn, $this->user->getDN()); + $this->assertSame($this->uid, $this->user->getUsername()); } - public function testGetDNandUsername() { - list($access, $config, $filesys, $image, $log, $avaMgr, $db, $userMgr, $notiMgr) = - $this->getTestInstances(); - - $uid = 'alice'; - $dn = 'uid=alice,dc=foo,dc=bar'; - - $user = new User( - $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr, $userMgr, $notiMgr); - - $this->assertSame($dn, $user->getDN()); - $this->assertSame($uid, $user->getUsername()); - } - - public function testUpdateEmailProvided() { - list(, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr, $notiMgr) = - $this->getTestInstances(); - + public function testUpdateEmailProvided(): void { $this->connection->expects($this->once()) ->method('__get') ->with($this->equalTo('ldapEmailAttribute')) - ->will($this->returnValue('email')); + ->willReturn('email'); $this->access->expects($this->once()) ->method('readAttribute') - ->with($this->equalTo('uid=alice,dc=foo,dc=bar'), + ->with($this->equalTo($this->dn), $this->equalTo('email')) - ->will($this->returnValue(array('alice@foo.bar'))); - - $uid = 'alice'; - $dn = 'uid=alice,dc=foo,dc=bar'; + ->willReturn(['alice@foo.bar']); - $uuser = $this->getMockBuilder(IUser::class) - ->disableOriginalConstructor() - ->getMock(); - $uuser->expects($this->once()) - ->method('setEMailAddress') + $coreUser = $this->createMock(IUser::class); + $coreUser->expects($this->once()) + ->method('setSystemEMailAddress') ->with('alice@foo.bar'); - /** @var IUserManager | \PHPUnit_Framework_MockObject_MockObject $userMgr */ - $userMgr->expects($this->any()) + + $this->userManager->expects($this->any()) ->method('get') - ->willReturn($uuser); - $user = new User( - $uid, $dn, $this->access, $config, $filesys, $image, $log, $avaMgr, $userMgr, $notiMgr); + ->willReturn($coreUser); - $user->updateEmail(); + $this->user->updateEmail(); } - public function testUpdateEmailNotProvided() { - list(, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr, $notiMgr) = - $this->getTestInstances(); - + public function testUpdateEmailNotProvided(): void { $this->connection->expects($this->once()) ->method('__get') ->with($this->equalTo('ldapEmailAttribute')) - ->will($this->returnValue('email')); + ->willReturn('email'); + $this->access->expects($this->once()) ->method('readAttribute') - ->with($this->equalTo('uid=alice,dc=foo,dc=bar'), + ->with($this->equalTo($this->dn), $this->equalTo('email')) - ->will($this->returnValue(false)); + ->willReturn(false); - $config->expects($this->never()) + $this->config->expects($this->never()) ->method('setUserValue'); - $uid = 'alice'; - $dn = 'uid=alice,dc=foo,dc=bar'; - - $user = new User( - $uid, $dn, $this->access, $config, $filesys, $image, $log, $avaMgr, $userMgr, $notiMgr); - - $user->updateEmail(); + $this->user->updateEmail(); } - public function testUpdateEmailNotConfigured() { - list(, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr, $notiMgr) = - $this->getTestInstances(); - + public function testUpdateEmailNotConfigured(): void { $this->connection->expects($this->once()) ->method('__get') ->with($this->equalTo('ldapEmailAttribute')) - ->will($this->returnValue('')); + ->willReturn(''); $this->access->expects($this->never()) ->method('readAttribute'); - $config->expects($this->never()) + $this->config->expects($this->never()) ->method('setUserValue'); - $uid = 'alice'; - $dn = 'uid=alice,dc=foo,dc=bar'; - - $user = new User( - $uid, $dn, $this->access, $config, $filesys, $image, $log, $avaMgr, $userMgr, $notiMgr); - - $user->updateEmail(); + $this->user->updateEmail(); } - public function testUpdateQuotaAllProvided() { - list(, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr, $notiMgr) = - $this->getTestInstances(); - - $this->connection->expects($this->at(0)) + public function testUpdateQuotaAllProvided(): void { + $this->connection->expects($this->exactly(2)) ->method('__get') - ->with($this->equalTo('ldapQuotaAttribute')) - ->will($this->returnValue('myquota')); - $this->connection->expects($this->exactly(1)) - ->method('__get'); + ->willReturnMap([ + ['ldapQuotaAttribute', 'myquota'], + ['ldapQuotaDefault', ''] + ]); $this->access->expects($this->once()) ->method('readAttribute') - ->with($this->equalTo('uid=alice,dc=foo,dc=bar'), + ->with($this->equalTo($this->dn), $this->equalTo('myquota')) - ->will($this->returnValue(array('42 GB'))); + ->willReturn(['42 GB']); - $user = $this->createMock(IUser::class); - $user->expects($this->once()) + $coreUser = $this->createMock(IUser::class); + $coreUser->expects($this->once()) ->method('setQuota') ->with('42 GB'); - $userMgr->expects($this->once()) + $this->userManager->expects($this->atLeastOnce()) ->method('get') - ->with('alice') - ->will($this->returnValue($user)); - - $uid = 'alice'; - $dn = 'uid=alice,dc=foo,dc=bar'; - - $user = new User( - $uid, $dn, $this->access, $config, $filesys, $image, $log, $avaMgr, $userMgr, $notiMgr); + ->with($this->uid) + ->willReturn($coreUser); - $user->updateQuota(); + $this->user->updateQuota(); } - public function testUpdateQuotaToDefaultAllProvided() { - list(, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr, $notiMgr) = - $this->getTestInstances(); - - $this->connection->expects($this->at(0)) + public function testUpdateQuotaToDefaultAllProvided(): void { + $this->connection->expects($this->exactly(2)) ->method('__get') - ->with($this->equalTo('ldapQuotaAttribute')) - ->will($this->returnValue('myquota')); - $this->connection->expects($this->exactly(1)) - ->method('__get'); + ->willReturnMap([ + ['ldapQuotaAttribute', 'myquota'], + ['ldapQuotaDefault', ''] + ]); $this->access->expects($this->once()) ->method('readAttribute') - ->with($this->equalTo('uid=alice,dc=foo,dc=bar'), + ->with($this->equalTo($this->dn), $this->equalTo('myquota')) - ->will($this->returnValue(array('default'))); + ->willReturn(['default']); - $user = $this->createMock('\OCP\IUser'); - $user->expects($this->once()) + $coreUser = $this->createMock(IUser::class); + $coreUser->expects($this->once()) ->method('setQuota') ->with('default'); - $userMgr->expects($this->once()) + $this->userManager->expects($this->once()) ->method('get') - ->with('alice') - ->will($this->returnValue($user)); - - $uid = 'alice'; - $dn = 'uid=alice,dc=foo,dc=bar'; + ->with($this->uid) + ->willReturn($coreUser); - $user = new User( - $uid, $dn, $this->access, $config, $filesys, $image, $log, $avaMgr, $userMgr, $notiMgr); - - $user->updateQuota(); + $this->user->updateQuota(); } - public function testUpdateQuotaToNoneAllProvided() { - list(, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr, $notiMgr) = - $this->getTestInstances(); - - $this->connection->expects($this->at(0)) + public function testUpdateQuotaToNoneAllProvided(): void { + $this->connection->expects($this->exactly(2)) ->method('__get') - ->with($this->equalTo('ldapQuotaAttribute')) - ->will($this->returnValue('myquota')); - $this->connection->expects($this->exactly(1)) - ->method('__get'); + ->willReturnMap([ + ['ldapQuotaAttribute', 'myquota'], + ['ldapQuotaDefault', ''] + ]); $this->access->expects($this->once()) ->method('readAttribute') - ->with($this->equalTo('uid=alice,dc=foo,dc=bar'), + ->with($this->equalTo($this->dn), $this->equalTo('myquota')) - ->will($this->returnValue(array('none'))); + ->willReturn(['none']); - $user = $this->createMock('\OCP\IUser'); - $user->expects($this->once()) + $coreUser = $this->createMock(IUser::class); + $coreUser->expects($this->once()) ->method('setQuota') ->with('none'); - $userMgr->expects($this->once()) + $this->userManager->expects($this->once()) ->method('get') - ->with('alice') - ->will($this->returnValue($user)); + ->with($this->uid) + ->willReturn($coreUser); - $uid = 'alice'; - $dn = 'uid=alice,dc=foo,dc=bar'; - - $user = new User( - $uid, $dn, $this->access, $config, $filesys, $image, $log, $avaMgr, $userMgr, $notiMgr); - - $user->updateQuota(); + $this->user->updateQuota(); } - public function testUpdateQuotaDefaultProvided() { - list(, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr, $notiMgr) = - $this->getTestInstances(); - - $this->connection->expects($this->at(0)) - ->method('__get') - ->with($this->equalTo('ldapQuotaAttribute')) - ->will($this->returnValue('myquota')); - $this->connection->expects($this->at(1)) - ->method('__get') - ->with($this->equalTo('ldapQuotaDefault')) - ->will($this->returnValue('25 GB')); + public function testUpdateQuotaDefaultProvided(): void { $this->connection->expects($this->exactly(2)) - ->method('__get'); + ->method('__get') + ->willReturnMap([ + ['ldapQuotaAttribute', 'myquota'], + ['ldapQuotaDefault', '25 GB'], + ]); $this->access->expects($this->once()) ->method('readAttribute') - ->with($this->equalTo('uid=alice,dc=foo,dc=bar'), + ->with($this->equalTo($this->dn), $this->equalTo('myquota')) - ->will($this->returnValue(false)); + ->willReturn(false); - $user = $this->createMock(IUser::class); - $user->expects($this->once()) + $coreUser = $this->createMock(IUser::class); + $coreUser->expects($this->once()) ->method('setQuota') ->with('25 GB'); - $userMgr->expects($this->once()) + $this->userManager->expects($this->once()) ->method('get') - ->with('alice') - ->will($this->returnValue($user)); + ->with($this->uid) + ->willReturn($coreUser); - $uid = 'alice'; - $dn = 'uid=alice,dc=foo,dc=bar'; - - $user = new User( - $uid, $dn, $this->access, $config, $filesys, $image, $log, $avaMgr, $userMgr, $notiMgr); - - $user->updateQuota(); + $this->user->updateQuota(); } - public function testUpdateQuotaIndividualProvided() { - list(, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr, $notiMgr) = - $this->getTestInstances(); - - $this->connection->expects($this->at(0)) + public function testUpdateQuotaIndividualProvided(): void { + $this->connection->expects($this->exactly(2)) ->method('__get') - ->with($this->equalTo('ldapQuotaAttribute')) - ->will($this->returnValue('myquota')); - $this->connection->expects($this->exactly(1)) - ->method('__get'); + ->willReturnMap([ + ['ldapQuotaAttribute', 'myquota'], + ['ldapQuotaDefault', ''] + ]); $this->access->expects($this->once()) ->method('readAttribute') - ->with($this->equalTo('uid=alice,dc=foo,dc=bar'), + ->with($this->equalTo($this->dn), $this->equalTo('myquota')) - ->will($this->returnValue(array('27 GB'))); + ->willReturn(['27 GB']); - $user = $this->createMock(IUser::class); - $user->expects($this->once()) + $coreUser = $this->createMock(IUser::class); + $coreUser->expects($this->once()) ->method('setQuota') ->with('27 GB'); - $userMgr->expects($this->once()) + $this->userManager->expects($this->once()) ->method('get') - ->with('alice') - ->will($this->returnValue($user)); - - $uid = 'alice'; - $dn = 'uid=alice,dc=foo,dc=bar'; - - $user = new User( - $uid, $dn, $this->access, $config, $filesys, $image, $log, $avaMgr, $userMgr, $notiMgr); + ->with($this->uid) + ->willReturn($coreUser); - $user->updateQuota(); + $this->user->updateQuota(); } - public function testUpdateQuotaNoneProvided() { - list(, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr, $notiMgr) = - $this->getTestInstances(); - - $this->connection->expects($this->at(0)) - ->method('__get') - ->with($this->equalTo('ldapQuotaAttribute')) - ->will($this->returnValue('myquota')); - $this->connection->expects($this->at(1)) - ->method('__get') - ->with($this->equalTo('ldapQuotaDefault')) - ->will($this->returnValue('')); + public function testUpdateQuotaNoneProvided(): void { $this->connection->expects($this->exactly(2)) - ->method('__get'); + ->method('__get') + ->willReturnMap([ + ['ldapQuotaAttribute', 'myquota'], + ['ldapQuotaDefault', ''] + ]); $this->access->expects($this->once()) ->method('readAttribute') - ->with($this->equalTo('uid=alice,dc=foo,dc=bar'), + ->with($this->equalTo($this->dn), $this->equalTo('myquota')) - ->will($this->returnValue(false)); + ->willReturn(false); - $user = $this->createMock('\OCP\IUser'); - $user->expects($this->never()) + $coreUser = $this->createMock(IUser::class); + $coreUser->expects($this->never()) ->method('setQuota'); - $userMgr->expects($this->once()) + $this->userManager->expects($this->never()) ->method('get') - ->with('alice') - ->will($this->returnValue($user)); + ->with($this->uid); - $config->expects($this->never()) + $this->config->expects($this->never()) ->method('setUserValue'); - $uid = 'alice'; - $dn = 'uid=alice,dc=foo,dc=bar'; - - $user = new User( - $uid, $dn, $this->access, $config, $filesys, $image, $log, $avaMgr, $userMgr, $notiMgr); - - $user->updateQuota(); + $this->user->updateQuota(); } - public function testUpdateQuotaNoneConfigured() { - list(, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr, $notiMgr) = - $this->getTestInstances(); - - $this->connection->expects($this->at(0)) - ->method('__get') - ->with($this->equalTo('ldapQuotaAttribute')) - ->will($this->returnValue('')); - $this->connection->expects($this->at(1)) - ->method('__get') - ->with($this->equalTo('ldapQuotaDefault')) - ->will($this->returnValue('')); + public function testUpdateQuotaNoneConfigured(): void { $this->connection->expects($this->exactly(2)) - ->method('__get'); + ->method('__get') + ->willReturnMap([ + ['ldapQuotaAttribute', ''], + ['ldapQuotaDefault', ''] + ]); - $user = $this->createMock('\OCP\IUser'); - $user->expects($this->never()) + $coreUser = $this->createMock(IUser::class); + $coreUser->expects($this->never()) ->method('setQuota'); - $userMgr->expects($this->once()) - ->method('get') - ->with('alice') - ->will($this->returnValue($user)); + $this->userManager->expects($this->never()) + ->method('get'); $this->access->expects($this->never()) ->method('readAttribute'); - $config->expects($this->never()) + $this->config->expects($this->never()) ->method('setUserValue'); - $uid = 'alice'; - $dn = 'uid=alice,dc=foo,dc=bar'; - - $user = new User( - $uid, $dn, $this->access, $config, $filesys, $image, $log, $avaMgr, $userMgr, $notiMgr); - - $user->updateQuota(); + $this->user->updateQuota(); } - public function testUpdateQuotaFromValue() { - list(, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr, $notiMgr) = - $this->getTestInstances(); - + public function testUpdateQuotaFromValue(): void { $readQuota = '19 GB'; - $this->connection->expects($this->never()) + $this->connection->expects($this->exactly(2)) ->method('__get') - ->with($this->equalTo('ldapQuotaDefault')); + ->willReturnMap([ + ['ldapQuotaAttribute', 'myquota'], + ['ldapQuotaDefault', ''] + ]); $this->access->expects($this->never()) ->method('readAttribute'); @@ -467,787 +344,836 @@ class UserTest extends \Test\TestCase { ->method('setQuota') ->with($readQuota); - $userMgr->expects($this->once()) + $this->userManager->expects($this->once()) ->method('get') - ->with('alice') - ->will($this->returnValue($user)); - - $uid = 'alice'; - $dn = 'uid=alice,dc=foo,dc=bar'; - - $user = new User( - $uid, $dn, $this->access, $config, $filesys, $image, $log, $avaMgr, $userMgr, $notiMgr); + ->with($this->uid) + ->willReturn($user); - $user->updateQuota($readQuota); + $this->user->updateQuota($readQuota); } /** * Unparseable quota will fallback to use the LDAP default */ - public function testUpdateWrongQuotaAllProvided() { - list(, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr, $notiMgr) = - $this->getTestInstances(); - - $this->connection->expects($this->at(0)) - ->method('__get') - ->with($this->equalTo('ldapQuotaAttribute')) - ->will($this->returnValue('myquota')); - $this->connection->expects($this->at(1)) - ->method('__get') - ->with($this->equalTo('ldapQuotaDefault')) - ->will($this->returnValue('23 GB')); + public function testUpdateWrongQuotaAllProvided(): void { $this->connection->expects($this->exactly(2)) - ->method('__get'); + ->method('__get') + ->willReturnMap([ + ['ldapQuotaAttribute', 'myquota'], + ['ldapQuotaDefault', '23 GB'] + ]); $this->access->expects($this->once()) ->method('readAttribute') - ->with($this->equalTo('uid=alice,dc=foo,dc=bar'), + ->with($this->equalTo($this->dn), $this->equalTo('myquota')) - ->will($this->returnValue(array('42 GBwos'))); + ->willReturn(['42 GBwos']); - $user = $this->createMock('\OCP\IUser'); - $user->expects($this->once()) + $coreUser = $this->createMock(IUser::class); + $coreUser->expects($this->once()) ->method('setQuota') ->with('23 GB'); - $userMgr->expects($this->once()) + $this->userManager->expects($this->once()) ->method('get') - ->with('alice') - ->will($this->returnValue($user)); - - $uid = 'alice'; - $dn = 'uid=alice,dc=foo,dc=bar'; + ->with($this->uid) + ->willReturn($coreUser); - $user = new User( - $uid, $dn, $this->access, $config, $filesys, $image, $log, $avaMgr, $userMgr, $notiMgr); - - $user->updateQuota(); + $this->user->updateQuota(); } /** * No user quota and wrong default will set 'default' as quota */ - public function testUpdateWrongDefaultQuotaProvided() { - list(, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr, $notiMgr) = - $this->getTestInstances(); - - $this->connection->expects($this->at(0)) - ->method('__get') - ->with($this->equalTo('ldapQuotaAttribute')) - ->will($this->returnValue('myquota')); - $this->connection->expects($this->at(1)) - ->method('__get') - ->with($this->equalTo('ldapQuotaDefault')) - ->will($this->returnValue('23 GBwowowo')); + public function testUpdateWrongDefaultQuotaProvided(): void { $this->connection->expects($this->exactly(2)) - ->method('__get'); + ->method('__get') + ->willReturnMap([ + ['ldapQuotaAttribute', 'myquota'], + ['ldapQuotaDefault', '23 GBwowowo'] + ]); $this->access->expects($this->once()) ->method('readAttribute') - ->with($this->equalTo('uid=alice,dc=foo,dc=bar'), + ->with($this->equalTo($this->dn), $this->equalTo('myquota')) - ->will($this->returnValue(false)); + ->willReturn(false); - $user = $this->createMock('\OCP\IUser'); - $user->expects($this->never()) + $coreUser = $this->createMock(IUser::class); + $coreUser->expects($this->never()) ->method('setQuota'); - $userMgr->expects($this->once()) - ->method('get') - ->with('alice') - ->will($this->returnValue($user)); - - $uid = 'alice'; - $dn = 'uid=alice,dc=foo,dc=bar'; - - $user = new User( - $uid, $dn, $this->access, $config, $filesys, $image, $log, $avaMgr, $userMgr, $notiMgr); + $this->userManager->expects($this->never()) + ->method('get'); - $user->updateQuota(); + $this->user->updateQuota(); } /** * Wrong user quota and wrong default will set 'default' as quota */ - public function testUpdateWrongQuotaAndDefaultAllProvided() { - list(, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr, $notiMgr) = - $this->getTestInstances(); - - $this->connection->expects($this->at(0)) - ->method('__get') - ->with($this->equalTo('ldapQuotaAttribute')) - ->will($this->returnValue('myquota')); - $this->connection->expects($this->at(1)) - ->method('__get') - ->with($this->equalTo('ldapQuotaDefault')) - ->will($this->returnValue('23 GBwowowo')); + public function testUpdateWrongQuotaAndDefaultAllProvided(): void { $this->connection->expects($this->exactly(2)) - ->method('__get'); + ->method('__get') + ->willReturnMap([ + ['ldapQuotaAttribute', 'myquota'], + ['ldapQuotaDefault', '23 GBwowowo'] + ]); $this->access->expects($this->once()) ->method('readAttribute') - ->with($this->equalTo('uid=alice,dc=foo,dc=bar'), + ->with($this->equalTo($this->dn), $this->equalTo('myquota')) - ->will($this->returnValue(array('23 flush'))); + ->willReturn(['23 flush']); - $user = $this->createMock('\OCP\IUser'); - $user->expects($this->never()) + $coreUser = $this->createMock(IUser::class); + $coreUser->expects($this->never()) ->method('setQuota'); - $userMgr->expects($this->once()) - ->method('get') - ->with('alice') - ->will($this->returnValue($user)); - - $uid = 'alice'; - $dn = 'uid=alice,dc=foo,dc=bar'; + $this->userManager->expects($this->never()) + ->method('get'); - $user = new User( - $uid, $dn, $this->access, $config, $filesys, $image, $log, $avaMgr, $userMgr, $notiMgr); - - $user->updateQuota(); + $this->user->updateQuota(); } /** * No quota attribute set and wrong default will set 'default' as quota */ - public function testUpdateWrongDefaultQuotaNotProvided() { - list(, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr, $notiMgr) = - $this->getTestInstances(); - - $this->connection->expects($this->at(0)) - ->method('__get') - ->with($this->equalTo('ldapQuotaAttribute')) - ->will($this->returnValue('')); - $this->connection->expects($this->at(1)) - ->method('__get') - ->with($this->equalTo('ldapQuotaDefault')) - ->will($this->returnValue('23 GBwowowo')); + public function testUpdateWrongDefaultQuotaNotProvided(): void { $this->connection->expects($this->exactly(2)) - ->method('__get'); + ->method('__get') + ->willReturnMap([ + ['ldapQuotaAttribute', ''], + ['ldapQuotaDefault', '23 GBwowowo'] + ]); $this->access->expects($this->never()) ->method('readAttribute'); - $user = $this->createMock('\OCP\IUser'); - $user->expects($this->never()) + $coreUser = $this->createMock(IUser::class); + $coreUser->expects($this->never()) ->method('setQuota'); - $userMgr->expects($this->once()) - ->method('get') - ->with('alice') - ->will($this->returnValue($user)); - - $uid = 'alice'; - $dn = 'uid=alice,dc=foo,dc=bar'; - - $user = new User( - $uid, $dn, $this->access, $config, $filesys, $image, $log, $avaMgr, $userMgr, $notiMgr); + $this->userManager->expects($this->never()) + ->method('get'); - $user->updateQuota(); + $this->user->updateQuota(); } - //the testUpdateAvatar series also implicitely tests getAvatarImage - public function testUpdateAvatarJpegPhotoProvided() { - list(, $config, $filesys, $image, $log, $avaMgr, , $userMgr, $notiMgr) = - $this->getTestInstances(); - + //the testUpdateAvatar series also implicitly tests getAvatarImage + public function XtestUpdateAvatarJpegPhotoProvided() { $this->access->expects($this->once()) ->method('readAttribute') - ->with($this->equalTo('uid=alice,dc=foo,dc=bar'), - $this->equalTo('jpegPhoto')) - ->will($this->returnValue(array('this is a photo'))); - - $image->expects($this->once()) + ->with($this->equalTo($this->dn), + $this->equalTo('jpegphoto')) + ->willReturn(['this is a photo']); + + $this->image->expects($this->once()) + ->method('loadFromBase64') + ->willReturn('imageResource'); + $this->image->expects($this->once()) ->method('valid') - ->will($this->returnValue(true)); - $image->expects($this->once()) + ->willReturn(true); + $this->image->expects($this->once()) ->method('width') - ->will($this->returnValue(128)); - $image->expects($this->once()) + ->willReturn(128); + $this->image->expects($this->once()) ->method('height') - ->will($this->returnValue(128)); - $image->expects($this->once()) + ->willReturn(128); + $this->image->expects($this->once()) ->method('centerCrop') - ->will($this->returnValue(true)); + ->willReturn(true); + $this->image->expects($this->once()) + ->method('data') + ->willReturn('this is a photo'); - $filesys->expects($this->once()) - ->method('isLoaded') - ->will($this->returnValue(true)); + $this->config->expects($this->once()) + ->method('getUserValue') + ->with($this->uid, 'user_ldap', 'lastAvatarChecksum', '') + ->willReturn(''); + $this->config->expects($this->once()) + ->method('setUserValue') + ->with($this->uid, 'user_ldap', 'lastAvatarChecksum', md5('this is a photo')); $avatar = $this->createMock(IAvatar::class); $avatar->expects($this->once()) ->method('set') - ->with($this->isInstanceOf($image)); + ->with($this->image); - $avaMgr->expects($this->once()) + $this->avatarManager->expects($this->once()) ->method('getAvatar') - ->with($this->equalTo('alice')) - ->will($this->returnValue($avatar)); + ->with($this->equalTo($this->uid)) + ->willReturn($avatar); - $uid = 'alice'; - $dn = 'uid=alice,dc=foo,dc=bar'; - - $user = new User( - $uid, $dn, $this->access, $config, $filesys, $image, $log, $avaMgr, $userMgr, $notiMgr); + $this->connection->expects($this->any()) + ->method('resolveRule') + ->with('avatar') + ->willReturn(['jpegphoto', 'thumbnailphoto']); - $user->updateAvatar(); + $this->user->updateAvatar(); } - public function testUpdateAvatarThumbnailPhotoProvided() { - list(, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr, $notiMgr) = - $this->getTestInstances(); + public function testUpdateAvatarKnownJpegPhotoProvided(): void { + $this->access->expects($this->once()) + ->method('readAttribute') + ->with($this->equalTo($this->dn), + $this->equalTo('jpegphoto')) + ->willReturn(['this is a photo']); + + $this->image->expects($this->once()) + ->method('loadFromBase64') + ->willReturn('imageResource'); + $this->image->expects($this->never()) + ->method('valid'); + $this->image->expects($this->never()) + ->method('width'); + $this->image->expects($this->never()) + ->method('height'); + $this->image->expects($this->never()) + ->method('centerCrop'); + $this->image->expects($this->once()) + ->method('data') + ->willReturn('this is a photo'); + + $this->config->expects($this->once()) + ->method('getUserValue') + ->with($this->uid, 'user_ldap', 'lastAvatarChecksum', '') + ->willReturn(md5('this is a photo')); + $this->config->expects($this->never()) + ->method('setUserValue'); + + $avatar = $this->createMock(IAvatar::class); + $avatar->expects($this->never()) + ->method('set'); + $avatar->expects($this->any()) + ->method('exists') + ->willReturn(true); + $avatar->expects($this->any()) + ->method('isCustomAvatar') + ->willReturn(true); + + $this->avatarManager->expects($this->any()) + ->method('getAvatar') + ->with($this->uid) + ->willReturn($avatar); + + $this->connection->expects($this->any()) + ->method('resolveRule') + ->with('avatar') + ->willReturn(['jpegphoto', 'thumbnailphoto']); + $this->assertTrue($this->user->updateAvatar()); + } + + public function XtestUpdateAvatarThumbnailPhotoProvided() { $this->access->expects($this->any()) ->method('readAttribute') - ->willReturnCallback(function($dn, $attr) { - if($dn === 'uid=alice,dc=foo,dc=bar' - && $attr === 'jpegPhoto') - { + ->willReturnCallback(function ($dn, $attr) { + if ($dn === $this->dn + && $attr === 'jpegphoto') { return false; - } elseif($dn === 'uid=alice,dc=foo,dc=bar' - && $attr === 'thumbnailPhoto') - { + } elseif ($dn === $this->dn + && $attr === 'thumbnailphoto') { return ['this is a photo']; } return null; }); - $image->expects($this->once()) + $this->image->expects($this->once()) + ->method('loadFromBase64') + ->willReturn('imageResource'); + $this->image->expects($this->once()) ->method('valid') - ->will($this->returnValue(true)); - $image->expects($this->once()) + ->willReturn(true); + $this->image->expects($this->once()) ->method('width') - ->will($this->returnValue(128)); - $image->expects($this->once()) + ->willReturn(128); + $this->image->expects($this->once()) ->method('height') - ->will($this->returnValue(128)); - $image->expects($this->once()) + ->willReturn(128); + $this->image->expects($this->once()) ->method('centerCrop') - ->will($this->returnValue(true)); + ->willReturn(true); + $this->image->expects($this->once()) + ->method('data') + ->willReturn('this is a photo'); - $filesys->expects($this->once()) - ->method('isLoaded') - ->will($this->returnValue(true)); + $this->config->expects($this->once()) + ->method('getUserValue') + ->with($this->uid, 'user_ldap', 'lastAvatarChecksum', '') + ->willReturn(''); + $this->config->expects($this->once()) + ->method('setUserValue') + ->with($this->uid, 'user_ldap', 'lastAvatarChecksum', md5('this is a photo')); $avatar = $this->createMock(IAvatar::class); $avatar->expects($this->once()) ->method('set') - ->with($this->isInstanceOf($image)); + ->with($this->image); - $avaMgr->expects($this->once()) + $this->avatarManager->expects($this->once()) ->method('getAvatar') - ->with($this->equalTo('alice')) - ->will($this->returnValue($avatar)); + ->with($this->equalTo($this->uid)) + ->willReturn($avatar); - $uid = 'alice'; - $dn = 'uid=alice,dc=foo,dc=bar'; - - $user = new User( - $uid, $dn, $this->access, $config, $filesys, $image, $log, $avaMgr, $userMgr, $notiMgr); + $this->connection->expects($this->any()) + ->method('resolveRule') + ->with('avatar') + ->willReturn(['jpegphoto', 'thumbnailphoto']); - $user->updateAvatar(); + $this->user->updateAvatar(); } - public function testUpdateAvatarNotProvided() { - list(, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr, $notiMgr) = - $this->getTestInstances(); - + public function testUpdateAvatarCorruptPhotoProvided(): void { $this->access->expects($this->any()) ->method('readAttribute') - ->willReturnCallback(function($dn, $attr) { - if($dn === 'uid=alice,dc=foo,dc=bar' - && $attr === 'jpegPhoto') - { - return false; - } elseif($dn === 'uid=alice,dc=foo,dc=bar' - && $attr === 'thumbnailPhoto') - { + ->willReturnCallback(function ($dn, $attr) { + if ($dn === $this->dn + && $attr === 'jpegphoto') { return false; + } elseif ($dn === $this->dn + && $attr === 'thumbnailphoto') { + return ['this is a photo']; } return null; }); - $image->expects($this->never()) + $this->image->expects($this->once()) + ->method('loadFromBase64') + ->willReturn(false); + $this->image->expects($this->never()) ->method('valid'); - $image->expects($this->never()) + $this->image->expects($this->never()) ->method('width'); - $image->expects($this->never()) + $this->image->expects($this->never()) ->method('height'); - $image->expects($this->never()) + $this->image->expects($this->never()) ->method('centerCrop'); + $this->image->expects($this->never()) + ->method('data'); - $filesys->expects($this->never()) - ->method('isLoaded'); + $this->config->expects($this->never()) + ->method('getUserValue'); + $this->config->expects($this->never()) + ->method('setUserValue'); - $avaMgr->expects($this->never()) - ->method('getAvatar'); + $avatar = $this->createMock(IAvatar::class); + $avatar->expects($this->never()) + ->method('set'); - $uid = 'alice'; - $dn = 'uid=alice,dc=foo,dc=bar'; + $this->avatarManager->expects($this->never()) + ->method('getAvatar'); - $user = new User( - $uid, $dn, $this->access, $config, $filesys, $image, $log, $avaMgr, $userMgr, $notiMgr); + $this->connection->expects($this->any()) + ->method('resolveRule') + ->with('avatar') + ->willReturn(['jpegphoto', 'thumbnailphoto']); - $user->updateAvatar(); + $this->user->updateAvatar(); } - public function testUpdateBeforeFirstLogin() { - list(, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr, $notiMgr) = - $this->getTestInstances(); + public function XtestUpdateAvatarUnsupportedThumbnailPhotoProvided() { + $this->access->expects($this->any()) + ->method('readAttribute') + ->willReturnCallback(function ($dn, $attr) { + if ($dn === $this->dn + && $attr === 'jpegphoto') { + return false; + } elseif ($dn === $this->dn + && $attr === 'thumbnailphoto') { + return ['this is a photo']; + } + return null; + }); - $config->expects($this->at(0)) - ->method('getUserValue') - ->with($this->equalTo('alice'), $this->equalTo('user_ldap'), - $this->equalTo(User::USER_PREFKEY_FIRSTLOGIN), - $this->equalTo(0)) - ->will($this->returnValue(0)); - $config->expects($this->at(1)) + $this->image->expects($this->once()) + ->method('loadFromBase64') + ->willReturn('imageResource'); + $this->image->expects($this->once()) + ->method('valid') + ->willReturn(true); + $this->image->expects($this->once()) + ->method('width') + ->willReturn(128); + $this->image->expects($this->once()) + ->method('height') + ->willReturn(128); + $this->image->expects($this->once()) + ->method('centerCrop') + ->willReturn(true); + $this->image->expects($this->once()) + ->method('data') + ->willReturn('this is a photo'); + + $this->config->expects($this->once()) ->method('getUserValue') - ->with($this->equalTo('alice'), $this->equalTo('user_ldap'), - $this->equalTo(User::USER_PREFKEY_LASTREFRESH), - $this->equalTo(0)) - ->will($this->returnValue(0)); - $config->expects($this->exactly(2)) - ->method('getUserValue'); - $config->expects($this->never()) + ->with($this->uid, 'user_ldap', 'lastAvatarChecksum', '') + ->willReturn(''); + $this->config->expects($this->never()) ->method('setUserValue'); - $uid = 'alice'; - $dn = 'uid=alice,dc=foo,dc=bar'; + $avatar = $this->createMock(IAvatar::class); + $avatar->expects($this->once()) + ->method('set') + ->with($this->image) + ->willThrowException(new \Exception()); + + $this->avatarManager->expects($this->once()) + ->method('getAvatar') + ->with($this->equalTo($this->uid)) + ->willReturn($avatar); - $user = new User( - $uid, $dn, $this->access, $config, $filesys, $image, $log, $avaMgr, $userMgr, $notiMgr); + $this->connection->expects($this->any()) + ->method('resolveRule') + ->with('avatar') + ->willReturn(['jpegphoto', 'thumbnailphoto']); - $user->update(); + $this->assertFalse($this->user->updateAvatar()); } - public function testUpdateAfterFirstLogin() { - list(, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr, $notiMgr) = - $this->getTestInstances(); + public function testUpdateAvatarNotProvided(): void { + $this->access->expects($this->any()) + ->method('readAttribute') + ->willReturnCallback(function ($dn, $attr) { + if ($dn === $this->dn + && $attr === 'jpegPhoto') { + return false; + } elseif ($dn === $this->dn + && $attr === 'thumbnailPhoto') { + return false; + } + return null; + }); - $config->expects($this->at(0)) - ->method('getUserValue') - ->with($this->equalTo('alice'), $this->equalTo('user_ldap'), - $this->equalTo(User::USER_PREFKEY_FIRSTLOGIN), - $this->equalTo(0)) - ->will($this->returnValue(1)); - $config->expects($this->at(1)) - ->method('getUserValue') - ->with($this->equalTo('alice'), $this->equalTo('user_ldap'), - $this->equalTo(User::USER_PREFKEY_LASTREFRESH), - $this->equalTo(0)) - ->will($this->returnValue(0)); - $config->expects($this->exactly(2)) + $this->image->expects($this->never()) + ->method('valid'); + $this->image->expects($this->never()) + ->method('width'); + $this->image->expects($this->never()) + ->method('height'); + $this->image->expects($this->never()) + ->method('centerCrop'); + $this->image->expects($this->never()) + ->method('data'); + + $this->config->expects($this->never()) ->method('getUserValue'); - $config->expects($this->once()) - ->method('setUserValue') - ->with($this->equalTo('alice'), $this->equalTo('user_ldap'), - $this->equalTo(User::USER_PREFKEY_LASTREFRESH), - $this->anything()) - ->will($this->returnValue(true)); + $this->config->expects($this->never()) + ->method('setUserValue'); - $uid = 'alice'; - $dn = 'uid=alice,dc=foo,dc=bar'; + $this->avatarManager->expects($this->never()) + ->method('getAvatar'); - $user = new User( - $uid, $dn, $this->access, $config, $filesys, $image, $log, $avaMgr, $userMgr, $notiMgr); + $this->connection->expects($this->any()) + ->method('resolveRule') + ->with('avatar') + ->willReturn(['jpegphoto', 'thumbnailphoto']); - $user->update(); + $this->user->updateAvatar(); } - public function testUpdateNoRefresh() { - list(, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr, $notiMgr) = - $this->getTestInstances(); - - $config->expects($this->at(0)) - ->method('getUserValue') - ->with($this->equalTo('alice'), $this->equalTo('user_ldap'), - $this->equalTo(User::USER_PREFKEY_FIRSTLOGIN), - $this->equalTo(0)) - ->will($this->returnValue(1)); - $config->expects($this->at(1)) - ->method('getUserValue') - ->with($this->equalTo('alice'), $this->equalTo('user_ldap'), - $this->equalTo(User::USER_PREFKEY_LASTREFRESH), - $this->equalTo(0)) - ->will($this->returnValue(time() - 10)); - - $config->expects($this->once()) - ->method('getAppValue') - ->with($this->equalTo('user_ldap'), - $this->equalTo('updateAttributesInterval'), - $this->anything()) - ->will($this->returnValue(1800)); - $config->expects($this->exactly(2)) - ->method('getUserValue'); - $config->expects($this->never()) - ->method('setUserValue'); + public static function extStorageHomeDataProvider(): array { + return [ + [ 'myFolder', null ], + [ '', null, false ], + [ 'myFolder', 'myFolder' ], + ]; + } - $uid = 'alice'; - $dn = 'uid=alice,dc=foo,dc=bar'; + #[\PHPUnit\Framework\Attributes\DataProvider('extStorageHomeDataProvider')] + public function testUpdateExtStorageHome(string $expected, ?string $valueFromLDAP = null, bool $isSet = true): void { + if ($valueFromLDAP === null) { + $this->connection->expects($this->once()) + ->method('__get') + ->willReturnMap([ + ['ldapExtStorageHomeAttribute', 'homeDirectory'], + ]); + + $return = []; + if ($isSet) { + $return[] = $expected; + } + $this->access->expects($this->once()) + ->method('readAttribute') + ->with($this->dn, 'homeDirectory') + ->willReturn($return); + } - $user = new User( - $uid, $dn, $this->access, $config, $filesys, $image, $log, $avaMgr, $userMgr, $notiMgr); + if ($expected !== '') { + $this->config->expects($this->once()) + ->method('setUserValue') + ->with($this->uid, 'user_ldap', 'extStorageHome', $expected); + } else { + $this->config->expects($this->once()) + ->method('deleteUserValue') + ->with($this->uid, 'user_ldap', 'extStorageHome'); + } - $user->update(); + $actual = $this->user->updateExtStorageHome($valueFromLDAP); + $this->assertSame($expected, $actual); } - public function testMarkLogin() { - list(, $config, $filesys, $image, $log, $avaMgr, $db, $userMgr, $notiMgr) = - $this->getTestInstances(); - - $config->expects($this->once()) + public function testMarkLogin(): void { + $this->config->expects($this->once()) ->method('setUserValue') - ->with($this->equalTo('alice'), + ->with($this->equalTo($this->uid), $this->equalTo('user_ldap'), $this->equalTo(User::USER_PREFKEY_FIRSTLOGIN), $this->equalTo(1)) - ->will($this->returnValue(true)); + ->willReturn(true); - $uid = 'alice'; - $dn = 'uid=alice,dc=foo,dc=bar'; - - $user = new User( - $uid, $dn, $this->access, $config, $filesys, $image, $log, $avaMgr, $userMgr, $notiMgr); - - $user->markLogin(); + $this->user->markLogin(); } - public function testGetAvatarImageProvided() { - list(, $config, $filesys, $image, $log, $avaMgr, $db, $userMgr, $notiMgr) = - $this->getTestInstances(); - + public function testGetAvatarImageProvided(): void { $this->access->expects($this->once()) ->method('readAttribute') - ->with($this->equalTo('uid=alice,dc=foo,dc=bar'), - $this->equalTo('jpegPhoto')) - ->will($this->returnValue(array('this is a photo'))); - - $uid = 'alice'; - $dn = 'uid=alice,dc=foo,dc=bar'; - - $user = new User( - $uid, $dn, $this->access, $config, $filesys, $image, $log, $avaMgr, $userMgr, $notiMgr); + ->with($this->equalTo($this->dn), + $this->equalTo('jpegphoto')) + ->willReturn(['this is a photo']); + $this->connection->expects($this->any()) + ->method('resolveRule') + ->with('avatar') + ->willReturn(['jpegphoto', 'thumbnailphoto']); - $photo = $user->getAvatarImage(); + $photo = $this->user->getAvatarImage(); $this->assertSame('this is a photo', $photo); //make sure readAttribute is not called again but the already fetched //photo is returned - $photo = $user->getAvatarImage(); + $this->user->getAvatarImage(); } - public function testProcessAttributes() { - list(, $config, $filesys, $image, $log, $avaMgr, , $userMgr, $notiMgr) = - $this->getTestInstances(); + public function testGetAvatarImageDisabled(): void { + $this->access->expects($this->never()) + ->method('readAttribute') + ->with($this->equalTo($this->dn), $this->anything()); + $this->connection->expects($this->any()) + ->method('resolveRule') + ->with('avatar') + ->willReturn([]); + + $this->assertFalse($this->user->getAvatarImage()); + } - $uid = 'alice'; - $dn = 'uid=alice'; + public static function imageDataProvider(): array { + return [ + [ false, false ], + [ 'corruptData', false ], + [ 'validData', true ], + ]; + } - $requiredMethods = array( - 'markRefreshTime', + public function testProcessAttributes(): void { + $requiredMethods = [ 'updateQuota', 'updateEmail', 'composeAndStoreDisplayName', 'storeLDAPUserName', 'getHomePath', - 'updateAvatar' - ); + 'updateAvatar', + 'updateExtStorageHome', + ]; - $userMock = $this->getMockBuilder('OCA\User_LDAP\User\User') - ->setConstructorArgs(array($uid, $dn, $this->access, $config, $filesys, $image, $log, $avaMgr, $userMgr, $notiMgr)) - ->setMethods($requiredMethods) + /** @var User&MockObject $userMock */ + $userMock = $this->getMockBuilder(User::class) + ->setConstructorArgs([ + $this->uid, + $this->dn, + $this->access, + $this->config, + $this->image, + $this->logger, + $this->avatarManager, + $this->userManager, + $this->notificationManager + ]) + ->onlyMethods($requiredMethods) ->getMock(); - $this->connection->setConfiguration(array( + $this->connection->setConfiguration([ 'homeFolderNamingRule' => 'homeDirectory' - )); + ]); $this->connection->expects($this->any()) ->method('__get') - //->will($this->returnArgument(0)); - ->will($this->returnCallback(function($name) { - if($name === 'homeFolderNamingRule') { + ->willReturnCallback(function ($name) { + if ($name === 'homeFolderNamingRule') { return 'attr:homeDirectory'; } return $name; - })); - - $record = array( - strtolower($this->connection->ldapQuotaAttribute) => array('4096'), - strtolower($this->connection->ldapEmailAttribute) => array('alice@wonderland.org'), - strtolower($this->connection->ldapUserDisplayName) => array('Aaaaalice'), - 'uid' => array($uid), - 'homedirectory' => array('Alice\'s Folder'), - 'memberof' => array('cn=groupOne', 'cn=groupTwo'), - 'jpegphoto' => array('here be an image') - ); + }); + $this->connection->expects($this->any()) + ->method('resolveRule') + ->with('avatar') + ->willReturn(['jpegphoto', 'thumbnailphoto']); + + $record = [ + strtolower($this->connection->ldapQuotaAttribute) => ['4096'], + strtolower($this->connection->ldapEmailAttribute) => ['alice@wonderland.org'], + strtolower($this->connection->ldapUserDisplayName) => ['Aaaaalice'], + strtolower($this->connection->ldapExtStorageHomeAttribute) => ['homeDirectory'], + 'uid' => [$this->uid], + 'homedirectory' => ['Alice\'s Folder'], + 'memberof' => ['cn=groupOne', 'cn=groupTwo'], + 'jpegphoto' => ['here be an image'] + ]; - foreach($requiredMethods as $method) { + foreach ($requiredMethods as $method) { $userMock->expects($this->once()) ->method($method); } - \OC_Hook::clear();//disconnect irrelevant hooks + \OC_Hook::clear();//disconnect irrelevant hooks $userMock->processAttributes($record); - \OC_Hook::emit('OC_User', 'post_login', array('uid' => $uid)); + /** @noinspection PhpUnhandledExceptionInspection */ + \OC_Hook::emit('OC_User', 'post_login', ['uid' => $this->uid]); } - public function emptyHomeFolderAttributeValueProvider() { - return array( - 'empty' => array(''), - 'prefixOnly' => array('attr:'), - ); + public static function emptyHomeFolderAttributeValueProvider(): array { + return [ + 'empty' => [''], + 'prefixOnly' => ['attr:'], + ]; } - /** - * @dataProvider emptyHomeFolderAttributeValueProvider - */ - public function testGetHomePathNotConfigured($attributeValue) { - list(, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr, $notiMgr) = - $this->getTestInstances(); - + #[\PHPUnit\Framework\Attributes\DataProvider('emptyHomeFolderAttributeValueProvider')] + public function testGetHomePathNotConfigured(string $attributeValue): void { $this->connection->expects($this->any()) ->method('__get') ->with($this->equalTo('homeFolderNamingRule')) - ->will($this->returnValue($attributeValue)); + ->willReturn($attributeValue); $this->access->expects($this->never()) ->method('readAttribute'); - $config->expects($this->never()) + $this->config->expects($this->never()) ->method('getAppValue'); - $uid = 'alice'; - $dn = 'uid=alice,dc=foo,dc=bar'; - - $user = new User( - $uid, $dn, $this->access, $config, $filesys, $image, $log, $avaMgr, $userMgr, $notiMgr); - - $path = $user->getHomePath(); - $this->assertSame($path, false); + /** @noinspection PhpUnhandledExceptionInspection */ + $this->assertFalse($this->user->getHomePath()); } - public function testGetHomePathConfiguredNotAvailableAllowed() { - list(, $config, $filesys, $image, $log, $avaMgr, , $userMgr, $notiMgr) = - $this->getTestInstances(); - + public function testGetHomePathConfiguredNotAvailableAllowed(): void { $this->connection->expects($this->any()) ->method('__get') ->with($this->equalTo('homeFolderNamingRule')) - ->will($this->returnValue('attr:foobar')); + ->willReturn('attr:foobar'); $this->access->expects($this->once()) ->method('readAttribute') - ->will($this->returnValue(false)); + ->willReturn(false); + + $this->access->expects($this->once()) + ->method('username2dn') + ->willReturn($this->dn); // asks for "enforce_home_folder_naming_rule" - $config->expects($this->once()) + $this->config->expects($this->once()) ->method('getAppValue') - ->will($this->returnValue(false)); + ->willReturn(false); - $uid = 'alice'; - $dn = 'uid=alice,dc=foo,dc=bar'; - - $user = new User( - $uid, $dn, $this->access, $config, $filesys, $image, $log, $avaMgr, $userMgr, $notiMgr); - - $path = $user->getHomePath(); - - $this->assertSame($path, false); + /** @noinspection PhpUnhandledExceptionInspection */ + $this->assertFalse($this->user->getHomePath()); } - /** - * @expectedException \Exception - */ - public function testGetHomePathConfiguredNotAvailableNotAllowed() { - list(, $config, $filesys, $image, $log, $avaMgr, , $userMgr, $notiMgr) = - $this->getTestInstances(); + + public function testGetHomePathConfiguredNotAvailableNotAllowed(): void { + $this->expectException(\Exception::class); $this->connection->expects($this->any()) ->method('__get') ->with($this->equalTo('homeFolderNamingRule')) - ->will($this->returnValue('attr:foobar')); + ->willReturn('attr:foobar'); $this->access->expects($this->once()) ->method('readAttribute') - ->will($this->returnValue(false)); + ->willReturn(false); + + $this->access->expects($this->once()) + ->method('username2dn') + ->willReturn($this->dn); // asks for "enforce_home_folder_naming_rule" - $config->expects($this->once()) + $this->config->expects($this->once()) ->method('getAppValue') - ->will($this->returnValue(true)); + ->willReturn(true); - $uid = 'alice'; - $dn = 'uid=alice,dc=foo,dc=bar'; - - $user = new User( - $uid, $dn, $this->access, $config, $filesys, $image, $log, $avaMgr, $userMgr, $notiMgr); - - $user->getHomePath(); + $this->user->getHomePath(); } - public function displayNameProvider() { + public static function displayNameProvider(): array { return [ - ['Roland Deschain', '', 'Roland Deschain'], - ['Roland Deschain', null, 'Roland Deschain'], - ['Roland Deschain', 'gunslinger@darktower.com', 'Roland Deschain (gunslinger@darktower.com)'], + ['Roland Deschain', '', 'Roland Deschain', false], + ['Roland Deschain', '', 'Roland Deschain', true], + ['Roland Deschain', 'gunslinger@darktower.com', 'Roland Deschain (gunslinger@darktower.com)', false], + ['Roland Deschain', 'gunslinger@darktower.com', 'Roland Deschain (gunslinger@darktower.com)', true], ]; } - /** - * @dataProvider displayNameProvider - */ - public function testComposeAndStoreDisplayName($part1, $part2, $expected) { - list(, $config, $filesys, $image, $log, $avaMgr, , $userMgr, $notiMgr) = - $this->getTestInstances(); - - $config->expects($this->once()) + #[\PHPUnit\Framework\Attributes\DataProvider('displayNameProvider')] + public function testComposeAndStoreDisplayName(string $part1, string $part2, string $expected, bool $expectTriggerChange): void { + $this->config->expects($this->once()) ->method('setUserValue'); + $oldName = $expectTriggerChange ? 'xxGunslingerxx' : null; + $this->config->expects($this->once()) + ->method('getUserValue') + ->with($this->user->getUsername(), 'user_ldap', 'displayName', null) + ->willReturn($oldName); + + $ncUserObj = $this->createMock(\OC\User\User::class); + if ($expectTriggerChange) { + $ncUserObj->expects($this->once()) + ->method('triggerChange') + ->with('displayName', $expected); + } else { + $ncUserObj->expects($this->never()) + ->method('triggerChange'); + } + $this->userManager->expects($this->once()) + ->method('get') + ->willReturn($ncUserObj); - $user = new User( - 'user', 'cn=user', $this->access, $config, $filesys, $image, $log, $avaMgr, $userMgr, $notiMgr); - - $displayName = $user->composeAndStoreDisplayName($part1, $part2); + $displayName = $this->user->composeAndStoreDisplayName($part1, $part2); $this->assertSame($expected, $displayName); } - public function testHandlePasswordExpiryWarningDefaultPolicy() { - list(, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr, $notiMgr) = - $this->getTestInstances(); + public function testComposeAndStoreDisplayNameNoOverwrite(): void { + $displayName = 'Randall Flagg'; + $this->config->expects($this->never()) + ->method('setUserValue'); + $this->config->expects($this->once()) + ->method('getUserValue') + ->willReturn($displayName); + + $this->userManager->expects($this->never()) + ->method('get'); // Implicit: no triggerChange can be called - $uid = 'alice'; - $dn = 'uid=alice'; + $composedDisplayName = $this->user->composeAndStoreDisplayName($displayName); + $this->assertSame($composedDisplayName, $displayName); + } + public function testHandlePasswordExpiryWarningDefaultPolicy(): void { $this->connection->expects($this->any()) ->method('__get') - ->will($this->returnCallback(function($name) { - if($name === 'ldapDefaultPPolicyDN') { + ->willReturnCallback(function ($name) { + if ($name === 'ldapDefaultPPolicyDN') { return 'cn=default,ou=policies,dc=foo,dc=bar'; } - if($name === 'turnOnPasswordChange') { + if ($name === 'turnOnPasswordChange') { return '1'; } return $name; - })); + }); $this->access->expects($this->any()) ->method('search') - ->will($this->returnCallback(function($filter, $base) { - if($base === 'uid=alice') { - return array( - array( - 'pwdchangedtime' => array((new \DateTime())->sub(new \DateInterval('P28D'))->format('Ymdhis').'Z'), + ->willReturnCallback(function ($filter, $base) { + if ($base === $this->dn) { + return [ + [ + 'pwdchangedtime' => [(new \DateTime())->sub(new \DateInterval('P28D'))->format('Ymdhis') . 'Z'], 'pwdgraceusetime' => [], - ), - ); + ], + ]; } - if($base === 'cn=default,ou=policies,dc=foo,dc=bar') { - return array( - array( - 'pwdmaxage' => array('2592000'), - 'pwdexpirewarning' => array('2591999'), - ), - ); + if ($base === 'cn=default,ou=policies,dc=foo,dc=bar') { + return [ + [ + 'pwdmaxage' => ['2592000'], + 'pwdexpirewarning' => ['2591999'], + ], + ]; } - return array(); - })); + return []; + }); $notification = $this->getMockBuilder(INotification::class) ->disableOriginalConstructor() ->getMock(); $notification->expects($this->any()) ->method('setApp') - ->will($this->returnValue($notification)); + ->willReturn($notification); $notification->expects($this->any()) ->method('setUser') - ->will($this->returnValue($notification)); + ->willReturn($notification); $notification->expects($this->any()) ->method('setObject') - ->will($this->returnValue($notification)); + ->willReturn($notification); $notification->expects($this->any()) ->method('setDateTime') - ->will($this->returnValue($notification)); - $notiMgr->expects($this->exactly(2)) + ->willReturn($notification); + + $this->notificationManager->expects($this->exactly(2)) ->method('createNotification') - ->will($this->returnValue($notification)); - $notiMgr->expects($this->exactly(1)) + ->willReturn($notification); + $this->notificationManager->expects($this->exactly(1)) ->method('notify'); - $user = new User( - $uid, $dn, $this->access, $config, $filesys, $image, $log, $avaMgr, $userMgr, $notiMgr); - \OC_Hook::clear();//disconnect irrelevant hooks - \OCP\Util::connectHook('OC_User', 'post_login', $user, 'handlePasswordExpiry'); - \OC_Hook::emit('OC_User', 'post_login', array('uid' => $uid)); + Util::connectHook('OC_User', 'post_login', $this->user, 'handlePasswordExpiry'); + /** @noinspection PhpUnhandledExceptionInspection */ + \OC_Hook::emit('OC_User', 'post_login', ['uid' => $this->uid]); } - public function testHandlePasswordExpiryWarningCustomPolicy() { - list(, $config, $filesys, $image, $log, $avaMgr, , $userMgr, $notiMgr) = - $this->getTestInstances(); - - $uid = 'alice'; - $dn = 'uid=alice'; - + public function testHandlePasswordExpiryWarningCustomPolicy(): void { $this->connection->expects($this->any()) ->method('__get') - ->will($this->returnCallback(function($name) { - if($name === 'ldapDefaultPPolicyDN') { + ->willReturnCallback(function ($name) { + if ($name === 'ldapDefaultPPolicyDN') { return 'cn=default,ou=policies,dc=foo,dc=bar'; } - if($name === 'turnOnPasswordChange') { + if ($name === 'turnOnPasswordChange') { return '1'; } return $name; - })); + }); $this->access->expects($this->any()) ->method('search') - ->will($this->returnCallback(function($filter, $base) { - if($base === 'uid=alice') { - return array( - array( - 'pwdpolicysubentry' => array('cn=custom,ou=policies,dc=foo,dc=bar'), - 'pwdchangedtime' => array((new \DateTime())->sub(new \DateInterval('P28D'))->format('Ymdhis').'Z'), + ->willReturnCallback(function ($filter, $base) { + if ($base === $this->dn) { + return [ + [ + 'pwdpolicysubentry' => ['cn=custom,ou=policies,dc=foo,dc=bar'], + 'pwdchangedtime' => [(new \DateTime())->sub(new \DateInterval('P28D'))->format('Ymdhis') . 'Z'], 'pwdgraceusetime' => [], - ) - ); + ] + ]; } - if($base === 'cn=custom,ou=policies,dc=foo,dc=bar') { - return array( - array( - 'pwdmaxage' => array('2592000'), - 'pwdexpirewarning' => array('2591999'), - ) - ); + if ($base === 'cn=custom,ou=policies,dc=foo,dc=bar') { + return [ + [ + 'pwdmaxage' => ['2592000'], + 'pwdexpirewarning' => ['2591999'], + ] + ]; } - return array(); - })); + return []; + }); $notification = $this->getMockBuilder(INotification::class) ->disableOriginalConstructor() ->getMock(); $notification->expects($this->any()) ->method('setApp') - ->will($this->returnValue($notification)); + ->willReturn($notification); $notification->expects($this->any()) ->method('setUser') - ->will($this->returnValue($notification)); + ->willReturn($notification); $notification->expects($this->any()) ->method('setObject') - ->will($this->returnValue($notification)); + ->willReturn($notification); $notification->expects($this->any()) ->method('setDateTime') - ->will($this->returnValue($notification)); - $notiMgr->expects($this->exactly(2)) + ->willReturn($notification); + + $this->notificationManager->expects($this->exactly(2)) ->method('createNotification') - ->will($this->returnValue($notification)); - $notiMgr->expects($this->exactly(1)) + ->willReturn($notification); + $this->notificationManager->expects($this->exactly(1)) ->method('notify'); - $user = new User( - $uid, $dn, $this->access, $config, $filesys, $image, $log, $avaMgr, $userMgr, $notiMgr); - - \OC_Hook::clear();//disconnect irrelevant hooks - \OCP\Util::connectHook('OC_User', 'post_login', $user, 'handlePasswordExpiry'); - \OC_Hook::emit('OC_User', 'post_login', array('uid' => $uid)); + \OC_Hook::clear();//disconnect irrelevant hooks + Util::connectHook('OC_User', 'post_login', $this->user, 'handlePasswordExpiry'); + /** @noinspection PhpUnhandledExceptionInspection */ + \OC_Hook::emit('OC_User', 'post_login', ['uid' => $this->uid]); } } |