monitor/api/tests/Unit/Controller/RepoConfigControllerTest.php
fds2610-bot d72c945a61 Codeberg-Projekte des Sync ueber ein Modal am PO konfigurierbar machen
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
2026-07-30 17:53:39 +02:00

82 lines
2.8 KiB
PHP

<?php
declare(strict_types=1);
namespace Monitor\Api\Tests\Controller;
use Monitor\Api\Controller\RepoConfigController;
use Monitor\Api\Db\Database;
use Monitor\Api\Http\Request;
use Monitor\Api\Repository\RepoConfigRepository;
use PHPUnit\Framework\TestCase;
final class RepoConfigControllerTest extends TestCase
{
private RepoConfigController $controller;
protected function setUp(): void
{
$db = Database::inMemory();
$db->pdo()->exec('DELETE FROM repo_configs');
$this->controller = new RepoConfigController(new RepoConfigRepository($db));
}
public function testIndexReturnsEmptyListInitially(): void
{
$response = $this->controller->index(Request::create('GET', '/api/v1/repo-configs'));
self::assertSame(200, $response->status);
self::assertSame([], $response->body()['repos']);
}
public function testCreateReturns201WithNewRepo(): void
{
$response = $this->controller->create(Request::create('POST', '/api/v1/repo-configs', body: [
'owner' => 'fds2610', 'repo' => 'monitor', 'color' => '#fbca04',
]));
self::assertSame(201, $response->status);
self::assertSame('fds2610', $response->body()['repo']['owner']);
}
public function testCreateRejectsInvalidColorWith422(): void
{
$response = $this->controller->create(Request::create('POST', '/api/v1/repo-configs', body: [
'owner' => 'fds2610', 'repo' => 'monitor', 'color' => 'nope',
]));
self::assertSame(422, $response->status);
}
public function testUpdateReturnsUpdatedRepo(): void
{
$created = $this->controller->create(Request::create('POST', '/api/v1/repo-configs', body: [
'owner' => 'fds2610', 'repo' => 'monitor', 'color' => '#fbca04',
]))->body()['repo'];
$response = $this->controller->update(
Request::create('PATCH', '/api/v1/repo-configs/' . $created['id'], body: [
'owner' => 'fds2610', 'repo' => 'monitor', 'color' => '#000000',
]),
['id' => (string) $created['id']]
);
self::assertSame(200, $response->status);
self::assertSame('#000000', $response->body()['repo']['color']);
}
public function testDeleteReturnsDeletedTrue(): void
{
$created = $this->controller->create(Request::create('POST', '/api/v1/repo-configs', body: [
'owner' => 'fds2610', 'repo' => 'monitor', 'color' => '#fbca04',
]))->body()['repo'];
$response = $this->controller->delete(
Request::create('DELETE', '/api/v1/repo-configs/' . $created['id']),
['id' => (string) $created['id']]
);
self::assertSame(200, $response->status);
self::assertTrue($response->body()['deleted']);
}
}