<?php
declare(strict_types=1);
namespace GNexus\Synapse\Tests\Config;
use GNexus\Synapse\Config\SynapseConfig;
use GNexus\Synapse\Exception\ConfigurationException;
use PHPUnit\Framework\TestCase;
final class SynapseConfigTest extends TestCase
{
public function testValidConfigAndUrl(): void
{
$cfg = new SynapseConfig('http://synapse:8013/', 'syn_abc');
self::assertSame('http://synapse:8013/api/v1/events', $cfg->url('/api/v1/events'));
self::assertSame('syn_abc', $cfg->apiKey);
self::assertSame(10.0, $cfg->timeoutSeconds);
self::assertSame('', $cfg->source());
}
public function testRejectsEmptyUrl(): void
{
$this->expectException(ConfigurationException::class);
$this->expectExceptionMessage(SynapseConfig::ENV_URL);
new SynapseConfig('');
}
public function testRejectsUrlWithoutScheme(): void
{
$this->expectException(ConfigurationException::class);
new SynapseConfig('synapse:8013'); // без схемы http(s)
}
public function testRejectsZeroTimeout(): void
{
$this->expectException(ConfigurationException::class);
new SynapseConfig('http://s', timeoutSeconds: 0);
}
public function testFromGlobalsReadsEnv(): void
{
$cfg = SynapseConfig::fromGlobals([
SynapseConfig::ENV_URL => 'http://synapse:8013/',
SynapseConfig::ENV_API_KEY => 'syn_abc',
SynapseConfig::ENV_TIMEOUT => '3.5',
SynapseConfig::ENV_DEFAULT_SOURCE => 'bugtrail',
]);
self::assertSame('http://synapse:8013/api/v1', $cfg->url('/api/v1'));
self::assertSame('syn_abc', $cfg->apiKey);
self::assertSame(3.5, $cfg->timeoutSeconds);
self::assertSame('bugtrail', $cfg->source());
}
public function testFromGlobalsDefaultsWithoutKey(): void
{
// url обязателен: пустой env — ConfigurationException, fail fast
$cfg = SynapseConfig::fromGlobals([SynapseConfig::ENV_URL => 'http://synapse.test']);
self::assertNull($cfg->apiKey); // ключа нет — send поднимет ConfigurationException,
self::assertSame(10.0, $cfg->timeoutSeconds); // health() же работает
self::assertSame('', $cfg->source());
}
}