From c7ba38a7c2d850a71a92830c782f7623711ebb41 Mon Sep 17 00:00:00 2001 From: Robin Chalas Date: Wed, 4 May 2016 23:40:49 +0200 Subject: [PATCH] [Console] Set user inputs from CommandTester Rename getInputStream() to getStream(), taking inputs as argument Make createStream static, typehint as array --- .../Console/Tester/CommandTester.php | 31 ++++++++ .../Tests/Tester/CommandTesterTest.php | 78 +++++++++++++++++++ 2 files changed, 109 insertions(+) diff --git a/src/Symfony/Component/Console/Tester/CommandTester.php b/src/Symfony/Component/Console/Tester/CommandTester.php index 8d6486e11c..b94cf3f9dc 100644 --- a/src/Symfony/Component/Console/Tester/CommandTester.php +++ b/src/Symfony/Component/Console/Tester/CommandTester.php @@ -21,12 +21,14 @@ use Symfony\Component\Console\Output\OutputInterface; * Eases the testing of console commands. * * @author Fabien Potencier + * @author Robin Chalas */ class CommandTester { private $command; private $input; private $output; + private $inputs = array(); private $statusCode; /** @@ -65,6 +67,10 @@ class CommandTester } $this->input = new ArrayInput($input); + if ($this->inputs) { + $this->input->setStream(self::createStream($this->inputs)); + } + if (isset($options['interactive'])) { $this->input->setInteractive($options['interactive']); } @@ -129,4 +135,29 @@ class CommandTester { return $this->statusCode; } + + /** + * Sets the user inputs. + * + * @param array An array of strings representing each input + * passed to the command input stream. + * + * @return CommandTester + */ + public function setInputs(array $inputs) + { + $this->inputs = $inputs; + + return $this; + } + + private static function createStream(array $inputs) + { + $stream = fopen('php://memory', 'r+', false); + + fputs($stream, implode(PHP_EOL, $inputs)); + rewind($stream); + + return $stream; + } } diff --git a/src/Symfony/Component/Console/Tests/Tester/CommandTesterTest.php b/src/Symfony/Component/Console/Tests/Tester/CommandTesterTest.php index b54c00e83d..c605729b86 100644 --- a/src/Symfony/Component/Console/Tests/Tester/CommandTesterTest.php +++ b/src/Symfony/Component/Console/Tests/Tester/CommandTesterTest.php @@ -15,6 +15,10 @@ use Symfony\Component\Console\Application; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Output\Output; use Symfony\Component\Console\Tester\CommandTester; +use Symfony\Component\Console\Question\Question; +use Symfony\Component\Console\Helper\HelperSet; +use Symfony\Component\Console\Helper\QuestionHelper; +use Symfony\Component\Console\Style\SymfonyStyle; class CommandTesterTest extends \PHPUnit_Framework_TestCase { @@ -81,4 +85,78 @@ class CommandTesterTest extends \PHPUnit_Framework_TestCase // check that there is no need to pass the command name here $this->assertEquals(0, $tester->execute(array())); } + + public function testCommandWithInputs() + { + $questions = array( + 'What\'s your name?', + 'How are you?', + 'Where do you come from?', + ); + + $command = new Command('foo'); + $command->setHelperSet(new HelperSet(array(new QuestionHelper()))); + $command->setCode(function ($input, $output) use ($questions, $command) { + $helper = $command->getHelper('question'); + $helper->ask($input, $output, new Question($questions[0])); + $helper->ask($input, $output, new Question($questions[1])); + $helper->ask($input, $output, new Question($questions[2])); + }); + + $tester = new CommandTester($command); + $tester->setInputs(array('Bobby', 'Fine', 'France')); + $tester->execute(array()); + + $this->assertEquals(0, $tester->getStatusCode()); + $this->assertEquals(implode('', $questions), $tester->getDisplay(true)); + } + + /** + * @expectedException \RuntimeException + * @expectedMessage Aborted + */ + public function testCommandWithWrongInputsNumber() + { + $questions = array( + 'What\'s your name?', + 'How are you?', + 'Where do you come from?', + ); + + $command = new Command('foo'); + $command->setHelperSet(new HelperSet(array(new QuestionHelper()))); + $command->setCode(function ($input, $output) use ($questions, $command) { + $helper = $command->getHelper('question'); + $helper->ask($input, $output, new Question($questions[0])); + $helper->ask($input, $output, new Question($questions[1])); + $helper->ask($input, $output, new Question($questions[2])); + }); + + $tester = new CommandTester($command); + $tester->setInputs(array('Bobby', 'Fine')); + $tester->execute(array()); + } + + public function testSymfonyStyleCommandWithInputs() + { + $questions = array( + 'What\'s your name?', + 'How are you?', + 'Where do you come from?', + ); + + $command = new Command('foo'); + $command->setCode(function ($input, $output) use ($questions, $command) { + $io = new SymfonyStyle($input, $output); + $io->ask($questions[0]); + $io->ask($questions[1]); + $io->ask($questions[2]); + }); + + $tester = new CommandTester($command); + $tester->setInputs(array('Bobby', 'Fine', 'France')); + $tester->execute(array()); + + $this->assertEquals(0, $tester->getStatusCode()); + } }