ResponseListenerTest::createRequest()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 4
c 1
b 0
f 0
nc 1
nop 1
dl 0
loc 8
rs 10
1
<?php
2
declare(strict_types=1);
3
4
namespace FH\Bundle\UserAgentBundle\Tests\EventListener;
5
6
use FH\Bundle\UserAgentBundle\Entity\Embedded\Action;
7
use FH\Bundle\UserAgentBundle\Entity\UserAgent;
8
use FH\Bundle\UserAgentBundle\EventListener\ResponseListener;
9
use FH\Bundle\UserAgentBundle\Repository\UserAgentRepository;
10
use FH\Bundle\UserAgentBundle\Repository\UserAgentRepositoryInterface;
11
use FH\Bundle\UserAgentBundle\Request\Request as UserAgentRequest;
12
use FH\Bundle\UserAgentBundle\Response\Response as UserAgentResponse;
13
use PHPUnit\Framework\Assert;
14
use PHPUnit\Framework\MockObject\MockObject;
15
use PHPUnit\Framework\TestCase;
16
use Symfony\Component\EventDispatcher\EventDispatcher;
17
use Symfony\Component\HttpFoundation\Request;
18
use Symfony\Component\HttpFoundation\Response;
19
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
20
use Symfony\Component\HttpKernel\HttpKernelInterface;
21
use Symfony\Component\HttpKernel\KernelEvents;
22
23
use function is_string;
24
25
/**
26
 * @author Evert Harmeling <[email protected]>
27
 */
28
final class ResponseListenerTest extends TestCase
29
{
30
    private const HOST = 'api.host.tld';
31
32
    private $dispatcher;
33
    private $kernel;
34
35
    protected function setUp(): void
36
    {
37
        $this->dispatcher = new EventDispatcher();
38
        $this->kernel = $this->getMockBuilder(HttpKernelInterface::class)->getMock();
39
    }
40
41
    public function testFilterDoesNothingWhenUserAgentIsUnknown(): void
42
    {
43
        $event = $this->createEvent();
44
        $listener = $this->createListener();
45
        
46
        $this->addListenerAndDispatch($listener, $event);
47
        
48
        Assert::assertFalse($event->getResponse()->headers->has(UserAgentResponse::HEADER_USER_AGENT_STATUS));
49
    }
50
51
    public function testFilterUserAgentKnownActionPermit(): void
52
    {
53
        $versionPermit = 'v2.0.0';
54
        
55
        $event = $this->createEvent($this->createRequest($versionPermit));
56
        $listener = $this->createListener($versionPermit, Action::ACTION_PERMIT);
57
        
58
        $this->addListenerAndDispatch($listener, $event);
59
        
60
        Assert::assertTrue($event->getResponse()->headers->has(UserAgentResponse::HEADER_USER_AGENT_STATUS));
61
        Assert::assertEquals(Action::ACTION_PERMIT, $event->getResponse()->headers->get(UserAgentResponse::HEADER_USER_AGENT_STATUS));
62
    }
63
64
    public function testFilterUserAgentKnownActionUpgrade(): void
65
    {
66
        $versionUpgrade = 'v1.0.0';
67
68
        $event = $this->createEvent($this->createRequest($versionUpgrade));
69
        $listener = $this->createListener($versionUpgrade, Action::ACTION_UPGRADE);
70
71
        $this->addListenerAndDispatch($listener, $event);
72
73
        Assert::assertTrue($event->getResponse()->headers->has(UserAgentResponse::HEADER_USER_AGENT_STATUS));
74
        Assert::assertEquals(Action::ACTION_UPGRADE, $event->getResponse()->headers->get(UserAgentResponse::HEADER_USER_AGENT_STATUS));
75
    }
76
77
    /**
78
     * @return MockObject|UserAgentRepositoryInterface
79
     */
80
    private function mockUserAgentRepository(string $version = null, string $actionValue = null): MockObject
81
    {
82
        $userAgentRepository = $this->createMock(UserAgentRepository::class);
83
84
        if (is_string($version)) {
85
            $userAgent = $this->createMock(UserAgent::class);
86
            $action = $this->createMock(Action::class);
87
88
            $this->stubMethod($action, 'getValue', $actionValue);
89
            $this->stubMethod($userAgent, 'getAction', $action);
90
            $this->stubMethod($userAgent, 'getVersion', $version);
91
        } else {
92
            $userAgent = null;
93
        }
94
95
        $this->stubMethod($userAgentRepository, 'find', $userAgent);
96
97
        return $userAgentRepository;
98
    }
99
100
    private function createEvent(Request $request = null): FilterResponseEvent
101
    {
102
        $request = $request ?: new Request();
103
104
        return new FilterResponseEvent($this->kernel, $request, HttpKernelInterface::MASTER_REQUEST, new Response('foo'));
0 ignored issues
show
Deprecated Code introduced by
The class Symfony\Component\HttpKe...ent\FilterResponseEvent has been deprecated: since Symfony 4.3, use ResponseEvent instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

104
        return /** @scrutinizer ignore-deprecated */ new FilterResponseEvent($this->kernel, $request, HttpKernelInterface::MASTER_REQUEST, new Response('foo'));
Loading history...
105
    }
106
107
    private function createListener(string $version = null, string $actionValue = null): ResponseListener
108
    {
109
        $userAgentRepository = $this->mockUserAgentRepository($version, $actionValue);
110
111
        return new ResponseListener(
112
            $userAgentRepository,
113
[
114
                ResponseListener::CRITERIA_HOST => self::HOST
115
            ]
116
        );
117
    }
118
119
    private function createRequest(string $version): Request
120
    {
121
        $requestHeaders = [
122
            'HTTP_HOST' => self::HOST,
123
            'HTTP_' . UserAgentRequest::HEADER_USER_AGENT => $version
124
        ];
125
126
        return new Request([], [], [], [], [], $requestHeaders);
127
    }
128
129
    private function addListenerAndDispatch(ResponseListener $listener, FilterResponseEvent $event): FilterResponseEvent
130
    {
131
        $this->dispatcher->addListener(KernelEvents::RESPONSE, [$listener, '__invoke']);
132
        $this->dispatcher->dispatch(KernelEvents::RESPONSE, $event);
133
        
134
        return $event;
135
    }
136
137
    private function stubMethod(\PHPUnit_Framework_MockObject_MockObject $object, string $method, $willReturn): void
138
    {
139
        $object
140
            ->method($method)
141
            ->willReturn($willReturn);
142
    }
143
144
    protected function tearDown(): void
145
    {
146
        $this->dispatcher = null;
147
        $this->kernel = null;
148
    }
149
}
150