From 7fbbe38b75495ff78cd8b5b7dc00fbd91679183a Mon Sep 17 00:00:00 2001 From: James Titcumb Date: Thu, 25 Jul 2024 15:09:24 +0100 Subject: [PATCH 1/4] Introduce a new faster way of chekcing version resolution instead of relying on the DownloadCommand end-to-end --- .../Command/DownloadCommandTest.php | 9 +-- .../ResolveDependencyWithComposerTest.php | 67 +++++++++++++++++++ 2 files changed, 72 insertions(+), 4 deletions(-) create mode 100644 test/integration/DependencyResolver/ResolveDependencyWithComposerTest.php diff --git a/test/integration/Command/DownloadCommandTest.php b/test/integration/Command/DownloadCommandTest.php index 80e8804f..45b2bec0 100644 --- a/test/integration/Command/DownloadCommandTest.php +++ b/test/integration/Command/DownloadCommandTest.php @@ -34,6 +34,11 @@ public function setUp(): void } /** + * Note: this data provider is not intended to provide a fully comprehensive list of supported version mappings + * since it is slightly slower to run (as it actually downloads). For a fuller list of version resolution tests, + * please see {@see \Php\PieIntegrationTest\DependencyResolver\ResolveDependencyWithComposerTest}, which is much + * faster to execute! + * * @return array * * @psalm-suppress PossiblyUnusedMethod https://github.com/psalm/psalm-plugin-phpunit/issues/131 @@ -46,11 +51,7 @@ public static function validVersionsList(): array [self::TEST_PACKAGE . ':1.0.1-alpha.3@alpha', self::TEST_PACKAGE . ':1.0.1-alpha.3'], [self::TEST_PACKAGE . ':*', self::TEST_PACKAGE . ':1.0.1'], [self::TEST_PACKAGE . ':~1.0.0@alpha', self::TEST_PACKAGE . ':1.0.1'], - [self::TEST_PACKAGE . ':^1.1.0@alpha', self::TEST_PACKAGE . ':1.1.0-alpha.4'], [self::TEST_PACKAGE . ':~1.0.0', self::TEST_PACKAGE . ':1.0.1'], - // @todo https://github.com/php/pie/issues/13 - in theory, these could work, on NonWindows at least - // [self::TEST_PACKAGE . ':dev-main', self::TEST_PACKAGE . ':???'], - // [self::TEST_PACKAGE . ':dev-main#769f906413d6d1e12152f6d34134cbcd347ca253', self::TEST_PACKAGE . ':???'], ]; return array_combine( diff --git a/test/integration/DependencyResolver/ResolveDependencyWithComposerTest.php b/test/integration/DependencyResolver/ResolveDependencyWithComposerTest.php new file mode 100644 index 00000000..dc366404 --- /dev/null +++ b/test/integration/DependencyResolver/ResolveDependencyWithComposerTest.php @@ -0,0 +1,67 @@ + + * + * @psalm-suppress PossiblyUnusedMethod https://github.com/psalm/psalm-plugin-phpunit/issues/131 + */ + public static function validVersionsList(): array + { + $versionsAndExpected = [ + [null, '1.0.1'], + ['*', '1.0.1'], + ['1.0.1-alpha.3@alpha', '1.0.1-alpha.3'], + ['^1.0', '1.0.1'], + ['^1.1.0@alpha', '1.1.0-beta.1'], + ['^1.0@beta', '1.1.0-beta.1'], + ['^1.1@beta', '1.1.0-beta.1'], + ['~1.0.0', '1.0.1'], + ['~1.0.0@alpha', '1.0.1'], + ['~1.0.0@beta', '1.0.1'], + ['~1.0@beta', '1.1.0-beta.1'], + // @todo https://github.com/php/pie/issues/13 - in theory, these could work, on NonWindows at least +// ['dev-main@dev', 'dev-main'], +// ['dev-main#769f906413d6d1e12152f6d34134cbcd347ca253@dev', 'dev-main'], + ]; + + return array_combine( + array_map(static fn ($item) => $item[0], $versionsAndExpected), + $versionsAndExpected, + ); + } + + #[DataProvider('validVersionsList')] + public function testDependenciesAreResolvedToExpectedVersions(string|null $requestedVersion, string $expectedVersion) + { + if (PHP_VERSION_ID < 80300 || PHP_VERSION_ID >= 80400) { + self::markTestSkipped('This test can only run on PHP 8.3 - you are running ' . PHP_VERSION); + } + + $container = Container::factory(); + $resolve = $container->get(DependencyResolver::class); + + $package = $resolve->__invoke( + TargetPlatform::fromPhpBinaryPath(PhpBinaryPath::fromCurrentProcess()), + 'asgrim/example-pie-extension', + $requestedVersion, + ); + + self::assertSame($expectedVersion, $package->version); + } +} From c88aed6c5ae4fe1ab4961aa5b5dd8005401f4d09 Mon Sep 17 00:00:00 2001 From: James Titcumb Date: Thu, 1 Aug 2024 15:37:27 +0100 Subject: [PATCH 2/4] Improve version resolution to use stabilities properly in ResolveDependencyWithComposer --- src/Container.php | 8 +---- .../ResolveDependencyWithComposer.php | 34 ++++++++++++++----- .../ResolveDependencyWithComposerTest.php | 24 ++++++++----- .../ResolveDependencyWithComposerTest.php | 18 ++++++---- 4 files changed, 53 insertions(+), 31 deletions(-) diff --git a/src/Container.php b/src/Container.php index eb4db737..fac8f57e 100644 --- a/src/Container.php +++ b/src/Container.php @@ -8,8 +8,6 @@ use Composer\Factory as ComposerFactory; use Composer\IO\ConsoleIO; use Composer\IO\IOInterface; -use Composer\Repository\CompositeRepository; -use Composer\Repository\RepositorySet; use Composer\Util\AuthHelper; use Composer\Util\Platform; use GuzzleHttp\Client; @@ -79,12 +77,8 @@ public static function factory(): ContainerInterface $container->singleton( DependencyResolver::class, static function (ContainerInterface $container): DependencyResolver { - $composer = $container->get(Composer::class); - $repositorySet = new RepositorySet(); - $repositorySet->addRepository(new CompositeRepository($composer->getRepositoryManager()->getRepositories())); - return new ResolveDependencyWithComposer( - $repositorySet, + $container->get(Composer::class), new ResolveTargetPhpToPlatformRepository(), ); }, diff --git a/src/DependencyResolver/ResolveDependencyWithComposer.php b/src/DependencyResolver/ResolveDependencyWithComposer.php index f7af0c13..be36001b 100644 --- a/src/DependencyResolver/ResolveDependencyWithComposer.php +++ b/src/DependencyResolver/ResolveDependencyWithComposer.php @@ -4,40 +4,56 @@ namespace Php\Pie\DependencyResolver; +use Composer\Composer; use Composer\Package\CompletePackageInterface; use Composer\Package\Version\VersionSelector; +use Composer\Repository\CompositeRepository; use Composer\Repository\RepositorySet; use Php\Pie\ExtensionType; use Php\Pie\Platform\TargetPhp\ResolveTargetPhpToPlatformRepository; use Php\Pie\Platform\TargetPlatform; use function preg_match; +use function str_starts_with; /** @internal This is not public API for PIE, so should not be depended upon unless you accept the risk of BC breaks */ final class ResolveDependencyWithComposer implements DependencyResolver { public function __construct( - private readonly RepositorySet $repositorySet, + private readonly Composer $composer, private readonly ResolveTargetPhpToPlatformRepository $resolveTargetPhpToPlatformRepository, ) { } - public function __invoke(TargetPlatform $targetPlatform, string $packageName, string|null $requestedVersion): Package + private function factoryRepositorySet(string|null $requestedVersion): RepositorySet { - $preferredStability = 'stable'; - $repoSetFlags = 0; + $minimumStability = 'stable'; /** Stability options from {@see https://getcomposer.org/doc/04-schema.md#minimum-stability} */ - if ($requestedVersion !== null && preg_match('#@(dev|alpha|beta|RC|stable)$#', $requestedVersion, $matches)) { - $preferredStability = $matches[1]; - $repoSetFlags |= RepositorySet::ALLOW_UNACCEPTABLE_STABILITIES; + if ($requestedVersion !== null) { + if (preg_match('#@(dev|alpha|beta|RC|stable)$#', $requestedVersion, $matches)) { + $minimumStability = $matches[1]; + } + + // If a specific stability was not requested, but the version requested was `dev-` something, change to dev min stability + if (! $matches && str_starts_with($requestedVersion, 'dev-')) { + $minimumStability = 'dev'; + } } + $repositorySet = new RepositorySet($minimumStability); + $repositorySet->addRepository(new CompositeRepository($this->composer->getRepositoryManager()->getRepositories())); + + return $repositorySet; + } + + public function __invoke(TargetPlatform $targetPlatform, string $packageName, string|null $requestedVersion): Package + { $package = (new VersionSelector( - $this->repositorySet, + $this->factoryRepositorySet($requestedVersion), ($this->resolveTargetPhpToPlatformRepository)($targetPlatform->phpBinaryPath), )) - ->findBestCandidate($packageName, $requestedVersion, $preferredStability, null, $repoSetFlags); + ->findBestCandidate($packageName, $requestedVersion); if (! $package instanceof CompletePackageInterface) { throw UnableToResolveRequirement::fromRequirement($packageName, $requestedVersion); diff --git a/test/integration/DependencyResolver/ResolveDependencyWithComposerTest.php b/test/integration/DependencyResolver/ResolveDependencyWithComposerTest.php index dc366404..5281b7a1 100644 --- a/test/integration/DependencyResolver/ResolveDependencyWithComposerTest.php +++ b/test/integration/DependencyResolver/ResolveDependencyWithComposerTest.php @@ -13,11 +13,17 @@ use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; +use function array_combine; +use function array_map; + +use const PHP_VERSION; +use const PHP_VERSION_ID; + #[CoversClass(ResolveDependencyWithComposer::class)] final class ResolveDependencyWithComposerTest extends TestCase { /** - * @return array + * @return array * * @psalm-suppress PossiblyUnusedMethod https://github.com/psalm/psalm-plugin-phpunit/issues/131 */ @@ -29,32 +35,32 @@ public static function validVersionsList(): array ['1.0.1-alpha.3@alpha', '1.0.1-alpha.3'], ['^1.0', '1.0.1'], ['^1.1.0@alpha', '1.1.0-beta.1'], - ['^1.0@beta', '1.1.0-beta.1'], + ['^1.0@beta', '1.0.1'], ['^1.1@beta', '1.1.0-beta.1'], ['~1.0.0', '1.0.1'], ['~1.0.0@alpha', '1.0.1'], ['~1.0.0@beta', '1.0.1'], - ['~1.0@beta', '1.1.0-beta.1'], - // @todo https://github.com/php/pie/issues/13 - in theory, these could work, on NonWindows at least -// ['dev-main@dev', 'dev-main'], -// ['dev-main#769f906413d6d1e12152f6d34134cbcd347ca253@dev', 'dev-main'], + ['~1.0@beta', '1.0.1'], + ['dev-main', 'dev-main'], + // @todo this is resolving simply to `dev-main`, but we should be able to download a specific commit +// ['dev-769f906413d6d1e12152f6d34134cbcd347ca253#769f906413d6d1e12152f6d34134cbcd347ca253@dev', ''], ]; return array_combine( - array_map(static fn ($item) => $item[0], $versionsAndExpected), + array_map(static fn ($item) => $item[0] ?? 'null', $versionsAndExpected), $versionsAndExpected, ); } #[DataProvider('validVersionsList')] - public function testDependenciesAreResolvedToExpectedVersions(string|null $requestedVersion, string $expectedVersion) + public function testDependenciesAreResolvedToExpectedVersions(string|null $requestedVersion, string $expectedVersion): void { if (PHP_VERSION_ID < 80300 || PHP_VERSION_ID >= 80400) { self::markTestSkipped('This test can only run on PHP 8.3 - you are running ' . PHP_VERSION); } $container = Container::factory(); - $resolve = $container->get(DependencyResolver::class); + $resolve = $container->get(DependencyResolver::class); $package = $resolve->__invoke( TargetPlatform::fromPhpBinaryPath(PhpBinaryPath::fromCurrentProcess()), diff --git a/test/unit/DependencyResolver/ResolveDependencyWithComposerTest.php b/test/unit/DependencyResolver/ResolveDependencyWithComposerTest.php index 604911ad..e4d02017 100644 --- a/test/unit/DependencyResolver/ResolveDependencyWithComposerTest.php +++ b/test/unit/DependencyResolver/ResolveDependencyWithComposerTest.php @@ -4,10 +4,11 @@ namespace Php\PieUnitTest\DependencyResolver; +use Composer\Composer; use Composer\IO\NullIO; use Composer\Repository\CompositeRepository; use Composer\Repository\RepositoryFactory; -use Composer\Repository\RepositorySet; +use Composer\Repository\RepositoryManager; use Php\Pie\DependencyResolver\ResolveDependencyWithComposer; use Php\Pie\DependencyResolver\UnableToResolveRequirement; use Php\Pie\Platform\Architecture; @@ -23,15 +24,20 @@ #[CoversClass(ResolveDependencyWithComposer::class)] final class ResolveDependencyWithComposerTest extends TestCase { - private RepositorySet $repositorySet; + private Composer $composer; private ResolveTargetPhpToPlatformRepository $resolveTargetPhpToPlatformRepository; public function setUp(): void { parent::setUp(); - $this->repositorySet = new RepositorySet(); - $this->repositorySet->addRepository(new CompositeRepository(RepositoryFactory::defaultReposWithDefaultManager(new NullIO()))); + $repoManager = $this->createMock(RepositoryManager::class); + $repoManager->method('getRepositories') + ->willReturn([new CompositeRepository(RepositoryFactory::defaultReposWithDefaultManager(new NullIO()))]); + + $this->composer = $this->createMock(Composer::class); + $this->composer->method('getRepositoryManager') + ->willReturn($repoManager); $this->resolveTargetPhpToPlatformRepository = new ResolveTargetPhpToPlatformRepository(); } @@ -52,7 +58,7 @@ public function testPackageThatCanBeResolved(): void ); $package = (new ResolveDependencyWithComposer( - $this->repositorySet, + $this->composer, $this->resolveTargetPhpToPlatformRepository, ))($targetPlatform, 'asgrim/example-pie-extension', '^1.0'); @@ -94,7 +100,7 @@ public function testPackageThatCannotBeResolvedThrowsException(array $platformOv $this->expectException(UnableToResolveRequirement::class); (new ResolveDependencyWithComposer( - $this->repositorySet, + $this->composer, $this->resolveTargetPhpToPlatformRepository, ))( $targetPlatform, From e2f61ef324b2d3dd0c19188f2bd7db82bdbdde80 Mon Sep 17 00:00:00 2001 From: James Titcumb Date: Fri, 2 Aug 2024 11:40:16 +0100 Subject: [PATCH 3/4] Make requiring specific commit hashes work --- .../ResolveDependencyWithComposer.php | 13 ++++++ .../Command/DownloadCommandTest.php | 27 +++++++----- .../ResolveDependencyWithComposerTest.php | 43 +++++++++++-------- 3 files changed, 56 insertions(+), 27 deletions(-) diff --git a/src/DependencyResolver/ResolveDependencyWithComposer.php b/src/DependencyResolver/ResolveDependencyWithComposer.php index be36001b..6872f5c1 100644 --- a/src/DependencyResolver/ResolveDependencyWithComposer.php +++ b/src/DependencyResolver/ResolveDependencyWithComposer.php @@ -59,6 +59,19 @@ public function __invoke(TargetPlatform $targetPlatform, string $packageName, st throw UnableToResolveRequirement::fromRequirement($packageName, $requestedVersion); } + /** + * If a specific commit hash is requested, override the references in the package. This is approximately what + * Composer does anyway: + * + * > ArrayLoader::parseLinks is in charge of this, it drops commit refs, for package resolution purposes we + * > only use dev-main, but we ensure in the PoolBuilder that root references (#...) are set so the dev-main + * > package has its source and dist refs overridden to be whatever you specify and that applies at install + * > time then but package metadata is only read from the branch's head + */ + if ($requestedVersion !== null && preg_match('/#([a-f0-9]{40})$/', $requestedVersion, $matches)) { + $package->setSourceDistReferences($matches[1]); + } + if (! ExtensionType::isValid($package->getType())) { throw UnableToResolveRequirement::toPhpOrZendExtension($package, $packageName, $requestedVersion); } diff --git a/test/integration/Command/DownloadCommandTest.php b/test/integration/Command/DownloadCommandTest.php index 45b2bec0..76eab393 100644 --- a/test/integration/Command/DownloadCommandTest.php +++ b/test/integration/Command/DownloadCommandTest.php @@ -39,19 +39,20 @@ public function setUp(): void * please see {@see \Php\PieIntegrationTest\DependencyResolver\ResolveDependencyWithComposerTest}, which is much * faster to execute! * - * @return array + * @return array * * @psalm-suppress PossiblyUnusedMethod https://github.com/psalm/psalm-plugin-phpunit/issues/131 */ public static function validVersionsList(): array { $versionsAndExpected = [ - [self::TEST_PACKAGE, self::TEST_PACKAGE . ':1.0.1'], - [self::TEST_PACKAGE . ':^1.0', self::TEST_PACKAGE . ':1.0.1'], - [self::TEST_PACKAGE . ':1.0.1-alpha.3@alpha', self::TEST_PACKAGE . ':1.0.1-alpha.3'], - [self::TEST_PACKAGE . ':*', self::TEST_PACKAGE . ':1.0.1'], - [self::TEST_PACKAGE . ':~1.0.0@alpha', self::TEST_PACKAGE . ':1.0.1'], - [self::TEST_PACKAGE . ':~1.0.0', self::TEST_PACKAGE . ':1.0.1'], + [self::TEST_PACKAGE, self::TEST_PACKAGE . ':1.0.1', '769f906'], + [self::TEST_PACKAGE . ':^1.0', self::TEST_PACKAGE . ':1.0.1', '769f906'], + [self::TEST_PACKAGE . ':1.0.1-alpha.3@alpha', self::TEST_PACKAGE . ':1.0.1-alpha.3', '115f8f8'], + [self::TEST_PACKAGE . ':*', self::TEST_PACKAGE . ':1.0.1', '769f906'], + [self::TEST_PACKAGE . ':~1.0.0@alpha', self::TEST_PACKAGE . ':1.0.1', '769f906'], + [self::TEST_PACKAGE . ':~1.0.0', self::TEST_PACKAGE . ':1.0.1', '769f906'], + [self::TEST_PACKAGE . ':dev-main#9b5e6c80a1e05556e4e6824f0c112a4992cee001', self::TEST_PACKAGE . ':dev-main', '9b5e6c8'], ]; return array_combine( @@ -61,8 +62,11 @@ public static function validVersionsList(): array } #[DataProvider('validVersionsList')] - public function testDownloadCommandWillDownloadCompatibleExtension(string $requestedVersion, string $expectedVersion): void - { + public function testDownloadCommandWillDownloadCompatibleExtension( + string $requestedVersion, + string $expectedVersion, + string $expectedSha, + ): void { if (PHP_VERSION_ID < 80300 || PHP_VERSION_ID >= 80400) { self::markTestSkipped('This test can only run on PHP 8.3 - you are running ' . PHP_VERSION); } @@ -73,7 +77,10 @@ public function testDownloadCommandWillDownloadCompatibleExtension(string $reque $outputString = $this->commandTester->getDisplay(); self::assertStringContainsString('Found package: ' . $expectedVersion . ' which provides', $outputString); - self::assertStringContainsString('Extracted ' . $expectedVersion . ' source to', $outputString); + self::assertStringMatchesFormat( + '%AExtracted ' . $expectedVersion . ' source to: /tmp/%s/asgrim-example-pie-extension-' . $expectedSha . '%A', + $outputString, + ); } #[DataProvider('validVersionsList')] diff --git a/test/integration/DependencyResolver/ResolveDependencyWithComposerTest.php b/test/integration/DependencyResolver/ResolveDependencyWithComposerTest.php index 5281b7a1..3be40741 100644 --- a/test/integration/DependencyResolver/ResolveDependencyWithComposerTest.php +++ b/test/integration/DependencyResolver/ResolveDependencyWithComposerTest.php @@ -22,28 +22,32 @@ #[CoversClass(ResolveDependencyWithComposer::class)] final class ResolveDependencyWithComposerTest extends TestCase { + private const DOWNLOAD_URL_ANY = 'https://api.github.com/repos/asgrim/example-pie-extension/zipball/%s'; + private const DOWNLOAD_URL_1_0_1_ALPHA_3 = 'https://api.github.com/repos/asgrim/example-pie-extension/zipball/115f8f8e01ee098a18ec2f47af4852be51ebece7'; + private const DOWNLOAD_URL_1_0_1 = 'https://api.github.com/repos/asgrim/example-pie-extension/zipball/769f906413d6d1e12152f6d34134cbcd347ca253'; + private const DOWNLOAD_URL_1_1_0_BETA_1 = 'https://api.github.com/repos/asgrim/example-pie-extension/zipball/b8cec47269dc607b3111fbebd2c47f5b5112595e'; + /** - * @return array + * @return array * * @psalm-suppress PossiblyUnusedMethod https://github.com/psalm/psalm-plugin-phpunit/issues/131 */ public static function validVersionsList(): array { $versionsAndExpected = [ - [null, '1.0.1'], - ['*', '1.0.1'], - ['1.0.1-alpha.3@alpha', '1.0.1-alpha.3'], - ['^1.0', '1.0.1'], - ['^1.1.0@alpha', '1.1.0-beta.1'], - ['^1.0@beta', '1.0.1'], - ['^1.1@beta', '1.1.0-beta.1'], - ['~1.0.0', '1.0.1'], - ['~1.0.0@alpha', '1.0.1'], - ['~1.0.0@beta', '1.0.1'], - ['~1.0@beta', '1.0.1'], - ['dev-main', 'dev-main'], - // @todo this is resolving simply to `dev-main`, but we should be able to download a specific commit -// ['dev-769f906413d6d1e12152f6d34134cbcd347ca253#769f906413d6d1e12152f6d34134cbcd347ca253@dev', ''], + [null, '1.0.1', self::DOWNLOAD_URL_ANY], + ['*', '1.0.1', self::DOWNLOAD_URL_ANY], + ['1.0.1-alpha.3@alpha', '1.0.1-alpha.3', self::DOWNLOAD_URL_1_0_1_ALPHA_3], + ['^1.0', '1.0.1', self::DOWNLOAD_URL_1_0_1], + ['^1.1.0@alpha', '1.1.0-beta.1', self::DOWNLOAD_URL_1_1_0_BETA_1], + ['^1.0@beta', '1.0.1', self::DOWNLOAD_URL_1_0_1], + ['^1.1@beta', '1.1.0-beta.1', self::DOWNLOAD_URL_1_1_0_BETA_1], + ['~1.0.0', '1.0.1', self::DOWNLOAD_URL_1_0_1], + ['~1.0.0@alpha', '1.0.1', self::DOWNLOAD_URL_1_0_1], + ['~1.0.0@beta', '1.0.1', self::DOWNLOAD_URL_1_0_1], + ['~1.0@beta', '1.0.1', self::DOWNLOAD_URL_1_0_1], + ['dev-main', 'dev-main', self::DOWNLOAD_URL_ANY], + ['dev-main#769f906413d6d1e12152f6d34134cbcd347ca253', 'dev-main', self::DOWNLOAD_URL_1_0_1], ]; return array_combine( @@ -53,8 +57,11 @@ public static function validVersionsList(): array } #[DataProvider('validVersionsList')] - public function testDependenciesAreResolvedToExpectedVersions(string|null $requestedVersion, string $expectedVersion): void - { + public function testDependenciesAreResolvedToExpectedVersions( + string|null $requestedVersion, + string $expectedVersion, + string $expectedDownloadUrl, + ): void { if (PHP_VERSION_ID < 80300 || PHP_VERSION_ID >= 80400) { self::markTestSkipped('This test can only run on PHP 8.3 - you are running ' . PHP_VERSION); } @@ -69,5 +76,7 @@ public function testDependenciesAreResolvedToExpectedVersions(string|null $reque ); self::assertSame($expectedVersion, $package->version); + self::assertNotNull($package->downloadUrl); + self::assertStringMatchesFormat($expectedDownloadUrl, $package->downloadUrl); } } From c5d4475fa5b32f5c9d7fd52e4d902f5ad7589fc0 Mon Sep 17 00:00:00 2001 From: James Titcumb Date: Fri, 2 Aug 2024 12:07:52 +0100 Subject: [PATCH 4/4] Only run specific commit download test on non-Windows test environments --- .../Command/DownloadCommandTest.php | 37 ++++++++++++++----- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/test/integration/Command/DownloadCommandTest.php b/test/integration/Command/DownloadCommandTest.php index 76eab393..8cc5127d 100644 --- a/test/integration/Command/DownloadCommandTest.php +++ b/test/integration/Command/DownloadCommandTest.php @@ -39,20 +39,19 @@ public function setUp(): void * please see {@see \Php\PieIntegrationTest\DependencyResolver\ResolveDependencyWithComposerTest}, which is much * faster to execute! * - * @return array + * @return array * * @psalm-suppress PossiblyUnusedMethod https://github.com/psalm/psalm-plugin-phpunit/issues/131 */ public static function validVersionsList(): array { $versionsAndExpected = [ - [self::TEST_PACKAGE, self::TEST_PACKAGE . ':1.0.1', '769f906'], - [self::TEST_PACKAGE . ':^1.0', self::TEST_PACKAGE . ':1.0.1', '769f906'], - [self::TEST_PACKAGE . ':1.0.1-alpha.3@alpha', self::TEST_PACKAGE . ':1.0.1-alpha.3', '115f8f8'], - [self::TEST_PACKAGE . ':*', self::TEST_PACKAGE . ':1.0.1', '769f906'], - [self::TEST_PACKAGE . ':~1.0.0@alpha', self::TEST_PACKAGE . ':1.0.1', '769f906'], - [self::TEST_PACKAGE . ':~1.0.0', self::TEST_PACKAGE . ':1.0.1', '769f906'], - [self::TEST_PACKAGE . ':dev-main#9b5e6c80a1e05556e4e6824f0c112a4992cee001', self::TEST_PACKAGE . ':dev-main', '9b5e6c8'], + [self::TEST_PACKAGE, self::TEST_PACKAGE . ':1.0.1'], + [self::TEST_PACKAGE . ':^1.0', self::TEST_PACKAGE . ':1.0.1'], + [self::TEST_PACKAGE . ':1.0.1-alpha.3@alpha', self::TEST_PACKAGE . ':1.0.1-alpha.3'], + [self::TEST_PACKAGE . ':*', self::TEST_PACKAGE . ':1.0.1'], + [self::TEST_PACKAGE . ':~1.0.0@alpha', self::TEST_PACKAGE . ':1.0.1'], + [self::TEST_PACKAGE . ':~1.0.0', self::TEST_PACKAGE . ':1.0.1'], ]; return array_combine( @@ -65,7 +64,6 @@ public static function validVersionsList(): array public function testDownloadCommandWillDownloadCompatibleExtension( string $requestedVersion, string $expectedVersion, - string $expectedSha, ): void { if (PHP_VERSION_ID < 80300 || PHP_VERSION_ID >= 80400) { self::markTestSkipped('This test can only run on PHP 8.3 - you are running ' . PHP_VERSION); @@ -77,8 +75,27 @@ public function testDownloadCommandWillDownloadCompatibleExtension( $outputString = $this->commandTester->getDisplay(); self::assertStringContainsString('Found package: ' . $expectedVersion . ' which provides', $outputString); + self::assertStringContainsString('Extracted ' . $expectedVersion . ' source to', $outputString); + } + + public function testDownloadCommandWillDownloadSpecificCommits(): void + { + if (Platform::isWindows()) { + self::markTestSkipped('This test can only run on non-Windows systems'); + } + + if (PHP_VERSION_ID < 80300 || PHP_VERSION_ID >= 80400) { + self::markTestSkipped('This test can only run on PHP 8.3 - you are running ' . PHP_VERSION); + } + + $this->commandTester->execute(['requested-package-and-version' => 'asgrim/example-pie-extension:dev-main#9b5e6c80a1e05556e4e6824f0c112a4992cee001']); + + $this->commandTester->assertCommandIsSuccessful(); + + $outputString = $this->commandTester->getDisplay(); + self::assertStringContainsString('Found package: asgrim/example-pie-extension:dev-main which provides', $outputString); self::assertStringMatchesFormat( - '%AExtracted ' . $expectedVersion . ' source to: /tmp/%s/asgrim-example-pie-extension-' . $expectedSha . '%A', + '%AExtracted asgrim/example-pie-extension:dev-main source to: /tmp/%s/asgrim-example-pie-extension-9b5e6c8%A', $outputString, ); }