Skip to content

Commit 1fe3ed2

Browse files
committed
701: subtract suppressed download-url-methods from OverrideDownloadUrlInstallListener
1 parent 39cf9ba commit 1fe3ed2

4 files changed

Lines changed: 194 additions & 0 deletions

File tree

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Php\Pie\ComposerIntegration\Listeners;
6+
7+
use Php\Pie\DependencyResolver\Package;
8+
use RuntimeException;
9+
10+
use function sprintf;
11+
12+
class AllDownloadUrlMethodsSuppressed extends RuntimeException
13+
{
14+
public static function forPackage(Package $piePackage): self
15+
{
16+
return new self(sprintf(
17+
'Could not find a way to download %s as all possible download URL methods were suppressed',
18+
$piePackage->name(),
19+
));
20+
}
21+
}

src/ComposerIntegration/Listeners/OverrideDownloadUrlInstallListener.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
use Throwable;
2222

2323
use function array_walk;
24+
use function in_array;
2425
use function pathinfo;
2526

2627
use const PATHINFO_EXTENSION;
@@ -75,6 +76,25 @@ function (OperationInterface $operation): void {
7576
$targetPlatform = $this->composerRequest->targetPlatform;
7677
$downloadUrlMethods = DownloadUrlMethod::possibleDownloadUrlMethodsForPackage($piePackage, $targetPlatform);
7778

79+
if ($this->composerRequest->suppressedDownloadUrlMethods !== []) {
80+
$remainingDownloadUrlMethods = [];
81+
82+
foreach ($downloadUrlMethods as $downloadUrlMethod) {
83+
if (in_array($downloadUrlMethod, $this->composerRequest->suppressedDownloadUrlMethods, true)) {
84+
$this->io->write('Suppressing download method: ' . $downloadUrlMethod->value, verbosity: IOInterface::VERBOSE);
85+
continue;
86+
}
87+
88+
$remainingDownloadUrlMethods[] = $downloadUrlMethod;
89+
}
90+
91+
if ($remainingDownloadUrlMethods === []) {
92+
throw AllDownloadUrlMethodsSuppressed::forPackage($piePackage);
93+
}
94+
95+
$downloadUrlMethods = $remainingDownloadUrlMethods;
96+
}
97+
7898
$selectedDownloadUrlMethod = null;
7999
$downloadMethodFailures = [];
80100

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Php\PieUnitTest\ComposerIntegration\Listeners;
6+
7+
use Composer\Package\CompletePackageInterface;
8+
use Php\Pie\ComposerIntegration\Listeners\AllDownloadUrlMethodsSuppressed;
9+
use Php\Pie\DependencyResolver\Package;
10+
use Php\Pie\ExtensionName;
11+
use Php\Pie\ExtensionType;
12+
use PHPUnit\Framework\Attributes\CoversClass;
13+
use PHPUnit\Framework\TestCase;
14+
15+
#[CoversClass(AllDownloadUrlMethodsSuppressed::class)]
16+
final class AllDownloadUrlMethodsSuppressedTest extends TestCase
17+
{
18+
public function testForPackage(): void
19+
{
20+
self::assertSame(
21+
'Could not find a way to download foo/bar as all possible download URL methods were suppressed',
22+
AllDownloadUrlMethodsSuppressed::forPackage(new Package(
23+
$this->createMock(CompletePackageInterface::class),
24+
ExtensionType::PhpModule,
25+
ExtensionName::normaliseFromString('bar'),
26+
'foo/bar',
27+
'1.2.3',
28+
null,
29+
))->getMessage(),
30+
);
31+
}
32+
}

test/unit/ComposerIntegration/Listeners/OverrideDownloadUrlInstallListenerTest.php

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
use Composer\IO\IOInterface;
1414
use Composer\Package\CompletePackage;
1515
use Composer\Package\Package;
16+
use Php\Pie\ComposerIntegration\Listeners\AllDownloadUrlMethodsSuppressed;
1617
use Php\Pie\ComposerIntegration\Listeners\CouldNotDetermineDownloadUrlMethod;
1718
use Php\Pie\ComposerIntegration\Listeners\OverrideDownloadUrlInstallListener;
1819
use Php\Pie\ComposerIntegration\PieComposerRequest;
@@ -677,4 +678,124 @@ public function testNoSelectedDownloadUrlMethodWillThrowException(): void
677678
$this->expectExceptionMessage('Could not download foo/bar using pre-packaged-binary method: nope not found');
678679
$listener($installerEvent);
679680
}
681+
682+
public function testSuppressedDownloadUrlMethodIsSkipped(): void
683+
{
684+
$composerPackage = new CompletePackage('foo/bar', '1.2.3.0', '1.2.3');
685+
$composerPackage->setDistType('zip');
686+
$composerPackage->setDistUrl('https://example.com/git-archive-zip-url');
687+
$composerPackage->setPhpExt([
688+
'extension-name' => 'foobar',
689+
'download-url-method' => ['pre-packaged-binary', 'composer-default'],
690+
]);
691+
692+
$installerEvent = new InstallerEvent(
693+
InstallerEvents::PRE_OPERATIONS_EXEC,
694+
$this->composer,
695+
$this->io,
696+
false,
697+
true,
698+
new Transaction([], [$composerPackage]),
699+
);
700+
701+
$this->container
702+
->expects(self::never())
703+
->method('get');
704+
705+
/** @var list<string|array<string>> $writtenAtVerbose */
706+
$writtenAtVerbose = [];
707+
$this->io
708+
->method('write')
709+
->willReturnCallback(
710+
static function (string|array $messages, bool $newline = true, int $verbosity = IOInterface::NORMAL) use (&$writtenAtVerbose): void {
711+
if ($verbosity !== IOInterface::VERBOSE) {
712+
return;
713+
}
714+
715+
$writtenAtVerbose[] = $messages;
716+
},
717+
);
718+
719+
(new OverrideDownloadUrlInstallListener(
720+
$this->composer,
721+
$this->io,
722+
$this->container,
723+
new PieComposerRequest(
724+
$this->createMock(IOInterface::class),
725+
new TargetPlatform(
726+
OperatingSystem::NonWindows,
727+
OperatingSystemFamily::Linux,
728+
PhpBinaryPath::fromCurrentProcess(),
729+
Architecture::x86_64,
730+
ThreadSafetyMode::NonThreadSafe,
731+
1,
732+
WindowsCompiler::VC15,
733+
null,
734+
),
735+
[new RequestedPackageAndVersion('foo/bar', '^1.1')],
736+
PieOperation::Install,
737+
[],
738+
false,
739+
suppressedDownloadUrlMethods: [DownloadUrlMethod::PrePackagedBinary],
740+
),
741+
))($installerEvent);
742+
743+
self::assertSame(
744+
'https://example.com/git-archive-zip-url',
745+
$composerPackage->getDistUrl(),
746+
);
747+
self::assertSame(DownloadUrlMethod::ComposerDefaultDownload, DownloadUrlMethod::fromComposerPackage($composerPackage));
748+
self::assertContains('Suppressing download method: pre-packaged-binary', $writtenAtVerbose);
749+
}
750+
751+
public function testSuppressingAllDownloadUrlMethodsWillThrowException(): void
752+
{
753+
$composerPackage = new CompletePackage('foo/bar', '1.2.3.0', '1.2.3');
754+
$composerPackage->setDistType('zip');
755+
$composerPackage->setDistUrl('https://example.com/git-archive-zip-url');
756+
$composerPackage->setPhpExt([
757+
'extension-name' => 'foobar',
758+
'download-url-method' => ['pre-packaged-binary', 'composer-default'],
759+
]);
760+
761+
$installerEvent = new InstallerEvent(
762+
InstallerEvents::PRE_OPERATIONS_EXEC,
763+
$this->composer,
764+
$this->io,
765+
false,
766+
true,
767+
new Transaction([], [$composerPackage]),
768+
);
769+
770+
$this->container
771+
->expects(self::never())
772+
->method('get');
773+
774+
$listener = new OverrideDownloadUrlInstallListener(
775+
$this->composer,
776+
$this->io,
777+
$this->container,
778+
new PieComposerRequest(
779+
$this->createMock(IOInterface::class),
780+
new TargetPlatform(
781+
OperatingSystem::NonWindows,
782+
OperatingSystemFamily::Linux,
783+
PhpBinaryPath::fromCurrentProcess(),
784+
Architecture::x86_64,
785+
ThreadSafetyMode::NonThreadSafe,
786+
1,
787+
WindowsCompiler::VC15,
788+
null,
789+
),
790+
[new RequestedPackageAndVersion('foo/bar', '^1.1')],
791+
PieOperation::Install,
792+
[],
793+
false,
794+
suppressedDownloadUrlMethods: [DownloadUrlMethod::PrePackagedBinary, DownloadUrlMethod::ComposerDefaultDownload],
795+
),
796+
);
797+
798+
$this->expectException(AllDownloadUrlMethodsSuppressed::class);
799+
$listener($installerEvent);
800+
}
680801
}

0 commit comments

Comments
 (0)