2009-12-05 00:40:03 +03:00
< ? php
namespace Doctrine\Tests\ORM\Functional ;
require_once __DIR__ . '/../../TestInit.php' ;
2010-05-25 21:35:12 +04:00
use Doctrine\ORM\Mapping\ClassMetadataInfo ,
Doctrine\Common\Util\Inflector ;
2009-12-05 00:40:03 +03:00
class DatabaseDriverTest extends \Doctrine\Tests\OrmFunctionalTestCase
{
2009-12-05 00:58:16 +03:00
/**
* @ var \Doctrine\DBAL\Schema\AbstractSchemaManager
*/
2009-12-05 00:40:03 +03:00
protected $_sm = null ;
2009-12-05 00:58:16 +03:00
public function setUp ()
{
2010-06-20 21:34:09 +04:00
$this -> useModelSet ( 'cms' );
2009-12-05 00:58:16 +03:00
parent :: setUp ();
$this -> _sm = $this -> _em -> getConnection () -> getSchemaManager ();
}
2010-06-13 21:36:49 +04:00
public function testLoadMetadataFromDatabase ()
2009-12-05 00:40:03 +03:00
{
2010-02-07 15:36:30 +03:00
if ( ! $this -> _em -> getConnection () -> getDatabasePlatform () -> supportsForeignKeyConstraints ()) {
$this -> markTestSkipped ( 'Platform does not support foreign keys.' );
}
2009-12-05 00:40:03 +03:00
$table = new \Doctrine\DBAL\Schema\Table ( " dbdriver_foo " );
2010-02-26 00:51:30 +03:00
$table -> addColumn ( 'id' , 'integer' );
2009-12-05 00:40:03 +03:00
$table -> setPrimaryKey ( array ( 'id' ));
2010-05-25 21:35:12 +04:00
$table -> addColumn ( 'bar' , 'string' , array ( 'notnull' => false , 'length' => 200 ));
2009-12-05 00:40:03 +03:00
$this -> _sm -> dropAndCreateTable ( $table );
2010-06-13 21:36:49 +04:00
$metadatas = $this -> extractClassMetadata ( array ( " DbdriverFoo " ));
2010-06-20 21:34:09 +04:00
$this -> assertArrayHasKey ( 'DbdriverFoo' , $metadatas );
$metadata = $metadatas [ 'DbdriverFoo' ];
2009-12-05 12:39:11 +03:00
$this -> assertArrayHasKey ( 'id' , $metadata -> fieldMappings );
$this -> assertEquals ( 'id' , $metadata -> fieldMappings [ 'id' ][ 'fieldName' ]);
$this -> assertEquals ( 'id' , strtolower ( $metadata -> fieldMappings [ 'id' ][ 'columnName' ]));
$this -> assertEquals ( 'integer' , ( string ) $metadata -> fieldMappings [ 'id' ][ 'type' ]);
$this -> assertArrayHasKey ( 'bar' , $metadata -> fieldMappings );
$this -> assertEquals ( 'bar' , $metadata -> fieldMappings [ 'bar' ][ 'fieldName' ]);
$this -> assertEquals ( 'bar' , strtolower ( $metadata -> fieldMappings [ 'bar' ][ 'columnName' ]));
$this -> assertEquals ( 'string' , ( string ) $metadata -> fieldMappings [ 'bar' ][ 'type' ]);
$this -> assertEquals ( 200 , $metadata -> fieldMappings [ 'bar' ][ 'length' ]);
2010-05-25 21:35:12 +04:00
$this -> assertTrue ( $metadata -> fieldMappings [ 'bar' ][ 'nullable' ]);
2009-12-05 00:40:03 +03:00
}
2010-06-13 21:36:49 +04:00
public function testLoadMetadataWithForeignKeyFromDatabase ()
2009-12-05 00:40:03 +03:00
{
if ( ! $this -> _em -> getConnection () -> getDatabasePlatform () -> supportsForeignKeyConstraints ()) {
$this -> markTestSkipped ( 'Platform does not support foreign keys.' );
}
$tableB = new \Doctrine\DBAL\Schema\Table ( " dbdriver_bar " );
2010-02-26 00:51:30 +03:00
$tableB -> addColumn ( 'id' , 'integer' );
2009-12-05 00:40:03 +03:00
$tableB -> setPrimaryKey ( array ( 'id' ));
2009-12-05 12:39:11 +03:00
$this -> _sm -> dropAndCreateTable ( $tableB );
2009-12-05 00:40:03 +03:00
$tableA = new \Doctrine\DBAL\Schema\Table ( " dbdriver_baz " );
2010-02-26 00:51:30 +03:00
$tableA -> addColumn ( 'id' , 'integer' );
2009-12-05 00:40:03 +03:00
$tableA -> setPrimaryKey ( array ( 'id' ));
2010-02-26 00:51:30 +03:00
$tableA -> addColumn ( 'bar_id' , 'integer' );
2009-12-05 00:40:03 +03:00
$tableA -> addForeignKeyConstraint ( 'dbdriver_bar' , array ( 'bar_id' ), array ( 'id' ));
$this -> _sm -> dropAndCreateTable ( $tableA );
2010-06-13 21:36:49 +04:00
$metadatas = $this -> extractClassMetadata ( array ( " DbdriverBar " , " DbdriverBaz " ));
2010-06-20 21:34:09 +04:00
$this -> assertArrayHasKey ( 'DbdriverBaz' , $metadatas );
$bazMetadata = $metadatas [ 'DbdriverBaz' ];
2009-12-05 12:39:11 +03:00
2010-06-13 21:36:49 +04:00
$this -> assertArrayNotHasKey ( 'barId' , $bazMetadata -> fieldMappings , " The foreign Key field should not be inflected as 'barId' field, its an association. " );
$this -> assertArrayHasKey ( 'id' , $bazMetadata -> fieldMappings );
2009-12-05 12:39:11 +03:00
2010-06-13 21:36:49 +04:00
$bazMetadata -> associationMappings = \array_change_key_case ( $bazMetadata -> associationMappings , \CASE_LOWER );
2009-12-05 12:39:11 +03:00
2010-06-13 21:36:49 +04:00
$this -> assertArrayHasKey ( 'bar' , $bazMetadata -> associationMappings );
2010-08-09 15:13:21 +04:00
$this -> assertEquals ( ClassMetadataInfo :: MANY_TO_ONE , $bazMetadata -> associationMappings [ 'bar' ][ 'type' ]);
2009-12-05 12:39:11 +03:00
}
2010-06-20 21:34:09 +04:00
public function testDetectManyToManyTables ()
{
if ( ! $this -> _em -> getConnection () -> getDatabasePlatform () -> supportsForeignKeyConstraints ()) {
$this -> markTestSkipped ( 'Platform does not support foreign keys.' );
}
$metadatas = $this -> extractClassMetadata ( array ( " CmsUsers " , " CmsGroups " ));
$this -> assertArrayHasKey ( 'CmsUsers' , $metadatas , 'CmsUsers entity was not detected.' );
$this -> assertArrayHasKey ( 'CmsGroups' , $metadatas , 'CmsGroups entity was not detected.' );
2011-10-24 00:06:03 +04:00
$this -> assertEquals ( 2 , count ( $metadatas [ 'CmsUsers' ] -> associationMappings ));
2010-06-20 21:34:09 +04:00
$this -> assertArrayHasKey ( 'group' , $metadatas [ 'CmsUsers' ] -> associationMappings );
$this -> assertEquals ( 1 , count ( $metadatas [ 'CmsGroups' ] -> associationMappings ));
$this -> assertArrayHasKey ( 'user' , $metadatas [ 'CmsGroups' ] -> associationMappings );
}
2011-04-30 13:15:45 +04:00
public function testIgnoreManyToManyTableWithoutFurtherForeignKeyDetails ()
{
$tableB = new \Doctrine\DBAL\Schema\Table ( " dbdriver_bar " );
$tableB -> addColumn ( 'id' , 'integer' );
$tableB -> setPrimaryKey ( array ( 'id' ));
$tableA = new \Doctrine\DBAL\Schema\Table ( " dbdriver_baz " );
$tableA -> addColumn ( 'id' , 'integer' );
$tableA -> setPrimaryKey ( array ( 'id' ));
$tableMany = new \Doctrine\DBAL\Schema\Table ( " dbdriver_bar_baz " );
$tableMany -> addColumn ( 'bar_id' , 'integer' );
$tableMany -> addColumn ( 'baz_id' , 'integer' );
$tableMany -> addForeignKeyConstraint ( 'dbdriver_bar' , array ( 'bar_id' ), array ( 'id' ));
$metadatas = $this -> convertToClassMetadata ( array ( $tableA , $tableB ), array ( $tableMany ));
$this -> assertEquals ( 0 , count ( $metadatas [ 'DbdriverBaz' ] -> associationMappings ), " no association mappings should be detected. " );
}
protected function convertToClassMetadata ( array $entityTables , array $manyTables = array ())
{
$driver = new \Doctrine\ORM\Mapping\Driver\DatabaseDriver ( $this -> _sm );
$driver -> setTables ( $entityTables , $manyTables );
$metadatas = array ();
foreach ( $driver -> getAllClassNames () AS $className ) {
$class = new ClassMetadataInfo ( $className );
$driver -> loadMetadataForClass ( $className , $class );
$metadatas [ $className ] = $class ;
}
return $metadatas ;
}
2010-06-20 21:34:09 +04:00
2009-12-05 12:39:11 +03:00
/**
* @ param string $className
* @ return ClassMetadata
*/
2010-06-13 21:36:49 +04:00
protected function extractClassMetadata ( array $classNames )
2009-12-05 12:39:11 +03:00
{
2010-06-13 21:36:49 +04:00
$classNames = array_map ( 'strtolower' , $classNames );
$metadatas = array ();
2010-04-14 18:31:50 +04:00
$driver = new \Doctrine\ORM\Mapping\Driver\DatabaseDriver ( $this -> _sm );
2010-06-20 21:34:09 +04:00
foreach ( $driver -> getAllClassNames () as $className ) {
if ( ! in_array ( strtolower ( $className ), $classNames )) {
2010-05-25 21:35:12 +04:00
continue ;
2009-12-05 12:39:11 +03:00
}
2010-06-20 21:34:09 +04:00
$class = new ClassMetadataInfo ( $className );
$driver -> loadMetadataForClass ( $className , $class );
$metadatas [ $className ] = $class ;
2009-12-05 12:39:11 +03:00
}
2010-06-13 21:36:49 +04:00
if ( count ( $metadatas ) != count ( $classNames )) {
$this -> fail ( " Have not found all classes matching the names ' " . implode ( " , " , $classNames ) . " ' only tables " . implode ( " , " , array_keys ( $metadatas )));
}
return $metadatas ;
2009-12-05 00:40:03 +03:00
}
}