ldc-arcadia-api/tests/Unit/Infra/Http/Helpers/RequestHelperTest.php
Jérémy Munsch 05ececd879
feat(RequestHelper): add pagination and URI conversion methods
Implement pagination logic and methods to convert request URLs to League URI instances.
2026-08-13 14:52:51 +02:00

116 lines
3.9 KiB
PHP

<?php
declare(strict_types=1);
namespace Tests\Unit\Infra\Http\Helpers;
use Illuminate\Http\Request as HttpRequest;
use Infra\Http\Helpers\RequestHelper;
use League\Uri\Http;
use Shared\Pagination;
covers(RequestHelper::class);
describe('RequestHelper Unit Tests', function (): void {
it('prevents direct instantiation but covers constructor', function (): void {
// GIVEN
$reflection = new \ReflectionClass(RequestHelper::class);
// WHEN
$constructor = $reflection->getConstructor();
$constructor?->invoke($reflection->newInstanceWithoutConstructor());
// THEN
expect(fn () => $reflection->newInstance())
->toThrow(\ReflectionException::class);
});
it('creates offset and limit pagination when offset or limit query param is present', function (): void {
// GIVEN
$request = HttpRequest::create('/api/v1/employees?offset=10&limit=50', 'GET');
// WHEN
$pagination = RequestHelper::pagination($request, 25);
// THEN
expect($pagination)->toBeInstanceOf(Pagination::class)
->and($pagination->from())->toBe(10)
->and($pagination->to())->toBe(59);
});
it('creates page and page size pagination using pageSize query param', function (): void {
// GIVEN
$request = HttpRequest::create('/api/v1/employees?page=2&pageSize=15', 'GET');
// WHEN
$pagination = RequestHelper::pagination($request, 25);
// THEN
expect($pagination)->toBeInstanceOf(Pagination::class)
->and($pagination->from())->toBe(15)
->and($pagination->to())->toBe(29);
});
it('creates page and page size pagination using per_page query param fallback', function (): void {
// GIVEN
$request = HttpRequest::create('/api/v1/employees?page=3&per_page=20', 'GET');
// WHEN
$pagination = RequestHelper::pagination($request, 25);
// THEN
expect($pagination)->toBeInstanceOf(Pagination::class)
->and($pagination->from())->toBe(40)
->and($pagination->to())->toBe(59);
});
it('creates page and page size pagination using pagination query param fallback', function (): void {
// GIVEN
$request = HttpRequest::create('/api/v1/employees?page=1&pagination=30', 'GET');
// WHEN
$pagination = RequestHelper::pagination($request, 25);
// THEN
expect($pagination)->toBeInstanceOf(Pagination::class)
->and($pagination->from())->toBe(0)
->and($pagination->to())->toBe(29);
});
it('uses default page size when no pagination parameters are supplied', function (): void {
// GIVEN
$request = HttpRequest::create('/api/v1/employees', 'GET');
// WHEN
$pagination = RequestHelper::pagination($request, 25);
// THEN
expect($pagination)->toBeInstanceOf(Pagination::class)
->and($pagination->from())->toBe(0)
->and($pagination->to())->toBe(24);
});
it('converts request URL to League Uri instance', function (): void {
// GIVEN
$request = HttpRequest::create('http://localhost/api/v1/employees?foo=bar', 'GET');
// WHEN
$uri = RequestHelper::toLeagueUri($request);
// THEN
expect($uri)->toBeInstanceOf(Http::class)
->and((string) $uri)->toBe('http://localhost/api/v1/employees');
});
it('converts full request URL with query parameters to League Uri instance', function (): void {
// GIVEN
$request = HttpRequest::create('http://localhost/api/v1/employees?page=2&pageSize=10', 'GET');
// WHEN
$uri = RequestHelper::toLeagueFullUri($request);
// THEN
expect($uri)->toBeInstanceOf(Http::class)
->and((string) $uri)->toBe('http://localhost/api/v1/employees?page=2&pageSize=10');
});
});