Completed
Pull Request — master (#3221)
by Gawain
64:30
created

SqliteSchemaManagerTest::getDoctrineTypeDefault()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 3
dl 0
loc 5
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 0
1
<?php
2
3
namespace Doctrine\Tests\DBAL\Schema;
4
5
use Doctrine\DBAL\Connection;
6
use Doctrine\DBAL\Platforms\SqlitePlatform;
7
use Doctrine\DBAL\Schema\SqliteSchemaManager;
8
use PHPUnit\Framework\TestCase;
9
use ReflectionMethod;
10
11
class SqliteSchemaManagerTest extends TestCase
12
{
13
    /**
14
     * @dataProvider getDataColumnCollation
15
     * @group 2865
16
     */
17
    public function testParseColumnCollation(?string $collation, string $column, string $sql) : void
18
    {
19
        $conn = $this->createMock(Connection::class);
20
        $conn->method('getDatabasePlatform')->willReturn(new SqlitePlatform());
21
22
        $manager = new SqliteSchemaManager($conn);
23
        $ref     = new ReflectionMethod($manager, 'parseColumnCollationFromSQL');
24
        $ref->setAccessible(true);
25
26
        self::assertSame($collation, $ref->invoke($manager, $column, $sql));
27
    }
28
29
    /**
30
     * @return mixed[][]
31
     */
32
    public static function getDataColumnCollation() : iterable
33
    {
34
        return [
35
            ['RTRIM', 'a', 'CREATE TABLE "a" ("a" text DEFAULT "aa" COLLATE "RTRIM" NOT NULL)'],
36
            ['utf-8', 'a', 'CREATE TABLE "a" ("b" text UNIQUE NOT NULL COLLATE NOCASE, "a" text DEFAULT "aa" COLLATE "utf-8" NOT NULL)'],
37
            ['NOCASE', 'a', 'CREATE TABLE "a" ("a" text DEFAULT (lower(ltrim(" a") || rtrim("a "))) CHECK ("a") NOT NULL COLLATE NOCASE UNIQUE, "b" text COLLATE RTRIM)'],
38
            [null, 'a', 'CREATE TABLE "a" ("a" text CHECK ("a") NOT NULL, "b" text COLLATE RTRIM)'],
39
            ['RTRIM', 'a"b', 'CREATE TABLE "a" ("a""b" text COLLATE RTRIM)'],
40
            ['BINARY', 'b', 'CREATE TABLE "a" (bb TEXT COLLATE RTRIM, b VARCHAR(42) NOT NULL COLLATE BINARY)'],
41
            ['BINARY', 'b', 'CREATE TABLE "a" (bbb TEXT COLLATE NOCASE, bb TEXT COLLATE RTRIM, b VARCHAR(42) NOT NULL COLLATE BINARY)'],
42
            ['BINARY', 'b', 'CREATE TABLE "a" (b VARCHAR(42) NOT NULL COLLATE BINARY, bb TEXT COLLATE RTRIM)'],
43
            ['utf-8', 'bar#', 'CREATE TABLE dummy_table (id INTEGER NOT NULL, foo VARCHAR(255) COLLATE "utf-8" NOT NULL, "bar#" VARCHAR(255) COLLATE "utf-8" NOT NULL, baz VARCHAR(255) COLLATE "utf-8" NOT NULL, PRIMARY KEY(id))'],
44
            [null,    'bar#', 'CREATE TABLE dummy_table (id INTEGER NOT NULL, foo VARCHAR(255) NOT NULL, "bar#" VARCHAR(255) NOT NULL, baz VARCHAR(255) NOT NULL, PRIMARY KEY(id))'],
45
            ['utf-8', 'baz',  'CREATE TABLE dummy_table (id INTEGER NOT NULL, foo VARCHAR(255) COLLATE "utf-8" NOT NULL, "bar#" INTEGER NOT NULL, baz VARCHAR(255) COLLATE "utf-8" NOT NULL, PRIMARY KEY(id))'],
46
            [null,    'baz',  'CREATE TABLE dummy_table (id INTEGER NOT NULL, foo VARCHAR(255) NOT NULL, "bar#" INTEGER NOT NULL, baz VARCHAR(255) NOT NULL, PRIMARY KEY(id))'],
47
            ['utf-8', 'bar/', 'CREATE TABLE dummy_table (id INTEGER NOT NULL, foo VARCHAR(255) COLLATE "utf-8" NOT NULL, "bar/" VARCHAR(255) COLLATE "utf-8" NOT NULL, baz VARCHAR(255) COLLATE "utf-8" NOT NULL, PRIMARY KEY(id))'],
48
            [null,    'bar/', 'CREATE TABLE dummy_table (id INTEGER NOT NULL, foo VARCHAR(255) NOT NULL, "bar/" VARCHAR(255) NOT NULL, baz VARCHAR(255) NOT NULL, PRIMARY KEY(id))'],
49
            ['utf-8', 'baz',  'CREATE TABLE dummy_table (id INTEGER NOT NULL, foo VARCHAR(255) COLLATE "utf-8" NOT NULL, "bar/" INTEGER NOT NULL, baz VARCHAR(255) COLLATE "utf-8" NOT NULL, PRIMARY KEY(id))'],
50
            [null,    'baz',  'CREATE TABLE dummy_table (id INTEGER NOT NULL, foo VARCHAR(255) NOT NULL, "bar/" INTEGER NOT NULL, baz VARCHAR(255) NOT NULL, PRIMARY KEY(id))'],
51
        ];
52
    }
53
54
    /**
55
     * @dataProvider getDataColumnComment
56
     * @group 2865
57
     */
58
    public function testParseColumnCommentFromSQL(?string $comment, string $column, string $sql) : void
59
    {
60
        $conn = $this->createMock(Connection::class);
61
        $conn->method('getDatabasePlatform')->willReturn(new SqlitePlatform());
62
63
        $manager = new SqliteSchemaManager($conn);
64
        $ref     = new ReflectionMethod($manager, 'parseColumnCommentFromSQL');
65
        $ref->setAccessible(true);
66
67
        self::assertSame($comment, $ref->invoke($manager, $column, $sql));
68
    }
69
70
    /**
71
     * @return mixed[][]
72
     */
73
    public static function getDataColumnComment() : iterable
74
    {
75
        return [
76
            'Single column with no comment' => [
77
                null,
78
                'a',
79
                'CREATE TABLE "a" ("a" TEXT DEFAULT "a" COLLATE RTRIM)',
80
            ],
81
            'Single column with type comment' => [
82
                '(DC2Type:x)',
83
                'a',
84
                'CREATE TABLE "a" ("a" CLOB DEFAULT NULL COLLATE BINARY --(DC2Type:x)
85
)',
86
            ],
87
            'Multiple similar columns with type comment 1' => [
88
                null,
89
                'b',
90
                'CREATE TABLE "a" (a TEXT COLLATE RTRIM, "b" TEXT DEFAULT "a" COLLATE RTRIM, "bb" CLOB DEFAULT NULL COLLATE BINARY --(DC2Type:x)
91
)',
92
            ],
93
            'Multiple similar columns with type comment 2' => [
94
                '(DC2Type:x)',
95
                'b',
96
                'CREATE TABLE "a" (a TEXT COLLATE RTRIM, "bb" TEXT DEFAULT "a" COLLATE RTRIM, "b" CLOB DEFAULT NULL COLLATE BINARY --(DC2Type:x)
97
)',
98
            ],
99
            'Multiple similar columns on different lines, with type comment 1' => [
100
                null,
101
                'bb',
102
                'CREATE TABLE "a" (a TEXT COLLATE RTRIM, "b" CLOB DEFAULT NULL COLLATE BINARY --(DC2Type:x)
103
, "bb" TEXT DEFAULT "a" COLLATE RTRIM',
104
            ],
105
            'Multiple similar columns on different lines, with type comment 2' => [
106
                '(DC2Type:x)',
107
                'bb',
108
                'CREATE TABLE "a" (a TEXT COLLATE RTRIM, "bb" CLOB DEFAULT NULL COLLATE BINARY --(DC2Type:x)
109
, "b" TEXT DEFAULT "a" COLLATE RTRIM',
110
            ],
111
            'Column with numeric but no comment 1' => [
112
                null,
113
                'a',
114
                'CREATE TABLE "a" ("a" NUMERIC(10, 0) NOT NULL, "b" CLOB NOT NULL --(DC2Type:array)
115
, "c" CHAR(36) NOT NULL --(DC2Type:guid)
116
)',
117
            ],
