handle($request, function (Request $req): Response { expect($req->query('siteIds'))->toBe(['LDCSER', 'SLELA']); return new Response(); }); // THEN expect($response->getStatusCode())->toBe(200); }); it('normalizes bracket query parameters into array without trailing brackets in key', function (): void { // GIVEN $middleware = new NormalizeQueryStringArrays(); $request = Request::create('/api/v1/employees?siteIds[]=LDCSER&siteIds[]=SLELA', 'GET'); // WHEN $response = $middleware->handle($request, function (Request $req): Response { expect($req->query('siteIds'))->toBe(['LDCSER', 'SLELA']); return new Response(); }); // THEN expect($response->getStatusCode())->toBe(200); }); it('normalizes single scalar brand query parameter into array', function (): void { // GIVEN $middleware = new NormalizeQueryStringArrays(); $request = Request::create('/api/v1/inco-sheets?brands=LGL01', 'GET'); // WHEN $response = $middleware->handle($request, function (Request $req): Response { expect($req->query('brands'))->toBe(['LGL01']); return new Response(); }); // THEN expect($response->getStatusCode())->toBe(200); }); it('normalizes comma separated brands into array', function (): void { // GIVEN $middleware = new NormalizeQueryStringArrays(); $request = Request::create('/api/v1/inco-sheets?brands=LGL01,MCQ01', 'GET'); // WHEN $response = $middleware->handle($request, function (Request $req): Response { expect($req->query('brands'))->toBe(['LGL01', 'MCQ01']); return new Response(); }); // THEN expect($response->getStatusCode())->toBe(200); }); it('bypasses non-api routes', function (): void { // GIVEN $middleware = new NormalizeQueryStringArrays(); $request = Request::create('/ping?siteIds=LDCSER&siteIds=SLELA', 'GET'); // WHEN $response = $middleware->handle($request, function (Request $req): Response { // PHP native behavior: last value wins if not normalized expect($req->query('siteIds'))->toBe('SLELA'); return new Response(); }); // THEN expect($response->getStatusCode())->toBe(200); }); });