makeRequest('GET', ['query' => $query]); $parser = new RequestParser(); /** @var \GraphQL\Server\OperationParams $params */ $params = $parser->parseRequest($request); self::assertSame($query, $params->query); } public function testPostWithJson(): void { $query = /** @lang GraphQL */ '{ foo }'; $request = $this->makeRequest( 'POST', [], [], ['Content-Type' => 'application/json'], \Safe\json_encode(['query' => $query]) ); $parser = new RequestParser(); /** @var \GraphQL\Server\OperationParams $params */ $params = $parser->parseRequest($request); self::assertSame($query, $params->query); } public function testPostWithQueryApplicationGraphQL(): void { $query = /** @lang GraphQL */ '{ foo }'; $request = $this->makeRequest( 'POST', [], [], ['Content-Type' => 'application/graphql'], $query ); $parser = new RequestParser(); /** @var \GraphQL\Server\OperationParams $params */ $params = $parser->parseRequest($request); self::assertSame($query, $params->query); } public function testPostWithRegularForm(): void { $query = /** @lang GraphQL */ '{ foo }'; $request = $this->makeRequest( 'POST', ['query' => $query], [], ['Content-Type' => 'application/x-www-form-urlencoded'] ); $parser = new RequestParser(); /** @var \GraphQL\Server\OperationParams $params */ $params = $parser->parseRequest($request); self::assertSame($query, $params->query); } public function testPostDefaultsToRegularForm(): void { $query = /** @lang GraphQL */ '{ foo }'; $request = $this->makeRequest( 'POST', ['query' => $query] ); $parser = new RequestParser(); /** @var \GraphQL\Server\OperationParams $params */ $params = $parser->parseRequest($request); self::assertSame($query, $params->query); } public function testNonSensicalContentType(): void { $request = $this->makeRequest( 'POST', [], [], ['Content-Type' => 'foobar'] ); $parser = new RequestParser(); $this->expectException(RequestError::class); $parser->parseRequest($request); } public function testNoQuery(): void { $request = $this->makeRequest('GET'); $parser = new RequestParser(); /** @var \GraphQL\Server\OperationParams $params */ $params = $parser->parseRequest($request); self::assertSame(null, $params->query); } public function testInvalidJson(): void { $request = $this->makeRequest( 'POST', [], [], ['Content-Type' => 'application/json'], 'this is not valid json' ); $parser = new RequestParser(); $this->expectException(JsonException::class); $parser->parseRequest($request); } public function testNonArrayJson(): void { $request = $this->makeRequest( 'POST', [], [], ['Content-Type' => 'application/json'], '"this should be a map with query, variables, etc."' ); $parser = new RequestParser(); $this->expectException(RequestError::class); $parser->parseRequest($request); } public function testMultipartFormRequest(): void { $file = UploadedFile::fake()->create('image.jpg', 500); $request = $this->makeRequest( 'POST', [ 'operations' => /** @lang JSON */ ' { "query": "mutation Upload($file: Upload!) { upload(file: $file) }", "variables": { "file": null } } ', 'map' => /** @lang JSON */ ' { "0": ["variables.file"] } ', ], [ '0' => $file, ], [ 'Content-Type' => 'multipart/form-data', ] ); $parser = new RequestParser(); /** @var \GraphQL\Server\OperationParams $params */ $params = $parser->parseRequest($request); self::assertSame('mutation Upload($file: Upload!) { upload(file: $file) }', $params->query); $variables = $params->variables; self::assertNotNull($variables); /** @var array $variables */ self::assertSame($file, $variables['file']); } public function testMultipartFormWithoutMap(): void { $request = $this->makeRequest( 'POST', [], [], [ 'Content-Type' => 'multipart/form-data', ] ); $parser = new RequestParser(); $this->expectException(RequestError::class); $parser->parseRequest($request); } public function testMultipartFormWithoutOperations(): void { $request = $this->makeRequest( 'POST', [ 'map' => /** @lang JSON */ ' { "0": ["variables.file"] } ', ], [], [ 'Content-Type' => 'multipart/form-data', ] ); $parser = new RequestParser(); $this->expectException(RequestError::class); $parser->parseRequest($request); } /** * @param string $method * @param array $parameters * @param array $files * @param array $headers * @param string|resource|null $content * @return \Illuminate\Http\Request */ public function makeRequest(string $method, array $parameters = [], array $files = [], array $headers = [], $content = null): Request { $symfonyRequest = SymfonyRequest::create( 'http://foo.bar/graphql', $method, $parameters, [], $files, $this->transformHeadersToServerVars($headers), $content ); return Request::createFromBase($symfonyRequest); } }