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>
61 lines
2.1 KiB
PHP
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());
|
|
}
|
|
}
|