jilo-web/tests/Unit/Classes/DatabaseTest.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']);
}
}