Files
intotheeast-com-content/plugins/api/tests/Unit/Middleware/JsonBodyParserMiddlewareTest.php
T

100 lines
2.9 KiB
PHP

<?php
declare(strict_types=1);
namespace Grav\Plugin\Api\Tests\Unit\Middleware;
use Grav\Plugin\Api\Exceptions\ValidationException;
use Grav\Plugin\Api\Middleware\JsonBodyParserMiddleware;
use Grav\Plugin\Api\Tests\Unit\TestHelper;
use PHPUnit\Framework\Attributes\CoversClass;
use PHPUnit\Framework\Attributes\Test;
use PHPUnit\Framework\TestCase;
use Psr\Http\Message\ServerRequestInterface;
#[CoversClass(JsonBodyParserMiddleware::class)]
class JsonBodyParserMiddlewareTest extends TestCase
{
private JsonBodyParserMiddleware $middleware;
protected function setUp(): void
{
$this->middleware = new JsonBodyParserMiddleware();
}
#[Test]
public function parses_json_body(): void
{
$payload = ['title' => 'Hello', 'published' => true];
$request = TestHelper::createMockRequest(
method: 'POST',
headers: ['Content-Type' => 'application/json'],
body: json_encode($payload),
);
$result = $this->middleware->processRequest($request);
self::assertInstanceOf(ServerRequestInterface::class, $result);
self::assertSame($payload, $result->getAttribute('json_body'));
}
#[Test]
public function ignores_non_json_content_type(): void
{
$request = TestHelper::createMockRequest(
method: 'POST',
headers: ['Content-Type' => 'application/x-www-form-urlencoded'],
body: 'foo=bar',
);
$result = $this->middleware->processRequest($request);
// The request should be returned as-is (no json_body attribute set)
self::assertNull($result->getAttribute('json_body'));
}
#[Test]
public function empty_body_returns_empty_array(): void
{
$request = TestHelper::createMockRequest(
method: 'POST',
headers: ['Content-Type' => 'application/json'],
body: '',
);
$result = $this->middleware->processRequest($request);
self::assertSame([], $result->getAttribute('json_body'));
}
#[Test]
public function invalid_json_throws_validation_exception(): void
{
$request = TestHelper::createMockRequest(
method: 'POST',
headers: ['Content-Type' => 'application/json'],
body: '{invalid json!!!',
);
$this->expectException(ValidationException::class);
$this->expectExceptionMessageMatches('/Invalid JSON/');
$this->middleware->processRequest($request);
}
#[Test]
public function parses_json_with_charset_in_content_type(): void
{
$payload = ['key' => 'value'];
$request = TestHelper::createMockRequest(
method: 'PUT',
headers: ['Content-Type' => 'application/json; charset=utf-8'],
body: json_encode($payload),
);
$result = $this->middleware->processRequest($request);
self::assertSame($payload, $result->getAttribute('json_body'));
}
}