Skip to content

Commit

Permalink
Merge pull request #2 from fractalzombie/feature/github-workflows-and…
Browse files Browse the repository at this point in the history
…-update-dependecies

[RequestMapper]: GitHub Workflows, Symfony 5.4|6.0, Refactoring
  • Loading branch information
fractalzombie committed Dec 5, 2021
2 parents 4c86f75 + 27eb73e commit 48aa4fe
Show file tree
Hide file tree
Showing 7 changed files with 79 additions and 12 deletions.
5 changes: 1 addition & 4 deletions .github/workflows/php.yml
Expand Up @@ -8,7 +8,7 @@ on:

jobs:
build:
runs-on: ubuntu-latest
runs-on: self-hosted

steps:
- uses: actions/checkout@v2
Expand All @@ -24,9 +24,6 @@ jobs:
tools: pecl, phpunit
ini-values: post_max_size=256M

- name: check if rdkafka is there
run: php -v && php --ri rdkafka

- name: Cache Composer packages
id: composer-cache
uses: actions/cache@v2
Expand Down
8 changes: 5 additions & 3 deletions Converter/RequestConverter.php
Expand Up @@ -36,9 +36,11 @@ public function __construct(

public function convert(ConverterData $data): object
{
$parameters = $data->getRequestParameters();
$parameterClass = $data->getParameterClass() ?? throw ConverterException::nullableParameterClass();

try {
$parameters = $data->getRequest()->request->all();
$class = $this->classExtractor->extract($data->getParameterClass(), $parameters);
$class = $this->classExtractor->extract($parameterClass, $parameters);
} catch (ClassExtractorException $e) {
throw ValidationException::fromErrors(ValidationError::fromTypeAndClassExtractorException(DiscriminatorMap::class, $e));
} catch (\Throwable $e) {
Expand All @@ -47,7 +49,7 @@ public function convert(ConverterData $data): object

if ($data->isValidationNeeded()) {
$constraints = $this->constraintExtractor->extract($class);
$parameters = $this->parametersExtractor->extract($data->getParameterClass(), $parameters);
$parameters = $this->parametersExtractor->extract($parameterClass, $parameters);

$this->validate($parameters, $data->getValidationGroups(), $constraints);
}
Expand Down
5 changes: 5 additions & 0 deletions Data/ConverterData.php
Expand Up @@ -29,6 +29,11 @@ public function getRequest(): Request
return $this->request;
}

public function getRequestParameters(): array
{
return $this->request->request->all();
}

#[Pure]
public function getParameterClass(): ?string
{
Expand Down
8 changes: 8 additions & 0 deletions Exception/ConverterException.php
Expand Up @@ -4,10 +4,18 @@

namespace FRZB\Component\RequestMapper\Exception;

use JetBrains\PhpStorm\Pure;

final class ConverterException extends \LogicException
{
public static function fromThrowable(\Throwable $e): self
{
return new self($e->getMessage(), (int) $e->getCode(), $e);
}

#[Pure]
public static function nullableParameterClass(): self
{
return new self('Property "parameterClass" can not be null');
}
}
4 changes: 2 additions & 2 deletions Helper/ClassHelper.php
Expand Up @@ -46,10 +46,10 @@ public static function getPropertyMapping(string $className): array
}

/** @return \ReflectionParameter[] */
public static function getMethodParameters(string $class, string $method): array
public static function getMethodParameters(string $className, string $classMethod): array
{
try {
return (new \ReflectionMethod($class, $method))->getParameters();
return (new \ReflectionMethod($className, $classMethod))->getParameters();
} catch (\ReflectionException) {
return [];
}
Expand Down
22 changes: 19 additions & 3 deletions Tests/Unit/Converter/RequestConverterTest.php
Expand Up @@ -60,13 +60,15 @@ protected function setUp(): void
}

/** @dataProvider caseProvider */
public function testConvertMethod(string $service, InvokedCountMatcher $expects, string $method, \Throwable $exception, string $expectedExceptionClass): void
public function testConvertMethod(string $service, InvokedCountMatcher $expects, string $method, \Throwable $exception, string $expectedExceptionClass, array $parameters, bool $willServiceThrow = true): void
{
$attribute = new ParamConverter(parameterClass: CreateSettingsRequest::class, parameterName: 'request');
$attribute = new ParamConverter(...$parameters);
$request = RequestHelper::makeRequest(method: Request::METHOD_POST, params: []);
$data = new ConverterData($request, $attribute);

$this->{$service}->expects($expects)->method($method)->willThrowException($exception);
if ($willServiceThrow) {
$this->{$service}->expects($expects)->method($method)->willThrowException($exception);
}

$this->expectException($expectedExceptionClass);

Expand All @@ -81,6 +83,7 @@ public function caseProvider(): iterable
'method' => 'extract',
'exception' => new ClassExtractorException('request', TestConstant::EXCEPTION_MESSAGE),
'expected_exception_class' => ValidationException::class,
'parameters' => ['parameterClass' => CreateSettingsRequest::class, 'parameterName' => 'request'],
];

yield sprintf('%s::%s expects %s, exception %s, expected exception %s', DiscriminatorMapExtractor::class, 'extract', 'once', \TypeError::class, ConverterException::class) => [
Expand All @@ -89,6 +92,7 @@ public function caseProvider(): iterable
'method' => 'extract',
'exception' => new \TypeError(TestConstant::EXCEPTION_MESSAGE),
'expected_exception_class' => ConverterException::class,
'parameters' => ['parameterClass' => CreateSettingsRequest::class, 'parameterName' => 'request'],
];

yield sprintf('%s::%s expects %s, exception %s, expected exception %s', Denormalizer::class, 'denormalize', 'once', \TypeError::class, ValidationException::class) => [
Expand All @@ -97,6 +101,7 @@ public function caseProvider(): iterable
'method' => 'denormalize',
'exception' => new \TypeError(TestConstant::EXCEPTION_MESSAGE),
'expected_exception_class' => ValidationException::class,
'parameters' => ['parameterClass' => CreateSettingsRequest::class, 'parameterName' => 'request'],
];

yield sprintf('%s::%s expects %s, exception %s, expected exception %s', Denormalizer::class, 'denormalize', 'once', LogicException::class, ConverterException::class) => [
Expand All @@ -105,6 +110,17 @@ public function caseProvider(): iterable
'method' => 'denormalize',
'exception' => new LogicException(TestConstant::EXCEPTION_MESSAGE),
'expected_exception_class' => ConverterException::class,
'parameters' => ['parameterClass' => CreateSettingsRequest::class, 'parameterName' => 'request'],
];

yield sprintf('%s::%s expects %s, exception %s, expected exception %s', RequestConverter::class, 'convert', 'once', ConverterException::class, ConverterException::class) => [
'service' => 'converter',
'expects' => self::once(),
'method' => 'convert',
'exception' => ConverterException::nullableParameterClass(),
'expected_exception_class' => ConverterException::class,
'parameters' => [],
'will_service_throw' => false,
];
}
}
39 changes: 39 additions & 0 deletions Tests/Unit/Data/ConverterDataTest.php
@@ -0,0 +1,39 @@
<?php

