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']);
 | 
						|
    }
 | 
						|
}
 |