Skip to content

Commit dcad1c3

Browse files
committed
CLEAN: AN-23685 - move AbsoluteDateValueResolver from the backend project to this bundle
1 parent f4ccde6 commit dcad1c3

File tree

3 files changed

+112
-0
lines changed

3 files changed

+112
-0
lines changed

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: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
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+
self::assertInstanceOf(AbsoluteDate::class, $resolvedArgument[0]);
31+
self::assertSame($date, $resolvedArgument[0]->format());
32+
}
33+
34+
public function testResolveWithInvalidType(): void
35+
{
36+
$request = new Request([], [], ['someArgument' => '2024-06-02']);
37+
$argument = new ArgumentMetadata('someArgument', \DateTime::class, false, false, null);
38+
$resolvedArgument = $this->resolver->resolve($request, $argument);
39+
40+
self::assertSame([], $resolvedArgument);
41+
}
42+
43+
public function testResolveWithNonStringValue(): void
44+
{
45+
$request = new Request([], [], ['someArgument' => 1]);
46+
$argument = new ArgumentMetadata('someArgument', AbsoluteDate::class, false, false, null);
47+
$resolvedArgument = $this->resolver->resolve($request, $argument);
48+
49+
self::assertSame([], $resolvedArgument);
50+
}
51+
52+
public function testResolveWithInvalidValue(): void
53+
{
54+
$request = new Request([], [], ['someArgument' => 'somevalue']);
55+
$argument = new ArgumentMetadata('someArgument', AbsoluteDate::class, false, false, null);
56+
57+
$this->expectException(BadRequestHttpException::class);
58+
$this->expectExceptionMessage('Invalid date given for parameter "somevalue"');
59+
$this->resolver->resolve($request, $argument);
60+
}
61+
}

0 commit comments

Comments
 (0)