Skip to content

Commit

Permalink
Allow specifying scenario on @apiResource tags
Browse files Browse the repository at this point in the history
  • Loading branch information
shalvah committed Jun 27, 2022
1 parent 10faa50 commit 8b8bc6b
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 6 deletions.
20 changes: 14 additions & 6 deletions src/Extracting/Strategies/Responses/UseApiResourceTags.php
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ public function __invoke(ExtractedEndpointData $endpointData, array $routeRules)
*/
public function getApiResourceResponse(Tag $apiResourceTag, array $allTags, ExtractedEndpointData $endpointData): ?array
{
[$statusCode, $apiResourceClass] = $this->getStatusCodeAndApiResourceClass($apiResourceTag);
[$statusCode, $apiResourceClass, $description] = $this->getStatusCodeAndApiResourceClass($apiResourceTag);
[$model, $factoryStates, $relations, $pagination] = $this->getClassToBeTransformedAndAttributes($allTags);
$additionalData = $this->getAdditionalData($this->getApiResourceAdditionalTag($allTags));
$modelInstance = $this->instantiateApiResourceModel($model, $factoryStates, $relations);
Expand Down Expand Up @@ -132,6 +132,7 @@ public function getApiResourceResponse(Tag $apiResourceTag, array $allTags, Extr
[
'status' => $statusCode ?: 200,
'content' => $response->getContent(),
'description' => $description,
],
];
}
Expand All @@ -143,12 +144,19 @@ public function getApiResourceResponse(Tag $apiResourceTag, array $allTags, Extr
*/
private function getStatusCodeAndApiResourceClass($tag): array
{
$content = $tag->getContent();
preg_match('/^(\d{3})?\s?([\s\S]*)$/', $content, $result);
$status = (int)($result[1] ?: 0);
$apiResourceClass = $result[2];
preg_match('/^(\d{3})?\s?([\s\S]*)$/', $tag->getContent(), $result);

return [$status, $apiResourceClass];
$status = $result[1] ?: 0;
$content = $result[2];

['attributes' => $attributes, 'content' => $content] = a::parseIntoContentAndAttributes($content, ['status', 'scenario']);

$status = $attributes['status'] ?: $status;
$apiResourceClass = $content;
$description = $attributes['scenario'] ? "$status, {$attributes['scenario']}" : "$status";


return [(int)$status, $apiResourceClass, $description];
}

private function getClassToBeTransformedAndAttributes(array $tags): array
Expand Down
32 changes: 32 additions & 0 deletions tests/Strategies/Responses/UseApiResourceTagsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,38 @@ public function can_parse_apiresource_tags()
], $results);
}


/** @test */
public function can_parse_apiresource_tags_with_scenario_and_status_attributes()
{
$config = new DocumentationConfig([]);

$route = new Route(['POST'], "/somethingRandom", ['uses' => [TestController::class, 'dummy']]);

$strategy = new UseApiResourceTags($config);
$tags = [
new Tag('apiResource', 'status=202 scenario="Success" \Knuckles\Scribe\Tests\Fixtures\TestUserApiResource'),
new Tag('apiResourceModel', '\Knuckles\Scribe\Tests\Fixtures\TestUser'),
];
$results = $strategy->getApiResourceResponse(
$strategy->getApiResourceTag($tags), $tags, ExtractedEndpointData::fromRoute($route)
);

$this->assertArraySubset([
[
'status' => 202,
'description' => '202, Success',
'content' => json_encode([
'data' => [
'id' => 4,
'name' => 'Tested Again',
'email' => 'a@b.com',
],
]),
],
], $results);
}

/** @test */
public function properly_binds_route_and_request_when_fetching_apiresource_response()
{
Expand Down

0 comments on commit 8b8bc6b

Please sign in to comment.