php$0 ➔ testDefaultLanguageExecution()   A
last analyzed

Complexity

Conditions 1

Size

Total Lines 30

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
c 0
b 0
f 0
dl 0
loc 30
rs 9.44
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Lochmueller\LanguageDetection\Tests\Unit\Handler;
6
7
use Lochmueller\LanguageDetection\Check\BotAgentCheck;
8
use Lochmueller\LanguageDetection\Detect\BrowserLanguageDetect;
9
use Lochmueller\LanguageDetection\Detect\MaxMindDetect;
10
use Lochmueller\LanguageDetection\Domain\Model\Dto\LocaleValueObject;
11
use Lochmueller\LanguageDetection\Event\BuildResponseEvent;
12
use Lochmueller\LanguageDetection\Event\CheckLanguageDetectionEvent;
13
use Lochmueller\LanguageDetection\Event\DetectUserLanguagesEvent;
14
use Lochmueller\LanguageDetection\Event\NegotiateSiteLanguageEvent;
15
use Lochmueller\LanguageDetection\Handler\Exception\DisableLanguageDetectionException;
0 ignored issues
show
Bug introduced by
The type Lochmueller\LanguageDete...guageDetectionException was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
16
use Lochmueller\LanguageDetection\Handler\Exception\NoUserLanguagesException;
0 ignored issues
show
Bug introduced by
The type Lochmueller\LanguageDete...oUserLanguagesException was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
17
use Lochmueller\LanguageDetection\Handler\JsonDetectionHandler;
0 ignored issues
show
Bug introduced by
The type Lochmueller\LanguageDete...er\JsonDetectionHandler was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
18
use Lochmueller\LanguageDetection\Negotiation\DefaultNegotiation;
19
use Lochmueller\LanguageDetection\Response\DefaultResponse;
20
use Lochmueller\LanguageDetection\Service\LanguageService;
21
use Lochmueller\LanguageDetection\Service\LocaleCollectionSortService;
22
use Lochmueller\LanguageDetection\Service\Normalizer;
23
use Lochmueller\LanguageDetection\Service\SiteConfigurationService;
24
use Psr\Http\Message\ResponseInterface;
25
use Symfony\Component\DependencyInjection\Container;
26
use TYPO3\CMS\Core\EventDispatcher\EventDispatcher;
27
use TYPO3\CMS\Core\EventDispatcher\ListenerProvider;
28
use TYPO3\CMS\Core\Http\ServerRequest;
29
use TYPO3\CMS\Core\Site\Entity\Site;
30
31
/**
32
 * @internal
33
 *
34
 * @coversNothing
35
 */
