diff --git a/tests/Composer/Test/Command/GlobalCommandTest.php b/tests/Composer/Test/Command/GlobalCommandTest.php new file mode 100644 index 000000000..1c3b32a36 --- /dev/null +++ b/tests/Composer/Test/Command/GlobalCommandTest.php @@ -0,0 +1,80 @@ + + * 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\Test\TestCase; +use Composer\Util\Platform; + +class GlobalCommandTest extends TestCase +{ + public function tearDown(): void + { + parent::tearDown(); + Platform::clearEnv('COMPOSER_HOME'); + Platform::clearEnv('COMPOSER'); + } + + public function testGlobal(): void + { + $script = '@php -r \'echo getenv("COMPOSER") . PHP_EOL;\''; + $fakeComposer = 'TMP_COMPOSER.JSON'; + $composerHome = $this->initTempComposer( + [ + "scripts" => [ + "test-script" => $script, + ], + ] + ); + + Platform::putEnv('COMPOSER_HOME', $composerHome); + Platform::putEnv('COMPOSER', $fakeComposer); + + $dir = self::getUniqueTmpDirectory(); + chdir($dir); + + $appTester = $this->getApplicationTester(); + $appTester->run([ + 'command' => 'global', + 'command-name' => 'test-script', + '--no-interaction' => true, + ]); + + $display = $appTester->getDisplay(true); + + self::assertStringContainsString( + 'Changed current directory to ' . $composerHome, + $display + ); + self::assertStringContainsString($script, $display); + self::assertStringNotContainsString($fakeComposer, $display, '$COMPOSER is not unset by global command'); + } + + public function testCannotCreateHome(): void + { + $dir = self::getUniqueTmpDirectory(); + $filename = $dir . '/file'; + file_put_contents($filename, ''); + + Platform::putEnv('COMPOSER_HOME', $filename); + + self::expectException(\RuntimeException::class); + $this->expectExceptionMessage($filename . ' exists and is not a directory.'); + + $appTester = $this->getApplicationTester(); + $appTester->run([ + 'command' => 'global', + 'command-name' => 'test-script', + '--no-interaction' => true, + ]); + } +}