aboutsummaryrefslogtreecommitdiff
path: root/tests/Fixtures
diff options
context:
space:
mode:
authorBrett Parson <brett@brett-parson.com>2026-08-21 13:55:37 -0500
committerBrett Parson <brett@brett-parson.com>2026-08-21 14:00:11 -0500
commitd039a5d62a9ac6ababae70d9d96422ca59f2b2d4 (patch)
treef0db4750a571e8040a5da02cc7190079c0d62914 /tests/Fixtures
parent0de77a6334cee1f6e15f7e0fd35602514560be33 (diff)
downloadminiroute-d039a5d62a9ac6ababae70d9d96422ca59f2b2d4.tar.gz
miniroute-d039a5d62a9ac6ababae70d9d96422ca59f2b2d4.zip
Scaffold miniroute routing/middleware kernel
Diffstat (limited to 'tests/Fixtures')
-rw-r--r--tests/Fixtures/ClassLevelController.php18
-rw-r--r--tests/Fixtures/FakeController.php33
-rw-r--r--tests/Fixtures/FakeMiddleware.php30
-rw-r--r--tests/Fixtures/FakeResolver.php28
-rw-r--r--tests/Fixtures/TestRequest.php40
-rw-r--r--tests/Fixtures/TestResponse.php43
6 files changed, 192 insertions, 0 deletions
diff --git a/tests/Fixtures/ClassLevelController.php b/tests/Fixtures/ClassLevelController.php
new file mode 100644
index 0000000..88ef6e6
--- /dev/null
+++ b/tests/Fixtures/ClassLevelController.php
@@ -0,0 +1,18 @@
+<?php
+
+declare(strict_types=1);
+
+namespace BrettParson\MiniRoute\Tests\Fixtures;
+
+use BrettParson\MiniRoute\Attribute\Get;
+use BrettParson\MiniRoute\Attribute\Middleware;
+
+#[Middleware(FakeMiddleware::class)]
+final class ClassLevelController
+{
+ #[Get('/admin')]
+ public function dashboard(): string
+ {
+ return 'dashboard';
+ }
+}
diff --git a/tests/Fixtures/FakeController.php b/tests/Fixtures/FakeController.php
new file mode 100644
index 0000000..3b476ae
--- /dev/null
+++ b/tests/Fixtures/FakeController.php
@@ -0,0 +1,33 @@
+<?php
+
+declare(strict_types=1);
+
+namespace BrettParson\MiniRoute\Tests\Fixtures;
+
+use BrettParson\MiniRoute\Attribute\Get;
+use BrettParson\MiniRoute\Attribute\Middleware;
+use BrettParson\MiniRoute\Attribute\Post;
+use BrettParson\MiniRoute\Http\RequestInterface;
+use BrettParson\MiniRoute\Http\ResponseInterface;
+
+final class FakeController
+{
+ #[Get('/entries')]
+ public function index(RequestInterface $request): ResponseInterface
+ {
+ return new TestResponse(200, 'index');
+ }
+
+ #[Get('/entries/{slug}')]
+ public function show(RequestInterface $request): ResponseInterface
+ {
+ return new TestResponse(200, 'show:' . $request->param('slug'));
+ }
+
+ #[Post('/entries')]
+ #[Middleware(FakeMiddleware::class)]
+ public function store(RequestInterface $request): ResponseInterface
+ {
+ return new TestResponse(200, 'store');
+ }
+}
diff --git a/tests/Fixtures/FakeMiddleware.php b/tests/Fixtures/FakeMiddleware.php
new file mode 100644
index 0000000..d684e7c
--- /dev/null
+++ b/tests/Fixtures/FakeMiddleware.php
@@ -0,0 +1,30 @@
+<?php
+
+declare(strict_types=1);
+
+namespace BrettParson\MiniRoute\Tests\Fixtures;
+
+use ArrayObject;
+use BrettParson\MiniRoute\Http\RequestInterface;
+use BrettParson\MiniRoute\Http\ResponseInterface;
+use BrettParson\MiniRoute\Middleware\MiddlewareInterface;
+
+final class FakeMiddleware implements MiddlewareInterface
+{
+ /** @var ArrayObject<int, string>|null */
+ private ?ArrayObject $log;
+
+ public function __construct(
+ private readonly string $name = 'fake',
+ ?ArrayObject $log = null,
+ ) {
+ $this->log = $log;
+ }
+
+ public function handle(RequestInterface $request, callable $next): ResponseInterface
+ {
+ $this->log?->append($this->name);
+
+ return $next($request);
+ }
+}
diff --git a/tests/Fixtures/FakeResolver.php b/tests/Fixtures/FakeResolver.php
new file mode 100644
index 0000000..af6ec1f
--- /dev/null
+++ b/tests/Fixtures/FakeResolver.php
@@ -0,0 +1,28 @@
+<?php
+
+declare(strict_types=1);
+
+namespace BrettParson\MiniRoute\Tests\Fixtures;
+
+use BrettParson\MiniRoute\Controller\ControllerResolverInterface;
+use RuntimeException;
+
+final class FakeResolver implements ControllerResolverInterface
+{
+ /** @var array<string, object> */
+ private array $bindings = [];
+
+ public function bind(string $class, object $instance): void
+ {
+ $this->bindings[$class] = $instance;
+ }
+
+ public function resolve(string $class): object
+ {
+ if (!array_key_exists($class, $this->bindings)) {
+ throw new RuntimeException("No binding for {$class}");
+ }
+
+ return $this->bindings[$class];
+ }
+}
diff --git a/tests/Fixtures/TestRequest.php b/tests/Fixtures/TestRequest.php
new file mode 100644
index 0000000..c449610
--- /dev/null
+++ b/tests/Fixtures/TestRequest.php
@@ -0,0 +1,40 @@
+<?php
+
+declare(strict_types=1);
+
+namespace BrettParson\MiniRoute\Tests\Fixtures;
+
+use BrettParson\MiniRoute\Http\RequestInterface;
+
+final class TestRequest implements RequestInterface
+{
+ /**
+ * @param array<string, string> $params
+ */
+ public function __construct(
+ private readonly string $method,
+ private readonly string $path,
+ private readonly array $params = [],
+ ) {
+ }
+
+ public function method(): string
+ {
+ return $this->method;
+ }
+
+ public function path(): string
+ {
+ return $this->path;
+ }
+
+ public function param(string $name, string $default = ''): string
+ {
+ return $this->params[$name] ?? $default;
+ }
+
+ public function withParams(array $params): RequestInterface
+ {
+ return new self($this->method, $this->path, $params);
+ }
+}
diff --git a/tests/Fixtures/TestResponse.php b/tests/Fixtures/TestResponse.php
new file mode 100644
index 0000000..25a0307
--- /dev/null
+++ b/tests/Fixtures/TestResponse.php
@@ -0,0 +1,43 @@
+<?php
+
+declare(strict_types=1);
+
+namespace BrettParson\MiniRoute\Tests\Fixtures;
+
+use BrettParson\MiniRoute\Http\ResponseInterface;
+
+final class TestResponse implements ResponseInterface
+{
+ /**
+ * @param array<string, string> $headers
+ */
+ public function __construct(
+ private readonly int $status,
+ private readonly string $body,
+ private readonly array $headers = [],
+ ) {
+ }
+
+ public function status(): int
+ {
+ return $this->status;
+ }
+
+ public function body(): string
+ {
+ return $this->body;
+ }
+
+ public function withHeader(string $name, string $value): ResponseInterface
+ {
+ return new self($this->status, $this->body, array_merge($this->headers, [$name => $value]));
+ }
+
+ /**
+ * @return array<string, string>
+ */
+ public function headers(): array
+ {
+ return $this->headers;
+ }
+}