File: ColumnCommentTest.php

package info (click to toggle)
php-doctrine-dbal 4.2.3%2Bdfsg-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, trixie
  • size: 4,644 kB
  • sloc: php: 46,471; xml: 460; makefile: 22
file content (125 lines) | stat: -rw-r--r-- 3,689 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
<?php

declare(strict_types=1);

namespace Doctrine\DBAL\Tests\Functional\Schema;

use Doctrine\DBAL\Schema\Table;
use Doctrine\DBAL\Tests\FunctionalTestCase;
use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\Attributes\RequiresPhpunit;

use function array_merge;
use function sprintf;

#[RequiresPhpunit('< 11.5.18')]
class ColumnCommentTest extends FunctionalTestCase
{
    private static bool $initialized = false;

    protected function setUp(): void
    {
        parent::setUp();

        if (self::$initialized) {
            return;
        }

        self::$initialized = true;

        $table = new Table('column_comments');
        $table->addColumn('id', 'integer');

        foreach (self::columnProvider() as [$name, $type, $options]) {
            $table->addColumn($name, $type, $options);
        }

        $this->dropAndCreateTable($table);
    }

    /** @param array<string,mixed> $options */
    #[DataProvider('columnProvider')]
    public function testColumnComment(string $name, string $type, array $options): void
    {
        $this->assertColumnComment('column_comments', $name, $options['comment'] ?? '');
    }

    /** @return iterable<string,array{0: string, 1: string, 2: mixed[]}> */
    public static function columnProvider(): iterable
    {
        foreach (
            [
                'commented' => [
                    'string',
                    ['length' => 16],
                ],
                'not_commented' => [
                    'json',
                    [],
                ],
            ] as $typeName => [$type, $typeOptions]
        ) {
            foreach (
                [
                    'no_comment' => [],
                    'with_comment' => ['comment' => 'Some comment'],
                    'zero_comment' => ['comment' => '0'],
                    'empty_comment' => ['comment' => ''],
                    'quoted_comment' => ['comment' => "O'Reilly"],
                ] as $caseName => $caseOptions
            ) {
                $name = sprintf('%s_%s', $typeName, $caseName);

                yield $name => [
                    $name,
                    $type,
                    array_merge($typeOptions, $caseOptions),
                ];
            }
        }
    }

    #[DataProvider('alterColumnCommentProvider')]
    public function testAlterColumnComment(string $comment1, string $comment2): void
    {
        $table1 = new Table('column_comments');
        $table1->addColumn('id', 'integer', ['comment' => $comment1]);

        $this->dropAndCreateTable($table1);

        $table2 = clone $table1;
        $table2->getColumn('id')->setComment($comment2);

        $schemaManager = $this->connection->createSchemaManager();

        $diff = $schemaManager->createComparator()
            ->compareTables($table1, $table2);

        $schemaManager->alterTable($diff);

        $this->assertColumnComment('column_comments', 'id', $comment2);
    }

    /** @return mixed[][] */
    public static function alterColumnCommentProvider(): iterable
    {
        return [
            'Empty to non-empty' => ['', 'foo'],
            'Non-empty to empty' => ['foo', ''],
            'Empty to zero' => ['', '0'],
            'Zero to empty' => ['0', ''],
            'Non-empty to non-empty' => ['foo', 'bar'],
        ];
    }

    private function assertColumnComment(string $table, string $column, string $expectedComment): void
    {
        self::assertSame(
            $expectedComment,
            $this->connection->createSchemaManager()
                ->introspectTable($table)
                ->getColumn($column)
                ->getComment(),
        );
    }
}