@ -1,9 +1,11 @@
<?php
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
* @author Björn Schießle < schiessle @ owncloud . com >
* @author Thomas Citharel < nextcloud @ tcit . fr >
*
* @copyright Copyright (c) 2016, ownCloud, Inc.
* @license AGPL-3.0
*
* This code is free software: you can redistribute it and/or modify
@ -62,26 +64,25 @@ class AccountManagerTest extends TestCase {
/** @var IFactory|MockObject */
protected $l10nFactory;
/** @var \OCP\ IDBConnection */
/** @var IDBConnection */
private $connection;
/** @var IConfig|MockObject */
/** @var IConfig|MockObject */
private $config;
/** @var EventDispatcherInterface|MockObject */
private $eventDispatcher;
/** @var IJobList|MockObject */
/** @var IJobList|MockObject */
private $jobList;
/** @var string accounts table name */
private $table = 'accounts';
/** accounts table name */
private string $table = 'accounts';
/** @var LoggerInterface|MockObject */
private $logger;
/** @var AccountManager */
private $accountManager;
private AccountManager $accountManager;
protected function setUp(): void {
parent::setUp();
@ -115,7 +116,7 @@ class AccountManagerTest extends TestCase {
protected function tearDown(): void {
parent::tearDown();
$query = $this->connection->getQueryBuilder();
$query->delete($this->table)->execute();
$query->delete($this->table)->executeStatement ();
}
protected function makeUser(string $uid, string $name, string $email = null): IUser {
@ -423,6 +424,7 @@ class AccountManagerTest extends TestCase {
],
],
];
$this->config->expects($this->exactly(count($users)))->method('getSystemValue')->with('account_manager.default_property_scope', [])->willReturn([]);
foreach ($users as $userInfo) {
$this->invokePrivate($this->accountManager, 'updateUser', [$userInfo['user'], $userInfo['data'], null, false]);
}
@ -431,10 +433,9 @@ class AccountManagerTest extends TestCase {
/**
* get a instance of the accountManager
*
* @param array $mockedMethods list of methods which should be mocked
* @return MockObject | AccountManager
*/
public function getInstance($mockedMethods = null) {
public function getInstance(?array $mockedMethods = null) {
return $this->getMockBuilder(AccountManager::class)
->setConstructorArgs([
$this->connection,
@ -449,19 +450,15 @@ class AccountManagerTest extends TestCase {
$this->urlGenerator,
$this->crypto
])
->set Methods($mockedMethods)
->only Methods($mockedMethods)
->getMock();
}
/**
* @dataProvider dataTrueFalse
*
* @param array $newData
* @param array $oldData
* @param bool $insertNew
* @param bool $updateExisting
*/
public function testUpdateUser($newData, $oldData, $insertNew, $updateExisting) {
public function testUpdateUser(array $newData, array $oldData, bool $insertNew, bool $updateExisting) {
$accountManager = $this->getInstance(['getUser', 'insertNewUser', 'updateExistingUser']);
/** @var IUser $user */
$user = $this->createMock(IUser::class);
@ -487,7 +484,6 @@ class AccountManagerTest extends TestCase {
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());
}
@ -603,6 +599,7 @@ class AccountManagerTest extends TestCase {
'value' => '1',
],
];
$this->config->expects($this->once())->method('getSystemValue')->with('account_manager.default_property_scope', [])->willReturn([]);
$defaultUserRecord = $this->invokePrivate($this->accountManager, 'buildDefaultUserRecord', [$user]);
$result = $this->invokePrivate($this->accountManager, 'addMissingDefaultValues', [$input, $defaultUserRecord]);
@ -610,18 +607,6 @@ class AccountManagerTest extends TestCase {
$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();
}
public function testGetAccount() {
$accountManager = $this->getInstance(['getUser']);
/** @var IUser $user */
@ -668,9 +653,6 @@ class AccountManagerTest extends TestCase {
/**
* @dataProvider dataParsePhoneNumber
* @param string $phoneInput
* @param string $defaultRegion
* @param string|null $phoneNumber
*/
public function testParsePhoneNumber(string $phoneInput, string $defaultRegion, ?string $phoneNumber): void {
$this->config->method('getSystemValueString')
@ -790,6 +772,8 @@ class AccountManagerTest extends TestCase {
* @dataProvider dataCheckEmailVerification
*/
public function testCheckEmailVerification(IUser $user, ?string $newEmail): void {
// Once because of getAccount, once because of getUser
$this->config->expects($this->exactly(2))->method('getSystemValue')->with('account_manager.default_property_scope', [])->willReturn([]);
$account = $this->accountManager->getAccount($user);
$emailUpdated = false;
@ -812,4 +796,58 @@ class AccountManagerTest extends TestCase {
$oldData = $this->invokePrivate($this->accountManager, 'getUser', [$user, false]);
$this->invokePrivate($this->accountManager, 'checkEmailVerification', [$account, $oldData]);
}
public function dataSetDefaultPropertyScopes(): array {
return [
[
[],
[
IAccountManager::PROPERTY_DISPLAYNAME => IAccountManager::SCOPE_FEDERATED,
IAccountManager::PROPERTY_ADDRESS => IAccountManager::SCOPE_LOCAL,
IAccountManager::PROPERTY_EMAIL => IAccountManager::SCOPE_FEDERATED,
IAccountManager::PROPERTY_ROLE => IAccountManager::SCOPE_LOCAL,
]
],
[
[
IAccountManager::PROPERTY_DISPLAYNAME => IAccountManager::SCOPE_FEDERATED,
IAccountManager::PROPERTY_EMAIL => IAccountManager::SCOPE_LOCAL,
IAccountManager::PROPERTY_ROLE => IAccountManager::SCOPE_PRIVATE,
], [
IAccountManager::PROPERTY_DISPLAYNAME => IAccountManager::SCOPE_FEDERATED,
IAccountManager::PROPERTY_EMAIL => IAccountManager::SCOPE_LOCAL,
IAccountManager::PROPERTY_ROLE => IAccountManager::SCOPE_PRIVATE,
]
],
[
[
IAccountManager::PROPERTY_ADDRESS => 'invalid scope',
'invalid property' => IAccountManager::SCOPE_LOCAL,
IAccountManager::PROPERTY_ROLE => IAccountManager::SCOPE_PRIVATE,
],
[
IAccountManager::PROPERTY_ADDRESS => IAccountManager::SCOPE_LOCAL,
IAccountManager::PROPERTY_EMAIL => IAccountManager::SCOPE_FEDERATED,
IAccountManager::PROPERTY_ROLE => IAccountManager::SCOPE_PRIVATE,
]
],
];
}
/**
* @dataProvider dataSetDefaultPropertyScopes
*/
public function testSetDefaultPropertyScopes(array $propertyScopes, array $expectedResultScopes): void {
$user = $this->makeUser('steve', 'Steve Smith', 'steve@steve.steve');
$this->config->expects($this->once())->method('getSystemValue')->with('account_manager.default_property_scope', [])->willReturn($propertyScopes);
$result = $this->invokePrivate($this->accountManager, 'buildDefaultUserRecord', [$user]);
$resultProperties = array_column($result, 'name');
$this->assertEmpty(array_diff($resultProperties, IAccountManager::ALLOWED_PROPERTIES), "Building default user record returned non-allowed properties");
foreach ($expectedResultScopes as $expectedResultScopeKey => $expectedResultScopeValue) {
$resultScope = $result[array_search($expectedResultScopeKey, $resultProperties)]['scope'];
$this->assertEquals($expectedResultScopeValue, $resultScope, "The result scope doesn't follow the value set into the config or defaults correctly.");
}
}
}