Fix update of avatar image

This commit is contained in:
Thomas Müller 2015-12-02 11:09:15 +01:00
parent 4c695e63c0
commit f558ac7dd5
2 changed files with 49 additions and 33 deletions

View file

@ -21,6 +21,7 @@
namespace OCA\DAV\CardDAV; namespace OCA\DAV\CardDAV;
use OCP\IImage;
use OCP\IUser; use OCP\IUser;
use Sabre\VObject\Component\VCard; use Sabre\VObject\Component\VCard;
use Sabre\VObject\Property\Text; use Sabre\VObject\Property\Text;
@ -68,21 +69,22 @@ class Converter {
$image = $user->getAvatarImage(-1); $image = $user->getAvatarImage(-1);
$updated = false; $updated = false;
if((is_null($vCard->FN) && !empty($displayName)) || (!is_null($vCard->FN) && $vCard->FN->getValue() !== $displayName)) { if($this->propertyNeedsUpdate($vCard, 'FN', $displayName)) {
$vCard->FN = new Text($vCard, 'FN', $displayName); $vCard->FN = new Text($vCard, 'FN', $displayName);
unset($vCard->N); unset($vCard->N);
$vCard->add(new Text($vCard, 'N', $this->splitFullName($displayName))); $vCard->add(new Text($vCard, 'N', $this->splitFullName($displayName)));
$updated = true; $updated = true;
} }
if((is_null($vCard->EMail) && !empty($emailAddress)) || (!is_null($vCard->EMail) && $vCard->EMail->getValue() !== $emailAddress)) { if($this->propertyNeedsUpdate($vCard, 'EMAIL', $emailAddress)) {
$vCard->EMAIL = new Text($vCard, 'EMAIL', $emailAddress); $vCard->EMAIL = new Text($vCard, 'EMAIL', $emailAddress);
$updated = true; $updated = true;
} }
if((is_null($vCard->CLOUD) && !empty($cloudId)) || (!is_null($vCard->CLOUD) && $vCard->CLOUD->getValue() !== $cloudId)) { if($this->propertyNeedsUpdate($vCard, 'CLOUD', $cloudId)) {
$vCard->CLOUD = new Text($vCard, 'CLOUD', $cloudId); $vCard->CLOUD = new Text($vCard, 'CLOUD', $cloudId);
$updated = true; $updated = true;
} }
if((is_null($vCard->PHOTO) && !empty($image)) || (!is_null($vCard->PHOTO) && $vCard->PHOTO->getValue() !== $image)) {
if($this->propertyNeedsUpdate($vCard, 'PHOTO', $image)) {
$vCard->add('PHOTO', $image->data(), ['ENCODING' => 'b', 'TYPE' => $image->mimeType()]); $vCard->add('PHOTO', $image->data(), ['ENCODING' => 'b', 'TYPE' => $image->mimeType()]);
$updated = true; $updated = true;
} }
@ -103,6 +105,20 @@ class Converter {
return $updated; return $updated;
} }
private function propertyNeedsUpdate(VCard $vCard, $name, $newValue) {
if (is_null($newValue)) {
return false;
}
$value = $vCard->__get($name);
if (!is_null($value)) {
$value = $value->getValue();
$newValue = $newValue instanceof IImage ? $newValue->data() : $newValue;
return $value !== $newValue;
}
return true;
}
/** /**
* @param string $fullName * @param string $fullName
* @return string[] * @return string[]
@ -126,4 +142,5 @@ class Converter {
return $result; return $result;
} }
} }

View file

@ -30,11 +30,7 @@ class ConverterTests extends TestCase {
* @dataProvider providesNewUsers * @dataProvider providesNewUsers
*/ */
public function testCreation($expectedVCard, $displayName = null, $eMailAddress = null, $cloudId = null) { public function testCreation($expectedVCard, $displayName = null, $eMailAddress = null, $cloudId = null) {
$user = $this->getMockBuilder('OCP\IUser')->disableOriginalConstructor()->getMock(); $user = $this->getUserMock($displayName, $eMailAddress, $cloudId);
$user->method('getUID')->willReturn('12345');
$user->method('getDisplayName')->willReturn($displayName);
$user->method('getEMailAddress')->willReturn($eMailAddress);
$user->method('getCloudId')->willReturn($cloudId);
$converter = new Converter(); $converter = new Converter();
$vCard = $converter->createCardFromUser($user); $vCard = $converter->createCardFromUser($user);
@ -45,22 +41,18 @@ class ConverterTests extends TestCase {
public function providesNewUsers() { public function providesNewUsers() {
return [ return [
["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.4.7//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nEND:VCARD\r\n"], ["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.4.7//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO;ENCODING=b;TYPE=JPEG:MTIzNDU2Nzg5\r\nEND:VCARD\r\n"],
["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.4.7//EN\r\nUID:12345\r\nFN:Dr. Foo Bar\r\nN:Bar;Dr.;Foo;;\r\nEND:VCARD\r\n", "Dr. Foo Bar"], ["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.4.7//EN\r\nUID:12345\r\nFN:Dr. Foo Bar\r\nN:Bar;Dr.;Foo;;\r\nPHOTO;ENCODING=b;TYPE=JPEG:MTIzNDU2Nzg5\r\nEND:VCARD\r\n", "Dr. Foo Bar"],
["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.4.7//EN\r\nUID:12345\r\nFN:Dr. Foo Bar\r\nN:Bar;Dr.;Foo;;\r\nEMAIL;TYPE=OTHER:foo@bar.net\r\nEND:VCARD\r\n", "Dr. Foo Bar", "foo@bar.net"], ["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.4.7//EN\r\nUID:12345\r\nFN:Dr. Foo Bar\r\nN:Bar;Dr.;Foo;;\r\nEMAIL;TYPE=OTHER:foo@bar.net\r\nPHOTO;ENCODING=b;TYPE=JPEG:MTIzNDU2Nzg5\r\nEND:VCARD\r\n", "Dr. Foo Bar", "foo@bar.net"],
["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.4.7//EN\r\nUID:12345\r\nFN:Dr. Foo Bar\r\nN:Bar;Dr.;Foo;;\r\nCLOUD:foo@bar.net\r\nEND:VCARD\r\n", "Dr. Foo Bar", null, "foo@bar.net"], ["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.4.7//EN\r\nUID:12345\r\nFN:Dr. Foo Bar\r\nN:Bar;Dr.;Foo;;\r\nCLOUD:foo@bar.net\r\nPHOTO;ENCODING=b;TYPE=JPEG:MTIzNDU2Nzg5\r\nEND:VCARD\r\n", "Dr. Foo Bar", null, "foo@bar.net"],
]; ];
} }
/** /**
* @dataProvider providesUsersForUpdate * @dataProvider providesNewUsers
*/ */
public function testUpdateOfUnchangedUser($expectedVCard, $displayName = null, $eMailAddress = null, $cloudId = null) { public function testUpdateOfUnchangedUser($expectedVCard, $displayName = null, $eMailAddress = null, $cloudId = null) {
$user = $this->getMockBuilder('OCP\IUser')->disableOriginalConstructor()->getMock(); $user = $this->getUserMock($displayName, $eMailAddress, $cloudId);
$user->method('getUID')->willReturn('12345');
$user->method('getDisplayName')->willReturn($displayName);
$user->method('getEMailAddress')->willReturn($eMailAddress);
$user->method('getCloudId')->willReturn($cloudId);
$converter = new Converter(); $converter = new Converter();
$vCard = $converter->createCardFromUser($user); $vCard = $converter->createCardFromUser($user);
@ -71,24 +63,11 @@ class ConverterTests extends TestCase {
$this->assertEquals($expectedVCard, $cardData); $this->assertEquals($expectedVCard, $cardData);
} }
public function providesUsersForUpdate() {
return [
["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.4.7//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nEND:VCARD\r\n"],
["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.4.7//EN\r\nUID:12345\r\nFN:Dr. Foo Bar\r\nN:Bar;Dr.;Foo;;\r\nEND:VCARD\r\n", "Dr. Foo Bar"],
["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.4.7//EN\r\nUID:12345\r\nFN:Dr. Foo Bar\r\nN:Bar;Dr.;Foo;;\r\nEMAIL;TYPE=OTHER:foo@bar.net\r\nEND:VCARD\r\n", "Dr. Foo Bar", "foo@bar.net"],
["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.4.7//EN\r\nUID:12345\r\nFN:Dr. Foo Bar\r\nN:Bar;Dr.;Foo;;\r\nCLOUD:foo@bar.net\r\nEND:VCARD\r\n", "Dr. Foo Bar", null, "foo@bar.net"],
];
}
/** /**
* @dataProvider providesUsersForUpdateOfRemovedElement * @dataProvider providesUsersForUpdateOfRemovedElement
*/ */
public function testUpdateOfRemovedElement($expectedVCard, $displayName = null, $eMailAddress = null, $cloudId = null) { public function testUpdateOfRemovedElement($expectedVCard, $displayName = null, $eMailAddress = null, $cloudId = null) {
$user = $this->getMockBuilder('OCP\IUser')->disableOriginalConstructor()->getMock(); $user = $this->getUserMock($displayName, $eMailAddress, $cloudId);
$user->method('getUID')->willReturn('12345');
$user->method('getDisplayName')->willReturn($displayName);
$user->method('getEMailAddress')->willReturn($eMailAddress);
$user->method('getCloudId')->willReturn($cloudId);
$converter = new Converter(); $converter = new Converter();
$vCard = $converter->createCardFromUser($user); $vCard = $converter->createCardFromUser($user);
@ -98,6 +77,7 @@ class ConverterTests extends TestCase {
$user1->method('getDisplayName')->willReturn(null); $user1->method('getDisplayName')->willReturn(null);
$user1->method('getEMailAddress')->willReturn(null); $user1->method('getEMailAddress')->willReturn(null);
$user1->method('getCloudId')->willReturn(null); $user1->method('getCloudId')->willReturn(null);
$user1->method('getAvatarImage')->willReturn(null);
$updated = $converter->updateCard($vCard, $user1); $updated = $converter->updateCard($vCard, $user1);
$this->assertTrue($updated); $this->assertTrue($updated);
@ -134,4 +114,23 @@ class ConverterTests extends TestCase {
['Tolkien;John;Ronald Reuel;;', 'John Ronald Reuel Tolkien'], ['Tolkien;John;Ronald Reuel;;', 'John Ronald Reuel Tolkien'],
]; ];
} }
/**
* @param $displayName
* @param $eMailAddress
* @param $cloudId
* @return \PHPUnit_Framework_MockObject_MockObject
*/
protected function getUserMock($displayName, $eMailAddress, $cloudId) {
$image0 = $this->getMockBuilder('OCP\IImage')->disableOriginalConstructor()->getMock();
$image0->method('mimeType')->willReturn('JPEG');
$image0->method('data')->willReturn('123456789');
$user = $this->getMockBuilder('OCP\IUser')->disableOriginalConstructor()->getMock();
$user->method('getUID')->willReturn('12345');
$user->method('getDisplayName')->willReturn($displayName);
$user->method('getEMailAddress')->willReturn($eMailAddress);
$user->method('getCloudId')->willReturn($cloudId);
$user->method('getAvatarImage')->willReturn($image0);
return $user;
}
} }