‪TYPO3CMS  ‪main
ForeignKeyDefinitionTest.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
20 use PHPUnit\Framework\Attributes\DataProvider;
21 use PHPUnit\Framework\Attributes\Test;
27 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
28 
32 final class ‪ForeignKeyDefinitionTest extends UnitTestCase
33 {
42  public static function ‪canParseForeignKeyDefinitionDataProvider(): array
43  {
44  return [
45  // See ReferenceDefinitionTest for actual reference definition parsing tests
46  'FOREIGN KEY (single column)' => [
47  'FOREIGN KEY (`aField`) REFERENCES `bTable` (`bField`)',
48  '',
49  [['aField', 0, null]],
50  'bTable',
51  [['bField', 0, null]],
52  ],
53  'FOREIGN KEY (multiple columns)' => [
54  'FOREIGN KEY (`aField`(20) ASC, `bField`) REFERENCES `bTable` (`cField`, `dField`)',
55  '',
56  [['aField', 20, 'ASC'], ['bField', 0, null]],
57  'bTable',
58  [['cField', 0, null], ['dField', 0, null]],
59  ],
60  'FOREIGN KEY (index name)' => [
61  'FOREIGN KEY `aIndex`(`aField`, `bField`) REFERENCES `bTable` (`cField`(240) DESC, `dField`)',
62  'aIndex',
63  [['aField', 0, null], ['bField', 0, null]],
64  'bTable',
65  [['cField', 240, 'DESC'], ['dField', 0, null]],
66  ],
67  ];
68  }
69 
70  #[DataProvider('canParseForeignKeyDefinitionDataProvider')]
71  #[Test]
73  string $indexDefinition,
74  string $indexName,
75  array $indexColumns,
76  string $foreignTableName,
77  array $foreignTableColumns
78  ): void {
79  $statement = sprintf('CREATE TABLE `aTable`(`aField` INT(11), %s);', $indexDefinition);
80  $subject = $this->‪createSubject($statement);
81 
82  self::assertInstanceOf(CreateForeignKeyDefinitionItem::class, $subject);
83  self::assertSame($indexName, $subject->indexName->schemaObjectName);
84  self::assertSame($foreignTableName, $subject->reference->tableName->schemaObjectName);
85 
86  foreach ($indexColumns as $index => $column) {
87  self::assertSame($column[0], $subject->columnNames[$index]->columnName->schemaObjectName);
88  self::assertSame($column[1], $subject->columnNames[$index]->length);
89  self::assertSame($column[2], $subject->columnNames[$index]->direction);
90  }
91 
92  foreach ($foreignTableColumns as $index => $column) {
93  self::assertSame($column[0], $subject->reference->columnNames[$index]->columnName->schemaObjectName);
94  self::assertSame($column[1], $subject->reference->columnNames[$index]->length);
95  self::assertSame($column[2], $subject->reference->columnNames[$index]->direction);
96  }
97  }
98 
102  private function ‪createSubject(string $statement): ‪AbstractCreateDefinitionItem
103  {
104  ‪$parser = new ‪Parser(new ‪Lexer());
106  $createTableStatement = ‪$parser->getAST($statement);
107  return $createTableStatement->createDefinition->items[1];
108  }
109 }
‪TYPO3\CMS\Core\Tests\Unit\Database\Schema\Parser\ForeignKeyDefinitionTest\canParseForeignKeyDefinition
‪canParseForeignKeyDefinition(string $indexDefinition, string $indexName, array $indexColumns, string $foreignTableName, array $foreignTableColumns)
Definition: ForeignKeyDefinitionTest.php:72
‪TYPO3\CMS\Core\Database\Schema\Parser\AST\CreateTableStatement
Definition: CreateTableStatement.php:26
‪$parser
‪$parser
Definition: annotationChecker.php:103
‪TYPO3\CMS\Core\Database\Schema\Parser\AST\CreateForeignKeyDefinitionItem
Definition: CreateForeignKeyDefinitionItem.php:26
‪TYPO3\CMS\Core\Database\Schema\Parser\Parser
Definition: Parser.php:75
‪TYPO3\CMS\Core\Tests\Unit\Database\Schema\Parser\ForeignKeyDefinitionTest\canParseForeignKeyDefinitionDataProvider
‪static canParseForeignKeyDefinitionDataProvider()
Definition: ForeignKeyDefinitionTest.php:42
‪TYPO3\CMS\Core\Database\Schema\Parser\AST\AbstractCreateDefinitionItem
Definition: AbstractCreateDefinitionItem.php:24
‪TYPO3\CMS\Core\Tests\Unit\Database\Schema\Parser
Definition: AbstractDataTypeBaseTestCase.php:18
‪TYPO3\CMS\Core\Tests\Unit\Database\Schema\Parser\ForeignKeyDefinitionTest
Definition: ForeignKeyDefinitionTest.php:33
‪TYPO3\CMS\Core\Tests\Unit\Database\Schema\Parser\ForeignKeyDefinitionTest\createSubject
‪createSubject(string $statement)
Definition: ForeignKeyDefinitionTest.php:102
‪TYPO3\CMS\Core\Database\Schema\Parser\Lexer
Definition: Lexer.php:26