diff --git a/src/Domain/ValidationCategory.php b/src/Domain/ValidationCategory.php index 30506c3..edf48ef 100644 --- a/src/Domain/ValidationCategory.php +++ b/src/Domain/ValidationCategory.php @@ -13,7 +13,7 @@ class ValidationCategory implements DomainObjectInterface public ValidationCategoryTermsCollection $terms; - private function __construct(string $name, string $description, array $fields, array $terms) + private function __construct(string $name, string $description, ?array $fields, array $terms) { $this->name = $name; $this->description = $description; @@ -33,11 +33,13 @@ public static function fromArray(array $json): ValidationCategory public function toArray(): array { - return [ + return array_filter([ 'name' => $this->name, 'description' => $this->description, 'fields' => $this->fields, - 'terms' => $this->terms, - ]; + 'terms' => $this->terms->toArray(), + ], function ($x) { + return ! is_null($x); + }); } } diff --git a/src/Domain/ValidationCategoryTerms.php b/src/Domain/ValidationCategoryTerms.php index 11dae71..0897d0d 100644 --- a/src/Domain/ValidationCategoryTerms.php +++ b/src/Domain/ValidationCategoryTerms.php @@ -11,13 +11,13 @@ class ValidationCategoryTerms implements DomainObjectInterface public string $terms; - public ?DateTimeInterface $validTill; + public ?DateTimeInterface $validUntil; - private function __construct(int $version, string $terms, ?\DateTimeInterface $validTill) + private function __construct(int $version, string $terms, ?\DateTimeInterface $validUntil) { $this->version = $version; $this->terms = $terms; - $this->validTill = $validTill; + $this->validUntil = $validUntil; } /** @@ -25,19 +25,23 @@ private function __construct(int $version, string $terms, ?\DateTimeInterface $v */ public static function fromArray(array $json): ValidationCategoryTerms { + $validUntil = $json['validUntil'] ?? null; + return new ValidationCategoryTerms( $json['version'], $json['terms'], - $json['validTill'] ? new DateTimeImmutable($json['validTill']) : null + $validUntil ? new DateTimeImmutable($validUntil) : null ); } public function toArray(): array { - return [ - 'version' => $this->version, + return array_filter([ 'terms' => $this->terms, - 'validTill' => $this->validTill, - ]; + 'validUntil' => $this->validUntil?->format('Y-m-d\TH:i:s\Z'), + 'version' => $this->version, + ], function ($x) { + return ! is_null($x); + }); } } diff --git a/src/RealtimeRegister.php b/src/RealtimeRegister.php index c217e57..9252741 100644 --- a/src/RealtimeRegister.php +++ b/src/RealtimeRegister.php @@ -17,6 +17,7 @@ use RealtimeRegister\Api\ProcessesApi; use RealtimeRegister\Api\ProvidersApi; use RealtimeRegister\Api\TLDsApi; +use RealtimeRegister\Api\ValidationApi; use RealtimeRegister\Support\AuthorizedClient; final class RealtimeRegister @@ -51,6 +52,8 @@ final class RealtimeRegister public FinancialApi $financial; + public ValidationApi $validation; + public function __construct( string $apiKey, ?string $baseUrl = null, @@ -76,5 +79,6 @@ public function setClient(AuthorizedClient $client): void $this->dnszones = new DnsZonesApi($client); $this->tlds = new TLDsApi($client); $this->financial = new FinancialApi($client); + $this->validation = new ValidationApi($client); } } diff --git a/tests/Clients/Validation/ValidationApiGetTest.php b/tests/Clients/Validation/ValidationApiGetTest.php new file mode 100644 index 0000000..7c7e2a4 --- /dev/null +++ b/tests/Clients/Validation/ValidationApiGetTest.php @@ -0,0 +1,23 @@ +validation->get('IisNu'); + + $this->assertInstanceOf(ValidationCategory::class, $response); + } +} diff --git a/tests/Clients/Validation/ValidationApiListTest.php b/tests/Clients/Validation/ValidationApiListTest.php new file mode 100644 index 0000000..231112c --- /dev/null +++ b/tests/Clients/Validation/ValidationApiListTest.php @@ -0,0 +1,90 @@ + [ + include __DIR__ . '/../../Domain/data/validation/category_valid.php', + include __DIR__ . '/../../Domain/data/validation/category_valid.php', + include __DIR__ . '/../../Domain/data/validation/category_valid.php', + ], + 'pagination' => [ + 'total' => 3, + 'offset' => 0, + 'limit' => 10, + ], + ]), + MockedClientFactory::assertRoute('GET', 'v2/validation/categories', $this) + ); + + $response = $sdk->validation->list(); + + $this->assertInstanceOf(ValidationCategoryCollection::class, $response); + } + + public function test_list_with_queries(): void + { + $sdk = MockedClientFactory::makeSdk( + 200, + json_encode([ + 'entities' => [ + include __DIR__ . '/../../Domain/data/validation/category_valid.php', + include __DIR__ . '/../../Domain/data/validation/category_valid.php', + include __DIR__ . '/../../Domain/data/validation/category_valid.php', + ], + 'pagination' => [ + 'total' => 3, + 'offset' => 0, + 'limit' => 3, + ], + ]), + MockedClientFactory::assertRoute('GET', 'v2/validation/categories', $this) + ); + + $response = $sdk->validation->list(3, 0, 'category'); + + $this->assertInstanceOf(ValidationCategoryCollection::class, $response); + } + + public function test_list_with_search_and_parameters(): void + { + $parameters = [ + 'name:like' => 'General', + ]; + + $sdk = MockedClientFactory::makeSdk( + 200, + json_encode([ + 'entities' => [ + include __DIR__ . '/../../Domain/data/validation/category_valid.php', + include __DIR__ . '/../../Domain/data/validation/category_valid.php', + ], + 'pagination' => [ + 'total' => 2, + 'offset' => 0, + 'limit' => 2, + ], + ]), + MockedClientFactory::assertRoute('GET', 'v2/validation/categories', $this, [ + 'name:like' => 'General', + 'limit' => '2', + 'offset' => '0', + 'q' => 'category', + ]) + ); + + $response = $sdk->validation->list(2, 0, 'category', $parameters); + + $this->assertInstanceOf(ValidationCategoryCollection::class, $response); + } +} diff --git a/tests/Domain/DomainCollectionTest.php b/tests/Domain/DomainCollectionTest.php index 73d2550..d608669 100644 --- a/tests/Domain/DomainCollectionTest.php +++ b/tests/Domain/DomainCollectionTest.php @@ -23,6 +23,8 @@ use RealtimeRegister\Domain\ProcessCollection; use RealtimeRegister\Domain\ProviderCollection; use RealtimeRegister\Domain\TemplateCollection; +use RealtimeRegister\Domain\ValidationCategoryCollection; +use RealtimeRegister\Domain\ValidationCategoryTermsCollection; /** * This TestCase is used to test all Domain Object Collections. @@ -50,6 +52,8 @@ public static function parserDataSet(): array 'key data collection' => [KeyDataCollection::class, include __DIR__ . '/data/key_data_valid.php'], 'price collection' => [PriceCollection::class, include __DIR__ . '/data/price_valid.php'], 'contact property collection' => [ContactPropertyCollection::class, include __DIR__ . '/data/contacts/contact_property_valid.php'], + 'validation category collection' => [ValidationCategoryCollection::class, include __DIR__ . '/data/validation/category_valid.php'], + 'validation category terms collection' => [ValidationCategoryTermsCollection::class, include __DIR__ . '/data/validation/category_terms_valid.php'], 'launch phase collection' => [LaunchPhaseCollection::class, include __DIR__ . '/data/launch_phase.php'], 'log collection' => [LogCollection::class, include __DIR__ . '/data/log.php'], 'notification collection' => [NotificationCollection::class, include __DIR__ . '/data/notifications/notification_valid.php'], diff --git a/tests/Domain/DomainObjectTest.php b/tests/Domain/DomainObjectTest.php index 46e5842..76bd617 100644 --- a/tests/Domain/DomainObjectTest.php +++ b/tests/Domain/DomainObjectTest.php @@ -34,6 +34,8 @@ use RealtimeRegister\Domain\Template; use RealtimeRegister\Domain\TemplatePreview; use RealtimeRegister\Domain\TLDInfo; +use RealtimeRegister\Domain\ValidationCategory; +use RealtimeRegister\Domain\ValidationCategoryTerms; use RealtimeRegister\Domain\Zone; use RealtimeRegister\Exceptions\InvalidArgumentException; use TypeError; @@ -85,6 +87,22 @@ public static function parserDataSet(): array include __DIR__ . '/data/contacts/contact_invalid_name.php', TypeError::class, ], + 'valid validation category (all fields)' => [ + ValidationCategory::class, + include __DIR__ . '/data/validation/category_valid.php', + ], + 'valid validation category (only required)' => [ + ValidationCategory::class, + include __DIR__ . '/data/validation/category_valid_only_required.php', + ], + 'valid validation category (valid until)' => [ + ValidationCategory::class, + include __DIR__ . '/data/validation/category_valid_with_valid_until.php', + ], + 'valid validation category terms' => [ + ValidationCategoryTerms::class, + include __DIR__ . '/data/validation/category_terms_valid.php', + ], 'valid country (all fields)' => [ Country::class, include __DIR__ . '/data/country_valid.php', diff --git a/tests/Domain/data/validation/category_terms_valid.php b/tests/Domain/data/validation/category_terms_valid.php new file mode 100644 index 0000000..1a1a85b --- /dev/null +++ b/tests/Domain/data/validation/category_terms_valid.php @@ -0,0 +1,7 @@ + 'https://example.com/iisnu-terms-v4.pdf', + 'validUntil' => '2026-01-15T00:00:00Z', + 'version' => 4, +]; diff --git a/tests/Domain/data/validation/category_valid.php b/tests/Domain/data/validation/category_valid.php new file mode 100644 index 0000000..da6f098 --- /dev/null +++ b/tests/Domain/data/validation/category_valid.php @@ -0,0 +1,17 @@ + 'General', + 'description' => 'General', + 'fields' => [ + 'organization', + 'name', + 'email', + ], + 'terms' => [ + [ + 'terms' => 'https://example.com/terms-and-conditions', + 'version' => 1, + ], + ], +]; diff --git a/tests/Domain/data/validation/category_valid_only_required.php b/tests/Domain/data/validation/category_valid_only_required.php new file mode 100644 index 0000000..de94d5c --- /dev/null +++ b/tests/Domain/data/validation/category_valid_only_required.php @@ -0,0 +1,12 @@ + 'CIRA', + 'description' => 'CIRA validation category', + 'terms' => [ + [ + 'terms' => 'https://example.com/cira-terms.pdf', + 'version' => 1, + ], + ], +]; diff --git a/tests/Domain/data/validation/category_valid_with_valid_until.php b/tests/Domain/data/validation/category_valid_with_valid_until.php new file mode 100644 index 0000000..a8c3739 --- /dev/null +++ b/tests/Domain/data/validation/category_valid_with_valid_until.php @@ -0,0 +1,21 @@ + 'IisNu', + 'description' => 'IisNu validation category', + 'fields' => [ + 'organization', + 'name', + ], + 'terms' => [ + [ + 'terms' => 'https://example.com/iisnu-terms-v5.pdf', + 'version' => 5, + ], + [ + 'terms' => 'https://example.com/iisnu-terms-v4.pdf', + 'validUntil' => '2026-01-15T00:00:00Z', + 'version' => 4, + ], + ], +]; diff --git a/tests/RealtimeRegisterClientTest.php b/tests/RealtimeRegisterClientTest.php index 1d895c6..feb0188 100644 --- a/tests/RealtimeRegisterClientTest.php +++ b/tests/RealtimeRegisterClientTest.php @@ -9,6 +9,7 @@ use RealtimeRegister\Api\NotificationsApi; use RealtimeRegister\Api\ProcessesApi; use RealtimeRegister\Api\ProvidersApi; +use RealtimeRegister\Api\ValidationApi; use RealtimeRegister\RealtimeRegister; use RealtimeRegister\Support\AuthorizedClient; @@ -28,5 +29,6 @@ public function test_construct(): void $this->assertInstanceOf(NotificationsApi::class, $client->notifications, 'The notifications could not be instantiated.'); $this->assertInstanceOf(ProvidersApi::class, $client->providers, 'The providers could not be instantiated.'); $this->assertInstanceOf(ProcessesApi::class, $client->processes, 'The processes could not be instantiated.'); + $this->assertInstanceOf(ValidationApi::class, $client->validation, 'The validation could not be instantiated.'); } }