Files
api/services/nginx/app/tests/Support/Api/ApiResponse.php
T

102 lines
2.8 KiB
PHP

<?php
declare(strict_types=1);
namespace Tests\Support\Api;
use PHPUnit\Framework\Assert;
final class ApiResponse
{
/**
* @param array<string, string> $headers
* @param array<string, mixed>|null $json
*/
public function __construct(
public readonly int $status,
public readonly array $headers,
public readonly ?array $json,
public readonly string $body,
) {
}
public function assertStatus(int $expectedStatus): self
{
Assert::assertSame($expectedStatus, $this->status, $this->body);
return $this;
}
public function assertEnvelope(): self
{
Assert::assertIsArray($this->json, 'Expected a JSON response body. Raw body: ' . $this->body);
Assert::assertArrayHasKey('success', $this->json);
Assert::assertArrayHasKey('data', $this->json);
Assert::assertArrayHasKey('meta', $this->json);
Assert::assertArrayHasKey('includes', $this->json);
Assert::assertArrayHasKey('content-type', $this->headers);
Assert::assertStringContainsString('application/json', strtolower($this->headers['content-type']));
return $this;
}
public function assertSuccess(bool $expected = true): self
{
$this->assertEnvelope();
Assert::assertSame($expected, $this->json['success']);
return $this;
}
public function assertMessage(string $expectedMessage): self
{
$this->assertEnvelope();
Assert::assertIsArray($this->json['data']);
Assert::assertSame($expectedMessage, $this->json['data']['message'] ?? null, $this->body);
return $this;
}
public function assertMessageContains(string $expectedFragment): self
{
$this->assertEnvelope();
Assert::assertIsArray($this->json['data']);
Assert::assertIsString($this->json['data']['message'] ?? null, $this->body);
Assert::assertStringContainsString($expectedFragment, $this->json['data']['message'], $this->body);
return $this;
}
/**
* @param array<int, string> $expectedPermissions
*/
public function assertMissingPermissions(array $expectedPermissions): self
{
$this->assertEnvelope();
Assert::assertIsArray($this->json['data']);
Assert::assertSame('Missing permission(s)', $this->json['data']['message'] ?? null, $this->body);
$actual = $this->json['data']['permissions'] ?? null;
Assert::assertIsArray($actual);
$expected = $expectedPermissions;
sort($expected);
sort($actual);
Assert::assertSame($expected, $actual, $this->body);
return $this;
}
public function data(): mixed
{
return $this->json['data'] ?? null;
}
public function meta(): array
{
$meta = $this->json['meta'] ?? [];
return is_array($meta) ? $meta : [];
}
}