Skip to content

Commit e1dd934

Browse files
committed
tests
1 parent f8438c1 commit e1dd934

File tree

8 files changed

+409
-12
lines changed

8 files changed

+409
-12
lines changed

tests/Renderer/HeaderRendererTest.php

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
use PHPUnit\Framework\TestCase;
99
use RuntimeException;
1010
use Yiisoft\ErrorHandler\Renderer\HeaderRenderer;
11+
use Yiisoft\ErrorHandler\Tests\Support\TestHelper;
12+
13+
use function PHPUnit\Framework\assertSame;
1114

1215
final class HeaderRendererTest extends TestCase
1316
{
@@ -16,13 +19,8 @@ public function testRender(): void
1619
$renderer = new HeaderRenderer();
1720
$data = $renderer->render(new RuntimeException());
1821
$response = $data->addToResponse(new Response());
19-
$response
20-
->getBody()
21-
->rewind();
2222

23-
$this->assertEmpty($response
24-
->getBody()
25-
->getContents());
23+
$this->assertEmpty(TestHelper::getResponseContent($response));
2624
$this->assertSame([HeaderRenderer::DEFAULT_ERROR_MESSAGE], $response->getHeader('X-Error-Message'));
2725
}
2826

@@ -32,17 +30,23 @@ public function testRenderVerbose(): void
3230
$throwable = new RuntimeException();
3331
$data = $renderer->renderVerbose($throwable);
3432
$response = $data->addToResponse(new Response());
35-
$response
36-
->getBody()
37-
->rewind();
3833

39-
$this->assertEmpty($response
40-
->getBody()
41-
->getContents());
34+
$this->assertEmpty(TestHelper::getResponseContent($response));
4235
$this->assertSame([RuntimeException::class], $response->getHeader('X-Error-Type'));
4336
$this->assertSame([$throwable->getMessage()], $response->getHeader('X-Error-Message'));
4437
$this->assertSame([(string) $throwable->getCode()], $response->getHeader('X-Error-Code'));
4538
$this->assertSame([$throwable->getFile()], $response->getHeader('X-Error-File'));
4639
$this->assertSame([(string) $throwable->getLine()], $response->getHeader('X-Error-Line'));
4740
}
41+
42+
public function testContentType(): void
43+
{
44+
$renderer = new HeaderRenderer('text/plain');
45+
46+
$response = $renderer
47+
->render(new RuntimeException())
48+
->addToResponse(new Response());
49+
50+
assertSame('text/plain', $response->getHeaderLine('Content-Type'));
51+
}
4852
}

tests/Renderer/PlainTextRendererTest.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,13 @@
44

55
namespace Yiisoft\ErrorHandler\Tests\Renderer;
66

7+
use HttpSoft\Message\Response;
78
use PHPUnit\Framework\TestCase;
89
use RuntimeException;
910
use Yiisoft\ErrorHandler\Renderer\PlainTextRenderer;
1011

