From b444f98aa059b7ff25fdc4353a23899a6b5deb88 Mon Sep 17 00:00:00 2001 From: Keith Solomon Date: Sun, 26 Jul 2026 00:13:40 -0500 Subject: [PATCH] feat: add match view server-rendered shell --- src/Http/Handlers/GetMatchView.php | 24 ++++++++++++++ src/Views/match.php | 43 ++++++++++++++++++++++++++ tests/Integration/GetMatchViewTest.php | 39 +++++++++++++++++++++++ 3 files changed, 106 insertions(+) create mode 100644 src/Http/Handlers/GetMatchView.php create mode 100644 src/Views/match.php create mode 100644 tests/Integration/GetMatchViewTest.php diff --git a/src/Http/Handlers/GetMatchView.php b/src/Http/Handlers/GetMatchView.php new file mode 100644 index 0000000..31f8521 --- /dev/null +++ b/src/Http/Handlers/GetMatchView.php @@ -0,0 +1,24 @@ + $params */ + public function handle(Request $request, array $params): Response + { + $csrf = $request->cookies['__csrf'] ?? ''; + + ob_start(); + require_once __DIR__ . '/../../Views/layout.php'; + require __DIR__ . '/../../Views/match.php'; + $body = (string) ob_get_clean(); + + return Response::html(200, $body); + } +} diff --git a/src/Views/match.php b/src/Views/match.php new file mode 100644 index 0000000..dcd7859 --- /dev/null +++ b/src/Views/match.php @@ -0,0 +1,43 @@ + Escape::attr($v); + ?> +
+

Battle

+

+ Active team: + · Round: 0 +

+

+ +

+
+
+
+ +
+
+ +
+ + handle($request, []); + + self::assertSame(200, $response->status); + self::assertStringContainsString('text/html', $response->headers['Content-Type'] ?? ''); + self::assertSame('nosniff', $response->headers['X-Content-Type-Options']); + self::assertStringContainsString('default-src', $response->headers['Content-Security-Policy']); + + self::assertStringContainsString('id="bf-match-header"', $response->body); + self::assertStringContainsString('id="bf-end-turn"', $response->body); + self::assertStringContainsString('id="bf-grid"', $response->body); + self::assertStringContainsString('id="bf-panel"', $response->body); + self::assertStringContainsString('id="bf-action-move"', $response->body); + self::assertStringContainsString('id="bf-action-attack"', $response->body); + self::assertStringContainsString('id="bf-action-ability"', $response->body); + self::assertStringContainsString('id="bf-selected-unit"', $response->body); + self::assertStringContainsString('id="bf-log"', $response->body); + self::assertStringContainsString('id="bf-result"', $response->body); + self::assertStringContainsString('id="bf-winner"', $response->body); + self::assertStringContainsString('id="bf-return-home"', $response->body); + self::assertStringContainsString('src="/js/match.js"', $response->body); + self::assertStringContainsString('name="csrf-token"', $response->body); + } +}