Skip to content

Commit b265eca

Browse files
committed
Fix #4
1 parent dab0ecb commit b265eca

File tree

3 files changed

+273
-159
lines changed

3 files changed

+273
-159
lines changed

src/OpenApiValidation.php

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -366,21 +366,26 @@ private function validateObject(array $schema, array $value) : array
366366
}
367367
$validator = new Validator();
368368
$validator->setFormats($this->formatContainer);
369-
try {
370-
$value = json_decode(json_encode($value));
371-
$schema = json_decode(json_encode($schema));
372-
$result = $validator->dataValidation($value, $schema, 99);
373-
} catch (Exception $e) {
374-
return [[
375-
'name' => 'server',
376-
'code' => 'error_server',
377-
'message' => $e->getMessage(),
378-
]];
379-
return [$e->getMessage()];
380-
}
381-
if (!$result->isValid()) {
382-
foreach ($result->getErrors() as $error) {
383-
$errors = array_merge($errors, $this->parseErrors($error));
369+
370+
// TODO support for anyOf, oneOf, not, discriminator property
371+
$schemas = isset($schema['allOf']) ? $schema['allOf'] : [$schema];
372+
foreach ($schemas as $schema) {
373+
try {
374+
$value = json_decode(json_encode($value));
375+
$schema = json_decode(json_encode($schema));
376+
$result = $validator->dataValidation($value, $schema, 99);
377+
} catch (Exception $e) {
378+
return [[
379+
'name' => 'server',
380+
'code' => 'error_server',
381+
'message' => $e->getMessage(),
382+
]];
383+
return [$e->getMessage()];
384+
}
385+
if (!$result->isValid()) {
386+
foreach ($result->getErrors() as $error) {
387+
$errors = array_merge($errors, $this->parseErrors($error));
388+
}
384389
}
385390
}
386391
return $errors;

tests/RequestBodyTest.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,4 +77,25 @@ public function testEmptyRequestBody()
7777
$this->assertTrue($json['ok']);
7878
$this->assertSame(200, $response->getStatusCode());
7979
}
80+
81+
public function testAllOfComposition()
82+
{
83+
$response = $this->response('put', '/all/of', [
84+
'body' => [
85+
'id' => 'a',
86+
'first_name' => 'Jane',
87+
'last_name' => 'Doe',
88+
'phone' => '3333-11111111',
89+
'nationality' => 'IE',
90+
],
91+
]);
92+
$json = $this->json($response);
93+
$this->assertSame('e_mail', $json['errors'][0]['name']);
94+
$this->assertSame('error_required', $json['errors'][0]['code']);
95+
$this->assertSame(400, $response->getStatusCode());
96+
$this->assertSame('id', $json['errors'][1]['name']);
97+
$this->assertSame('string', $json['errors'][1]['used']);
98+
$this->assertSame('integer', $json['errors'][1]['expected']);
99+
$this->assertSame('error_type', $json['errors'][1]['code']);
100+
}
80101
}

0 commit comments

Comments
 (0)