This commit is contained in:
mathiaspalmqvist committed 2025-09-30 10:20:29 +02:00
commit 50d66414ea
13 files changed
+10287

No files matched your search

+138
View File
@@ -0,0 +1,138 @@
<?php
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Http;
use Mattitja\Analytics\Middleware\AnalyticsMiddleware;
beforeEach(function () {
Http::fake();
$this->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'] === '';
});
});
+5
View File
@@ -0,0 +1,5 @@
<?php
use Mattitja\Analytics\Tests\TestCase;
uses(TestCase::class)->in(__DIR__);
+27
View File
@@ -0,0 +1,27 @@
<?php
namespace Mattitja\Analytics\Tests;
use Mattitja\Analytics\AnalyticsServiceProvider;
use Orchestra\Testbench\TestCase as Orchestra;
class TestCase extends Orchestra
{
protected function setUp(): void
{
parent::setUp();
}
protected function getPackageProviders($app)
{
return [
AnalyticsServiceProvider::class,
];
}
public function getEnvironmentSetUp($app)
{
config()->set('mattitja-analytics.site_key', 'test-site-key');
config()->set('mattitja-analytics.enabled', true);
}
}
+88
View File
@@ -0,0 +1,88 @@
<?php
use Illuminate\Support\Facades\Http;
use Mattitja\Analytics\Services\AnalyticsClient;
beforeEach(function () {
Http::fake();
});
it('sends analytics data to the correct endpoint', function () {
$client = new AnalyticsClient;
$data = [
'k' => 'test-site-key',
'u' => 'https://example.com/test',
'r' => 'https://google.com',
'ip' => '192.168.1.1',
'ua' => 'Mozilla/5.0 Chrome',
];
$client->send($data);
Http::assertSent(function ($request) use ($data) {
return $request->url() === 'https://analytics.mattitja.cloud/api/send' &&
$request->method() === 'POST' &&
$request->data() === $data;
});
});
it('handles API failures gracefully', function () {
Http::fake([
'analytics.mattitja.cloud/*' => Http::response('Server Error', 500),
]);
$client = new AnalyticsClient;
$data = [
'k' => 'test-site-key',
'u' => 'https://example.com/test',
'r' => 'https://google.com',
'ip' => '192.168.1.1',
'ua' => 'Mozilla/5.0 Chrome',
];
expect(fn () => $client->send($data))->not->toThrow(Exception::class);
});
it('uses hardcoded timeout', function () {
$client = new AnalyticsClient;
$data = [
'k' => 'test-site-key',
'u' => 'https://example.com/test',
'r' => '',
'ip' => '192.168.1.1',
'ua' => 'Mozilla/5.0 Chrome',
];
$client->send($data);
Http::assertSent(function ($request) {
return $request->data()['k'] === 'test-site-key';
});
});
it('validates required data fields', function () {
$client = new AnalyticsClient;
expect(fn () => $client->send([]))->toThrow(InvalidArgumentException::class)
->and(fn () => $client->send(['k' => 'test']))->toThrow(InvalidArgumentException::class)
->and(fn () => $client->send(['k' => 'test', 'u' => 'url', 'ip' => '1.1.1.1']))->toThrow(InvalidArgumentException::class);
});
it('filters out empty referrer URLs', function () {
$client = new AnalyticsClient;
$data = [
'k' => 'test-site-key',
'u' => 'https://example.com/test',
'r' => '',
'ip' => '192.168.1.1',
'ua' => 'Mozilla/5.0 Chrome',
];
$client->send($data);
Http::assertSent(function ($request) {
$sentData = $request->data();
return ! isset($sentData['r']);
});
});