true, 'status' => 'active', 'domain' => 'example.com', 'expires_at' => '2027-01-21', 'activations_count' => 1, 'max_activations' => 3, ]; $status = LicenseStatus::fromArray($data); self::assertTrue($status->valid); self::assertSame(LicenseState::Active, $status->status); self::assertSame('example.com', $status->domain); self::assertInstanceOf(\DateTimeImmutable::class, $status->expiresAt); self::assertSame('2027-01-21', $status->expiresAt->format('Y-m-d')); self::assertSame(1, $status->activationsCount); self::assertSame(3, $status->maxActivations); } #[Test] #[DataProvider('licenseStateProvider')] public function itParsesAllLicenseStates(string $stateString, string $expectedStateValue): void { $data = [ 'valid' => false, 'status' => $stateString, 'domain' => 'test.com', 'expires_at' => null, 'activations_count' => 0, 'max_activations' => 1, ]; $status = LicenseStatus::fromArray($data); self::assertSame($expectedStateValue, $status->status->value); } public static function licenseStateProvider(): array { return [ 'active' => ['active', 'active'], 'inactive' => ['inactive', 'inactive'], 'expired' => ['expired', 'expired'], 'revoked' => ['revoked', 'revoked'], ]; } #[Test] public function itIdentifiesLifetimeLicense(): void { $lifetime = LicenseStatus::fromArray([ 'valid' => true, 'status' => 'active', 'domain' => 'test.com', 'expires_at' => null, 'activations_count' => 1, 'max_activations' => 1, ]); $expiring = LicenseStatus::fromArray([ 'valid' => true, 'status' => 'active', 'domain' => 'test.com', 'expires_at' => '2027-12-31', 'activations_count' => 1, 'max_activations' => 1, ]); self::assertTrue($lifetime->isLifetime()); self::assertFalse($expiring->isLifetime()); } #[Test] public function itChecksAvailableActivations(): void { $hasAvailable = LicenseStatus::fromArray([ 'valid' => true, 'status' => 'active', 'domain' => 'test.com', 'expires_at' => null, 'activations_count' => 1, 'max_activations' => 3, ]); $noAvailable = LicenseStatus::fromArray([ 'valid' => true, 'status' => 'active', 'domain' => 'test.com', 'expires_at' => null, 'activations_count' => 3, 'max_activations' => 3, ]); self::assertTrue($hasAvailable->hasAvailableActivations()); self::assertFalse($noAvailable->hasAvailableActivations()); } }