Skip to content

Commit ce6dcff

Browse files
author
Ibrahim BinAlshikh
committed
fix(middleware): fix CacheMiddleware compatibility with http v6.0
- Use App::getRequest() instead of static Request::getUri()/getAuthHeader() - Pass required storage path to FileStorage constructor - Add tests for StartSessionMiddleware and CacheMiddleware Closes #289
1 parent 390d9fb commit ce6dcff

3 files changed

Lines changed: 182 additions & 3 deletions

File tree

WebFiori/Framework/Middleware/CacheMiddleware.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public function __construct() {
2424
$this->setPriority(50);
2525
$this->addToGroups(['web']);
2626
$this->fromCache = false;
27-
$this->cache = new Cache(new FileStorage());
27+
$this->cache = new Cache(new FileStorage(sys_get_temp_dir().DS.'wf-cache'));
2828
}
2929
/**
3030
* Checks if the response is loaded from the cache or caching must be performed.
@@ -101,14 +101,15 @@ public function before(Request $request, Response $response) {
101101
* @return string
102102
*/
103103
public function getKey() : string {
104-
$key = Request::getUri()->getUri(true, true);
104+
$request = \WebFiori\Framework\App::getRequest();
105+
$key = $request->getUri()->getUri(true, true);
105106

106107
//Following steps are used to make cached response unique per user.
107108
$session = SessionsManager::getActiveSession();
108109
if ($session !== null) {
109110
$key .= $session->getId();
110111
}
111-
$authHeader = Request::getAuthHeader();
112+
$authHeader = $request->getAuthHeader();
112113
if ($authHeader !== null) {
113114
$key .= $authHeader->getScheme().$authHeader->getCredentials();
114115
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
<?php
2+
namespace WebFiori\Framework\Test\Middleware;
3+
4+
use PHPUnit\Framework\TestCase;
5+
use WebFiori\Framework\Middleware\CacheMiddleware;
6+
use WebFiori\Framework\Session\SessionsManager;
7+
use WebFiori\Http\Request;
8+
use WebFiori\Http\Response;
9+
10+
class CacheMiddlewareTest extends TestCase {
11+
protected function setUp(): void {
12+
parent::setUp();
13+
SessionsManager::reset();
14+
}
15+
16+
protected function tearDown(): void {
17+
SessionsManager::reset();
18+
parent::tearDown();
19+
}
20+
21+
/** @test */
22+
public function testDefaults() {
23+
$mw = new CacheMiddleware();
24+
$this->assertEquals('cache', $mw->getName());
25+
$this->assertEquals(50, $mw->getPriority());
26+
$this->assertContains('web', $mw->getGroups());
27+
}
28+
29+
/** @test */
30+
public function testGetKeyWithoutSession() {
31+
$mw = new CacheMiddleware();
32+
$key = $mw->getKey();
33+
$this->assertNotEmpty($key);
34+
$this->assertIsString($key);
35+
}
36+
37+
/** @test */
38+
public function testGetKeyWithSession() {
39+
SessionsManager::start('wf-session');
40+
$mw = new CacheMiddleware();
41+
$key = $mw->getKey();
42+
$session = SessionsManager::getActiveSession();
43+
$this->assertStringContainsString($session->getId(), $key);
44+
}
45+
46+
/** @test */
47+
public function testBeforeWithNoCache() {
48+
$mw = new CacheMiddleware();
49+
$request = new Request();
50+
$response = new Response();
51+
52+
$mw->before($request, $response);
53+
$this->assertEquals(200, $response->getCode());
54+
$this->assertEmpty($response->getBody());
55+
}
56+
57+
/** @test */
58+
public function testAfterSendDoesNothing() {
59+
$mw = new CacheMiddleware();
60+
$request = new Request();
61+
$response = new Response();
62+
63+
$mw->afterSend($request, $response);
64+
$this->assertTrue(true);
65+
}
66+
}
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
<?php
2+
namespace WebFiori\Framework\Test\Middleware;
3+
4+
use PHPUnit\Framework\TestCase;
5+
use WebFiori\Framework\Middleware\StartSessionMiddleware;
6+
use WebFiori\Framework\Session\SessionsManager;
7+
use WebFiori\Framework\Session\SessionStatus;
8+
use WebFiori\Http\Request;
9+
use WebFiori\Http\Response;
10+
11+
class StartSessionMiddlewareTest extends TestCase {
12+
protected function setUp(): void {
13+
parent::setUp();
14+
SessionsManager::reset();
15+
}
16+
17+
protected function tearDown(): void {
18+
SessionsManager::reset();
19+
parent::tearDown();
20+
}
21+
22+
/** @test */
23+
public function testDefaults() {
24+
$mw = new StartSessionMiddleware();
25+
$this->assertEquals('start-session', $mw->getName());
26+
$this->assertEquals(PHP_INT_MAX, $mw->getPriority());
27+
$this->assertEquals('wf-session', $mw->getSessionName());
28+
$this->assertEquals([], $mw->getSessionOptions());
29+
$this->assertContains('web', $mw->getGroups());
30+
}
31+
32+
/** @test */
33+
public function testSetSessionName() {
34+
$mw = new StartSessionMiddleware();
35+
$mw->setSessionName('my-session');
36+
$this->assertEquals('my-session', $mw->getSessionName());
37+
}
38+
39+
/** @test */
40+
public function testSetSessionOptions() {
41+
$mw = new StartSessionMiddleware();
42+
$mw->setSessionOptions(['duration' => 3600]);
43+
$this->assertEquals(['duration' => 3600], $mw->getSessionOptions());
44+
}
45+
46+
/** @test */
47+
public function testBeforeStartsSession() {
48+
$mw = new StartSessionMiddleware();
49+
$request = new Request();
50+
$response = new Response();
51+
52+
$this->assertNull(SessionsManager::getActiveSession());
53+
$mw->before($request, $response);
54+
$active = SessionsManager::getActiveSession();
55+
$this->assertNotNull($active);
56+
$this->assertEquals('wf-session', $active->getName());
57+
$this->assertEquals(SessionStatus::NEW, $active->getStatus());
58+
}
59+
60+
/** @test */
61+
public function testBeforeWithCustomName() {
62+
$mw = new StartSessionMiddleware();
63+
$mw->setSessionName('custom-session');
64+
$request = new Request();
65+
$response = new Response();
66+
67+
$mw->before($request, $response);
68+
$active = SessionsManager::getActiveSession();
69+
$this->assertNotNull($active);
70+
$this->assertEquals('custom-session', $active->getName());
71+
}
72+
73+
/** @test */
74+
public function testAfterAddsCookieHeaders() {
75+
$mw = new StartSessionMiddleware();
76+
$request = new Request();
77+
$response = new Response();
78+
79+
$mw->before($request, $response);
80+
$mw->after($request, $response);
81+
82+
$headers = $response->getHeaders();
83+
$hasCookie = false;
84+
85+
foreach ($headers as $h) {
86+
if (strtolower($h->getName()) === 'set-cookie') {
87+
$hasCookie = true;
88+
break;
89+
}
90+
}
91+
92+
$this->assertTrue($hasCookie, 'Response should have set-cookie header after middleware after()');
93+
}
94+
95+
/** @test */
96+
public function testAfterSendValidatesStorage() {
97+
$mw = new StartSessionMiddleware();
98+
$request = new Request();
99+
$response = new Response();
100+
101+
$mw->before($request, $response);
102+
// Should not throw
103+
$mw->afterSend($request, $response);
104+
$this->assertTrue(true);
105+
}
106+
107+
/** @test */
108+
public function testGetManager() {
109+
$mw = new StartSessionMiddleware();
110+
$this->assertNotNull($mw->getManager());
111+
}
112+
}

0 commit comments

Comments
 (0)