103 lines
2.5 KiB
PHP
103 lines
2.5 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Tests\Behat;
|
|
|
|
use Behat\Behat\Context\Context;
|
|
use Behat\Gherkin\Node\PyStringNode;
|
|
use Behat\Gherkin\Node\TableNode;
|
|
use Symfony\Component\HttpFoundation\Request;
|
|
use Symfony\Component\HttpFoundation\Response;
|
|
use Symfony\Component\HttpKernel\KernelInterface;
|
|
|
|
final class ApiCallContext implements Context
|
|
{
|
|
private Response $response;
|
|
private array $query = [];
|
|
private ?string $body = null;
|
|
|
|
public function __construct(
|
|
private readonly KernelInterface $kernel
|
|
) {
|
|
}
|
|
|
|
/**
|
|
* @When I send a request to ":path"
|
|
*/
|
|
public function iSendARequestToPath(string $path): void
|
|
{
|
|
$this->iSendARequestToWithFollowingBody('GET', $path);
|
|
}
|
|
|
|
/**
|
|
* @Then the response should be received
|
|
*/
|
|
public function theResponseShouldBeReceived(): void
|
|
{
|
|
if ($this->response === null) {
|
|
throw new \RuntimeException('No response received');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @Then the response status should be :code
|
|
*/
|
|
public function theResponseStatusShouldBe(int $code): void
|
|
{
|
|
$this->theResponseShouldBeReceived();
|
|
|
|
if ($this->response->getStatusCode() !== $code) {
|
|
throw new \RuntimeException(
|
|
strtr(
|
|
'The response code was %received% not %expected%', [
|
|
'%received%' => $this->response->getStatusCode(),
|
|
'%expected%' => $code
|
|
]
|
|
)
|
|
);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @Given /^the request has the following body:$/
|
|
*/
|
|
public function theRequestHasTheFollowingBody(PyStringNode $string)
|
|
{
|
|
$this->body = $string->getRaw();
|
|
}
|
|
|
|
/**
|
|
* @Given /^the request has the following query:$/
|
|
*/
|
|
public function theRequestHasTheFollowingQuery(TableNode $tableNode)
|
|
{
|
|
foreach ($tableNode as $row) {
|
|
$this->query[$row['arg']] = $row['value'];
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @When /^I send a (\w+) request to "([^"]*)"$/
|
|
*/
|
|
public function iSendARequestToWithFollowingBody($method, $path)
|
|
{
|
|
$request = Request::create(
|
|
$path.'?'.http_build_query($this->query),
|
|
method: $method,
|
|
content: $this->body
|
|
);
|
|
|
|
if ($this->body) {
|
|
$request->headers->set('Content-Type', 'application/json');
|
|
}
|
|
|
|
$this->doRequest($request);
|
|
}
|
|
|
|
private function doRequest(Request $request): void
|
|
{
|
|
$this->response = $this->kernel->handle($request);
|
|
}
|
|
}
|