Files
Enelix-EMS/tests/StoerungsSnapshotTest.php
T
2026-09-27 15:41:15 +00:00

132 lines
4.0 KiB
PHP

<?php
declare(strict_types=1);
namespace Belevo\EnelixEMS\Tests;
use Belevo\EnelixEMS\StoerungsSnapshot;
use InvalidArgumentException;
use PHPUnit\Framework\TestCase;
final class StoerungsSnapshotTest extends TestCase
{
private const INSTALLATION_ID = '123e4567-e89b-42d3-a456-426614174000';
public function testSnapshotNormalisiertDedupliziertUndSortiertMeldungen(): void
{
$snapshot = StoerungsSnapshot::erstellen(
self::INSTALLATION_ID,
42,
'main',
true,
[
[
'sourceType' => 'consumer',
'sourceId' => 'ips:8',
'sourceName' => ' Boiler ',
'code' => 'Temp.High',
'severity' => 'warning',
'message' => " Temperatur hoch ",
],
[
'sourceType' => 'manager',
'sourceId' => 'ips:42',
'sourceName' => 'Manager',
'code' => 'Grid.Missing',
'severity' => 'critical',
'message' => 'Netzmessung fehlt',
],
[
'sourceType' => 'consumer',
'sourceId' => 'ips:8',
'sourceName' => 'Boiler',
'code' => 'Temp.High',
'severity' => 'warning',
'message' => 'Temperatur sehr hoch',
],
],
1_700_000_000
);
self::assertSame('1.0', $snapshot['version']);
self::assertSame('2023-11-14T22:13:20Z', $snapshot['capturedAt']);
self::assertSame(
['Grid.Missing', 'Temp.High'],
array_column($snapshot['faults'], 'code')
);
self::assertSame('Temperatur sehr hoch', $snapshot['faults'][1]['message']);
self::assertSame(
['instanceId' => 42, 'role' => 'main', 'active' => true],
$snapshot['manager']
);
}
public function testZustandHashIgnoriertDenErfassungszeitpunkt(): void
{
$a = StoerungsSnapshot::erstellen(
self::INSTALLATION_ID,
42,
'standalone',
false,
[],
1_700_000_000
);
$b = StoerungsSnapshot::erstellen(
self::INSTALLATION_ID,
42,
'standalone',
false,
[],
1_700_000_300
);
self::assertSame(StoerungsSnapshot::zustandHash($a), StoerungsSnapshot::zustandHash($b));
}
public function testSnapshotBegrenztSichAufHundertPriorisierteMeldungen(): void
{
$meldungen = [];
for ($index = 1; $index <= 101; ++$index) {
$meldungen[] = [
'sourceType' => 'consumer',
'sourceId' => 'ips:' . $index,
'sourceName' => sprintf('Quelle %03d', $index),
'code' => 'Fault.' . $index,
'severity' => $index === 101 ? 'critical' : 'warning',
'message' => 'Testmeldung ' . $index,
];
}
$snapshot = StoerungsSnapshot::erstellen(
self::INSTALLATION_ID,
42,
'standalone',
true,
$meldungen
);
self::assertCount(100, $snapshot['faults']);
self::assertSame('Fault.101', $snapshot['faults'][0]['code']);
}
public function testUngueltigerSchweregradWirdAbgelehnt(): void
{
$this->expectException(InvalidArgumentException::class);
StoerungsSnapshot::erstellen(
self::INSTALLATION_ID,
42,
'standalone',
true,
[[
'sourceType' => 'consumer',
'sourceId' => 'ips:8',
'sourceName' => 'Boiler',
'code' => 'Temp.High',
'severity' => 'alarm',
'message' => 'Temperatur hoch',
]]
);
}
}