Skip to content

Commit f393bf1

Browse files
Merge pull request #6 from TheDragonCode/1.x
Added tests
2 parents 21fb1c1 + c689b4e commit f393bf1

File tree

6 files changed

+178
-9
lines changed

6 files changed

+178
-9
lines changed

.github/workflows/tests.yml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ jobs:
1111
fail-fast: true
1212
matrix:
1313
php: [ "8.2", "8.3", "8.4" ]
14+
laravel: [ "11.0", "12.0" ]
1415

15-
name: PHP ${{ matrix.php }}
16+
name: PHP ${{ matrix.php }}, Laravel ${{ matrix.laravel }}
1617

1718
steps:
1819
- name: Checkout code
@@ -26,7 +27,7 @@ jobs:
2627
coverage: xdebug
2728

2829
- name: Install dependencies
29-
run: composer update
30+
run: composer require --dev laravel/framework:^${{ matrix.laravel }}
3031

3132
- name: Execute tests
3233
run: composer test

composer.json

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,27 +12,50 @@
1212
"require": {
1313
"php": "^8.2",
1414
"dragon-code/telemetry": "^1.0",
15-
"illuminate/http": "^10.0 || ^11.0 || ^12.0",
16-
"illuminate/support": "^10.0 || ^11.0 || ^12.0"
15+
"illuminate/http": "^11.0 || ^12.0",
16+
"illuminate/support": "^11.0 || ^12.0"
1717
},
1818
"require-dev": {
1919
"dragon-code/codestyler": "^6.3",
20-
"orchestra/testbench": "^10.6",
21-
"pestphp/pest": "^4.0",
22-
"pestphp/pest-plugin-type-coverage": "^4.0",
23-
"symfony/var-dumper": "^7.3"
20+
"orchestra/testbench": "^9.0 || ^10.0",
21+
"pestphp/pest": "^3.0 || ^4.0",
22+
"pestphp/pest-plugin-type-coverage": "^3.0 || ^4.0",
23+
"symfony/var-dumper": "^6.0 || ^7.3"
2424
},
2525
"minimum-stability": "stable",
2626
"autoload": {
2727
"psr-4": {
2828
"DragonCode\\LaravelTracker\\": "src/"
2929
}
3030
},
31+
"autoload-dev": {
32+
"psr-4": {
33+
"Tests\\": "tests/"
34+
}
35+
},
3136
"config": {
3237
"allow-plugins": {
3338
"ergebnis/composer-normalize": true,
3439
"laravel/pint": true,
3540
"pestphp/pest-plugin": true
3641
}
42+
},
43+
"extra": {
44+
"laravel": {
45+
"providers": [
46+
"DragonCode\\LaravelTracker\\LaravelTelemetryServiceProvider"
47+
]
48+
}
49+
},
50+
"scripts": {
51+
"post-update-cmd": [
52+
"@php vendor/bin/codestyle pint 8.2 --ansi",
53+
"@php vendor/bin/codestyle editorconfig --ansi",
54+
"composer normalize --ansi"
55+
],
56+
"style": "@php vendor/bin/pint",
57+
"test": "vendor/bin/pest",
58+
"test:coverage": "vendor/bin/pest --coverage",
59+
"test:type": "vendor/bin/pest --type-coverage --compact --min=95"
3760
}
3861
}
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
use DragonCode\LaravelTracker\Http\Middleware\TelemetryMiddleware;
6+
use Illuminate\Http\Request;
7+
use Illuminate\Support\Str;
8+
use Symfony\Component\HttpFoundation\Response;
9+
10+
it('sets headers and context for guest user', function () {
11+
$middleware = new TelemetryMiddleware;
12+
13+
$captured = null;
14+
15+
$response = $middleware->handle(
16+
makeRequest(ip: '198.51.100.42'),
17+
function (Request $request) use (&$captured): Response {
18+
$captured = $request;
19+
20+
return new Response('OK', 200);
21+
}
22+
);
23+
24+
expect($response->getStatusCode())->toBe(200);
25+
26+
$userId = $captured->headers->get('X-Telemetry-User-Id');
27+
$ip = $captured->headers->get('X-Telemetry-Ip');
28+
$trace = $captured->headers->get('X-Telemetry-Trace-Id');
29+
30+
expect($userId)->toBe('0');
31+
expect($ip)->toBe('198.51.100.42');
32+
expect($trace)->not()->toBeEmpty()->and(Str::isUuid($trace))->toBeTrue();
33+
34+
// context('telemetry') is added by middleware
35+
$context = context('telemetry');
36+
37+
expect($context)
38+
->toBeArray()
39+
->toHaveKeys(['userId', 'ip', 'traceId']);
40+
41+
expect($context['userId'])->toBe('0');
42+
expect($context['ip'])->toBe('198.51.100.42');
43+
expect($context['traceId'])->toBe($trace);
44+
});
45+
46+
it('uses authenticated user id when available', function () {
47+
$middleware = new TelemetryMiddleware;
48+
49+
$user = new class {
50+
public function getKey(): int
51+
{
52+
return 123;
53+
}
54+
};
55+
56+
$captured = null;
57+
58+
$middleware->handle(
59+
makeRequest(userResolver: fn () => $user),
60+
function (Request $request) use (&$captured): Response {
61+
$captured = $request;
62+
63+
return new Response('OK', 200);
64+
}
65+
);
66+
67+
$userId = $captured->headers->get('X-Telemetry-User-Id');
68+
69+
expect($userId)->toBe('123');
70+
71+
$context = context('telemetry');
72+
73+
expect($context['userId'])->toBe('123');
74+
});
75+
76+
it('respects existing telemetry headers', function () {
77+
$middleware = new TelemetryMiddleware;
78+
79+
$existing = [
80+
'X-Telemetry-User-Id' => '777',
81+
'X-Telemetry-Ip' => '192.0.2.55',
82+
'X-Telemetry-Trace-Id' => (string) Str::uuid(),
83+
];
84+
85+
$captured = null;
86+
87+
$middleware->handle(
88+
makeRequest(headers: $existing),
89+
function (Request $request) use (&$captured): Response {
90+
$captured = $request;
91+
92+
return new Response('OK', 200);
93+
}
94+
);
95+
96+
foreach ($existing as $key => $value) {
97+
expect($captured->headers->get($key))->toBe($value);
98+
}
99+
100+
$context = context('telemetry');
101+
102+
expect($context['userId'])->toBe('777');
103+
expect($context['ip'])->toBe('192.0.2.55');
104+
expect($context['traceId'])->toBe($existing['X-Telemetry-Trace-Id']);
105+
});

tests/Helpers/request.php

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
use Illuminate\Http\Request;
6+
7+
function makeRequest(string $ip = '203.0.113.10', ?callable $userResolver = null, array $headers = []): Request
8+
{
9+
$request = Request::create(uri: '/', server: [
10+
'REMOTE_ADDR' => $ip,
11+
]);
12+
13+
foreach ($headers as $key => $value) {
14+
$request->headers->set($key, $value);
15+
}
16+
17+
if ($userResolver) {
18+
$request->setUserResolver($userResolver);
19+
}
20+
21+
return $request;
22+
}

tests/Pest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
declare(strict_types=1);
44

5-
use Orchestra\Testbench\TestCase;
5+
use Tests\TestCase;
66

77
pest()
88
->printer()

tests/TestCase.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tests;
6+
7+
use DragonCode\LaravelTracker\LaravelTelemetryServiceProvider;
8+
use Orchestra\Testbench\TestCase as BaseTestCase;
9+
10+
abstract class TestCase extends BaseTestCase
11+
{
12+
protected function getPackageProviders($app): array
13+
{
14+
return [
15+
LaravelTelemetryServiceProvider::class,
16+
];
17+
}
18+
}

0 commit comments

Comments
 (0)