79 lines
2.5 KiB
PHP
79 lines
2.5 KiB
PHP
<?php
|
|
|
|
namespace Tests\Traits;
|
|
|
|
use Illuminate\Support\Facades\Artisan;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
trait HandlesTestDatabase
|
|
{
|
|
protected function setUpTestDatabase(): void
|
|
{
|
|
try {
|
|
// Create test database if it doesn't exist
|
|
$database = config('database.connections.testing.database');
|
|
$this->createTestDatabase($database);
|
|
|
|
// Run migrations
|
|
Artisan::call('migrate:fresh', [
|
|
'--database' => 'testing',
|
|
'--seed' => false,
|
|
]);
|
|
} catch (\Exception $e) {
|
|
$this->tearDownTestDatabase();
|
|
throw $e;
|
|
}
|
|
}
|
|
|
|
protected function tearDownTestDatabase(): void
|
|
{
|
|
try {
|
|
// Drop test database
|
|
$database = config('database.connections.testing.database');
|
|
$this->dropTestDatabase($database);
|
|
} catch (\Exception $e) {
|
|
// Log error but don't throw
|
|
error_log('Failed to tear down test database: '.$e->getMessage());
|
|
}
|
|
}
|
|
|
|
protected function createTestDatabase($database)
|
|
{
|
|
try {
|
|
// Connect to postgres database to create/drop test database
|
|
config(['database.connections.pgsql.database' => 'postgres']);
|
|
DB::purge('pgsql');
|
|
DB::reconnect('pgsql');
|
|
|
|
// Drop if exists and create new database
|
|
DB::connection('pgsql')->statement("DROP DATABASE IF EXISTS $database WITH (FORCE);");
|
|
DB::connection('pgsql')->statement("CREATE DATABASE $database;");
|
|
|
|
// Switch back to testing connection
|
|
DB::disconnect('pgsql');
|
|
DB::reconnect('testing');
|
|
} catch (\Exception $e) {
|
|
$this->tearDownTestDatabase();
|
|
throw new \Exception('Could not create test database: '.$e->getMessage());
|
|
}
|
|
}
|
|
|
|
protected function dropTestDatabase($database)
|
|
{
|
|
try {
|
|
// Connect to postgres database to drop test database
|
|
config(['database.connections.pgsql.database' => 'postgres']);
|
|
DB::purge('pgsql');
|
|
DB::reconnect('pgsql');
|
|
|
|
// Drop the test database
|
|
DB::connection('pgsql')->statement("DROP DATABASE IF EXISTS $database WITH (FORCE);");
|
|
|
|
DB::disconnect('pgsql');
|
|
} catch (\Exception $e) {
|
|
// Log error but don't throw
|
|
error_log('Failed to drop test database: '.$e->getMessage());
|
|
}
|
|
}
|
|
}
|