132 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			PHP
		
	
		
		
			
		
	
	
			132 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			PHP
		
	
|  | <?php | ||
|  | 
 | ||
|  | require_once dirname(__DIR__, 3) . '/app/classes/database.php'; | ||
|  | 
 | ||
|  | use PHPUnit\Framework\TestCase; | ||
|  | 
 | ||
|  | class DatabaseTest extends TestCase | ||
|  | { | ||
|  |     private $config; | ||
|  | 
 | ||
|  |     protected function setUp(): void | ||
|  |     { | ||
|  |         parent::setUp(); | ||
|  | 
 | ||
|  |         // Set development environment for detailed errors
 | ||
|  |         global $config; | ||
|  |         $config['environment'] = 'development'; | ||
|  | 
 | ||
|  |         $this->config = [ | ||
|  |             'type' => 'sqlite', | ||
|  |             'dbFile' => ':memory:' | ||
|  |         ]; | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testDatabaseConnection() | ||
|  |     { | ||
|  |         $db = new Database($this->config); | ||
|  |         $this->assertNotNull($db->getConnection()); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testMysqlAndMariadbEquivalence() | ||
|  |     { | ||
|  |         // Test that mysql and mariadb are treated the same
 | ||
|  |         $mysqlConfig = [ | ||
|  |             'type' => 'mysql', | ||
|  |             'host' => 'invalid-host', | ||
|  |             'port' => 3306, | ||
|  |             'dbname' => 'test', | ||
|  |             'user' => 'test', | ||
|  |             'password' => 'test' | ||
|  |         ]; | ||
|  | 
 | ||
|  |         $mariadbConfig = [ | ||
|  |             'type' => 'mariadb', | ||
|  |             'host' => 'invalid-host', | ||
|  |             'port' => 3306, | ||
|  |             'dbname' => 'test', | ||
|  |             'user' => 'test', | ||
|  |             'password' => 'test' | ||
|  |         ]; | ||
|  | 
 | ||
|  |         // Both should fail to connect and return null
 | ||
|  |         $mysqlDb = new Database($mysqlConfig); | ||
|  |         $this->assertNull($mysqlDb->getConnection()); | ||
|  | 
 | ||
|  |         $mariaDb = new Database($mariadbConfig); | ||
|  |         $this->assertNull($mariaDb->getConnection()); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testInvalidDatabaseType() | ||
|  |     { | ||
|  |         $invalidConfig = [ | ||
|  |             'type' => 'invalid', | ||
|  |             'host' => 'localhost', | ||
|  |             'port' => 3306, | ||
|  |             'dbname' => 'test', | ||
|  |             'user' => 'test', | ||
|  |             'password' => 'test' | ||
|  |         ]; | ||
|  | 
 | ||
|  |         $invalidDb = new Database($invalidConfig); | ||
|  |         $this->assertNull($invalidDb->getConnection()); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testMySQLConnectionMissingData() | ||
|  |     { | ||
|  |         $this->expectException(Exception::class); | ||
|  |         $this->expectExceptionMessage('MySQL connection data is missing'); | ||
|  | 
 | ||
|  |         $config = [ | ||
|  |             'type' => 'mysql', | ||
|  |             'host' => 'localhost', | ||
|  |             'port' => 3306, | ||
|  |             'dbname' => 'test', | ||
|  |             // Missing user parameter
 | ||
|  |             'password' => 'test' | ||
|  |         ]; | ||
|  |         new Database($config); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testPrepareAndExecute() | ||
|  |     { | ||
|  |         $db = new Database($this->config); | ||
|  | 
 | ||
|  |         // Create test table
 | ||
|  |         $db->execute('CREATE TABLE test (id INTEGER PRIMARY KEY, name TEXT)'); | ||
|  | 
 | ||
|  |         // Test prepare and execute
 | ||
|  |         $result = $db->execute('INSERT INTO test (name) VALUES (?)', ['test_name']); | ||
|  |         $this->assertEquals(1, $result->rowCount()); | ||
|  | 
 | ||
|  |         // Verify insertion
 | ||
|  |         $result = $db->execute('SELECT name FROM test WHERE id = ?', [1]); | ||
|  |         $row = $result->fetch(PDO::FETCH_ASSOC); | ||
|  |         $this->assertEquals('test_name', $row['name']); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testTransaction() | ||
|  |     { | ||
|  |         $db = new Database($this->config); | ||
|  | 
 | ||
|  |         // Create test table
 | ||
|  |         $db->execute('CREATE TABLE test (id INTEGER PRIMARY KEY, name TEXT)'); | ||
|  | 
 | ||
|  |         // Test successful transaction
 | ||
|  |         $db->beginTransaction(); | ||
|  |         $db->execute('INSERT INTO test (name) VALUES (?)', ['transaction_test']); | ||
|  |         $db->commit(); | ||
|  | 
 | ||
|  |         $result = $db->execute('SELECT COUNT(*) as count FROM test'); | ||
|  |         $this->assertEquals(1, $result->fetch(PDO::FETCH_ASSOC)['count']); | ||
|  | 
 | ||
|  |         // Test rollback
 | ||
|  |         $db->beginTransaction(); | ||
|  |         $db->execute('INSERT INTO test (name) VALUES (?)', ['rollback_test']); | ||
|  |         $db->rollBack(); | ||
|  | 
 | ||
|  |         $result = $db->execute('SELECT COUNT(*) as count FROM test'); | ||
|  |         $this->assertEquals(1, $result->fetch(PDO::FETCH_ASSOC)['count']); | ||
|  |     } | ||
|  | } |