diff --git a/CHANGELOG.md b/CHANGELOG.md index 00d5229..3fa36f5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ - Enh #85: Raise minimum PHP version to 8.1 and refactor code (@vjik) - Enh #80: Add support for `psr/http-message` version `^2.0` (@vjik) - Bug #85: Explicitly add transitive dependencies `psr/http-factory` and `psr/http-server-handler` (@vjik) +- New #88: Add `PlainTextDataResponseFormatter` formatter and `FormatDataResponseAsPlainText` middleware (@vjik) ## 2.0.0 February 15, 2023 diff --git a/README.md b/README.md index 4e02763..b624202 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ response. The package could be installed via composer: ```shell -composer require yiisoft/data-response --prefer-dist +composer require yiisoft/data-response ``` ## General usage @@ -85,6 +85,7 @@ The following formatters are available: - `HtmlDataResponseFormatter` - `JsonDataResponseFormatter` - `XmlDataResponseFormatter` +- `PlainTextDataResponseFormatter` ### Middleware diff --git a/src/Formatter/PlainTextDataResponseFormatter.php b/src/Formatter/PlainTextDataResponseFormatter.php new file mode 100644 index 0000000..393ac92 --- /dev/null +++ b/src/Formatter/PlainTextDataResponseFormatter.php @@ -0,0 +1,47 @@ +getData(); + + if (!is_scalar($data) && $data !== null && !$data instanceof Stringable) { + throw new LogicException(sprintf( + 'Data must be either a scalar value, null, or a stringable object. %s given.', + get_debug_type($data), + )); + } + + return $this->addToResponse($dataResponse->getResponse(), empty($data) ? null : (string) $data); + } +} diff --git a/src/Middleware/FormatDataResponseAsPlainText.php b/src/Middleware/FormatDataResponseAsPlainText.php new file mode 100644 index 0000000..576d508 --- /dev/null +++ b/src/Middleware/FormatDataResponseAsPlainText.php @@ -0,0 +1,19 @@ +createDataResponse('test'); + $result = (new PlainTextDataResponseFormatter())->format($dataResponse); + $result->getBody()->rewind(); + + $this->assertSame( + 'test', + $result->getBody()->getContents(), + ); + $this->assertSame(['text/plain; charset=UTF-8'], $result->getHeader('Content-Type')); + } + + public function testWithEncoding(): void + { + $dataResponse = $this->createDataResponse('test'); + $result = (new PlainTextDataResponseFormatter()) + ->withEncoding('ISO-8859-1') + ->format($dataResponse); + $result->getBody()->rewind(); + + $this->assertSame( + 'test', + $result->getBody()->getContents(), + ); + $this->assertSame(['text/plain; charset=ISO-8859-1'], $result->getHeader('Content-Type')); + } + + public function testWithContentType(): void + { + $dataResponse = $this->createDataResponse('test'); + $result = (new PlainTextDataResponseFormatter()) + ->withContentType('text/html') + ->format($dataResponse); + $result->getBody()->rewind(); + + $this->assertSame( + 'test', + $result->getBody()->getContents(), + ); + $this->assertSame('text/html; charset=UTF-8', $result->getHeaderLine('Content-Type')); + } + + public function testWithIncorrectType(): void + { + $dataResponse = $this->createDataResponse(['test']); + $formatter = new PlainTextDataResponseFormatter(); + + $this->expectException(LogicException::class); + $this->expectExceptionMessage('Data must be either a scalar value, null, or a stringable object. array given.'); + $formatter->format($dataResponse); + } + + public function testDataWithNull(): void + { + $dataResponse = $this->createDataResponse(null); + $result = (new PlainTextDataResponseFormatter())->format($dataResponse); + $result->getBody()->rewind(); + + $this->assertSame( + '', + $result->getBody()->getContents(), + ); + $this->assertSame(['text/plain; charset=UTF-8'], $result->getHeader('Content-Type')); + } + + public function testDataWithStringableObject(): void + { + $data = new class () { + public function __toString(): string + { + return 'test'; + } + }; + + $dataResponse = $this->createDataResponse($data); + $result = (new PlainTextDataResponseFormatter())->format($dataResponse); + $result->getBody()->rewind(); + + $this->assertSame( + 'test', + $result->getBody()->getContents(), + ); + $this->assertSame(['text/plain; charset=UTF-8'], $result->getHeader('Content-Type')); + } + + public function testImmutability(): void + { + $formatter = new PlainTextDataResponseFormatter(); + $this->assertNotSame($formatter, $formatter->withContentType('text/html')); + $this->assertNotSame($formatter, $formatter->withEncoding('utf-8')); + } +} diff --git a/tests/Middleware/FormatDataResponseAsPlainTextTest.php b/tests/Middleware/FormatDataResponseAsPlainTextTest.php new file mode 100644 index 0000000..1c397fb --- /dev/null +++ b/tests/Middleware/FormatDataResponseAsPlainTextTest.php @@ -0,0 +1,28 @@ +createDataResponse('test'); + + $response = $middleware->process( + $this->createRequest(), + $this->createRequestHandler($dataResponse) + ); + + $response->getBody()->rewind(); + + $this->assertSame('test', $response->getBody()->getContents()); + $this->assertSame(['text/plain; charset=UTF-8'], $response->getHeader('Content-Type')); + } +}