diff --git a/apps/updatenotification/lib/Notification/BackgroundJob.php b/apps/updatenotification/lib/Notification/BackgroundJob.php index 3a89f3813e..e455a1642f 100644 --- a/apps/updatenotification/lib/Notification/BackgroundJob.php +++ b/apps/updatenotification/lib/Notification/BackgroundJob.php @@ -30,6 +30,7 @@ use OCP\Http\Client\IClientService; use OCP\IConfig; use OCP\IGroup; use OCP\IGroupManager; +use OCP\IURLGenerator; use OCP\IUser; use OCP\Notification\IManager; @@ -50,6 +51,9 @@ class BackgroundJob extends TimedJob { /** @var IClientService */ protected $client; + /** @var IURLGenerator */ + protected $urlGenerator; + /** @var IUser[] */ protected $users; @@ -61,8 +65,9 @@ class BackgroundJob extends TimedJob { * @param IGroupManager $groupManager * @param IAppManager $appManager * @param IClientService $client + * @param IURLGenerator $urlGenerator */ - public function __construct(IConfig $config, IManager $notificationManager, IGroupManager $groupManager, IAppManager $appManager, IClientService $client) { + public function __construct(IConfig $config, IManager $notificationManager, IGroupManager $groupManager, IAppManager $appManager, IClientService $client, IURLGenerator $urlGenerator) { // Run once a day $this->setInterval(60 * 60 * 24); @@ -71,6 +76,7 @@ class BackgroundJob extends TimedJob { $this->groupManager = $groupManager; $this->appManager = $appManager; $this->client = $client; + $this->urlGenerator = $urlGenerator; } protected function run($argument) { @@ -91,7 +97,8 @@ class BackgroundJob extends TimedJob { $status = $updater->check(); if (isset($status['version'])) { - $this->createNotifications('core', $status['version']); + $url = $this->urlGenerator->linkToRouteAbsolute('settings_admin') . '#updater'; + $this->createNotifications('core', $status['version'], $url); } } @@ -103,7 +110,8 @@ class BackgroundJob extends TimedJob { foreach ($apps as $app) { $update = $this->isUpdateAvailable($app); if ($update !== false) { - $this->createNotifications($app, $update); + $url = $this->urlGenerator->linkToRouteAbsolute('settings.AppSettings.viewApps') . '#app-' . $app; + $this->createNotifications($app, $update, $url); } } } @@ -113,8 +121,9 @@ class BackgroundJob extends TimedJob { * * @param string $app * @param string $version + * @param string $url */ - protected function createNotifications($app, $version) { + protected function createNotifications($app, $version, $url) { $lastNotification = $this->config->getAppValue('updatenotification', $app, false); if ($lastNotification === $version) { // We already notified about this update @@ -129,7 +138,8 @@ class BackgroundJob extends TimedJob { $notification->setApp('updatenotification') ->setDateTime(new \DateTime()) ->setObject($app, $version) - ->setSubject('update_available'); + ->setSubject('update_available') + ->setLink($url); foreach ($this->getUsersToNotify() as $uid) { $notification->setUser($uid); diff --git a/apps/updatenotification/tests/Notification/BackgroundJobTest.php b/apps/updatenotification/tests/Notification/BackgroundJobTest.php index 9b920ec4ce..d1076e10be 100644 --- a/apps/updatenotification/tests/Notification/BackgroundJobTest.php +++ b/apps/updatenotification/tests/Notification/BackgroundJobTest.php @@ -22,14 +22,12 @@ namespace OCA\UpdateNotification\Tests\Notification; -use OC\Installer; -use OC\Updater\VersionCheck; use OCA\UpdateNotification\Notification\BackgroundJob; use OCP\App\IAppManager; use OCP\Http\Client\IClientService; use OCP\IConfig; -use OCP\IGroup; use OCP\IGroupManager; +use OCP\IURLGenerator; use OCP\IUser; use OCP\Notification\IManager; use Test\TestCase; @@ -46,6 +44,8 @@ class BackgroundJobTest extends TestCase { protected $appManager; /** @var IClientService|\PHPUnit_Framework_MockObject_MockObject */ protected $client; + /** @var IURLGenerator|\PHPUnit_Framework_MockObject_MockObject */ + protected $urlGenerator; public function setUp() { parent::setUp(); @@ -55,6 +55,7 @@ class BackgroundJobTest extends TestCase { $this->groupManager = $this->getMock('OCP\IGroupManager'); $this->appManager = $this->getMock('OCP\App\IAppManager'); $this->client = $this->getMock('OCP\Http\Client\IClientService'); + $this->urlGenerator = $this->getMock('OCP\IURLGenerator'); } /** @@ -68,7 +69,8 @@ class BackgroundJobTest extends TestCase { $this->notificationManager, $this->groupManager, $this->appManager, - $this->client + $this->client, + $this->urlGenerator ); } { return $this->getMockBuilder('OCA\UpdateNotification\Notification\BackgroundJob') @@ -78,6 +80,7 @@ class BackgroundJobTest extends TestCase { $this->groupManager, $this->appManager, $this->client, + $this->urlGenerator, ]) ->setMethods($methods) ->getMock(); @@ -134,7 +137,7 @@ class BackgroundJobTest extends TestCase { $job->expects($this->once()) ->method('getChannel') ->willReturn($channel); - + if ($versionCheck === null) { $job->expects($this->never()) ->method('createVersionCheck'); @@ -152,12 +155,20 @@ class BackgroundJobTest extends TestCase { } if ($notification === null) { + $this->urlGenerator->expects($this->never()) + ->method('linkToRouteAbsolute'); + $job->expects($this->never()) ->method('createNotifications'); } else { + $this->urlGenerator->expects($this->once()) + ->method('linkToRouteAbsolute') + ->with('settings_admin') + ->willReturn('admin-url'); + $job->expects($this->once()) ->method('createNotifications') - ->willReturn('core', $notification); + ->willReturn('core', $notification, 'admin-url#updater'); } $this->invokePrivate($job, 'checkCoreUpdate'); @@ -172,7 +183,7 @@ class BackgroundJobTest extends TestCase { ['app2', '1.9.2'], ], [ - ['app2', '1.9.2'], + ['app2', '1.9.2', 'apps-url#app-app2'], ], ], ]; @@ -199,6 +210,11 @@ class BackgroundJobTest extends TestCase { ->method('isUpdateAvailable') ->willReturnMap($isUpdateAvailable); + $this->urlGenerator->expects($this->exactly(sizeof($notifications))) + ->method('linkToRouteAbsolute') + ->with('settings.AppSettings.viewApps') + ->willReturn('apps-url'); + $mockedMethod = $job->expects($this->exactly(sizeof($notifications))) ->method('createNotifications'); call_user_func_array([$mockedMethod, 'withConsecutive'], $notifications); @@ -208,9 +224,9 @@ class BackgroundJobTest extends TestCase { public function dataCreateNotifications() { return [ - ['app1', '1.0.0', '1.0.0', false, false, null, null], - ['app2', '1.0.1', '1.0.0', '1.0.0', true, ['user1'], [['user1']]], - ['app3', '1.0.1', false, false, true, ['user2', 'user3'], [['user2'], ['user3']]], + ['app1', '1.0.0', 'link1', '1.0.0', false, false, null, null], + ['app2', '1.0.1', 'link2', '1.0.0', '1.0.0', true, ['user1'], [['user1']]], + ['app3', '1.0.1', 'link3', false, false, true, ['user2', 'user3'], [['user2'], ['user3']]], ]; } @@ -219,13 +235,14 @@ class BackgroundJobTest extends TestCase { * * @param string $app * @param string $version + * @param string $url * @param string|false $lastNotification * @param string|false $callDelete * @param bool $createNotification * @param string[]|null $users * @param array|null $userNotifications */ - public function testCreateNotifications($app, $version, $lastNotification, $callDelete, $createNotification, $users, $userNotifications) { + public function testCreateNotifications($app, $version, $url, $lastNotification, $callDelete, $createNotification, $users, $userNotifications) { $job = $this->getJob([ 'deleteOutdatedNotifications', 'getUsersToNotify', @@ -277,6 +294,10 @@ class BackgroundJobTest extends TestCase { ->method('setSubject') ->with('update_available') ->willReturnSelf(); + $notification->expects($this->once()) + ->method('setLink') + ->with($url) + ->willReturnSelf(); if ($userNotifications !== null) { $mockedMethod = $notification->expects($this->exactly(sizeof($userNotifications))) @@ -297,7 +318,7 @@ class BackgroundJobTest extends TestCase { ->method('createNotification'); } - $this->invokePrivate($job, 'createNotifications', [$app, $version]); + $this->invokePrivate($job, 'createNotifications', [$app, $version, $url]); } public function dataGetUsersToNotify() {