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

Michael Moravec's avatar
Michael Moravec committed
3 4
declare(strict_types=1);

5
namespace Doctrine\DBAL\Tests\Schema;
6

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

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

Sergei Morozov's avatar
Sergei Morozov committed
22
        self::assertEquals('foo', $column->getName());
23 24 25 26 27 28
        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());
29
        self::assertFalse($column->getNotnull());
30
        self::assertTrue($column->getFixed());
Sergei Morozov's avatar
Sergei Morozov committed
31
        self::assertEquals('baz', $column->getDefault());
32

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

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

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

63
        self::assertSame($expected, $this->createColumn()->toArray());
64 65
    }

66
    public function testSettingUnknownOptionIsStillSupported(): void
67
    {
68 69
        $this->expectException(UnknownColumnOption::class);
        $this->expectExceptionMessage('The "unknown_option" column option is not supported.');
70

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

74
    public function testOptionsShouldNotBeIgnored(): void
75
    {
76 77
        $this->expectException(UnknownColumnOption::class);
        $this->expectExceptionMessage('The "unknown_option" column option is not supported.');
78

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

82
        $col2 = new Column('bar', Type::getType(Types::INTEGER), ['unknown_option' => 'bar', 'notnull' => false]);
83 84 85
        self::assertFalse($col2->getNotnull());
    }

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

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

Sergei Morozov's avatar
Sergei Morozov committed
102
        return new Column('foo', $string, $options);
103
    }
104 105 106

    /**
     * @group DBAL-64
107
     * @group DBAL-830
108
     */
109
    public function testQuotedColumnName(): void
110 111
    {
        $string = Type::getType('string');
Sergei Morozov's avatar
Sergei Morozov committed
112
        $column = new Column('`bar`', $string, []);
113

Sergei Morozov's avatar
Sergei Morozov committed
114 115
        $mysqlPlatform  = new MySqlPlatform();
        $sqlitePlatform = new SqlitePlatform();
116

117 118 119
        self::assertEquals('bar', $column->getName());
        self::assertEquals('`bar`', $column->getQuotedName($mysqlPlatform));
        self::assertEquals('"bar"', $column->getQuotedName($sqlitePlatform));
120

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

123
        $sqlServerPlatform = new SQLServer2012Platform();
124

125 126
        self::assertEquals('bar', $column->getName());
        self::assertEquals('[bar]', $column->getQuotedName($sqlServerPlatform));
127 128 129 130 131 132
    }

    /**
     * @dataProvider getIsQuoted
     * @group DBAL-830
     */
133
    public function testIsQuoted(string $columnName, bool $isQuoted): void
134
    {
Sergei Morozov's avatar
Sergei Morozov committed
135
        $type   = Type::getType('string');
136 137
        $column = new Column($columnName, $type);

138
        self::assertSame($isQuoted, $column->isQuoted());
139 140
    }

141 142 143
    /**
     * @return mixed[][]
     */
144
    public static function getIsQuoted(): iterable
145
    {
Sergei Morozov's avatar
Sergei Morozov committed
146 147 148 149 150 151
        return [
            ['bar', false],
            ['`bar`', true],
            ['"bar"', true],
            ['[bar]', true],
        ];
152
    }
153 154 155 156

    /**
     * @group DBAL-42
     */
157
    public function testColumnComment(): void
158
    {
Sergei Morozov's avatar
Sergei Morozov committed
159
        $column = new Column('bar', Type::getType('string'));
160
        self::assertSame('', $column->getComment());
161

Sergei Morozov's avatar
Sergei Morozov committed
162 163
        $column->setComment('foo');
        self::assertEquals('foo', $column->getComment());
164 165

        $columnArray = $column->toArray();
166 167
        self::assertArrayHasKey('comment', $columnArray);
        self::assertEquals('foo', $columnArray['comment']);
168
    }
Luís Cobucci's avatar
Luís Cobucci committed
169
}