Merge pull request #11832 from nextcloud/bugfix/9849/birthday_without_year
set birthday year to 1970 if no year, take X-APPLE-OMIT-YEAR into account
This commit is contained in:
commit
2b76e27aad
|
@ -28,6 +28,7 @@
|
||||||
<repair-steps>
|
<repair-steps>
|
||||||
<post-migration>
|
<post-migration>
|
||||||
<step>OCA\DAV\Migration\FixBirthdayCalendarComponent</step>
|
<step>OCA\DAV\Migration\FixBirthdayCalendarComponent</step>
|
||||||
|
<step>OCA\DAV\Migration\RegenerateBirthdayCalendars</step>
|
||||||
<step>OCA\DAV\Migration\CalDAVRemoveEmptyValue</step>
|
<step>OCA\DAV\Migration\CalDAVRemoveEmptyValue</step>
|
||||||
<step>OCA\DAV\Migration\BuildCalendarSearchIndex</step>
|
<step>OCA\DAV\Migration\BuildCalendarSearchIndex</step>
|
||||||
<step>OCA\DAV\Migration\RefreshWebcalJobRegistrar</step>
|
<step>OCA\DAV\Migration\RefreshWebcalJobRegistrar</step>
|
||||||
|
|
|
@ -159,6 +159,7 @@ return array(
|
||||||
'OCA\\DAV\\Migration\\ChunkCleanup' => $baseDir . '/../lib/Migration/ChunkCleanup.php',
|
'OCA\\DAV\\Migration\\ChunkCleanup' => $baseDir . '/../lib/Migration/ChunkCleanup.php',
|
||||||
'OCA\\DAV\\Migration\\FixBirthdayCalendarComponent' => $baseDir . '/../lib/Migration/FixBirthdayCalendarComponent.php',
|
'OCA\\DAV\\Migration\\FixBirthdayCalendarComponent' => $baseDir . '/../lib/Migration/FixBirthdayCalendarComponent.php',
|
||||||
'OCA\\DAV\\Migration\\RefreshWebcalJobRegistrar' => $baseDir . '/../lib/Migration/RefreshWebcalJobRegistrar.php',
|
'OCA\\DAV\\Migration\\RefreshWebcalJobRegistrar' => $baseDir . '/../lib/Migration/RefreshWebcalJobRegistrar.php',
|
||||||
|
'OCA\\DAV\\Migration\\RegenerateBirthdayCalendars' => $baseDir . '/../lib/Migration/RegenerateBirthdayCalendars.php',
|
||||||
'OCA\\DAV\\Migration\\RemoveClassifiedEventActivity' => $baseDir . '/../lib/Migration/RemoveClassifiedEventActivity.php',
|
'OCA\\DAV\\Migration\\RemoveClassifiedEventActivity' => $baseDir . '/../lib/Migration/RemoveClassifiedEventActivity.php',
|
||||||
'OCA\\DAV\\Migration\\RemoveOrphanEventsAndContacts' => $baseDir . '/../lib/Migration/RemoveOrphanEventsAndContacts.php',
|
'OCA\\DAV\\Migration\\RemoveOrphanEventsAndContacts' => $baseDir . '/../lib/Migration/RemoveOrphanEventsAndContacts.php',
|
||||||
'OCA\\DAV\\Migration\\Version1004Date20170825134824' => $baseDir . '/../lib/Migration/Version1004Date20170825134824.php',
|
'OCA\\DAV\\Migration\\Version1004Date20170825134824' => $baseDir . '/../lib/Migration/Version1004Date20170825134824.php',
|
||||||
|
|
|
@ -174,6 +174,7 @@ class ComposerStaticInitDAV
|
||||||
'OCA\\DAV\\Migration\\ChunkCleanup' => __DIR__ . '/..' . '/../lib/Migration/ChunkCleanup.php',
|
'OCA\\DAV\\Migration\\ChunkCleanup' => __DIR__ . '/..' . '/../lib/Migration/ChunkCleanup.php',
|
||||||
'OCA\\DAV\\Migration\\FixBirthdayCalendarComponent' => __DIR__ . '/..' . '/../lib/Migration/FixBirthdayCalendarComponent.php',
|
'OCA\\DAV\\Migration\\FixBirthdayCalendarComponent' => __DIR__ . '/..' . '/../lib/Migration/FixBirthdayCalendarComponent.php',
|
||||||
'OCA\\DAV\\Migration\\RefreshWebcalJobRegistrar' => __DIR__ . '/..' . '/../lib/Migration/RefreshWebcalJobRegistrar.php',
|
'OCA\\DAV\\Migration\\RefreshWebcalJobRegistrar' => __DIR__ . '/..' . '/../lib/Migration/RefreshWebcalJobRegistrar.php',
|
||||||
|
'OCA\\DAV\\Migration\\RegenerateBirthdayCalendars' => __DIR__ . '/..' . '/../lib/Migration/RegenerateBirthdayCalendars.php',
|
||||||
'OCA\\DAV\\Migration\\RemoveClassifiedEventActivity' => __DIR__ . '/..' . '/../lib/Migration/RemoveClassifiedEventActivity.php',
|
'OCA\\DAV\\Migration\\RemoveClassifiedEventActivity' => __DIR__ . '/..' . '/../lib/Migration/RemoveClassifiedEventActivity.php',
|
||||||
'OCA\\DAV\\Migration\\RemoveOrphanEventsAndContacts' => __DIR__ . '/..' . '/../lib/Migration/RemoveOrphanEventsAndContacts.php',
|
'OCA\\DAV\\Migration\\RemoveOrphanEventsAndContacts' => __DIR__ . '/..' . '/../lib/Migration/RemoveOrphanEventsAndContacts.php',
|
||||||
'OCA\\DAV\\Migration\\Version1004Date20170825134824' => __DIR__ . '/..' . '/../lib/Migration/Version1004Date20170825134824.php',
|
'OCA\\DAV\\Migration\\Version1004Date20170825134824' => __DIR__ . '/..' . '/../lib/Migration/Version1004Date20170825134824.php',
|
||||||
|
|
|
@ -51,6 +51,7 @@ class GenerateBirthdayCalendarBackgroundJob extends QueuedJob {
|
||||||
*/
|
*/
|
||||||
public function run($arguments) {
|
public function run($arguments) {
|
||||||
$userId = $arguments['userId'];
|
$userId = $arguments['userId'];
|
||||||
|
$purgeBeforeGenerating = $arguments['purgeBeforeGenerating'] ?? false;
|
||||||
|
|
||||||
// make sure admin didn't change his mind
|
// make sure admin didn't change his mind
|
||||||
$isGloballyEnabled = $this->config->getAppValue('dav', 'generateBirthdayCalendar', 'yes');
|
$isGloballyEnabled = $this->config->getAppValue('dav', 'generateBirthdayCalendar', 'yes');
|
||||||
|
@ -64,6 +65,10 @@ class GenerateBirthdayCalendarBackgroundJob extends QueuedJob {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($purgeBeforeGenerating) {
|
||||||
|
$this->birthdayService->resetForUser($userId);
|
||||||
|
}
|
||||||
|
|
||||||
$this->birthdayService->syncUser($userId);
|
$this->birthdayService->syncUser($userId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,6 +32,7 @@ use Exception;
|
||||||
use OCA\DAV\CardDAV\CardDavBackend;
|
use OCA\DAV\CardDAV\CardDavBackend;
|
||||||
use OCA\DAV\DAV\GroupPrincipalBackend;
|
use OCA\DAV\DAV\GroupPrincipalBackend;
|
||||||
use OCP\IConfig;
|
use OCP\IConfig;
|
||||||
|
use OCP\IDBConnection;
|
||||||
use Sabre\VObject\Component\VCalendar;
|
use Sabre\VObject\Component\VCalendar;
|
||||||
use Sabre\VObject\Component\VCard;
|
use Sabre\VObject\Component\VCard;
|
||||||
use Sabre\VObject\DateTimeParser;
|
use Sabre\VObject\DateTimeParser;
|
||||||
|
@ -56,6 +57,9 @@ class BirthdayService {
|
||||||
/** @var IConfig */
|
/** @var IConfig */
|
||||||
private $config;
|
private $config;
|
||||||
|
|
||||||
|
/** @var IDBConnection */
|
||||||
|
private $dbConnection;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* BirthdayService constructor.
|
* BirthdayService constructor.
|
||||||
*
|
*
|
||||||
|
@ -64,11 +68,12 @@ class BirthdayService {
|
||||||
* @param GroupPrincipalBackend $principalBackend
|
* @param GroupPrincipalBackend $principalBackend
|
||||||
* @param IConfig $config;
|
* @param IConfig $config;
|
||||||
*/
|
*/
|
||||||
public function __construct(CalDavBackend $calDavBackEnd, CardDavBackend $cardDavBackEnd, GroupPrincipalBackend $principalBackend, IConfig $config) {
|
public function __construct(CalDavBackend $calDavBackEnd, CardDavBackend $cardDavBackEnd, GroupPrincipalBackend $principalBackend, IConfig $config, IDBConnection $dbConnection) {
|
||||||
$this->calDavBackEnd = $calDavBackEnd;
|
$this->calDavBackEnd = $calDavBackEnd;
|
||||||
$this->cardDavBackEnd = $cardDavBackEnd;
|
$this->cardDavBackEnd = $cardDavBackEnd;
|
||||||
$this->principalBackend = $principalBackend;
|
$this->principalBackend = $principalBackend;
|
||||||
$this->config = $config;
|
$this->config = $config;
|
||||||
|
$this->dbConnection = $dbConnection;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -85,9 +90,9 @@ class BirthdayService {
|
||||||
$book = $this->cardDavBackEnd->getAddressBookById($addressBookId);
|
$book = $this->cardDavBackEnd->getAddressBookById($addressBookId);
|
||||||
$targetPrincipals[] = $book['principaluri'];
|
$targetPrincipals[] = $book['principaluri'];
|
||||||
$datesToSync = [
|
$datesToSync = [
|
||||||
['postfix' => '', 'field' => 'BDAY', 'symbol' => '*'],
|
['postfix' => '', 'field' => 'BDAY', 'symbol' => '*', 'utfSymbol' => '🎂'],
|
||||||
['postfix' => '-death', 'field' => 'DEATHDATE', 'symbol' => "†"],
|
['postfix' => '-death', 'field' => 'DEATHDATE', 'symbol' => "†", 'utfSymbol' => '⚰️'],
|
||||||
['postfix' => '-anniversary', 'field' => 'ANNIVERSARY', 'symbol' => "⚭"],
|
['postfix' => '-anniversary', 'field' => 'ANNIVERSARY', 'symbol' => "⚭", 'utfSymbol' => '💍'],
|
||||||
];
|
];
|
||||||
foreach ($targetPrincipals as $principalUri) {
|
foreach ($targetPrincipals as $principalUri) {
|
||||||
if (!$this->isUserEnabled($principalUri)) {
|
if (!$this->isUserEnabled($principalUri)) {
|
||||||
|
@ -132,9 +137,9 @@ class BirthdayService {
|
||||||
* @throws \Sabre\DAV\Exception\BadRequest
|
* @throws \Sabre\DAV\Exception\BadRequest
|
||||||
*/
|
*/
|
||||||
public function ensureCalendarExists($principal) {
|
public function ensureCalendarExists($principal) {
|
||||||
$book = $this->calDavBackEnd->getCalendarByUri($principal, self::BIRTHDAY_CALENDAR_URI);
|
$calendar = $this->calDavBackEnd->getCalendarByUri($principal, self::BIRTHDAY_CALENDAR_URI);
|
||||||
if (!is_null($book)) {
|
if (!is_null($calendar)) {
|
||||||
return $book;
|
return $calendar;
|
||||||
}
|
}
|
||||||
$this->calDavBackEnd->createCalendar($principal, self::BIRTHDAY_CALENDAR_URI, [
|
$this->calDavBackEnd->createCalendar($principal, self::BIRTHDAY_CALENDAR_URI, [
|
||||||
'{DAV:}displayname' => 'Contact birthdays',
|
'{DAV:}displayname' => 'Contact birthdays',
|
||||||
|
@ -150,9 +155,10 @@ class BirthdayService {
|
||||||
* @param string $dateField
|
* @param string $dateField
|
||||||
* @param string $postfix
|
* @param string $postfix
|
||||||
* @param string $summarySymbol
|
* @param string $summarySymbol
|
||||||
|
* @param string $utfSummarySymbol
|
||||||
* @return null|VCalendar
|
* @return null|VCalendar
|
||||||
*/
|
*/
|
||||||
public function buildDateFromContact($cardData, $dateField, $postfix, $summarySymbol) {
|
public function buildDateFromContact($cardData, $dateField, $postfix, $summarySymbol, $utfSummarySymbol) {
|
||||||
if (empty($cardData)) {
|
if (empty($cardData)) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -191,10 +197,26 @@ class BirthdayService {
|
||||||
}
|
}
|
||||||
|
|
||||||
$unknownYear = false;
|
$unknownYear = false;
|
||||||
|
$originalYear = null;
|
||||||
if (!$dateParts['year']) {
|
if (!$dateParts['year']) {
|
||||||
$birthday = '1900-' . $dateParts['month'] . '-' . $dateParts['date'];
|
$birthday = '1970-' . $dateParts['month'] . '-' . $dateParts['date'];
|
||||||
|
|
||||||
$unknownYear = true;
|
$unknownYear = true;
|
||||||
|
} else {
|
||||||
|
$parameters = $birthday->parameters();
|
||||||
|
if (isset($parameters['X-APPLE-OMIT-YEAR'])) {
|
||||||
|
$omitYear = $parameters['X-APPLE-OMIT-YEAR'];
|
||||||
|
if ($dateParts['year'] === $omitYear) {
|
||||||
|
$birthday = '1970-' . $dateParts['month'] . '-' . $dateParts['date'];
|
||||||
|
$unknownYear = true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$originalYear = (int)$dateParts['year'];
|
||||||
|
|
||||||
|
if ($originalYear < 1970) {
|
||||||
|
$birthday = '1970-' . $dateParts['month'] . '-' . $dateParts['date'];
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
@ -202,12 +224,20 @@ class BirthdayService {
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if ($unknownYear) {
|
if ($this->dbConnection->supports4ByteText()) {
|
||||||
$summary = $doc->FN->getValue() . ' ' . $summarySymbol;
|
if ($unknownYear) {
|
||||||
|
$summary = $utfSummarySymbol . ' ' . $doc->FN->getValue();
|
||||||
|
} else {
|
||||||
|
$summary = $utfSummarySymbol . ' ' . $doc->FN->getValue() . " ($originalYear)";
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
$year = (int)$date->format('Y');
|
if ($unknownYear) {
|
||||||
$summary = $doc->FN->getValue() . " ($summarySymbol$year)";
|
$summary = $doc->FN->getValue() . ' ' . $summarySymbol;
|
||||||
|
} else {
|
||||||
|
$summary = $doc->FN->getValue() . " ($summarySymbol$originalYear)";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$vCal = new VCalendar();
|
$vCal = new VCalendar();
|
||||||
$vCal->VERSION = '2.0';
|
$vCal->VERSION = '2.0';
|
||||||
$vEvent = $vCal->createComponent('VEVENT');
|
$vEvent = $vCal->createComponent('VEVENT');
|
||||||
|
@ -226,6 +256,11 @@ class BirthdayService {
|
||||||
$vEvent->{'RRULE'} = 'FREQ=YEARLY';
|
$vEvent->{'RRULE'} = 'FREQ=YEARLY';
|
||||||
$vEvent->{'SUMMARY'} = $summary;
|
$vEvent->{'SUMMARY'} = $summary;
|
||||||
$vEvent->{'TRANSP'} = 'TRANSPARENT';
|
$vEvent->{'TRANSP'} = 'TRANSPARENT';
|
||||||
|
$vEvent->{'X-NEXTCLOUD-BC-FIELD-TYPE'} = $dateField;
|
||||||
|
$vEvent->{'X-NEXTCLOUD-BC-UNKNOWN-YEAR'} = $unknownYear ? '1' : '0';
|
||||||
|
if ($originalYear !== null) {
|
||||||
|
$vEvent->{'X-NEXTCLOUD-BC-YEAR'} = (string) $originalYear;
|
||||||
|
}
|
||||||
$alarm = $vCal->createComponent('VALARM');
|
$alarm = $vCal->createComponent('VALARM');
|
||||||
$alarm->add($vCal->createProperty('TRIGGER', '-PT0M', ['VALUE' => 'DURATION']));
|
$alarm->add($vCal->createProperty('TRIGGER', '-PT0M', ['VALUE' => 'DURATION']));
|
||||||
$alarm->add($vCal->createProperty('ACTION', 'DISPLAY'));
|
$alarm->add($vCal->createProperty('ACTION', 'DISPLAY'));
|
||||||
|
@ -235,6 +270,19 @@ class BirthdayService {
|
||||||
return $vCal;
|
return $vCal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $user
|
||||||
|
*/
|
||||||
|
public function resetForUser($user) {
|
||||||
|
$principal = 'principals/users/'.$user;
|
||||||
|
$calendar = $this->calDavBackEnd->getCalendarByUri($principal, self::BIRTHDAY_CALENDAR_URI);
|
||||||
|
$calendarObjects = $this->calDavBackEnd->getCalendarObjects($calendar['id'], CalDavBackend::CALENDAR_TYPE_CALENDAR);
|
||||||
|
|
||||||
|
foreach($calendarObjects as $calendarObject) {
|
||||||
|
$this->calDavBackEnd->deleteCalendarObject($calendar['id'], $calendarObject['uri'], CalDavBackend::CALENDAR_TYPE_CALENDAR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string $user
|
* @param string $user
|
||||||
*/
|
*/
|
||||||
|
@ -298,7 +346,7 @@ class BirthdayService {
|
||||||
*/
|
*/
|
||||||
private function updateCalendar($cardUri, $cardData, $book, $calendarId, $type) {
|
private function updateCalendar($cardUri, $cardData, $book, $calendarId, $type) {
|
||||||
$objectUri = $book['uri'] . '-' . $cardUri . $type['postfix'] . '.ics';
|
$objectUri = $book['uri'] . '-' . $cardUri . $type['postfix'] . '.ics';
|
||||||
$calendarData = $this->buildDateFromContact($cardData, $type['field'], $type['postfix'], $type['symbol']);
|
$calendarData = $this->buildDateFromContact($cardData, $type['field'], $type['postfix'], $type['symbol'], $type['utfSymbol']);
|
||||||
$existing = $this->calDavBackEnd->getCalendarObject($calendarId, $objectUri);
|
$existing = $this->calDavBackEnd->getCalendarObject($calendarId, $objectUri);
|
||||||
if (is_null($calendarData)) {
|
if (is_null($calendarData)) {
|
||||||
if (!is_null($existing)) {
|
if (!is_null($existing)) {
|
||||||
|
|
|
@ -0,0 +1,85 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @copyright 2019 Georg Ehrke <oc.list@georgehrke.com>
|
||||||
|
*
|
||||||
|
* @author Georg Ehrke <oc.list@georgehrke.com>
|
||||||
|
*
|
||||||
|
* @license GNU AGPL version 3 or any later version
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
namespace OCA\DAV\Migration;
|
||||||
|
|
||||||
|
use OCA\DAV\BackgroundJob\GenerateBirthdayCalendarBackgroundJob;
|
||||||
|
use OCP\BackgroundJob\IJobList;
|
||||||
|
use OCP\IConfig;
|
||||||
|
use OCP\IUser;
|
||||||
|
use OCP\IUserManager;
|
||||||
|
use OCP\Migration\IOutput;
|
||||||
|
use OCP\Migration\IRepairStep;
|
||||||
|
|
||||||
|
class RegenerateBirthdayCalendars implements IRepairStep {
|
||||||
|
|
||||||
|
/** @var IUserManager */
|
||||||
|
private $userManager;
|
||||||
|
|
||||||
|
/** @var IJobList */
|
||||||
|
private $jobList;
|
||||||
|
|
||||||
|
/** @var IConfig */
|
||||||
|
private $config;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param IUserManager $userManager,
|
||||||
|
* @param IJobList $jobList
|
||||||
|
* @param IConfig $config
|
||||||
|
*/
|
||||||
|
public function __construct(IUserManager $userManager,
|
||||||
|
IJobList $jobList,
|
||||||
|
IConfig $config) {
|
||||||
|
$this->userManager = $userManager;
|
||||||
|
$this->jobList = $jobList;
|
||||||
|
$this->config = $config;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getName() {
|
||||||
|
return 'Regenerating birthday calendars to use new icons and fix old birthday events without year';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param IOutput $output
|
||||||
|
*/
|
||||||
|
public function run(IOutput $output) {
|
||||||
|
// only run once
|
||||||
|
if ($this->config->getAppValue('dav', 'regeneratedBirthdayCalendarsForYearFix') === 'yes') {
|
||||||
|
$output->info('Repair step already executed');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$output->info('Adding background jobs to regenerate birthday calendar');
|
||||||
|
$this->userManager->callForAllUsers(function(IUser $user) {
|
||||||
|
$this->jobList->add(GenerateBirthdayCalendarBackgroundJob::class, [
|
||||||
|
'userId' => $user->getUID(),
|
||||||
|
'purgeBeforeGenerating' => true
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
|
||||||
|
// if all were done, no need to redo the repair during next upgrade
|
||||||
|
$this->config->setAppValue('dav', 'regeneratedBirthdayCalendarsForYearFix', 'yes');
|
||||||
|
}
|
||||||
|
}
|
|
@ -62,6 +62,10 @@ class GenerateBirthdayCalendarBackgroundJobTest extends TestCase {
|
||||||
->with('user123', 'dav', 'generateBirthdayCalendar', 'yes')
|
->with('user123', 'dav', 'generateBirthdayCalendar', 'yes')
|
||||||
->will($this->returnValue('yes'));
|
->will($this->returnValue('yes'));
|
||||||
|
|
||||||
|
$this->birthdayService->expects($this->never())
|
||||||
|
->method('resetForUser')
|
||||||
|
->with('user123');
|
||||||
|
|
||||||
$this->birthdayService->expects($this->once())
|
$this->birthdayService->expects($this->once())
|
||||||
->method('syncUser')
|
->method('syncUser')
|
||||||
->with('user123');
|
->with('user123');
|
||||||
|
@ -69,6 +73,28 @@ class GenerateBirthdayCalendarBackgroundJobTest extends TestCase {
|
||||||
$this->backgroundJob->run(['userId' => 'user123']);
|
$this->backgroundJob->run(['userId' => 'user123']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testRunAndReset() {
|
||||||
|
$this->config->expects($this->once())
|
||||||
|
->method('getAppValue')
|
||||||
|
->with('dav', 'generateBirthdayCalendar', 'yes')
|
||||||
|
->will($this->returnValue('yes'));
|
||||||
|
|
||||||
|
$this->config->expects($this->once())
|
||||||
|
->method('getUserValue')
|
||||||
|
->with('user123', 'dav', 'generateBirthdayCalendar', 'yes')
|
||||||
|
->will($this->returnValue('yes'));
|
||||||
|
|
||||||
|
$this->birthdayService->expects($this->once())
|
||||||
|
->method('resetForUser')
|
||||||
|
->with('user123');
|
||||||
|
|
||||||
|
$this->birthdayService->expects($this->once())
|
||||||
|
->method('syncUser')
|
||||||
|
->with('user123');
|
||||||
|
|
||||||
|
$this->backgroundJob->run(['userId' => 'user123', 'purgeBeforeGenerating' => true]);
|
||||||
|
}
|
||||||
|
|
||||||
public function testRunGloballyDisabled() {
|
public function testRunGloballyDisabled() {
|
||||||
$this->config->expects($this->once())
|
$this->config->expects($this->once())
|
||||||
->method('getAppValue')
|
->method('getAppValue')
|
||||||
|
|
|
@ -29,6 +29,7 @@ use OCA\DAV\CalDAV\CalDavBackend;
|
||||||
use OCA\DAV\CardDAV\CardDavBackend;
|
use OCA\DAV\CardDAV\CardDavBackend;
|
||||||
use OCA\DAV\DAV\GroupPrincipalBackend;
|
use OCA\DAV\DAV\GroupPrincipalBackend;
|
||||||
use OCP\IConfig;
|
use OCP\IConfig;
|
||||||
|
use OCP\IDBConnection;
|
||||||
use Sabre\VObject\Component\VCalendar;
|
use Sabre\VObject\Component\VCalendar;
|
||||||
use Sabre\VObject\Reader;
|
use Sabre\VObject\Reader;
|
||||||
use Test\TestCase;
|
use Test\TestCase;
|
||||||
|
@ -45,6 +46,8 @@ class BirthdayServiceTest extends TestCase {
|
||||||
private $groupPrincipalBackend;
|
private $groupPrincipalBackend;
|
||||||
/** @var IConfig | \PHPUnit_Framework_MockObject_MockObject */
|
/** @var IConfig | \PHPUnit_Framework_MockObject_MockObject */
|
||||||
private $config;
|
private $config;
|
||||||
|
/** @var IDBConnection | \PHPUnit_Framework_MockObject_MockObject */
|
||||||
|
private $dbConnection;
|
||||||
|
|
||||||
public function setUp() {
|
public function setUp() {
|
||||||
parent::setUp();
|
parent::setUp();
|
||||||
|
@ -53,18 +56,25 @@ class BirthdayServiceTest extends TestCase {
|
||||||
$this->cardDav = $this->createMock(CardDavBackend::class);
|
$this->cardDav = $this->createMock(CardDavBackend::class);
|
||||||
$this->groupPrincipalBackend = $this->createMock(GroupPrincipalBackend::class);
|
$this->groupPrincipalBackend = $this->createMock(GroupPrincipalBackend::class);
|
||||||
$this->config = $this->createMock(IConfig::class);
|
$this->config = $this->createMock(IConfig::class);
|
||||||
|
$this->dbConnection = $this->createMock(IDBConnection::class);
|
||||||
|
|
||||||
$this->service = new BirthdayService($this->calDav, $this->cardDav,
|
$this->service = new BirthdayService($this->calDav, $this->cardDav,
|
||||||
$this->groupPrincipalBackend, $this->config);
|
$this->groupPrincipalBackend, $this->config, $this->dbConnection);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @dataProvider providesVCards
|
* @dataProvider providesVCards
|
||||||
* @param boolean $expectedSummary
|
* @param string $expectedSummary
|
||||||
|
* @param string $expectedDTStart
|
||||||
|
* @param string $expectedFieldType
|
||||||
|
* @param string $expectedUnknownYear
|
||||||
|
* @param string $expectedOriginalYear
|
||||||
* @param string | null $data
|
* @param string | null $data
|
||||||
*/
|
*/
|
||||||
public function testBuildBirthdayFromContact($expectedSummary, $data) {
|
public function testBuildBirthdayFromContact($expectedSummary, $expectedDTStart, $expectedFieldType, $expectedUnknownYear, $expectedOriginalYear, $data, $supports4Bytes) {
|
||||||
$cal = $this->service->buildDateFromContact($data, 'BDAY', '', '*');
|
$this->dbConnection->method('supports4ByteText')->willReturn($supports4Bytes);
|
||||||
|
$cal = $this->service->buildDateFromContact($data, 'BDAY', '', '*', '🎂');
|
||||||
|
|
||||||
if ($expectedSummary === null) {
|
if ($expectedSummary === null) {
|
||||||
$this->assertNull($cal);
|
$this->assertNull($cal);
|
||||||
} else {
|
} else {
|
||||||
|
@ -72,6 +82,14 @@ class BirthdayServiceTest extends TestCase {
|
||||||
$this->assertTrue(isset($cal->VEVENT));
|
$this->assertTrue(isset($cal->VEVENT));
|
||||||
$this->assertEquals('FREQ=YEARLY', $cal->VEVENT->RRULE->getValue());
|
$this->assertEquals('FREQ=YEARLY', $cal->VEVENT->RRULE->getValue());
|
||||||
$this->assertEquals($expectedSummary, $cal->VEVENT->SUMMARY->getValue());
|
$this->assertEquals($expectedSummary, $cal->VEVENT->SUMMARY->getValue());
|
||||||
|
$this->assertEquals($expectedDTStart, $cal->VEVENT->DTSTART->getValue());
|
||||||
|
$this->assertEquals($expectedFieldType, $cal->VEVENT->{'X-NEXTCLOUD-BC-FIELD-TYPE'}->getValue());
|
||||||
|
$this->assertEquals($expectedUnknownYear, $cal->VEVENT->{'X-NEXTCLOUD-BC-UNKNOWN-YEAR'}->getValue());
|
||||||
|
|
||||||
|
if ($expectedOriginalYear) {
|
||||||
|
$this->assertEquals($expectedOriginalYear, $cal->VEVENT->{'X-NEXTCLOUD-BC-YEAR'}->getValue());
|
||||||
|
}
|
||||||
|
|
||||||
$this->assertEquals('TRANSPARENT', $cal->VEVENT->TRANSP->getValue());
|
$this->assertEquals('TRANSPARENT', $cal->VEVENT->TRANSP->getValue());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -151,7 +169,7 @@ class BirthdayServiceTest extends TestCase {
|
||||||
|
|
||||||
$service = $this->getMockBuilder(BirthdayService::class)
|
$service = $this->getMockBuilder(BirthdayService::class)
|
||||||
->setMethods(['buildDateFromContact', 'birthdayEvenChanged'])
|
->setMethods(['buildDateFromContact', 'birthdayEvenChanged'])
|
||||||
->setConstructorArgs([$this->calDav, $this->cardDav, $this->groupPrincipalBackend, $this->config])
|
->setConstructorArgs([$this->calDav, $this->cardDav, $this->groupPrincipalBackend, $this->config, $this->dbConnection])
|
||||||
->getMock();
|
->getMock();
|
||||||
|
|
||||||
$service->onCardChanged(666, 'gump.vcf', '');
|
$service->onCardChanged(666, 'gump.vcf', '');
|
||||||
|
@ -180,7 +198,7 @@ class BirthdayServiceTest extends TestCase {
|
||||||
/** @var BirthdayService | \PHPUnit_Framework_MockObject_MockObject $service */
|
/** @var BirthdayService | \PHPUnit_Framework_MockObject_MockObject $service */
|
||||||
$service = $this->getMockBuilder(BirthdayService::class)
|
$service = $this->getMockBuilder(BirthdayService::class)
|
||||||
->setMethods(['buildDateFromContact', 'birthdayEvenChanged'])
|
->setMethods(['buildDateFromContact', 'birthdayEvenChanged'])
|
||||||
->setConstructorArgs([$this->calDav, $this->cardDav, $this->groupPrincipalBackend, $this->config])
|
->setConstructorArgs([$this->calDav, $this->cardDav, $this->groupPrincipalBackend, $this->config, $this->dbConnection])
|
||||||
->getMock();
|
->getMock();
|
||||||
|
|
||||||
$service->onCardChanged(666, 'gump.vcf', '');
|
$service->onCardChanged(666, 'gump.vcf', '');
|
||||||
|
@ -216,7 +234,7 @@ class BirthdayServiceTest extends TestCase {
|
||||||
/** @var BirthdayService | \PHPUnit_Framework_MockObject_MockObject $service */
|
/** @var BirthdayService | \PHPUnit_Framework_MockObject_MockObject $service */
|
||||||
$service = $this->getMockBuilder(BirthdayService::class)
|
$service = $this->getMockBuilder(BirthdayService::class)
|
||||||
->setMethods(['buildDateFromContact', 'birthdayEvenChanged'])
|
->setMethods(['buildDateFromContact', 'birthdayEvenChanged'])
|
||||||
->setConstructorArgs([$this->calDav, $this->cardDav, $this->groupPrincipalBackend, $this->config])
|
->setConstructorArgs([$this->calDav, $this->cardDav, $this->groupPrincipalBackend, $this->config, $this->dbConnection])
|
||||||
->getMock();
|
->getMock();
|
||||||
|
|
||||||
if ($expectedOp === 'delete') {
|
if ($expectedOp === 'delete') {
|
||||||
|
@ -311,6 +329,32 @@ class BirthdayServiceTest extends TestCase {
|
||||||
$this->service->ensureCalendarExists('principal001');
|
$this->service->ensureCalendarExists('principal001');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testResetForUser() {
|
||||||
|
$this->calDav->expects($this->at(0))
|
||||||
|
->method('getCalendarByUri')
|
||||||
|
->with('principals/users/user123', 'contact_birthdays')
|
||||||
|
->willReturn(['id' => 42]);
|
||||||
|
|
||||||
|
$this->calDav->expects($this->at(1))
|
||||||
|
->method('getCalendarObjects')
|
||||||
|
->with(42, 0)
|
||||||
|
->willReturn([['uri' => '1.ics'], ['uri' => '2.ics'], ['uri' => '3.ics']]);
|
||||||
|
|
||||||
|
$this->calDav->expects($this->at(2))
|
||||||
|
->method('deleteCalendarObject')
|
||||||
|
->with(42, '1.ics', 0);
|
||||||
|
|
||||||
|
$this->calDav->expects($this->at(3))
|
||||||
|
->method('deleteCalendarObject')
|
||||||
|
->with(42, '2.ics', 0);
|
||||||
|
|
||||||
|
$this->calDav->expects($this->at(4))
|
||||||
|
->method('deleteCalendarObject')
|
||||||
|
->with(42, '3.ics', 0);
|
||||||
|
|
||||||
|
$this->service->resetForUser('user123');
|
||||||
|
}
|
||||||
|
|
||||||
public function providesBirthday() {
|
public function providesBirthday() {
|
||||||
return [
|
return [
|
||||||
[true,
|
[true,
|
||||||
|
@ -338,19 +382,27 @@ class BirthdayServiceTest extends TestCase {
|
||||||
|
|
||||||
public function providesVCards() {
|
public function providesVCards() {
|
||||||
return [
|
return [
|
||||||
[null, null],
|
// $expectedSummary, $expectedDTStart, $expectedFieldType, $expectedUnknownYear, $expectedOriginalYear, $data, $supports4Byte
|
||||||
[null, ''],
|
[null, null, null, null, null, null, true],
|
||||||
[null, 'yasfewf'],
|
[null, null, null, null, null, '', true],
|
||||||
[null, "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nEND:VCARD\r\n", "Dr. Foo Bar"],
|
[null, null, null, null, null, 'yasfewf', true],
|
||||||
[null, "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nBDAY:\r\nEND:VCARD\r\n", "Dr. Foo Bar"],
|
[null, null, null, null, null, "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nEND:VCARD\r\n", true],
|
||||||
[null, "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nBDAY:someday\r\nEND:VCARD\r\n", "Dr. Foo Bar"],
|
[null, null, null, null, null, "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nBDAY:\r\nEND:VCARD\r\n", true],
|
||||||
['12345 (*1900)', "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nBDAY:19000101\r\nEND:VCARD\r\n", "Dr. Foo Bar"],
|
[null, null, null, null, null, "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nBDAY:someday\r\nEND:VCARD\r\n", true],
|
||||||
['12345 (*1900)', "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nBDAY:19001231\r\nEND:VCARD\r\n", "Dr. Foo Bar"],
|
['🎂 12345 (1900)', '19700101', 'BDAY', '0', '1900', "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nBDAY:19000101\r\nEND:VCARD\r\n", true],
|
||||||
['12345 *', "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nBDAY:--1231\r\nEND:VCARD\r\n", "Dr. Foo Bar"],
|
['🎂 12345 (1900)', '19701231', 'BDAY', '0', '1900', "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nBDAY:19001231\r\nEND:VCARD\r\n", true],
|
||||||
['12345 *', "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nBDAY;X-APPLE-OMIT-YEAR=1604:16041231\r\nEND:VCARD\r\n", "Dr. Foo Bar"],
|
['🎂 12345', '19701231', 'BDAY', '1', null, "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nBDAY:--1231\r\nEND:VCARD\r\n", true],
|
||||||
[null, "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nBDAY:;VALUE=text:circa 1800\r\nEND:VCARD\r\n", "Dr. Foo Bar"],
|
['🎂 12345', '19701231', 'BDAY', '1', null, "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nBDAY;X-APPLE-OMIT-YEAR=1604:16041231\r\nEND:VCARD\r\n", true],
|
||||||
[null, "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nN:12345;;;;\r\nBDAY:20031231\r\nEND:VCARD\r\n", "Dr. Foo Bar"],
|
[null, null, null, null, null, "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nBDAY:;VALUE=text:circa 1800\r\nEND:VCARD\r\n", true],
|
||||||
['12345 (*900)', "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nBDAY:09001231\r\nEND:VCARD\r\n", "Dr. Foo Bar"],
|
[null, null, null, null, null, "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nN:12345;;;;\r\nBDAY:20031231\r\nEND:VCARD\r\n", true],
|
||||||
|
['🎂 12345 (900)', '19701231', 'BDAY', '0', '900', "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nBDAY:09001231\r\nEND:VCARD\r\n", true],
|
||||||
|
['12345 (*1900)', '19700101', 'BDAY', '0', '1900', "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nBDAY:19000101\r\nEND:VCARD\r\n", false],
|
||||||
|
['12345 (*1900)', '19701231', 'BDAY', '0', '1900', "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nBDAY:19001231\r\nEND:VCARD\r\n", false],
|
||||||
|
['12345 *', '19701231', 'BDAY', '1', null, "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nBDAY:--1231\r\nEND:VCARD\r\n", false],
|
||||||
|
['12345 *', '19701231', 'BDAY', '1', null, "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nBDAY;X-APPLE-OMIT-YEAR=1604:16041231\r\nEND:VCARD\r\n", false],
|
||||||
|
[null, null, null, null, null, "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nBDAY:;VALUE=text:circa 1800\r\nEND:VCARD\r\n", false],
|
||||||
|
[null, null, null, null, null, "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nN:12345;;;;\r\nBDAY:20031231\r\nEND:VCARD\r\n", false],
|
||||||
|
['12345 (*900)', '19701231', 'BDAY', '0', '900', "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nBDAY:09001231\r\nEND:VCARD\r\n", false],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,137 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @copyright Copyright (c) 2018, Georg Ehrke
|
||||||
|
*
|
||||||
|
* @author Georg Ehrke <oc.list@georgehrke.com>
|
||||||
|
*
|
||||||
|
* @license AGPL-3.0
|
||||||
|
*
|
||||||
|
* This code is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3,
|
||||||
|
* as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License, version 3,
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace OCA\DAV\Tests\unit\DAV\Migration;
|
||||||
|
|
||||||
|
use OCA\DAV\BackgroundJob\GenerateBirthdayCalendarBackgroundJob;
|
||||||
|
use OCA\DAV\Migration\RefreshWebcalJobRegistrar;
|
||||||
|
use OCA\DAV\Migration\RegenerateBirthdayCalendars;
|
||||||
|
use OCP\BackgroundJob\IJobList;
|
||||||
|
use OCP\IConfig;
|
||||||
|
use OCP\IUser;
|
||||||
|
use OCP\IUserManager;
|
||||||
|
use OCP\Migration\IOutput;
|
||||||
|
use Test\TestCase;
|
||||||
|
|
||||||
|
class RegenerateBirthdayCalendarsTest extends TestCase {
|
||||||
|
|
||||||
|
/** @var IUserManager | \PHPUnit_Framework_MockObject_MockObject */
|
||||||
|
private $userManager;
|
||||||
|
|
||||||
|
/** @var IJobList | \PHPUnit_Framework_MockObject_MockObject */
|
||||||
|
private $jobList;
|
||||||
|
|
||||||
|
/** @var IConfig | \PHPUnit_Framework_MockObject_MockObject */
|
||||||
|
private $config;
|
||||||
|
|
||||||
|
/** @var RefreshWebcalJobRegistrar */
|
||||||
|
private $migration;
|
||||||
|
|
||||||
|
protected function setUp() {
|
||||||
|
parent::setUp();
|
||||||
|
|
||||||
|
$this->userManager = $this->createMock(IUserManager::class);
|
||||||
|
$this->jobList = $this->createMock(IJobList::class);
|
||||||
|
$this->config = $this->createMock(IConfig::class);
|
||||||
|
|
||||||
|
$this->migration = new RegenerateBirthdayCalendars($this->userManager,
|
||||||
|
$this->jobList, $this->config);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGetName() {
|
||||||
|
$this->assertEquals(
|
||||||
|
'Regenerating birthday calendars to use new icons and fix old birthday events without year',
|
||||||
|
$this->migration->getName()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testRun() {
|
||||||
|
$this->config->expects($this->at(0))
|
||||||
|
->method('getAppValue')
|
||||||
|
->with('dav', 'regeneratedBirthdayCalendarsForYearFix')
|
||||||
|
->willReturn(null);
|
||||||
|
|
||||||
|
$output = $this->createMock(IOutput::class);
|
||||||
|
$output->expects($this->once())
|
||||||
|
->method('info')
|
||||||
|
->with('Adding background jobs to regenerate birthday calendar');
|
||||||
|
|
||||||
|
$this->userManager->expects($this->once())
|
||||||
|
->method('callForAllUsers')
|
||||||
|
->will($this->returnCallback(function($closure) {
|
||||||
|
$user1 = $this->createMock(IUser::class);
|
||||||
|
$user1->method('getUID')->will($this->returnValue('uid1'));
|
||||||
|
$user2 = $this->createMock(IUser::class);
|
||||||
|
$user2->method('getUID')->will($this->returnValue('uid2'));
|
||||||
|
$user3 = $this->createMock(IUser::class);
|
||||||
|
$user3->method('getUID')->will($this->returnValue('uid3'));
|
||||||
|
|
||||||
|
$closure($user1);
|
||||||
|
$closure($user2);
|
||||||
|
$closure($user3);
|
||||||
|
}));
|
||||||
|
|
||||||
|
$this->jobList->expects($this->at(0))
|
||||||
|
->method('add')
|
||||||
|
->with(GenerateBirthdayCalendarBackgroundJob::class, [
|
||||||
|
'userId' => 'uid1',
|
||||||
|
'purgeBeforeGenerating' => true
|
||||||
|
]);
|
||||||
|
$this->jobList->expects($this->at(1))
|
||||||
|
->method('add')
|
||||||
|
->with(GenerateBirthdayCalendarBackgroundJob::class, [
|
||||||
|
'userId' => 'uid2',
|
||||||
|
'purgeBeforeGenerating' => true
|
||||||
|
]);
|
||||||
|
$this->jobList->expects($this->at(2))
|
||||||
|
->method('add')
|
||||||
|
->with(GenerateBirthdayCalendarBackgroundJob::class, [
|
||||||
|
'userId' => 'uid3',
|
||||||
|
'purgeBeforeGenerating' => true
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->config->expects($this->at(1))
|
||||||
|
->method('setAppValue')
|
||||||
|
->with('dav', 'regeneratedBirthdayCalendarsForYearFix', 'yes');
|
||||||
|
|
||||||
|
$this->migration->run($output);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testRunSecondTime() {
|
||||||
|
$this->config->expects($this->once())
|
||||||
|
->method('getAppValue')
|
||||||
|
->with('dav', 'regeneratedBirthdayCalendarsForYearFix')
|
||||||
|
->willReturn('yes');
|
||||||
|
|
||||||
|
$output = $this->createMock(IOutput::class);
|
||||||
|
$output->expects($this->once())
|
||||||
|
->method('info')
|
||||||
|
->with('Repair step already executed');
|
||||||
|
|
||||||
|
$this->userManager->expects($this->never())
|
||||||
|
->method('callForAllUsers');
|
||||||
|
|
||||||
|
$this->migration->run($output);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue