Skip to content

Commit

Permalink
fix: add fields as required given nested path and add test
Browse files Browse the repository at this point in the history
  • Loading branch information
daniel committed Sep 26, 2024
1 parent ff45ff8 commit 141554a
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 9 deletions.
9 changes: 5 additions & 4 deletions src/Writing/OpenAPISpecWriter.php
Original file line number Diff line number Diff line change
Expand Up @@ -565,7 +565,7 @@ public function generateSchemaForValue(mixed $value, OutputEndpointData $endpoin
$subFieldPath = sprintf('%s.%s', $path, $subField);
$properties[$subField] = $this->generateSchemaForValue($subValue, $endpoint, $subFieldPath);
}
$required = $this->filterRequiredFields($endpoint, array_keys($properties));
$required = $this->filterRequiredFields($endpoint, array_keys($properties), $path);

$schema = [
'type' => 'object',
Expand Down Expand Up @@ -603,13 +603,14 @@ public function generateSchemaForValue(mixed $value, OutputEndpointData $endpoin
}

/**
* Given an enpoint and a set of properties, return the properties that are specified as required.
* Given an enpoint and a set of object keys at a path, return the properties that are specified as required.
*/
public function filterRequiredFields(OutputEndpointData $endpoint, array $properties): array
public function filterRequiredFields(OutputEndpointData $endpoint, array $properties, string $path = ''): array
{
$required = [];
foreach ($properties as $property) {
if (isset($endpoint->responseFields[$property]) && $endpoint->responseFields[$property]->required) {
$responseField = $endpoint->responseFields["$path.$property"] ?? $endpoint->responseFields[$property] ?? null;
if ($responseField && $responseField->required) {
$required[] = $property;
}
}
Expand Down
37 changes: 32 additions & 5 deletions tests/Unit/OpenAPISpecWriterTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -436,7 +436,7 @@ public function adds_responses_correctly_as_responses_on_operation_object()
[
'status' => 201,
'description' => '',
'content' => '{"this": "shouldn\'t be ignored", "and this": "too", "sub level 0": { "sub level 1 key 1": "sl0_sl1k1", "sub level 1 key 2": [ { "sub level 2 key 1": "sl0_sl1k2_sl2k1", "sub level 2 key 2": { "sub level 3 key 1": "sl0_sl1k2_sl2k2_sl3k1" } } ], "sub level 1 key 3": { "sub level 2 key 1": "sl0_sl1k3_sl2k2", "sub level 2 key 2": { "sub level 3 key 1": "sl0_sl1k3_sl2k2_sl3k1", "sub level 3 key null": null, "sub level 3 key integer": 99 } } } }',
'content' => '{"this": "shouldn\'t be ignored", "and this": "too", "also this": "too", "sub level 0": { "sub level 1 key 1": "sl0_sl1k1", "sub level 1 key 2": [ { "sub level 2 key 1": "sl0_sl1k2_sl2k1", "sub level 2 key 2": { "sub level 3 key 1": "sl0_sl1k2_sl2k2_sl3k1" } } ], "sub level 1 key 3": { "sub level 2 key 1": "sl0_sl1k3_sl2k2", "sub level 2 key 2": { "sub level 3 key 1": "sl0_sl1k3_sl2k2_sl3k1", "sub level 3 key null": null, "sub level 3 key integer": 99 }, "sub level 2 key 3 required" : "sl0_sl1k3_sl2k3" } } }',
],
],
'responseFields' => [
Expand All @@ -445,9 +445,19 @@ public function adds_responses_correctly_as_responses_on_operation_object()
'type' => 'string',
'description' => 'Parameter description, ha!',
],
'also this' => [
'name' => 'also this',
'type' => 'string',
'description' => 'This response parameter is required.',
'required' => true,
],
'sub level 0.sub level 1 key 3.sub level 2 key 1'=> [
'description' => 'This is description of nested object',
]
'description' => 'This is a description of a nested object',
],
'sub level 0.sub level 1 key 3.sub level 2 key 3 required'=> [
'description' => 'This is a description of a required nested object',
'required' => true,
],
],
]);
$endpointData2 = $this->createMockEndpointData([
Expand Down Expand Up @@ -485,6 +495,11 @@ public function adds_responses_correctly_as_responses_on_operation_object()
'example' => "too",
'type' => 'string',
],
'also this' => [
'description' => 'This response parameter is required.',
'example' => "too",
'type' => 'string',
],
'sub level 0' => [
'type' => 'object',
'properties' => [
Expand Down Expand Up @@ -512,7 +527,7 @@ public function adds_responses_correctly_as_responses_on_operation_object()
'sub level 2 key 1' => [
'type' => 'string',
'example' => 'sl0_sl1k3_sl2k2',
'description' => 'This is description of nested object'
'description' => 'This is a description of a nested object'
],
'sub level 2 key 2' => [
'type' => 'object',
Expand All @@ -530,12 +545,24 @@ public function adds_responses_correctly_as_responses_on_operation_object()
'example' => 99
]
]
]
],
'sub level 2 key 3 required' => [
'type' => 'string',
'example' => 'sl0_sl1k3_sl2k3',
'description' => 'This is a description of a required nested object'
],

],
'required' => [
'sub level 2 key 3 required'
]
]
]
]
],
'required' => [
'also this'
]
],
],
],
Expand Down

0 comments on commit 141554a

Please sign in to comment.