Passed
Push — master ( f0cb22...699e9b )
by Robbie
01:46
created

testGetDefaultWithCurrentDomainArgument()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 3
nc 1
nop 0
dl 0
loc 6
rs 9.4285
c 1
b 0
f 0
1
<?php
2
3
namespace TractorCow\Fluent\Tests\Model;
4
5
use SilverStripe\Dev\SapphireTest;
6
use SilverStripe\Forms\CheckboxField;
7
use TractorCow\Fluent\Model\Domain;
8
use TractorCow\Fluent\Model\Locale;
9
use TractorCow\Fluent\State\FluentState;
10
11
class LocaleTest extends SapphireTest
12
{
13
    protected static $fixture_file = 'LocaleTest.yml';
14
15
    public function setUp()
16
    {
17
        parent::setUp();
18
19
        // Clear cache
20
        Locale::clearCached();
21
        Domain::clearCached();
22
        FluentState::singleton()
23
            ->setLocale('es_US')
24
            ->setDomain('fluent.co.nz')
25
            ->setIsDomainMode(true);
26
    }
27
28
    public function testGetDefaultWithoutArguments()
29
    {
30
        $result = Locale::getDefault();
31
32
        $this->assertInstanceOf(Locale::class, $result);
33
        // Note: default_sort order is included here
34
        $this->assertSame('en_AU', $result->Locale, 'First Locale with IsDefault true is returned');
35
    }
36
37
    public function testGetDefaultWithDomainArgument()
38
    {
39
        // spanish has_one default locale
40
        /** @var Domain $domain */
41
        $domain = $this->objFromFixture(Domain::class, 'spanish');
42
        $result = Locale::getDefault($domain->Domain);
43
44
        $this->assertInstanceOf(Locale::class, $result);
45
        $this->assertSame('es_US', $result->Locale, 'Domain respects has_one to DefaultLocale');
46
47
        // kiwi doesn't has_one to any default, but the IsDefault is a child
48
        /** @var Domain $domain2 */
49
        $domain2 = $this->objFromFixture(Domain::class, 'kiwi');
50
        $result2 = Locale::getDefault($domain2->Domain);
51
52
        $this->assertInstanceOf(Locale::class, $result2);
53
        $this->assertSame('en_AU', $result2->Locale, 'First Locale in Domain with IsDefault true is returned');
54
    }
55
56
    public function testGetDefaultWithCurrentDomainArgument()
57
    {
58
        // Get current default
59
        $result = Locale::getDefault(true); // Should use fluent.co.nz current domain
60
        $this->assertInstanceOf(Locale::class, $result);
61
        $this->assertSame('en_AU', $result->Locale, 'First Locale in Domain with IsDefault true is returned');
62
    }
63
64
    /**
65
     * @dataProvider isLocaleProvider
66
     * @param string $locale
67
     * @param string $input
68
     * @param bool $expected
69
     */
70
    public function testIsLocale($locale, $input, $expected)
71
    {
72
        $localeObj = Locale::create()->setField('Locale', $locale);
73
        $this->assertSame($expected, $localeObj->isLocale($input));
74
    }
75
76
    /**
77
     * @return array[]
78
     */
79
    public function isLocaleProvider()
80
    {
81
        return [
82
            ['en_NZ', 'en_NZ', true],
83
            ['en_nz', 'en-NZ', true],
84
            ['en-NZ', 'en_nz', true],
85
            ['en-nz', 'en-nz', true],
86
            ['en_NZ', 'en-NZ-1990', true],
87
            ['en_NZ', 'en_AU', false],
88
            ['en_NZ', 'fr-fr-1990', false],
89
        ];
90
    }
91
92
    public function testGetNativeName()
93
    {
94
        $this->assertSame('Spanish', Locale::getByLocale('es_US')->getNativeName());
95
    }
96
97 View Code Duplication
    public function testGetBaseURLContainsDomainAndURLSegmentForNonDefaultLocale()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
98
    {
99
        // es_ES has a domain but is not the default locale for that domain
100
        $result = Locale::getByLocale('es_ES')->getBaseURL();
101
        $this->assertContains('fluent.es', $result, "Locale's domain is in the URL");
102
        $this->assertContains('/es/', $result, 'URL segment for non-default locale is in the URL');
103
104
        // Turning off domain mode removes domain but not prefix
105
        FluentState::singleton()->setIsDomainMode(false);
106
        $result = Locale::getByLocale('es_ES')->getBaseURL();
107
        $this->assertNotContains('fluent.es', $result, "Locale's domain is in the URL");
108
        $this->assertContains('/es/', $result, 'URL segment for non-default locale is in the URL');
109
    }
110
111 View Code Duplication
    public function testGetBaseURLOnlyContainsDomainForDefaultLocale()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
112
    {
113
        // es_US has a domain and is the default
114
        $result = Locale::getByLocale('es_US')->getBaseURL();
115
        $this->assertContains('fluent.es', $result, "Locale's domain is in the URL");
116
        $this->assertNotContains('/es-usa/', $result, 'URL segment is not in the URL for default locales');
117
118
        // When domain mode is turned off, prefix is now necessary
119
        FluentState::singleton()->setIsDomainMode(false);
120
        $result = Locale::getByLocale('es_US')->getBaseURL();
121
        $this->assertNotContains('fluent.es', $result, "Domain not used");
122
        $this->assertContains('/es-usa/', $result, 'URL Segment necessary for non-global default');
123
    }
124
125
    public function testGetSiblings()
126
    {
127
        $esUS = Locale::getByLocale('es_US');
128
        $this->assertListEquals([
129
            [ 'Locale' => 'es_US' ],
130
            [ 'Locale' => 'es_ES' ],
131
        ], $esUS->getSiblingLocales());
132
133
        // Test without domain mode
134
        FluentState::singleton()->setIsDomainMode(false);
135
136
        $esUS = Locale::getByLocale('es_US');
137
        $this->assertListEquals([
138
            [ 'Locale' => 'es_US' ],
139
            [ 'Locale' => 'es_ES' ],
140
            [ 'Locale' => 'en_NZ' ],
141
            [ 'Locale' => 'en_AU' ],
142
        ], $esUS->getSiblingLocales());
143
    }
144
145
    public function testGetIsDefault()
146
    {
147
        $esUS = Locale::getByLocale('es_US');
148
        $esES = Locale::getByLocale('es_ES');
149
        $enNZ = Locale::getByLocale('en_NZ');
150
        $enAU = Locale::getByLocale('en_AU');
151
152
        // In domain mode, two are default
153
        $this->assertTrue($esUS->getIsDefault()); // Locale.DefaultLocale = this
154
        $this->assertTrue($enAU->getIsDefault()); // IsGlobalDefault = 1
155
        $this->assertFalse($enNZ->getIsDefault());
156
        $this->assertFalse($esES->getIsDefault());
157
158
        // In non-domain mode, only one default
159
        FluentState::singleton()->setIsDomainMode(false);
160
        $this->assertFalse($esUS->getIsDefault());
161
        $this->assertTrue($enAU->getIsDefault()); // IsGlobalDefault = 1
162
        $this->assertFalse($enNZ->getIsDefault());
163
        $this->assertFalse($esES->getIsDefault());
164
    }
165
166
    public function testGetIsOnlyLocale()
167
    {
168
        $esUS = Locale::getByLocale('es_US');
169
        $esES = Locale::getByLocale('es_ES');
170
171
        $this->assertFalse($esUS->getIsOnlyLocale());
172
        $this->assertFalse($esUS->getIsOnlyLocale());
173
174
        // Delete esES will affect this
175
        $esES->delete();
176
        Locale::clearCached();
177
        Domain::clearCached();
178
179
        $this->assertTrue($esUS->getIsOnlyLocale());
180
181
        // Turning off domain mode means this locale is joined with all the other domain locales
182
        FluentState::singleton()->setIsDomainMode(false);
183
        $this->assertFalse($esUS->getIsOnlyLocale());
184
    }
185
186
    public function testGlobalDefaultCheckedOnFirstLocale()
187
    {
188
        Locale::get()->removeAll();
189
        Locale::clearCached();
190
191
        $firstLocale = new Locale;
192
193
        $fields = $firstLocale->getCMSFields();
194
195
        /** @var CheckboxField $checkbox */
196
        $checkbox = $fields->fieldByName('Root.Main.IsGlobalDefault');
197
        $this->assertTrue((bool) $checkbox->Value());
198
    }
199
}
200