diff --git a/.gitignore b/.gitignore index d8a7996a..6733b4e1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ +.env composer.lock vendor/ diff --git a/.travis.yml b/.travis.yml index 88e84dda..6771e6a8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,6 +8,7 @@ branches: - master services: + - mysql - redis-server before_install: @@ -16,7 +17,13 @@ before_install: install: - travis_retry composer install --no-interaction -script: vendor/bin/phpunit --coverage-clover=coverage.xml +before_script: + - export DB_USERNAME=root + - export DB_PASSWORD=root + - mysql -e 'CREATE DATABASE travis_tenancy;' + - export DB_DATABASE=travis_tenancy + +script: vendor/bin/phpunit -v --coverage-clover=coverage.xml after_success: - export CODECOV_TOKEN="24382d15-84e7-4a55-bea4-c4df96a24a9b" diff --git a/composer.json b/composer.json index 3ee667cf..ca99db8e 100644 --- a/composer.json +++ b/composer.json @@ -15,7 +15,8 @@ }, "require-dev": { "orchestra/testbench": "~3.0", - "laravel/framework": "5.7.*" + "laravel/framework": "5.7.*", + "vlucas/phpdotenv": "^2.2" }, "autoload": { "psr-4": { diff --git a/src/DatabaseCreators/MySQLDatabaseCreator.php b/src/DatabaseCreators/MySQLDatabaseCreator.php index c3b72283..745143d5 100644 --- a/src/DatabaseCreators/MySQLDatabaseCreator.php +++ b/src/DatabaseCreators/MySQLDatabaseCreator.php @@ -2,6 +2,7 @@ namespace Stancl\Tenancy\DatabaseCreators; +use Illuminate\Support\Facades\DB; use Stancl\Tenancy\Interfaces\DatabaseCreator; class MySQLDatabaseCreator implements DatabaseCreator diff --git a/src/DatabaseManager.php b/src/DatabaseManager.php index 47fb1458..194fffdf 100644 --- a/src/DatabaseManager.php +++ b/src/DatabaseManager.php @@ -2,14 +2,9 @@ namespace Stancl\Tenancy; -use Illuminate\Bus\Queueable; use Illuminate\Support\Facades\DB; -use Illuminate\Queue\SerializesModels; -use Illuminate\Queue\InteractsWithQueue; -use Illuminate\Foundation\Bus\Dispatchable; -use Illuminate\Contracts\Queue\ShouldQueue; +use Stancl\Tenancy\Jobs\QueuedDatabaseCreator; use Illuminate\Database\DatabaseManager as BaseDatabaseManager; -use Stancl\Tenancy\Interfaces\DatabaseCreator; class DatabaseManager { @@ -48,7 +43,7 @@ class DatabaseManager } if (config('tenancy.queue_database_creation', false)) { - QueuedDatabaseCreator::dispatch(app($databaseCreators[$driver], $name)); + QueuedDatabaseCreator::dispatch(app($databaseCreators[$driver]), $name); } else { app($databaseCreators[$driver])->createDatabase($name); } @@ -77,31 +72,3 @@ class DatabaseManager config()->set(['database.connections.tenant.database' => $database_name]); } } - -class QueuedDatabaseCreator implements ShouldQueue -{ - use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; - - /** - * Create a new job instance. - * - * @param DatabaseCreator $databaseCreator - * @param string $databaseName - * @return void - */ - public function __construct(DatabaseCreator $databaseCreator, string $databaseName) - { - $this->databaseCreator = $databaseCreator; - $this->databaseName = $databaseName; - } - - /** - * Execute the job. - * - * @return void - */ - public function handle() - { - $this->databaseCreator->createDatabase($databaseName); - } -} diff --git a/src/Jobs/QueuedDatabaseCreator.php b/src/Jobs/QueuedDatabaseCreator.php new file mode 100644 index 00000000..1422433c --- /dev/null +++ b/src/Jobs/QueuedDatabaseCreator.php @@ -0,0 +1,38 @@ +databaseCreator = $databaseCreator; + $this->databaseName = $databaseName; + } + + /** + * Execute the job. + * + * @return void + */ + public function handle() + { + $this->databaseCreator->createDatabase($databaseName); + } +} diff --git a/tests/DatabaseCreationTest.php b/tests/DatabaseCreationTest.php new file mode 100644 index 00000000..5f3e47f3 --- /dev/null +++ b/tests/DatabaseCreationTest.php @@ -0,0 +1,48 @@ +randomString(10) . '.sqlite'; + app(DatabaseManager::class)->create($db_name, 'sqlite'); + $this->assertFileExists(database_path($db_name)); + } + + /** @test */ + public function mysql_database_is_created() + { + if (! $this->isTravis()) { + $this->markTestSkipped('As to not bloat your MySQL instance with test databases, this test is not run by default.'); + } + + config()->set([ + 'database.default' => 'mysql', + 'database.connections.mysql.database' => 'travis_tenancy', + ]); + + $db_name = 'testdatabase' . $this->randomString(10); + app(DatabaseManager::class)->create($db_name, 'mysql'); + $this->assertNotEmpty(DB::select("SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = '$db_name'")); + } + + /** @test */ + public function database_creation_can_be_queued() + { + Queue::fake(); + + config()->set('tenancy.queue_database_creation', true); + $db_name = 'testdatabase' . $this->randomString(10) . '.sqlite'; + app(DatabaseManager::class)->create($db_name, 'sqlite'); + + Queue::assertPushed(QueuedDatabaseCreator::class); + } +} diff --git a/tests/TestCase.php b/tests/TestCase.php index 1a29c5b8..2df8acd5 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -30,19 +30,23 @@ class TestCase extends \Orchestra\Testbench\TestCase */ protected function getEnvironmentSetUp($app) { - $app['config']->set('database.redis.client', 'phpredis'); - $app['config']->set('database.redis.tenancy', [ - 'host' => env('TENANCY_TEST_REDIS_HOST', '127.0.0.1'), - 'password' => env('TENANCY_TEST_REDIS_PASSWORD', null), - 'port' => env('TENANCY_TEST_REDIS_PORT', 6379), - // Use the #14 Redis database unless specified otherwise. - // Make sure you don't store anything in this db! - 'database' => env('TENANCY_TEST_REDIS_DB', 14), - ]); - $app['config']->set('tenancy.database', [ - 'based_on' => 'sqlite', - 'prefix' => 'tenant', - 'suffix' => '.sqlite', + (new \Dotenv\Dotenv(__DIR__ . '/..'))->load(); + + $app['config']->set([ + 'database.redis.client' => 'phpredis', + 'database.redis.tenancy' => [ + 'host' => env('TENANCY_TEST_REDIS_HOST', '127.0.0.1'), + 'password' => env('TENANCY_TEST_REDIS_PASSWORD', null), + 'port' => env('TENANCY_TEST_REDIS_PORT', 6379), + // Use the #14 Redis database unless specified otherwise. + // Make sure you don't store anything in this db! + 'database' => env('TENANCY_TEST_REDIS_DB', 14), + ], + 'tenancy.database' => [ + 'based_on' => 'sqlite', + 'prefix' => 'tenant', + 'suffix' => '.sqlite', + ], ]); } @@ -61,4 +65,15 @@ class TestCase extends \Orchestra\Testbench\TestCase { $app->singleton('Illuminate\Contracts\Http\Kernel', \Stancl\Tenancy\Testing\HttpKernel::class); } + + public function randomString(int $length = 10) + { + return substr(str_shuffle(str_repeat($x = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil($length / strlen($x)))), 1, $length); + } + + public function isTravis() + { + // Multiple, just to make sure. Someone might accidentally set one on their computer. + return env('CI') && env('TRAVIS') && env('CONTINUOUS_INTEGRATION'); + } }