From b9b9615640fa7a26630485c7db766893ce59ba18 Mon Sep 17 00:00:00 2001 From: Natsuki Ikeguchi Date: Sat, 22 Jul 2023 17:14:21 +0900 Subject: [PATCH 1/3] feat: Introduce console reporter, enabled by default --- config/reporters.yaml | 10 ++ config/usecases.yaml | 3 +- src/Command/ScanCommand.php | 110 +++---------------- src/Exception/InvalidReporterException.php | 17 +++ src/Reporter/Console/ConsoleReporter.php | 117 +++++++++++++++++++++ src/Reporter/GitHub/GitHubReporter.php | 7 +- src/Reporter/ReporterInterface.php | 5 +- src/Reporter/ReporterResolver.php | 41 ++++++++ src/UseCase/ReportUseCase.php | 17 +-- 9 files changed, 219 insertions(+), 108 deletions(-) create mode 100644 src/Exception/InvalidReporterException.php create mode 100644 src/Reporter/Console/ConsoleReporter.php create mode 100644 src/Reporter/ReporterResolver.php diff --git a/config/reporters.yaml b/config/reporters.yaml index dc300b4..0e9dcc0 100644 --- a/config/reporters.yaml +++ b/config/reporters.yaml @@ -18,3 +18,13 @@ services: arguments: $markdownBuilder: '@Siketyan\Loxcan\Reporter\GitHub\GitHubMarkdownBuilder' $client: '@Siketyan\Loxcan\Reporter\GitHub\GitHubClient' + tags: + - 'loxcan.reporters' + + Siketyan\Loxcan\Reporter\Console\ConsoleReporter: + tags: + - 'loxcan.reporters' + + Siketyan\Loxcan\Reporter\ReporterResolver: + arguments: + $reporters: !tagged 'loxcan.reporters' diff --git a/config/usecases.yaml b/config/usecases.yaml index a0a7096..02647ff 100644 --- a/config/usecases.yaml +++ b/config/usecases.yaml @@ -7,5 +7,4 @@ services: Siketyan\Loxcan\UseCase\ReportUseCase: arguments: - $reporters: - - '@Siketyan\Loxcan\Reporter\GitHub\GitHubReporter' + $reporterResolver: '@Siketyan\Loxcan\Reporter\ReporterResolver' diff --git a/src/Command/ScanCommand.php b/src/Command/ScanCommand.php index fef3b1f..6cfa9bb 100644 --- a/src/Command/ScanCommand.php +++ b/src/Command/ScanCommand.php @@ -5,17 +5,15 @@ namespace Siketyan\Loxcan\Command; use Eloquent\Pathogen\Path; -use JetBrains\PhpStorm\Pure; -use Siketyan\Loxcan\Model\DependencyCollectionDiff; use Siketyan\Loxcan\Model\Repository; +use Siketyan\Loxcan\Reporter\Console\ConsoleReporter; use Siketyan\Loxcan\UseCase\ReportUseCase; use Siketyan\Loxcan\UseCase\ScanUseCase; -use Siketyan\Loxcan\Versioning\VersionDiff; use Symfony\Component\Console\Attribute\AsCommand; -use Symfony\Component\Console\Color; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Style\SymfonyStyle; @@ -34,6 +32,13 @@ protected function configure(): void $this ->addArgument('base', InputArgument::OPTIONAL) ->addArgument('head', InputArgument::OPTIONAL) + ->addOption( + 'reporter', + 'r', + InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, + 'Reporter names to use for exporting diffs found.', + ['console'], + ) ; } @@ -47,102 +52,15 @@ public function execute(InputInterface $input, OutputInterface $output): int $base = $input->getArgument('base'); /** @var null|string $head */ $head = $input->getArgument('head'); + /** @var list $reporters */ + $reporters = $input->getOption('reporter'); $diffs = $this->useCase->scan($repository, $base, $head); - if ($diffs === []) { - $io->writeln( - '✨ No lock file changes found, looks shine!', - ); - } else { - $this->printDiffs($io, $diffs); - } - - $this->reportUseCase->report($diffs); + $this->reportUseCase->report($diffs, $reporters, [ + ConsoleReporter::CONTEXT_SYMFONY_IO => $io, + ]); return 0; } - - /** - * @param array $diffs - */ - private function printDiffs(SymfonyStyle $io, array $diffs): void - { - foreach ($diffs as $file => $diff) { - $io->section($file); - - if ($diff->count() === 0) { - $io->writeln( - '🔄 The file was updated, but no dependency changes found.', - ); - - continue; - } - - $rows = []; - - foreach ($diff->getAdded() as $dependency) { - $rows[] = [ - '➕', - $dependency->getPackage()->getName(), - '', - $dependency->getVersion(), - ]; - } - - foreach ($diff->getUpdated() as $dependencyDiff) { - $versionDiff = $dependencyDiff->getVersionDiff(); - $rows[] = [ - $this->getVersionDiffTypeEmoji($versionDiff), - $this->emphasizeBreakingChanges($versionDiff, $dependencyDiff->getPackage()->getName()), - $this->emphasizeBreakingChanges($versionDiff, (string) $versionDiff->getBefore()), - $this->emphasizeBreakingChanges($versionDiff, (string) $versionDiff->getAfter()), - ]; - } - - foreach ($diff->getRemoved() as $dependency) { - $rows[] = [ - '➖', - $dependency->getPackage()->getName(), - $dependency->getVersion(), - '', - ]; - } - - $io->table( - ['', 'Package', 'Before', 'After'], - $rows, - ); - } - } - - #[Pure] - private function getVersionDiffTypeEmoji(VersionDiff $diff): string - { - switch ($diff->getType()) { - case VersionDiff::UPGRADED: - return '⬆️'; - - case VersionDiff::DOWNGRADED: - return '⬇️'; - - case VersionDiff::CHANGED: - return '💥'; - - default: - case VersionDiff::UNKNOWN: - return '🔄'; - } - } - - private function emphasizeBreakingChanges(VersionDiff $diff, string $str): string - { - $emphasize = new Color('bright-white', '', ['bold']); - - if (!$diff->isCompatible()) { - return $emphasize->apply($str); - } - - return $str; - } } diff --git a/src/Exception/InvalidReporterException.php b/src/Exception/InvalidReporterException.php new file mode 100644 index 0000000..a2906d0 --- /dev/null +++ b/src/Exception/InvalidReporterException.php @@ -0,0 +1,17 @@ +writeln( + '✨ No lock file changes found, looks shine!', + ); + + return; + } + + foreach ($diffs as $file => $diff) { + $io->section($file); + + if ($diff->count() === 0) { + $io->writeln( + '🔄 The file was updated, but no dependency changes found.', + ); + + continue; + } + + $rows = []; + + foreach ($diff->getAdded() as $dependency) { + $rows[] = [ + '➕', + $dependency->getPackage()->getName(), + '', + $dependency->getVersion(), + ]; + } + + foreach ($diff->getUpdated() as $dependencyDiff) { + $versionDiff = $dependencyDiff->getVersionDiff(); + $rows[] = [ + $this->getVersionDiffTypeEmoji($versionDiff), + $this->emphasizeBreakingChanges($versionDiff, $dependencyDiff->getPackage()->getName()), + $this->emphasizeBreakingChanges($versionDiff, (string) $versionDiff->getBefore()), + $this->emphasizeBreakingChanges($versionDiff, (string) $versionDiff->getAfter()), + ]; + } + + foreach ($diff->getRemoved() as $dependency) { + $rows[] = [ + '➖', + $dependency->getPackage()->getName(), + $dependency->getVersion(), + '', + ]; + } + + $io->table( + ['', 'Package', 'Before', 'After'], + $rows, + ); + } + } + + #[Pure] + private function getVersionDiffTypeEmoji(VersionDiff $diff): string + { + switch ($diff->getType()) { + case VersionDiff::UPGRADED: + return '⬆️'; + + case VersionDiff::DOWNGRADED: + return '⬇️'; + + case VersionDiff::CHANGED: + return '💥'; + + default: + case VersionDiff::UNKNOWN: + return '🔄'; + } + } + + private function emphasizeBreakingChanges(VersionDiff $diff, string $str): string + { + $emphasize = new Color('bright-white', '', ['bold']); + + if (!$diff->isCompatible()) { + return $emphasize->apply($str); + } + + return $str; + } + + public function supports(): bool + { + return true; + } + + public function name(): string + { + return 'console'; + } +} diff --git a/src/Reporter/GitHub/GitHubReporter.php b/src/Reporter/GitHub/GitHubReporter.php index aa94ee0..69b7675 100644 --- a/src/Reporter/GitHub/GitHubReporter.php +++ b/src/Reporter/GitHub/GitHubReporter.php @@ -20,7 +20,7 @@ public function __construct( /** * @throws \JsonException */ - public function report(array $diffs): void + public function report(array $diffs, array $context = []): void { $owner = $this->getEnv('LOXCAN_REPORTER_GITHUB_OWNER'); $repo = $this->getEnv('LOXCAN_REPORTER_GITHUB_REPO'); @@ -54,4 +54,9 @@ public function supports(): bool return \is_string($env) && $env !== ''; } + + public function name(): string + { + return 'github'; + } } diff --git a/src/Reporter/ReporterInterface.php b/src/Reporter/ReporterInterface.php index a2aa583..8802e29 100644 --- a/src/Reporter/ReporterInterface.php +++ b/src/Reporter/ReporterInterface.php @@ -10,8 +10,11 @@ interface ReporterInterface { /** * @param array $diffs + * @param array $context */ - public function report(array $diffs): void; + public function report(array $diffs, array $context = []): void; public function supports(): bool; + + public function name(): string; } diff --git a/src/Reporter/ReporterResolver.php b/src/Reporter/ReporterResolver.php new file mode 100644 index 0000000..af4a6fb --- /dev/null +++ b/src/Reporter/ReporterResolver.php @@ -0,0 +1,41 @@ + $reporters + */ + public function __construct( + private readonly iterable $reporters, + ) { + } + + public function resolve(string $name): ReporterInterface + { + foreach ($this->reporters as $reporter) { + if ($reporter->name() === $name) { + return $reporter; + } + } + + throw new InvalidReporterException($name); + } + + /** + * @param iterable $names + * + * @return \Generator + */ + public function resolveAll(iterable $names): \Generator + { + foreach ($names as $name) { + yield $this->resolve($name); + } + } +} diff --git a/src/UseCase/ReportUseCase.php b/src/UseCase/ReportUseCase.php index f433e8a..af1fc81 100644 --- a/src/UseCase/ReportUseCase.php +++ b/src/UseCase/ReportUseCase.php @@ -5,26 +5,27 @@ namespace Siketyan\Loxcan\UseCase; use Siketyan\Loxcan\Model\DependencyCollectionDiff; -use Siketyan\Loxcan\Reporter\ReporterInterface; +use Siketyan\Loxcan\Reporter\ReporterResolver; class ReportUseCase { - /** - * @param list $reporters - */ public function __construct( - private readonly array $reporters, + private readonly ReporterResolver $reporterResolver, ) { } /** * @param array $diffs + * @param list $reporters + * @param array $context */ - public function report(array $diffs): void + public function report(array $diffs, array $reporters, array $context): void { - foreach ($this->reporters as $reporter) { + $reporters = $this->reporterResolver->resolveAll($reporters); + + foreach ($reporters as $reporter) { if ($reporter->supports()) { - $reporter->report($diffs); + $reporter->report($diffs, $context); } } } From 5b9d24fc1d84356092f80c5a3868f055df3f896d Mon Sep 17 00:00:00 2001 From: Natsuki Ikeguchi Date: Sat, 22 Jul 2023 17:24:33 +0900 Subject: [PATCH 2/3] feat: Support markdown flavour on console reporter --- config/reporters.yaml | 6 ++++-- src/Command/ScanCommand.php | 12 +++++++++++- src/Reporter/Console/ConsoleReporter.php | 15 +++++++++++++++ src/Reporter/GitHub/GitHubReporter.php | 3 ++- ...HubMarkdownBuilder.php => MarkdownBuilder.php} | 4 ++-- .../Reporter/GitHub/GitHubMarkdownBuilderTest.php | 5 +++-- tests/Reporter/GitHub/GitHubReporterTest.php | 5 +++-- 7 files changed, 40 insertions(+), 10 deletions(-) rename src/Reporter/{GitHub/GitHubMarkdownBuilder.php => MarkdownBuilder.php} (97%) diff --git a/config/reporters.yaml b/config/reporters.yaml index 0e9dcc0..dd19702 100644 --- a/config/reporters.yaml +++ b/config/reporters.yaml @@ -4,7 +4,7 @@ services: arguments: - 'base_uri': 'https://api.github.com/' - Siketyan\Loxcan\Reporter\GitHub\GitHubMarkdownBuilder: ~ + Siketyan\Loxcan\Reporter\MarkdownBuilder: ~ Siketyan\Loxcan\Reporter\GitHub\GitHubUserPool: shared: true @@ -16,12 +16,14 @@ services: Siketyan\Loxcan\Reporter\GitHub\GitHubReporter: arguments: - $markdownBuilder: '@Siketyan\Loxcan\Reporter\GitHub\GitHubMarkdownBuilder' + $markdownBuilder: '@Siketyan\Loxcan\Reporter\MarkdownBuilder' $client: '@Siketyan\Loxcan\Reporter\GitHub\GitHubClient' tags: - 'loxcan.reporters' Siketyan\Loxcan\Reporter\Console\ConsoleReporter: + arguments: + $markdownBuilder: '@Siketyan\Loxcan\Reporter\MarkdownBuilder' tags: - 'loxcan.reporters' diff --git a/src/Command/ScanCommand.php b/src/Command/ScanCommand.php index 6cfa9bb..151f82b 100644 --- a/src/Command/ScanCommand.php +++ b/src/Command/ScanCommand.php @@ -36,9 +36,16 @@ protected function configure(): void 'reporter', 'r', InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, - 'Reporter names to use for exporting diffs found.', + 'Reporter names to use for exporting diffs found. [available: console, github]', ['console'], ) + ->addOption( + 'flavor', + null, + InputOption::VALUE_REQUIRED, + 'Output flavor for console exporter. [available: pretty, markdown]', + 'pretty', + ) ; } @@ -54,11 +61,14 @@ public function execute(InputInterface $input, OutputInterface $output): int $head = $input->getArgument('head'); /** @var list $reporters */ $reporters = $input->getOption('reporter'); + /** @var string $flavor $flavor */ + $flavor = $input->getOption('flavor'); $diffs = $this->useCase->scan($repository, $base, $head); $this->reportUseCase->report($diffs, $reporters, [ ConsoleReporter::CONTEXT_SYMFONY_IO => $io, + ConsoleReporter::CONTEXT_FLAVOR => $flavor, ]); return 0; diff --git a/src/Reporter/Console/ConsoleReporter.php b/src/Reporter/Console/ConsoleReporter.php index fdbd4e6..b65b18e 100644 --- a/src/Reporter/Console/ConsoleReporter.php +++ b/src/Reporter/Console/ConsoleReporter.php @@ -5,6 +5,7 @@ namespace Siketyan\Loxcan\Reporter\Console; use JetBrains\PhpStorm\Pure; +use Siketyan\Loxcan\Reporter\MarkdownBuilder; use Siketyan\Loxcan\Reporter\ReporterInterface; use Siketyan\Loxcan\Versioning\VersionDiff; use Symfony\Component\Console\Color; @@ -13,6 +14,14 @@ class ConsoleReporter implements ReporterInterface { public const CONTEXT_SYMFONY_IO = 'console.symfony-style'; + public const CONTEXT_FLAVOR = 'console.flavor'; + + public const FLAVOR_MARKDOWN = 'markdown'; + + public function __construct( + private readonly MarkdownBuilder $markdownBuilder, + ) { + } public function report(array $diffs, array $context = []): void { @@ -27,6 +36,12 @@ public function report(array $diffs, array $context = []): void return; } + if (($context[self::CONTEXT_FLAVOR] ?? null) === self::FLAVOR_MARKDOWN) { + echo $this->markdownBuilder->build($diffs) . \PHP_EOL; + + return; + } + foreach ($diffs as $file => $diff) { $io->section($file); diff --git a/src/Reporter/GitHub/GitHubReporter.php b/src/Reporter/GitHub/GitHubReporter.php index 69b7675..0b5ec3d 100644 --- a/src/Reporter/GitHub/GitHubReporter.php +++ b/src/Reporter/GitHub/GitHubReporter.php @@ -5,6 +5,7 @@ namespace Siketyan\Loxcan\Reporter\GitHub; use Siketyan\Loxcan\Reporter\EnvironmentTrait; +use Siketyan\Loxcan\Reporter\MarkdownBuilder; use Siketyan\Loxcan\Reporter\ReporterInterface; class GitHubReporter implements ReporterInterface @@ -12,7 +13,7 @@ class GitHubReporter implements ReporterInterface use EnvironmentTrait; public function __construct( - private readonly GitHubMarkdownBuilder $markdownBuilder, + private readonly MarkdownBuilder $markdownBuilder, private readonly GitHubClient $client, ) { } diff --git a/src/Reporter/GitHub/GitHubMarkdownBuilder.php b/src/Reporter/MarkdownBuilder.php similarity index 97% rename from src/Reporter/GitHub/GitHubMarkdownBuilder.php rename to src/Reporter/MarkdownBuilder.php index 01e9917..c71d609 100644 --- a/src/Reporter/GitHub/GitHubMarkdownBuilder.php +++ b/src/Reporter/MarkdownBuilder.php @@ -2,13 +2,13 @@ declare(strict_types=1); -namespace Siketyan\Loxcan\Reporter\GitHub; +namespace Siketyan\Loxcan\Reporter; use JetBrains\PhpStorm\Pure; use Siketyan\Loxcan\Model\DependencyCollectionDiff; use Siketyan\Loxcan\Versioning\VersionDiff; -class GitHubMarkdownBuilder +class MarkdownBuilder { /** * @param array $diffs diff --git a/tests/Reporter/GitHub/GitHubMarkdownBuilderTest.php b/tests/Reporter/GitHub/GitHubMarkdownBuilderTest.php index f48a8c9..72b297a 100644 --- a/tests/Reporter/GitHub/GitHubMarkdownBuilderTest.php +++ b/tests/Reporter/GitHub/GitHubMarkdownBuilderTest.php @@ -10,6 +10,7 @@ use Siketyan\Loxcan\Model\DependencyCollectionDiff; use Siketyan\Loxcan\Model\DependencyDiff; use Siketyan\Loxcan\Model\Package; +use Siketyan\Loxcan\Reporter\MarkdownBuilder; use Siketyan\Loxcan\Versioning\Simple\SimpleVersion; use Siketyan\Loxcan\Versioning\VersionDiff; @@ -17,11 +18,11 @@ class GitHubMarkdownBuilderTest extends TestCase { use ProphecyTrait; - private GitHubMarkdownBuilder $builder; + private MarkdownBuilder $builder; protected function setUp(): void { - $this->builder = new GitHubMarkdownBuilder(); + $this->builder = new MarkdownBuilder(); } public function test(): void diff --git a/tests/Reporter/GitHub/GitHubReporterTest.php b/tests/Reporter/GitHub/GitHubReporterTest.php index 04de8b8..3d13314 100644 --- a/tests/Reporter/GitHub/GitHubReporterTest.php +++ b/tests/Reporter/GitHub/GitHubReporterTest.php @@ -8,13 +8,14 @@ use Prophecy\PhpUnit\ProphecyTrait; use Prophecy\Prophecy\ObjectProphecy; use Siketyan\Loxcan\Model\DependencyCollectionDiff; +use Siketyan\Loxcan\Reporter\MarkdownBuilder; class GitHubReporterTest extends TestCase { use ProphecyTrait; /** - * @var ObjectProphecy + * @var ObjectProphecy */ private ObjectProphecy $markdownBuilder; @@ -27,7 +28,7 @@ class GitHubReporterTest extends TestCase protected function setUp(): void { - $this->markdownBuilder = $this->prophesize(GitHubMarkdownBuilder::class); + $this->markdownBuilder = $this->prophesize(MarkdownBuilder::class); $this->client = $this->prophesize(GitHubClient::class); $this->reporter = new GitHubReporter( From b6334d6761b398267ab52bc8cb3eb17c6b2e4a25 Mon Sep 17 00:00:00 2001 From: Natsuki Ikeguchi Date: Sat, 22 Jul 2023 17:34:30 +0900 Subject: [PATCH 3/3] test: Fix tests for console exporter --- tests/Command/ScanCommandTest.php | 119 +-------------- .../Reporter/Console/ConsoleReporterTest.php | 142 ++++++++++++++++++ 2 files changed, 146 insertions(+), 115 deletions(-) create mode 100644 tests/Reporter/Console/ConsoleReporterTest.php diff --git a/tests/Command/ScanCommandTest.php b/tests/Command/ScanCommandTest.php index b2bd430..3b25a86 100644 --- a/tests/Command/ScanCommandTest.php +++ b/tests/Command/ScanCommandTest.php @@ -8,15 +8,10 @@ use Prophecy\Argument; use Prophecy\PhpUnit\ProphecyTrait; use Prophecy\Prophecy\ObjectProphecy; -use Siketyan\Loxcan\Model\Dependency; use Siketyan\Loxcan\Model\DependencyCollectionDiff; -use Siketyan\Loxcan\Model\DependencyDiff; -use Siketyan\Loxcan\Model\Package; use Siketyan\Loxcan\Model\Repository; use Siketyan\Loxcan\UseCase\ReportUseCase; use Siketyan\Loxcan\UseCase\ScanUseCase; -use Siketyan\Loxcan\Versioning\Simple\SimpleVersion; -use Siketyan\Loxcan\Versioning\VersionDiff; use Symfony\Component\Console\Tester\CommandTester; class ScanCommandTest extends TestCase @@ -51,21 +46,9 @@ protected function setUp(): void public function test(): void { $diff = $this->prophesize(DependencyCollectionDiff::class); - $diff->count()->willReturn(5); - $diff->getAdded()->willReturn([$this->createDependency('added', 'v1.2.3')]); - $diff->getRemoved()->willReturn([$this->createDependency('removed', 'v3.2.1')]); - $diff->getUpdated()->willReturn([ - $this->createDependencyDiff('upgraded', 'v1.1.1', 'v2.2.2', VersionDiff::UPGRADED), - $this->createDependencyDiff('downgraded', 'v4.4.4', 'v3.3.3', VersionDiff::DOWNGRADED), - $this->createDependencyDiff('unknown', 'v5.5.5', 'v5.5.5', VersionDiff::UNKNOWN), - ]); - - $emptyDiff = $this->prophesize(DependencyCollectionDiff::class); - $emptyDiff->count()->willReturn(0); - $diffs = [ 'foo.lock' => $diff->reveal(), - 'bar.lock' => $emptyDiff->reveal(), + 'bar.lock' => $diff->reveal(), ]; $this->scanUseCase @@ -75,111 +58,17 @@ public function test(): void ; $this->reportUseCase - ->report($diffs) - ->shouldBeCalledOnce() - ; - - $exitCode = $this->tester->execute([ - 'base' => 'foo', - 'head' => 'bar', - ]); - - $this->assertSame(0, $exitCode); - $this->assertSame( - <<<'EOS' - - foo.lock - -------- - - ---- ------------ -------- -------- - Package Before After - ---- ------------ -------- -------- - ➕ added v1.2.3 - ⬆️ upgraded v1.1.1 v2.2.2 - ⬇️ downgraded v4.4.4 v3.3.3 - 🔄 unknown v5.5.5 v5.5.5 - ➖ removed v3.2.1 - ---- ------------ -------- -------- - - bar.lock - -------- - - 🔄 The file was updated, but no dependency changes found. - - EOS, - $this->removeTextStyles($this->tester->getDisplay()), - ); - } - - public function testNoDiff(): void - { - $this->scanUseCase - ->scan(Argument::type(Repository::class), 'foo', 'bar') - ->willReturn([]) - ->shouldBeCalledOnce() - ; - - $this->reportUseCase - ->report([]) + ->report($diffs, ['console'], Argument::type('array')) ->shouldBeCalledOnce() ; $exitCode = $this->tester->execute([ 'base' => 'foo', 'head' => 'bar', + ], [ + 'reporter' => ['console'], ]); $this->assertSame(0, $exitCode); - $this->assertSame( - <<<'EOS' - ✨ No lock file changes found, looks shine! - - EOS, - $this->tester->getDisplay(), - ); - } - - private function createDependency(string $name, string $versionName): Dependency - { - $package = $this->prophesize(Package::class); - $package->getName()->willReturn($name); - - $version = $this->prophesize(SimpleVersion::class); - $version->__toString()->willReturn($versionName); - - $dependency = $this->prophesize(Dependency::class); - $dependency->getPackage()->willReturn($package->reveal()); - $dependency->getVersion()->willReturn($version->reveal()); - - return $dependency->reveal(); - } - - private function createDependencyDiff(string $name, string $before, string $after, int $type): DependencyDiff - { - $package = $this->prophesize(Package::class); - $package->getName()->willReturn($name); - - $beforeVersion = $this->prophesize(SimpleVersion::class); - $beforeVersion->__toString()->willReturn($before); - - $afterVersion = $this->prophesize(SimpleVersion::class); - $afterVersion->__toString()->willReturn($after); - - $versionDiff = $this->prophesize(VersionDiff::class); - $versionDiff->isCompatible()->willReturn(false); - $versionDiff->getType()->willReturn($type); - $versionDiff->getBefore()->willReturn($beforeVersion->reveal()); - $versionDiff->getAfter()->willReturn($afterVersion->reveal()); - - $diff = $this->prophesize(DependencyDiff::class); - $diff->getPackage()->willReturn($package->reveal()); - $diff->getVersionDiff()->willReturn($versionDiff->reveal()); - - return $diff->reveal(); - } - - private function removeTextStyles(string $text): string - { - return preg_replace('/\e\[[0-9;]*m/', '', $text) ?? $text; } } diff --git a/tests/Reporter/Console/ConsoleReporterTest.php b/tests/Reporter/Console/ConsoleReporterTest.php new file mode 100644 index 0000000..8411ca3 --- /dev/null +++ b/tests/Reporter/Console/ConsoleReporterTest.php @@ -0,0 +1,142 @@ +prophesize(DependencyCollectionDiff::class); + $diff->count()->willReturn(5); + $diff->getAdded()->willReturn([$this->createDependency('added', 'v1.2.3')]); + $diff->getRemoved()->willReturn([$this->createDependency('removed', 'v3.2.1')]); + $diff->getUpdated()->willReturn([ + $this->createDependencyDiff('upgraded', 'v1.1.1', 'v2.2.2', VersionDiff::UPGRADED), + $this->createDependencyDiff('downgraded', 'v4.4.4', 'v3.3.3', VersionDiff::DOWNGRADED), + $this->createDependencyDiff('unknown', 'v5.5.5', 'v5.5.5', VersionDiff::UNKNOWN), + ]); + + $emptyDiff = $this->prophesize(DependencyCollectionDiff::class); + $emptyDiff->count()->willReturn(0); + + $diffs = [ + 'foo.lock' => $diff->reveal(), + 'bar.lock' => $emptyDiff->reveal(), + ]; + + $input = new ArrayInput([]); + $output = new BufferedOutput(); + $io = new SymfonyStyle($input, $output); + + $reporter = new ConsoleReporter(new MarkdownBuilder()); + $reporter->report($diffs, [ + ConsoleReporter::CONTEXT_SYMFONY_IO => $io, + ]); + + $this->assertSame( + <<<'EOS' + + foo.lock + -------- + + ---- ------------ -------- -------- + Package Before After + ---- ------------ -------- -------- + ➕ added v1.2.3 + ⬆️ upgraded v1.1.1 v2.2.2 + ⬇️ downgraded v4.4.4 v3.3.3 + 🔄 unknown v5.5.5 v5.5.5 + ➖ removed v3.2.1 + ---- ------------ -------- -------- + + bar.lock + -------- + + 🔄 The file was updated, but no dependency changes found. + + EOS, + $this->removeTextStyles($output->fetch()), + ); + } + + public function testNoDiff(): void + { + $input = new ArrayInput([]); + $output = new BufferedOutput(); + $io = new SymfonyStyle($input, $output); + + $reporter = new ConsoleReporter(new MarkdownBuilder()); + $reporter->report([], [ + ConsoleReporter::CONTEXT_SYMFONY_IO => $io, + ]); + + $this->assertSame( + <<<'EOS' + ✨ No lock file changes found, looks shine! + + EOS, + $output->fetch(), + ); + } + + private function createDependency(string $name, string $versionName): Dependency + { + $package = $this->prophesize(Package::class); + $package->getName()->willReturn($name); + + $version = $this->prophesize(SimpleVersion::class); + $version->__toString()->willReturn($versionName); + + $dependency = $this->prophesize(Dependency::class); + $dependency->getPackage()->willReturn($package->reveal()); + $dependency->getVersion()->willReturn($version->reveal()); + + return $dependency->reveal(); + } + + private function createDependencyDiff(string $name, string $before, string $after, int $type): DependencyDiff + { + $package = $this->prophesize(Package::class); + $package->getName()->willReturn($name); + + $beforeVersion = $this->prophesize(SimpleVersion::class); + $beforeVersion->__toString()->willReturn($before); + + $afterVersion = $this->prophesize(SimpleVersion::class); + $afterVersion->__toString()->willReturn($after); + + $versionDiff = $this->prophesize(VersionDiff::class); + $versionDiff->isCompatible()->willReturn(false); + $versionDiff->getType()->willReturn($type); + $versionDiff->getBefore()->willReturn($beforeVersion->reveal()); + $versionDiff->getAfter()->willReturn($afterVersion->reveal()); + + $diff = $this->prophesize(DependencyDiff::class); + $diff->getPackage()->willReturn($package->reveal()); + $diff->getVersionDiff()->willReturn($versionDiff->reveal()); + + return $diff->reveal(); + } + + private function removeTextStyles(string $text): string + { + return preg_replace('/\e\[[0-9;]*m/', '', $text) ?? $text; + } +}