diff --git a/test/unit/ComposerIntegration/Listeners/OverrideDownloadUrlInstallListenerTest.php b/test/unit/ComposerIntegration/Listeners/OverrideDownloadUrlInstallListenerTest.php index 237cbb6..859bdb9 100644 --- a/test/unit/ComposerIntegration/Listeners/OverrideDownloadUrlInstallListenerTest.php +++ b/test/unit/ComposerIntegration/Listeners/OverrideDownloadUrlInstallListenerTest.php @@ -11,6 +11,7 @@ use Composer\Installer\InstallerEvents; use Composer\IO\IOInterface; use Composer\Package\CompletePackage; +use Composer\Package\Package; use Php\Pie\ComposerIntegration\Listeners\OverrideDownloadUrlInstallListener; use Php\Pie\ComposerIntegration\PieComposerRequest; use Php\Pie\ComposerIntegration\PieOperation; @@ -87,17 +88,140 @@ public function testEventListenerRegistration(): void public function testNonInstallOperationsAreIgnored(): void { - self::markTestIncomplete('todo'); // @todo + $composerPackage = new CompletePackage('foo/bar', '1.2.3.0', '1.2.3'); + $composerPackage->setDistUrl('https://example.com/git-archive-zip-url'); + + /** + * @psalm-suppress InternalClass + * @psalm-suppress InternalMethod + */ + $installerEvent = new InstallerEvent( + InstallerEvents::PRE_OPERATIONS_EXEC, + $this->composer, + $this->io, + false, + true, + new Transaction([$composerPackage], []), + ); + + $this->container + ->expects(self::never()) + ->method('get'); + + (new OverrideDownloadUrlInstallListener( + $this->composer, + $this->io, + $this->container, + new PieComposerRequest( + $this->createMock(OutputInterface::class), + new TargetPlatform( + OperatingSystem::NonWindows, + OperatingSystemFamily::Linux, + PhpBinaryPath::fromCurrentProcess(), + Architecture::x86_64, + ThreadSafetyMode::NonThreadSafe, + 1, + WindowsCompiler::VC15, + ), + new RequestedPackageAndVersion('foo/bar', '^1.1'), + PieOperation::Install, + [], + null, + false, + ), + ))($installerEvent); } public function testNonCompletePackagesAreIgnored(): void { - self::markTestIncomplete('todo'); // @todo + $composerPackage = new Package('foo/bar', '1.2.3.0', '1.2.3'); + $composerPackage->setDistUrl('https://example.com/git-archive-zip-url'); + + /** + * @psalm-suppress InternalClass + * @psalm-suppress InternalMethod + */ + $installerEvent = new InstallerEvent( + InstallerEvents::PRE_OPERATIONS_EXEC, + $this->composer, + $this->io, + false, + true, + new Transaction([], [$composerPackage]), + ); + + $this->container + ->expects(self::never()) + ->method('get'); + + (new OverrideDownloadUrlInstallListener( + $this->composer, + $this->io, + $this->container, + new PieComposerRequest( + $this->createMock(OutputInterface::class), + new TargetPlatform( + OperatingSystem::NonWindows, + OperatingSystemFamily::Linux, + PhpBinaryPath::fromCurrentProcess(), + Architecture::x86_64, + ThreadSafetyMode::NonThreadSafe, + 1, + WindowsCompiler::VC15, + ), + new RequestedPackageAndVersion('foo/bar', '^1.1'), + PieOperation::Install, + [], + null, + false, + ), + ))($installerEvent); } public function testInstallOperationsForDifferentPackagesAreIgnored(): void { - self::markTestIncomplete('todo'); // @todo + $composerPackage = new CompletePackage('different/package', '1.2.3.0', '1.2.3'); + $composerPackage->setDistUrl('https://example.com/git-archive-zip-url'); + + /** + * @psalm-suppress InternalClass + * @psalm-suppress InternalMethod + */ + $installerEvent = new InstallerEvent( + InstallerEvents::PRE_OPERATIONS_EXEC, + $this->composer, + $this->io, + false, + true, + new Transaction([], [$composerPackage]), + ); + + $this->container + ->expects(self::never()) + ->method('get'); + + (new OverrideDownloadUrlInstallListener( + $this->composer, + $this->io, + $this->container, + new PieComposerRequest( + $this->createMock(OutputInterface::class), + new TargetPlatform( + OperatingSystem::NonWindows, + OperatingSystemFamily::Linux, + PhpBinaryPath::fromCurrentProcess(), + Architecture::x86_64, + ThreadSafetyMode::NonThreadSafe, + 1, + WindowsCompiler::VC15, + ), + new RequestedPackageAndVersion('foo/bar', '^1.1'), + PieOperation::Install, + [], + null, + false, + ), + ))($installerEvent); } public function testWindowsUrlInstallerDoesNotRunOnNonWindows(): void diff --git a/test/unit/Downloading/DownloadUrlMethodTest.php b/test/unit/Downloading/DownloadUrlMethodTest.php index 53da6c5..f48b8e8 100644 --- a/test/unit/Downloading/DownloadUrlMethodTest.php +++ b/test/unit/Downloading/DownloadUrlMethodTest.php @@ -4,7 +4,19 @@ namespace Php\PieUnitTest\Downloading; +use Composer\Package\CompletePackage; +use Composer\Package\CompletePackageInterface; +use Php\Pie\DependencyResolver\Package; use Php\Pie\Downloading\DownloadUrlMethod; +use Php\Pie\ExtensionName; +use Php\Pie\ExtensionType; +use Php\Pie\Platform\Architecture; +use Php\Pie\Platform\OperatingSystem; +use Php\Pie\Platform\OperatingSystemFamily; +use Php\Pie\Platform\TargetPhp\PhpBinaryPath; +use Php\Pie\Platform\TargetPlatform; +use Php\Pie\Platform\ThreadSafetyMode; +use Php\Pie\Platform\WindowsCompiler; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\TestCase; @@ -13,16 +25,101 @@ final class DownloadUrlMethodTest extends TestCase { public function testWindowsPackages(): void { - self::markTestIncomplete('todo'); // @todo + $package = new Package( + $this->createMock(CompletePackageInterface::class), + ExtensionType::PhpModule, + ExtensionName::normaliseFromString('foo'), + 'foo/foo', + '1.2.3', + null, + ); + + $phpBinaryPath = $this->createMock(PhpBinaryPath::class); + $phpBinaryPath + ->method('majorMinorVersion') + ->willReturn('8.1'); + + $targetPlatform = new TargetPlatform( + OperatingSystem::Windows, + OperatingSystemFamily::Windows, + $phpBinaryPath, + Architecture::x86_64, + ThreadSafetyMode::NonThreadSafe, + 1, + WindowsCompiler::VC15, + ); + + $downloadUrlMethod = DownloadUrlMethod::fromPackage($package, $targetPlatform); + + self::assertSame(DownloadUrlMethod::WindowsBinaryDownload, $downloadUrlMethod); + + self::assertSame( + [ + 'php_foo-1.2.3-8.1-nts-vc15-x86_64.zip', + 'php_foo-1.2.3-8.1-vc15-nts-x86_64.zip', + ], + $downloadUrlMethod->possibleAssetNames($package, $targetPlatform), + ); } public function testPrePackagedSourceDownloads(): void { - self::markTestIncomplete('todo'); // @todo + $composerPackage = $this->createMock(CompletePackage::class); + $composerPackage->method('getPrettyName')->willReturn('foo/bar'); + $composerPackage->method('getPrettyVersion')->willReturn('1.2.3'); + $composerPackage->method('getType')->willReturn('php-ext'); + $composerPackage->method('getPhpExt')->willReturn(['download-url-method' => 'pre-packaged-source']); + + $package = Package::fromComposerCompletePackage($composerPackage); + + $targetPlatform = new TargetPlatform( + OperatingSystem::NonWindows, + OperatingSystemFamily::Linux, + PhpBinaryPath::fromCurrentProcess(), + Architecture::x86_64, + ThreadSafetyMode::NonThreadSafe, + 1, + null, + ); + + $downloadUrlMethod = DownloadUrlMethod::fromPackage($package, $targetPlatform); + + self::assertSame(DownloadUrlMethod::PrePackagedSourceDownload, $downloadUrlMethod); + + self::assertSame( + [ + 'php_bar-1.2.3-src.tgz', + 'php_bar-1.2.3-src.zip', + ], + $downloadUrlMethod->possibleAssetNames($package, $targetPlatform), + ); } public function testComposerDefaultDownload(): void { - self::markTestIncomplete('todo'); // @todo + $package = new Package( + $this->createMock(CompletePackageInterface::class), + ExtensionType::PhpModule, + ExtensionName::normaliseFromString('foo'), + 'foo/foo', + '1.2.3', + null, + ); + + $targetPlatform = new TargetPlatform( + OperatingSystem::NonWindows, + OperatingSystemFamily::Linux, + PhpBinaryPath::fromCurrentProcess(), + Architecture::x86_64, + ThreadSafetyMode::NonThreadSafe, + 1, + null, + ); + + $downloadUrlMethod = DownloadUrlMethod::fromPackage($package, $targetPlatform); + + self::assertSame(DownloadUrlMethod::ComposerDefaultDownload, $downloadUrlMethod); + + self::assertNull($downloadUrlMethod->possibleAssetNames($package, $targetPlatform)); } } diff --git a/test/unit/Platform/PrePackagedSourceAssetNameTest.php b/test/unit/Platform/PrePackagedSourceAssetNameTest.php index 426aebc..5a47f14 100644 --- a/test/unit/Platform/PrePackagedSourceAssetNameTest.php +++ b/test/unit/Platform/PrePackagedSourceAssetNameTest.php @@ -4,6 +4,10 @@ namespace Php\PieUnitTest\Platform; +use Composer\Package\CompletePackageInterface; +use Php\Pie\DependencyResolver\Package; +use Php\Pie\ExtensionName; +use Php\Pie\ExtensionType; use Php\Pie\Platform\PrePackagedSourceAssetName; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\TestCase; @@ -13,6 +17,21 @@ final class PrePackagedSourceAssetNameTest extends TestCase { public function testPackageNames(): void { - self::markTestIncomplete('todo'); // @todo + self::assertSame( + [ + 'php_foobar-1.2.3-src.tgz', + 'php_foobar-1.2.3-src.zip', + ], + PrePackagedSourceAssetName::packageNames( + new Package( + $this->createMock(CompletePackageInterface::class), + ExtensionType::PhpModule, + ExtensionName::normaliseFromString('foobar'), + 'foo/bar', + '1.2.3', + null, + ), + ), + ); } }