diff --git a/src/Plugins/Parallel/Handlers/Laravel.php b/src/Plugins/Parallel/Handlers/Laravel.php index 05bb7cf8..0e1a6b8f 100644 --- a/src/Plugins/Parallel/Handlers/Laravel.php +++ b/src/Plugins/Parallel/Handlers/Laravel.php @@ -5,22 +5,32 @@ declare(strict_types=1); namespace Pest\Plugins\Parallel\Handlers; use Composer\InstalledVersions; +use Illuminate\Support\Facades\App; use Illuminate\Testing\ParallelRunner; +use NunoMaduro\Collision\Adapters\Laravel\Commands\TestCommand; use ParaTest\Options; use ParaTest\RunnerInterface; use Pest\Contracts\Plugins\HandlesArguments; use Pest\Plugins\Concerns\HandleArguments; -use Pest\Plugins\Parallel\Contracts\HandlesSubprocessArguments; use Pest\Plugins\Parallel\Paratest\WrapperRunner; +use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Process\PhpProcess; /** * @internal */ -final class Laravel implements HandlesArguments, HandlesSubprocessArguments +final class Laravel implements HandlesArguments { use HandleArguments; + public function __construct( + private readonly OutputInterface $output, + private readonly InputInterface $input, + ) + { + } + public function handleArguments(array $arguments): array { if (! self::isALaravelApplication()) { @@ -29,19 +39,15 @@ final class Laravel implements HandlesArguments, HandlesSubprocessArguments $this->setLaravelParallelRunner(); - foreach ($arguments as $value) { - if (str_starts_with((string) $value, '--runner')) { - $arguments = $this->popArgument($value, $arguments); - } - } + $arguments = $this->setEnvironmentVariables($arguments); - return $this->pushArgument('--runner=\Illuminate\Testing\ParallelRunner', $arguments); + return $this->useLaravelRunner($arguments); } private function setLaravelParallelRunner(): void { if (! method_exists(ParallelRunner::class, 'resolveRunnerUsing')) { - exit('Using parallel with Pest requires Laravel v8.55.0 or higher.'); + $this->output->writeln(' Using parallel with Pest requires Laravel v8.55.0 or higher.'); } ParallelRunner::resolveRunnerUsing(fn (Options $options, OutputInterface $output): RunnerInterface => new WrapperRunner($options, $output)); @@ -53,10 +59,38 @@ final class Laravel implements HandlesArguments, HandlesSubprocessArguments && ! class_exists(\Orchestra\Testbench\TestCase::class); } - public function handleSubprocessArguments(array $arguments): array + /** + * @param array $arguments + * @return array + */ + private function setEnvironmentVariables(array $arguments): array { - putenv('LARAVEL_PARALLEL_TESTING=1'); + $_ENV['LARAVEL_PARALLEL_TESTING'] = 1; - return $arguments; + if ($this->hasArgument('--recreate-databases', $arguments)) { + $_ENV['LARAVEL_PARALLEL_TESTING_RECREATE_DATABASES'] = 1; + } + + if ($this->hasArgument('--drop-databases', $arguments)) { + $_ENV['LARAVEL_PARALLEL_TESTING_DROP_DATABASES'] = 1; + } + + $arguments = $this->popArgument('--recreate-databases', $arguments); + return $this->popArgument('--drop-databases', $arguments); + } + + /** + * @param array $arguments + * @return array + */ + private function useLaravelRunner(array $arguments): array + { + foreach ($arguments as $value) { + if (str_starts_with((string)$value, '--runner')) { + $arguments = $this->popArgument($value, $arguments); + } + } + + return $this->pushArgument('--runner=\Illuminate\Testing\ParallelRunner', $arguments); } }