From 0d68dabb5f602a43816ace923516068abb2cc667 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Mon, 15 May 2023 21:54:40 +0200 Subject: [PATCH] Add more tests for install command, refs #11277 --- .../Test/Command/InstallCommandTest.php | 188 +++++++++--------- 1 file changed, 95 insertions(+), 93 deletions(-) diff --git a/tests/Composer/Test/Command/InstallCommandTest.php b/tests/Composer/Test/Command/InstallCommandTest.php index e5983cc07..8787de889 100644 --- a/tests/Composer/Test/Command/InstallCommandTest.php +++ b/tests/Composer/Test/Command/InstallCommandTest.php @@ -18,15 +18,14 @@ use Generator; class InstallCommandTest extends TestCase { /** - * @dataProvider useCaseProvider + * @dataProvider errorCaseProvider * @param array $composerJson * @param array $command */ - public function testInstallCommand( + public function testInstallCommandErrors( array $composerJson, array $command, - string $expected, - bool $lock = false + string $expected ): void { $this->initTempComposer($composerJson); @@ -37,10 +36,7 @@ class InstallCommandTest extends TestCase self::getPackage('vendor/devpackage', '2.3.4'), ]; - if ($lock) { - $this->createComposerLock($packages, $devPackages); - } - + $this->createComposerLock($packages, $devPackages); $this->createInstalledJson($packages, $devPackages); $appTester = $this->getApplicationTester(); @@ -49,29 +45,11 @@ class InstallCommandTest extends TestCase $this->assertSame(trim($expected), trim($appTester->getDisplay(true))); } - public function useCaseProvider(): Generator + public function errorCaseProvider(): Generator { yield 'it writes an error when the dev flag is passed' => [ [ - 'repositories' => [ - 'packages' => [ - 'type' => 'package', - 'package' => [ - [ - 'name' => 'vendor/package', - 'description' => 'generic description', - 'version' => '1.0.0', - 'dist' => [ - 'url' => 'https://example.org', - 'type' => 'zip' - ] - ], - ] - ] - ], - 'require' => [ - 'vendor/package' => '^1.0' - ] + 'repositories' => [], ], ['--dev' => true], << [ [ - 'repositories' => [ - 'packages' => [ - 'type' => 'package', - 'package' => [ - [ - 'name' => 'vendor/package', - 'description' => 'generic description', - 'version' => '1.0.0', - 'dist' => [ - 'url' => 'https://example.org', - 'type' => 'zip' - ] - ], - ] - ] - ], - 'require' => [ - 'vendor/package' => '^1.0' - ] + 'repositories' => [], ], ['--no-suggest' => true], << [ [ - 'repositories' => [ - 'packages' => [ - 'type' => 'package', - 'package' => [ - [ - 'name' => 'vendor/package', - 'description' => 'generic description', - 'version' => '1.0.0', - 'dist' => [ - 'url' => 'https://example.org', - 'type' => 'zip' - ] - ], - ] - ] - ], - 'require' => [ - 'vendor/package' => '^1.0' - ] + 'repositories' => [], ], ['packages' => ['vendor/package']], << [ [ - 'repositories' => [ - 'packages' => [ - 'type' => 'package', - 'package' => [ - [ - 'name' => 'vendor/package', - 'description' => 'generic description', - 'version' => '1.0.0', - 'dist' => [ - 'url' => 'https://example.org', - 'type' => 'zip' - ] - ], - ] - ] - ], - 'require' => [ - 'vendor/package' => '^1.0' - ] + 'repositories' => [], ], ['--no-install' => true], <<initTempComposer([ + 'require' => [ + 'root/req' => '1.*', + ], + 'require-dev' => [ + 'root/another' => '1.*', + ], + ]); + + $rootReqPackage = self::getPackage('root/req'); + $anotherPackage = self::getPackage('root/another'); + // Set as a metapackage so that we can do the whole post-remove update & install process without Composer trying to download them (DownloadManager::getDownloaderForPackage). + $rootReqPackage->setType('metapackage'); + $anotherPackage->setType('metapackage'); + + $this->createComposerLock([$rootReqPackage], [$anotherPackage]); + + $appTester = $this->getApplicationTester(); + $appTester->run(['command' => 'install', '--no-progress' => true]); + + $this->assertSame('Installing dependencies from lock file (including require-dev) +Verifying lock file contents can be installed on current platform. +Package operations: 2 installs, 0 updates, 0 removals + - Installing root/another (1.0.0) + - Installing root/req (1.0.0) +Generating autoload files', trim($appTester->getDisplay(true))); + } + + public function testInstallFromEmptyVendorNoDev(): void + { + $this->initTempComposer([ + 'require' => [ + 'root/req' => '1.*', + ], + 'require-dev' => [ + 'root/another' => '1.*', + ], + ]); + + $rootReqPackage = self::getPackage('root/req'); + $anotherPackage = self::getPackage('root/another'); + // Set as a metapackage so that we can do the whole post-remove update & install process without Composer trying to download them (DownloadManager::getDownloaderForPackage). + $rootReqPackage->setType('metapackage'); + $anotherPackage->setType('metapackage'); + + $this->createComposerLock([$rootReqPackage], [$anotherPackage]); + + $appTester = $this->getApplicationTester(); + $appTester->run(['command' => 'install', '--no-progress' => true, '--no-dev' => true]); + + $this->assertSame('Installing dependencies from lock file +Verifying lock file contents can be installed on current platform. +Package operations: 1 install, 0 updates, 0 removals + - Installing root/req (1.0.0) +Generating autoload files', trim($appTester->getDisplay(true))); + } + + public function testInstallNewPackagesWithExistingPartialVendor(): void + { + $this->initTempComposer([ + 'require' => [ + 'root/req' => '1.*', + 'root/another' => '1.*', + ], + ]); + $rootReqPackage = self::getPackage('root/req'); + $anotherPackage = self::getPackage('root/another'); + // Set as a metapackage so that we can do the whole post-remove update & install process without Composer trying to download them (DownloadManager::getDownloaderForPackage). + $rootReqPackage->setType('metapackage'); + $anotherPackage->setType('metapackage'); + + $this->createComposerLock([$rootReqPackage, $anotherPackage], []); + $this->createInstalledJson([$rootReqPackage], []); + + $appTester = $this->getApplicationTester(); + $appTester->run(['command' => 'install', '--no-progress' => true]); + + $this->assertSame('Installing dependencies from lock file (including require-dev) +Verifying lock file contents can be installed on current platform. +Package operations: 1 install, 0 updates, 0 removals + - Installing root/another (1.0.0) +Generating autoload files', trim($appTester->getDisplay(true))); + } }