diff --git a/src/Commands/Run.php b/src/Commands/Run.php index 3472cd26..68ae8604 100644 --- a/src/Commands/Run.php +++ b/src/Commands/Run.php @@ -3,12 +3,10 @@ namespace Stancl\Tenancy\Commands; use Illuminate\Console\Command; -use Stancl\Tenancy\DatabaseManager; +use Illuminate\Support\Facades\Artisan; class Run extends Command { - protected $database; - /** * The console command description. * @@ -21,18 +19,7 @@ class Run extends Command * * @var string */ - protected $signature = 'tenants:run {command} {--tenants} {args*}'; - - /** - * Create a new command instance. - * - * @return void - */ - public function __construct(DatabaseManager $database) - { - parent::__construct(); - $this->database = $database; - } + protected $signature = 'tenants:run {commandname} {--tenants=} {args*}'; /** * Execute the console command. @@ -41,8 +28,8 @@ class Run extends Command */ public function handle() { - if (! $this->confirmToProceed()) { - return; + if ($tenancy_was_initialized = tenancy()->initialized) { + $previous_tenants_domain = tenant('domain'); } tenant()->all($this->option('tenants'))->each(function ($tenant) { @@ -50,9 +37,14 @@ class Run extends Command tenancy()->init($tenant['domain']); // Run command - // todo + Artisan::call($this->argument('commandname'), [ + 'args' => $this->argument('args') // todo find a better way to pass args + ]); + tenancy()->end(); }); - // todo reconnect to previous tenant or end tenancy if it hadn't been started + if ($tenancy_was_initialized) { + tenancy()->init($previous_tenants_domain); + } } } diff --git a/src/TenancyServiceProvider.php b/src/TenancyServiceProvider.php index 12005e9f..233b87bb 100644 --- a/src/TenancyServiceProvider.php +++ b/src/TenancyServiceProvider.php @@ -2,6 +2,7 @@ namespace Stancl\Tenancy; +use Stancl\Tenancy\Commands\Run; use Stancl\Tenancy\Commands\Seed; use Illuminate\Cache\CacheManager; use Stancl\Tenancy\Commands\Migrate; @@ -23,9 +24,10 @@ class TenancyServiceProvider extends ServiceProvider { if ($this->app->runningInConsole()) { $this->commands([ + Run::class, + Seed::class, Migrate::class, Rollback::class, - Seed::class, TenantList::class, ]); } diff --git a/tests/CommandsTest.php b/tests/CommandsTest.php index 3998719d..d63a5247 100644 --- a/tests/CommandsTest.php +++ b/tests/CommandsTest.php @@ -76,7 +76,7 @@ class CommandsTest extends TestCase } /** @test */ - public function database_connection_is_switched_to_default_after_migrating_or_seeding_or_rolling_back() + public function database_connection_is_switched_to_default() { $originalDBName = DB::connection()->getDatabaseName(); @@ -88,13 +88,28 @@ class CommandsTest extends TestCase Artisan::call('tenants:rollback'); $this->assertSame($originalDBName, DB::connection()->getDatabaseName()); + + $this->run_commands_works(); + $this->assertSame($originalDBName, DB::connection()->getDatabaseName()); } /** @test */ - public function database_connection_is_switched_to_default_after_migrating_or_seeding_or_rolling_back_when_tenancy_has_been_initialized() + public function database_connection_is_switched_to_default_when_tenancy_has_been_initialized() { tenancy()->init('localhost'); - $this->database_connection_is_switched_to_default_after_migrating_or_seeding_or_rolling_back(); + $this->database_connection_is_switched_to_default(); + } + + /** @test */ + public function run_commands_works() + { + $uuid = tenant()->create('run.localhost')['uuid']; + + Artisan::call('tenants:migrate', ['--tenants' => $uuid]); + + $this->artisan("tenants:run foo --tenants=$uuid a b") + ->expectsOutput("User's name is Test command") + ->expectsOutput('a;b'); } } diff --git a/tests/Etc/ConsoleKernel.php b/tests/Etc/ConsoleKernel.php new file mode 100644 index 00000000..9376bf26 --- /dev/null +++ b/tests/Etc/ConsoleKernel.php @@ -0,0 +1,18 @@ + 999, + 'name' => 'Test command', + 'email' => 'test@command.com', + 'password' => bcrypt('password'), + ]); + + $this->line("User's name is " . User::find(999)->name); + $this->line(implode(';', $this->argument('args'))); + } +} + +class User extends \Illuminate\Database\Eloquent\Model +{ + protected $guarded = []; +} diff --git a/tests/TestCase.php b/tests/TestCase.php index 815e5d3d..699b4ab7 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -139,6 +139,17 @@ abstract class TestCase extends \Orchestra\Testbench\TestCase $app->singleton('Illuminate\Contracts\Http\Kernel', Etc\HttpKernel::class); } + /** + * Resolve application Console Kernel implementation. + * + * @param \Illuminate\Foundation\Application $app + * @return void + */ + protected function resolveApplicationConsoleKernel($app) + { + $app->singleton('Illuminate\Contracts\Console\Kernel', Etc\ConsoleKernel::class); + } + public function randomString(int $length = 10) { return substr(str_shuffle(str_repeat($x = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil($length / strlen($x)))), 1, $length);