From 563cf683ac2e8324710c5ad36b9b32c5484fd6cb Mon Sep 17 00:00:00 2001 From: zerai Date: Thu, 19 Sep 2024 17:49:47 +0200 Subject: [PATCH] Added basic metadata validation. --- ...alseMetadataValidationEngineValidation.php | 24 -- .../ForMetadataSchemaValidation.php | 3 + .../MetadataValidationException.php | 5 +- .../MetadataValidator.php | 76 +++++++ .../MetadataValidatorTest.php | 205 ++++++++++++++++++ 5 files changed, 287 insertions(+), 26 deletions(-) delete mode 100644 _metadata/src/Core/MetadataValidationEngine/FixedFalseMetadataValidationEngineValidation.php create mode 100644 _metadata/src/Core/MetadataValidationEngine/MetadataValidator.php create mode 100644 _metadata/tests/Unit/Core/MetadataValidationEngine/MetadataValidatorTest.php diff --git a/_metadata/src/Core/MetadataValidationEngine/FixedFalseMetadataValidationEngineValidation.php b/_metadata/src/Core/MetadataValidationEngine/FixedFalseMetadataValidationEngineValidation.php deleted file mode 100644 index 7fee45f..0000000 --- a/_metadata/src/Core/MetadataValidationEngine/FixedFalseMetadataValidationEngineValidation.php +++ /dev/null @@ -1,24 +0,0 @@ -validate([ + 'tags' => 'irrelevant', + ]); + } + + #[Test] + #[DataProvider('invalidCategoryDataprovider')] + public function shouldFailWhenCategoryIsNotValid(array $metadata): void + { + self::expectException(MetadataValidationException::class); + self::expectExceptionMessage('Metadata \'Category\' should be string type'); + + $validator = new MetadataValidator(); + $validator->validate($metadata); + } + + #[Test] + public function shouldFailWhenThereIsNoTagsKey(): void + { + self::expectException(MetadataValidationException::class); + self::expectExceptionMessage('Metadata key \'tags\' not found'); + $validator = new MetadataValidator(); + + $validator->validate([ + 'category' => 'billing', + ]); + } + + #[Test] + #[DataProvider('invalidTagsDataprovider')] + public function shouldFailWhenTagsIsNotValid(array $metadata): void + { + self::expectException(MetadataValidationException::class); + self::expectExceptionMessage('Metadata \'tags\' should be array type'); + + $validator = new MetadataValidator(); + $validator->validate($metadata); + } + + #[Test] + public function shouldPassTheValidation(): void + { + $validator = new MetadataValidator(); + + $result = $validator->validate([ + 'category' => 'billing', + 'tags' => ['fax', 'sms'], + ]); + + self::assertTrue($result); + } + + #[Test] + #[DataProvider('approvedCategoryDataprovider')] + #[DataProvider('approvedTagsDataprovider')] + public function shouldPassTheValidationOnlyWithApprovedCategoryAndTags(array $metadata): void + { + $validator = new MetadataValidator(); + + $result = $validator->validate($metadata); + + self::assertTrue($result); + } + + public static function invalidCategoryDataprovider(): array + { + return [ + [[ + 'category' => null, + 'tags' => 'irrelevant', + ]], + [[ + 'category' => 0, + 'tags' => 'irrelevant', + ]], + [[ + 'category' => [], + 'tags' => 'irrelevant', + ]], + [[ + 'category' => new \stdClass(), + 'tags' => 'irrelevant', + ]], + ]; + } + + public static function invalidTagsDataprovider(): array + { + return [ + [[ + 'category' => 'billing', + 'tags' => null, + ]], + [[ + 'category' => 'billing', + 'tags' => 0, + ]], + [[ + 'category' => 'billing', + 'tags' => 'string', + ]], + [[ + 'category' => 'billing', + 'tags' => new \stdClass(), + ]], + [[ + 'category' => 'billing', + 'tags' => 'not allowed', + ]], + ]; + } + + public static function approvedCategoryDataprovider(): array + { + return [ + [[ + 'category' => 'administration', + 'tags' => ['fax'], + ]], + [[ + 'category' => 'billing', + 'tags' => ['fax'], + ]], + [[ + 'category' => 'ePrescribing', + 'tags' => ['fax'], + ]], + [[ + 'category' => 'miscellaneous', + 'tags' => ['fax'], + ]], + [[ + 'category' => 'telecom', + 'tags' => ['fax'], + ]], + [[ + 'category' => 'telehealth', + 'tags' => ['fax'], + ]], + [[ + 'category' => 'payment', + 'tags' => ['fax'], + ]], + ]; + } + + public static function approvedTagsDataprovider(): array + { + return [ + [[ + 'category' => 'miscellaneous', + 'tags' => ['fax'], + ]], + [[ + 'category' => 'miscellaneous', + 'tags' => ['organizer'], + ]], + [[ + 'category' => 'miscellaneous', + 'tags' => ['scheduler'], + ]], + [[ + 'category' => 'miscellaneous', + 'tags' => ['todo'], + ]], + + + + ]; + } +}