Skip to content

Commit 964e2f3

Browse files
authored
Merge pull request #7 from Ali1/frozen
Immuntable more powerful dates/times
2 parents b131d1c + 5aee6fd commit 964e2f3

File tree

7 files changed

+200
-1
lines changed

7 files changed

+200
-1
lines changed

config/param_converter.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
'converters' => [
55
\ParamConverter\EntityParamConverter::class,
66
\ParamConverter\DateTimeParamConverter::class,
7+
\ParamConverter\FrozenDateTimeParamConverter::class,
78
\ParamConverter\BooleanParamConverter::class,
89
\ParamConverter\IntegerParamConverter::class,
910
\ParamConverter\FloatParamConverter::class
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?php
2+
namespace ParamConverter;
3+
4+
use Cake\Chronos\Date;
5+
use Cake\Http\Exception\BadRequestException;
6+
use Cake\I18n\FrozenDate;
7+
use Cake\I18n\FrozenTime;
8+
9+
/**
10+
* Class FrozenDateTimeParamConverter
11+
*
12+
* Param Converter for FrozenDate and FrozenTime classes
13+
*/
14+
class FrozenDateTimeParamConverter implements ParamConverterInterface
15+
{
16+
/**
17+
* @inheritDoc
18+
*/
19+
public function supports(string $class): bool
20+
{
21+
return $class === FrozenDate::class || $class === FrozenTime::class;
22+
}
23+
24+
/**
25+
* @inheritDoc
26+
*
27+
* @param string $value from URL
28+
* @param string $class FrozenDate or FrozenTime.
29+
*
30+
* @return FrozenTime|FrozenDate
31+
*/
32+
public function convertTo(string $value, string $class)
33+
{
34+
try {
35+
if ($class === FrozenDate::class) {
36+
return new FrozenDate($value);
37+
} else {
38+
return new FrozenTime($value);
39+
}
40+
} catch (\Exception $e) {
41+
throw new BadRequestException();
42+
}
43+
}
44+
}

tests/App/Controller/UsersController.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
namespace ParamConverter\Test\App\Controller;
44

55
use Cake\Controller\Controller;
6+
use Cake\I18n\FrozenDate;
7+
use Cake\I18n\FrozenTime;
68
use DateTime;
79
use ParamConverter\Test\App\Model\Entity\User;
810

@@ -20,6 +22,14 @@ public function withDatetime(DateTime $dateTime): void
2022
{
2123
}
2224

25+
public function withFrozenDate(FrozenDate $date): void
26+
{
27+
}
28+
29+
public function withFrozenTime(FrozenTime $frozenTime): void
30+
{
31+
}
32+
2333
public function withNoParams(): void
2434
{
2535
}

tests/TestCase/DateTimeParamConverterTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public function conversionDataProvider(): array
4444
return [
4545
// raw value, converted value
4646
['now', date('Y-m-d'), 'Y-m-d'],
47-
['now', date('Y-m-d h:i:s'), 'Y-m-d h:i:s'],
47+
['now', date('Y-m-d h:i'), 'Y-m-d h:i'],
4848
['2020-09-10', '2020-09-10', 'Y-m-d'],
4949
['2020-09-10 15:10:00', '2020-09-10 15:10:00', 'Y-m-d H:i:s'],
5050
];

tests/TestCase/DispatchListenerTest.php

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
use Cake\Event\Event;
77
use Cake\Http\Response;
88
use Cake\Http\ServerRequest;
9+
use Cake\I18n\FrozenDate;
10+
use Cake\I18n\FrozenTime;
911
use Cake\ORM\TableRegistry;
1012
use Cake\TestSuite\TestCase;
1113
use DateTime;
@@ -68,6 +70,42 @@ public function testDatetime(): void
6870
$this->assertTrue($updatedRequest->getParam('pass.0') instanceof Datetime);
6971
}
7072

