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
2022-08-16 08:28:59 +00:00
$this -> assertStringContainsString ( 'Runs the test script as defined in composer.json' , $output , 'The default description for the test script should be printed' );
2022-04-07 11:17:28 +00:00
$this -> assertStringContainsString ( 'Run the codestyle fixer' , $output , 'The custom description for the fix-cs script should be printed' );
}
2021-10-26 19:05:03 +00:00
/** @return bool[][] **/
2022-02-18 10:22:01 +00:00
public 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 ;
}
}