| 
									
										
										
										
											2025-02-19 13:31:01 +00:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-02-20 08:41:14 +00:00
										 |  |  | require_once dirname(__DIR__, 3) . '/app/includes/session_middleware.php'; | 
					
						
							| 
									
										
										
										
											2025-02-19 13:31:01 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | use PHPUnit\Framework\TestCase; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class SessionMiddlewareTest extends TestCase | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     protected $config; | 
					
						
							|  |  |  |     protected $app_root; | 
					
						
							| 
									
										
										
										
											2025-04-12 13:48:53 +00:00
										 |  |  |     protected const SESSION_TIMEOUT = 7200; // 2 hours in seconds
 | 
					
						
							| 
									
										
										
										
											2025-02-19 13:31:01 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     protected function setUp(): void | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         parent::setUp(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Mock server variables
 | 
					
						
							|  |  |  |         $_SERVER['HTTP_USER_AGENT'] = 'PHPUnit Test Browser'; | 
					
						
							|  |  |  |         $_SERVER['REMOTE_ADDR'] = '127.0.0.1'; | 
					
						
							|  |  |  |         $_SERVER['HTTPS'] = 'on'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Set up test config
 | 
					
						
							|  |  |  |         $this->config = [ | 
					
						
							|  |  |  |             'folder' => '/app', | 
					
						
							|  |  |  |             'domain' => 'localhost' | 
					
						
							|  |  |  |         ]; | 
					
						
							|  |  |  |         $this->app_root = 'https://localhost/app'; | 
					
						
							| 
									
										
										
										
											2025-04-08 10:13:49 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // Initialize session variables
 | 
					
						
							|  |  |  |         $_SESSION = [ | 
					
						
							|  |  |  |             'user_id' => 1, | 
					
						
							|  |  |  |             'username' => 'testuser', | 
					
						
							|  |  |  |             'CREATED' => time(), | 
					
						
							|  |  |  |             'LAST_ACTIVITY' => time() | 
					
						
							|  |  |  |         ]; | 
					
						
							| 
									
										
										
										
											2025-02-19 13:31:01 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     protected function tearDown(): void | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         parent::tearDown(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function testSessionStart() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $result = applySessionMiddleware($this->config, $this->app_root); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->assertTrue($result); | 
					
						
							|  |  |  |         $this->assertArrayHasKey('LAST_ACTIVITY', $_SESSION); | 
					
						
							|  |  |  |         $this->assertArrayHasKey('CREATED', $_SESSION); | 
					
						
							| 
									
										
										
										
											2025-04-08 10:13:49 +00:00
										 |  |  |         $this->assertArrayHasKey('user_id', $_SESSION); | 
					
						
							|  |  |  |         $this->assertEquals(1, $_SESSION['user_id']); | 
					
						
							| 
									
										
										
										
											2025-02-19 13:31:01 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function testSessionTimeout() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2025-04-12 13:48:53 +00:00
										 |  |  |         $_SESSION['LAST_ACTIVITY'] = time() - (self::SESSION_TIMEOUT + 60); // 2 hours + 1 minute ago
 | 
					
						
							| 
									
										
										
										
											2025-02-19 13:31:01 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $result = applySessionMiddleware($this->config, $this->app_root); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->assertFalse($result); | 
					
						
							| 
									
										
										
										
											2025-04-08 10:13:49 +00:00
										 |  |  |         $this->assertArrayNotHasKey('user_id', $_SESSION, 'Session should be cleared after timeout'); | 
					
						
							| 
									
										
										
										
											2025-02-19 13:31:01 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function testSessionRegeneration() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $now = time(); | 
					
						
							| 
									
										
										
										
											2025-04-08 10:13:49 +00:00
										 |  |  |         $_SESSION['CREATED'] = $now - 1900; // 31+ minutes ago
 | 
					
						
							| 
									
										
										
										
											2025-02-19 13:31:01 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $result = applySessionMiddleware($this->config, $this->app_root); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->assertTrue($result); | 
					
						
							| 
									
										
										
										
											2025-04-08 10:13:49 +00:00
										 |  |  |         $this->assertEquals(1, $_SESSION['user_id']); | 
					
						
							| 
									
										
										
										
											2025-02-19 13:31:01 +00:00
										 |  |  |         $this->assertGreaterThanOrEqual($now - 1900, $_SESSION['CREATED']); | 
					
						
							|  |  |  |         $this->assertLessThanOrEqual($now + 10, $_SESSION['CREATED']); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function testRememberMe() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2025-04-08 10:13:49 +00:00
										 |  |  |         $_SESSION['REMEMBER_ME'] = true; | 
					
						
							| 
									
										
										
										
											2025-04-12 13:48:53 +00:00
										 |  |  |         $_SESSION['LAST_ACTIVITY'] = time() - (self::SESSION_TIMEOUT + 60); // More than 2 hours ago
 | 
					
						
							| 
									
										
										
										
											2025-02-19 13:31:01 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $result = applySessionMiddleware($this->config, $this->app_root); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->assertTrue($result); | 
					
						
							| 
									
										
										
										
											2025-04-08 10:13:49 +00:00
										 |  |  |         $this->assertArrayHasKey('user_id', $_SESSION); | 
					
						
							| 
									
										
										
										
											2025-02-19 13:31:01 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function testNoUserSession() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2025-04-08 10:13:49 +00:00
										 |  |  |         unset($_SESSION['user_id']); | 
					
						
							| 
									
										
										
										
											2025-02-19 13:31:01 +00:00
										 |  |  |         $result = applySessionMiddleware($this->config, $this->app_root); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->assertFalse($result); | 
					
						
							| 
									
										
										
										
											2025-04-08 10:13:49 +00:00
										 |  |  |         $this->assertArrayNotHasKey('user_id', $_SESSION); | 
					
						
							| 
									
										
										
										
											2025-02-19 13:31:01 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function testSessionHeaders() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2025-04-12 13:48:53 +00:00
										 |  |  |         $_SESSION['LAST_ACTIVITY'] = time() - (self::SESSION_TIMEOUT + 60); // 2 hours + 1 minute ago
 | 
					
						
							| 
									
										
										
										
											2025-02-19 13:31:01 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $result = applySessionMiddleware($this->config, $this->app_root); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->assertFalse($result); | 
					
						
							| 
									
										
										
										
											2025-04-08 10:13:49 +00:00
										 |  |  |         $this->assertArrayNotHasKey('user_id', $_SESSION, 'Session should be cleared after timeout'); | 
					
						
							| 
									
										
										
										
											2025-02-19 13:31:01 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | } |