Add property scope tests for AccountManager
Signed-off-by: Vincent Petry <vincent@nextcloud.com>
This commit is contained in:
parent
2fd62b4f0d
commit
73ec32d19b
|
@ -1563,6 +1563,9 @@ class UsersControllerTest extends TestCase {
|
||||||
|
|
||||||
public function selfEditChangePropertyScopeProvider() {
|
public function selfEditChangePropertyScopeProvider() {
|
||||||
return [
|
return [
|
||||||
|
[IAccountManager::PROPERTY_AVATAR, IAccountManager::SCOPE_LOCAL, IAccountManager::SCOPE_FEDERATED],
|
||||||
|
[IAccountManager::PROPERTY_DISPLAYNAME, IAccountManager::SCOPE_LOCAL, IAccountManager::SCOPE_FEDERATED],
|
||||||
|
[IAccountManager::PROPERTY_EMAIL, IAccountManager::SCOPE_LOCAL, IAccountManager::SCOPE_FEDERATED],
|
||||||
[IAccountManager::PROPERTY_TWITTER, IAccountManager::SCOPE_LOCAL, IAccountManager::SCOPE_FEDERATED],
|
[IAccountManager::PROPERTY_TWITTER, IAccountManager::SCOPE_LOCAL, IAccountManager::SCOPE_FEDERATED],
|
||||||
[IAccountManager::PROPERTY_PHONE, IAccountManager::SCOPE_LOCAL, IAccountManager::SCOPE_FEDERATED],
|
[IAccountManager::PROPERTY_PHONE, IAccountManager::SCOPE_LOCAL, IAccountManager::SCOPE_FEDERATED],
|
||||||
[IAccountManager::PROPERTY_ADDRESS, IAccountManager::SCOPE_LOCAL, IAccountManager::SCOPE_FEDERATED],
|
[IAccountManager::PROPERTY_ADDRESS, IAccountManager::SCOPE_LOCAL, IAccountManager::SCOPE_FEDERATED],
|
||||||
|
|
|
@ -165,13 +165,18 @@ class AccountManager implements IAccountManager {
|
||||||
$propertyData['scope'] === self::SCOPE_PRIVATE
|
$propertyData['scope'] === self::SCOPE_PRIVATE
|
||||||
&& ($propertyName === self::PROPERTY_DISPLAYNAME || $propertyName === self::PROPERTY_EMAIL)
|
&& ($propertyName === self::PROPERTY_DISPLAYNAME || $propertyName === self::PROPERTY_EMAIL)
|
||||||
) {
|
) {
|
||||||
// v2-private is not available for these fields
|
if ($throwOnData) {
|
||||||
throw new \InvalidArgumentException('scope');
|
// v2-private is not available for these fields
|
||||||
|
throw new \InvalidArgumentException('scope');
|
||||||
|
} else {
|
||||||
|
// default to local
|
||||||
|
$data[$propertyName]['scope'] = self::SCOPE_LOCAL;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// migrate scope values to the new format
|
||||||
|
// invalid scopes are mapped to a default value
|
||||||
|
$data[$propertyName]['scope'] = AccountProperty::mapScopeToV2($propertyData['scope']);
|
||||||
}
|
}
|
||||||
|
|
||||||
// migrate scope values to the new format
|
|
||||||
// invalid scopes are mapped to a default value
|
|
||||||
$data[$propertyName]['scope'] = AccountProperty::mapScopeToV2($propertyData['scope']);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -229,6 +234,8 @@ class AccountManager implements IAccountManager {
|
||||||
*
|
*
|
||||||
* @param IUser $user
|
* @param IUser $user
|
||||||
* @return array
|
* @return array
|
||||||
|
*
|
||||||
|
* @deprecated use getAccount instead to make sure migrated properties work correctly
|
||||||
*/
|
*/
|
||||||
public function getUser(IUser $user) {
|
public function getUser(IUser $user) {
|
||||||
$uid = $user->getUID();
|
$uid = $user->getUID();
|
||||||
|
|
|
@ -153,6 +153,129 @@ class AccountManagerTest extends TestCase {
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function updateUserSetScopeProvider() {
|
||||||
|
return [
|
||||||
|
// regular scope switching
|
||||||
|
[
|
||||||
|
[
|
||||||
|
IAccountManager::PROPERTY_DISPLAYNAME => ['value' => 'Display Name', 'scope' => IAccountManager::SCOPE_PUBLISHED],
|
||||||
|
IAccountManager::PROPERTY_EMAIL => ['value' => 'test@example.org', 'scope' => IAccountManager::SCOPE_PUBLISHED],
|
||||||
|
IAccountManager::PROPERTY_AVATAR => ['value' => '@sometwitter', 'scope' => IAccountManager::SCOPE_PUBLISHED],
|
||||||
|
IAccountManager::PROPERTY_TWITTER => ['value' => '@sometwitter', 'scope' => IAccountManager::SCOPE_PUBLISHED],
|
||||||
|
IAccountManager::PROPERTY_PHONE => ['value' => '+491601231212', 'scope' => IAccountManager::SCOPE_FEDERATED],
|
||||||
|
IAccountManager::PROPERTY_ADDRESS => ['value' => 'some street', 'scope' => IAccountManager::SCOPE_LOCAL],
|
||||||
|
IAccountManager::PROPERTY_WEBSITE => ['value' => 'https://example.org', 'scope' => IAccountManager::SCOPE_PRIVATE],
|
||||||
|
],
|
||||||
|
[
|
||||||
|
IAccountManager::PROPERTY_DISPLAYNAME => ['value' => 'Display Name', 'scope' => IAccountManager::SCOPE_LOCAL],
|
||||||
|
IAccountManager::PROPERTY_EMAIL => ['value' => 'test@example.org', 'scope' => IAccountManager::SCOPE_FEDERATED],
|
||||||
|
IAccountManager::PROPERTY_TWITTER => ['value' => '@sometwitter', 'scope' => IAccountManager::SCOPE_PRIVATE],
|
||||||
|
IAccountManager::PROPERTY_PHONE => ['value' => '+491601231212', 'scope' => IAccountManager::SCOPE_LOCAL],
|
||||||
|
IAccountManager::PROPERTY_ADDRESS => ['value' => 'some street', 'scope' => IAccountManager::SCOPE_FEDERATED],
|
||||||
|
IAccountManager::PROPERTY_WEBSITE => ['value' => 'https://example.org', 'scope' => IAccountManager::SCOPE_PUBLISHED],
|
||||||
|
],
|
||||||
|
[
|
||||||
|
IAccountManager::PROPERTY_DISPLAYNAME => ['value' => 'Display Name', 'scope' => IAccountManager::SCOPE_LOCAL],
|
||||||
|
IAccountManager::PROPERTY_EMAIL => ['value' => 'test@example.org', 'scope' => IAccountManager::SCOPE_FEDERATED],
|
||||||
|
IAccountManager::PROPERTY_TWITTER => ['value' => '@sometwitter', 'scope' => IAccountManager::SCOPE_PRIVATE],
|
||||||
|
IAccountManager::PROPERTY_PHONE => ['value' => '+491601231212', 'scope' => IAccountManager::SCOPE_LOCAL],
|
||||||
|
IAccountManager::PROPERTY_ADDRESS => ['value' => 'some street', 'scope' => IAccountManager::SCOPE_FEDERATED],
|
||||||
|
IAccountManager::PROPERTY_WEBSITE => ['value' => 'https://example.org', 'scope' => IAccountManager::SCOPE_PUBLISHED],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
// legacy scope mapping, the given visibility values get converted to scopes
|
||||||
|
[
|
||||||
|
[
|
||||||
|
IAccountManager::PROPERTY_TWITTER => ['value' => '@sometwitter', 'scope' => IAccountManager::SCOPE_PUBLISHED],
|
||||||
|
IAccountManager::PROPERTY_PHONE => ['value' => '+491601231212', 'scope' => IAccountManager::SCOPE_FEDERATED],
|
||||||
|
IAccountManager::PROPERTY_WEBSITE => ['value' => 'https://example.org', 'scope' => IAccountManager::SCOPE_PRIVATE],
|
||||||
|
],
|
||||||
|
[
|
||||||
|
IAccountManager::PROPERTY_TWITTER => ['value' => '@sometwitter', 'scope' => IAccountManager::VISIBILITY_PUBLIC],
|
||||||
|
IAccountManager::PROPERTY_PHONE => ['value' => '+491601231212', 'scope' => IAccountManager::VISIBILITY_CONTACTS_ONLY],
|
||||||
|
IAccountManager::PROPERTY_WEBSITE => ['value' => 'https://example.org', 'scope' => IAccountManager::VISIBILITY_PRIVATE],
|
||||||
|
],
|
||||||
|
[
|
||||||
|
IAccountManager::PROPERTY_TWITTER => ['value' => '@sometwitter', 'scope' => IAccountManager::SCOPE_PUBLISHED],
|
||||||
|
IAccountManager::PROPERTY_PHONE => ['value' => '+491601231212', 'scope' => IAccountManager::SCOPE_FEDERATED],
|
||||||
|
IAccountManager::PROPERTY_WEBSITE => ['value' => 'https://example.org', 'scope' => IAccountManager::SCOPE_LOCAL],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
// invalid or unsupported scope values get converted to SCOPE_LOCAL
|
||||||
|
[
|
||||||
|
[
|
||||||
|
IAccountManager::PROPERTY_DISPLAYNAME => ['value' => 'Display Name', 'scope' => IAccountManager::SCOPE_PUBLISHED],
|
||||||
|
IAccountManager::PROPERTY_EMAIL => ['value' => 'test@example.org', 'scope' => IAccountManager::SCOPE_PUBLISHED],
|
||||||
|
IAccountManager::PROPERTY_TWITTER => ['value' => '@sometwitter', 'scope' => IAccountManager::SCOPE_PUBLISHED],
|
||||||
|
IAccountManager::PROPERTY_PHONE => ['value' => '+491601231212', 'scope' => IAccountManager::SCOPE_FEDERATED],
|
||||||
|
],
|
||||||
|
[
|
||||||
|
// SCOPE_PRIVATE is not allowed for display name and email
|
||||||
|
IAccountManager::PROPERTY_DISPLAYNAME => ['value' => 'Display Name', 'scope' => IAccountManager::SCOPE_PRIVATE],
|
||||||
|
IAccountManager::PROPERTY_EMAIL => ['value' => 'test@example.org', 'scope' => IAccountManager::SCOPE_PRIVATE],
|
||||||
|
IAccountManager::PROPERTY_TWITTER => ['value' => '@sometwitter', 'scope' => 'invalid'],
|
||||||
|
IAccountManager::PROPERTY_PHONE => ['value' => '+491601231212', 'scope' => ''],
|
||||||
|
],
|
||||||
|
[
|
||||||
|
IAccountManager::PROPERTY_DISPLAYNAME => ['value' => 'Display Name', 'scope' => IAccountManager::SCOPE_LOCAL],
|
||||||
|
IAccountManager::PROPERTY_EMAIL => ['value' => 'test@example.org', 'scope' => IAccountManager::SCOPE_LOCAL],
|
||||||
|
IAccountManager::PROPERTY_TWITTER => ['value' => '@sometwitter', 'scope' => IAccountManager::SCOPE_LOCAL],
|
||||||
|
IAccountManager::PROPERTY_PHONE => ['value' => '+491601231212', 'scope' => IAccountManager::SCOPE_LOCAL],
|
||||||
|
],
|
||||||
|
// don't throw but fall back
|
||||||
|
false, false,
|
||||||
|
],
|
||||||
|
// invalid or unsupported scope values throw an exception when passing $throwOnData=true
|
||||||
|
[
|
||||||
|
[IAccountManager::PROPERTY_DISPLAYNAME => ['value' => 'Display Name', 'scope' => IAccountManager::SCOPE_PUBLISHED]],
|
||||||
|
[IAccountManager::PROPERTY_DISPLAYNAME => ['value' => 'Display Name', 'scope' => IAccountManager::SCOPE_PRIVATE]],
|
||||||
|
null,
|
||||||
|
// throw exception
|
||||||
|
true, true,
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[IAccountManager::PROPERTY_EMAIL => ['value' => 'test@example.org', 'scope' => IAccountManager::SCOPE_PUBLISHED]],
|
||||||
|
[IAccountManager::PROPERTY_EMAIL => ['value' => 'test@example.org', 'scope' => IAccountManager::SCOPE_PRIVATE]],
|
||||||
|
null,
|
||||||
|
// throw exception
|
||||||
|
true, true,
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[IAccountManager::PROPERTY_TWITTER => ['value' => '@sometwitter', 'scope' => IAccountManager::SCOPE_PUBLISHED]],
|
||||||
|
[IAccountManager::PROPERTY_TWITTER => ['value' => '@sometwitter', 'scope' => 'invalid']],
|
||||||
|
null,
|
||||||
|
// throw exception
|
||||||
|
true, true,
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider updateUserSetScopeProvider
|
||||||
|
*/
|
||||||
|
public function testUpdateUserSetScope($oldData, $newData, $savedData, $throwOnData = true, $expectedThrow = false) {
|
||||||
|
$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 ($expectedThrow) {
|
||||||
|
$accountManager->expects($this->never())->method('updateExistingUser');
|
||||||
|
$this->expectException(\InvalidArgumentException::class);
|
||||||
|
$this->expectExceptionMessage('scope');
|
||||||
|
} else {
|
||||||
|
$accountManager->expects($this->once())->method('checkEmailVerification')
|
||||||
|
->with($oldData, $savedData, $user)->willReturn($savedData);
|
||||||
|
$accountManager->expects($this->once())->method('updateVerifyStatus')
|
||||||
|
->with($oldData, $savedData)->willReturn($savedData);
|
||||||
|
$accountManager->expects($this->once())->method('updateExistingUser')
|
||||||
|
->with($user, $savedData);
|
||||||
|
$accountManager->expects($this->never())->method('insertNewUser');
|
||||||
|
}
|
||||||
|
|
||||||
|
$accountManager->updateUser($user, $newData, $throwOnData);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @dataProvider dataTestGetUser
|
* @dataProvider dataTestGetUser
|
||||||
|
|
Loading…
Reference in New Issue