add('GET', '/', static fn (Request $request): Response => Response::html(200, 'home')); $response = $router->dispatch($this->request('GET', '/')); self::assertSame(200, $response->status); self::assertSame('home', $response->body); } public function testItReturnsA404ForUnknownPaths(): void { $router = new Router(); $response = $router->dispatch($this->request('GET', '/missing')); self::assertSame(404, $response->status); } public function testItReturnsAMethodNotAllowedResponseForMismatchedMethods(): void { $router = new Router(); $router->add('POST', '/', static fn (): Response => Response::html(200, 'ok')); $response = $router->dispatch($this->request('GET', '/')); self::assertSame(404, $response->status); } public function testItCapturesPathParams(): void { $router = new Router(); $router->add('GET', '/scenarios/{id}/edit', static function (Request $request, array $params): Response { return Response::html(200, 'id=' . $params['id']); }); $response = $router->dispatch($this->request('GET', '/scenarios/demo/edit')); self::assertSame(200, $response->status); self::assertSame('id=demo', $response->body); } public function testItMatchesMoreSpecificRoutesFirstByRegistrationOrder(): void { $router = new Router(); $router->add('GET', '/scenarios/{id}', static fn (): Response => Response::html(200, 'any')); $router->add('GET', '/scenarios/special', static fn (): Response => Response::html(200, 'special')); $response = $router->dispatch($this->request('GET', '/scenarios/special')); self::assertSame('any', $response->body); } private function request(string $method, string $path): Request { return new Request( get: [], post: [], files: [], cookies: [], server: [], queryString: '', method: $method, path: $path, contentType: null, rawBody: '', ); } }