monitor/api/tests/Unit/ConfigTest.php
fds2610-bot 3aaf6aea54 Tickets aus mehreren Codeberg-Projekten anzeigen (monitor/Steuerkram/nc-gantt)
Der Codeberg-Sync liest nun Issues aus mehreren konfigurierbaren Projekten
(Config::codebergRepos(), Default: fds2610/monitor gelb, fds2610/Steuerkram
gruen, fds2610/nc-gantt blau) statt nur aus einem einzigen Repo. Damit
external_ref (Issue-Nummer) projektuebergreifend nicht kollidiert, ist es
jetzt zusammen mit dem neuen Ticket-Feld "repo" eindeutig; Migration
002_multi_repo_tickets.sql ergaenzt die Spalte und den Index. Da Migrationen
dadurch nicht mehr rein additiv sind, trackt Database::migrate() jetzt
angewandte Dateien in schema_migrations, damit ALTER TABLE nicht bei jedem
Prozessstart erneut laeuft. Das Frontend baut Codeberg-Links jetzt aus dem
repo-Feld jedes Tickets statt aus einer global fixen owner/repo-Angabe.

Schliesst #26
2026-07-30 17:34:49 +02:00

79 lines
3 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::assertSame([
['owner' => 'fds2610', 'repo' => 'monitor', 'color' => '#fbca04'],
['owner' => 'fds2610', 'repo' => 'Steuerkram', 'color' => '#28a745'],
['owner' => 'fds2610', 'repo' => 'nc-gantt', 'color' => '#0366d6'],
], $config->codebergRepos());
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_REPOS' => 'someone/somerepo:ff00aa, other/thing:00ff00 ,malformed',
'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([
['owner' => 'someone', 'repo' => 'somerepo', 'color' => '#ff00aa'],
['owner' => 'other', 'repo' => 'thing', 'color' => '#00ff00'],
], $config->codebergRepos());
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());
}
public function testCodebergReposFallsBackToDefaultsWhenOverrideIsUnusable(): void
{
$config = new Config(['CODEBERG_REPOS' => 'nur-ein-slug-ohne-doppelpunkt']);
self::assertSame([
['owner' => 'fds2610', 'repo' => 'monitor', 'color' => '#fbca04'],
['owner' => 'fds2610', 'repo' => 'Steuerkram', 'color' => '#28a745'],
['owner' => 'fds2610', 'repo' => 'nc-gantt', 'color' => '#0366d6'],
], $config->codebergRepos());
}
}