73+
public function testFrozenDate(): void
74+
{
75+
$event = new Event('beforeEvent');
76+
$event->setData('controller', new UsersController());
77+
78+
$request = (new ServerRequest())
79+
->withParam('pass', ["2020-10-10"])
80+
->withParam('action', 'withFrozenDate');
81+
$response = new Response();
82+
83+
$listener = new DispatchListener();
84+
$listener->beforeDispatch($event, $request, $response);
85+
86+
/** @var ServerRequest $updatedRequest */
87+
$updatedRequest = $event->getData('request');
88+
$this->assertTrue($updatedRequest->getParam('pass.0') instanceof FrozenDate);
89+
}
90+
91+
public function testFrozenTime(): void
92+
{
93+
$event = new Event('beforeEvent');
94+
$event->setData('controller', new UsersController());
95+
96+
$request = (new ServerRequest())
97+
->withParam('pass', ["2020-10-10"])
98+
->withParam('action', 'withFrozenTime');
99+
$response = new Response();
100+
101+
$listener = new DispatchListener();
102+
$listener->beforeDispatch($event, $request, $response);
103+
104+
/** @var ServerRequest $updatedRequest */
105+
$updatedRequest = $event->getData('request');
106+
$this->assertTrue($updatedRequest->getParam('pass.0') instanceof FrozenTime);
107+
}
108+
71109
public function testEntity(): void
72110
{
73111
$event = new Event('beforeEvent');
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<?php
2+
3+
namespace ParamConverter\Test\TestCase;
4+
5+
use Cake\Http\Exception\BadRequestException;
6+
use Cake\I18n\FrozenDate;
7+
use Cake\TestSuite\TestCase;
8+
use ParamConverter\FrozenDateTimeParamConverter;
9+
10+
class FrozenDateParamConverterTest extends TestCase
11+
{
12+
public function testSupports(): void
13+
{
14+
$converter = new FrozenDateTimeParamConverter();
15+
$this->assertTrue($converter->supports(FrozenDate::class));
16+
}
17+
18+
/**
19+
* @dataProvider conversionDataProvider
20+
* @param string $rawValue Raw value
21+
* @param string $expectedValue Expected value upon conversion
22+
* @param string $format Date format
23+
*/
24+
public function testConvertTo(string $rawValue, string $expectedValue, string $format): void
25+
{
26+
$converter = new FrozenDateTimeParamConverter();
27+
/** @var \Cake\I18n\FrozenDate $convertedValue */
28+
$convertedValue = $converter->convertTo($rawValue, FrozenDate::class);
29+
$this->assertInstanceOf(FrozenDate::class, $convertedValue);
30+
$this->assertEquals($expectedValue, $convertedValue->format($format));
31+
}
32+
33+
public function testException(): void
34+
{
35+
$converter = new FrozenDateTimeParamConverter();
36+
$this->expectException(BadRequestException::class);
37+
$converter->convertTo("notvalid", FrozenDate::class);
38+
}
39+
40+
/**
41+
* @return array[]
42+
*/
43+
public function conversionDataProvider(): array
44+
{
45+
return [
46+
// raw value, converted value
47+
['now', date('Y-m-d'), 'Y-m-d'],
48+
['now', date('Y-m-d 00:00:00'), 'Y-m-d H:i:s'],
49+
['2020-09-10', '2020-09-10', 'Y-m-d'],
50+
['2020-09-10 15:10:00', '2020-09-10 00:00:00', 'Y-m-d H:i:s'],
51+
];
52+
}
53+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<?php
2+
3+
namespace ParamConverter\Test\TestCase;
4+
5+
use Cake\Http\Exception\BadRequestException;
6+
use Cake\I18n\FrozenTime;
7+
use Cake\TestSuite\TestCase;
8+
use ParamConverter\FrozenDateTimeParamConverter;
9+
10+
class FrozenTimeParamConverterTest extends TestCase
11+
{
12+
public function testSupports(): void
13+
{
14+
$converter = new FrozenDateTimeParamConverter();
15+
$this->assertTrue($converter->supports(FrozenTime::class));
16+
}
17+
18+
/**
19+
* @dataProvider conversionDataProvider
20+
* @param string $rawValue Raw value
21+
* @param string $expectedValue Expected value upon conversion
22+
* @param string $format Date format
23+
*/
24+
public function testConvertTo(string $rawValue, string $expectedValue, string $format): void
25+
{
26+
$converter = new FrozenDateTimeParamConverter();
27+
/** @var \Cake\I18n\FrozenTime $convertedValue */
28+
$convertedValue = $converter->convertTo($rawValue, FrozenTime::class);
29+
$this->assertInstanceOf(FrozenTime::class, $convertedValue);
30+
$this->assertEquals($expectedValue, $convertedValue->format($format));
31+
}
32+
33+
public function testException(): void
34+
{
35+
$converter = new FrozenDateTimeParamConverter();
36+
$this->expectException(BadRequestException::class);
37+
$converter->convertTo("not-a-valid-datetime", FrozenTime::class);
38+
}
39+
40+
/**
41+
* @return array[]
42+
*/
43+
public function conversionDataProvider(): array
44+
{
45+
return [
46+
// raw value, converted value
47+
['now', date('Y-m-d'), 'Y-m-d'],
48+
['now', date('Y-m-d h:i'), 'Y-m-d h:i'],
49+
['2020-09-10', '2020-09-10', 'Y-m-d'],
50+
['2020-09-10 15:10:00', '2020-09-10 15:10:00', 'Y-m-d H:i:s'],
51+
];
52+
}
53+
}

0 commit comments

Comments
 (0)