Klick auf den PO oeffnet ein Modal, in dem sich die Projekte (Owner/Repo + Farbe), aus denen der Codeberg-Sync liest, hinzufuegen, bearbeiten und loeschen lassen - Icon-Schaltflaechen mit Tooltip statt Textbuttons. Die Projektliste war bisher eine Umgebungsvariable (CODEBERG_REPOS, Issue #26) und wandert dafuer in eine neue Tabelle repo_configs (Migration 003_repo_configs.sql, geseedet mit den bisherigen drei Default-Projekten); CodebergSyncService liest sie ueber RepoConfigRepository bei jedem Lauf frisch ein, damit eine Aenderung im laufenden --watch-Prozess ohne Neustart wirkt. Neue Endpunkte GET/POST/PATCH/DELETE /api/v1/repo-configs, Schreiben hinter X-Admin-Key wie die Agenten-Registrierung; das Frontend fragt den Key bei der ersten Aenderung per Prompt ab und merkt ihn sich im lokalen Speicher. office-modal.js bekommt dafuer einen Oeffnen-Token (isCurrentModal()), damit ein verspaetet aufloesender Request nach dem Oeffnen eines anderen Modals nicht dessen Inhalt ueberschreibt. Schliesst #27
58 lines
1.9 KiB
PHP
58 lines
1.9 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());
|
|
}
|
|
|
|
/**
|
|
* 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',
|
|
]);
|
|
|
|
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());
|
|
}
|
|
}
|