|
| 1 | +<?php |
| 2 | +use PHPUnit\Framework\TestCase; |
| 3 | +use UnityWebPortal\lib\CSRFToken; |
| 4 | + |
| 5 | +class CSRFTokenTest extends TestCase |
| 6 | +{ |
| 7 | + protected function setUp(): void |
| 8 | + { |
| 9 | + session_id(uniqid()); |
| 10 | + session_start(); |
| 11 | + $_SESSION["csrf_tokens"] = []; |
| 12 | + } |
| 13 | + |
| 14 | + protected function tearDown(): void |
| 15 | + { |
| 16 | + CSRFToken::clear(); |
| 17 | + session_write_close(); |
| 18 | + session_id(uniqid()); |
| 19 | + } |
| 20 | + |
| 21 | + public function testGenerateCreatesToken(): void |
| 22 | + { |
| 23 | + $token = CSRFToken::generate(); |
| 24 | + $this->assertIsString($token); |
| 25 | + $this->assertEquals(64, strlen($token)); |
| 26 | + $this->assertMatchesRegularExpression('/^[0-9a-f]{64}$/', $token); |
| 27 | + } |
| 28 | + |
| 29 | + public function testGenerateStoresTokenInSession(): void |
| 30 | + { |
| 31 | + $token = CSRFToken::generate(); |
| 32 | + $this->assertArrayHasKey("csrf_tokens", $_SESSION); |
| 33 | + $this->assertArrayHasKey($token, $_SESSION["csrf_tokens"]); |
| 34 | + $this->assertFalse($_SESSION["csrf_tokens"][$token]); |
| 35 | + } |
| 36 | + |
| 37 | + public function testValidateWithValidToken(): void |
| 38 | + { |
| 39 | + $token = CSRFToken::generate(); |
| 40 | + $this->assertTrue(CSRFToken::validate($token)); |
| 41 | + $this->assertTrue($_SESSION["csrf_tokens"][$token]); |
| 42 | + } |
| 43 | + |
| 44 | + public function testValidateWithInvalidToken(): void |
| 45 | + { |
| 46 | + CSRFToken::generate(); |
| 47 | + $this->assertFalse(CSRFToken::validate("invalid_token")); |
| 48 | + } |
| 49 | + |
| 50 | + public function testValidateWithEmptyToken(): void |
| 51 | + { |
| 52 | + CSRFToken::generate(); |
| 53 | + $this->assertFalse(CSRFToken::validate("")); |
| 54 | + } |
| 55 | + |
| 56 | + public function testValidateWithoutSessionToken(): void |
| 57 | + { |
| 58 | + $this->assertFalse(CSRFToken::validate("any_token")); |
| 59 | + } |
| 60 | + |
| 61 | + public function testClearRemovesToken(): void |
| 62 | + { |
| 63 | + CSRFToken::generate(); |
| 64 | + $this->assertNotEmpty($_SESSION["csrf_tokens"]); |
| 65 | + CSRFToken::clear(); |
| 66 | + $this->assertEmpty($_SESSION["csrf_tokens"]); |
| 67 | + } |
| 68 | + |
| 69 | + public function testMultipleTokenGenerations(): void |
| 70 | + { |
| 71 | + $token1 = CSRFToken::generate(); |
| 72 | + $token2 = CSRFToken::generate(); |
| 73 | + $this->assertNotEquals($token1, $token2); |
| 74 | + } |
| 75 | + |
| 76 | + public function testTokenIsSingleUse(): void |
| 77 | + { |
| 78 | + $token = CSRFToken::generate(); |
| 79 | + $this->assertTrue(CSRFToken::validate($token)); |
| 80 | + $this->assertFalse(CSRFToken::validate($token)); |
| 81 | + $this->assertTrue($_SESSION["csrf_tokens"][$token]); |
| 82 | + } |
| 83 | +} |
0 commit comments