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());
 | |
|         }
 | |
|     }
 | |
| }
 | 
