[php-flight] fix: parsing class/enum models (#18528)

This commit is contained in:
Daniel Schreiber 2024-04-29 03:32:12 +02:00 committed by GitHub
parent 06ed7c8205
commit 7070255dc5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 61 additions and 7 deletions

View File

@ -73,7 +73,10 @@ function parseParam(mixed $param, string $type)
} elseif (str_ends_with($type, '[]')) {
return array_map(fn($el) => parseParam($el, substr($type, 0, -2)), $param);
} elseif (str_starts_with($nonNullType, '\\{{escapedModelPackage}}')) {
return new $nonNullType($param);
if (enum_exists($nonNullType)) {
return $nonNullType::tryFrom($param);
}
return $nonNullType::fromArray($param);
} else {
return $param;
}
@ -82,4 +85,4 @@ function parseParam(mixed $param, string $type)
function declaresMethod(\ReflectionClass $reflectionClass, string $methodName): bool
{
return $reflectionClass->hasMethod($methodName) && $reflectionClass->getMethod($methodName)->getDeclaringClass()->getName() === $reflectionClass->getName();
}
}

View File

@ -5,6 +5,8 @@
{{#apiInfo}}
namespace {{testPackage}};
use function {{invokerPackage}}\parseParam;
class RegisterRoutesTest extends \PHPUnit\Framework\TestCase {
{{#apis}}
public function testRegisterRoutes{{classname}}(): void
@ -27,5 +29,25 @@ class RegisterRoutesTest extends \PHPUnit\Framework\TestCase {
$this->assertTrue(true);
}
{{/apis}}
{{#models}}
{{#model}}
{{#isEnum}}
public function testParseParamsEnum{{classname}}(): void
{
{{#allowableValues}}
{{#enumVars}}
{{#-first}}
$value = {{{value}}};
{{/-first}}
{{/enumVars}}
{{/allowableValues}}
$this->assertEquals(
parseParam($value, '\\{{escapedModelPackage}}\\{{classname}}'),
\{{modelPackage}}\{{classname}}::{{#allowableValues}}{{#enumVars}}{{#-first}}{{{name}}}{{/-first}}{{/enumVars}}{{/allowableValues}}
);
}
{{/isEnum}}
{{/model}}
{{/models}}
}
{{/apiInfo}}

View File

@ -47,7 +47,7 @@ class RegisterRoutes {
\Flight::route('DELETE /pet/@petId', function (string $petId) use ($handler) {
$r = \Flight::request();
$handler->deletePet(
parseParam($petId, 'int'),
parseParam($petId, 'int'),
parseParam($r->getHeader('api_key'), '?string')
);
\Flight::halt(204);
@ -313,7 +313,7 @@ class RegisterRoutes {
\Flight::route('GET /user/login', function () use ($handler) {
$r = \Flight::request();
$result = $handler->loginUser(
parseParam($r->query['username'] ?? null, 'string'),
parseParam($r->query['username'] ?? null, 'string'),
parseParam($r->query['password'] ?? null, 'string')
);
if ($result === null) {
@ -343,7 +343,7 @@ class RegisterRoutes {
\Flight::route('PUT /user/@username', function (string $username) use ($handler) {
$r = \Flight::request();
$handler->updateUser(
parseParam($username, 'string'),
parseParam($username, 'string'),
parseParam(json_decode($r->getBody(), true), '\\OpenAPIServer\\Model\\User')
);
\Flight::halt(204);
@ -368,7 +368,10 @@ function parseParam(mixed $param, string $type)
} elseif (str_ends_with($type, '[]')) {
return array_map(fn($el) => parseParam($el, substr($type, 0, -2)), $param);
} elseif (str_starts_with($nonNullType, '\\OpenAPIServer\\Model')) {
return new $nonNullType($param);
if (enum_exists($nonNullType)) {
return $nonNullType::tryFrom($param);
}
return $nonNullType::fromArray($param);
} else {
return $param;
}
@ -377,4 +380,4 @@ function parseParam(mixed $param, string $type)
function declaresMethod(\ReflectionClass $reflectionClass, string $methodName): bool
{
return $reflectionClass->hasMethod($methodName) && $reflectionClass->getMethod($methodName)->getDeclaringClass()->getName() === $reflectionClass->getName();
}
}

View File

@ -17,6 +17,8 @@
namespace OpenAPIServer\Test;
use function OpenAPIServer\parseParam;
class RegisterRoutesTest extends \PHPUnit\Framework\TestCase {
public function testRegisterRoutesAbstractPetApi(): void
{
@ -49,4 +51,28 @@ class RegisterRoutesTest extends \PHPUnit\Framework\TestCase {
\OpenAPIServer\RegisterRoutes::registerRoutes($handler);
$this->assertTrue(true);
}
public function testParseParamsEnumFindPetsByStatusStatusParameterInner(): void
{
$value = 'available';
$this->assertEquals(
parseParam($value, '\\OpenAPIServer\\Model\\FindPetsByStatusStatusParameterInner'),
\OpenAPIServer\Model\FindPetsByStatusStatusParameterInner::AVAILABLE
);
}
public function testParseParamsEnumOrderStatus(): void
{
$value = 'placed';
$this->assertEquals(
parseParam($value, '\\OpenAPIServer\\Model\\OrderStatus'),
\OpenAPIServer\Model\OrderStatus::PLACED
);
}
public function testParseParamsEnumPetStatus(): void
{
$value = 'available';
$this->assertEquals(
parseParam($value, '\\OpenAPIServer\\Model\\PetStatus'),
\OpenAPIServer\Model\PetStatus::AVAILABLE
);
}
}