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