fix(state): avoid deprecated PartialDenormalizationException::getErrors()
This commit is contained in:
1 parent
b2a14e558d
commit
1da883f931
5 files changed
+46
-21
No files matched your search
@@ -102,6 +102,7 @@ parameters:
|
||||
- "#Call to function method_exists\\(\\) with 'Symfony\\\\\\\\Component\\\\\\\\Serializer\\\\\\\\Serializer' and 'getSupportedTypes' will always evaluate to true\\.#"
|
||||
- "#Call to function method_exists\\(\\) with Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\NormalizerInterface and 'getSupportedTypes' will always evaluate to true\\.#"
|
||||
- "#Call to function method_exists\\(\\) with Doctrine\\\\ODM\\\\MongoDB\\\\Mapping\\\\ClassMetadata\\|Doctrine\\\\ORM\\\\Mapping\\\\ClassMetadata and 'isChangeTrackingDef…' will always evaluate to true\\.#"
|
||||
- "#Call to function method_exists\\(\\) with Symfony\\\\Component\\\\Serializer\\\\Exception\\\\PartialDenormalizationException and 'getNotNormalizableV…' will always evaluate to true\\.#"
|
||||
|
||||
# See https://github.com/phpstan/phpstan-symfony/issues/27
|
||||
-
|
||||
|
||||
@@ -107,7 +107,8 @@ final class DeserializeProvider implements ProviderInterface, StopwatchAwareInte
|
||||
}
|
||||
|
||||
$violations = new ConstraintViolationList();
|
||||
foreach ($e->getErrors() as $exception) {
|
||||
$errors = method_exists($e, 'getNotNormalizableValueErrors') ? $e->getNotNormalizableValueErrors() : $e->getErrors();
|
||||
foreach ($errors as $exception) {
|
||||
if (!$exception instanceof NotNormalizableValueException) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -365,4 +365,47 @@ class DeserializeProviderTest extends TestCase
|
||||
$request->attributes->set('input_format', 'format');
|
||||
$provider->provide($operation, ['id' => 1], ['request' => $request]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @see https://github.com/api-platform/core/issues/8650
|
||||
*/
|
||||
public function testDeserializeCollectsPartialDenormalizationErrorsWithoutDeprecation(): void
|
||||
{
|
||||
$operation = new Post(deserialize: true, class: \stdClass::class);
|
||||
$decorated = $this->createStub(ProviderInterface::class);
|
||||
$decorated->method('provide')->willReturn(null);
|
||||
|
||||
$exception = NotNormalizableValueException::createForUnexpectedDataType('Internal error detail', 42, ['string'], 'name', false);
|
||||
$partialException = new PartialDenormalizationException(null, [$exception]);
|
||||
|
||||
$serializerContextBuilder = $this->createStub(SerializerContextBuilderInterface::class);
|
||||
$serializerContextBuilder->method('createFromRequest')->willReturn([SerializerContextBuilderInterface::ASSIGN_OBJECT_TO_POPULATE => false]);
|
||||
$serializer = $this->createStub(SerializerInterface::class);
|
||||
$serializer->method('deserialize')->willThrowException($partialException);
|
||||
|
||||
$provider = new DeserializeProvider($decorated, $serializer, $serializerContextBuilder);
|
||||
$request = new Request(content: '{"name":42}');
|
||||
$request->headers->set('CONTENT_TYPE', 'application/json');
|
||||
$request->attributes->set('input_format', 'json');
|
||||
|
||||
$deprecations = [];
|
||||
set_error_handler(static function (int $type, string $message) use (&$deprecations): bool {
|
||||
$deprecations[] = $message;
|
||||
|
||||
return true;
|
||||
}, \E_USER_DEPRECATED);
|
||||
|
||||
try {
|
||||
$provider->provide($operation, [], ['request' => $request]);
|
||||
$this->fail('Expected ValidationException');
|
||||
} catch (ValidationException $e) {
|
||||
$violations = $e->getConstraintViolationList();
|
||||
} finally {
|
||||
restore_error_handler();
|
||||
}
|
||||
|
||||
$this->assertSame([], $deprecations);
|
||||
$this->assertCount(1, $violations);
|
||||
$this->assertSame('name', $violations[0]->getPropertyPath());
|
||||
}
|
||||
}
|
||||
@@ -17,8 +17,6 @@ use ApiPlatform\Symfony\Bundle\Test\ApiTestCase;
|
||||
use ApiPlatform\Tests\Fixtures\TestBundle\ApiResource\EnumValidationResource;
|
||||
use ApiPlatform\Tests\SetupClassResourcesTrait;
|
||||
use Composer\InstalledVersions;
|
||||
use Composer\Semver\VersionParser;
|
||||
use PHPUnit\Framework\Attributes\IgnoreDeprecations;
|
||||
|
||||
/**
|
||||
* @see https://github.com/api-platform/core/issues/8183
|
||||
@@ -67,13 +65,8 @@ final class EnumDenormalizationValidationTest extends ApiTestCase
|
||||
$this->assertNotNull($genderViolation, 'Expected a constraint violation on "gender" property.');
|
||||
}
|
||||
|
||||
#[IgnoreDeprecations]
|
||||
public function testInvalidBackedEnumValueWithCollectDenormalizationErrors(): void
|
||||
{
|
||||
if (InstalledVersions::satisfies(new VersionParser(), 'symfony/serializer', '>=8.1')) {
|
||||
$this->expectUserDeprecationMessage('Since symfony/serializer 8.1: The "Symfony\Component\Serializer\Exception\PartialDenormalizationException::getErrors()" method is deprecated, use "Symfony\Component\Serializer\Exception\PartialDenormalizationException::getNotNormalizableValueErrors()" instead.');
|
||||
}
|
||||
|
||||
$response = static::createClient()->request('POST', '/enum_validation_resources_collect', [
|
||||
'headers' => ['Content-Type' => 'application/ld+json'],
|
||||
'json' => ['gender' => 'unknown'],
|
||||
@@ -87,13 +80,8 @@ final class EnumDenormalizationValidationTest extends ApiTestCase
|
||||
/**
|
||||
* @see https://github.com/api-platform/core/issues/8388
|
||||
*/
|
||||
#[IgnoreDeprecations]
|
||||
public function testWrongTypeForBackedEnumReportsAcceptedScalarTypes(): void
|
||||
{
|
||||
if (InstalledVersions::satisfies(new VersionParser(), 'symfony/serializer', '>=8.1')) {
|
||||
$this->expectUserDeprecationMessage('Since symfony/serializer 8.1: The "Symfony\Component\Serializer\Exception\PartialDenormalizationException::getErrors()" method is deprecated, use "Symfony\Component\Serializer\Exception\PartialDenormalizationException::getNotNormalizableValueErrors()" instead.');
|
||||
}
|
||||
|
||||
$response = static::createClient()->request('POST', '/enum_validation_resources_collect', [
|
||||
'headers' => ['Content-Type' => 'application/ld+json'],
|
||||
'json' => ['gender' => true],
|
||||
|
||||
@@ -16,9 +16,6 @@ namespace ApiPlatform\Tests\Functional;
|
||||
use ApiPlatform\Symfony\Bundle\Test\ApiTestCase;
|
||||
use ApiPlatform\Tests\Fixtures\TestBundle\ApiResource\NullOnNonNullableProperty\NullOnNonNullableResource;
|
||||
use ApiPlatform\Tests\SetupClassResourcesTrait;
|
||||
use Composer\InstalledVersions;
|
||||
use Composer\Semver\VersionParser;
|
||||
use PHPUnit\Framework\Attributes\IgnoreDeprecations;
|
||||
|
||||
/** @see https://github.com/symfony/symfony/issues/64159 */
|
||||
final class NullOnNonNullablePropertyTest extends ApiTestCase
|
||||
@@ -48,13 +45,8 @@ final class NullOnNonNullablePropertyTest extends ApiTestCase
|
||||
$this->assertStringContainsString('Expected argument of type "string", "null" given at property path "name"', $body['hydra:description'] ?? $body['detail'] ?? '');
|
||||
}
|
||||
|
||||
#[IgnoreDeprecations]
|
||||
public function testNullOnNonNullablePropertyReturns422WhenCollectingErrors(): void
|
||||
{
|
||||
if (InstalledVersions::satisfies(new VersionParser(), 'symfony/serializer', '>=8.1')) {
|
||||
$this->expectUserDeprecationMessage('Since symfony/serializer 8.1: The "Symfony\Component\Serializer\Exception\PartialDenormalizationException::getErrors()" method is deprecated, use "Symfony\Component\Serializer\Exception\PartialDenormalizationException::getNotNormalizableValueErrors()" instead.');
|
||||
}
|
||||
|
||||
$response = self::createClient()->request('POST', '/null_on_non_nullable_resources_collect', [
|
||||
'headers' => ['Content-Type' => 'application/ld+json'],
|
||||
'json' => ['name' => null],
|
||||
|
||||
Reference in new issue
Block a user