* Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Test\Command; use Composer\Command\RunScriptCommand; use Composer\Composer; use Composer\Config; use Composer\Console\Application; use Composer\Script\Event as ScriptEvent; use Composer\Test\TestCase; use Composer\Util\Filesystem; use Symfony\Component\Console\Tester\ApplicationTester; class RunScriptCommandTest extends TestCase { /** * @var string */ private $home; public function setUp(): void { $this->home = $this->getUniqueTmpDirectory(); } protected function tearDown(): void { parent::tearDown(); $fs = new Filesystem(); $fs->removeDirectory($this->home); } /** * @dataProvider getDevOptions * @param bool $dev * @param bool $noDev */ public function testDetectAndPassDevModeToEventAndToDispatching(bool $dev, bool $noDev): void { $scriptName = 'testScript'; $input = $this->getMockBuilder('Symfony\Component\Console\Input\InputInterface')->getMock(); $input ->method('getOption') ->will($this->returnValueMap(array( array('list', false), array('dev', $dev), array('no-dev', $noDev), ))); $input ->method('getArgument') ->will($this->returnValueMap(array( array('script', $scriptName), array('args', array()), ))); $input ->method('hasArgument') ->with('command') ->willReturn(false); $input ->method('isInteractive') ->willReturn(false); $output = $this->getMockBuilder('Symfony\Component\Console\Output\OutputInterface')->getMock(); $expectedDevMode = $dev || !$noDev; $ed = $this->getMockBuilder('Composer\EventDispatcher\EventDispatcher') ->disableOriginalConstructor() ->getMock(); $ed->expects($this->once()) ->method('hasEventListeners') ->with($this->callback(function (ScriptEvent $event) use ($scriptName, $expectedDevMode): bool { return $event->getName() === $scriptName && $event->isDevMode() === $expectedDevMode; })) ->willReturn(true); $ed->expects($this->once()) ->method('dispatchScript') ->with($scriptName, $expectedDevMode, array()) ->willReturn(0); $composer = $this->createComposerInstance(); $composer->setEventDispatcher($ed); $command = $this->getMockBuilder('Composer\Command\RunScriptCommand') ->onlyMethods(array( 'mergeApplicationDefinition', 'getSynopsis', 'initialize', 'requireComposer', )) ->getMock(); $command->expects($this->any())->method('requireComposer')->willReturn($composer); $command->run($input, $output); } public function testCanListScripts(): void { $manifest = [ 'scripts' => [ 'test' => '@php test', 'fix-cs' => 'php-cs-fixer fix', ], 'scripts-descriptions' => [ 'fix-cs' => 'Run the codestyle fixer', ], ]; file_put_contents($this->home.'/composer.json', json_encode($manifest)); $application = new Application(); $application->setAutoExit(false); $application->add(new RunScriptCommand()); $tester = new ApplicationTester($application); $tester->run(['command' => 'run-script', '--list' => true, '-d' => $this->home]); $tester->assertCommandIsSuccessful(); $output = $tester->getDisplay(); $this->assertStringContainsString('Runs the test script as defined in composer.json.', $output, 'The default description for the test script should be printed'); $this->assertStringContainsString('Run the codestyle fixer', $output, 'The custom description for the fix-cs script should be printed'); } /** @return bool[][] **/ public function getDevOptions(): array { return array( array(true, true), array(true, false), array(false, true), array(false, false), ); } /** @return Composer **/ private function createComposerInstance(): Composer { $composer = new Composer; $config = new Config; $composer->setConfig($config); return $composer; } }