Skip to content

Commit af0d7c7

Browse files
Add test coverage for TelemetryRequest and TelemetryHeader classes.
1 parent 38ddd25 commit af0d7c7

File tree

4 files changed

+143
-0
lines changed

4 files changed

+143
-0
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,6 @@ vendor/
1313
*.clover
1414
*.orig
1515

16+
pint.json
17+
1618
composer.lock

tests/Helpers/request.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
use Symfony\Component\HttpFoundation\Request;
6+
7+
function makeRequest(array $headers = [], array $server = []): Request
8+
{
9+
$serverFromHeaders = [];
10+
foreach ($headers as $key => $value) {
11+
$serverKey = 'HTTP_' . str_replace('-', '_', strtoupper($key));
12+
13+
$serverFromHeaders[$serverKey] = $value;
14+
}
15+
16+
$server = array_merge($serverFromHeaders, $server);
17+
18+
return Request::create('/', 'GET', [], [], [], $server);
19+
}

tests/Unit/HeaderTest.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
use DragonCode\Telemetry\TelemetryHeader;
6+
7+
it('uses default header names', function () {
8+
$header = new TelemetryHeader;
9+
10+
expect($header->userId)->toBe('X-Telemetry-User-Id')
11+
->and($header->ip)->toBe('X-Telemetry-Ip')
12+
->and($header->trackId)->toBe('X-Telemetry-Track-Id');
13+
});
14+
15+
it('accepts custom header names', function () {
16+
$header = new TelemetryHeader(
17+
userId : 'Some-User-Id',
18+
ip : 'Some-IP',
19+
trackId: 'Some-Track-Id',
20+
);
21+
22+
expect($header->userId)->toBe('Some-User-Id')
23+
->and($header->ip)->toBe('Some-IP')
24+
->and($header->trackId)->toBe('Some-Track-Id');
25+
});

tests/Unit/RequestTest.php

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
use DragonCode\Telemetry\TelemetryHeader;
6+
use DragonCode\Telemetry\TelemetryRequest;
7+
use Ramsey\Uuid\Uuid;
8+
9+
it('sets and gets user id with string and int, falling back to existing header or 0', function () {
10+
$header = new TelemetryHeader;
11+
12+
// 1) Explicit string
13+
$request = makeRequest();
14+
$telemetry = new TelemetryRequest($request, $header);
15+
$telemetry->userId('42');
16+
expect($request->headers->get($header->userId))->toBe('42')
17+
->and($telemetry->getUserId())->toBe('42');
18+
19+
// 2) Explicit int should be cast to string
20+
$request = makeRequest();
21+
$telemetry = new TelemetryRequest($request, $header);
22+
$telemetry->userId(7);
23+
expect($request->headers->get($header->userId))->toBe('7');
24+
25+
// 3) Fallback to existing header when null
26+
$request = makeRequest([$header->userId => '555']);
27+
$telemetry = new TelemetryRequest($request, $header);
28+
$telemetry->userId(null);
29+
expect($request->headers->get($header->userId))->toBe('555')
30+
->and($telemetry->getUserId())->toBe('555');
31+
32+
// 4) getUserId() returns '0' when nothing present
33+
$request = makeRequest();
34+
$telemetry = new TelemetryRequest($request, $header);
35+
expect($telemetry->getUserId())->toBe('0');
36+
});
37+
38+
it('gets ip with correct precedence and sets header via ip()', function () {
39+
$header = new TelemetryHeader;
40+
41+
// 1) If telemetry header exists, it wins
42+
$request = makeRequest([$header->ip => '203.0.113.10']);
43+
$telemetry = new TelemetryRequest($request, $header);
44+
expect($telemetry->getIp())->toBe('203.0.113.10');
45+
46+
// 2) Else HTTP_X_REAL_IP (non-standard header name checked by the class)
47+
$request = makeRequest();
48+
$request->headers->set('HTTP_X_REAL_IP', '198.51.100.20');
49+
$telemetry = new TelemetryRequest($request, $header);
50+
expect($telemetry->getIp())->toBe('198.51.100.20');
51+
52+
// 3) Else client ip (REMOTE_ADDR)
53+
$request = makeRequest([], ['REMOTE_ADDR' => '192.0.2.30']);
54+
$telemetry = new TelemetryRequest($request, $header);
55+
expect($telemetry->getIp())->toBe('192.0.2.30');
56+
57+
// 4) ip() without argument sets header from getIp()
58+
$telemetry->ip();
59+
expect($request->headers->get($header->ip))->toBe('192.0.2.30');
60+
61+
// 5) ip() with value overrides and sets header
62+
$telemetry->ip('10.0.0.1');
63+
expect($request->headers->get($header->ip))->toBe('10.0.0.1');
64+
});
65+
66+
it('gets or sets track id, generating a UUID v4 when absent', function () {
67+
$header = new TelemetryHeader;
68+
69+
// 1) If header exists, return it
70+
$request = makeRequest([$header->trackId => 'track-123']);
71+
$telemetry = new TelemetryRequest($request, $header);
72+
expect($telemetry->getTrackId())->toBe('track-123');
73+
74+
// 2) When absent, generate UUID v4
75+
$request = makeRequest();
76+
$telemetry = new TelemetryRequest($request, $header);
77+
$generated = $telemetry->getTrackId();
78+
expect(Uuid::isValid($generated))->toBeTrue()
79+
->and(Uuid::fromString($generated)->getVersion())->toBe(4);
80+
81+
// 3) trackId() without param sets header using getTrackId()
82+
$telemetry->trackId();
83+
expect($request->headers->has($header->trackId))->toBeTrue()
84+
->and(Uuid::isValid($request->headers->get($header->trackId)))->toBeTrue();
85+
86+
// 4) trackId() with explicit value sets header
87+
$telemetry->trackId('manual-id');
88+
expect($request->headers->get($header->trackId))->toBe('manual-id');
89+
});
90+
91+
it('returns the same Request instance via getRequest()', function () {
92+
$header = new TelemetryHeader;
93+
$request = makeRequest();
94+
$telemetry = new TelemetryRequest($request, $header);
95+
96+
expect($telemetry->getRequest())->toBe($request);
97+
});

0 commit comments

Comments
 (0)