fix: --watch plugin access to original arguments

This commit is contained in:
Nuno Maduro
2024-01-25 12:33:20 +00:00
parent 4febd8a11b
commit 8c57cc1731
4 changed files with 71 additions and 19 deletions

View File

@ -13,39 +13,39 @@ use Symfony\Component\Console\Output\ConsoleOutput;
// Ensures Collision's Printer is registered. // Ensures Collision's Printer is registered.
$_SERVER['COLLISION_PRINTER'] = 'DefaultPrinter'; $_SERVER['COLLISION_PRINTER'] = 'DefaultPrinter';
$args = $_SERVER['argv']; $arguments = $originalArguments = $_SERVER['argv'];
$dirty = false; $dirty = false;
$todo = false; $todo = false;
foreach ($args as $key => $value) { foreach ($arguments as $key => $value) {
if ($value === '--compact') { if ($value === '--compact') {
$_SERVER['COLLISION_PRINTER_COMPACT'] = 'true'; $_SERVER['COLLISION_PRINTER_COMPACT'] = 'true';
unset($args[$key]); unset($arguments[$key]);
} }
if ($value === '--profile') { if ($value === '--profile') {
$_SERVER['COLLISION_PRINTER_PROFILE'] = 'true'; $_SERVER['COLLISION_PRINTER_PROFILE'] = 'true';
unset($args[$key]); unset($arguments[$key]);
} }
if (str_contains($value, '--test-directory')) { if (str_contains($value, '--test-directory')) {
unset($args[$key]); unset($arguments[$key]);
} }
if ($value === '--dirty') { if ($value === '--dirty') {
$dirty = true; $dirty = true;
unset($args[$key]); unset($arguments[$key]);
} }
if (in_array($value, ['--todo', '--todos'], true)) { if (in_array($value, ['--todo', '--todos'], true)) {
$todo = true; $todo = true;
unset($args[$key]); unset($arguments[$key]);
} }
if (str_contains($value, '--teamcity')) { if (str_contains($value, '--teamcity')) {
unset($args[$key]); unset($arguments[$key]);
$args[] = '--no-output'; $arguments[] = '--no-output';
unset($_SERVER['COLLISION_PRINTER']); unset($_SERVER['COLLISION_PRINTER']);
} }
} }
@ -88,7 +88,7 @@ use Symfony\Component\Console\Output\ConsoleOutput;
try { try {
$kernel = Kernel::boot($testSuite, $input, $output); $kernel = Kernel::boot($testSuite, $input, $output);
$result = $kernel->handle($args); $result = $kernel->handle($originalArguments, $arguments);
$kernel->shutdown(); $kernel->shutdown();
} catch (Throwable|Error $e) { } catch (Throwable|Error $e) {

View File

@ -0,0 +1,18 @@
<?php
declare(strict_types=1);
namespace Pest\Contracts\Plugins;
/**
* @internal
*/
interface HandlesOriginalArguments
{
/**
* Adds original arguments before the Test Suite execution.
*
* @param array<int, string> $arguments
*/
public function handleOriginalArguments(array $arguments): void;
}

View File

@ -9,6 +9,7 @@ use Pest\Exceptions\NoDirtyTestsFound;
use Pest\Plugins\Actions\CallsAddsOutput; use Pest\Plugins\Actions\CallsAddsOutput;
use Pest\Plugins\Actions\CallsBoot; use Pest\Plugins\Actions\CallsBoot;
use Pest\Plugins\Actions\CallsHandleArguments; use Pest\Plugins\Actions\CallsHandleArguments;
use Pest\Plugins\Actions\CallsHandleOriginalArguments;
use Pest\Plugins\Actions\CallsShutdown; use Pest\Plugins\Actions\CallsShutdown;
use Pest\Support\Container; use Pest\Support\Container;
use PHPUnit\TestRunner\TestResult\Facade; use PHPUnit\TestRunner\TestResult\Facade;
@ -59,6 +60,11 @@ final class Kernel
->add(OutputInterface::class, $output) ->add(OutputInterface::class, $output)
->add(Container::class, $container); ->add(Container::class, $container);
$kernel = new self(
new Application(),
$output,
);
foreach (self::BOOTSTRAPPERS as $bootstrapper) { foreach (self::BOOTSTRAPPERS as $bootstrapper) {
$bootstrapper = Container::getInstance()->get($bootstrapper); $bootstrapper = Container::getInstance()->get($bootstrapper);
assert($bootstrapper instanceof Bootstrapper); assert($bootstrapper instanceof Bootstrapper);
@ -68,11 +74,6 @@ final class Kernel
CallsBoot::execute(); CallsBoot::execute();
$kernel = new self(
new Application(),
$output,
);
Container::getInstance()->add(self::class, $kernel); Container::getInstance()->add(self::class, $kernel);
return $kernel; return $kernel;
@ -81,14 +82,16 @@ final class Kernel
/** /**
* Runs the application, and returns the exit code. * Runs the application, and returns the exit code.
* *
* @param array<int, string> $args * @param array<int, string> $arguments
*/ */
public function handle(array $args): int public function handle(array $originalArguments, array $arguments): int
{ {
$args = CallsHandleArguments::execute($args); CallsHandleOriginalArguments::execute($originalArguments);
$arguments = CallsHandleArguments::execute($arguments);
try { try {
$this->application->run($args); $this->application->run($arguments);
} catch (NoDirtyTestsFound) { } catch (NoDirtyTestsFound) {
$this->output->writeln([ $this->output->writeln([
'', '',

View File

@ -0,0 +1,31 @@
<?php
declare(strict_types=1);
namespace Pest\Plugins\Actions;
use Pest\Contracts\Plugins;
use Pest\Plugin\Loader;
/**
* @internal
*/
final class CallsHandleOriginalArguments
{
/**
* Executes the Plugin action.
*
* Transform the input arguments by passing it to the relevant plugins.
*
* @param array<int, string> $argv
*/
public static function execute(array $argv): void
{
$plugins = Loader::getPlugins(Plugins\HandlesOriginalArguments::class);
/** @var Plugins\HandlesOriginalArguments $plugin */
foreach ($plugins as $plugin) {
$plugin->handleOriginalArguments($argv);
}
}
}