Skip to content

Commit

Permalink
[4.x] Fix tenants:run argument parsing (#1287)
Browse files Browse the repository at this point in the history
* 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 <[email protected]>
  • Loading branch information
3 people authored Jan 11, 2025
1 parent f955b38 commit 0e223e0
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 18 deletions.
25 changes: 7 additions & 18 deletions src/Commands/Run.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
use Illuminate\Console\Command;
use Illuminate\Contracts\Console\Kernel;
use Stancl\Tenancy\Concerns\HasTenantOptions;
use Symfony\Component\Console\Input\ArgvInput;
use Symfony\Component\Console\Input\StringInput;
use Symfony\Component\Console\Output\ConsoleOutput;

class Run extends Command
Expand All @@ -21,30 +21,19 @@ class Run extends Command

public function handle(): int
{
$argvInput = $this->argvInput();
/** @var string $commandName */
$commandName = $this->argument('commandname');

$stringInput = new StringInput($commandName);

tenancy()->runForMultiple($this->getTenants(), function ($tenant) use ($argvInput) {
tenancy()->runForMultiple($this->getTenants(), function ($tenant) use ($stringInput) {
$this->components->info("Tenant: {$tenant->getTenantKey()}");

$this->getLaravel()
->make(Kernel::class)
->handle($argvInput, new ConsoleOutput);
->handle($stringInput, new ConsoleOutput);
});

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);
}
}
15 changes: 15 additions & 0 deletions tests/CommandsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -389,6 +389,21 @@
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) {
Event::listen(DeletingTenant::class,
JobPipeline::make([DeleteDomains::class])->send(function (DeletingTenant $event) {
Expand Down
31 changes: 31 additions & 0 deletions tests/Etc/Console/AnotherExampleCommand.php
Original file line number Diff line number Diff line change
@@ -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'));
}
}
1 change: 1 addition & 0 deletions tests/Etc/Console/ConsoleKernel.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ class ConsoleKernel extends Kernel
{
protected $commands = [
ExampleCommand::class,
AnotherExampleCommand::class,
ExampleQuestionCommand::class,
AddUserCommand::class,
];
Expand Down

0 comments on commit 0e223e0

Please sign in to comment.