Atlas/tests/Unit/ParameterValidationTest.php

98 lines
3.8 KiB
PHP

<?php
namespace Atlas\Tests\Unit;
use Atlas\Router\Router;
use Atlas\Config\Config;
use PHPUnit\Framework\TestCase;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\UriInterface;
class ParameterValidationTest extends TestCase
{
private Router $router;
protected function setUp(): void
{
$config = new Config(['modules_path' => ['/path/to/modules']]);
$this->router = new Router($config);
}
private function createRequest(string $method, string $path): ServerRequestInterface
{
$uri = $this->createMock(UriInterface::class);
$uri->method('getPath')->willReturn($path);
$request = $this->createMock(ServerRequestInterface::class);
$request->method('getMethod')->willReturn($method);
$request->method('getUri')->willReturn($uri);
return $request;
}
public function testNumericValidation(): void
{
$this->router->get('/users/{{id}}', 'handler')->valid('id', 'numeric');
$this->assertNotNull($this->router->match($this->createRequest('GET', '/users/123')));
$this->assertNull($this->router->match($this->createRequest('GET', '/users/abc')));
}
public function testAlphaValidation(): void
{
$this->router->get('/tags/{{tag}}', 'handler')->valid('tag', 'alpha');
$this->assertNotNull($this->router->match($this->createRequest('GET', '/tags/php')));
$this->assertNull($this->router->match($this->createRequest('GET', '/tags/123')));
}
public function testRegexValidation(): void
{
$this->router->get('/date/{{year}}', 'handler')->valid('year', 'regex:[0-9]{4}');
$this->assertNotNull($this->router->match($this->createRequest('GET', '/date/2024')));
$this->assertNull($this->router->match($this->createRequest('GET', '/date/24')));
$this->assertNull($this->router->match($this->createRequest('GET', '/date/abcd')));
}
public function testMultipleValidationRules(): void
{
// Test that alphanumeric works as expected
$this->router->get('/product/{{sku}}', 'handler')->valid('sku', 'alphanumeric');
$this->assertNotNull($this->router->match($this->createRequest('GET', '/product/ABC123')));
$this->assertNull($this->router->match($this->createRequest('GET', '/product/ABC_123')));
}
public function testDefaultValuesMarkParametersAsOptional(): void
{
$this->router->get('/shop/{{category}}', 'handler')->default('category', 'all');
$match1 = $this->router->match($this->createRequest('GET', '/shop/electronics'));
$this->assertNotNull($match1);
$this->assertSame('electronics', $match1->getAttributes()['category']);
$match2 = $this->router->match($this->createRequest('GET', '/shop'));
$this->assertNotNull($match2);
$this->assertSame('all', $match2->getAttributes()['category']);
}
public function testOptionalParameterWithDefault(): void
{
$this->router->get('/archive/{{year?}}', 'handler')->default('year', 2023);
$match1 = $this->router->match($this->createRequest('GET', '/archive/2024'));
$this->assertSame('2024', $match1->getAttributes()['year']);
$match2 = $this->router->match($this->createRequest('GET', '/archive'));
$this->assertSame(2023, $match2->getAttributes()['year']);
}
public function testAlphanumericValidation(): void
{
$this->router->get('/profile/{{username}}', 'handler')->valid('username', 'alphanumeric');
$this->assertNotNull($this->router->match($this->createRequest('GET', '/profile/user123')));
$this->assertNull($this->router->match($this->createRequest('GET', '/profile/user_123')));
}
}