170 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			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;
 | 
						|
    }
 | 
						|
}
 |