Quelltext des aktuellen Standes
<?php
declare(strict_types=1);
use OpenNIT\Notifications\ChannelDispatcher;
/**
* Deckt die (DB-freie) Payload-Formatierung je Kanaltyp ab. Die private
* format()-Methode wird per Reflection geprüft.
*/
return static function (): void {
$ref = new ReflectionClass(ChannelDispatcher::class);
$disp = $ref->newInstanceWithoutConstructor();
$fmt = $ref->getMethod('format');
$fmt->setAccessible(true);
$call = static function (string $type, string $secret = '') use ($fmt, $disp): array {
return $fmt->invoke($disp, $type, 'Titel', 'Nachricht', 'https://example.test/x', $secret);
};
test('slack: einfacher text-Payload', function () use ($call) {
[$body, $headers] = $call('slack');
$data = json_decode($body, true);
assertTrue(is_array($data) && isset($data['text']), 'text-Feld fehlt');
assertTrue(str_contains($data['text'], 'Titel') && str_contains($data['text'], 'Nachricht'));
assertTrue(str_contains($data['text'], 'https://example.test/x'));
});
test('teams: MessageCard mit Titel und Link', function () use ($call) {
[$body] = $call('teams');
$data = json_decode($body, true);
assertSame('MessageCard', $data['@type']);
assertSame('Titel', $data['title']);
assertTrue(str_contains($data['text'], 'example.test'));
});
test('ntfy: Nachricht im Body, Metadaten in Headern', function () use ($call) {
[$body, $headers] = $call('ntfy', 'geheim');
assertSame('Nachricht', $body);
assertSame('Titel', $headers['Title'] ?? null);
assertSame('https://example.test/x', $headers['Click'] ?? null);
assertTrue(str_starts_with($headers['Content-Type'] ?? '', 'text/plain'));
assertSame('Bearer geheim', $headers['Authorization'] ?? null);
});
test('webhook: JSON-Payload, HMAC-Signatur nur mit Secret', function () use ($call) {
[$body, $headers] = $call('webhook');
$data = json_decode($body, true);
assertSame('Titel', $data['title']);
assertSame('Nachricht', $data['message']);
assertFalse(isset($headers['X-OpenNIT-Signature']), 'Ohne Secret keine Signatur');
[$body2, $headers2] = $call('webhook', 'sec');
assertSame(hash_hmac('sha256', $body2, 'sec'), $headers2['X-OpenNIT-Signature'] ?? null);
});
test('EVENTS-Katalog enthält security', function () {
assertTrue(array_key_exists('security', ChannelDispatcher::EVENTS));
});
};