Passed
Push — master ( b9883f...994c90 )
by Tim
04:58 queued 02:23
created

testTraitExecutionParameterGeneration()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 41
Code Lines 27

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 27
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 41
rs 9.488
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 Symfony\Component\DependencyInjection\Container;
15
use TYPO3\CMS\Core\EventDispatcher\EventDispatcher;
16
use TYPO3\CMS\Core\EventDispatcher\ListenerProvider;
17
use TYPO3\CMS\Core\Http\ServerRequest;
18
use TYPO3\CMS\Core\Http\Uri;
19
use TYPO3\CMS\Core\LinkHandling\LinkService;
20
use TYPO3\CMS\Core\Site\Entity\Site;
21
use TYPO3\CMS\Core\Site\Entity\SiteLanguage;
22
use TYPO3\CMS\Core\Site\SiteFinder;
23
24
/**
25
 * @internal
26
 * @coversNothing
27
 */
28
class RespectLanguageLinkDetailsTraitTest extends AbstractTest
29
{
30
    /**
31
     * @covers \LD\LanguageDetection\Service\RespectLanguageLinkDetailsTrait
32
     */
33
    public function testTraitExecutionWithWrongType(): void
34
    {
35
        /** @var RespectLanguageLinkDetailsTrait $traitObject */
36
        $traitObject = $this->getObjectForTrait(RespectLanguageLinkDetailsTrait::class);
37
38
        self::assertEquals(['type' => 'wrong'], $traitObject->addLanguageParameterByDetection(['type' => 'wrong']));
39
    }
40
41
    /**
42
     * @covers \LD\LanguageDetection\Service\RespectLanguageLinkDetailsTrait
43
     */
44
    public function testTraitExecutionParameterGeneration(): void
45
    {
46
        $en = new SiteLanguage(0, 'en_GB', new Uri('/en/'), ['enabled' => true]);
47
        $de = new SiteLanguage(1, 'de_DE', new Uri('/en/'), ['enabled' => true]);
48
49
        $site = $this->createStub(Site::class);
50
        $site->method('getAllLanguages')->willReturn([$en, $de]);
51
52
        $siteFinder = $this->createStub(SiteFinder::class);
53
        $siteFinder->method('getSiteByPageId')
54
            ->willReturn($site)
55
        ;
56
57
        /** @var RespectLanguageLinkDetailsTrait $traitObject */
58
        $traitObject = $this->getObjectForTrait(RespectLanguageLinkDetailsTrait::class);
59
60
        $reflectionClass = new \ReflectionClass($traitObject);
61
        $propertyLanguageEventDispatcher = $reflectionClass->getProperty('languageEventDispatcher');
62
        $propertyLanguageEventDispatcher->setAccessible(true);
63
        $propertyLanguageEventDispatcher->setValue($traitObject, $this->getEventListener());
64
65
        $propertyLanguageSiteFinder = $reflectionClass->getProperty('languageSiteFinder');
66
        $propertyLanguageSiteFinder->setAccessible(true);
67
        $propertyLanguageSiteFinder->setValue($traitObject, $siteFinder);
68
69
        $serverRequest = new ServerRequest('https://ww.google.de', 'GET', 'php://input', ['accept-language' => 'de,de_DE']);
70
71
        $propertyLanguageRequest = $reflectionClass->getProperty('languageRequest');
72
        $propertyLanguageRequest->setAccessible(true);
73
        $propertyLanguageRequest->setValue($traitObject, $serverRequest);
74
75
        $configuration = [
76
            'type' => LinkService::TYPE_PAGE,
77
            'pageuid' => 5,
78
        ];
79
80
        self::assertEquals([
81
            'type' => LinkService::TYPE_PAGE,
82
            'pageuid' => 5,
83
            'parameters' => 'L=1',
84
        ], $traitObject->addLanguageParameterByDetection($configuration));
85
    }
86
87
    protected function getEventListener(): EventDispatcher
88
    {
89
        $container = new Container();
90
        $container->set(BrowserLanguage::class, new BrowserLanguage());
91
        $container->set(DefaultNegotiation::class, new DefaultNegotiation(new Normalizer()));
92
        $provider = new ListenerProvider($container);
93
        $provider->addListener(DetectUserLanguages::class, BrowserLanguage::class);
94
        $provider->addListener(NegotiateSiteLanguage::class, DefaultNegotiation::class);
95
96
        return new EventDispatcher($provider);
97
    }
98
}
99