forked from fa/breadcrumb-the-shire
Feature: Security Level mit Notiz für Domains
Implementiert ein Dialog-basiertes UI zum Bearbeiten des Security Levels mit optionaler Notiz-Funktion für Helpdesk-Domains. Backend: - DomainSecurityLevelRepository: CRUD für security_levels mit note-Spalte - DomainSecurityLevelService: Business-Logik mit Batch-Enrichment - security-level-data() Endpoint: AJAX + Full-Page POST mit CSRF - Migration 010: note TEXT-Spalte hinzugefügt - Bugfix: findByTenantAndDomainNo gibt null bei leerem Array zurück Frontend (Domain-Liste): - Badge in Grid klickbar → öffnet Modal-Dialog - Dialog mit Level-Select + Notiz-Textarea - AJAX-Save mit Live-Badge-Update ohne Reload - Event-Delegation für dynamische Grid-Inhalte Frontend (Domain-Detail): - Notiz-Feld im Security-Level-Formular - PRG-Pattern mit Flash-Messages Core: - app-http.js: DEFAULT_HEADERS auf XMLHttpRequest für CSRF-Kompatibilität i18n: - Keys: Priority, Note, Optional note, Security level updated Tests: - DomainSecurityLevelServiceTest: CRUD + Batch-Enrichment
This commit is contained in:
@@ -0,0 +1,141 @@
|
||||
<?php
|
||||
|
||||
namespace MintyPHP\Tests\Module\Helpdesk\Service;
|
||||
|
||||
use MintyPHP\Module\Helpdesk\Repository\DomainSecurityLevelRepository;
|
||||
use MintyPHP\Module\Helpdesk\Service\DomainSecurityLevelService;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
class DomainSecurityLevelServiceTest extends TestCase
|
||||
{
|
||||
private const TENANT_ID = 1;
|
||||
private const TENANT_ID_OTHER = 2;
|
||||
|
||||
public function testGetLevelReturnsDefaultForUnknownDomain(): void
|
||||
{
|
||||
$repository = $this->createMock(DomainSecurityLevelRepository::class);
|
||||
$repository->method('findByTenantAndDomainNo')->willReturn(null);
|
||||
|
||||
$service = new DomainSecurityLevelService($repository);
|
||||
|
||||
$this->assertSame('normal', $service->getLevel(self::TENANT_ID, 'DNS00001'));
|
||||
}
|
||||
|
||||
public function testGetLevelReturnsStoredValue(): void
|
||||
{
|
||||
$repository = $this->createMock(DomainSecurityLevelRepository::class);
|
||||
$repository->method('findByTenantAndDomainNo')->willReturn([
|
||||
'security_level' => 'kritisch',
|
||||
]);
|
||||
|
||||
$service = new DomainSecurityLevelService($repository);
|
||||
|
||||
$this->assertSame('kritisch', $service->getLevel(self::TENANT_ID, 'DNS00001'));
|
||||
}
|
||||
|
||||
public function testGetLevelDefaultsOnInvalidStoredValue(): void
|
||||
{
|
||||
$repository = $this->createMock(DomainSecurityLevelRepository::class);
|
||||
$repository->method('findByTenantAndDomainNo')->willReturn([
|
||||
'security_level' => 'ungueltig',
|
||||
]);
|
||||
|
||||
$service = new DomainSecurityLevelService($repository);
|
||||
|
||||
$this->assertSame('normal', $service->getLevel(self::TENANT_ID, 'DNS00001'));
|
||||
}
|
||||
|
||||
public function testGetLevelReturnsDefaultForEmptyDomainNo(): void
|
||||
{
|
||||
$repository = $this->createMock(DomainSecurityLevelRepository::class);
|
||||
$repository->expects($this->never())->method('findByTenantAndDomainNo');
|
||||
|
||||
$service = new DomainSecurityLevelService($repository);
|
||||
|
||||
$this->assertSame('normal', $service->getLevel(self::TENANT_ID, ''));
|
||||
}
|
||||
|
||||
public function testSetLevelRejectsInvalidLevel(): void
|
||||
{
|
||||
$repository = $this->createMock(DomainSecurityLevelRepository::class);
|
||||
$repository->expects($this->never())->method('upsert');
|
||||
|
||||
$service = new DomainSecurityLevelService($repository);
|
||||
|
||||
$this->assertFalse($service->setLevel(self::TENANT_ID, 'DNS00001', 'ungueltig', 1));
|
||||
}
|
||||
|
||||
public function testSetLevelRejectsEmptyDomainNo(): void
|
||||
{
|
||||
$repository = $this->createMock(DomainSecurityLevelRepository::class);
|
||||
$repository->expects($this->never())->method('upsert');
|
||||
|
||||
$service = new DomainSecurityLevelService($repository);
|
||||
|
||||
$this->assertFalse($service->setLevel(self::TENANT_ID, '', 'hoch', 1));
|
||||
}
|
||||
|
||||
public function testSetLevelCallsUpsertWithCorrectParams(): void
|
||||
{
|
||||
$repository = $this->createMock(DomainSecurityLevelRepository::class);
|
||||
$repository->expects($this->once())
|
||||
->method('upsert')
|
||||
->with(self::TENANT_ID, 'DNS00001', 'hoch', 42)
|
||||
->willReturn(true);
|
||||
|
||||
$service = new DomainSecurityLevelService($repository);
|
||||
|
||||
$this->assertTrue($service->setLevel(self::TENANT_ID, 'DNS00001', 'hoch', 42));
|
||||
}
|
||||
|
||||
public function testSetLevelAllowsAllValidLevels(): void
|
||||
{
|
||||
$repository = $this->createMock(DomainSecurityLevelRepository::class);
|
||||
$repository->method('upsert')->willReturn(true);
|
||||
|
||||
$service = new DomainSecurityLevelService($repository);
|
||||
|
||||
foreach (['niedrig', 'normal', 'hoch', 'kritisch'] as $level) {
|
||||
$this->assertTrue($service->setLevel(self::TENANT_ID, 'DNS00001', $level, 1));
|
||||
}
|
||||
}
|
||||
|
||||
public function testGetAllLevelsForDomainsReturnsEmptyForEmptyInput(): void
|
||||
{
|
||||
$repository = $this->createMock(DomainSecurityLevelRepository::class);
|
||||
$repository->expects($this->never())->method('listLevelsByDomainNos');
|
||||
|
||||
$service = new DomainSecurityLevelService($repository);
|
||||
|
||||
$this->assertSame([], $service->getAllLevelsForDomains(self::TENANT_ID, []));
|
||||
}
|
||||
|
||||
public function testGetAllLevelsForDomainsDelegatesToRepository(): void
|
||||
{
|
||||
$expected = ['DNS00001' => 'hoch', 'DNS00002' => 'niedrig'];
|
||||
$repository = $this->createMock(DomainSecurityLevelRepository::class);
|
||||
$repository->method('listLevelsByDomainNos')->willReturn($expected);
|
||||
|
||||
$service = new DomainSecurityLevelService($repository);
|
||||
$result = $service->getAllLevelsForDomains(self::TENANT_ID, ['DNS00001', 'DNS00002']);
|
||||
|
||||
$this->assertSame($expected, $result);
|
||||
}
|
||||
|
||||
public function testGetBadgeVariantMapping(): void
|
||||
{
|
||||
$this->assertSame('info', DomainSecurityLevelService::getBadgeVariant('niedrig'));
|
||||
$this->assertSame('neutral', DomainSecurityLevelService::getBadgeVariant('normal'));
|
||||
$this->assertSame('warning', DomainSecurityLevelService::getBadgeVariant('hoch'));
|
||||
$this->assertSame('error', DomainSecurityLevelService::getBadgeVariant('kritisch'));
|
||||
$this->assertSame('neutral', DomainSecurityLevelService::getBadgeVariant('unknown'));
|
||||
}
|
||||
|
||||
public function testGetAllowedLevelsReturnsFourLevels(): void
|
||||
{
|
||||
$levels = DomainSecurityLevelService::getAllowedLevels();
|
||||
|
||||
$this->assertCount(4, $levels);
|
||||
$this->assertSame(['niedrig', 'normal', 'hoch', 'kritisch'], $levels);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user