Browse Source
introduce accounts table and keep it up-to-date with the data added to the personal settings
introduce accounts table and keep it up-to-date with the data added to the personal settings
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>pull/1946/head
committed by
Roeland Jago Douma
No known key found for this signature in database
GPG Key ID: F941078878347C0C
5 changed files with 479 additions and 3 deletions
-
32db_structure.xml
-
116lib/private/Accounts/AccountManager.php
-
135settings/Application.php
-
26settings/Controller/UsersController.php
-
173tests/lib/accounts/AccountsManagerTest.php
@ -0,0 +1,116 @@ |
|||
<?php |
|||
/** |
|||
* @author Björn Schießle <schiessle@owncloud.com> |
|||
* |
|||
* @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 <http://www.gnu.org/licenses/> |
|||
* |
|||
*/ |
|||
|
|||
|
|||
namespace OC\Accounts; |
|||
|
|||
|
|||
use OCP\IDBConnection; |
|||
|
|||
/** |
|||
* Class AccountManager |
|||
* |
|||
* Manage system accounts table |
|||
* |
|||
* @group DB |
|||
* @package OC\Accounts |
|||
*/ |
|||
class AccountManager { |
|||
|
|||
/** @var IDBConnection database connection */ |
|||
private $connection; |
|||
|
|||
/** @var string table name */ |
|||
private $table = 'accounts'; |
|||
|
|||
/** |
|||
* AccountManager constructor. |
|||
* |
|||
* @param IDBConnection $connection |
|||
*/ |
|||
public function __construct(IDBConnection $connection) { |
|||
$this->connection = $connection; |
|||
} |
|||
|
|||
public function updateUser($uid, $data) { |
|||
$userData = $this->getUser($uid); |
|||
if (empty($userData)) { |
|||
$this->insertNewUser($uid, $data); |
|||
} else { |
|||
$this->updateExistingUser($uid, $data); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* get stored data from a given user |
|||
* |
|||
* @param $uid |
|||
* @return array |
|||
*/ |
|||
public function getUser($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 []; |
|||
} |
|||
|
|||
return json_decode($result[0]['data'], true); |
|||
} |
|||
|
|||
/** |
|||
* add new user to accounts table |
|||
* |
|||
* @param string $uid |
|||
* @param array $data |
|||
*/ |
|||
protected function insertNewUser($uid, $data) { |
|||
$jsonEncodedData = json_encode($data); |
|||
$query = $this->connection->getQueryBuilder(); |
|||
$query->insert($this->table) |
|||
->values( |
|||
[ |
|||
'uid' => $query->createNamedParameter($uid), |
|||
'data' => $query->createNamedParameter($jsonEncodedData), |
|||
] |
|||
) |
|||
->execute(); |
|||
} |
|||
|
|||
/** |
|||
* update existing user in accounts table |
|||
* |
|||
* @param string $uid |
|||
* @param array $data |
|||
*/ |
|||
protected function updateExistingUser($uid, $data) { |
|||
$jsonEncodedData = json_encode($data); |
|||
$query = $this->connection->getQueryBuilder(); |
|||
$query->update($this->table) |
|||
->set('data', $query->createNamedParameter($jsonEncodedData)) |
|||
->where($query->expr()->eq('uid', $query->createNamedParameter($uid))) |
|||
->execute(); |
|||
} |
|||
} |
|||
@ -0,0 +1,173 @@ |
|||
<?php |
|||
/** |
|||
* @author Björn Schießle <schiessle@owncloud.com> |
|||
* |
|||
* @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 <http://www.gnu.org/licenses/> |
|||
* |
|||
*/ |
|||
|
|||
|
|||
namespace Test\Accounts; |
|||
|
|||
|
|||
use OC\Accounts\AccountManager; |
|||
use OC\Mail\Mailer; |
|||
use Test\TestCase; |
|||
|
|||
/** |
|||
* Class AccountsManagerTest |
|||
* |
|||
* @group DB |
|||
* @package Test\Accounts |
|||
*/ |
|||
class AccountsManagerTest extends TestCase { |
|||
|
|||
/** @var \OCP\IDBConnection */ |
|||
private $connection; |
|||
|
|||
/** @var string accounts table name */ |
|||
private $table = 'accounts'; |
|||
|
|||
public function setUp() { |
|||
parent::setUp(); |
|||
$this->connection = \OC::$server->getDatabaseConnection(); |
|||
} |
|||
|
|||
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('OC\Accounts\AccountManager') |
|||
->setConstructorArgs([$this->connection]) |
|||
->setMethods($mockedMethods) |
|||
->getMock(); |
|||
|
|||
} |
|||
|
|||
/** |
|||
* @dataProvider dataTrueFalse |
|||
* |
|||
* @param bool $userAlreadyExists |
|||
*/ |
|||
public function testUpdateUser($userAlreadyExists) { |
|||
$accountManager = $this->getInstance(['getUser', 'insertNewUser', 'updateExistingUser']); |
|||
|
|||
$accountManager->expects($this->once())->method('getUser')->willReturn($userAlreadyExists); |
|||
|
|||
if ($userAlreadyExists) { |
|||
$accountManager->expects($this->once())->method('updateExistingUser') |
|||
->with('uid', 'data'); |
|||
$accountManager->expects($this->never())->method('insertNewUser'); |
|||
} else { |
|||
$accountManager->expects($this->once())->method('insertNewUser') |
|||
->with('uid', 'data'); |
|||
$accountManager->expects($this->never())->method('updateExistingUser'); |
|||
} |
|||
|
|||
$accountManager->updateUser('uid', 'data'); |
|||
} |
|||
|
|||
public function dataTrueFalse() { |
|||
return [ |
|||
[true], |
|||
[false] |
|||
]; |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @dataProvider dataTestGetUser |
|||
* |
|||
* @param string $setUser |
|||
* @param array $setData |
|||
* @param string $askUser |
|||
* @param array $expectedData |
|||
*/ |
|||
public function testGetUser($setUser, $setData, $askUser, $expectedData) { |
|||
$accountManager = $this->getInstance(); |
|||
$this->addDummyValuesToTable($setUser, $setData); |
|||
$this->assertEquals($expectedData, |
|||
$accountManager->getUser($askUser) |
|||
); |
|||
} |
|||
|
|||
public function dataTestGetUser() { |
|||
return [ |
|||
['user1', ['key' => 'value'], 'user1', ['key' => 'value']], |
|||
['user1', ['key' => 'value'], 'user2', []], |
|||
]; |
|||
} |
|||
|
|||
public function testUpdateExistingUser() { |
|||
$user = 'user1'; |
|||
$oldData = ['key' => 'value']; |
|||
$newData = ['newKey' => 'newValue']; |
|||
|
|||
$accountManager = $this->getInstance(); |
|||
$this->addDummyValuesToTable($user, $oldData); |
|||
$this->invokePrivate($accountManager, 'updateExistingUser', [$user, $newData]); |
|||
$newDataFromTable = $this->getDataFromTable($user); |
|||
$this->assertEquals($newData, $newDataFromTable); |
|||
} |
|||
|
|||
public function testInsertNewUser() { |
|||
$user = 'user1'; |
|||
$data = ['key' => 'value']; |
|||
|
|||
$accountManager = $this->getInstance(); |
|||
$this->assertNull($this->getDataFromTable($user)); |
|||
$this->invokePrivate($accountManager, 'insertNewUser', [$user, $data]); |
|||
|
|||
$dataFromDb = $this->getDataFromTable($user); |
|||
$this->assertEquals($data, $dataFromDb); |
|||
} |
|||
|
|||
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); |
|||
} |
|||
} |
|||
|
|||
} |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue