Initial Drupal 11 with DDEV setup
This commit is contained in:
83
web/core/tests/Drupal/Tests/ApiRequestTrait.php
Normal file
83
web/core/tests/Drupal/Tests/ApiRequestTrait.php
Normal file
@ -0,0 +1,83 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Drupal\Tests;
|
||||
|
||||
use Behat\Mink\Driver\BrowserKitDriver;
|
||||
use Drupal\Core\Url;
|
||||
use GuzzleHttp\RequestOptions;
|
||||
use Psr\Http\Message\ResponseInterface;
|
||||
|
||||
/**
|
||||
* Boilerplate for API Functional tests' HTTP requests.
|
||||
*
|
||||
* @internal
|
||||
*/
|
||||
trait ApiRequestTrait {
|
||||
|
||||
/**
|
||||
* Performs an HTTP request. Wraps the Guzzle HTTP client.
|
||||
*
|
||||
* Why wrap the Guzzle HTTP client? Because we want to keep the actual test
|
||||
* code as simple as possible, and hence not require them to specify the
|
||||
* 'http_errors = FALSE' request option, nor do we want them to have to
|
||||
* convert Drupal Url objects to strings.
|
||||
*
|
||||
* We also don't want to follow redirects automatically, to ensure these tests
|
||||
* are able to detect when redirects are added or removed.
|
||||
*
|
||||
* @param string $method
|
||||
* HTTP method.
|
||||
* @param \Drupal\Core\Url $url
|
||||
* URL to request.
|
||||
* @param array $request_options
|
||||
* Request options to apply.
|
||||
*
|
||||
* @return \Psr\Http\Message\ResponseInterface
|
||||
* The response.
|
||||
*
|
||||
* @see \GuzzleHttp\ClientInterface::request()
|
||||
*/
|
||||
protected function makeApiRequest($method, Url $url, array $request_options): ResponseInterface {
|
||||
// HEAD requests do not have bodies. If one is specified, Guzzle will not
|
||||
// ignore it and the request will be treated as GET with an overridden
|
||||
// method string, and libcurl will expect to read a response body.
|
||||
if ($method === 'HEAD' && array_key_exists('body', $request_options)) {
|
||||
unset($request_options['body']);
|
||||
}
|
||||
$this->refreshVariables();
|
||||
$request_options[RequestOptions::HTTP_ERRORS] = FALSE;
|
||||
$request_options[RequestOptions::ALLOW_REDIRECTS] = FALSE;
|
||||
$request_options = $this->decorateWithXdebugCookie($request_options);
|
||||
$client = $this->getSession()->getDriver()->getClient()->getClient();
|
||||
return $client->request($method, $url->setAbsolute(TRUE)->toString(), $request_options);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the Xdebug cookie to the request options.
|
||||
*
|
||||
* @param array $request_options
|
||||
* The request options.
|
||||
*
|
||||
* @return array
|
||||
* Request options updated with the Xdebug cookie if present.
|
||||
*/
|
||||
protected function decorateWithXdebugCookie(array $request_options): array {
|
||||
$session = $this->getSession();
|
||||
$driver = $session->getDriver();
|
||||
if ($driver instanceof BrowserKitDriver) {
|
||||
$client = $driver->getClient();
|
||||
foreach ($client->getCookieJar()->all() as $cookie) {
|
||||
if (isset($request_options[RequestOptions::HEADERS]['Cookie'])) {
|
||||
$request_options[RequestOptions::HEADERS]['Cookie'] .= '; ' . $cookie->getName() . '=' . $cookie->getValue();
|
||||
}
|
||||
else {
|
||||
$request_options[RequestOptions::HEADERS]['Cookie'] = $cookie->getName() . '=' . $cookie->getValue();
|
||||
}
|
||||
}
|
||||
}
|
||||
return $request_options;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user