|
13 | 13 | use Composer\IO\IOInterface; |
14 | 14 | use Composer\Package\CompletePackage; |
15 | 15 | use Composer\Package\Package; |
| 16 | +use Php\Pie\ComposerIntegration\Listeners\AllDownloadUrlMethodsSuppressed; |
16 | 17 | use Php\Pie\ComposerIntegration\Listeners\CouldNotDetermineDownloadUrlMethod; |
17 | 18 | use Php\Pie\ComposerIntegration\Listeners\OverrideDownloadUrlInstallListener; |
18 | 19 | use Php\Pie\ComposerIntegration\PieComposerRequest; |
@@ -677,4 +678,124 @@ public function testNoSelectedDownloadUrlMethodWillThrowException(): void |
677 | 678 | $this->expectExceptionMessage('Could not download foo/bar using pre-packaged-binary method: nope not found'); |
678 | 679 | $listener($installerEvent); |
679 | 680 | } |
| 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 | + } |
680 | 801 | } |
0 commit comments