summaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorRoeland Jago Douma <rullzer@users.noreply.github.com>2021-01-14 11:37:38 +0100
committerGitHub <noreply@github.com>2021-01-14 11:37:38 +0100
commit6265383385b014752b4ad8a6df9f45e3eecda7f9 (patch)
tree6d6966d8741ffd45abd793de92ead3151ccb3199 /apps
parentf9ab7575e70aeb5a08cba8fca9661dd6e4704cc9 (diff)
parent536e157d744a60d2e66acb3ec79ecdc53ec3fb5a (diff)
downloadnextcloud-server-6265383385b014752b4ad8a6df9f45e3eecda7f9.tar.gz
nextcloud-server-6265383385b014752b4ad8a6df9f45e3eecda7f9.zip
Merge pull request #25114 from nextcloud/dismiss-reminder-notifications-from-passed-events
Dismiss reminder notifications from passed events
Diffstat (limited to 'apps')
-rw-r--r--apps/dav/lib/CalDAV/Reminder/Notifier.php7
-rw-r--r--apps/dav/tests/unit/CalDAV/Reminder/NotifierTest.php83
2 files changed, 83 insertions, 7 deletions
diff --git a/apps/dav/lib/CalDAV/Reminder/Notifier.php b/apps/dav/lib/CalDAV/Reminder/Notifier.php
index 7618222f42a..310f5e5b23d 100644
--- a/apps/dav/lib/CalDAV/Reminder/Notifier.php
+++ b/apps/dav/lib/CalDAV/Reminder/Notifier.php
@@ -36,6 +36,7 @@ use OCP\AppFramework\Utility\ITimeFactory;
use OCP\IL10N;
use OCP\IURLGenerator;
use OCP\L10N\IFactory;
+use OCP\Notification\AlreadyProcessedException;
use OCP\Notification\INotification;
use OCP\Notification\INotifier;
@@ -223,6 +224,12 @@ class Notifier implements INotifier {
private function generateDateString(array $parameters):string {
$startDateTime = DateTime::createFromFormat(\DateTime::ATOM, $parameters['start_atom']);
$endDateTime = DateTime::createFromFormat(\DateTime::ATOM, $parameters['end_atom']);
+
+ // If the event has already ended, dismiss the notification
+ if ($endDateTime < $this->timeFactory->getDateTime()) {
+ throw new AlreadyProcessedException();
+ }
+
$isAllDay = $parameters['all_day'];
$diff = $startDateTime->diff($endDateTime);
diff --git a/apps/dav/tests/unit/CalDAV/Reminder/NotifierTest.php b/apps/dav/tests/unit/CalDAV/Reminder/NotifierTest.php
index b4f5d7dea9e..43741f24b38 100644
--- a/apps/dav/tests/unit/CalDAV/Reminder/NotifierTest.php
+++ b/apps/dav/tests/unit/CalDAV/Reminder/NotifierTest.php
@@ -36,23 +36,25 @@ use OCP\AppFramework\Utility\ITimeFactory;
use OCP\IL10N;
use OCP\IURLGenerator;
use OCP\L10N\IFactory;
+use OCP\Notification\AlreadyProcessedException;
use OCP\Notification\INotification;
+use PHPUnit\Framework\MockObject\MockObject;
use Test\TestCase;
class NotifierTest extends TestCase {
/** @var Notifier */
protected $notifier;
- /** @var IFactory|\PHPUnit\Framework\MockObject\MockObject */
+ /** @var IFactory|MockObject */
protected $factory;
- /** @var IURLGenerator|\PHPUnit\Framework\MockObject\MockObject */
+ /** @var IURLGenerator|MockObject */
protected $urlGenerator;
- /** @var IL10N|\PHPUnit\Framework\MockObject\MockObject */
+ /** @var IL10N|MockObject */
protected $l10n;
- /** @var ITimeFactory|\PHPUnit\Framework\MockObject\MockObject */
+ /** @var ITimeFactory|MockObject */
protected $timeFactory;
protected function setUp(): void {
@@ -111,7 +113,7 @@ class NotifierTest extends TestCase {
$this->expectException(\InvalidArgumentException::class);
$this->expectExceptionMessage('Notification not from this app');
- /** @var INotification|\PHPUnit\Framework\MockObject\MockObject $notification */
+ /** @var INotification|MockObject $notification */
$notification = $this->createMock(INotification::class);
$notification->expects($this->once())
@@ -128,7 +130,7 @@ class NotifierTest extends TestCase {
$this->expectException(\InvalidArgumentException::class);
$this->expectExceptionMessage('Unknown subject');
- /** @var INotification|\PHPUnit\Framework\MockObject\MockObject $notification */
+ /** @var INotification|MockObject $notification */
$notification = $this->createMock(INotification::class);
$notification->expects($this->once())
@@ -165,6 +167,28 @@ class NotifierTest extends TestCase {
],
"Calendar: Personal\r\nDate: 2005-08-15T15:52:01+02:00, 2005-08-15T15:52:01+02:00 - 2005-08-15T17:52:01+02:00 (Europe/Berlin)\r\nWhere: NC Headquarters"
],
+ [
+ 'calendar_reminder',
+ [
+ 'title' => 'Title of this event',
+ 'start_atom' => '2005-08-15T13:00:00+02:00',
+ ],
+ 'Title of this event (1 hour ago)',
+ [
+ 'title' => 'Title of this event',
+ 'description' => null,
+ 'location' => 'NC Headquarters',
+ 'all_day' => false,
+ 'start_atom' => '2005-08-15T13:00:00+02:00',
+ 'start_is_floating' => false,
+ 'start_timezone' => 'Europe/Berlin',
+ 'end_atom' => '2005-08-15T15:00:00+02:00',
+ 'end_is_floating' => false,
+ 'end_timezone' => 'Europe/Berlin',
+ 'calendar_displayname' => 'Personal',
+ ],
+ "Calendar: Personal\r\nDate: 2005-08-15T13:00:00+02:00, 2005-08-15T13:00:00+02:00 - 2005-08-15T15:00:00+02:00 (Europe/Berlin)\r\nWhere: NC Headquarters"
+ ],
];
}
@@ -179,7 +203,7 @@ class NotifierTest extends TestCase {
* @throws \Exception
*/
public function testPrepare(string $subjectType, array $subjectParams, string $subject, array $messageParams, string $message): void {
- /** @var INotification|\PHPUnit\Framework\MockObject\MockObject $notification */
+ /** @var INotification|MockObject $notification */
$notification = $this->createMock(INotification::class);
$notification->expects($this->once())
@@ -222,4 +246,49 @@ class NotifierTest extends TestCase {
$this->assertEquals($notification, $return);
}
+
+ public function testPassedEvent(): void {
+ /** @var INotification|MockObject $notification */
+ $notification = $this->createMock(INotification::class);
+
+ $notification->expects($this->once())
+ ->method('getApp')
+ ->willReturn(Application::APP_ID);
+ $notification->expects($this->once())
+ ->method('getSubject')
+ ->willReturn('calendar_reminder');
+ $notification->expects($this->once())
+ ->method('getSubjectParameters')
+ ->willReturn([
+ 'title' => 'Title of this event',
+ 'start_atom' => '2005-08-15T08:00:00+02:00'
+ ]);
+
+ $notification->expects($this->once())
+ ->method('getMessageParameters')
+ ->willReturn([
+ 'title' => 'Title of this event',
+ 'description' => null,
+ 'location' => 'NC Headquarters',
+ 'all_day' => false,
+ 'start_atom' => '2005-08-15T08:00:00+02:00',
+ 'start_is_floating' => false,
+ 'start_timezone' => 'Europe/Berlin',
+ 'end_atom' => '2005-08-15T13:00:00+02:00',
+ 'end_is_floating' => false,
+ 'end_timezone' => 'Europe/Berlin',
+ 'calendar_displayname' => 'Personal',
+ ]);
+
+ $notification->expects($this->once())
+ ->method('setParsedSubject')
+ ->with('Title of this event (6 hours ago)')
+ ->willReturnSelf();
+
+ $this->expectException(AlreadyProcessedException::class);
+
+ $return = $this->notifier->prepare($notification, 'en');
+
+ $this->assertEquals($notification, $return);
+ }
}