BaseDateTypeTestCase.php 3.21 KB
Newer Older
1 2
<?php

3
namespace Doctrine\DBAL\Tests\Types;
4

Sergei Morozov's avatar
Sergei Morozov committed
5 6
use DateTime;
use DateTimeImmutable;
7
use Doctrine\DBAL\Platforms\AbstractPlatform;
Sergei Morozov's avatar
Sergei Morozov committed
8
use Doctrine\DBAL\Types\ConversionException;
Sergei Morozov's avatar
Sergei Morozov committed
9
use Doctrine\DBAL\Types\Type;
10
use PHPUnit\Framework\MockObject\MockObject;
Sergei Morozov's avatar
Sergei Morozov committed
11 12
use PHPUnit\Framework\TestCase;
use stdClass;
13 14
use function date_default_timezone_get;
use function date_default_timezone_set;
15

Sergei Morozov's avatar
Sergei Morozov committed
16
abstract class BaseDateTypeTestCase extends TestCase
17
{
18
    /** @var AbstractPlatform|MockObject */
19 20
    protected $platform;

Sergei Morozov's avatar
Sergei Morozov committed
21
    /** @var Type */
22 23
    protected $type;

Sergei Morozov's avatar
Sergei Morozov committed
24
    /** @var string */
25 26
    private $currentTimezone;

27
    protected function setUp() : void
28
    {
29
        $this->platform        = $this->getMockForAbstractClass(AbstractPlatform::class);
30 31
        $this->currentTimezone = date_default_timezone_get();

Sergei Morozov's avatar
Sergei Morozov committed
32
        self::assertInstanceOf(Type::class, $this->type);
33 34
    }

35
    protected function tearDown() : void
36 37 38 39
    {
        date_default_timezone_set($this->currentTimezone);
    }

40
    public function testDateConvertsToDatabaseValue() : void
41
    {
42
        self::assertIsString($this->type->convertToDatabaseValue(new DateTime(), $this->platform));
43 44 45 46
    }

    /**
     * @param mixed $value
Sergei Morozov's avatar
Sergei Morozov committed
47 48
     *
     * @dataProvider invalidPHPValuesProvider
49
     */
50
    public function testInvalidTypeConversionToDatabaseValue($value) : void
51
    {
Sergei Morozov's avatar
Sergei Morozov committed
52
        $this->expectException(ConversionException::class);
53 54 55 56

        $this->type->convertToDatabaseValue($value, $this->platform);
    }

57
    public function testNullConversion() : void
58
    {
59
        self::assertNull($this->type->convertToPHPValue(null, $this->platform));
60 61
    }

62
    public function testConvertDateTimeToPHPValue() : void
63
    {
Sergei Morozov's avatar
Sergei Morozov committed
64
        $date = new DateTime('now');
65

66
        self::assertSame($date, $this->type->convertToPHPValue($date, $this->platform));
67 68
    }

69 70 71
    /**
     * @group #2794
     *
72 73 74
     * Note that while \@see \DateTimeImmutable is supposed to be handled
     * by @see \Doctrine\DBAL\Types\DateTimeImmutableType, previous DBAL versions handled it just fine.
     * This test is just in place to prevent further regressions, even if the type is being misused
75
     */
76
    public function testConvertDateTimeImmutableToPHPValue() : void
77
    {
Sergei Morozov's avatar
Sergei Morozov committed
78
        $date = new DateTimeImmutable('now');
79 80 81 82 83 84 85

        self::assertSame($date, $this->type->convertToPHPValue($date, $this->platform));
    }

    /**
     * @group #2794
     *
86 87 88
     * Note that while \@see \DateTimeImmutable is supposed to be handled
     * by @see \Doctrine\DBAL\Types\DateTimeImmutableType, previous DBAL versions handled it just fine.
     * This test is just in place to prevent further regressions, even if the type is being misused
89
     */
90
    public function testDateTimeImmutableConvertsToDatabaseValue() : void
91
    {
92
        self::assertIsString($this->type->convertToDatabaseValue(new DateTimeImmutable(), $this->platform));
93 94
    }

95 96 97
    /**
     * @return mixed[][]
     */
98
    public static function invalidPHPValuesProvider() : iterable
99 100 101 102 103 104 105 106
    {
        return [
            [0],
            [''],
            ['foo'],
            ['10:11:12'],
            ['2015-01-31'],
            ['2015-01-31 10:11:12'],
Sergei Morozov's avatar
Sergei Morozov committed
107
            [new stdClass()],
108 109 110 111 112 113 114 115
            [27],
            [-1],
            [1.2],
            [[]],
            [['an array']],
        ];
    }
}