Issues (201)

tests/Schema/SchemaTest.php (1 issue)

1
<?php
2
3
declare(strict_types=1);
4
5
namespace Doctrine\DBAL\Tests\Schema;
6
7
use Doctrine\DBAL\Schema\Schema;
8
use Doctrine\DBAL\Schema\SchemaConfig;
9
use Doctrine\DBAL\Schema\SchemaException;
10
use Doctrine\DBAL\Schema\Sequence;
11
use Doctrine\DBAL\Schema\Table;
12
use Doctrine\DBAL\Schema\Visitor\AbstractVisitor;
13
use Doctrine\DBAL\Schema\Visitor\Visitor;
14
use PHPUnit\Framework\TestCase;
15
use ReflectionProperty;
16
use function current;
17
use function strlen;
18
19
class SchemaTest extends TestCase
20
{
21
    public function testAddTable() : void
22
    {
23
        $tableName = 'public.foo';
24
        $table     = new Table($tableName);
25
26
        $schema = new Schema([$table]);
27
28
        self::assertTrue($schema->hasTable($tableName));
29
30
        $tables = $schema->getTables();
31
        self::assertArrayHasKey($tableName, $tables);
32
        self::assertSame($table, $tables[$tableName]);
33
        self::assertSame($table, $schema->getTable($tableName));
34
        self::assertTrue($schema->hasTable($tableName));
35
    }
36
37
    public function testTableMatchingCaseInsensitive() : void
38
    {
39
        $table = new Table('Foo');
40
41
        $schema = new Schema([$table]);
42
        self::assertTrue($schema->hasTable('foo'));
43
        self::assertTrue($schema->hasTable('FOO'));
44
45
        self::assertSame($table, $schema->getTable('FOO'));
46
        self::assertSame($table, $schema->getTable('foo'));
47
        self::assertSame($table, $schema->getTable('Foo'));
48
    }
49
50
    public function testGetUnknownTableThrowsException() : void
51
    {
52
        $this->expectException(SchemaException::class);
53
54
        $schema = new Schema();
55
        $schema->getTable('unknown');
56
    }
57
58
    public function testCreateTableTwiceThrowsException() : void
59
    {
60
        $this->expectException(SchemaException::class);
61
62
        $tableName = 'foo';
63
        $table     = new Table($tableName);
64
        $tables    = [$table, $table];
65
66
        new Schema($tables);
67
    }
68
69
    public function testRenameTable() : void
70
    {
71
        $tableName = 'foo';
72
        $table     = new Table($tableName);
73
        $schema    = new Schema([$table]);
74
75
        self::assertTrue($schema->hasTable('foo'));
76
        $schema->renameTable('foo', 'bar');
77
        self::assertFalse($schema->hasTable('foo'));
78
        self::assertTrue($schema->hasTable('bar'));
79
        self::assertSame($table, $schema->getTable('bar'));
80
    }
81
82
    public function testDropTable() : void
83
    {
84
        $tableName = 'foo';
85
        $table     = new Table($tableName);
86
        $schema    = new Schema([$table]);
87
88
        self::assertTrue($schema->hasTable('foo'));
89
90
        $schema->dropTable('foo');
91
92
        self::assertFalse($schema->hasTable('foo'));
93
    }
94
95
    public function testCreateTable() : void
96
    {
97
        $schema = new Schema();
98
99
        self::assertFalse($schema->hasTable('foo'));
100
101
        $table = $schema->createTable('foo');
102
103
        self::assertEquals('foo', $table->getName());
104
        self::assertTrue($schema->hasTable('foo'));
105
    }
106
107
    public function testAddSequences() : void
108
    {
109
        $sequence = new Sequence('a_seq', 1, 1);
110
111
        $schema = new Schema([], [$sequence]);
112
113
        self::assertTrue($schema->hasSequence('a_seq'));
114
        self::assertSame('a_seq', $schema->getSequence('a_seq')->getName());
115
116
        $sequences = $schema->getSequences();
117
        self::assertArrayHasKey('public.a_seq', $sequences);
118
    }
119
120
    public function testSequenceAccessCaseInsensitive() : void
121
    {
122
        $sequence = new Sequence('a_Seq');
123
124
        $schema = new Schema([], [$sequence]);
125
        self::assertTrue($schema->hasSequence('a_seq'));
126
        self::assertTrue($schema->hasSequence('a_Seq'));
127
        self::assertTrue($schema->hasSequence('A_SEQ'));
128
129
        self::assertEquals($sequence, $schema->getSequence('a_seq'));
130
        self::assertEquals($sequence, $schema->getSequence('a_Seq'));
131
        self::assertEquals($sequence, $schema->getSequence('A_SEQ'));
132
    }
133
134
    public function testGetUnknownSequenceThrowsException() : void
135
    {
136
        $this->expectException(SchemaException::class);
137
138
        $schema = new Schema();
139
        $schema->getSequence('unknown');
140
    }
141
142
    public function testCreateSequence() : void
143
    {
144
        $schema   = new Schema();
145
        $sequence = $schema->createSequence('a_seq', 10, 20);
146
147
        self::assertEquals('a_seq', $sequence->getName());
148
        self::assertEquals(10, $sequence->getAllocationSize());
149
        self::assertEquals(20, $sequence->getInitialValue());
150
151
        self::assertTrue($schema->hasSequence('a_seq'));
152
        self::assertSame('a_seq', $schema->getSequence('a_seq')->getName());
153
154
        $sequences = $schema->getSequences();
155
        self::assertArrayHasKey('public.a_seq', $sequences);
156
    }
157
158
    public function testDropSequence() : void
159
    {
160
        $sequence = new Sequence('a_seq', 1, 1);
161
162
        $schema = new Schema([], [$sequence]);
163
164
        $schema->dropSequence('a_seq');
165
        self::assertFalse($schema->hasSequence('a_seq'));
166
    }
167
168
    public function testAddSequenceTwiceThrowsException() : void
169
    {
170
        $this->expectException(SchemaException::class);
171
172
        $sequence = new Sequence('a_seq', 1, 1);
173
174
        new Schema([], [$sequence, $sequence]);
175
    }
176
177
    public function testConfigMaxIdentifierLength() : void
178
    {
179
        $schemaConfig = new SchemaConfig();
180
        $schemaConfig->setMaxIdentifierLength(5);
181
182
        $schema = new Schema([], [], $schemaConfig);
183
        $table  = $schema->createTable('smalltable');
184
        $table->addColumn('long_id', 'integer');
185
        $table->addIndex(['long_id']);
186
187
        $index = current($table->getIndexes());
188
        self::assertEquals(5, strlen($index->getName()));
189
    }
190
191
    public function testDeepClone() : void
192
    {
193
        $schema   = new Schema();
194
        $sequence = $schema->createSequence('baz');
195
196
        $tableA = $schema->createTable('foo');
197
        $tableA->addColumn('id', 'integer');
198
199
        $tableB = $schema->createTable('bar');
200
        $tableB->addColumn('id', 'integer');
201
        $tableB->addColumn('foo_id', 'integer');
202
        $tableB->addForeignKeyConstraint($tableA, ['foo_id'], ['id']);
203
204
        $schemaNew = clone $schema;
205
206
        self::assertNotSame($sequence, $schemaNew->getSequence('baz'));
207
208
        self::assertNotSame($tableA, $schemaNew->getTable('foo'));
209
        self::assertNotSame($tableA->getColumn('id'), $schemaNew->getTable('foo')->getColumn('id'));
210
211
        self::assertNotSame($tableB, $schemaNew->getTable('bar'));
212
        self::assertNotSame($tableB->getColumn('id'), $schemaNew->getTable('bar')->getColumn('id'));
213
214
        $fk = $schemaNew->getTable('bar')->getForeignKeys();
215
        $fk = current($fk);
216
217
        $re = new ReflectionProperty($fk, '_localTable');
218
        $re->setAccessible(true);
219
220
        self::assertSame($schemaNew->getTable('bar'), $re->getValue($fk));
221
    }
222
223
    /**
224
     * @group DBAL-219
225
     */
226
    public function testHasTableForQuotedAsset() : void
227
    {
228
        $schema = new Schema();
229
230
        $tableA = $schema->createTable('foo');
231
        $tableA->addColumn('id', 'integer');
232
233
        self::assertTrue($schema->hasTable('`foo`'));
234
    }
235
236
    /**
237
     * @group DBAL-669
238
     */
239
    public function testHasNamespace() : void
240
    {
241
        $schema = new Schema();
242
243
        self::assertFalse($schema->hasNamespace('foo'));
244
245
        $schema->createTable('foo');
246
247
        self::assertFalse($schema->hasNamespace('foo'));
248
249
        $schema->createTable('bar.baz');
250
251
        self::assertFalse($schema->hasNamespace('baz'));
252
        self::assertTrue($schema->hasNamespace('bar'));
253
        self::assertFalse($schema->hasNamespace('tab'));
254
255
        $schema->createTable('tab.taz');
256
257
        self::assertTrue($schema->hasNamespace('tab'));
258
    }
259
260
    /**
261
     * @group DBAL-669
262
     */
263
    public function testCreatesNamespace() : void
264
    {
265
        $schema = new Schema();
266
267
        self::assertFalse($schema->hasNamespace('foo'));
268
269
        $schema->createNamespace('foo');
270
271
        self::assertTrue($schema->hasNamespace('foo'));
272
        self::assertTrue($schema->hasNamespace('FOO'));
273
        self::assertTrue($schema->hasNamespace('`foo`'));
274
        self::assertTrue($schema->hasNamespace('`FOO`'));
275
276
        $schema->createNamespace('`bar`');
277
278
        self::assertTrue($schema->hasNamespace('bar'));
279
        self::assertTrue($schema->hasNamespace('BAR'));
280
        self::assertTrue($schema->hasNamespace('`bar`'));
281
        self::assertTrue($schema->hasNamespace('`BAR`'));
282
283
        self::assertSame(['foo' => 'foo', 'bar' => '`bar`'], $schema->getNamespaces());
284
    }
285
286
    /**
287
     * @group DBAL-669
288
     */
289
    public function testThrowsExceptionOnCreatingNamespaceTwice() : void
290
    {
291
        $schema = new Schema();
292
293
        $schema->createNamespace('foo');
294
295
        $this->expectException(SchemaException::class);
296
297
        $schema->createNamespace('foo');
298
    }
299
300
    /**
301
     * @group DBAL-669
302
     */
303
    public function testCreatesNamespaceThroughAddingTableImplicitly() : void
304
    {
305
        $schema = new Schema();
306
307
        self::assertFalse($schema->hasNamespace('foo'));
308
309
        $schema->createTable('baz');
310
311
        self::assertFalse($schema->hasNamespace('foo'));
312
        self::assertFalse($schema->hasNamespace('baz'));
313
314
        $schema->createTable('foo.bar');
315
316
        self::assertTrue($schema->hasNamespace('foo'));
317
        self::assertFalse($schema->hasNamespace('bar'));
318
319
        $schema->createTable('`baz`.bloo');
320
321
        self::assertTrue($schema->hasNamespace('baz'));
322
        self::assertFalse($schema->hasNamespace('bloo'));
323
324
        $schema->createTable('`baz`.moo');
325
326
        self::assertTrue($schema->hasNamespace('baz'));
327
        self::assertFalse($schema->hasNamespace('moo'));
328
    }
329
330
    /**
331
     * @group DBAL-669
332
     */
333
    public function testCreatesNamespaceThroughAddingSequenceImplicitly() : void
334
    {
335
        $schema = new Schema();
336
337
        self::assertFalse($schema->hasNamespace('foo'));
338
339
        $schema->createSequence('baz');
340
341
        self::assertFalse($schema->hasNamespace('foo'));
342
        self::assertFalse($schema->hasNamespace('baz'));
343
344
        $schema->createSequence('foo.bar');
345
346
        self::assertTrue($schema->hasNamespace('foo'));
347
        self::assertFalse($schema->hasNamespace('bar'));
348
349
        $schema->createSequence('`baz`.bloo');
350
351
        self::assertTrue($schema->hasNamespace('baz'));
352
        self::assertFalse($schema->hasNamespace('bloo'));
353
354
        $schema->createSequence('`baz`.moo');
355
356
        self::assertTrue($schema->hasNamespace('baz'));
357
        self::assertFalse($schema->hasNamespace('moo'));
358
    }
359
360
    /**
361
     * @group DBAL-669
362
     */
363
    public function testVisitsVisitor() : void
364
    {
365
        $schema  = new Schema();
366
        $visitor = $this->createMock(Visitor::class);
367
368
        $schema->createNamespace('foo');
369
        $schema->createNamespace('bar');
370
371
        $schema->createTable('baz');
372
        $schema->createTable('bla.bloo');
373
374
        $schema->createSequence('moo');
375
        $schema->createSequence('war');
376
377
        $visitor->expects(self::once())
378
            ->method('acceptSchema')
379
            ->with($schema);
380
381
        $visitor->expects(self::at(1))
382
            ->method('acceptTable')
383
            ->with($schema->getTable('baz'));
384
385
        $visitor->expects(self::at(2))
386
            ->method('acceptTable')
387
            ->with($schema->getTable('bla.bloo'));
388
389
        $visitor->expects(self::exactly(2))
390
            ->method('acceptTable');
391
392
        $visitor->expects(self::at(3))
393
            ->method('acceptSequence')
394
            ->with($schema->getSequence('moo'));
395
396
        $visitor->expects(self::at(4))
397
            ->method('acceptSequence')
398
            ->with($schema->getSequence('war'));
399
400
        $visitor->expects(self::exactly(2))
401
            ->method('acceptSequence');
402
403
        $schema->visit($visitor);
404
    }
405
406
    /**
407
     * @group DBAL-669
408
     */
409
    public function testVisitsNamespaceVisitor() : void
410
    {
411
        $schema  = new Schema();
412
        $visitor = $this->createMock(AbstractVisitor::class);
413
414
        $schema->createNamespace('foo');
415
        $schema->createNamespace('bar');
416
417
        $schema->createTable('baz');
418
        $schema->createTable('bla.bloo');
419
420
        $schema->createSequence('moo');
421
        $schema->createSequence('war');
422
423
        $visitor->expects(self::once())
424
            ->method('acceptSchema')
425
            ->with($schema);
426
427
        $visitor->expects(self::at(1))
428
            ->method('acceptNamespace')
429
            ->with('foo');
430
431
        $visitor->expects(self::at(2))
432
            ->method('acceptNamespace')
433
            ->with('bar');
434
435
        $visitor->expects(self::at(3))
436
            ->method('acceptNamespace')
437
            ->with('bla');
438
439
        $visitor->expects(self::exactly(3))
440
            ->method('acceptNamespace');
441
442
        $visitor->expects(self::at(4))
443
            ->method('acceptTable')
444
            ->with($schema->getTable('baz'));
445
446
        $visitor->expects(self::at(5))
447
            ->method('acceptTable')
448
            ->with($schema->getTable('bla.bloo'));
449
450
        $visitor->expects(self::exactly(2))
451
            ->method('acceptTable');
452
453
        $visitor->expects(self::at(6))
454
            ->method('acceptSequence')
455
            ->with($schema->getSequence('moo'));
456
457
        $visitor->expects(self::at(7))
458
            ->method('acceptSequence')
459
            ->with($schema->getSequence('war'));
460
461
        $visitor->expects(self::exactly(2))
462
            ->method('acceptSequence');
463
464
        $schema->visit($visitor);
465
466
        self::doesNotPerformAssertions(); // FIXME
0 ignored issues
show
Bug Best Practice introduced by
The method PHPUnit\Framework\TestCa...sNotPerformAssertions() is not static, but was called statically. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

466
        self::/** @scrutinizer ignore-call */ 
467
              doesNotPerformAssertions(); // FIXME
Loading history...
467
    }
468
}
469