diff --git a/composer.json b/composer.json index fcd5d9f..3ad4a2a 100644 --- a/composer.json +++ b/composer.json @@ -10,11 +10,12 @@ "prefer-stable": true, "require": { "php": "^7.4 || ^8.0", - "ext-json": "*", "ext-dom": "*", + "ext-json": "*", "ibexa/test-core": "~4.6.x-dev", "justinrainbow/json-schema": "^5.2", "symfony/browser-kit": "^5.4", + "symfony/http-foundation": "^5.4", "symfony/mime": "^5.4", "symfony/proxy-manager-bridge": "^5.4", "symfony/translation": "^5.4", diff --git a/src/contracts/BaseRestWebTestCase.php b/src/contracts/BaseRestWebTestCase.php index c40a86e..b23ce2d 100644 --- a/src/contracts/BaseRestWebTestCase.php +++ b/src/contracts/BaseRestWebTestCase.php @@ -41,7 +41,17 @@ public function testEndpoint(EndpointRequestDefinition $endpointDefinition): voi { $response = $this->performRequest($endpointDefinition); - self::assertResponseIsSuccessful(); + $expectedStatusCode = $endpointDefinition->getExpectedStatusCode(); + if (null === $expectedStatusCode) { + self::assertResponseIsSuccessful(); + } else { + $actualStatusCode = $response->getStatusCode(); + self::assertSame( + $actualStatusCode, + $expectedStatusCode, + "Expected HTTP $expectedStatusCode, got HTTP $actualStatusCode status code" + ); + } $content = (string)$response->getContent(); $this->assertResponseIsValid( diff --git a/src/contracts/Request/Value/EndpointRequestDefinition.php b/src/contracts/Request/Value/EndpointRequestDefinition.php index 1e1ea5e..5a18b72 100644 --- a/src/contracts/Request/Value/EndpointRequestDefinition.php +++ b/src/contracts/Request/Value/EndpointRequestDefinition.php @@ -38,9 +38,12 @@ final class EndpointRequestDefinition implements Stringable */ private ?string $snapshotName; + private ?int $expectedStatusCode; + /** * @param array $headers input headers * @param string|null $name unique name + * @param int|null $expectedStatusCode expected HTTP status code. If none is given, any successful status code is accepted (>=200 <300) */ public function __construct( string $method, @@ -50,7 +53,8 @@ public function __construct( array $headers = [], ?InputPayload $payload = null, ?string $name = null, - ?string $snapshotName = null + ?string $snapshotName = null, + ?int $expectedStatusCode = null ) { $this->method = $method; $this->uri = $uri; @@ -60,6 +64,7 @@ public function __construct( $this->payload = $payload; $this->name = $name; $this->snapshotName = $snapshotName; + $this->expectedStatusCode = $expectedStatusCode; } public function getMethod(): string @@ -149,6 +154,11 @@ public function getSnapshotName(): ?string return $this->snapshotName; } + public function getExpectedStatusCode(): ?int + { + return $this->expectedStatusCode; + } + public function withAcceptHeader(?string $acceptHeader): self { $endpointDefinition = clone $this; @@ -173,6 +183,14 @@ public function withSnapshotName(?string $snapshotName): self return $endpointDefinition; } + public function withExpectedStatusCode(?int $expectedStatusCode): self + { + $endpointDefinition = clone $this; + $endpointDefinition->expectedStatusCode = $expectedStatusCode; + + return $endpointDefinition; + } + public function __clone() { if (null !== $this->payload) { diff --git a/tests/lib/Request/Value/EndpointRequestDefinitionTest.php b/tests/lib/Request/Value/EndpointRequestDefinitionTest.php index df1bff4..76ab939 100644 --- a/tests/lib/Request/Value/EndpointRequestDefinitionTest.php +++ b/tests/lib/Request/Value/EndpointRequestDefinitionTest.php @@ -11,6 +11,7 @@ use Ibexa\Contracts\Test\Rest\Request\Value\EndpointRequestDefinition; use PHPUnit\Framework\TestCase; use RuntimeException; +use Symfony\Component\HttpFoundation\Response; /** * @covers \Ibexa\Contracts\Test\Rest\Request\Value\EndpointRequestDefinition @@ -74,4 +75,26 @@ public function testWithSnapshotName(): void self::assertNull($endpointRequestDefinition->getSnapshotName()); self::assertSame($snapshotName, $clonedEndpointRequestDefinition->getSnapshotName()); } + + public function testWithExpectedStatusCode(): void + { + $endpointRequestDefinition = new EndpointRequestDefinition('GET', '/foo', null, 'application/xml'); + self::assertNull($endpointRequestDefinition->getExpectedStatusCode()); + + $endpointRequestDefinition = $endpointRequestDefinition->withExpectedStatusCode(Response::HTTP_CREATED); + self::assertSame(Response::HTTP_CREATED, $endpointRequestDefinition->getExpectedStatusCode()); + + $endpointRequestDefinition = new EndpointRequestDefinition( + 'GET', + '/foo', + null, + 'application/xml', + [], + null, + null, + null, + Response::HTTP_NO_CONTENT + ); + self::assertSame(Response::HTTP_NO_CONTENT, $endpointRequestDefinition->getExpectedStatusCode()); + } }