Skip to content

Commit 7774862

Browse files
authored
Merge pull request #2 from PhpGt/1-typesafegetter
Type safety
2 parents 014d80f + 424e307 commit 7774862

File tree

4 files changed

+181
-8
lines changed

4 files changed

+181
-8
lines changed

composer.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
"type": "library",
55

66
"require": {
7-
"php": ">=8.1"
7+
"php": ">=8.1",
8+
"phpgt/typesafegetter": "^v1.2.4"
89
},
910

1011
"require-dev": {

composer.lock

+53-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Cache.php

+52-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
<?php
22
namespace Gt\FileCache;
33

4-
class Cache {
4+
use DateTimeImmutable;
5+
use DateTimeInterface;
6+
use Gt\TypeSafeGetter\CallbackTypeSafeGetter;
7+
use TypeError;
8+
9+
class Cache implements CallbackTypeSafeGetter {
10+
const DEFAULT_SECONDS_VALID = 60 * 60; // 1 hour of validity.
511
private FileAccess $fileAccess;
612

713
public function __construct(
@@ -17,7 +23,7 @@ public function __construct(
1723
public function get(
1824
string $name,
1925
callable $callback,
20-
int $secondsValid = 60 * 60 // 1 hour of validity
26+
int $secondsValid = self::DEFAULT_SECONDS_VALID
2127
):mixed {
2228
try {
2329
$this->fileAccess->checkValidity($name, $secondsValid);
@@ -29,4 +35,48 @@ public function get(
2935
return $value;
3036
}
3137
}
38+
39+
public function getString(string $name, callable $callback, int $secondsValid = self::DEFAULT_SECONDS_VALID):string {
40+
return (string)$this->get($name, $callback, $secondsValid);
41+
}
42+
43+
public function getInt(string $name, callable $callback, int $secondsValid = self::DEFAULT_SECONDS_VALID):int {
44+
return (int)$this->get($name, $callback, $secondsValid);
45+
}
46+
47+
public function getFloat(string $name, callable $callback, int $secondsValid = self::DEFAULT_SECONDS_VALID):float {
48+
return (float)$this->get($name, $callback, $secondsValid);
49+
}
50+
51+
public function getBool(string $name, callable $callback, int $secondsValid = self::DEFAULT_SECONDS_VALID):bool {
52+
return (bool)$this->get($name, $callback, $secondsValid);
53+
}
54+
55+
public function getDateTime(string $name, callable $callback, int $secondsValid = self::DEFAULT_SECONDS_VALID):DateTimeInterface {
56+
$value = $this->get($name, $callback, $secondsValid);
57+
if($value instanceof DateTimeInterface) {
58+
return $value;
59+
}
60+
elseif(is_int($value)) {
61+
$dt = new DateTimeImmutable();
62+
return $dt->setTimestamp($value);
63+
}
64+
65+
return new DateTimeImmutable($value);
66+
}
67+
68+
/**
69+
* @template T
70+
* @param class-string<T> $className
71+
* @return T
72+
*/
73+
public function getClass(string $className, string $name, callable $callback, int $secondsValid = self::DEFAULT_SECONDS_VALID):object {
74+
$serialized = $this->get($name, $callback, $secondsValid);
75+
$value = unserialize($serialized);
76+
if(get_class($value) !== $className) {
77+
throw new TypeError("Value is not of type $className");
78+
}
79+
80+
return $value;
81+
}
3282
}

test/phpunit/CacheTest.php

+74-3
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,24 @@
22
namespace Gt\FileCache\Test;
33

44
use Gt\FileCache\Cache;
5+
use Gt\FileCache\FileAccess;
56
use PHPUnit\Framework\TestCase;
7+
use stdClass;
68

79
class CacheTest extends TestCase {
10+
public function tearDown():void {
11+
exec("rm -rf " . sys_get_temp_dir() . "/phpgt-filecache");
12+
}
13+
814
public function testGet_expectedValueReturned():void {
9-
$sut = new Cache(sys_get_temp_dir() . "/phpgt-filecache");
15+
$sut = $this->getSut();
1016
$value = "test-value";
1117
$result = $sut->get("test", fn() => $value);
1218
self::assertSame($value, $result);
1319
}
1420

1521
public function testGet_expectedValueReturnedOnMultipleCalls():void {
16-
$sut = new Cache(sys_get_temp_dir() . "/phpgt-filecache");
22+
$sut = $this->getSut();
1723
$value = "test-value";
1824
$result = $sut->get("test", fn() => $value);
1925
self::assertSame($value, $result);
@@ -22,7 +28,7 @@ public function testGet_expectedValueReturnedOnMultipleCalls():void {
2228
}
2329

2430
public function testGet_multipleCallsDoesNotCallbackMultipleTimes():void {
25-
$sut = new Cache(sys_get_temp_dir() . "/phpgt/filecache");
31+
$sut = $this->getSut();
2632
$name = uniqid("test-");
2733
$value = "test-value-123";
2834
$count = 0;
@@ -39,4 +45,69 @@ public function testGet_multipleCallsDoesNotCallbackMultipleTimes():void {
3945
self::assertSame($value, $result);
4046
self::assertSame(1, $count);
4147
}
48+
49+
public function testGetString():void {
50+
$value = uniqid();
51+
$sut = $this->getSut([
52+
"test" => $value,
53+
]);
54+
self::assertSame($value, $sut->getString("test", fn() => "new"));
55+
}
56+
57+
public function testGetInt():void {
58+
$value = (string)rand(100,999);
59+
$sut = $this->getSut([
60+
"test" => $value,
61+
]);
62+
self::assertSame((int)$value, $sut->getInt("test", fn() => 2));
63+
}
64+
65+
public function testGetFoat():void {
66+
$value = (string)(rand(100,999) * 3.14159);
67+
$sut = $this->getSut([
68+
"test" => $value,
69+
]);
70+
self::assertSame((float)$value, $sut->getFloat("test", fn() => 3.141));
71+
}
72+
73+
public function testGetBool():void {
74+
$value = "yes";
75+
$sut = $this->getSut([
76+
"test" => $value,
77+
]);
78+
self::assertTrue($sut->getBool("test", fn() => false));
79+
}
80+
81+
public function testGetDateTime():void {
82+
$value = "1988-04-05";
83+
$sut = $this->getSut([
84+
"test" => $value,
85+
]);
86+
self::assertSame($value, $sut->getDateTime("test", fn() => 123)->format("Y-m-d"));
87+
}
88+
89+
public function testGetClass():void {
90+
$value = new StdClass();
91+
$value->name = uniqid();
92+
$sut = $this->getSut([
93+
"test" => serialize($value),
94+
]);
95+
$class = $sut->getClass(StdClass::class, "test", fn() => false);
96+
self::assertSame($value->name, $class->name);
97+
}
98+
99+
private function getSut(array $mockFiles = []):Cache {
100+
$mockFileAccess = null;
101+
if(!empty($mockFiles)) {
102+
$mockFileAccess = self::createMock(FileAccess::class);
103+
foreach($mockFiles as $key => $value) {
104+
$mockFileAccess->method("getData")
105+
->with($key)->willReturn($value);
106+
}
107+
}
108+
return new Cache(
109+
sys_get_temp_dir() . "/phpgt-filecache",
110+
$mockFileAccess,
111+
);
112+
}
42113
}

0 commit comments

Comments
 (0)