Skip to content

Commit

Permalink
Merge pull request #16 from rikgirbes/opi-json-schema-update
Browse files Browse the repository at this point in the history
Updated: opis/json-schema to 2.3
  • Loading branch information
codeliner authored Jun 23, 2023
2 parents 70bebeb + f017afc commit 57ac469
Show file tree
Hide file tree
Showing 5 changed files with 66 additions and 35 deletions.
4 changes: 2 additions & 2 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
}
],
"require": {
"php": "^7.4 || ^8.0",
"php": "^8.1",
"ext-json": "*",
"event-engine/php-data": "^2.0.1",
"event-engine/php-engine-utils": "^0.2.1",
Expand All @@ -26,7 +26,7 @@
"require-dev": {
"justinrainbow/json-schema": "^5.2",
"malukenho/docheader": "^0.1.4",
"opis/json-schema": "^1.0",
"opis/json-schema": "^2.3.0",
"phpunit/phpunit": "^8.0 || ^9.0",
"prooph/php-cs-fixer-config": "^v0.4.0",
"roave/security-advisories": "dev-latest",
Expand Down
32 changes: 10 additions & 22 deletions src/Exception/OpisJsonValidationError.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,16 @@
namespace EventEngine\JsonSchema\Exception;


use Opis\JsonSchema\ValidationError;
use Opis\JsonSchema\Errors\ErrorFormatter;
use Opis\JsonSchema\Errors\ValidationError;

class OpisJsonValidationError extends JsonValidationError
{
/**
* @var ValidationError[]
*/
private $errors;
private array $errors;
private ?ErrorFormatter $errorFormatter = null;

public static function withError(string $objectName, ValidationError ...$validationErrors): OpisJsonValidationError
{
Expand All @@ -28,15 +30,6 @@ public static function withError(string $objectName, ValidationError ...$validat

foreach ($validationErrors as $error) {
$self->message .= $self->errorMessage($error);

if ($error->subErrorsCount()) {
$self->message .= \array_reduce(
$error->subErrors(),
static function ($message, ValidationError $error) use ($self) {
return $message . "\n" . $self->errorMessage($error);
}
);
}
}

return $self;
Expand All @@ -50,18 +43,13 @@ public function errors(): array
return $this->errors;
}

private function errorMessage(ValidationError $error): string
private function errorFormatter(): ErrorFormatter
{
$dataPointer = $error->dataPointer();

if (count($dataPointer) === 0) {
return \sprintf('[%s] %s', $error->keyword(), \json_encode($error->keywordArgs(), JSON_PRETTY_PRINT));
}
return $this->errorFormatter ??= new ErrorFormatter();
}

return \sprintf('field "%s" [%s] %s',
implode('.', $dataPointer),
$error->keyword(),
\json_encode($error->keywordArgs(), JSON_PRETTY_PRINT)
);
private function errorMessage(ValidationError $error): string
{
return json_encode($this->errorFormatter()->formatOutput($error, "basic"), JSON_PRETTY_PRINT);
}
}
10 changes: 7 additions & 3 deletions src/OpisJsonSchema.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
namespace EventEngine\JsonSchema;

use EventEngine\JsonSchema\Exception\OpisJsonValidationError;
use Opis\JsonSchema\Schema as OpisSchema;
use Opis\JsonSchema\Helper as OpisHelper;
use Opis\JsonSchema\Validator;

class OpisJsonSchema extends AbstractJsonSchema
Expand All @@ -35,10 +35,14 @@ public function assert(string $objectName, array $data, array $jsonSchema)

$enforcedObjectData = \json_decode(\json_encode($data));

$result = $this->jsonValidator()->schemaValidation($enforcedObjectData, OpisSchema::fromJsonString(\json_encode($jsonSchema)));
$schema = $this->jsonValidator()
->loader()
->loadObjectSchema(OpisHelper::toJSON($jsonSchema));

$result = $this->jsonValidator()->validate($enforcedObjectData, $schema);

if (! $result->isValid()) {
throw OpisJsonValidationError::withError($objectName, ...$result->getErrors());
throw OpisJsonValidationError::withError($objectName, $result->error());
}
}

Expand Down
28 changes: 23 additions & 5 deletions tests/OpisJsonSchemaTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -84,9 +84,15 @@ public function it_throws_json_validation_error_exception(): void
$data['unknown'] = 'set';

$expectedMessage = <<<'Msg'
Validation of "myObject" failed: [additionalProperties] []
field "unknown" [$schema] {
"schema": false
Validation of "myObject" failed: {
"valid": false,
"errors": [
{
"keywordLocation": "#\/additionalProperties",
"instanceLocation": "#",
"error": "Additional object properties are not allowed: unknown"
}
]
}
Msg;

Expand All @@ -108,8 +114,20 @@ public function it_throws_justin_rainbow_json_validation_error_exception(): void
$data['subObject']['unknown'] = 'set';

$expectedMessage = <<<'Msg'
Validation of "myObject" failed: field "subObject" [required] {
"missing": "p1"
Validation of "myObject" failed: {
"valid": false,
"errors": [
{
"keywordLocation": "#\/properties",
"instanceLocation": "#",
"error": "The properties must match schema: subObject"
},
{
"keywordLocation": "#\/properties\/subObject\/required",
"instanceLocation": "#\/subObject",
"error": "The required properties (p1) are missing"
}
]
}
Msg;

Expand Down
27 changes: 24 additions & 3 deletions tests/TypeSchemaReferenceTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -94,9 +94,30 @@ public function it_throws_json_validation_error_exception(): void
$data['subObject']['p1'] = 'to';

$expectedMessage = <<<'Msg'
Validation of "TestMessage payload" failed: field "subObject.p1" [minLength] {
"min": 3,
"length": 2
Validation of "TestMessage payload" failed: {
"valid": false,
"errors": [
{
"keywordLocation": "#\/properties",
"instanceLocation": "#",
"error": "The properties must match schema: subObject"
},
{
"keywordLocation": "#\/properties\/subObject\/properties",
"instanceLocation": "#\/subObject",
"error": "The properties must match schema: p1"
},
{
"keywordLocation": "#\/properties\/subObject\/properties\/p1\/%24ref",
"instanceLocation": "#\/subObject\/p1",
"error": "The data must match $ref"
},
{
"keywordLocation": "#\/definitions\/SubObject\/P1\/minLength",
"instanceLocation": "#\/subObject\/p1",
"error": "Minimum string length is 3, found 2"
}
]
}
Msg;

Expand Down

0 comments on commit 57ac469

Please sign in to comment.