ColumnTest.php 5.57 KB
Newer Older
1 2
<?php

3
namespace Doctrine\DBAL\Tests\Schema;
4

Sergei Morozov's avatar
Sergei Morozov committed
5 6
use Doctrine\DBAL\Platforms\MySqlPlatform;
use Doctrine\DBAL\Platforms\SqlitePlatform;
7
use Doctrine\DBAL\Platforms\SQLServer2012Platform;
8
use Doctrine\DBAL\Schema\Column;
9
use Doctrine\DBAL\Schema\Exception\UnknownColumnOption;
10
use Doctrine\DBAL\Types\Type;
11
use Doctrine\DBAL\Types\Types;
Sergei Morozov's avatar
Sergei Morozov committed
12
use PHPUnit\Framework\TestCase;
13

Sergei Morozov's avatar
Sergei Morozov committed
14
class ColumnTest extends TestCase
15
{
16
    public function testGet(): void
17
    {
18
        $column = $this->createColumn();
19

Sergei Morozov's avatar
Sergei Morozov committed
20
        self::assertEquals('foo', $column->getName());
21 22 23 24 25 26
        self::assertSame(Type::getType('string'), $column->getType());

        self::assertEquals(200, $column->getLength());
        self::assertEquals(5, $column->getPrecision());
        self::assertEquals(2, $column->getScale());
        self::assertTrue($column->getUnsigned());
27
        self::assertFalse($column->getNotnull());
28
        self::assertTrue($column->getFixed());
Sergei Morozov's avatar
Sergei Morozov committed
29
        self::assertEquals('baz', $column->getDefault());
30

Sergei Morozov's avatar
Sergei Morozov committed
31
        self::assertEquals(['foo' => 'bar'], $column->getPlatformOptions());
32 33 34 35
        self::assertTrue($column->hasPlatformOption('foo'));
        self::assertEquals('bar', $column->getPlatformOption('foo'));
        self::assertFalse($column->hasPlatformOption('bar'));

Sergei Morozov's avatar
Sergei Morozov committed
36
        self::assertEquals(['bar' => 'baz'], $column->getCustomSchemaOptions());
37 38 39
        self::assertTrue($column->hasCustomSchemaOption('bar'));
        self::assertEquals('baz', $column->getCustomSchemaOption('bar'));
        self::assertFalse($column->hasCustomSchemaOption('foo'));
40
    }
41

42
    public function testToArray(): void
43
    {
Sergei Morozov's avatar
Sergei Morozov committed
44
        $expected = [
45 46 47 48 49 50 51 52 53
            'name' => 'foo',
            'type' => Type::getType('string'),
            'default' => 'baz',
            'notnull' => false,
            'length' => 200,
            'precision' => 5,
            'scale' => 2,
            'fixed' => true,
            'unsigned' => true,
54
            'autoincrement' => false,
55
            'columnDefinition' => null,
56
            'comment' => null,
57
            'foo' => 'bar',
Sergei Morozov's avatar
Sergei Morozov committed
58 59
            'bar' => 'baz',
        ];
60

61
        self::assertEquals($expected, $this->createColumn()->toArray());
62 63
    }

64 65
    /**
     * @group legacy
66
     * @expectedDeprecation The "unknown_option" column option is not supported, setting it is deprecated and will cause an error in Doctrine DBAL 3.0
67
     */
68
    public function testSettingUnknownOptionIsStillSupported(): void
69
    {
70 71
        self::expectException(UnknownColumnOption::class);
        self::expectExceptionMessage('The "unknown_option" column option is not supported.');
72

73 74 75
        new Column('foo', $this->createMock(Type::class), ['unknown_option' => 'bar']);
    }

76 77
    /**
     * @group legacy
78
     * @expectedDeprecation The "unknown_option" column option is not supported, setting it is deprecated and will cause an error in Doctrine DBAL 3.0
79
     */
80
    public function testOptionsShouldNotBeIgnored(): void
81
    {
82 83 84
        self::expectException(UnknownColumnOption::class);
        self::expectExceptionMessage('The "unknown_option" column option is not supported.');

85
        $col1 = new Column('bar', Type::getType(Types::INTEGER), ['unknown_option' => 'bar', 'notnull' => true]);
86 87
        self::assertTrue($col1->getNotnull());

88
        $col2 = new Column('bar', Type::getType(Types::INTEGER), ['unknown_option' => 'bar', 'notnull' => false]);
89 90 91
        self::assertFalse($col2->getNotnull());
    }

92
    public function createColumn(): Column
93
    {
Sergei Morozov's avatar
Sergei Morozov committed
94
        $options = [
95 96 97 98 99 100 101
            'length' => 200,
            'precision' => 5,
            'scale' => 2,
            'unsigned' => true,
            'notnull' => false,
            'fixed' => true,
            'default' => 'baz',
Sergei Morozov's avatar
Sergei Morozov committed
102 103 104
            'platformOptions' => ['foo' => 'bar'],
            'customSchemaOptions' => ['bar' => 'baz'],
        ];
105 106

        $string = Type::getType('string');
107

Sergei Morozov's avatar
Sergei Morozov committed
108
        return new Column('foo', $string, $options);
109
    }
110 111 112

    /**
     * @group DBAL-64
113
     * @group DBAL-830
114
     */
115
    public function testQuotedColumnName(): void
116 117
    {
        $string = Type::getType('string');
Sergei Morozov's avatar
Sergei Morozov committed
118
        $column = new Column('`bar`', $string, []);
119

Sergei Morozov's avatar
Sergei Morozov committed
120 121
        $mysqlPlatform  = new MySqlPlatform();
        $sqlitePlatform = new SqlitePlatform();
122

123 124 125
        self::assertEquals('bar', $column->getName());
        self::assertEquals('`bar`', $column->getQuotedName($mysqlPlatform));
        self::assertEquals('"bar"', $column->getQuotedName($sqlitePlatform));
126

Sergei Morozov's avatar
Sergei Morozov committed
127
        $column = new Column('[bar]', $string);
128

129
        $sqlServerPlatform = new SQLServer2012Platform();
130

131 132
        self::assertEquals('bar', $column->getName());
        self::assertEquals('[bar]', $column->getQuotedName($sqlServerPlatform));
133 134 135 136 137 138
    }

    /**
     * @dataProvider getIsQuoted
     * @group DBAL-830
     */
139
    public function testIsQuoted(string $columnName, bool $isQuoted): void
140
    {
Sergei Morozov's avatar
Sergei Morozov committed
141
        $type   = Type::getType('string');
142 143
        $column = new Column($columnName, $type);

144
        self::assertSame($isQuoted, $column->isQuoted());
145 146
    }

147 148 149
    /**
     * @return mixed[][]
     */
150
    public static function getIsQuoted(): iterable
151
    {
Sergei Morozov's avatar
Sergei Morozov committed
152 153 154 155 156 157
        return [
            ['bar', false],
            ['`bar`', true],
            ['"bar"', true],
            ['[bar]', true],
        ];
158
    }
159 160 161 162

    /**
     * @group DBAL-42
     */
163
    public function testColumnComment(): void
164
    {
Sergei Morozov's avatar
Sergei Morozov committed
165
        $column = new Column('bar', Type::getType('string'));
166
        self::assertNull($column->getComment());
167

Sergei Morozov's avatar
Sergei Morozov committed
168 169
        $column->setComment('foo');
        self::assertEquals('foo', $column->getComment());
170 171

        $columnArray = $column->toArray();
172 173
        self::assertArrayHasKey('comment', $columnArray);
        self::assertEquals('foo', $columnArray['comment']);
174
    }
Luís Cobucci's avatar
Luís Cobucci committed
175
}