app->singleton(\Mattitja\Analytics\Services\AnalyticsClient::class, function ($app) { return new \Mattitja\Analytics\Services\AnalyticsClient; }); }); function createTestRequest(string $url = 'https://example.com/test', string $method = 'GET'): Request { return Request::create($url, $method); } function createMiddleware(): AnalyticsMiddleware { return new AnalyticsMiddleware; } function handleRequest(AnalyticsMiddleware $middleware, Request $request): Response { return $middleware->handle($request, function ($req) { return new Response('Test content'); }); } it('captures analytics data for web requests', function () { $middleware = createMiddleware(); $request = createTestRequest(); $request->headers->set('User-Agent', 'Mozilla/5.0 Chrome'); $request->headers->set('Referer', 'https://google.com'); $request->server->set('REMOTE_ADDR', '192.168.1.1'); $response = handleRequest($middleware, $request); expect($response)->toBeInstanceOf(Response::class); Http::assertSent(function ($request) { $data = $request->data(); return $request->url() === 'https://analytics.mattitja.cloud/api/send' && $data['k'] === 'test-site-key' && $data['u'] === 'https://example.com/test' && $data['r'] === 'https://google.com' && $data['ip'] === '192.168.1.1' && $data['ua'] === 'Mozilla/5.0 Chrome'; }); }); it('does not capture analytics when disabled', function () { config(['mattitja-analytics.enabled' => false]); $middleware = new AnalyticsMiddleware; $request = Request::create('https://example.com/test', 'GET'); $response = $middleware->handle($request, function ($req) { return new Response('Test content'); }); expect($response)->toBeInstanceOf(Response::class); Http::assertNothingSent(); }); it('ignores configured paths', function () { config(['mattitja-analytics.ignore_paths' => ['admin/*']]); $middleware = new AnalyticsMiddleware; $request = Request::create('https://example.com/admin/dashboard', 'GET'); $response = $middleware->handle($request, function ($req) { return new Response('Test content'); }); expect($response)->toBeInstanceOf(Response::class); Http::assertNothingSent(); }); it('ignores bot user agents when bots capture is disabled', function () { config(['mattitja-analytics.capture_bots' => false]); $middleware = new AnalyticsMiddleware; $request = Request::create('https://example.com/test', 'GET'); $request->headers->set('User-Agent', 'Googlebot/2.1'); $response = $middleware->handle($request, function ($req) { return new Response('Test content'); }); expect($response)->toBeInstanceOf(Response::class); Http::assertNothingSent(); }); it('respects Do Not Track header when configured', function () { config(['mattitja-analytics.respect_dnt' => true]); $middleware = createMiddleware(); $request = createTestRequest(); $request->headers->set('DNT', '1'); $response = handleRequest($middleware, $request); expect($response)->toBeInstanceOf(Response::class); Http::assertNothingSent(); }); it('captures user agent in analytics data', function () { $middleware = createMiddleware(); $request = createTestRequest(); $request->headers->set('User-Agent', 'CustomClient/1.0 (Test)'); $response = handleRequest($middleware, $request); Http::assertSent(function ($request) { $data = $request->data(); return $data['ua'] === 'CustomClient/1.0 (Test)'; }); }); it('handles empty user agent gracefully', function () { $middleware = createMiddleware(); $request = createTestRequest(); $request->headers->set('User-Agent', ''); $response = handleRequest($middleware, $request); Http::assertSent(function ($request) { $data = $request->data(); return array_key_exists('ua', $data) && $data['ua'] === ''; }); });