magento2-docker/dev/tests/integration/testsuite/Magento/GraphQl/Service/GraphQlRequest.php

170 lines
4.3 KiB
PHP
Executable File

<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);
namespace Magento\GraphQl\Service;
use Magento\Framework\App\Request\Http;
use Magento\Framework\Serialize\SerializerInterface;
use Magento\GraphQl\Controller\GraphQl;
use Magento\Framework\App\Response\Http as HttpResponse;
use Magento\TestFramework\ObjectManager;
use Magento\Framework\Webapi\Request;
/**
* Service class to simplify GraphQl requests for integration tests
*/
class GraphQlRequest
{
/**
* @var string
*/
private $controllerPath = '/graphql';
/**
* @var Http
*/
private $httpRequest;
/**
* @var array
*/
private $defaultHeaders = ['Content-Type' => 'application/json'];
/**
* @var SerializerInterface
*/
private $json;
/**
* @var GraphQl
*/
private $controller;
/**
* @param Http $httpRequest
* @param SerializerInterface $json
* @param GraphQl $controller
*/
public function __construct(
Http $httpRequest,
SerializerInterface $json,
GraphQl $controller
) {
$this->httpRequest = $httpRequest;
$this->json = $json;
$this->controller = $controller;
}
/**
* Send request and return response
*
* @param string $query
* @param array $variables
* @param string $operation
* @param array $headers
* @return HttpResponse
*/
public function send(
string $query,
array $variables = [],
string $operation = '',
array $headers = []
) {
$this->httpRequest->setPathInfo($this->controllerPath);
$this->setQuery($query, $variables, $operation)
->setHeaders($headers);
/** @var HttpResponse $response */
$response = $this->controller->dispatch($this->httpRequest);
return $response;
}
/**
* Set query data on request
*
* @param string $query
* @param array $variables
* @param string $operation
* @return GraphQlRequest
*/
private function setQuery(string $query, array $variables = [], string $operation = ''): self
{
if (strpos(trim($query), 'mutation') === 0) {
$this->httpRequest->setMethod('POST');
$this->setPostContent($query, $variables, $operation);
} else {
$this->httpRequest->setMethod('GET');
$this->setGetContent($query, $variables, $operation);
}
return $this;
}
/**
* Set headers on request
*
* @param array $headers
* @return GraphQlRequest
*/
private function setHeaders(array $headers): self
{
$allHeaders = array_merge($this->defaultHeaders, $headers);
$webApiRequest = ObjectManager::getInstance()->get(Request::class);
$requestHeaders = $webApiRequest->getHeaders();
foreach ($allHeaders as $key => $value) {
$requestHeaders->addHeaderLine($key, $value);
}
$this->httpRequest->setHeaders($webApiRequest->getHeaders());
return $this;
}
/**
* Set POST body for request
*
* @param string $query
* @param array $variables
* @param string $operation
* @return GraphQlRequest
*/
private function setPostContent(string $query, array $variables = [], string $operation = ''): self
{
$content = [
'query' => $query,
'variables' => !empty($variables) ? $this->json->serialize($variables) : null,
'operationName' => !empty($operation) ? $operation : null
];
$this->httpRequest->setContent($this->json->serialize($content));
return $this;
}
/**
* Set GET parameters for request
*
* @param string $query
* @param array $variables
* @param string $operation
* @return GraphQlRequest
*/
private function setGetContent(string $query, array $variables = [], string $operation = ''): self
{
$this->httpRequest->setQueryValue('query', $query);
if (!empty($variables)) {
$this->httpRequest->setQueryValue('variables', $variables);
}
if (!empty($operation)) {
$this->httpRequest->setQueryValue('operationName', $operation);
}
return $this;
}
}