summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Baucum <david@baucum.me>2021-06-01 23:51:34 -0400
committerBenjamin Brahmer <info@b-brahmer.de>2021-07-24 18:17:31 +0200
commit21203dbf6386e72ef780d0b5d4b81a7e25e94485 (patch)
treec50e5be017c3a6630b63e37c3292566839dea622
parent65c15dac38358d5c3a619379b57bd498c070ea6f (diff)
Update all feeds from command
Closes #1359 Signed-off-by: David Baucum <david@baucum.me>
-rw-r--r--CHANGELOG.md5
-rw-r--r--appinfo/info.xml1
-rw-r--r--lib/Command/Updater/UpdateUser.php70
-rw-r--r--tests/Unit/Command/UpdateUserTest.php140
4 files changed, 214 insertions, 2 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9c2be3b2e..ffe0e289d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,8 +6,9 @@ The format is almost based on [Keep a Changelog](https://keepachangelog.com/en/1
## [16.x.x]
### Changed
-- Added vue and ng-vue packages
-- Reimplemented relative time formatting as a filter
+- Added vue and ng-vue packages (#1421)
+- Reimplemented relative time formatting as a filter (#1450)
+- Added new `news:updater:update-user` command to update the feeds of a single user (#1360).
### Fixed
diff --git a/appinfo/info.xml b/appinfo/info.xml
index c871c782a..3c15cce88 100644
--- a/appinfo/info.xml
+++ b/appinfo/info.xml
@@ -62,6 +62,7 @@ Report a [feed issue](https://github.com/nextcloud/news/discussions/new)
<command>OCA\News\Command\ExploreGenerator</command>
<command>OCA\News\Command\ShowFeed</command>
<command>OCA\News\Command\Updater\UpdateFeed</command>
+ <command>OCA\News\Command\Updater\UpdateUser</command>
<command>OCA\News\Command\Updater\BeforeUpdate</command>
<command>OCA\News\Command\Updater\AfterUpdate</command>
<command>OCA\News\Command\Config\FolderList</command>
diff --git a/lib/Command/Updater/UpdateUser.php b/lib/Command/Updater/UpdateUser.php
new file mode 100644
index 000000000..050641972
--- /dev/null
+++ b/lib/Command/Updater/UpdateUser.php
@@ -0,0 +1,70 @@
+<?php
+/**
+ * Nextcloud - News
+ *
+ * This file is licensed under the Affero General Public License version 3 or
+ * later. See the COPYING file.
+ */
+
+namespace OCA\News\Command\Updater;
+
+use Exception;
+use OCA\News\Service\FeedServiceV2;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class UpdateUser extends Command
+{
+ /**
+ * @var FeedServiceV2 Feed service
+ */
+ private $feedService;
+
+ public function __construct(FeedServiceV2 $feedService)
+ {
+ parent::__construct();
+ $this->feedService = $feedService;
+ }
+
+ /**
+ * @return void
+ */
+ protected function configure()
+ {
+ $this->setName('news:updater:update-user')
+ ->addArgument(
+ 'user-id',
+ InputArgument::REQUIRED,
+ 'user id of a user, string'
+ )
+ ->setDescription('Console API for updating a single user\'s feed');
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output): int
+ {
+ $userId = $input->getArgument('user-id');
+ $feeds = $this->feedService->findAllForUser($userId);
+ $updateErrors = false;
+ foreach ($feeds as $feed) {
+ try {
+ $updated_feed = $this->feedService->fetch($feed);
+ if ($updated_feed->getUpdateErrorCount() !== 0) {
+ $output->writeln($updated_feed->getLastUpdateError());
+ $updateErrors = true;
+ }
+ } catch (Exception $e) {
+ $output->writeln(
+ '<error>Could not update feed with id ' . $feed->getId() .
+ '. ' . $e->getMessage() . '</error> '
+ );
+ return 1;
+ }
+ }
+ if ($updateErrors) {
+ return 255;
+ }
+ return 0;
+ }
+}
diff --git a/tests/Unit/Command/UpdateUserTest.php b/tests/Unit/Command/UpdateUserTest.php
new file mode 100644
index 000000000..5d5bd8400
--- /dev/null
+++ b/tests/Unit/Command/UpdateUserTest.php
@@ -0,0 +1,140 @@
+<?php
+/**
+ * Nextcloud - News
+ *
+ * This file is licensed under the Affero General Public License version 3 or
+ * later. See the COPYING file.
+ */
+
+namespace OCA\News\Tests\Unit\Command;
+
+use OCA\News\Command\Updater\UpdateUser;
+use OCA\News\Db\Feed;
+use OCA\News\Service\Exceptions\ServiceNotFoundException;
+use OCA\News\Service\FeedServiceV2;
+use PHPUnit\Framework\MockObject\MockObject;
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class UpdateUserTest extends TestCase
+{
+ /** @var MockObject|FeedServiceV2 */
+ protected $service;
+ /** @var MockObject|InputInterface */
+ protected $consoleInput;
+ /** @var MockObject|OutputInterface */
+ protected $consoleOutput;
+
+ /** @var UpdateUser */
+ protected $command;
+
+ protected function setUp(): void
+ {
+ $this->service = $this->getMockBuilder(FeedServiceV2::class)
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $this->consoleInput = $this->getMockBuilder(InputInterface::class)->getMock();
+ $this->consoleOutput = $this->getMockBuilder(OutputInterface::class)->getMock();
+
+ $this->command = new UpdateUser($this->service);
+ }
+
+ /**
+ * Test a valid call will work
+ */
+ public function testValid()
+ {
+ $this->consoleInput->expects($this->exactly(1))
+ ->method('getArgument')
+ ->will($this->returnValueMap([
+ ['user-id', 'admin'],
+ ]));
+
+ $feed = $this->createMock(Feed::class);
+
+ $feed->expects($this->exactly(1))
+ ->method('getUpdateErrorCount')
+ ->willReturn(0);
+ $feed->expects($this->exactly(0))
+ ->method('getLastUpdateError');
+
+ $this->service->expects($this->exactly(1))
+ ->method('findAllForUser')
+ ->with('admin')
+ ->willReturn([$feed]);
+
+ $this->service->expects($this->exactly(1))
+ ->method('fetch')
+ ->with($feed)
+ ->willReturn($feed);
+
+ $result = $this->command->run($this->consoleInput, $this->consoleOutput);
+ $this->assertSame(0, $result);
+ }
+
+ /**
+ * Test valid calls that fails on some updates
+ */
+ public function testValidFeedError()
+ {
+ $this->consoleInput->expects($this->exactly(1))
+ ->method('getArgument')
+ ->will($this->returnValueMap([
+ ['user-id', 'admin'],
+ ]));
+
+ $feed = $this->createMock(Feed::class);
+ $feed->expects($this->exactly(1))
+ ->method('getUpdateErrorCount')
+ ->willReturn(10);
+ $feed->expects($this->exactly(1))
+ ->method('getLastUpdateError')
+ ->willReturn('Problem');
+
+ $this->service->expects($this->exactly(1))
+ ->method('findAllForUser')
+ ->with('admin')
+ ->willReturn([$feed]);
+
+ $this->service->expects($this->exactly(1))
+ ->method('fetch')
+ ->with($feed)
+ ->willReturn($feed);
+
+ $this->consoleOutput->expects($this->exactly(1))
+ ->method('writeln')
+ ->with('Problem');
+
+ $result = $this->command->run($this->consoleInput, $this->consoleOutput);
+ $this->assertSame(255, $result);
+ }
+
+ /**
+ * Test valid calls that fails completely
+ */
+ public function testInValid()
+ {
+ $this->consoleInput->expects($this->exactly(1))
+ ->method('getArgument')
+ ->will($this->returnValueMap([
+ ['user-id', 'admin'],
+ ]));
+
+ $feed = $this->createMock(Feed::class);
+
+ $this->service->expects($this->exactly(1))
+ ->method('findAllForUser')
+ ->with('admin')
+ ->willReturn([$feed]);
+
+ $this->service->expects($this->exactly(1))
+ ->method('fetch')
+ ->with($feed)
+ ->will($this->throwException(new ServiceNotFoundException('')));
+
+ $result = $this->command->run($this->consoleInput, $this->consoleOutput);
+ $this->assertSame(1, $result);
+ }
+}