declare(strict_types=1);


namespace FRZB\Component\RequestMapper\Tests\Unit\Data;


use FRZB\Component\RequestMapper\Attribute\ParamConverter;
use FRZB\Component\RequestMapper\Data\ConverterData;
use FRZB\Component\RequestMapper\Tests\Helper\RequestHelper;
use FRZB\Component\RequestMapper\Tests\Helper\TestConstant;
use FRZB\Component\RequestMapper\Tests\Stub\CreateUserRequest;
use PHPUnit\Framework\TestCase;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Serializer\Normalizer\AbstractObjectNormalizer;

/**
* @group request-mapper
*
* @internal
*/
class ConverterDataTest extends TestCase
{
public function testConverterDataMethods(): void
{
$params = ['name' => TestConstant::USER_NAME];
$request = RequestHelper::makeRequest(Request::METHOD_POST, $params);
$attribute = new ParamConverter(CreateUserRequest::class, 'request');
$data = new ConverterData($request, $attribute);

self::assertSame($request, $data->getRequest());
self::assertSame($params, $data->getRequestParameters());
self::assertSame(CreateUserRequest::class, $data->getParameterClass());
self::assertSame([AbstractObjectNormalizer::DISABLE_TYPE_ENFORCEMENT => true], $data->getSerializerContext());
self::assertSame(['Default'], $data->getValidationGroups());
self::assertTrue($data->isValidationNeeded());
}
}

0 comments on commit 48aa4fe

Please sign in to comment.