Files
core/tests/ConfigurationTest.php
2019-06-27 09:40:12 +02:00

241 lines
8.1 KiB
PHP

<?php
declare(strict_types=1);
namespace LotGD\Core\Tests;
use DateTime;
use Monolog\Logger;
use Monolog\Handler\NullHandler;
use LotGD\Core\Configuration;
use LotGD\Core\Exceptions\InvalidConfigurationException;
use PHPUnit\Framework\TestCase;
class ConfigurationTest extends TestCase
{
private $logger;
private $configDir;
public function setUp(): void
{
$this->configDir = __DIR__ . DIRECTORY_SEPARATOR . join(DIRECTORY_SEPARATOR, ['datasets', 'config']);
$this->logger = new Logger('test');
$this->logger->pushHandler(new NullHandler());
}
public function testBasicConfiguration()
{
$configuration = new Configuration($this->configDir . DIRECTORY_SEPARATOR . 'basic.yml');
$this->assertEquals('some_dsn', $configuration->getDatabaseDSN());
$this->assertEquals('some_name', $configuration->getDatabaseName());
$this->assertEquals('some_user', $configuration->getDatabaseUser());
$this->assertEquals('some_password', $configuration->getDatabasePassword());
$this->assertEquals($this->configDir . DIRECTORY_SEPARATOR . './', $configuration->getLogPath());
$this->assertEquals(new DateTime('2016-07-01 01:01:01.0 -8'), $configuration->getGameEpoch());
$this->assertEquals(32, $configuration->getGameOffsetSeconds());
$this->assertEquals(2, $configuration->getGameDaysPerDay());
}
public function testToString()
{
$configuration = new Configuration($this->configDir . DIRECTORY_SEPARATOR . 'basic.yml');
$s = $configuration->__toString();
$this->assertFalse(strpos($s, 'some_password'));
}
/**
* Returns a Mocked Configuration instance using default values that does not relay
* on a file.
* @param array $config configuration that is merged to the default configuration
* @return Configuration Mocked Configuration class
*/
private function getPseudoConfiguration(array $config)
{
$basicConfig = [
"database" => [
"dsn" => "some_dsn",
"user" => "some_user",
"password" => "some_password",
"name" => "some_name"
],
"game" => [
"epoch" => 1467334861,
"offsetSeconds" => 32,
"daysPerDay" => 2
],
"logs" => [
"path" => "./"
]
];
$config = array_merge($basicConfig, $config);
$configuration = $this->getMockBuilder(Configuration::class)
->disableOriginalConstructor()
->setMethods(["retrieveRawConfig"])
->getMock();
$configuration->method("retrieveRawConfig")->willReturn($config);
$configuration->__construct("dummy");
return $configuration;
}
public function testCWDParsingForSQLiteDatabaseDSN()
{
$rawDSN = "sqlite:%cwd%db.db3";
$configuration = $this->getPseudoConfiguration([
"database" => [
"dsn" => $rawDSN,
"user" => "some_user",
"password" => "some_password",
"name" => "some_name"
],
]);
list($dsn, $user, $password) = $configuration->getDatabaseConnectionDetails("/home/web/sqlite");
$this->assertNotSame($rawDSN, $dsn);
$this->assertSame("sqlite:/home/web/sqlite" . DIRECTORY_SEPARATOR . "db.db3", $dsn);
}
public function testIfInvalidConfigurationExceptionIsThrownIfDatabaseDSNIsMissing()
{
$this->expectException(InvalidConfigurationException::class);
$this->expectExceptionMessage("Invalid or missing data source name: ");
$configuration = $this->getPseudoConfiguration([
"database" => [
"user" => "some_user",
"password" => "some_password",
"name" => "some_name"
],
]);
}
public function testIfInvalidConfigurationExceptionIsThrownIfDatabaseDSNIsFalse()
{
$this->expectException(InvalidConfigurationException::class);
$this->expectExceptionMessage("Invalid or missing data source name: ");
$configuration = $this->getPseudoConfiguration([
"database" => [
"dsn" => false,
"user" => "some_user",
"password" => "some_password",
"name" => "some_name"
],
]);
}
public function testIfInvalidConfigurationExceptionIsThrownIfDatabaseUserIsMissing()
{
$this->expectException(InvalidConfigurationException::class);
$this->expectExceptionMessage("Invalid or missing database user: ");
$configuration = $this->getPseudoConfiguration([
"database" => [
"dsn" => "some_dsn",
"password" => "some_password",
"name" => "some_name"
],
]);
}
public function testIfInvalidConfigurationExceptionIsThrownIfDatabaseUserIsFalse()
{
$this->expectException(InvalidConfigurationException::class);
$this->expectExceptionMessage("Invalid or missing database user: ");
$configuration = $this->getPseudoConfiguration([
"database" => [
"dsn" => "some_dsn",
"user" => false,
"password" => "some_password",
"name" => "some_name"
],
]);
}
public function testIfInvalidConfigurationExceptionIsThrownIfDatabasePasswordIsFalse()
{
$this->expectException(InvalidConfigurationException::class);
$this->expectExceptionMessage("Invalid or missing database password: ");
$configuration = $this->getPseudoConfiguration([
"database" => [
"dsn" => "some_dsn",
"user" => "some_user",
"password" => false,
"name" => "some_name"
],
]);
}
public function testIfInvalidConfigurationExceptionIsThrownIfDatabaseNameIsFalse()
{
$this->expectException(InvalidConfigurationException::class);
$this->expectExceptionMessage("Invalid or missing database name: ");
$configuration = $this->getPseudoConfiguration([
"database" => [
"dsn" => "some_dsn",
"user" => "some_user",
"password" => "some_password",
"name" => false,
],
]);
}
public function testIfInvalidConfigurationExceptionIsThrownIfEpochIsInFuture()
{
$this->expectException(InvalidConfigurationException::class);
$now = new DateTime();
$timestamp = $now->getTimestamp() + 3600;
$this->expectExceptionMessage("Game epoch is set in the future: {$timestamp}");
$configuration = $this->getPseudoConfiguration([
"game" => [
"epoch" => $timestamp,
"offsetSeconds" => 32,
"daysPerDay" => 2
],
]);
}
public function testIfInvalidConfigurationExceptionIsThrownIfOffsetSecondsAreNegative()
{
$this->expectException(InvalidConfigurationException::class);
$this->expectExceptionMessage("Game offset (in seconds) cannot be negative: -32");
$configuration = $this->getPseudoConfiguration([
"game" => [
"epoch" => 1467334861,
"offsetSeconds" => -32,
"daysPerDay" => 2
],
]);
}
public function testIfInvalidConfigurationExceptionIsThrownIfDaysPerDayIsNegative()
{
$this->expectException(InvalidConfigurationException::class);
$this->expectExceptionMessage("Game days per day cannot be negative: -2");
$configuration = $this->getPseudoConfiguration([
"game" => [
"epoch" => 1467334861,
"offsetSeconds" => 32,
"daysPerDay" => -2
],
]);
}
}