Skip to content

Commit 16ae216

Browse files
authored
Merge pull request #34 from assoconnect/romain_23685_move_absolute_date_value_resolver
CLEAN: AN-23685 - move AbsoluteDateValueResolver from the backend project
2 parents bced088 + 6d708ab commit 16ae216

4 files changed

Lines changed: 115 additions & 1 deletion

File tree

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
"doctrine/dbal": "^2.10|^3.0",
2929
"symfony/serializer": "^6.0|^7.0",
3030
"twig/twig": "^3",
31-
"symfony/clock": "^7.3"
31+
"symfony/clock": "^6.4|^7.3"
3232
},
3333
"config": {
3434
"allow-plugins": {

config/services.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,7 @@ services:
2121

2222
AssoConnect\PHPDateBundle\Validator\:
2323
resource: "../src/Validator/*"
24+
25+
AssoConnect\PHPDateBundle\ThirdParty\Symfony\HttpKernel\Controller\ArgumentResolver\AbsoluteDateValueResolver:
26+
tags:
27+
- { name: 'controller.argument_value_resolver', priority: 150 }
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace AssoConnect\PHPDateBundle\ThirdParty\Symfony\HttpKernel\Controller\ArgumentResolver;
6+
7+
use AssoConnect\PHPDate\AbsoluteDate;
8+
use AssoConnect\PHPDate\Exception\ParsingException;
9+
use Symfony\Component\HttpFoundation\Request;
10+
use Symfony\Component\HttpKernel\Controller\ValueResolverInterface;
11+
use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata;
12+
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
13+
14+
class AbsoluteDateValueResolver implements ValueResolverInterface
15+
{
16+
/**
17+
* @return array<AbsoluteDate>
18+
*/
19+
public function resolve(Request $request, ArgumentMetadata $argument): iterable
20+
{
21+
$argumentType = $argument->getType();
22+
if (AbsoluteDate::class !== $argumentType) {
23+
return [];
24+
}
25+
26+
// get the value from the request, based on the argument name
27+
$value = $request->attributes->get($argument->getName());
28+
if (!is_string($value)) {
29+
return [];
30+
}
31+
32+
try {
33+
$date = new AbsoluteDate($value);
34+
} catch (ParsingException $e) {
35+
throw new BadRequestHttpException(
36+
sprintf(
37+
'Invalid date given for parameter "%s" (expected format: %s).',
38+
$value,
39+
AbsoluteDate::DEFAULT_DATE_FORMAT
40+
),
41+
$e
42+
);
43+
}
44+
45+
return [$date];
46+
}
47+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace AssoConnect\PHPDateBundle\Tests\ThirdParty\Symfony\HttpKernel\Controller\ArgumentResolver;
6+
7+
use AssoConnect\PHPDate\AbsoluteDate;
8+
use AssoConnect\PHPDateBundle\ThirdParty\Symfony\HttpKernel\Controller\ArgumentResolver\AbsoluteDateValueResolver;
9+
use PHPUnit\Framework\TestCase;
10+
use Symfony\Component\HttpFoundation\Request;
11+
use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata;
12+
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
13+
14+
class AbsoluteDateValueResolverTest extends TestCase
15+
{
16+
private AbsoluteDateValueResolver $resolver;
17+
18+
protected function setUp(): void
19+
{
20+
$this->resolver = new AbsoluteDateValueResolver();
21+
}
22+
23+
public function testResolve(): void
24+
{
25+
$request = new Request([], [], ['someArgument' => $date = '2024-06-02']);
26+
$argument = new ArgumentMetadata('someArgument', AbsoluteDate::class, false, false, null);
27+
$resolvedArgument = $this->resolver->resolve($request, $argument);
28+
29+
self::assertCount(1, $resolvedArgument);
30+
31+
foreach ($resolvedArgument as $arg) {
32+
self::assertSame($date, $arg->format());
33+
}
34+
}
35+
36+
public function testResolveWithInvalidType(): void
37+
{
38+
$request = new Request([], [], ['someArgument' => '2024-06-02']);
39+
$argument = new ArgumentMetadata('someArgument', \DateTime::class, false, false, null);
40+
$resolvedArgument = $this->resolver->resolve($request, $argument);
41+
42+
self::assertSame([], $resolvedArgument);
43+
}
44+
45+
public function testResolveWithNonStringValue(): void
46+
{
47+
$request = new Request([], [], ['someArgument' => 1]);
48+
$argument = new ArgumentMetadata('someArgument', AbsoluteDate::class, false, false, null);
49+
$resolvedArgument = $this->resolver->resolve($request, $argument);
50+
51+
self::assertSame([], $resolvedArgument);
52+
}
53+
54+
public function testResolveWithInvalidValue(): void
55+
{
56+
$request = new Request([], [], ['someArgument' => 'somevalue']);
57+
$argument = new ArgumentMetadata('someArgument', AbsoluteDate::class, false, false, null);
58+
59+
$this->expectException(BadRequestHttpException::class);
60+
$this->expectExceptionMessage('Invalid date given for parameter "somevalue"');
61+
$this->resolver->resolve($request, $argument);
62+
}
63+
}

0 commit comments

Comments
 (0)