* * @copyright Copyright (c) 2016, ownCloud, Inc. * @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 * */ namespace Test\Accounts; use OC\Accounts\AccountManager; use OCP\BackgroundJob\IJobList; use OCP\IUser; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\EventDispatcher\GenericEvent; use Test\TestCase; /** * Class AccountsManagerTest * * @group DB * @package Test\Accounts */ class AccountsManagerTest extends TestCase { /** @var \OCP\IDBConnection */ private $connection; /** @var EventDispatcherInterface | \PHPUnit_Framework_MockObject_MockObject */ private $eventDispatcher; /** @var IJobList | \PHPUnit_Framework_MockObject_MockObject */ private $jobList; /** @var string accounts table name */ private $table = 'accounts'; public function setUp() { parent::setUp(); $this->eventDispatcher = $this->getMockBuilder('Symfony\Component\EventDispatcher\EventDispatcherInterface') ->disableOriginalConstructor()->getMock(); $this->connection = \OC::$server->getDatabaseConnection(); $this->jobList = $this->getMockBuilder(IJobList::class)->getMock(); } public function tearDown() { parent::tearDown(); $query = $this->connection->getQueryBuilder(); $query->delete($this->table)->execute(); } /** * get a instance of the accountManager * * @param array $mockedMethods list of methods which should be mocked * @return \PHPUnit_Framework_MockObject_MockObject | AccountManager */ public function getInstance($mockedMethods = null) { return $this->getMockBuilder(AccountManager::class) ->setConstructorArgs([$this->connection, $this->eventDispatcher, $this->jobList]) ->setMethods($mockedMethods) ->getMock(); } /** * @dataProvider dataTrueFalse * * @param array $newData * @param array $oldData * @param bool $insertNew * @param bool $updateExisting */ public function testUpdateUser($newData, $oldData, $insertNew, $updateExisting) { $accountManager = $this->getInstance(['getUser', 'insertNewUser', 'updateExistingUser', 'updateVerifyStatus', 'checkEmailVerification']); /** @var IUser $user */ $user = $this->createMock(IUser::class); $accountManager->expects($this->once())->method('getUser')->with($user)->willReturn($oldData); if ($updateExisting) { $accountManager->expects($this->once())->method('checkEmailVerification') ->with($oldData, $newData, $user)->willReturn($newData); $accountManager->expects($this->once())->method('updateVerifyStatus') ->with($oldData, $newData)->willReturn($newData); $accountManager->expects($this->once())->method('updateExistingUser') ->with($user, $newData); $accountManager->expects($this->never())->method('insertNewUser'); } if ($insertNew) { $accountManager->expects($this->once())->method('insertNewUser') ->with($user, $newData); $accountManager->expects($this->never())->method('updateExistingUser'); } if (!$insertNew && !$updateExisting) { $accountManager->expects($this->never())->method('updateExistingUser'); $accountManager->expects($this->never())->method('checkEmailVerification'); $accountManager->expects($this->never())->method('updateVerifyStatus'); $accountManager->expects($this->never())->method('insertNewUser'); $this->eventDispatcher->expects($this->never())->method('dispatch'); } else { $this->eventDispatcher->expects($this->once())->method('dispatch') ->willReturnCallback( function ($eventName, $event) use ($user, $newData) { $this->assertSame('OC\AccountManager::userUpdated', $eventName); $this->assertInstanceOf(GenericEvent::class, $event); /** @var GenericEvent $event */ $this->assertSame($user, $event->getSubject()); $this->assertSame($newData, $event->getArguments()); } ); } $accountManager->updateUser($user, $newData); } public function dataTrueFalse() { return [ [['newData'], ['oldData'], false, true], [['newData'], [], true, false], [['oldData'], ['oldData'], false, false] ]; } /** * @dataProvider dataTestGetUser * * @param string $setUser * @param array $setData * @param IUser $askUser * @param array $expectedData * @param bool $userAlreadyExists */ public function testGetUser($setUser, $setData, $askUser, $expectedData, $userAlreadyExists) { $accountManager = $this->getInstance(['buildDefaultUserRecord', 'insertNewUser', 'addMissingDefaultValues']); if (!$userAlreadyExists) { $accountManager->expects($this->once())->method('buildDefaultUserRecord') ->with($askUser)->willReturn($expectedData); $accountManager->expects($this->once())->method('insertNewUser') ->with($askUser, $expectedData); } if(empty($expectedData)) { $accountManager->expects($this->never())->method('addMissingDefaultValues'); } else { $accountManager->expects($this->once())->method('addMissingDefaultValues')->with($expectedData) ->willReturn($expectedData); } $this->addDummyValuesToTable($setUser, $setData); $this->assertEquals($expectedData, $accountManager->getUser($askUser) ); } public function dataTestGetUser() { $user1 = $this->getMockBuilder(IUser::class)->getMock(); $user1->expects($this->any())->method('getUID')->willReturn('user1'); $user2 = $this->getMockBuilder(IUser::class)->getMock(); $user2->expects($this->any())->method('getUID')->willReturn('user2'); return [ ['user1', ['key' => 'value'], $user1, ['key' => 'value'], true], ['user1', ['key' => 'value'], $user2, [], false], ]; } public function testUpdateExistingUser() { $user = $this->getMockBuilder(IUser::class)->getMock(); $user->expects($this->once())->method('getUID')->willReturn('uid'); $oldData = ['key' => 'value']; $newData = ['newKey' => 'newValue']; $accountManager = $this->getInstance(); $this->addDummyValuesToTable('uid', $oldData); $this->invokePrivate($accountManager, 'updateExistingUser', [$user, $newData]); $newDataFromTable = $this->getDataFromTable('uid'); $this->assertEquals($newData, $newDataFromTable); } public function testInsertNewUser() { $user = $this->getMockBuilder(IUser::class)->getMock(); $uid = 'uid'; $data = ['key' => 'value']; $accountManager = $this->getInstance(); $user->expects($this->once())->method('getUID')->willReturn($uid); $this->assertNull($this->getDataFromTable($uid)); $this->invokePrivate($accountManager, 'insertNewUser', [$user, $data]); $dataFromDb = $this->getDataFromTable($uid); $this->assertEquals($data, $dataFromDb); } public function testAddMissingDefaultValues() { $accountManager = $this->getInstance(); $input = [ 'key1' => ['value' => 'value1', 'verified' => '0'], 'key2' => ['value' => 'value1'], ]; $expected = [ 'key1' => ['value' => 'value1', 'verified' => '0'], 'key2' => ['value' => 'value1', 'verified' => '0'], ]; $result = $this->invokePrivate($accountManager, 'addMissingDefaultValues', [$input]); $this->assertSame($expected, $result); } private function addDummyValuesToTable($uid, $data) { $query = $this->connection->getQueryBuilder(); $query->insert($this->table) ->values( [ 'uid' => $query->createNamedParameter($uid), 'data' => $query->createNamedParameter(json_encode($data)), ] ) ->execute(); } private function getDataFromTable($uid) { $query = $this->connection->getQueryBuilder(); $query->select('data')->from($this->table) ->where($query->expr()->eq('uid', $query->createParameter('uid'))) ->setParameter('uid', $uid); $query->execute(); $result = $query->execute()->fetchAll(); if (!empty($result)) { return json_decode($result[0]['data'], true); } } }