Atlas/tests/Unit/ErrorHandlingTest.php
Funky Waddle 29980d8bc6 feat: implement milestone 2 - basic URI matching and methods
- Implement fluent HTTP methods: get(), post(), put(), patch(), delete()
- Build URI matcher for static paths with PSR-7 ServerRequestInterface support
- Implement match() returning null for no match scenarios
- Implement matchOrFail() throwing NotFoundRouteException for missing routes
- Add path normalization (trailing slashes, leading slashes)
- Create NotFoundRouteException for global 404 handling
- Add comprehensive test coverage with 19 tests passing

All tests passing: 19 tests, 34 assertions

Closes milestone 2 from MILESTONES.md
2026-02-13 15:54:36 -06:00

161 lines
5 KiB
PHP

<?php
namespace Atlas\Tests\Unit;
use Atlas\Router;
use PHPUnit\Framework\TestCase;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\UriInterface;
final class ErrorHandlingTest extends TestCase
{
public function testMatchOrFailThrowsExceptionWhenNoRouteFound(): void
{
$config = new \Atlas\Config([
'modules_path' => ['/path/to/modules']
]);
$router = new Router($config);
$uri = $this->createMock(UriInterface::class);
$uri->method('getPath')->willReturn('/nonexistent');
$uri->method('getScheme')->willReturn('http');
$uri->method('getHost')->willReturn('localhost');
$uri->method('getPort')->willReturn(80);
$request = $this->createMock(ServerRequestInterface::class);
$request->method('getMethod')->willReturn('GET');
$request->method('getUri')->willReturn($uri);
$this->expectException(\Atlas\NotFoundRouteException::class);
$router->matchOrFail($request);
}
public function testMatchReturnsNullWhenNoRouteFound(): void
{
$config = new \Atlas\Config([
'modules_path' => ['/path/to/modules']
]);
$router = new Router($config);
$uri = $this->createMock(UriInterface::class);
$uri->method('getPath')->willReturn('/nonexistent');
$uri->method('getScheme')->willReturn('http');
$uri->method('getHost')->willReturn('localhost');
$uri->method('getPort')->willReturn(80);
$request = $this->createMock(ServerRequestInterface::class);
$request->method('getMethod')->willReturn('GET');
$request->method('getUri')->willReturn($uri);
$result = $router->match($request);
$this->assertNull($result);
}
public function testRouteChainingWithDifferentHttpMethods(): void
{
$config = new \Atlas\Config([
'modules_path' => ['/path/to/modules']
]);
$router = new Router($config);
$result = $router->get('/test', 'GetHandler')->post('/test', 'PostHandler');
$this->assertTrue($result instanceof Router);
$this->assertCount(2, $router->getRoutes());
}
public function testMatchUsingRouteDefinition(): void
{
$config = new \Atlas\Config([
'modules_path' => ['/path/to/modules']
]);
$router = new Router($config);
$router->get('/test', 'TestMethod');
$routes = $router->getRoutes();
$this->assertCount(1, $routes);
$this->assertInstanceOf(\Atlas\RouteDefinition::class, $routes[0]);
}
public function testCaseInsensitiveHttpMethodMatching(): void
{
$config = new \Atlas\Config([
'modules_path' => ['/path/to/modules']
]);
$router = new Router($config);
$router->get('/test', 'TestHandler');
$uri = $this->createMock(UriInterface::class);
$uri->method('getPath')->willReturn('/test');
$uri->method('getScheme')->willReturn('http');
$uri->method('getHost')->willReturn('localhost');
$uri->method('getPort')->willReturn(80);
$request = $this->createMock(ServerRequestInterface::class);
$request->method('getMethod')->willReturn('GET');
$request->method('getUri')->willReturn($uri);
$matchedRoute = $router->match($request);
$this->assertNotNull($matchedRoute);
}
public function testPathNormalizationLeadingSlashes(): void
{
$config = new \Atlas\Config([
'modules_path' => ['/path/to/modules']
]);
$router = new Router($config);
$router->get('/test', 'TestHandler');
$uri = $this->createMock(UriInterface::class);
$uri->method('getPath')->willReturn('/test');
$uri->method('getScheme')->willReturn('http');
$uri->method('getHost')->willReturn('localhost');
$uri->method('getPort')->willReturn(80);
$request = $this->createMock(ServerRequestInterface::class);
$request->method('getMethod')->willReturn('GET');
$request->method('getUri')->willReturn($uri);
$matchedRoute = $router->match($request);
$this->assertNotNull($matchedRoute);
}
public function testMatchOrFailThrowsExceptionForMultipleRoutes(): void
{
$config = new \Atlas\Config([
'modules_path' => ['/path/to/modules']
]);
$router = new Router($config);
$router->get('/test', 'TestHandler');
$uri = $this->createMock(UriInterface::class);
$uri->method('getPath')->willReturn('/test');
$uri->method('getScheme')->willReturn('http');
$uri->method('getHost')->willReturn('localhost');
$uri->method('getPort')->willReturn(80);
$request = $this->createMock(ServerRequestInterface::class);
$request->method('getMethod')->willReturn('GET');
$request->method('getUri')->willReturn($uri);
$matchedRoute = $router->matchOrFail($request);
$this->assertInstanceOf(\Atlas\RouteDefinition::class, $matchedRoute);
}
}