lease('manager_standard'), self::INSTALLATION_ID, 0, $this->zeit('2026-09-19T12:00:00Z') ); self::assertTrue(true); } public function testPeakLizenzGibtLastspitzenmodusFrei(): void { Lizenzpruefung::pruefeLease( $this->lease('manager_peak'), self::INSTALLATION_ID, 2, $this->zeit('2026-09-19T12:00:00Z') ); self::assertTrue(true); } public function testStandardLizenzSperrtLastspitzenmodus(): void { $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('Peak Shaving ist nicht lizenziert.'); Lizenzpruefung::pruefeLease( $this->lease('manager_standard'), self::INSTALLATION_ID, 1, $this->zeit('2026-09-19T12:00:00Z') ); } public function testAbgelaufeneOfflineFreigabeWirdAbgelehnt(): void { $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('Offline-Freigabe ist abgelaufen.'); Lizenzpruefung::pruefeLease( $this->lease('manager_peak'), self::INSTALLATION_ID, 0, $this->zeit('2026-10-03T12:00:00Z') ); } public function testAndereInstallationWirdAbgelehnt(): void { $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('anderen Installation'); Lizenzpruefung::pruefeLease( $this->lease('manager_standard'), '223e4567-e89b-42d3-a456-426614174000', 0, $this->zeit('2026-09-19T12:00:00Z') ); } public function testErneuerungWirdAbRefreshAfterFaellig(): void { $lease = $this->lease('manager_standard'); self::assertFalse(Lizenzpruefung::erneuerungFaellig( $lease, $this->zeit('2026-09-20T11:59:59Z') )); self::assertTrue(Lizenzpruefung::erneuerungFaellig( $lease, $this->zeit('2026-09-20T12:00:00Z') )); } public function testLeaseOhneManagerBerechtigungWirdAbgelehnt(): void { $lease = $this->lease('consumer_single'); $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('Manager-Berechtigung fehlt.'); Lizenzpruefung::pruefeLease( $lease, self::INSTALLATION_ID, 0, $this->zeit('2026-09-19T12:00:00Z') ); } public function testLizenzcodeWirdWieAufDemServerNormalisiert(): void { self::assertSame( 'ENX23456789ABCDEFGH', Lizenzpruefung::normalisiereCode('enx-2345-6789-abcd-efgh') ); self::assertTrue(Lizenzpruefung::istLizenzcodeGueltig('ENX-2345-6789-ABCD-EFGH')); self::assertFalse(Lizenzpruefung::istLizenzcodeGueltig('ENX-OOOO-OOOO-OOOO-OOOO')); } /** * @return array */ private function lease(string $sku): array { return [ 'status' => 'active', 'development' => true, 'installationId' => self::INSTALLATION_ID, 'orderId' => '323e4567-e89b-42d3-a456-426614174000', 'entitlements' => [[ 'sku' => $sku, 'catalog_key' => $sku, 'quantity' => 1, 'status' => 'active', ]], 'issuedAt' => '2026-09-19T12:00:00.000Z', 'refreshAfter' => '2026-09-20T12:00:00.000Z', 'offlineUntil' => '2026-10-03T12:00:00.000Z', ]; } private function zeit(string $wert): int { return (new DateTimeImmutable($wert))->getTimestamp(); } }