Discard duplicate collection name from account serialization

Signed-off-by: Christopher Ng <chrng8@gmail.com>
pull/31487/head
Christopher Ng 2022-03-08 00:38:38 +07:00
parent d9c0799377
commit a99d33c72d
2 changed files with 24 additions and 3 deletions

@ -104,9 +104,16 @@ class Account implements IAccount {
return $result;
}
/** @return IAccountPropertyCollection[]|IAccountProperty[] */
/** @return array<string, IAccountProperty|array<int, IAccountProperty>> */
public function jsonSerialize(): array {
return $this->properties;
$properties = $this->properties;
foreach ($properties as $propertyName => $propertyObject) {
if ($propertyObject instanceof IAccountPropertyCollection) {
// Override collection serialization to discard duplicate name
$properties[$propertyName] = $propertyObject->jsonSerialize()[$propertyName];
}
}
return $properties;
}
public function getUser(): IUser {

@ -120,12 +120,26 @@ class AccountTest extends TestCase {
$user = $this->createMock(IUser::class);
$properties = [
IAccountManager::PROPERTY_WEBSITE => new AccountProperty(IAccountManager::PROPERTY_WEBSITE, 'https://example.com', IAccountManager::SCOPE_PUBLISHED, IAccountManager::NOT_VERIFIED, ''),
IAccountManager::PROPERTY_EMAIL => new AccountProperty(IAccountManager::PROPERTY_EMAIL, 'user@example.com', IAccountManager::SCOPE_LOCAL, IAccountManager::VERIFIED, '')
IAccountManager::PROPERTY_EMAIL => new AccountProperty(IAccountManager::PROPERTY_EMAIL, 'user@example.com', IAccountManager::SCOPE_LOCAL, IAccountManager::VERIFIED, ''),
IAccountManager::COLLECTION_EMAIL => [
new AccountProperty(IAccountManager::COLLECTION_EMAIL, 'apple@orange.com', IAccountManager::SCOPE_LOCAL, IAccountManager::NOT_VERIFIED, ''),
new AccountProperty(IAccountManager::COLLECTION_EMAIL, 'banana@orange.com', IAccountManager::SCOPE_PUBLISHED, IAccountManager::VERIFICATION_IN_PROGRESS, ''),
new AccountProperty(IAccountManager::COLLECTION_EMAIL, 'kiwi@watermelon.com', IAccountManager::SCOPE_PUBLISHED, IAccountManager::VERIFIED, ''),
],
];
$account = new Account($user);
$account->setProperty(IAccountManager::PROPERTY_WEBSITE, 'https://example.com', IAccountManager::SCOPE_PUBLISHED, IAccountManager::NOT_VERIFIED);
$account->setProperty(IAccountManager::PROPERTY_EMAIL, 'user@example.com', IAccountManager::SCOPE_LOCAL, IAccountManager::VERIFIED);
$col = new AccountPropertyCollection(IAccountManager::COLLECTION_EMAIL);
$col->setProperties([
new AccountProperty($col->getName(), 'apple@orange.com', IAccountManager::SCOPE_LOCAL, IAccountManager::NOT_VERIFIED, ''),
new AccountProperty($col->getName(), 'banana@orange.com', IAccountManager::SCOPE_PUBLISHED, IAccountManager::VERIFICATION_IN_PROGRESS, ''),
new AccountProperty($col->getName(), 'kiwi@watermelon.com', IAccountManager::SCOPE_PUBLISHED, IAccountManager::VERIFIED, ''),
]);
$account->setPropertyCollection($col);
$this->assertEquals($properties, $account->jsonSerialize());
}
}