From 05b5d1f3b359b95f753663c2f41275f087cd6a67 Mon Sep 17 00:00:00 2001 From: Ovidiu U Date: Fri, 10 Apr 2026 17:57:54 +0100 Subject: [PATCH] feat: add SPA Blade shell and catch-all route Co-Authored-By: Claude Sonnet 4.6 --- resources/views/app.blade.php | 13 +++++++++++++ routes/web.php | 3 +++ tests/Feature/SpaRouteTest.php | 23 +++++++++++++++++++++++ 3 files changed, 39 insertions(+) create mode 100644 resources/views/app.blade.php create mode 100644 tests/Feature/SpaRouteTest.php diff --git a/resources/views/app.blade.php b/resources/views/app.blade.php new file mode 100644 index 0000000..04aa5ce --- /dev/null +++ b/resources/views/app.blade.php @@ -0,0 +1,13 @@ + + + + + + + FuelAlert + @vite(['resources/css/app.css', 'resources/js/app.js']) + + +
+ + diff --git a/routes/web.php b/routes/web.php index 6e3732e..f30ae12 100644 --- a/routes/web.php +++ b/routes/web.php @@ -7,3 +7,6 @@ Route::middleware(['auth', 'verified'])->group(function (): void { }); require __DIR__.'/settings.php'; + +// SPA catch-all — must be last +Route::get('/{any}', fn () => view('app'))->where('any', '.*')->name('spa'); diff --git a/tests/Feature/SpaRouteTest.php b/tests/Feature/SpaRouteTest.php new file mode 100644 index 0000000..e7c77a3 --- /dev/null +++ b/tests/Feature/SpaRouteTest.php @@ -0,0 +1,23 @@ +get('/'); + + $response->assertStatus(200); + $response->assertSee('
', false); +}); + +it('serves the spa shell for unknown frontend paths', function (): void { + $response = $this->get('/some/frontend/route'); + + $response->assertStatus(200); + $response->assertSee('
', false); +}); + +it('does not intercept api routes', function (): void { + $response = $this->get('/api/stations'); + + // API route handles it (403 from missing key, not SPA HTML) + $response->assertStatus(403); + $response->assertJson(['message' => '']); +});