118
            'Column with numeric but no comment 2' => [
119
                null,
120
                'a',
121
                'CREATE TABLE "b" ("a" NUMERIC(10, 0) NOT NULL, "b" CLOB NOT NULL --(DC2Type:array)
122
, "c" CHAR(36) NOT NULL --(DC2Type:guid)
123
)',
124
            ],
125
            'Column with numeric but no comment 3' => [
126
                '(DC2Type:guid)',
127
                'c',
128
                'CREATE TABLE "b" ("a" NUMERIC(10, 0) NOT NULL, "b" CLOB NOT NULL --(DC2Type:array)
129
, "c" CHAR(36) NOT NULL --(DC2Type:guid)
130
)',
131
            ],
132
            'Column with numeric but no comment 4' => [
133
                '(DC2Type:array)',
134
                'b',
135
                'CREATE TABLE "b" ("a" NUMERIC(10, 0) NOT NULL,
136
                    "b" CLOB NOT NULL, --(DC2Type:array)
137
                    "c" CHAR(36) NOT NULL --(DC2Type:guid)
138
                )',
139
            ],
140
            'Column "bar", select "bar" with no comment' => [
141
                null,
142
                'bar',
143
                'CREATE TABLE dummy_table (
144
                    id INTEGER NOT NULL,
145
                    foo VARCHAR(255) COLLATE "utf-8" NOT NULL,
146
                    "bar" VARCHAR(255) COLLATE "utf-8" NOT NULL,
147
                    baz VARCHAR(255) COLLATE "utf-8" NOT NULL,
148
                    PRIMARY KEY(id)
149
                )',
