2022-02-23 15:58:18 +00:00
< ? php declare ( strict_types = 1 );
2016-07-21 22:20:56 +00:00
/*
* This file is part of Composer .
*
* ( c ) Nils Adermann < naderman @ naderman . de >
* Jordi Boggiano < j . boggiano @ seld . be >
*
* 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\Composer ;
use Composer\Config ;
use Composer\Script\Event as ScriptEvent ;
2018-11-12 14:23:32 +00:00
use Composer\Test\TestCase ;
2016-07-21 22:20:56 +00:00
class RunScriptCommandTest extends TestCase
{
/**
* @ dataProvider getDevOptions
*/
2022-02-22 15:47:09 +00:00
public function testDetectAndPassDevModeToEventAndToDispatching ( bool $dev , bool $noDev ) : void
2016-07-21 22:20:56 +00:00
{
$scriptName = 'testScript' ;
2018-04-12 08:24:56 +00:00
$input = $this -> getMockBuilder ( 'Symfony\Component\Console\Input\InputInterface' ) -> getMock ();
2016-07-21 22:20:56 +00:00
$input
-> method ( 'getOption' )
2022-08-17 12:20:07 +00:00
-> will ( $this -> returnValueMap ([
[ 'list' , false ],
[ 'dev' , $dev ],
[ 'no-dev' , $noDev ],
]));
2016-07-21 22:20:56 +00:00
$input
-> method ( 'getArgument' )
2022-08-17 12:20:07 +00:00
-> will ( $this -> returnValueMap ([
[ 'script' , $scriptName ],
[ 'args' , []],
]));
2016-07-21 22:20:56 +00:00
$input
-> method ( 'hasArgument' )
-> with ( 'command' )
-> willReturn ( false );
2021-12-09 21:14:04 +00:00
$input
-> method ( 'isInteractive' )
-> willReturn ( false );
2016-07-21 22:20:56 +00:00
2018-04-12 08:24:56 +00:00
$output = $this -> getMockBuilder ( 'Symfony\Component\Console\Output\OutputInterface' ) -> getMock ();
2016-07-21 22:20:56 +00:00
$expectedDevMode = $dev || ! $noDev ;
$ed = $this -> getMockBuilder ( 'Composer\EventDispatcher\EventDispatcher' )
-> disableOriginalConstructor ()
-> getMock ();
$ed -> expects ( $this -> once ())
-> method ( 'hasEventListeners' )
2022-08-17 12:20:07 +00:00
-> with ( $this -> callback ( static function ( ScriptEvent $event ) use ( $scriptName , $expectedDevMode ) : bool {
2016-07-21 22:20:56 +00:00
return $event -> getName () === $scriptName
&& $event -> isDevMode () === $expectedDevMode ;
}))
-> willReturn ( true );
$ed -> expects ( $this -> once ())
-> method ( 'dispatchScript' )
2022-08-17 12:20:07 +00:00
-> with ( $scriptName , $expectedDevMode , [])
2020-02-07 22:21:48 +00:00
-> willReturn ( 0 );
2016-07-21 22:20:56 +00:00
$composer = $this -> createComposerInstance ();
$composer -> setEventDispatcher ( $ed );
$command = $this -> getMockBuilder ( 'Composer\Command\RunScriptCommand' )
2022-08-17 12:20:07 +00:00
-> onlyMethods ([
2016-07-21 22:20:56 +00:00
'mergeApplicationDefinition' ,
'getSynopsis' ,
'initialize' ,
2022-02-16 12:24:57 +00:00
'requireComposer' ,
2022-08-17 12:20:07 +00:00
])
2016-07-21 22:20:56 +00:00
-> getMock ();
2022-02-16 12:24:57 +00:00
$command -> expects ( $this -> any ()) -> method ( 'requireComposer' ) -> willReturn ( $composer );
2016-07-21 22:20:56 +00:00
$command -> run ( $input , $output );
}
2022-04-07 11:17:28 +00:00
public function testCanListScripts () : void
{
2022-05-11 14:05:35 +00:00
$this -> initTempComposer ([
2022-04-07 11:17:28 +00:00
'scripts' => [
'test' => '@php test' ,
'fix-cs' => 'php-cs-fixer fix' ,
],
'scripts-descriptions' => [
'fix-cs' => 'Run the codestyle fixer' ,
],
2022-05-11 14:05:35 +00:00
]);
2022-04-07 11:17:28 +00:00
2022-05-11 14:05:35 +00:00
$appTester = $this -> getApplicationTester ();
$appTester -> run ([ 'command' => 'run-script' , '--list' => true ]);
2022-04-07 11:17:28 +00:00
2022-05-11 14:05:35 +00:00
$appTester -> assertCommandIsSuccessful ();
2022-04-07 11:17:28 +00:00
2022-05-11 14:05:35 +00:00
$output = $appTester -> getDisplay ();
2022-04-07 11:17:28 +00:00
2024-05-29 21:12:06 +00:00
self :: assertStringContainsString ( 'Runs the test script as defined in composer.json' , $output , 'The default description for the test script should be printed' );
self :: assertStringContainsString ( 'Run the codestyle fixer' , $output , 'The custom description for the fix-cs script should be printed' );
2022-04-07 11:17:28 +00:00
}
2023-10-27 09:36:59 +00:00
public function testCanDefineAliases () : void
{
$expectedAliases = [ 'one' , 'two' , 'three' ];
$this -> initTempComposer ([
'scripts' => [
'test' => '@php test' ,
],
'scripts-aliases' => [
'test' => $expectedAliases ,
],
]);
$appTester = $this -> getApplicationTester ();
$appTester -> run ([ 'command' => 'test' , '--help' => true , '--format' => 'json' ]);
$appTester -> assertCommandIsSuccessful ();
$output = $appTester -> getDisplay ();
$array = json_decode ( $output , true );
$actualAliases = $array [ 'usage' ];
array_shift ( $actualAliases );
2024-05-29 21:12:06 +00:00
self :: assertSame ( $expectedAliases , $actualAliases , 'The custom aliases for the test command should be printed' );
2023-10-27 09:36:59 +00:00
}
2022-10-28 12:24:55 +00:00
public function testExecutionOfCustomSymfonyCommand () : void
{
$this -> initTempComposer ([
'scripts' => [
'test-direct' => 'Test\\MyCommand' ,
'test-ref' => [ '@test-direct --inneropt innerarg' ],
],
'autoload' => [
'psr-4' => [
'Test\\' => '' ,
],
],
]);
file_put_contents ( 'MyCommand.php' , <<< 'TEST'
< ? php
namespace Test ;
use Symfony\Component\Console\Input\InputInterface ;
use Symfony\Component\Console\Input\InputOption ;
use Symfony\Component\Console\Input\InputArgument ;
use Symfony\Component\Console\Output\OutputInterface ;
use Symfony\Component\Console\Command\Command ;
class MyCommand extends Command
{
protected function configure () : void
{
$this -> setDefinition ([
new InputArgument ( 'req-arg' , InputArgument :: REQUIRED , 'Required arg.' ),
new InputArgument ( 'opt-arg' , InputArgument :: OPTIONAL , 'Optional arg.' ),
new InputOption ( 'inneropt' , null , InputOption :: VALUE_NONE , 'Option.' ),
new InputOption ( 'outeropt' , null , InputOption :: VALUE_OPTIONAL , 'Optional option.' ),
]);
}
public function execute ( InputInterface $input , OutputInterface $output ) : int
{
$output -> writeln ( $input -> getArgument ( 'req-arg' ));
$output -> writeln (( string ) $input -> getArgument ( 'opt-arg' ));
$output -> writeln ( 'inneropt: ' . ( $input -> getOption ( 'inneropt' ) ? 'set' : 'unset' ));
$output -> writeln ( 'outeropt: ' . ( $input -> getOption ( 'outeropt' ) ? 'set' : 'unset' ));
return 2 ;
}
}
TEST
);
$appTester = $this -> getApplicationTester ();
$appTester -> run ([ 'command' => 'test-direct' , '--outeropt' => true , 'req-arg' => 'lala' ]);
self :: assertSame ( ' lala
inneropt : unset
outeropt : set
' , $appTester -> getDisplay ( true ));
self :: assertSame ( 2 , $appTester -> getStatusCode ());
$appTester = $this -> getApplicationTester ();
$appTester -> run ([ 'command' => 'test-ref' , '--outeropt' => true , 'req-arg' => 'lala' ]);
self :: assertSame ( ' innerarg
lala
inneropt : set
outeropt : set
' , $appTester -> getDisplay ( true ));
self :: assertSame ( 2 , $appTester -> getStatusCode ());
}
2021-10-26 19:05:03 +00:00
/** @return bool[][] **/
2022-11-24 13:39:08 +00:00
public static function getDevOptions () : array
2016-07-21 22:20:56 +00:00
{
2022-08-17 12:20:07 +00:00
return [
[ true , true ],
[ true , false ],
[ false , true ],
[ false , false ],
];
2016-07-21 22:20:56 +00:00
}
2021-10-26 19:05:03 +00:00
/** @return Composer **/
2022-02-18 10:22:01 +00:00
private function createComposerInstance () : Composer
2016-07-21 22:20:56 +00:00
{
$composer = new Composer ;
2017-03-08 14:07:29 +00:00
$config = new Config ;
2016-07-21 22:20:56 +00:00
$composer -> setConfig ( $config );
return $composer ;
}
}