Passed
Push — master ( a2fdc3...9fa498 )
by Tim
02:55
created

createTraitMock()   A

Complexity

Conditions 4
Paths 8

Size

Total Lines 24
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 4
eloc 15
c 1
b 0
f 0
nc 8
nop 3
dl 0
loc 24
rs 9.7666
1
<?php
2
3
declare(strict_types=1);
4
5
namespace LD\LanguageDetection\Tests\Unit\Service;
6
7
use LD\LanguageDetection\Detect\BrowserLanguage;
8
use LD\LanguageDetection\Event\DetectUserLanguages;
9
use LD\LanguageDetection\Event\NegotiateSiteLanguage;
10
use LD\LanguageDetection\Negotiation\DefaultNegotiation;
11
use LD\LanguageDetection\Service\Normalizer;
12
use LD\LanguageDetection\Service\RespectLanguageLinkDetailsTrait;
13
use LD\LanguageDetection\Tests\Unit\AbstractTest;
14
use Psr\EventDispatcher\EventDispatcherInterface;
15
use Symfony\Component\DependencyInjection\Container;
16
use TYPO3\CMS\Core\EventDispatcher\EventDispatcher;
17
use TYPO3\CMS\Core\EventDispatcher\ListenerProvider;
18
use TYPO3\CMS\Core\Http\ServerRequest;
19
use TYPO3\CMS\Core\Http\Uri;
20
use TYPO3\CMS\Core\LinkHandling\LinkService;
21
use TYPO3\CMS\Core\Site\Entity\Site;
22
use TYPO3\CMS\Core\Site\Entity\SiteLanguage;
23
use TYPO3\CMS\Core\Site\SiteFinder;
24
25
/**
26
 * @internal
27
 * @coversNothing
28
 */
