FallbackNegotiationTest::testCallWithNullSite()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 11
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 6
nc 1
nop 0
dl 0
loc 11
rs 10
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Lochmueller\LanguageDetection\Tests\Unit\Negotiation;
6
7
use Lochmueller\LanguageDetection\Domain\Collection\LocaleCollection;
8
use Lochmueller\LanguageDetection\Event\NegotiateSiteLanguageEvent;
9
use Lochmueller\LanguageDetection\Negotiation\FallbackNegotiation;
10
use Lochmueller\LanguageDetection\Service\SiteConfigurationService;
11
use Lochmueller\LanguageDetection\Tests\Unit\AbstractUnitTest;
12
use TYPO3\CMS\Core\Http\ServerRequest;
13
use TYPO3\CMS\Core\Http\Uri;
14
use TYPO3\CMS\Core\Site\Entity\NullSite;
15
use TYPO3\CMS\Core\Site\Entity\Site;
16
use TYPO3\CMS\Core\Site\Entity\SiteLanguage;
17
18
/**
19
 * @internal
20
 *
21
 * @coversNothing
22
 */
23
class FallbackNegotiationTest extends AbstractUnitTest
24
{
25
    /**
26
     * @covers \Lochmueller\LanguageDetection\Domain\Collection\LocaleCollection
27
     * @covers \Lochmueller\LanguageDetection\Domain\Model\Dto\SiteConfiguration
28
     * @covers \Lochmueller\LanguageDetection\Event\NegotiateSiteLanguageEvent
29
     * @covers \Lochmueller\LanguageDetection\Negotiation\FallbackNegotiation
30
     * @covers \Lochmueller\LanguageDetection\Service\SiteConfigurationService
31
     *
32
     * @dataProvider dataInvalid
33
     *
34
     * @param mixed[]|array<string, array<int>>|array<string, string> $configuration
35
     */
36
    public function testInvalidFallbackLanguages(array $configuration): void
37
    {
38
        $site = $this->createStub(Site::class);
39
        $site->method('getConfiguration')->willReturn($configuration);
40
41
        $request = new ServerRequest(null, null, 'php://input', []);
42
        $event = new NegotiateSiteLanguageEvent($site, $request, LocaleCollection::fromArray([]));
43
44
        $fallbackNegotiation = new FallbackNegotiation(new SiteConfigurationService());
45
        $fallbackNegotiation($event);
46
47
        self::assertNull($event->getSelectedLanguage());
48
    }
49
50
    /**
51
     * @covers \Lochmueller\LanguageDetection\Domain\Collection\LocaleCollection
52
     * @covers \Lochmueller\LanguageDetection\Domain\Model\Dto\SiteConfiguration
53
     * @covers \Lochmueller\LanguageDetection\Event\NegotiateSiteLanguageEvent
54
     * @covers \Lochmueller\LanguageDetection\Negotiation\FallbackNegotiation
55
     * @covers \Lochmueller\LanguageDetection\Service\SiteConfigurationService
56
     */
57
    public function testValidFallbackLanguages(): void
58
    {
59
        $site = $this->createStub(Site::class);
60
        $site->method('getConfiguration')->willReturn(['fallbackDetectionLanguage' => 2]);
61
62
        $siteLanguage1 = new SiteLanguage(1, 'de_DE', new Uri('/de/'), []);
63
        $siteLanguage2 = new SiteLanguage(2, 'en_GB', new Uri('/en/'), []);
64
        $siteLanguage3 = new SiteLanguage(3, 'fr_FR', new Uri('/fr/'), []);
65
66
        $site->method('getLanguages')->willReturn([$siteLanguage1, $siteLanguage2, $siteLanguage3]);
67
68
        $request = new ServerRequest(null, null, 'php://input', []);
69
        $event = new NegotiateSiteLanguageEvent($site, $request, LocaleCollection::fromArray([]));
70
71
        $fallbackNegotiation = new FallbackNegotiation(new SiteConfigurationService());
72
        $fallbackNegotiation($event);
73
74
        self::assertEquals($siteLanguage2, $event->getSelectedLanguage());
75
    }
76
77
    /**
78
     * @covers \Lochmueller\LanguageDetection\Domain\Collection\LocaleCollection
79
     * @covers \Lochmueller\LanguageDetection\Domain\Model\Dto\SiteConfiguration
80
     * @covers \Lochmueller\LanguageDetection\Event\NegotiateSiteLanguageEvent
81
     * @covers \Lochmueller\LanguageDetection\Negotiation\FallbackNegotiation
82
     * @covers \Lochmueller\LanguageDetection\Service\SiteConfigurationService
83
     */
84
    public function testValidConfigurationButNoFallback(): void
85
    {
86
        $site = $this->createStub(Site::class);
87
        $site->method('getConfiguration')->willReturn(['fallbackDetectionLanguage' => 9]);
88
89
        $siteLanguage1 = new SiteLanguage(1, 'de_DE', new Uri('/de/'), []);
90
        $siteLanguage2 = new SiteLanguage(2, 'en_GB', new Uri('/en/'), []);
91
        $siteLanguage3 = new SiteLanguage(3, 'fr_FR', new Uri('/fr/'), []);
92
93
        $site->method('getLanguages')->willReturn([$siteLanguage1, $siteLanguage2, $siteLanguage3]);
94
95
        $request = new ServerRequest(null, null, 'php://input', []);
96
        $event = new NegotiateSiteLanguageEvent($site, $request, LocaleCollection::fromArray([]));
97
98
        $fallbackNegotiation = new FallbackNegotiation(new SiteConfigurationService());
99
        $fallbackNegotiation($event);
100
101
        self::assertNull($event->getSelectedLanguage());
102
    }
103
104
    /**
105
     * @covers \Lochmueller\LanguageDetection\Domain\Collection\LocaleCollection
106
     * @covers \Lochmueller\LanguageDetection\Domain\Model\Dto\SiteConfiguration
107
     * @covers \Lochmueller\LanguageDetection\Event\NegotiateSiteLanguageEvent
108
     * @covers \Lochmueller\LanguageDetection\Negotiation\FallbackNegotiation
109
     * @covers \Lochmueller\LanguageDetection\Service\SiteConfigurationService
110
     */
111
    public function testCallWithNullSite(): void
112
    {
113
        $site = $this->createMock(NullSite::class);
114
115
        $request = new ServerRequest(null, null, 'php://input', []);
116
        $event = new NegotiateSiteLanguageEvent($site, $request, LocaleCollection::fromArray([]));
117
118
        $fallbackNegotiation = new FallbackNegotiation(new SiteConfigurationService());
119
        $fallbackNegotiation($event);
120
121
        self::assertNull($event->getSelectedLanguage());
122
    }
123
124
    /**
125
     * @return array{empty: never[][], other: array<int, array{dummy: string}>, text: array<int, array{fallbackDetectionLanguage: string}>, array: array<int, array{fallbackDetectionLanguage: int[]}>}
126
     */
127
    public static function dataInvalid(): array
128
    {
129
        return [
130
            'empty' => [[]],
131
            'other' => [['dummy' => '1']],
132
            'text' => [['fallbackDetectionLanguage' => 'Wrong']],
133
            'array' => [['fallbackDetectionLanguage' => [1, 2, 3]]],
134
        ];
135
    }
136
}
137