@@ -459,6 +459,45 @@ public function testUpdateAndDeleteUser(bool $activated, int $createCalls, int $
459459 $ ss ->deleteUser ($ user );
460460 }
461461
462+ public function testUpdateUserSkipsUnchangedCard (): void {
463+ $ vCard = new VCard ();
464+ $ vCard ->VERSION = '3.0 ' ;
465+ $ vCard ->UID = 'test-user ' ;
466+ $ vCard ->FN = 'test-user ' ;
467+
468+ /** @var CardDavBackend&MockObject $backend */
469+ $ backend = $ this ->getMockBuilder (CardDavBackend::class)->disableOriginalConstructor ()->getMock ();
470+ $ logger = $ this ->createMock (LoggerInterface::class);
471+
472+ $ backend ->expects ($ this ->never ())->method ('createCard ' );
473+ $ backend ->expects ($ this ->never ())->method ('updateCard ' );
474+ $ backend ->expects ($ this ->never ())->method ('deleteCard ' );
475+
476+ $ backend ->method ('getCard ' )->willReturn (['carddata ' => $ vCard ->serialize ()]);
477+ $ backend ->method ('getAddressBooksByUri ' )
478+ ->with ('principals/system/system ' , 'system ' )
479+ ->willReturn (['id ' => -1 ]);
480+
481+ $ user = $ this ->createMock (IUser::class);
482+ $ user ->method ('getBackendClassName ' )->willReturn ('unittest ' );
483+ $ user ->method ('getUID ' )->willReturn ('test-user ' );
484+ $ user ->method ('isEnabled ' )->willReturn (true );
485+
486+ $ converter = $ this ->createMock (Converter::class);
487+ $ converter ->method ('createCardFromUser ' )->willReturn ($ vCard );
488+
489+ $ ss = new SyncService (
490+ $ this ->createMock (IClientService::class),
491+ $ this ->createMock (IConfig::class),
492+ $ backend ,
493+ $ this ->createMock (IUserManager::class),
494+ $ this ->createMock (IDBConnection::class),
495+ $ logger ,
496+ $ converter ,
497+ );
498+ $ ss ->updateUser ($ user );
499+ }
500+
462501 public function testDeleteAddressbookWhenAccessRevoked (): void {
463502 $ this ->expectException (ClientExceptionInterface::class);
464503
0 commit comments