monitor/api/tests/Unit/ConfigTest.php
fds2610-bot 79ccef099d Hooks-KPI im KPI-Monitor ergaenzen (Issue #38)
Die im Issue beschriebene Event-Anzeige (neuestes Event oben, aeltere
schieben nach, Ueberschuss wird abgeschnitten) ist bereits seit Phase 4
umgesetzt (buildEventLines()/MAX_EVENT_LINES, F5) und braucht keine
Aenderung.

Neu ist die vierte, immer sichtbare KPI-Kachel ganz rechts im
KPI-Monitor: "Hooks: n" zaehlt die seit dem letzten Start des
api-Containers empfangenen Webhooks. Der Zaehler ist dateibasiert
(Metrics\HookCounter), weil der eingebaute PHP-Server jede Anfrage als
eigene Skriptausfuehrung behandelt; docker/entrypoint.sh setzt die Datei
beim Start des api-Containers (nicht des sync-Containers) zurueck. Neuer
oeffentlicher Endpunkt GET /api/v1/webhooks/stats liefert den Stand,
das Frontend haengt ihn als eigene Kachel an (buildHooksKpi()) und
reserviert ihr dafuer eine feste Kachel statt sie der MAX_KPI_TILES-
Kappung der uebrigen KPIs zu unterwerfen. Der Wert fliesst zusaetzlich
in den SSE-Fingerabdruck (ChangeFeed) ein.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-04 13:18:05 +02:00

61 lines
2.1 KiB
PHP

<?php
declare(strict_types=1);
namespace Monitor\Api\Tests;
use Monitor\Api\Config;
use PHPUnit\Framework\TestCase;
final class ConfigTest extends TestCase
{
public function testDefaultsAreUsedWhenNothingConfigured(): void
{
$config = new Config([]);
self::assertSame('https://codeberg.org/api/v1', $config->codebergApiBase());
self::assertNull($config->codebergToken());
self::assertNull($config->adminApiKey());
self::assertSame(8, $config->deskCount());
self::assertSame(30, $config->sseMaxIterations());
self::assertSame(2, $config->ssePollIntervalSeconds());
self::assertStringEndsWith('/data/hooks-count', $config->hooksCounterPath());
}
/**
* Regression: get() griff frueher selbst auf getenv() zurueck, wodurch ein in der
* Umgebung gesetzter CODEBERG_TOKEN in eine explizit gebaute Config (und damit in
* Testausgaben) durchschlug.
*/
public function testExplicitEnvArrayDoesNotFallBackToProcessEnvironment(): void
{
putenv('CODEBERG_TOKEN=darf-nicht-durchsickern');
try {
self::assertNull((new Config([]))->codebergToken());
} finally {
putenv('CODEBERG_TOKEN');
}
}
public function testValuesCanBeOverridden(): void
{
$config = new Config([
'CODEBERG_API_BASE' => 'https://example.org/api/v1/',
'CODEBERG_TOKEN' => 'tok',
'MONITOR_ADMIN_API_KEY' => 'secret',
'MONITOR_DESK_COUNT' => '3',
'MONITOR_SSE_MAX_ITERATIONS' => '5',
'MONITOR_SSE_POLL_INTERVAL' => '1',
'MONITOR_HOOKS_COUNTER_FILE' => '/tmp/hooks-count',
]);
self::assertSame('https://example.org/api/v1', $config->codebergApiBase());
self::assertSame('tok', $config->codebergToken());
self::assertSame('secret', $config->adminApiKey());
self::assertSame(3, $config->deskCount());
self::assertSame(5, $config->sseMaxIterations());
self::assertSame(1, $config->ssePollIntervalSeconds());
self::assertSame('/tmp/hooks-count', $config->hooksCounterPath());
}
}