ContentBasedErrorHandlerTest::setUp()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 0
dl 0
loc 13
rs 9.8333
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace AcelayaTest\ExpressiveErrorHandler\ErrorHandler;
6
7
use Acelaya\ExpressiveErrorHandler\ErrorHandler\ContentBasedErrorResponseGenerator;
8
use Acelaya\ExpressiveErrorHandler\ErrorHandler\ErrorResponseGeneratorManager;
9
use Acelaya\ExpressiveErrorHandler\Exception\InvalidArgumentException;
10
use Acelaya\ExpressiveErrorHandler\Log\BasicLogMessageBuilder;
11
use PHPUnit\Framework\TestCase;
12
use Psr\Log\NullLogger;
13
use Zend\Diactoros\Response;
14
use Zend\Diactoros\ServerRequestFactory;
15
use Zend\ServiceManager\ServiceManager;
16
17
class ContentBasedErrorHandlerTest extends TestCase
18
{
19
    /** @var ContentBasedErrorResponseGenerator */
20
    protected $errorHandler;
21
22
    public function setUp(): void
23
    {
24
        $this->errorHandler = new ContentBasedErrorResponseGenerator(
25
            new ErrorResponseGeneratorManager(new ServiceManager(), [
26
                'factories' => [
27
                    'text/html' => [$this, 'factory'],
28
                    'application/json' => [$this, 'factory'],
29
                ],
30
            ]),
31
            new NullLogger(),
32
            new BasicLogMessageBuilder()
33
        );
34
    }
35
36
    public function factory($container, $name): callable
37
    {
38
        return function () use ($name) {
39
            return (new Response())->withHeader('Content-type', $name);
40
        };
41
    }
42
43
    /**
44
     * @test
45
     */
46
    public function correctAcceptHeaderValueInvokesErrorHandler(): void
47
    {
48
        $request = ServerRequestFactory::fromGlobals()->withHeader('Accept', 'foo/bar,application/json');
49
        $result = $this->errorHandler->__invoke(null, $request, new Response());
50
        $this->assertEquals('application/json', $result->getHeaderLine('Content-type'));
51
    }
52
53
    /**
54
     * @test
55
     */
56
    public function defaultContentTypeIsUsedWhenNoAcceptHeaderIsPresent(): void
57
    {
58
        $request = ServerRequestFactory::fromGlobals();
59
        $result = $this->errorHandler->__invoke(null, $request, new Response());
60
        $this->assertEquals('text/html', $result->getHeaderLine('Content-type'));
61
    }
62
63
    /**
64
     * @test
65
     */
66
    public function defaultContentTypeIsUsedWhenAcceptedContentIsNotSupported(): void
67
    {
68
        $request = ServerRequestFactory::fromGlobals()->withHeader('Accept', 'foo/bar,text/xml');
69
        $result = $this->errorHandler->__invoke(null, $request, new Response());
70
        $this->assertEquals('text/html', $result->getHeaderLine('Content-type'));
71
    }
72
73
    /**
74
     * @test
75
     */
76
    public function ifNoErrorHandlerIsFoundAnExceptionIsThrown(): void
77
    {
78
        $this->errorHandler = new ContentBasedErrorResponseGenerator(
79
            new ErrorResponseGeneratorManager(new ServiceManager(), []),
80
            new NullLogger(),
81
            new BasicLogMessageBuilder()
82
        );
83
        $request = ServerRequestFactory::fromGlobals()->withHeader('Accept', 'foo/bar,text/xml');
84
85
        $this->expectException(InvalidArgumentException::class);
86
        $this->errorHandler->__invoke(null, $request, new Response());
87
    }
88
89
    /**
90
     * @test
91
     */
92
    public function providedDefaultContentTypeIsUsed(): void
93
    {
94
        $this->errorHandler = new ContentBasedErrorResponseGenerator(
95
            new ErrorResponseGeneratorManager(new ServiceManager(), [
96
                'factories' => [
97
                    'text/html' => [$this, 'factory'],
98
                    'application/json' => [$this, 'factory'],
99
                ],
100
            ]),
101
            new NullLogger(),
102
            new BasicLogMessageBuilder(),
103
            'application/json'
104
        );
105
        $request = ServerRequestFactory::fromGlobals()->withHeader('Accept', 'foo/bar,text/xml');
106
        $result = $this->errorHandler->__invoke(null, $request, new Response());
107
        $this->assertEquals('application/json', $result->getHeaderLine('Content-type'));
108
    }
109
}
110