150
            ],
151
            'Column "bar", select "bar" with type comment' => [
152
                '(DC2Type:x)',
153
                'bar',
154
                'CREATE TABLE dummy_table (
155
                    id INTEGER NOT NULL,
156
                    foo VARCHAR(255) COLLATE "utf-8" NOT NULL,
157
                    "bar" VARCHAR(255) COLLATE "utf-8" NOT NULL, --(DC2Type:x)
158
                    baz VARCHAR(255) COLLATE "utf-8" NOT NULL, --(DC2Type:y)
159
                    PRIMARY KEY(id)
160
                )',
161
            ],
162
            'Column "bar", select "baz" with no comment' => [
163
                null,
164
                'baz',
165
                'CREATE TABLE dummy_table (
166
                    id INTEGER NOT NULL,
167
                    foo VARCHAR(255) COLLATE "utf-8" NOT NULL,
168
                    "bar" INTEGER NOT NULL,
169
                    baz VARCHAR(255) COLLATE "utf-8" NOT NULL,
170
                    PRIMARY KEY(id)
171
                )',
172
            ],
173
            'Column "bar", select "baz" with type comment' => [
174
                '(DC2Type:y)',
175
                'baz',
176
                'CREATE TABLE dummy_table (
177
                    id INTEGER NOT NULL,
178
                    foo VARCHAR(255) COLLATE "utf-8" NOT NULL,
179
                    "bar" INTEGER NOT NULL, --(DC2Type:x)
180
                    baz VARCHAR(255) COLLATE "utf-8" NOT NULL, --(DC2Type:y)
181
                    PRIMARY KEY(id)
182
                )',
183
            ],
184
185
            'Column "bar#", select "bar#" with no comment' => [
186
                null,
187
                'bar#',
188
                'CREATE TABLE dummy_table (
189
                    id INTEGER NOT NULL,
190
                    foo VARCHAR(255) COLLATE "utf-8" NOT NULL,
191
                    "bar#" VARCHAR(255) COLLATE "utf-8" NOT NULL,
192
                    baz VARCHAR(255) COLLATE "utf-8" NOT NULL,
193
                    PRIMARY KEY(id)
194
                )',
195
            ],
196
            'Column "bar#", select "bar#" with type comment' => [
197
                '(DC2Type:x)',
198
                'bar#',
199
                'CREATE TABLE dummy_table (
200
                    id INTEGER NOT NULL,
201
                    foo VARCHAR(255) COLLATE "utf-8" NOT NULL,
202
                    "bar#" VARCHAR(255) COLLATE "utf-8" NOT NULL, --(DC2Type:x)
203
                    baz VARCHAR(255) COLLATE "utf-8" NOT NULL, --(DC2Type:y)
204
                    PRIMARY KEY(id)
205
                )',
