Skip to content

Commit

Permalink
Merge remote-tracking branch 'upstream/main' into feat/composer-cmd
Browse files Browse the repository at this point in the history
  • Loading branch information
theofidry committed Oct 17, 2023
2 parents b4b017e + 65f8f04 commit 0236023
Show file tree
Hide file tree
Showing 3 changed files with 119 additions and 21 deletions.
21 changes: 1 addition & 20 deletions src/Composer/ComposerOrchestrator.php
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ public function getVersion(): string

$output = $getVersionProcess->getOutput();

if (1 !== preg_match('/Composer version ([^\\s]+?) /', $output, $match)) {
if (1 !== preg_match('/Composer version (\S+?) /', $output, $match)) {
throw UndetectableComposerVersion::forOutput(
$getVersionProcess,
$output,
Expand Down Expand Up @@ -108,25 +108,6 @@ public function checkVersion(): void
}
}

public function getVendorDir(): string
{
$vendorDirProcess = $this->processFactory->getVendorDirProcess();

$this->logger->info($vendorDirProcess->getCommandLine());

$vendorDirProcess->run();

if (false === $vendorDirProcess->isSuccessful()) {
throw new RuntimeException(
'Could not retrieve the vendor dir.',
0,
new ProcessFailedException($vendorDirProcess),
);
}

return trim($vendorDirProcess->getOutput());
}

public function dumpAutoload(
SymbolsRegistry $symbolsRegistry,
string $prefix,
Expand Down
3 changes: 2 additions & 1 deletion src/Composer/ComposerProcessFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,10 @@
use const KevinGH\Box\BOX_ALLOW_XDEBUG;

/**
* @final
* @private
*/
final class ComposerProcessFactory
class ComposerProcessFactory
{
public static function create(
?string $composerExecutable = null,
Expand Down
116 changes: 116 additions & 0 deletions tests/Composer/ComposerOrchestratorTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
<?php

declare(strict_types=1);

/*
* This file is part of the box project.
*
* (c) Kevin Herrera <[email protected]>
* Théo Fidry <[email protected]>
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
*/

namespace KevinGH\Box\Composer;

use Fidry\FileSystem\FileSystem;
use PHPUnit\Framework\TestCase;
use Prophecy\PhpUnit\ProphecyTrait;
use Prophecy\Prophecy\ObjectProphecy;
use Psr\Log\NullLogger;
use Symfony\Component\Process\Process;

/**
* @covers \KevinGH\Box\Composer\ComposerOrchestrator
* @internal
*/
final class ComposerOrchestratorTest extends TestCase
{
use ProphecyTrait;

/** @var ObjectProphecy<ComposerProcessFactory> */
private ObjectProphecy $processFactoryProphecy;
/** @var ObjectProphecy<Process> */
private ObjectProphecy $processProphecy;
private ComposerOrchestrator $orchestrator;

protected function setUp(): void
{
$this->processFactoryProphecy = $this->prophesize(ComposerProcessFactory::class);
$this->processProphecy = $this->prophesize(Process::class);

$this->orchestrator = new ComposerOrchestrator(
$this->processFactoryProphecy->reveal(),
new NullLogger(),
new FileSystem(),
);
}

/**
* @dataProvider outputProvider
*/
public function test_it_can_detect_the_version_from_the_process_output(
string $output,
string|UndetectableComposerVersion $expected,
): void {
$this->processFactoryProphecy
->getVersionProcess()
->willReturn($this->processProphecy->reveal());

$this->configureProcessProphecy($output);

if ($expected instanceof UndetectableComposerVersion) {
$this->expectExceptionObject($expected);
}

$actual = $this->orchestrator->getVersion();

self::assertSame($expected, $actual);
}

public static function outputProvider(): iterable
{
yield 'nominal' => [
'Composer version 2.6.3 2023-09-15 09:38:21',
'2.6.3',
];

yield 'with ANSI' => [
'Composer version 2.6.3 2023-09-15 09:38:21',
new UndetectableComposerVersion(
<<<'EOF'
Could not determine the Composer version from the following output:
Composer version 2.6.3 2023-09-15 09:38:21
EOF,
),
];

yield 'output polluted by deprecated messages' => [
<<<'EOF'
PHP Deprecated: ...
Composer version 2.6.3 2023-09-15 09:38:21
EOF,
'2.6.3',
];
}

public function configureProcessProphecy(string $output): void
{
$this->processProphecy
->getCommandLine()
->willReturn('cmd');

$this->processProphecy
->run()
->willReturn(0);

$this->processProphecy
->isSuccessful()
->willReturn(true);

$this->processProphecy
->getOutput()
->willReturn($output);
}
}

0 comments on commit 0236023

Please sign in to comment.