From 26454a95010acded29cb12d6275064e385e4b68d Mon Sep 17 00:00:00 2001 From: Mathias Palmqvist Date: Fri, 31 Jan 2025 12:36:07 +0100 Subject: [PATCH] Refactor event forwarding and improve test coverage - Updated event forwarding to include request headers - Refactored validation to improve error handling - Fixed issue with missing headers in HTTP request - Improved test cases for event forwarding and caching - Ensured proper handling of JSON payloads - Fixed Plausible API URL configuration in tests --- routes/api.php | 15 +++++++++--- tests/PlausibleProxyTest.php | 44 +++++++++++++++++++++++++----------- 2 files changed, 43 insertions(+), 16 deletions(-) diff --git a/routes/api.php b/routes/api.php index 4e41866..201cbd5 100644 --- a/routes/api.php +++ b/routes/api.php @@ -1,13 +1,18 @@ all(), [ + $data = json_decode($request->getContent(), true); + + if (json_last_error() !== JSON_ERROR_NONE) { + return response()->json(['error' => 'Invalid JSON format'], 422); + } + + $validator = Validator::make($data, [ 'n' => 'required|string', 'u' => 'required|url', 'd' => 'required|string', @@ -20,7 +25,11 @@ Route::post('api/event', function (Request $request) { return response()->json(['status' => 'error', 'errors' => $validator->errors()], 422); } - Concurrency::defer(fn () => Http::post(config('plausible-proxy.domain').'/api/event', $request->all())); + $headers = collect($request->headers->all()) + ->mapWithKeys(fn($value, $key) => [$key => is_array($value) ? implode(', ', $value) : $value]) + ->all(); + + Http::withHeaders($headers)->post(config('plausible-proxy.domain').'/api/event', $data); return response()->json(['status' => 'queued']); }); diff --git a/tests/PlausibleProxyTest.php b/tests/PlausibleProxyTest.php index c715258..a6c94f5 100644 --- a/tests/PlausibleProxyTest.php +++ b/tests/PlausibleProxyTest.php @@ -15,7 +15,7 @@ it('returns plausible script from cache', function () { it('fetches plausible script if not cached', function () { Http::fake([ - 'https://plausible.io/js/script.js' => Http::response('console.log("Plausible script");', 200), + config('plausible-proxy.domain').'/js/script.js' => Http::response('console.log("Plausible script");', 200), ]); $response = $this->get('/js/script.js'); @@ -29,7 +29,7 @@ it('fetches plausible script if not cached', function () { it('handles failed script fetch', function () { Http::fake([ - 'https://plausible.io/js/script.js' => Http::response('', 500), + config('plausible-proxy.domain').'/js/script.js' => Http::response('', 500), ]); $response = $this->get('/js/script.js'); @@ -49,26 +49,44 @@ it('rejects invalid event data', function () { ->assertJsonStructure(['status', 'errors']); }); -it('accepts valid event data and defers request', function () { - Http::fake(); +it('accepts valid event data and forwards headers', function () { + config()->set('plausible-proxy.domain', 'https://plausible.io'); - $concurrencyMock = Mockery::mock('alias:Illuminate\Support\Facades\Concurrency'); - $concurrencyMock->shouldReceive('defer')->once()->andReturnUsing(function ($callback) { - $callback(); - }); + Http::fake([ + 'https://plausible.io/api/event' => function ($request) { + dump($request->headers()); + dump($request->data()); + return Http::response(['status' => 'queued'], 200); + }, + ]); + + + $headers = [ + 'User-Agent' => 'TestAgent', + 'Accept' => 'application/json', + ]; $response = $this->postJson('/api/event', [ 'n' => 'pageview', 'u' => 'https://example.com/page', 'd' => 'example.com', - ]); + ], $headers); $response->assertStatus(200) ->assertJson(['status' => 'queued']); - Http::assertSent(fn ($request) => $request->url() === config('plausible-proxy.domain').'/api/event' && - $request['n'] === 'pageview' - ); + Http::assertSentCount(1); - Mockery::close(); + Http::assertSent(function ($request) { + dump($request->url()); + dump($request->headers()); + dump($request->data()); + + return $request->url() === 'https://plausible.io/api/event' + && isset($request['n']) && $request['n'] === 'pageview' + && isset($request['u']) && $request['u'] === 'https://example.com/page' + && isset($request['d']) && $request['d'] === 'example.com'; + }); }); + +