206
            ],
207
            'Column "bar#", select "baz" with no comment' => [
208
                null,
209
                'baz',
210
                'CREATE TABLE dummy_table (
211
                    id INTEGER NOT NULL,
212
                    foo VARCHAR(255) COLLATE "utf-8" NOT NULL,
213
                    "bar#" INTEGER NOT NULL,
214
                    baz VARCHAR(255) COLLATE "utf-8" NOT NULL,
215
                    PRIMARY KEY(id)
216
                )',
217
            ],
218
            'Column "bar#", select "baz" with type comment' => [
219
                '(DC2Type:y)',
220
                'baz',
221
                'CREATE TABLE dummy_table (
222
                    id INTEGER NOT NULL,
223
                    foo VARCHAR(255) COLLATE "utf-8" NOT NULL,
224
                    "bar#" INTEGER NOT NULL, --(DC2Type:x)
225
                    baz VARCHAR(255) COLLATE "utf-8" NOT NULL, --(DC2Type:y)
226
                    PRIMARY KEY(id)
227
                )',
228
            ],
229
230
            'Column "bar/", select "bar/" with no comment' => [
231
                null,
232
                'bar/',
233
                'CREATE TABLE dummy_table (
234
                    id INTEGER NOT NULL,
235
                    foo VARCHAR(255) COLLATE "utf-8" NOT NULL,
236
                    "bar/" VARCHAR(255) COLLATE "utf-8" NOT NULL,
237
                    baz VARCHAR(255) COLLATE "utf-8" NOT NULL,
238
                    PRIMARY KEY(id)
239
                    )',
240
            ],
241
            'Column "bar/", select "bar/" with type comment' => [
242
                '(DC2Type:x)',
243
                'bar/',
244
                'CREATE TABLE dummy_table (
245
                    id INTEGER NOT NULL,
246
                    foo VARCHAR(255) COLLATE "utf-8" NOT NULL,
247
                    "bar/" VARCHAR(255) COLLATE "utf-8" NOT NULL, --(DC2Type:x)
248
                    baz VARCHAR(255) COLLATE "utf-8" NOT NULL, --(DC2Type:y)
249
                    PRIMARY KEY(id)
250
                )',
251
            ],
252
            'Column "bar/", select "baz" with no comment' => [
253
                null,
254
                'baz',
255
                'CREATE TABLE dummy_table (
256
                    id INTEGER NOT NULL,
257
                    foo VARCHAR(255) COLLATE "utf-8" NOT NULL,
258
                    "bar/" INTEGER NOT NULL,
259
                    baz VARCHAR(255) COLLATE "utf-8" NOT NULL,
260
                    PRIMARY KEY(id)
261
                )',
262
            ],
263
            'Column "bar/", select "baz" with type comment' => [
264
                '(DC2Type:y)',
265
                'baz',
266
                'CREATE TABLE dummy_table (
267
                    id INTEGER NOT NULL,
268
                    foo VARCHAR(255) COLLATE "utf-8" NOT NULL,
269
                    "bar/" INTEGER COLLATE "utf-8" NOT NULL, --(DC2Type:x)
270
                    baz VARCHAR(255) COLLATE "utf-8" NOT NULL, --(DC2Type:y)
271
                    PRIMARY KEY(id)
272
                )',
273
            ],
274
        ];
275
    }
276
277
    /**
278
     * @dataProvider getDoctrineTypeDefault
279
     * @group 2865
280
     */
281
    public function testRemoveDoctrineTypeFromDefault(?string $default, string $sql) : void
282
    {
283
        $conn = $this->createMock(Connection::class);
284
        $conn->method('getDatabasePlatform')->willReturn(new SqlitePlatform());
285
286
        $manager = new SqliteSchemaManager($conn);
287
        $ref     = new ReflectionMethod($manager, 'removeDoctrineTypeFromDefault');
288
        $ref->setAccessible(true);
289
290
        self::assertSame($default, $ref->invoke($manager, $sql));
291
    }
292
293
    /**
294
     * @return mixed[][]
295
     */
296
    public function getDoctrineTypeDefault() : array
297
    {
298
        return [
299
            'No default'   => [null, '--(DC2Type:x)'],
300
            'Null default' => ['NULL', 'NULL --(DC2Type:x)'],
301
        ];
302
    }
303
}
304