36
class JsonDetectionHandlerTest extends AbstractHandlerTest
37
{
38
    /**
39
     * @covers \Lochmueller\LanguageDetection\Check\BotAgentCheck
40
     * @covers \Lochmueller\LanguageDetection\Detect\BrowserLanguageDetect
41
     * @covers \Lochmueller\LanguageDetection\Event\CheckLanguageDetectionEvent
42
     * @covers \Lochmueller\LanguageDetection\Event\DetectUserLanguagesEvent
43
     * @covers \Lochmueller\LanguageDetection\Handler\AbstractHandler
44
     * @covers \Lochmueller\LanguageDetection\Handler\Exception\DisableLanguageDetectionException
45
     * @covers \Lochmueller\LanguageDetection\Handler\JsonDetectionHandler
46
     * @covers \Lochmueller\LanguageDetection\Negotiation\DefaultNegotiation
47
     * @covers \Lochmueller\LanguageDetection\Response\DefaultResponse
48
     */
49
    public function testInvalidPath(): void
50
    {
51
        $this->expectException(DisableLanguageDetectionException::class);
52
53
        $serverRequest = new ServerRequest('https://www.dummy.de/', null, 'php://input', ['accept-language' => 'de,de_DE']);
54
        $handler = new JsonDetectionHandler($this->getSmallEventListenerStack());
55
        $handler->handle($serverRequest);
56
    }
57
    /**
58
     * @covers \Lochmueller\LanguageDetection\Check\BotAgentCheck
59
     * @covers \Lochmueller\LanguageDetection\Detect\BrowserLanguageDetect
60
     * @covers \Lochmueller\LanguageDetection\Event\CheckLanguageDetectionEvent
61
     * @covers \Lochmueller\LanguageDetection\Event\DetectUserLanguagesEvent
62
     * @covers \Lochmueller\LanguageDetection\Handler\AbstractHandler
63
     * @covers \Lochmueller\LanguageDetection\Handler\Exception\DisableLanguageDetectionException
64
     * @covers \Lochmueller\LanguageDetection\Handler\JsonDetectionHandler
65
     * @covers \Lochmueller\LanguageDetection\Negotiation\DefaultNegotiation
66
     * @covers \Lochmueller\LanguageDetection\Response\DefaultResponse
67
     * @see https://github.com/lochmueller/language_detection/issues/34
68
     */
69
    public function testIssue34ResultOfHeaderAndMaxmindUsMatchLanguages(): void
70
    {
71
        $container = new Container();
72
        $container->set(BotAgentCheck::class, new BotAgentCheck());
73
        $container->set(BrowserLanguageDetect::class, new BrowserLanguageDetect());
74
        $container->set('staticMaxMind', new class (new LanguageService(), new SiteConfigurationService(), new LocaleCollectionSortService()) extends MaxMindDetect {
75
            public function __invoke(DetectUserLanguagesEvent $event): void
76
            {
77
                $fakeMaxMindResult = 'us';
78
                $mode = 'before';
79
                $locale = $this->languageService->getLanguageByCountry($fakeMaxMindResult) . '_' . $fakeMaxMindResult;
80
                $event->setUserLanguages($this->localeCollectionSortService->addLocaleByMode($event->getUserLanguages(), new LocaleValueObject($locale), $mode));
81
            }
82
        });
83
84
        $container->set(DefaultNegotiation::class, new DefaultNegotiation(new Normalizer()));
85
        $container->set(DefaultResponse::class, new DefaultResponse(new SiteConfigurationService()));
86
        $provider = new ListenerProvider($container);
87
        $provider->addListener(CheckLanguageDetectionEvent::class, BotAgentCheck::class);
88
        $provider->addListener(DetectUserLanguagesEvent::class, BrowserLanguageDetect::class);
89
        $provider->addListener(DetectUserLanguagesEvent::class, 'staticMaxMind');
90
        $provider->addListener(NegotiateSiteLanguageEvent::class, DefaultNegotiation::class);
91
        $provider->addListener(BuildResponseEvent::class, DefaultResponse::class);
92
93
        $serverRequest = new ServerRequest('https://www.dummy.de/language.json', null, 'php://input', ['accept-language' => 'en-US,en;q=0.9']);
94
        $serverRequest = $serverRequest->withAttribute('site', new Site('dummy', 1, [
95
            'languages' => [
96
                [
97
                    'languageId' => 1,
98
                    'base' => '/de-de/',
99
                    'locale' => 'de_DE',
100
                ],
101
                [
102
                    'languageId' => 2,
103
                    'base' => '/en-us/',
104
                    'locale' => 'en_US',
105
                ],
106
                [
107
                    'languageId' => 3,
108
                    'base' => '/en-gb/',
109
                    'locale' => 'en_GB',
110
                ],
111
                [
112
                    'languageId' => 4,
113
                    'base' => '/fr-fr/',
114
                    'locale' => 'fr_FR',
115
                ],
116
            ],
117
        ]));
118
        $handler = new JsonDetectionHandler(new EventDispatcher($provider));
119
        $result = $handler->handle($serverRequest);
120
121
        $json = \json_decode($result->getBody()->getContents());
122
123
        self::assertEquals('en_US', $json->locale);
124
    }
125
126
    /**
127
     * @covers \Lochmueller\LanguageDetection\Check\BotAgentCheck
128
     * @covers \Lochmueller\LanguageDetection\Detect\BrowserLanguageDetect
129
     * @covers \Lochmueller\LanguageDetection\Domain\Collection\LocaleCollection
130
     * @covers \Lochmueller\LanguageDetection\Event\CheckLanguageDetectionEvent
131
     * @covers \Lochmueller\LanguageDetection\Event\DetectUserLanguagesEvent
132
     * @covers \Lochmueller\LanguageDetection\Handler\AbstractHandler
133
     * @covers \Lochmueller\LanguageDetection\Handler\Exception\NoUserLanguagesException
134
     * @covers \Lochmueller\LanguageDetection\Handler\JsonDetectionHandler
135
     * @covers \Lochmueller\LanguageDetection\Negotiation\DefaultNegotiation
136
     * @covers \Lochmueller\LanguageDetection\Response\DefaultResponse
137
     */
138
    public function testBreakAfterDetectUserLanguagesByMissingLanguages(): void
139
    {
140
        $this->expectException(NoUserLanguagesException::class);
141
142
        $serverRequest = new ServerRequest('https://www.dummy.de/language.json', null, 'php://input', ['accept-language' => '']);
143
        $serverRequest = $serverRequest->withAttribute('site', new Site('dummy', 1, []));
144
145
        $handler = new JsonDetectionHandler($this->getSmallEventListenerStack());
146
        $handler->handle($serverRequest);
147
    }
148
149
    /**
150
     * @covers \Lochmueller\LanguageDetection\Check\BotAgentCheck
151
     * @covers \Lochmueller\LanguageDetection\Detect\BrowserLanguageDetect
152
     * @covers \Lochmueller\LanguageDetection\Domain\Collection\LocaleCollection
153
     * @covers \Lochmueller\LanguageDetection\Domain\Model\Dto\LocaleValueObject
154
     * @covers \Lochmueller\LanguageDetection\Domain\Model\Dto\SiteConfiguration
155
     * @covers \Lochmueller\LanguageDetection\Event\BuildResponseEvent
156
     * @covers \Lochmueller\LanguageDetection\Event\CheckLanguageDetectionEvent
157
     * @covers \Lochmueller\LanguageDetection\Event\DetectUserLanguagesEvent
158
     * @covers \Lochmueller\LanguageDetection\Event\NegotiateSiteLanguageEvent
159
     * @covers \Lochmueller\LanguageDetection\Handler\AbstractHandler
160
     * @covers \Lochmueller\LanguageDetection\Handler\JsonDetectionHandler
161
     * @covers \Lochmueller\LanguageDetection\Negotiation\DefaultNegotiation
162
     * @covers \Lochmueller\LanguageDetection\Response\DefaultResponse
163
     * @covers \Lochmueller\LanguageDetection\Service\Normalizer
164
     * @covers \Lochmueller\LanguageDetection\Service\SiteConfigurationService
165
     */
166
    public function testFullExecution(): void
167
    {
168
        $serverRequest = new ServerRequest('https://www.dummy.de/language.json', null, 'php://input', ['accept-language' => 'fr_FR,de,de_DE']);
169
        $site = new Site('dummy', 1, [
170
            'base' => 'https://www.dummy.de/',
171
            'forwardRedirectParameters' => '',
172
            'languages' => [
173
                [
174
                    'languageId' => 1,
175
                    'base' => '/de/',
176
                    'locale' => 'de_DE',
177
                ],
178
                [
179
                    'languageId' => 2,
180
                    'base' => '/en/',
181
                    'locale' => 'en_GB',
182
                ],
183
                [
184
                    'languageId' => 3,
185
                    'base' => '/fr/',
186
                    'locale' => 'fr_FR',
187
                ],
188
            ],
189
        ]);
190
191
        $serverRequest = $serverRequest->withAttribute('site', $site);
192
193
        $handler = new JsonDetectionHandler($this->getSmallEventListenerStack());
194
        $response = $handler->handle($serverRequest);
195
196
        $content = json_decode($response->getBody()->getContents(), false, 512, \JSON_THROW_ON_ERROR);
197
        self::assertInstanceOf(ResponseInterface::class, $response);
198
        self::assertInstanceOf(\stdClass::class, $content);
199
        /* @var \stdClass $content */
200
        self::assertEquals(3, $content->languageId);
201
    }
202
203
    /**
204
     * @covers \Lochmueller\LanguageDetection\Check\BotAgentCheck
205
     * @covers \Lochmueller\LanguageDetection\Detect\BrowserLanguageDetect
206
     * @covers \Lochmueller\LanguageDetection\Domain\Collection\LocaleCollection
207
     * @covers \Lochmueller\LanguageDetection\Domain\Model\Dto\LocaleValueObject
208
     * @covers \Lochmueller\LanguageDetection\Domain\Model\Dto\SiteConfiguration
209
     * @covers \Lochmueller\LanguageDetection\Event\BuildResponseEvent
210
     * @covers \Lochmueller\LanguageDetection\Event\CheckLanguageDetectionEvent
211
     * @covers \Lochmueller\LanguageDetection\Event\DetectUserLanguagesEvent
212
     * @covers \Lochmueller\LanguageDetection\Event\NegotiateSiteLanguageEvent
213
     * @covers \Lochmueller\LanguageDetection\Handler\AbstractHandler
214
     * @covers \Lochmueller\LanguageDetection\Handler\JsonDetectionHandler
215
     * @covers \Lochmueller\LanguageDetection\Negotiation\DefaultNegotiation
216
     * @covers \Lochmueller\LanguageDetection\Response\DefaultResponse
217
     * @covers \Lochmueller\LanguageDetection\Service\Normalizer
218
     * @covers \Lochmueller\LanguageDetection\Service\SiteConfigurationService
219
     */
220
    public function testDefaultLanguageExecution(): void
221
    {
222
        $serverRequest = new ServerRequest('https://www.dummy.de/language.json', null, 'php://input', ['accept-language' => 'fr']);
223
        $site = new Site('dummy', 1, [
224
            'base' => 'https://www.dummy.de/',
225
            'forwardRedirectParameters' => '',
226
            'languages' => [
227
                [
228
                    'languageId' => 1,
229
                    'base' => '/de/',
230
                    'locale' => 'de_DE',
231
                ],
232
                [
233
                    'languageId' => 2,
234
                    'base' => '/en/',
235
                    'locale' => 'en_GB',
236
                ],
237
            ],
238
        ]);
239
240
        $serverRequest = $serverRequest->withAttribute('site', $site);
241
242
        $handler = new JsonDetectionHandler($this->getSmallEventListenerStack());
243
        $response = $handler->handle($serverRequest);
244
245
        $content = json_decode($response->getBody()->getContents(), false, 512, \JSON_THROW_ON_ERROR);
246
        self::assertInstanceOf(ResponseInterface::class, $response);
247
        self::assertInstanceOf(\stdClass::class, $content);
248
        /* @var \stdClass $content */
249
        self::assertEquals(1, $content->languageId);
250
    }
251
}
252