PageRenderTime 61ms CodeModel.GetById 32ms RepoModel.GetById 0ms app.codeStats 0ms

/tests/Doctrine/Tests/ORM/Functional/DatabaseDriverTest.php

https://github.com/doctrine/doctrine2
PHP | 239 lines | 177 code | 56 blank | 6 comment | 9 complexity | 918555dd6f667dca5f39f03e1f9fb438 MD5 | raw file
Possible License(s): Unlicense
  1. <?php
  2. declare(strict_types=1);
  3. namespace Doctrine\Tests\ORM\Functional;
  4. use Doctrine\DBAL\Platforms\AbstractPlatform;
  5. use Doctrine\DBAL\Platforms\PostgreSQL94Platform;
  6. use Doctrine\DBAL\Platforms\PostgreSQLPlatform;
  7. use Doctrine\DBAL\Platforms\SQLServer2012Platform;
  8. use Doctrine\DBAL\Platforms\SQLServerPlatform;
  9. use Doctrine\DBAL\Schema\AbstractSchemaManager;
  10. use Doctrine\DBAL\Schema\Table;
  11. use Doctrine\ORM\Mapping\ClassMetadataInfo;
  12. use function array_change_key_case;
  13. use function count;
  14. use function strtolower;
  15. use const CASE_LOWER;
  16. class DatabaseDriverTest extends DatabaseDriverTestCase
  17. {
  18. /** @var AbstractSchemaManager */
  19. protected $schemaManager = null;
  20. protected function setUp(): void
  21. {
  22. $this->useModelSet('cms');
  23. parent::setUp();
  24. $this->schemaManager = $this->createSchemaManager();
  25. }
  26. /**
  27. * @group DDC-2059
  28. */
  29. public function testIssue2059(): void
  30. {
  31. if (! $this->_em->getConnection()->getDatabasePlatform()->supportsForeignKeyConstraints()) {
  32. self::markTestSkipped('Platform does not support foreign keys.');
  33. }
  34. $user = new Table('ddc2059_user');
  35. $user->addColumn('id', 'integer');
  36. $user->setPrimaryKey(['id']);
  37. $project = new Table('ddc2059_project');
  38. $project->addColumn('id', 'integer');
  39. $project->addColumn('user_id', 'integer');
  40. $project->addColumn('user', 'string');
  41. $project->setPrimaryKey(['id']);
  42. $project->addForeignKeyConstraint('ddc2059_user', ['user_id'], ['id']);
  43. $metadata = $this->convertToClassMetadata([$project, $user], []);
  44. self::assertTrue(isset($metadata['Ddc2059Project']->fieldMappings['user']));
  45. self::assertTrue(isset($metadata['Ddc2059Project']->associationMappings['user2']));
  46. }
  47. public function testLoadMetadataFromDatabase(): void
  48. {
  49. if (! $this->_em->getConnection()->getDatabasePlatform()->supportsForeignKeyConstraints()) {
  50. self::markTestSkipped('Platform does not support foreign keys.');
  51. }
  52. $table = new Table('dbdriver_foo');
  53. $table->addColumn('id', 'integer');
  54. $table->setPrimaryKey(['id']);
  55. $table->addColumn('bar', 'string', ['notnull' => false, 'length' => 200]);
  56. $this->schemaManager->dropAndCreateTable($table);
  57. $metadatas = $this->extractClassMetadata(['DbdriverFoo']);
  58. self::assertArrayHasKey('DbdriverFoo', $metadatas);
  59. $metadata = $metadatas['DbdriverFoo'];
  60. self::assertArrayHasKey('id', $metadata->fieldMappings);
  61. self::assertEquals('id', $metadata->fieldMappings['id']['fieldName']);
  62. self::assertEquals('id', strtolower($metadata->fieldMappings['id']['columnName']));
  63. self::assertEquals('integer', (string) $metadata->fieldMappings['id']['type']);
  64. self::assertArrayHasKey('bar', $metadata->fieldMappings);
  65. self::assertEquals('bar', $metadata->fieldMappings['bar']['fieldName']);
  66. self::assertEquals('bar', strtolower($metadata->fieldMappings['bar']['columnName']));
  67. self::assertEquals('string', (string) $metadata->fieldMappings['bar']['type']);
  68. self::assertEquals(200, $metadata->fieldMappings['bar']['length']);
  69. self::assertTrue($metadata->fieldMappings['bar']['nullable']);
  70. }
  71. public function testLoadMetadataWithForeignKeyFromDatabase(): void
  72. {
  73. if (! $this->_em->getConnection()->getDatabasePlatform()->supportsForeignKeyConstraints()) {
  74. self::markTestSkipped('Platform does not support foreign keys.');
  75. }
  76. $tableB = new Table('dbdriver_bar');
  77. $tableB->addColumn('id', 'integer');
  78. $tableB->setPrimaryKey(['id']);
  79. $this->schemaManager->dropAndCreateTable($tableB);
  80. $tableA = new Table('dbdriver_baz');
  81. $tableA->addColumn('id', 'integer');
  82. $tableA->setPrimaryKey(['id']);
  83. $tableA->addColumn('bar_id', 'integer');
  84. $tableA->addForeignKeyConstraint('dbdriver_bar', ['bar_id'], ['id']);
  85. $this->schemaManager->dropAndCreateTable($tableA);
  86. $metadatas = $this->extractClassMetadata(['DbdriverBar', 'DbdriverBaz']);
  87. self::assertArrayHasKey('DbdriverBaz', $metadatas);
  88. $bazMetadata = $metadatas['DbdriverBaz'];
  89. self::assertArrayNotHasKey('barId', $bazMetadata->fieldMappings, "The foreign Key field should not be inflected as 'barId' field, its an association.");
  90. self::assertArrayHasKey('id', $bazMetadata->fieldMappings);
  91. $bazMetadata->associationMappings = array_change_key_case($bazMetadata->associationMappings, CASE_LOWER);
  92. self::assertArrayHasKey('bar', $bazMetadata->associationMappings);
  93. self::assertEquals(ClassMetadataInfo::MANY_TO_ONE, $bazMetadata->associationMappings['bar']['type']);
  94. }
  95. public function testDetectManyToManyTables(): void
  96. {
  97. if (! $this->_em->getConnection()->getDatabasePlatform()->supportsForeignKeyConstraints()) {
  98. self::markTestSkipped('Platform does not support foreign keys.');
  99. }
  100. $metadatas = $this->extractClassMetadata(['CmsUsers', 'CmsGroups', 'CmsTags']);
  101. self::assertArrayHasKey('CmsUsers', $metadatas, 'CmsUsers entity was not detected.');
  102. self::assertArrayHasKey('CmsGroups', $metadatas, 'CmsGroups entity was not detected.');
  103. self::assertArrayHasKey('CmsTags', $metadatas, 'CmsTags entity was not detected.');
  104. self::assertEquals(3, count($metadatas['CmsUsers']->associationMappings));
  105. self::assertArrayHasKey('group', $metadatas['CmsUsers']->associationMappings);
  106. self::assertEquals(1, count($metadatas['CmsGroups']->associationMappings));
  107. self::assertArrayHasKey('user', $metadatas['CmsGroups']->associationMappings);
  108. self::assertEquals(1, count($metadatas['CmsTags']->associationMappings));
  109. self::assertArrayHasKey('user', $metadatas['CmsGroups']->associationMappings);
  110. }
  111. public function testIgnoreManyToManyTableWithoutFurtherForeignKeyDetails(): void
  112. {
  113. $tableB = new Table('dbdriver_bar');
  114. $tableB->addColumn('id', 'integer');
  115. $tableB->setPrimaryKey(['id']);
  116. $tableA = new Table('dbdriver_baz');
  117. $tableA->addColumn('id', 'integer');
  118. $tableA->setPrimaryKey(['id']);
  119. $tableMany = new Table('dbdriver_bar_baz');
  120. $tableMany->addColumn('bar_id', 'integer');
  121. $tableMany->addColumn('baz_id', 'integer');
  122. $tableMany->addForeignKeyConstraint('dbdriver_bar', ['bar_id'], ['id']);
  123. $metadatas = $this->convertToClassMetadata([$tableA, $tableB], [$tableMany]);
  124. self::assertEquals(0, count($metadatas['DbdriverBaz']->associationMappings), 'no association mappings should be detected.');
  125. }
  126. public function testLoadMetadataFromDatabaseDetail(): void
  127. {
  128. if (! $this->_em->getConnection()->getDatabasePlatform()->supportsForeignKeyConstraints()) {
  129. self::markTestSkipped('Platform does not support foreign keys.');
  130. }
  131. $table = new Table('dbdriver_foo');
  132. $table->addColumn('id', 'integer', ['unsigned' => true]);
  133. $table->setPrimaryKey(['id']);
  134. $table->addColumn('column_unsigned', 'integer', ['unsigned' => true]);
  135. $table->addColumn('column_comment', 'string', ['comment' => 'test_comment']);
  136. $table->addColumn('column_default', 'string', ['default' => 'test_default']);
  137. $table->addColumn('column_decimal', 'decimal', ['precision' => 4, 'scale' => 3]);
  138. $table->addColumn('column_index1', 'string');
  139. $table->addColumn('column_index2', 'string');
  140. $table->addIndex(['column_index1', 'column_index2'], 'index1');
  141. $table->addColumn('column_unique_index1', 'string');
  142. $table->addColumn('column_unique_index2', 'string');
  143. $table->addUniqueIndex(['column_unique_index1', 'column_unique_index2'], 'unique_index1');
  144. $this->schemaManager->dropAndCreateTable($table);
  145. $metadatas = $this->extractClassMetadata(['DbdriverFoo']);
  146. self::assertArrayHasKey('DbdriverFoo', $metadatas);
  147. $metadata = $metadatas['DbdriverFoo'];
  148. self::assertArrayHasKey('id', $metadata->fieldMappings);
  149. self::assertEquals('id', $metadata->fieldMappings['id']['fieldName']);
  150. self::assertEquals('id', strtolower($metadata->fieldMappings['id']['columnName']));
  151. self::assertEquals('integer', (string) $metadata->fieldMappings['id']['type']);
  152. if (self::supportsUnsignedInteger($this->_em->getConnection()->getDatabasePlatform())) {
  153. self::assertArrayHasKey('columnUnsigned', $metadata->fieldMappings);
  154. self::assertTrue($metadata->fieldMappings['columnUnsigned']['options']['unsigned']);
  155. }
  156. self::assertArrayHasKey('columnComment', $metadata->fieldMappings);
  157. self::assertEquals('test_comment', $metadata->fieldMappings['columnComment']['options']['comment']);
  158. self::assertArrayHasKey('columnDefault', $metadata->fieldMappings);
  159. self::assertEquals('test_default', $metadata->fieldMappings['columnDefault']['options']['default']);
  160. self::assertArrayHasKey('columnDecimal', $metadata->fieldMappings);
  161. self::assertEquals(4, $metadata->fieldMappings['columnDecimal']['precision']);
  162. self::assertEquals(3, $metadata->fieldMappings['columnDecimal']['scale']);
  163. self::assertNotEmpty($metadata->table['indexes']['index1']['columns']);
  164. self::assertEquals(
  165. ['column_index1', 'column_index2'],
  166. $metadata->table['indexes']['index1']['columns']
  167. );
  168. self::assertNotEmpty($metadata->table['uniqueConstraints']['unique_index1']['columns']);
  169. self::assertEquals(
  170. ['column_unique_index1', 'column_unique_index2'],
  171. $metadata->table['uniqueConstraints']['unique_index1']['columns']
  172. );
  173. }
  174. private static function supportsUnsignedInteger(AbstractPlatform $platform): bool
  175. {
  176. // FIXME: Condition here is fugly.
  177. // NOTE: PostgreSQL and SQL SERVER do not support UNSIGNED integer
  178. return ! $platform instanceof SQLServer2012Platform
  179. && ! $platform instanceof SQLServerPlatform
  180. && ! $platform instanceof PostgreSQL94Platform
  181. && ! $platform instanceof PostgreSQLPlatform;
  182. }
  183. }