[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, '[]')) { } elseif (str_ends_with($type, '[]')) {
return array_map(fn($el) => parseParam($el, substr($type, 0, -2)), $param); return array_map(fn($el) => parseParam($el, substr($type, 0, -2)), $param);
} elseif (str_starts_with($nonNullType, '\\{{escapedModelPackage}}')) { } elseif (str_starts_with($nonNullType, '\\{{escapedModelPackage}}')) {
return new $nonNullType($param); if (enum_exists($nonNullType)) {
return $nonNullType::tryFrom($param);
}
return $nonNullType::fromArray($param);
} else { } else {
return $param; return $param;
} }

View File

@ -5,6 +5,8 @@
{{#apiInfo}} {{#apiInfo}}
namespace {{testPackage}}; namespace {{testPackage}};
use function {{invokerPackage}}\parseParam;
class RegisterRoutesTest extends \PHPUnit\Framework\TestCase { class RegisterRoutesTest extends \PHPUnit\Framework\TestCase {
{{#apis}} {{#apis}}
public function testRegisterRoutes{{classname}}(): void public function testRegisterRoutes{{classname}}(): void
@ -27,5 +29,25 @@ class RegisterRoutesTest extends \PHPUnit\Framework\TestCase {
$this->assertTrue(true); $this->assertTrue(true);
} }
{{/apis}} {{/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}} {{/apiInfo}}

View File

@ -368,7 +368,10 @@ function parseParam(mixed $param, string $type)
} elseif (str_ends_with($type, '[]')) { } elseif (str_ends_with($type, '[]')) {
return array_map(fn($el) => parseParam($el, substr($type, 0, -2)), $param); return array_map(fn($el) => parseParam($el, substr($type, 0, -2)), $param);
} elseif (str_starts_with($nonNullType, '\\OpenAPIServer\\Model')) { } elseif (str_starts_with($nonNullType, '\\OpenAPIServer\\Model')) {
return new $nonNullType($param); if (enum_exists($nonNullType)) {
return $nonNullType::tryFrom($param);
}
return $nonNullType::fromArray($param);
} else { } else {
return $param; return $param;
} }

View File

@ -17,6 +17,8 @@
namespace OpenAPIServer\Test; namespace OpenAPIServer\Test;
use function OpenAPIServer\parseParam;
class RegisterRoutesTest extends \PHPUnit\Framework\TestCase { class RegisterRoutesTest extends \PHPUnit\Framework\TestCase {
public function testRegisterRoutesAbstractPetApi(): void public function testRegisterRoutesAbstractPetApi(): void
{ {
@ -49,4 +51,28 @@ class RegisterRoutesTest extends \PHPUnit\Framework\TestCase {
\OpenAPIServer\RegisterRoutes::registerRoutes($handler); \OpenAPIServer\RegisterRoutes::registerRoutes($handler);
$this->assertTrue(true); $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
);
}
} }