Completed
Push — master ( 3c78af...f63029 )
by
unknown
36s queued 36s
created

LocalDateTimeTest::testSwitchLocales()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 4
c 1
b 0
f 0
nc 1
nop 2
dl 0
loc 7
rs 10
1
<?php
2
3
namespace TractorCow\Fluent\Tests\Model;
4
5
use SilverStripe\Dev\SapphireTest;
6
use SilverStripe\ORM\FieldType\DBDatetime;
7
use SilverStripe\ORM\FieldType\DBField;
8
use TractorCow\Fluent\Extension\FluentDateTimeExtension;
9
use TractorCow\Fluent\Model\Domain;
10
use TractorCow\Fluent\Model\LocalDateTime;
11
use TractorCow\Fluent\Model\Locale;
12
use TractorCow\Fluent\State\FluentState;
13
14
class LocalDateTimeTest extends SapphireTest
15
{
16
    protected static $fixture_file = 'LocaleTest.yml';
17
18
    protected function setUp(): void
19
    {
20
        // SapphireTest SetUp() sets timezone to UTC
21
        parent::setUp();
22
23
        // Clear cache
24
        Locale::clearCached();
25
        Domain::clearCached();
26
        FluentState::singleton()->setLocale('es_US');
27
        DBDatetime::set_mock_now('2021-01-12 13:00:12');
28
    }
29
30
    public function testFromDBDatetime()
31
    {
32
        /** @var DBDatetime|FluentDateTimeExtension $date */
33
        $date = DBField::create_field('Datetime', '2021-02-18 11:59:59'); // UTC
34
35
        // Convert to US timezone
36
        $localisedDate = $date->getLocalTime();
37
        $this->assertEquals('2021-02-18 06:59:59', $localisedDate->getLocalValue()); // US time, 5 hours before UTC
38
39
        // Internal time is non-modified (original UTC timezone)
40
        $this->assertEquals('2021-02-18 11:59:59', $localisedDate->getValue());
41
42
        // Change to NZ timezone
43
        $localisedDate->setTimezone('Pacific/Auckland');
44
        $this->assertEquals('2021-02-19 00:59:59', $localisedDate->getLocalValue()); // NZ is 13 hours after UTC
45
    }
46
47
    public function testSetValue()
48
    {
49
        $date = new LocalDateTime();
50
        $date->setLocalValue('2021-02-19 00:59:59', 'Pacific/Auckland');
51
52
        // Internal time is non-modified (original UTC timezone)
53
        $this->assertEquals('Pacific/Auckland', $date->getTimezone());
54
        $this->assertEquals('2021-02-18 11:59:59', $date->getValue()); // Converted back to UTC for storage
55
        $this->assertEquals('2021-02-19 00:59:59', $date->getLocalValue()); // NZ is 13 hours after UTC
56
57
        // Convert from NZ to US time
58
        $date->setTimezone('America/New_York');
59
        $this->assertEquals('2021-02-18 06:59:59', $date->getLocalValue()); // 5 hours before UTC
60
61
        // Test normal setValue (ignores timezone, sets as per server timezone)
62
        // Set value 1 hour into the future
63
        $date->setValue('2021-02-18 12:59:59');
64
        $this->assertEquals('2021-02-18 12:59:59', $date->getValue());
65
        $this->assertEquals('2021-02-18 07:59:59', $date->getLocalValue()); // 5 hours before UTC
66
    }
67
68
69
    /**
70
     * Test all DB locales
71
     *
72
     * @dataProvider provideTestSwitchLocales
73
     * @param $locales
74
     */
75
    public function testSwitchLocales($locale, $expectedTime)
76
    {
77
        /** @var DBDatetime|FluentDateTimeExtension $date */
78
        $date = DBField::create_field('Datetime', '2021-01-12 13:00:12'); // UTC
79
        FluentState::singleton()->withState(function (FluentState $state) use ($locale, $expectedTime, $date) {
80
            $state->setLocale($locale);
81
            $this->assertEquals($expectedTime, $date->getLocalTime()->getLocalValue());
82
        });
83
    }
84
85
    public function provideTestSwitchLocales()
86
    {
87
        return [
88
            [
89
                'locale'    => 'en_NZ',
90
                'localTIme' => '2021-01-13 02:00:12',
91
            ],
92
            [
93
                'locale'    => 'en_AU',
94
                'localTime' => '2021-01-12 23:00:12',
95
            ],
96
            [
97
                'locale'    => 'es_ES',
98
                'localTime' => '2021-01-12 14:00:12',
99
            ],
100
            [
101
                'locale'    => 'es_US',
102
                'localTime' => '2021-01-12 08:00:12',
103
            ],
104
        ];
105
    }
106
}
107