From b95b6cadcac31797714c83bd934c12d70426a6ff Mon Sep 17 00:00:00 2001 From: Abrar Ahmad Date: Thu, 20 Oct 2022 12:37:08 +0500 Subject: [PATCH] tenancy_db_connection tenant config test --- src/Database/DatabaseConfig.php | 5 +-- tests/TenantDatabaseManagerTest.php | 49 +++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/src/Database/DatabaseConfig.php b/src/Database/DatabaseConfig.php index 4067a149..b8210dfc 100644 --- a/src/Database/DatabaseConfig.php +++ b/src/Database/DatabaseConfig.php @@ -132,8 +132,9 @@ class DatabaseConfig if ($this->manager() instanceof Contracts\ManagesDatabaseUsers) { // We're removing the username and password because user with these credentials is not created yet - unset($config['username']); - unset($config['password']); + // If you need to provide username and password when using PermissionControlledMySQLDatabaseManager, + // consider creating a new connection and use it as `tenancy_db_connection` tenant config key + unset($config['username'], $config['password']); } if (! $config) { diff --git a/tests/TenantDatabaseManagerTest.php b/tests/TenantDatabaseManagerTest.php index 724a0618..9817d194 100644 --- a/tests/TenantDatabaseManagerTest.php +++ b/tests/TenantDatabaseManagerTest.php @@ -3,6 +3,7 @@ declare(strict_types=1); use Illuminate\Database\Schema\Blueprint; +use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Event; use Illuminate\Support\Facades\Schema; use Illuminate\Support\Str; @@ -266,6 +267,54 @@ test('tenant database can be created on a foreign server by using the host from expect($manager->databaseExists($name))->toBeTrue(); }); +test('tenant database can be created using host and credentials from the tenant config', closure: function () { + config([ + 'tenancy.database.managers.mysql' => PermissionControlledMySQLDatabaseManager::class, + 'tenancy.database.template_tenant_connection' => 'mysql', + 'database.connections.mysql2' => [ + 'driver' => 'mysql', + 'host' => 'mysql2', + 'port' => 3306, + 'database' => 'main', + 'username' => 'root', + 'password' => 'password', + 'unix_socket' => env('DB_SOCKET', ''), + 'charset' => 'utf8mb4', + 'collation' => 'utf8mb4_unicode_ci', + 'prefix' => '', + 'prefix_indexes' => true, + 'strict' => true, + 'engine' => null, + 'options' => extension_loaded('pdo_mysql') ? array_filter([ + PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), + ]) : [], + ], + ]); + + // Create a new and random database user with privileges to use with mysql2 connection + $username = 'dbuser' . Str::random(4); + DB::statement("CREATE USER `{$username}`@`%` IDENTIFIED BY 'password'"); + DB::connection('mysql2')->statement("GRANT ALL PRIVILEGES ON *.* TO `{$username}`@`%` identified by 'password' WITH GRANT OPTION;"); + DB::connection('mysql2')->statement("FLUSH PRIVILEGES;"); + config(['database.connections.mysql2.username' => $username]); + + Event::listen(TenantCreated::class, JobPipeline::make([CreateDatabase::class])->send(function (TenantCreated $event) { + return $event->tenant; + })->toListener()); + + $name = 'foo' . Str::random(8); + $tenant = Tenant::create([ + 'tenancy_db_name' => $name, + 'tenancy_db_connection' => 'mysql2', + ]); + + /** @var MySQLDatabaseManager $manager */ + $manager = $tenant->database()->manager(); + + //$manager->setConnection('mysql2'); + expect($manager->databaseExists($name))->toBeTrue(); +}); + test('tenant database can be created on a foreign server by using the username and password from tenant config', function () { config([ 'tenancy.database.managers.mysql' => MySQLDatabaseManager::class,