From a6c547c4dace2295706cabaa1a091ab090b5c3b2 Mon Sep 17 00:00:00 2001 From: Alejandro Celaya Date: Sun, 31 Dec 2017 18:37:39 +0100 Subject: [PATCH] Improved and simplified ListShortcodesCommand with SymfonyStyle --- .../Shortcode/ListShortcodesCommand.php | 33 ++++++--------- .../Shortcode/ListShortcodesCommandTest.php | 41 ++++--------------- 2 files changed, 21 insertions(+), 53 deletions(-) diff --git a/module/CLI/src/Command/Shortcode/ListShortcodesCommand.php b/module/CLI/src/Command/Shortcode/ListShortcodesCommand.php index 31ba923e..1e8ce12c 100644 --- a/module/CLI/src/Command/Shortcode/ListShortcodesCommand.php +++ b/module/CLI/src/Command/Shortcode/ListShortcodesCommand.php @@ -7,12 +7,10 @@ use Shlinkio\Shlink\Common\Paginator\Adapter\PaginableRepositoryAdapter; use Shlinkio\Shlink\Common\Paginator\Util\PaginatorUtilsTrait; use Shlinkio\Shlink\Core\Service\ShortUrlServiceInterface; use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Helper\QuestionHelper; -use Symfony\Component\Console\Helper\Table; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Question\ConfirmationQuestion; +use Symfony\Component\Console\Style\SymfonyStyle; use Zend\I18n\Translator\TranslatorInterface; class ListShortcodesCommand extends Command @@ -34,7 +32,7 @@ class ListShortcodesCommand extends Command { $this->shortUrlService = $shortUrlService; $this->translator = $translator; - parent::__construct(null); + parent::__construct(); } public function configure() @@ -83,19 +81,16 @@ class ListShortcodesCommand extends Command public function execute(InputInterface $input, OutputInterface $output) { + $io = new SymfonyStyle($input, $output); $page = (int) $input->getOption('page'); $searchTerm = $input->getOption('searchTerm'); $tags = $input->getOption('tags'); - $tags = ! empty($tags) ? explode(',', $tags) : []; + $tags = ! empty($tags) ? \explode(',', $tags) : []; $showTags = $input->getOption('showTags'); - /** @var QuestionHelper $helper */ - $helper = $this->getHelper('question'); - do { $result = $this->shortUrlService->listShortUrls($page, $searchTerm, $tags, $this->processOrderBy($input)); $page++; - $table = new Table($output); $headers = [ $this->translator->translate('Short code'), @@ -106,8 +101,8 @@ class ListShortcodesCommand extends Command if ($showTags) { $headers[] = $this->translator->translate('Tags'); } - $table->setHeaders($headers); + $rows = []; foreach ($result as $row) { $shortUrl = $row->jsonSerialize(); if ($showTags) { @@ -120,27 +115,23 @@ class ListShortcodesCommand extends Command unset($shortUrl['tags']); } - $table->addRow(array_values($shortUrl)); + $rows[] = \array_values($shortUrl); } - $table->render(); + $io->table($headers, $rows); if ($this->isLastPage($result)) { $continue = false; - $output->writeln( - sprintf('%s', $this->translator->translate('You have reached last page')) - ); + $io->success($this->translator->translate('Short codes properly listed')); } else { - $continue = $helper->ask($input, $output, new ConfirmationQuestion( - sprintf('' . $this->translator->translate( - 'Continue with page' - ) . ' %s? (y/N) ', $page), + $continue = $io->confirm( + \sprintf($this->translator->translate('Continue with page') . ' %s?', $page), false - )); + ); } } while ($continue); } - protected function processOrderBy(InputInterface $input) + private function processOrderBy(InputInterface $input) { $orderBy = $input->getOption('orderBy'); if (empty($orderBy)) { diff --git a/module/CLI/test/Command/Shortcode/ListShortcodesCommandTest.php b/module/CLI/test/Command/Shortcode/ListShortcodesCommandTest.php index a18cf217..8aede93a 100644 --- a/module/CLI/test/Command/Shortcode/ListShortcodesCommandTest.php +++ b/module/CLI/test/Command/Shortcode/ListShortcodesCommandTest.php @@ -10,7 +10,6 @@ use Shlinkio\Shlink\CLI\Command\Shortcode\ListShortcodesCommand; use Shlinkio\Shlink\Core\Entity\ShortUrl; use Shlinkio\Shlink\Core\Service\ShortUrlServiceInterface; use Symfony\Component\Console\Application; -use Symfony\Component\Console\Helper\QuestionHelper; use Symfony\Component\Console\Tester\CommandTester; use Zend\I18n\Translator\Translator; use Zend\Paginator\Adapter\ArrayAdapter; @@ -22,10 +21,6 @@ class ListShortcodesCommandTest extends TestCase * @var CommandTester */ protected $commandTester; - /** - * @var QuestionHelper - */ - protected $questionHelper; /** * @var ObjectProphecy */ @@ -37,8 +32,6 @@ class ListShortcodesCommandTest extends TestCase $app = new Application(); $command = new ListShortcodesCommand($this->shortUrlService->reveal(), Translator::factory([])); $app->add($command); - - $this->questionHelper = $command->getHelper('question'); $this->commandTester = new CommandTester($command); } @@ -47,10 +40,10 @@ class ListShortcodesCommandTest extends TestCase */ public function noInputCallsListJustOnce() { - $this->questionHelper->setInputStream($this->getInputStream('\n')); $this->shortUrlService->listShortUrls(1, null, [], null)->willReturn(new Paginator(new ArrayAdapter())) ->shouldBeCalledTimes(1); + $this->commandTester->setInputs(['n']); $this->commandTester->execute(['command' => 'shortcode:list']); } @@ -61,22 +54,15 @@ class ListShortcodesCommandTest extends TestCase { // The paginator will return more than one page for the first 3 times $data = []; - for ($i = 0; $i < 30; $i++) { + for ($i = 0; $i < 50; $i++) { $data[] = new ShortUrl(); } - $data = array_chunk($data, 11); - $questionHelper = $this->questionHelper; - $that = $this; - $this->shortUrlService->listShortUrls(Argument::cetera())->will(function () use ( - &$data, - $questionHelper, - $that - ) { - $questionHelper->setInputStream($that->getInputStream('y')); - return new Paginator(new ArrayAdapter(array_shift($data))); + $this->shortUrlService->listShortUrls(Argument::cetera())->will(function () use (&$data) { + return new Paginator(new ArrayAdapter($data)); })->shouldBeCalledTimes(3); + $this->commandTester->setInputs(['y', 'y', 'n']); $this->commandTester->execute(['command' => 'shortcode:list']); } @@ -91,10 +77,10 @@ class ListShortcodesCommandTest extends TestCase $data[] = new ShortUrl(); } - $this->questionHelper->setInputStream($this->getInputStream('n')); $this->shortUrlService->listShortUrls(Argument::cetera())->willReturn(new Paginator(new ArrayAdapter($data))) ->shouldBeCalledTimes(1); + $this->commandTester->setInputs(['n']); $this->commandTester->execute(['command' => 'shortcode:list']); } @@ -104,10 +90,10 @@ class ListShortcodesCommandTest extends TestCase public function passingPageWillMakeListStartOnThatPage() { $page = 5; - $this->questionHelper->setInputStream($this->getInputStream('\n')); $this->shortUrlService->listShortUrls($page, null, [], null)->willReturn(new Paginator(new ArrayAdapter())) ->shouldBeCalledTimes(1); + $this->commandTester->setInputs(['y']); $this->commandTester->execute([ 'command' => 'shortcode:list', '--page' => $page, @@ -119,24 +105,15 @@ class ListShortcodesCommandTest extends TestCase */ public function ifTagsFlagIsProvidedTagsColumnIsIncluded() { - $this->questionHelper->setInputStream($this->getInputStream('\n')); $this->shortUrlService->listShortUrls(1, null, [], null)->willReturn(new Paginator(new ArrayAdapter())) ->shouldBeCalledTimes(1); + $this->commandTester->setInputs(['y']); $this->commandTester->execute([ 'command' => 'shortcode:list', '--showTags' => true, ]); $output = $this->commandTester->getDisplay(); - $this->assertTrue(strpos($output, 'Tags') > 0); - } - - protected function getInputStream($inputData) - { - $stream = fopen('php://memory', 'r+', false); - fputs($stream, $inputData); - rewind($stream); - - return $stream; + $this->assertContains('Tags', $output); } }