repository = new EventRepository(Database::inMemory()); } public function testCreateStoresEvent(): void { $event = $this->repository->create([ 'system_id' => 'srv1', 'name' => 'Ping', 'message' => 'Host nicht erreichbar', 'severity' => 'error', ]); self::assertSame('error', $event['severity']); self::assertSame('srv1', $event['system_id']); } public function testCreateRejectsInvalidSeverity(): void { $this->expectException(InvalidArgumentException::class); $this->repository->create(['name' => 'X', 'message' => 'Y', 'severity' => 'info']); } public function testLatestReturnsNewestFirst(): void { $this->repository->create(['name' => 'A', 'message' => 'a', 'severity' => 'warning', 'occurred_at' => '2026-01-01T00:00:00Z']); $this->repository->create(['name' => 'B', 'message' => 'b', 'severity' => 'error', 'occurred_at' => '2026-01-02T00:00:00Z']); $latest = $this->repository->latest(); self::assertSame('B', $latest[0]['name']); self::assertSame('A', $latest[1]['name']); } public function testLatestRespectsDefaultLimitOfFive(): void { for ($i = 0; $i < 10; $i++) { $this->repository->create([ 'name' => 'Event ' . $i, 'message' => 'msg', 'severity' => 'warning', 'occurred_at' => sprintf('2026-01-01T00:00:%02dZ', $i), ]); } self::assertCount(EventRepository::DEFAULT_LIMIT, $this->repository->latest()); } public function testLatestClampsLimitToAtLeastOne(): void { $this->repository->create(['name' => 'A', 'message' => 'a', 'severity' => 'warning']); self::assertCount(1, $this->repository->latest(0)); } public function testFingerprintChangesWhenAnEventIsCreated(): void { $before = $this->repository->fingerprint(); $this->repository->create(['name' => 'A', 'message' => 'a', 'severity' => 'warning']); self::assertNotSame($before, $this->repository->fingerprint()); } }