12+
use function PHPUnit\Framework\assertSame;
13+
1114
final class PlainTextRendererTest extends TestCase
1215
{
1316
public function testRender(): void
@@ -42,4 +45,15 @@ public function testRenderVerbose(): void
4245
$this->assertSame($expectedContent, (string) $data);
4346
$this->assertSame($expectedContent, PlainTextRenderer::throwableToString($throwable));
4447
}
48+
49+
public function testContentType(): void
50+
{
51+
$renderer = new PlainTextRenderer('text/html');
52+
53+
$response = $renderer
54+
->render(new RuntimeException())
55+
->addToResponse(new Response());
56+
57+
assertSame('text/html', $response->getHeaderLine('Content-Type'));
58+
}
4559
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Yiisoft\ErrorHandler\Tests\RendererProvider;
6+
7+
use PHPUnit\Framework\TestCase;
8+
use Psr\Http\Message\ServerRequestInterface;
9+
use Yiisoft\ErrorHandler\Renderer\PlainTextRenderer;
10+
use Yiisoft\ErrorHandler\Renderer\XmlRenderer;
11+
use Yiisoft\ErrorHandler\RendererProvider\ClosureRendererProvider;
12+
use Yiisoft\ErrorHandler\Tests\Support\TestHelper;
13+
use Yiisoft\Test\Support\Container\SimpleContainer;
14+
15+
use function PHPUnit\Framework\assertInstanceOf;
16+
use function PHPUnit\Framework\assertNull;
17+
use function PHPUnit\Framework\assertSame;
18+
19+
final class ClosureRendererProviderTest extends TestCase
20+
{
21+
public function testBase(): void
22+
{
23+
$closureRequest = null;
24+
25+
$provider = new ClosureRendererProvider(
26+
static function (ServerRequestInterface $request) use (&$closureRequest): string {
27+
$closureRequest = $request;
28+
return PlainTextRenderer::class;
29+
},
30+
new SimpleContainer([
31+
PlainTextRenderer::class => new PlainTextRenderer()
32+
]),
33+
);
34+
35+
$request = TestHelper::createRequest();
36+
$renderer = $provider->get($request);
37+
38+
assertSame($request, $closureRequest);
39+
assertInstanceOf(PlainTextRenderer::class, $renderer);
40+
}
41+
42+
public function testRenderer(): void
43+
{
44+
$closureRenderer = new XmlRenderer();
45+
$provider = new ClosureRendererProvider(
46+
static fn() => $closureRenderer,
47+
new SimpleContainer(),
48+
);
49+
50+
$renderer = $provider->get(
51+
TestHelper::createRequest(),
52+
);
53+
54+
assertSame($closureRenderer, $renderer);
55+
}
56+
57+
public function testNull(): void
58+
{
59+
$provider = new ClosureRendererProvider(
60+
static fn() => null,
61+
new SimpleContainer(),
62+
);
63+
64+
$renderer = $provider->get(
65+
TestHelper::createRequest(),
66+
);
67+
68+
assertNull($renderer);
69+
}
70+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Yiisoft\ErrorHandler\Tests\RendererProvider;
6+
7+
use PHPUnit\Framework\TestCase;
8+
use Yiisoft\ErrorHandler\Renderer\HeaderRenderer;
9+
use Yiisoft\ErrorHandler\RendererProvider\ClosureRendererProvider;
10+
use Yiisoft\ErrorHandler\RendererProvider\CompositeRendererProvider;
11+
use Yiisoft\ErrorHandler\RendererProvider\ContentTypeRendererProvider;
12+
use Yiisoft\ErrorHandler\RendererProvider\HeadRendererProvider;
13+
use Yiisoft\ErrorHandler\Tests\Support\TestHelper;
14+
use Yiisoft\Test\Support\Container\SimpleContainer;
15+
16+
use function PHPUnit\Framework\assertInstanceOf;
17+
use function PHPUnit\Framework\assertNull;
18+
19+
final class CompositeRendererProviderTest extends TestCase
20+
{
21+
public function testBase(): void
22+
{
23+
$provider = new CompositeRendererProvider(
24+
new ContentTypeRendererProvider(new SimpleContainer()),
25+
new HeadRendererProvider(),
26+
);
27+
28+
$renderer = $provider->get(
29+
TestHelper::createRequest('HEAD'),
30+
);
31+
32+
assertInstanceOf(HeaderRenderer::class, $renderer);
33+
}
34+
35+
public function testNotFound(): void
36+
{
37+
$provider = new CompositeRendererProvider(
38+
new ContentTypeRendererProvider(new SimpleContainer()),
39+
new ClosureRendererProvider(
40+
static fn() => null,
41+
new SimpleContainer(),
42+
),
43+
);
44+
45+
$renderer = $provider->get(
46+
TestHelper::createRequest('HEAD'),
47+
);
48+
49+
assertNull($renderer);
50+
}
51+
}
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Yiisoft\ErrorHandler\Tests\RendererProvider;
6+
7+
use PHPUnit\Framework\Attributes\DataProvider;
8+
use PHPUnit\Framework\TestCase;
9+
use Yiisoft\ErrorHandler\Renderer\HtmlRenderer;
10+
use Yiisoft\ErrorHandler\Renderer\JsonRenderer;
11+
use Yiisoft\ErrorHandler\Renderer\PlainTextRenderer;
12+
use Yiisoft\ErrorHandler\Renderer\XmlRenderer;
13+
use Yiisoft\ErrorHandler\RendererProvider\ContentTypeRendererProvider;
14+
use Yiisoft\ErrorHandler\Tests\Support\TestHelper;
15+
use Yiisoft\Test\Support\Container\SimpleContainer;
16+
17+
use function PHPUnit\Framework\assertInstanceOf;
18+
use function PHPUnit\Framework\assertNull;
19+
20+
final class ContentTypeRendererProviderTest extends TestCase
21+
{
22+
public static function dataBase(): iterable
23+
{
24+
yield [JsonRenderer::class, 'application/json'];
25+
yield [XmlRenderer::class, 'application/xml'];
26+
yield [XmlRenderer::class, 'text/xml'];
27+
yield [PlainTextRenderer::class, 'text/plain'];
28+
yield [HtmlRenderer::class, 'text/html'];
29+
yield [HtmlRenderer::class, '*/*'];
30+
}
31+
32+
#[DataProvider('dataBase')]
33+
public function testBase(string $expectedRendererClass, string $accept): void
34+
{
35+
$provider = new ContentTypeRendererProvider(
36+
new SimpleContainer([
37+
JsonRenderer::class => new JsonRenderer(),
38+
XmlRenderer::class => new XmlRenderer(),
39+
PlainTextRenderer::class => new PlainTextRenderer(),
40+
HtmlRenderer::class => new HtmlRenderer(),
41+
]),
42+
);
43+
44+
$renderer = $provider->get(
45+
TestHelper::createRequest(headers: ['Accept' => $accept]),
46+
);
47+
48+
assertInstanceOf($expectedRendererClass, $renderer);
49+
}
50+
51+
public function testCustomRenderer(): void
52+
{
53+
$provider = new ContentTypeRendererProvider(
54+
new SimpleContainer([
55+
PlainTextRenderer::class => new PlainTextRenderer(),
56+
]),
57+
['text/new' => PlainTextRenderer::class],
58+
);
59+
60+
$renderer = $provider->get(
61+
TestHelper::createRequest(headers: ['Accept' => 'text/new']),
62+
);
63+
64+
assertInstanceOf(PlainTextRenderer::class, $renderer);
65+
}
66+
67+
public function testInvalidAccept(): void
68+
{
69+
$provider = new ContentTypeRendererProvider(
70+
new SimpleContainer(),
71+
);
72+
73+
$renderer = $provider->get(
74+
TestHelper::createRequest(headers: ['Accept' => 'text/html;q=x']),
75+
);
76+
77+
assertNull($renderer);
78+
}
79+
80+
public function testNonExistRenderer(): void
81+
{
82+
$provider = new ContentTypeRendererProvider(
83+
new SimpleContainer(),
84+
);
85+
86+
$renderer = $provider->get(
87+
TestHelper::createRequest(headers: ['Accept' => 'text/unknown']),
88+
);
89+
90+
assertNull($renderer);
91+
}
92+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Yiisoft\ErrorHandler\Tests\RendererProvider;
6+
7+
use HttpSoft\Message\Response;
8+
use PHPUnit\Framework\Attributes\DataProvider;
9+
use PHPUnit\Framework\Attributes\TestWith;
10+
use PHPUnit\Framework\TestCase;
11+
use RuntimeException;
12+
use Yiisoft\ErrorHandler\Renderer\HeaderRenderer;
13+
use Yiisoft\ErrorHandler\RendererProvider\HeadRendererProvider;
14+
use Yiisoft\ErrorHandler\Tests\Support\TestHelper;
15+
16+
use function PHPUnit\Framework\assertInstanceOf;
17+
use function PHPUnit\Framework\assertNull;
18+
use function PHPUnit\Framework\assertSame;
19+
20+
final class HeadRendererProviderTest extends TestCase
21+
{
22+
#[TestWith(['GET'])]
23+
#[TestWith(['POST'])]
24+
#[TestWith(['DELETE'])]
25+
#[TestWith(['PATCH'])]
26+
public function testNotHeadRequest(string $requestMethod): void
27+
{
28+
$provider = new HeadRendererProvider();
29+
30+
$renderer = $provider->get(
31+
TestHelper::createRequest($requestMethod),
32+
);
33+
34+
assertNull($renderer);
35+
}
36+
37+
public static function dataHeadRequest(): iterable
38+
{
39+
yield ['', []];
40+
yield ['text/html', ['Accept' => ['text/html']]];
41+
yield ['text/html', ['Accept' => ['text/html;q=0.5']]];
42+
yield ['', ['Accept' => ['text/html;q=x']]];
43+
}
44+
45+
#[DataProvider('dataHeadRequest')]
46+
public function testHeadRequest(string $expectedContentType, array $headers): void
47+
{
48+
$provider = new HeadRendererProvider();
49+
50+
$renderer = $provider->get(
51+
TestHelper::createRequest('HEAD', headers: $headers),
52+
);
53+
54+
assertInstanceOf(HeaderRenderer::class, $renderer);
55+
56+
$response = $renderer
57+
->render(new RuntimeException())
58+
->addToResponse(new Response());
59+
60+
assertSame($expectedContentType, $response->getHeaderLine('Content-Type'));
61+
}
62+
}

tests/Support/TestHelper.php

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Yiisoft\ErrorHandler\Tests\Support;
6+
7+
use HttpSoft\Message\ServerRequest;
8+
use HttpSoft\Message\ServerRequestFactory;
9+
use Psr\Http\Message\ResponseInterface;
10+
use Psr\Http\Message\UriInterface;
11+
12+
final class TestHelper
13+
{
14+
public static function createRequest(
15+
string $method = 'GET',
16+
string|UriInterface $uri = 'https://example.com',
17+
array $serverParams = [],
18+
array $headers = [],
19+
): ServerRequest {
20+
$request = (new ServerRequestFactory())->createServerRequest($method, $uri, $serverParams);
21+
foreach ($headers as $name => $value) {
22+
$request = $request->withAddedHeader($name, $value);
23+
}
24+
return $request;
25+
}
26+
27+
public static function getResponseContent(ResponseInterface $response): string
28+
{
29+
$body = $response->getBody();
30+
$body->rewind();
31+
return $body->getContents();
32+
}
33+
}

0 commit comments

Comments
 (0)