From 64dbcf0a261000d71b75288f7df875a42def2a01 Mon Sep 17 00:00:00 2001 From: Fabio Ivona Date: Mon, 20 Feb 2023 23:10:59 +0100 Subject: [PATCH] init command tweak --- src/Plugins/Init.php | 82 ++++++++++++++++++++++-- stubs/init/{ => Feature}/ExampleTest.php | 0 stubs/init/TestCase.php | 7 ++ stubs/init/Unit/ExampleTest.php | 5 ++ 4 files changed, 89 insertions(+), 5 deletions(-) rename stubs/init/{ => Feature}/ExampleTest.php (100%) create mode 100644 stubs/init/TestCase.php create mode 100644 stubs/init/Unit/ExampleTest.php diff --git a/src/Plugins/Init.php b/src/Plugins/Init.php index 641012e6..9c1c45c5 100644 --- a/src/Plugins/Init.php +++ b/src/Plugins/Init.php @@ -4,6 +4,9 @@ declare(strict_types=1); namespace Pest\Plugins; +use App\Console\Kernel; +use Composer\InstalledVersions; +use Illuminate\Support\Facades\Process; use Pest\Console\Thanks; use Pest\Contracts\Plugins\HandlesArguments; use Pest\Support\View; @@ -26,7 +29,9 @@ final class Init implements HandlesArguments private const STUBS = [ 'phpunit.xml' => 'phpunit.xml', 'Pest.php' => 'tests/Pest.php', - 'ExampleTest.php' => 'tests/ExampleTest.php', + 'TestCase.php' => 'tests/TestCase.php', + 'Unit/ExampleTest.php' => 'tests/Unit/ExampleTest.php', + 'Feature/ExampleTest.php' => 'tests/Feature/ExampleTest.php', ]; /** @@ -59,16 +64,19 @@ final class Init implements HandlesArguments private function init(): void { + if ($this->isLaravelInstalled()) { + exit($this->initLaravel()); + } + $testsBaseDir = "{$this->testSuite->rootPath}/tests"; if (! is_dir($testsBaseDir)) { mkdir($testsBaseDir); } - $this->output->writeln([ - '', - ' INFO Preparing tests directory.', - '', + View::render('components.badge', [ + 'type' => 'INFO', + 'content' => 'Preparing tests directory.', ]); foreach (self::STUBS as $from => $to) { @@ -98,4 +106,68 @@ final class Init implements HandlesArguments exit(0); } + + private function initLaravel(): int + { + View::render('components.badge', [ + 'type' => 'INFO', + 'content' => 'Laravel installation detected, pest-plugin-laravel will be installed.', + ]); + + exec('composer require pestphp/pest-plugin-laravel 2.x-dev', result_code: $result); + + /** @var int $result */ + if ($result > 0) { + View::render('components.badge', [ + 'type' => 'ERROR', + 'content' => 'Something went wrong while installing pest-plugin-laravel package. Please refer the above output for more info.', + ]); + + return $result; + } + + View::render('components.badge', [ + 'type' => 'INFO', + 'content' => 'Running artisan command to install Pest.', + ]); + + $app = require $this->testSuite->rootPath.'/bootstrap/app.php'; + /** @phpstan-ignore-next-line */ + $app->make(Kernel::class)->bootstrap(); + + /** @phpstan-ignore-next-line */ + $result = Process::run('php artisan pest:install --no-interaction'); + + if ($result->failed()) { + $this->output->writeln($result->errorOutput()); + + View::render('components.badge', [ + 'type' => 'ERROR', + 'content' => 'Something went wrong while installing Pest in laravel. Please refer the above output for more info.', + ]); + + return $result->exitCode(); + } + + $this->output->writeln($result->output()); + + View::render('components.two-column-detail', [ + 'left' => 'pest-plugin-laravel', + 'right' => 'Installed', + ]); + + View::render('components.two-column-detail', [ + 'left' => 'Pest', + 'right' => 'Installed in Laravel', + ]); + + View::render('components.new-line'); + + return 0; + } + + private function isLaravelInstalled(): bool + { + return InstalledVersions::isInstalled('laravel/laravel'); + } } diff --git a/stubs/init/ExampleTest.php b/stubs/init/Feature/ExampleTest.php similarity index 100% rename from stubs/init/ExampleTest.php rename to stubs/init/Feature/ExampleTest.php diff --git a/stubs/init/TestCase.php b/stubs/init/TestCase.php new file mode 100644 index 00000000..62e5bd9b --- /dev/null +++ b/stubs/init/TestCase.php @@ -0,0 +1,7 @@ +toBeTrue(); +});