diff --git a/src/HttpClientMock/RealRequestFactory.php b/src/HttpClientMock/RealRequestFactory.php index 0180944..48b5885 100644 --- a/src/HttpClientMock/RealRequestFactory.php +++ b/src/HttpClientMock/RealRequestFactory.php @@ -8,6 +8,7 @@ use Riverline\MultiPartParser\StreamedPart; use function array_key_exists; +use function array_merge; use function assert; use function explode; use function is_array; @@ -19,6 +20,8 @@ use function Safe\preg_match; use function Safe\rewind; use function str_contains; +use function str_ends_with; +use function str_replace; use function strpos; use function strtolower; use function substr; @@ -157,7 +160,18 @@ private function parseEncodedParams(string $encodedParams): array $value = ''; } - $params[urldecode((string) $key)] = urldecode((string) $value); + $key = urldecode($key); + $value = urldecode($value); + + if (str_ends_with($key, '[]')) { + $key = str_replace('[]', '', $key); + $value = array_merge( + $params[$key] ?? [], + [$value], + ); + } + + $params[$key] = $value; } return $params; diff --git a/tests/HttpClientMock/RealRequestFactoryTest.php b/tests/HttpClientMock/RealRequestFactoryTest.php index ec1117b..0a5a275 100644 --- a/tests/HttpClientMock/RealRequestFactoryTest.php +++ b/tests/HttpClientMock/RealRequestFactoryTest.php @@ -32,6 +32,26 @@ public function testBuildsRequestWithoutBody(): void self::assertSame(['foo' => 'bar'], $request->getJson()); } + public function testBuildsRequestWithMultipleQueryParams(): void + { + $options = ['query_params' => ['name' => ['abc', 'def']]]; + $request = ($this->realRequestFactory)('POST', 'https://service.com', $options); + + self::assertSame('POST', $request->getMethod()); + self::assertSame('https://service.com', $request->getUri()); + self::assertSame(['name' => ['abc', 'def']], $request->getQueryParams()); + } + + public function testBuildsRequestWithMultipleQueryParamsInUri(): void + { + $options = []; + $request = ($this->realRequestFactory)('POST', 'https://service.com?name[]=abc&name[]=def', $options); + + self::assertSame('POST', $request->getMethod()); + self::assertSame('https://service.com', $request->getUri()); + self::assertSame(['name' => ['abc', 'def']], $request->getQueryParams()); + } + public function testBuildsRequestWithJsonInBody(): void { $options = [