1
0
Fork 0
mirror of https://github.com/archtechx/tenancy.git synced 2025-12-12 15:54:03 +00:00

[4.x] Fix tenants:run argument parsing (#1287)

* Use StringInput instead of ArgvInput so that tenants:run accepts args properly

* Test that tenants:run parses the arguments correctly

* Fix code style (php-cs-fixer)

* Fix PHPStan issue

* remove unnecessary ()

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Samuel Štancl <samuel.stancl@gmail.com>
This commit is contained in:
lukinovec 2025-01-11 12:03:09 +01:00 committed by GitHub
parent f955b38e2b
commit 0e223e0484
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 54 additions and 18 deletions

View file

@ -7,7 +7,7 @@ namespace Stancl\Tenancy\Commands;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Contracts\Console\Kernel; use Illuminate\Contracts\Console\Kernel;
use Stancl\Tenancy\Concerns\HasTenantOptions; use Stancl\Tenancy\Concerns\HasTenantOptions;
use Symfony\Component\Console\Input\ArgvInput; use Symfony\Component\Console\Input\StringInput;
use Symfony\Component\Console\Output\ConsoleOutput; use Symfony\Component\Console\Output\ConsoleOutput;
class Run extends Command class Run extends Command
@ -21,30 +21,19 @@ class Run extends Command
public function handle(): int public function handle(): int
{ {
$argvInput = $this->argvInput(); /** @var string $commandName */
$commandName = $this->argument('commandname');
tenancy()->runForMultiple($this->getTenants(), function ($tenant) use ($argvInput) { $stringInput = new StringInput($commandName);
tenancy()->runForMultiple($this->getTenants(), function ($tenant) use ($stringInput) {
$this->components->info("Tenant: {$tenant->getTenantKey()}"); $this->components->info("Tenant: {$tenant->getTenantKey()}");
$this->getLaravel() $this->getLaravel()
->make(Kernel::class) ->make(Kernel::class)
->handle($argvInput, new ConsoleOutput); ->handle($stringInput, new ConsoleOutput);
}); });
return 0; return 0;
} }
protected function argvInput(): ArgvInput
{
/** @var string $commandName */
$commandName = $this->argument('commandname');
// Convert string command to array
$subCommand = explode(' ', $commandName);
// Add "artisan" as first parameter because ArgvInput expects "artisan" as first parameter and later removes it
array_unshift($subCommand, 'artisan');
return new ArgvInput($subCommand);
}
} }

View file

@ -389,6 +389,21 @@ test('run command works when sub command asks questions and accepts arguments',
expect($user->email)->toBe('email@localhost'); expect($user->email)->toBe('email@localhost');
}); });
test('run command accepts arguments and options correctly', function() {
$tenant = Tenant::create();
$id = $tenant->getTenantKey();
// Use unquoted single-word arguments and quoted arguments with spaces
pest()->artisan("tenants:run \"bar username 'email@localhost' adsfg123 'some Arg' --option='some option'\" --tenants=$id")
->expectsOutputToContain("Tenant: $id.")
->expectsOutput("Name: username")
->expectsOutput("Email: email@localhost")
->expectsOutput("Password: adsfg123")
->expectsOutput("Argument: some Arg")
->expectsOutput("Option: some option")
->assertExitCode(0);
});
test('migrate fresh command only deletes tenant databases if drop_tenant_databases_on_migrate_fresh is true', function (bool $dropTenantDBsOnMigrateFresh) { test('migrate fresh command only deletes tenant databases if drop_tenant_databases_on_migrate_fresh is true', function (bool $dropTenantDBsOnMigrateFresh) {
Event::listen(DeletingTenant::class, Event::listen(DeletingTenant::class,
JobPipeline::make([DeleteDomains::class])->send(function (DeletingTenant $event) { JobPipeline::make([DeleteDomains::class])->send(function (DeletingTenant $event) {

View file

@ -0,0 +1,31 @@
<?php
declare(strict_types=1);
namespace Stancl\Tenancy\Tests\Etc\Console;
use Illuminate\Console\Command;
class AnotherExampleCommand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'bar {name} {email} {password} {arg} {--option=}';
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$this->line('Name: ' . $this->argument('name'));
$this->line('Email: ' . $this->argument('email'));
$this->line('Password: ' . $this->argument('password'));
$this->line('Argument: ' . $this->argument('arg'));
$this->line('Option: ' . $this->option('option'));
}
}

View file

@ -10,6 +10,7 @@ class ConsoleKernel extends Kernel
{ {
protected $commands = [ protected $commands = [
ExampleCommand::class, ExampleCommand::class,
AnotherExampleCommand::class,
ExampleQuestionCommand::class, ExampleQuestionCommand::class,
AddUserCommand::class, AddUserCommand::class,
]; ];