29
class RespectLanguageLinkDetailsTraitTest extends AbstractTest
30
{
31
    /**
32
     * @covers \LD\LanguageDetection\Service\RespectLanguageLinkDetailsTrait
33
     */
34
    public function testTraitExecutionWithWrongType(): void
35
    {
36
        $traitObject = $this->createTraitMock();
37
38
        self::assertEquals(['type' => 'wrong'], $traitObject->addLanguageParameterByDetection(['type' => 'wrong']));
39
    }
40
41
    /**
42
     * @covers \LD\LanguageDetection\Check\EnableListener
43
     * @covers \LD\LanguageDetection\Detect\BrowserLanguage
44
     * @covers \LD\LanguageDetection\Domain\Model\Dto\SiteConfiguration
45
     * @covers \LD\LanguageDetection\Event\CheckLanguageDetection
46
     * @covers \LD\LanguageDetection\Event\DetectUserLanguages
47
     * @covers \LD\LanguageDetection\Event\NegotiateSiteLanguage
48
     * @covers \LD\LanguageDetection\Negotiation\DefaultNegotiation
49
     * @covers \LD\LanguageDetection\Service\Normalizer
50
     * @covers \LD\LanguageDetection\Service\RespectLanguageLinkDetailsTrait
51
     * @covers \LD\LanguageDetection\Service\SiteConfigurationService
52
     */
53
    public function testTraitExecutionWithDisabledLanguageDetection(): void
54
    {
55
        $siteFinder = $this->createStub(SiteFinder::class);
56
        $siteFinder->method('getSiteByPageId')
57
            ->willReturn(new Site('dummy', 1, ['enableLanguageDetection' => false]))
58
        ;
59
60
        $serverRequest = new ServerRequest('https://ww.google.de', 'GET', 'php://input', ['accept-language' => 'de,de_DE', 'user-agent' => 'google']);
61
62
        $traitObject = $this->createTraitMock($this->createMock(EventDispatcher::class), $siteFinder, $serverRequest);
63
64
        $configuration = [
65
            'type' => LinkService::TYPE_PAGE,
66
            'pageuid' => 5,
67
        ];
68
69
        self::assertEquals($configuration, $traitObject->addLanguageParameterByDetection($configuration));
70
    }
71
72
    /**
73
     * @covers \LD\LanguageDetection\Check\EnableListener
74
     * @covers \LD\LanguageDetection\Detect\BrowserLanguage
75
     * @covers \LD\LanguageDetection\Domain\Model\Dto\SiteConfiguration
76
     * @covers \LD\LanguageDetection\Event\CheckLanguageDetection
77
     * @covers \LD\LanguageDetection\Event\DetectUserLanguages
78
     * @covers \LD\LanguageDetection\Event\NegotiateSiteLanguage
79
     * @covers \LD\LanguageDetection\Negotiation\DefaultNegotiation
80
     * @covers \LD\LanguageDetection\Service\Normalizer
81
     * @covers \LD\LanguageDetection\Service\RespectLanguageLinkDetailsTrait
82
     * @covers \LD\LanguageDetection\Service\SiteConfigurationService
83
     */
84
    public function testTraitExecutionWithNoUserLanguages(): void
85
    {
86
        $site = $this->createStub(Site::class);
87
88
        $siteFinder = $this->createStub(SiteFinder::class);
89
        $siteFinder->method('getSiteByPageId')
90
            ->willReturn($site)
91
        ;
92
93
        $serverRequest = new ServerRequest('https://ww.google.de', 'GET', 'php://input', ['accept-language' => 'de,de_DE']);
94
95
        $traitObject = $this->createTraitMock($this->getEventListenerWithoutUserLanguages(), $siteFinder, $serverRequest);
96
97
        $configuration = [
98
            'type' => LinkService::TYPE_PAGE,
99
            'pageuid' => 5,
100
        ];
101
102
        self::assertEquals($configuration, $traitObject->addLanguageParameterByDetection($configuration));
103
    }
104
105
    /**
106
     * @covers \LD\LanguageDetection\Check\EnableListener
107
     * @covers \LD\LanguageDetection\Detect\BrowserLanguage
108
     * @covers \LD\LanguageDetection\Domain\Model\Dto\SiteConfiguration
109
     * @covers \LD\LanguageDetection\Event\CheckLanguageDetection
110
     * @covers \LD\LanguageDetection\Event\DetectUserLanguages
111
     * @covers \LD\LanguageDetection\Event\NegotiateSiteLanguage
112
     * @covers \LD\LanguageDetection\Negotiation\DefaultNegotiation
113
     * @covers \LD\LanguageDetection\Service\Normalizer
114
     * @covers \LD\LanguageDetection\Service\RespectLanguageLinkDetailsTrait
115
     * @covers \LD\LanguageDetection\Service\SiteConfigurationService
116
     */
117
    public function testTraitExecutionParameterGeneration(): void
118
    {
119
        $en = new SiteLanguage(0, 'en_GB', new Uri('/en/'), ['enabled' => true]);
120
        $de = new SiteLanguage(1, 'de_DE', new Uri('/en/'), ['enabled' => true]);
121
122
        $site = $this->createStub(Site::class);
123
        $site->method('getAllLanguages')->willReturn([$en, $de]);
124
125
        $siteFinder = $this->createStub(SiteFinder::class);
126
        $siteFinder->method('getSiteByPageId')
127
            ->willReturn($site)
128
        ;
129
130
        $serverRequest = new ServerRequest('https://ww.google.de', 'GET', 'php://input', ['accept-language' => 'de,de_DE']);
131
132
        $traitObject = $this->createTraitMock($this->getEventListener(), $siteFinder, $serverRequest);
133
134
        $configuration = [
135
            'type' => LinkService::TYPE_PAGE,
136
            'pageuid' => 5,
137
        ];
138
139
        self::assertEquals([
140
            'type' => LinkService::TYPE_PAGE,
141
            'pageuid' => 5,
142
            'parameters' => 'L=1',
143
        ], $traitObject->addLanguageParameterByDetection($configuration));
144
    }
145
146
    protected function getEventListener(): EventDispatcher
147
    {
148
        $container = new Container();
149
        $container->set(BrowserLanguage::class, new BrowserLanguage());
150
        $container->set(DefaultNegotiation::class, new DefaultNegotiation(new Normalizer()));
151
        $provider = new ListenerProvider($container);
152
        $provider->addListener(DetectUserLanguages::class, BrowserLanguage::class);
153
        $provider->addListener(NegotiateSiteLanguage::class, DefaultNegotiation::class);
154
155
        return new EventDispatcher($provider);
156
    }
157
158
    protected function getEventListenerWithoutUserLanguages(): EventDispatcher
159
    {
160
        $container = new Container();
161
        $provider = new ListenerProvider($container);
162
163
        return new EventDispatcher($provider);
164
    }
165
166
    protected function createTraitMock(?EventDispatcherInterface $languageEventDispatcher = null, ?SiteFinder $languageSiteFinder = null, ?ServerRequest $serverRequest = null): object
167
    {
168
        $traitObject = $this->getObjectForTrait(RespectLanguageLinkDetailsTrait::class);
169
        $reflectionClass = new \ReflectionClass($traitObject);
170
171
        if (null !== $languageEventDispatcher) {
172
            $propertyLanguageEventDispatcher = $reflectionClass->getProperty('languageEventDispatcher');
173
            $propertyLanguageEventDispatcher->setAccessible(true);
174
            $propertyLanguageEventDispatcher->setValue($traitObject, $languageEventDispatcher);
175
        }
176
177
        if (null !== $languageSiteFinder) {
178
            $propertyLanguageSiteFinder = $reflectionClass->getProperty('languageSiteFinder');
179
            $propertyLanguageSiteFinder->setAccessible(true);
180
            $propertyLanguageSiteFinder->setValue($traitObject, $languageSiteFinder);
181
        }
182
183
        if (null !== $serverRequest) {
184
            $propertyLanguageRequest = $reflectionClass->getProperty('languageRequest');
185
            $propertyLanguageRequest->setAccessible(true);
186
            $propertyLanguageRequest->setValue($traitObject, $serverRequest);
187
        }
188
189
        return $traitObject;
190
    }
191
}
192