Skip to content

Commit 32d0515

Browse files
committed
Fixing tests who now need local repo defined in mock
1 parent 3a5a68a commit 32d0515

File tree

5 files changed

+78
-8
lines changed

5 files changed

+78
-8
lines changed

src/ComposerIntegration/PhpBinaryPathBasedPlatformRepository.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717
use function in_array;
1818
use function str_replace;
1919
use function str_starts_with;
20+
use function strlen;
2021
use function strtolower;
22+
use function substr;
2123

2224
/** @internal This is not public API for PIE, so should not be depended upon unless you accept the risk of BC breaks */
2325
class PhpBinaryPathBasedPlatformRepository extends PlatformRepository
@@ -40,7 +42,11 @@ public function __construct(PhpBinaryPath $phpBinaryPath, Composer $composer, In
4042
$extensionsBeingReplacedByPiePackages = [];
4143
foreach ($piePackages as $piePackage) {
4244
foreach ($piePackage->composerPackage()->getReplaces() as $replaceLink) {
43-
if (! str_starts_with($replaceLink->getTarget(), 'ext-') || ! ExtensionName::isValidExtensionName($replaceLink->getTarget())) {
45+
$target = $replaceLink->getTarget();
46+
if (
47+
! str_starts_with($target, 'ext-')
48+
|| ! ExtensionName::isValidExtensionName(substr($target, strlen('ext-')))
49+
) {
4450
continue;
4551
}
4652

src/ExtensionName.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ private function __construct(string $normalisedExtensionName)
4141
{
4242
if (! self::isValidExtensionName($normalisedExtensionName)) {
4343
throw new InvalidArgumentException(sprintf(
44-
'The value %s is not a valid extension name. An extension must start with a letter, and only contain alphanumeric characters or underscores',
44+
'The value "%s" is not a valid extension name. An extension must start with a letter, and only contain alphanumeric characters or underscores',
4545
$normalisedExtensionName,
4646
));
4747
}
@@ -52,7 +52,7 @@ private function __construct(string $normalisedExtensionName)
5252
/** @psalm-assert-if-true non-empty-string $extensionName */
5353
public static function isValidExtensionName(string $extensionName): bool
5454
{
55-
return preg_match(self::VALID_PACKAGE_NAME_REGEX, $extensionName) !== false;
55+
return preg_match(self::VALID_PACKAGE_NAME_REGEX, $extensionName) >= 1;
5656
}
5757

5858
public static function determineFromComposerPackage(PackageInterface $package): self

test/unit/ComposerIntegration/PhpBinaryPathBasedPlatformRepositoryTest.php

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,10 +97,9 @@ public function testPlatformRepositoryExcludesReplacedExtensions(): void
9797
{
9898
$composer = $this->createMock(Composer::class);
9999

100-
$composerPackage = $this->createMock(CompletePackage::class);
101-
$composerPackage->method('getPrettyName')->willReturn('myvendor/extension-with-replaces');
102-
$composerPackage->method('getReplaces')->willReturn([
103-
new Link('myvendor/extension-with-replaces', 'ext-replaced_extension', new Constraint('==', '*')),
100+
$composerPackage = new CompletePackage('myvendor/replaced_extension', '1.2.3.0', '1.2.3');
101+
$composerPackage->setReplaces([
102+
'ext-replaced_extension' => new Link('myvendor/replaced_extension', 'ext-replaced_extension', new Constraint('==', '*')),
104103
]);
105104
$installedPiePackages = $this->createMock(InstalledPiePackages::class);
106105
$installedPiePackages->method('allPiePackages')->willReturn([

test/unit/ComposerIntegration/VersionSelectorFactoryTest.php

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,11 @@
66

77
use Composer\Composer;
88
use Composer\Package\CompletePackage;
9+
use Composer\Package\Link;
910
use Composer\Repository\ArrayRepository;
11+
use Composer\Repository\InstalledRepositoryInterface;
1012
use Composer\Repository\RepositoryManager;
13+
use Composer\Semver\Constraint\Constraint;
1114
use Php\Pie\ComposerIntegration\VersionSelectorFactory;
1215
use Php\Pie\DependencyResolver\RequestedPackageAndVersion;
1316
use Php\Pie\Platform\Architecture;
@@ -30,15 +33,25 @@ public function testVersionSelectorFactory(): void
3033
new CompletePackage('foo/bar', '2.0.0.0', '2.0.0'),
3134
]);
3235

36+
$packageWithReplaces = new CompletePackage('already/installed2', '1.2.3.0', '1.2.3');
37+
$packageWithReplaces->setReplaces([
38+
'ext-installed2' => new Link('root/package', 'ext-installed2', new Constraint('==', '*')),
39+
]);
40+
$localRepository = $this->createMock(InstalledRepositoryInterface::class);
41+
$localRepository->method('getPackages')->willReturn([
42+
new CompletePackage('already/installed1', '1.2.3.0', '1.2.3'),
43+
$packageWithReplaces,
44+
]);
45+
3346
$repoMananger = $this->createMock(RepositoryManager::class);
3447
$repoMananger
3548
->expects(self::once())
3649
->method('getRepositories')
3750
->willReturn([$repository]);
51+
$repoMananger->method('getLocalRepository')->willReturn($localRepository);
3852

3953
$composer = $this->createMock(Composer::class);
4054
$composer
41-
->expects(self::once())
4255
->method('getRepositoryManager')
4356
->willReturn($repoMananger);
4457

test/unit/DependencyResolver/ResolveDependencyWithComposerTest.php

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,13 @@
77
use Composer\Composer;
88
use Composer\IO\NullIO;
99
use Composer\Package\CompletePackage;
10+
use Composer\Package\Link;
1011
use Composer\Repository\ArrayRepository;
1112
use Composer\Repository\CompositeRepository;
13+
use Composer\Repository\InstalledRepositoryInterface;
1214
use Composer\Repository\RepositoryFactory;
1315
use Composer\Repository\RepositoryManager;
16+
use Composer\Semver\Constraint\Constraint;
1417
use Php\Pie\ComposerIntegration\QuieterConsoleIO;
1518
use Php\Pie\DependencyResolver\IncompatibleOperatingSystemFamily;
1619
use Php\Pie\DependencyResolver\IncompatibleThreadSafetyMode;
@@ -25,20 +28,34 @@
2528
use Php\Pie\Platform\ThreadSafetyMode;
2629
use PHPUnit\Framework\Attributes\CoversClass;
2730
use PHPUnit\Framework\Attributes\DataProvider;
31+
use PHPUnit\Framework\MockObject\MockObject;
2832
use PHPUnit\Framework\TestCase;
2933

3034
#[CoversClass(ResolveDependencyWithComposer::class)]
3135
final class ResolveDependencyWithComposerTest extends TestCase
3236
{
3337
private Composer $composer;
3438

39+
private InstalledRepositoryInterface&MockObject $localRepo;
40+
3541
public function setUp(): void
3642
{
3743
parent::setUp();
3844

45+
$packageWithReplaces = new CompletePackage('already/installed2', '1.2.3.0', '1.2.3');
46+
$packageWithReplaces->setReplaces([
47+
'ext-installed2' => new Link('root/package', 'ext-installed2', new Constraint('==', '*')),
48+
]);
49+
$this->localRepo = $this->createMock(InstalledRepositoryInterface::class);
50+
$this->localRepo->method('getPackages')->willReturn([
51+
new CompletePackage('already/installed1', '1.2.3.0', '1.2.3'),
52+
$packageWithReplaces,
53+
]);
54+
3955
$repoManager = $this->createMock(RepositoryManager::class);
4056
$repoManager->method('getRepositories')
4157
->willReturn([new CompositeRepository(RepositoryFactory::defaultReposWithDefaultManager(new NullIO()))]);
58+
$repoManager->method('getLocalRepository')->willReturn($this->localRepo);
4259

4360
$this->composer = $this->createMock(Composer::class);
4461
$this->composer->method('getRepositoryManager')
@@ -175,6 +192,7 @@ public function testZtsOnlyPackageCannotBeInstalledOnNtsSystem(): void
175192
$repoManager = $this->createMock(RepositoryManager::class);
176193
$repoManager->method('getRepositories')
177194
->willReturn([new ArrayRepository([$pkg])]);
195+
$repoManager->method('getLocalRepository')->willReturn($this->localRepo);
178196

179197
$this->composer = $this->createMock(Composer::class);
180198
$this->composer->method('getRepositoryManager')
@@ -222,6 +240,7 @@ public function testNtsOnlyPackageCannotBeInstalledOnZtsSystem(): void
222240
$repoManager = $this->createMock(RepositoryManager::class);
223241
$repoManager->method('getRepositories')
224242
->willReturn([new ArrayRepository([$pkg])]);
243+
$repoManager->method('getLocalRepository')->willReturn($this->localRepo);
225244

226245
$this->composer = $this->createMock(Composer::class);
227246
$this->composer->method('getRepositoryManager')
@@ -269,6 +288,7 @@ public function testExtensionCanOnlyBeInstalledIfOsFamilyIsCompatible(): void
269288
$repoManager = $this->createMock(RepositoryManager::class);
270289
$repoManager->method('getRepositories')
271290
->willReturn([new ArrayRepository([$pkg])]);
291+
$repoManager->method('getLocalRepository')->willReturn($this->localRepo);
272292

273293
$this->composer = $this->createMock(Composer::class);
274294
$this->composer->method('getRepositoryManager')
@@ -316,6 +336,7 @@ public function testExtensionCanOnlyBeInstalledIfOsFamilyIsNotInCompatible(): vo
316336
$repoManager = $this->createMock(RepositoryManager::class);
317337
$repoManager->method('getRepositories')
318338
->willReturn([new ArrayRepository([$pkg])]);
339+
$repoManager->method('getLocalRepository')->willReturn($this->localRepo);
319340

320341
$this->composer = $this->createMock(Composer::class);
321342
$this->composer->method('getRepositoryManager')
@@ -350,4 +371,35 @@ public function testExtensionCanOnlyBeInstalledIfOsFamilyIsNotInCompatible(): vo
350371
false,
351372
);
352373
}
374+
375+
public function testPackageThatCanBeResolvedWithReplaceConflict(): void
376+
{
377+
$phpBinaryPath = $this->createMock(PhpBinaryPath::class);
378+
$phpBinaryPath->expects(self::any())
379+
->method('version')
380+
->willReturn('8.3.0');
381+
$phpBinaryPath->expects(self::any())
382+
->method('extensions')
383+
->willReturn([
384+
'installed1' => '1.2.3',
385+
'installed2' => '1.2.3',
386+
]);
387+
388+
$targetPlatform = new TargetPlatform(
389+
OperatingSystem::NonWindows,
390+
OperatingSystemFamily::Linux,
391+
$phpBinaryPath,
392+
Architecture::x86_64,
393+
ThreadSafetyMode::ThreadSafe,
394+
1,
395+
null,
396+
);
397+
398+
$package = (new ResolveDependencyWithComposer(
399+
$this->createMock(QuieterConsoleIO::class),
400+
))($this->composer, $targetPlatform, new RequestedPackageAndVersion('asgrim/example-pie-extension', '^1.0'), false);
401+
402+
self::assertSame('asgrim/example-pie-extension', $package->name());
403+
self::assertStringStartsWith('1.', $package->version());
404+
}
353405
}

0 commit comments

Comments
 (0)