Updated ListTagsCommand so that it displays extended information

This commit is contained in:
Alejandro Celaya 2020-05-08 12:39:02 +02:00
parent fbb1c449da
commit c336bb1901
3 changed files with 32 additions and 14 deletions

View file

@ -6,7 +6,7 @@ namespace Shlinkio\Shlink\CLI\Command\Tag;
use Shlinkio\Shlink\CLI\Util\ExitCodes; use Shlinkio\Shlink\CLI\Util\ExitCodes;
use Shlinkio\Shlink\CLI\Util\ShlinkTable; use Shlinkio\Shlink\CLI\Util\ShlinkTable;
use Shlinkio\Shlink\Core\Entity\Tag; use Shlinkio\Shlink\Core\Tag\Model\TagInfo;
use Shlinkio\Shlink\Core\Tag\TagServiceInterface; use Shlinkio\Shlink\Core\Tag\TagServiceInterface;
use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputInterface;
@ -35,17 +35,20 @@ class ListTagsCommand extends Command
protected function execute(InputInterface $input, OutputInterface $output): ?int protected function execute(InputInterface $input, OutputInterface $output): ?int
{ {
ShlinkTable::fromOutput($output)->render(['Name'], $this->getTagsRows()); ShlinkTable::fromOutput($output)->render(['Name', 'URLs amount', 'Visits amount'], $this->getTagsRows());
return ExitCodes::EXIT_SUCCESS; return ExitCodes::EXIT_SUCCESS;
} }
private function getTagsRows(): array private function getTagsRows(): array
{ {
$tags = $this->tagService->listTags(); $tags = $this->tagService->tagsInfo();
if (empty($tags)) { if (empty($tags)) {
return [['No tags yet']]; return [['No tags found', '-', '-']];
} }
return map($tags, fn (Tag $tag) => [(string) $tag]); return map(
$tags,
fn (TagInfo $tagInfo) => [(string) $tagInfo->tag(), $tagInfo->shortUrlsCount(), $tagInfo->visitsCount()],
);
} }
} }

View file

@ -8,6 +8,7 @@ use PHPUnit\Framework\TestCase;
use Prophecy\Prophecy\ObjectProphecy; use Prophecy\Prophecy\ObjectProphecy;
use Shlinkio\Shlink\CLI\Command\Tag\ListTagsCommand; use Shlinkio\Shlink\CLI\Command\Tag\ListTagsCommand;
use Shlinkio\Shlink\Core\Entity\Tag; use Shlinkio\Shlink\Core\Entity\Tag;
use Shlinkio\Shlink\Core\Tag\Model\TagInfo;
use Shlinkio\Shlink\Core\Tag\TagServiceInterface; use Shlinkio\Shlink\Core\Tag\TagServiceInterface;
use Symfony\Component\Console\Application; use Symfony\Component\Console\Application;
use Symfony\Component\Console\Tester\CommandTester; use Symfony\Component\Console\Tester\CommandTester;
@ -31,28 +32,32 @@ class ListTagsCommandTest extends TestCase
/** @test */ /** @test */
public function noTagsPrintsEmptyMessage(): void public function noTagsPrintsEmptyMessage(): void
{ {
$listTags = $this->tagService->listTags()->willReturn([]); $tagsInfo = $this->tagService->tagsInfo()->willReturn([]);
$this->commandTester->execute([]); $this->commandTester->execute([]);
$output = $this->commandTester->getDisplay(); $output = $this->commandTester->getDisplay();
$this->assertStringContainsString('No tags yet', $output); $this->assertStringContainsString('No tags found', $output);
$listTags->shouldHaveBeenCalled(); $tagsInfo->shouldHaveBeenCalled();
} }
/** @test */ /** @test */
public function listOfTagsIsPrinted(): void public function listOfTagsIsPrinted(): void
{ {
$listTags = $this->tagService->listTags()->willReturn([ $tagsInfo = $this->tagService->tagsInfo()->willReturn([
new Tag('foo'), new TagInfo(new Tag('foo'), 10, 2),
new Tag('bar'), new TagInfo(new Tag('bar'), 7, 32),
]); ]);
$this->commandTester->execute([]); $this->commandTester->execute([]);
$output = $this->commandTester->getDisplay(); $output = $this->commandTester->getDisplay();
$this->assertStringContainsString('foo', $output); $this->assertStringContainsString('| foo', $output);
$this->assertStringContainsString('bar', $output); $this->assertStringContainsString('| bar', $output);
$listTags->shouldHaveBeenCalled(); $this->assertStringContainsString('| 10 ', $output);
$this->assertStringContainsString('| 2 ', $output);
$this->assertStringContainsString('| 7 ', $output);
$this->assertStringContainsString('| 32 ', $output);
$tagsInfo->shouldHaveBeenCalled();
} }
} }

View file

@ -25,6 +25,16 @@ final class TagInfo implements JsonSerializable
return $this->tag; return $this->tag;
} }
public function shortUrlsCount(): int
{
return $this->shortUrlsCount;
}
public function visitsCount(): int
{
return $this->visitsCount;
}
public function jsonSerialize(): array public function jsonSerialize(): array
{ {
return [ return [