Skip to content

Commit

Permalink
Add tests
Browse files Browse the repository at this point in the history
  • Loading branch information
l-vo authored and nicolas-grekas committed Nov 20, 2019
1 parent 09483e1 commit 580f8fb
Show file tree
Hide file tree
Showing 3 changed files with 330 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,36 @@

namespace Doctrine\Tests\ORM\Functional\SchemaTool;

use Doctrine\DBAL\Configuration;
use Doctrine\ORM\Tools\SchemaTool;
use Doctrine\Tests\OrmFunctionalTestCase;
use Doctrine\Tests\Models;
use function array_filter;
use function current;
use function implode;
use function method_exists;
use function sprintf;
use function strpos;

class MySqlSchemaToolTest extends OrmFunctionalTestCase
{
protected function setUp() {
protected function setUp() : void
{
parent::setUp();

if ($this->_em->getConnection()->getDatabasePlatform()->getName() !== 'mysql') {
$this->markTestSkipped('The ' . __CLASS__ .' requires the use of mysql.');
}
}

protected function tearDown() : void
{
$this->_em->getConnection()->exec('DROP TABLE IF EXISTS entity_to_remove');
$this->_em->getConnection()->exec('DROP TABLE IF EXISTS other_entity_to_remove');

parent::tearDown();
}

public function testGetCreateSchemaSql()
{
$classes = [
Expand Down Expand Up @@ -103,6 +118,85 @@ public function testGetCreateSchemaSql4()
$this->assertEquals(0, count($sql));
}

public function testUpdateSchemaSql() : void
{
$classes = [
$this->_em->getClassMetadata(MyEntityToRemove::class),
];
$tool = new SchemaTool($this->_em);
$sqls = $tool->getUpdateSchemaSql($classes);
$sqls = $this->filterSqls($sqls, ['entity_to_remove']);
self::assertCount(1, $sqls);
self::assertContains('CREATE TABLE entity_to_remove (id INT AUTO_INCREMENT NOT NULL, PRIMARY KEY(id))', implode("\n", $sqls));

$this->_em->getConnection()->exec(current($sqls));
$sqls = $tool->getUpdateSchemaSql($classes);
$sqls = $this->filterSqls($sqls, ['entity_to_remove']);
self::assertCount(0, $sqls);

$classes[] = $this->_em->getClassMetadata(MyOtherEntityToRemove::class);
$sqls = $tool->getUpdateSchemaSql($classes);
$sqls = $this->filterSqls($sqls, ['entity_to_remove', 'other_entity_to_remove']);
self::assertCount(1, $sqls);
self::assertContains('CREATE TABLE other_entity_to_remove (id INT AUTO_INCREMENT NOT NULL, PRIMARY KEY(id))', implode("\n", $sqls));
}

public function provideUpdateSchemaSqlWithSchemaAssetFilter() : array
{
return [
['/^(?!entity_to_r)/', null],
[
null,
static function ($assetName) : bool {
return $assetName !== 'entity_to_remove';
},
],
];
}

/**
* @dataProvider provideUpdateSchemaSqlWithSchemaAssetFilter
*/
public function testUpdateSchemaSqlWithSchemaAssetFilter(?string $filterRegex, ?callable $filterCallback) : void
{
if ($filterRegex && ! method_exists(Configuration::class, 'setFilterSchemaAssetsExpression')) {
self::markTestSkipped(sprintf('Test require %s::setFilterSchemaAssetsExpression method', Configuration::class));
}

$classes = [$this->_em->getClassMetadata(MyEntityToRemove::class)];

$tool = new SchemaTool($this->_em);
$tool->createSchema($classes);

$config = $this->_em->getConnection()->getConfiguration();
if ($filterRegex) {
$config->setFilterSchemaAssetsExpression($filterRegex);
} else {
$config->setSchemaAssetsFilter($filterCallback);
}

$sqls = $tool->getUpdateSchemaSql($classes);
$sqls = $this->filterSqls($sqls, ['entity_to_remove']);
self::assertCount(0, $sqls);

if ($filterRegex) {
self::assertEquals($filterRegex, $config->getFilterSchemaAssetsExpression());
} else {
self::assertSame($filterCallback, $config->getSchemaAssetsFilter());
}
}

private function filterSqls(array $sqls, array $needles) : array
{
return array_filter($sqls, static function ($sql) use ($needles) {
foreach ($needles as $needle) {
if (strpos($sql, $needle) !== false) {
return true;
}
}
return false;
});
}
}

/**
Expand All @@ -115,3 +209,28 @@ class MysqlSchemaNamespacedEntity
public $id;
}

/**
* @Entity
* @Table(name="entity_to_remove")
*/
class MyEntityToRemove
{
/**
* @Id @Column(type="integer")
* @GeneratedValue(strategy="AUTO")
*/
public $id;
}

/**
* @Entity
* @Table(name="other_entity_to_remove")
*/
class MyOtherEntityToRemove
{
/**
* @Id @Column(type="integer")
* @GeneratedValue(strategy="AUTO")
*/
public $id;
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,14 @@

namespace Doctrine\Tests\ORM\Functional\SchemaTool;

use Doctrine\DBAL\Configuration;
use Doctrine\ORM\Tools\SchemaTool;
use Doctrine\Tests\Models;
use Doctrine\Tests\OrmFunctionalTestCase;
use function array_filter;
use function method_exists;
use function sprintf;
use function strpos;

class PostgreSqlSchemaToolTest extends OrmFunctionalTestCase
{
Expand All @@ -17,6 +22,14 @@ protected function setUp()
}
}

protected function tearDown() : void
{
$this->_em->getConnection()->exec('DROP TABLE IF EXISTS pg_entity_to_remove');
$this->_em->getConnection()->exec('DROP SEQUENCE IF EXISTS pg_entity_to_remove_id_seq');

parent::tearDown();
}

public function testPostgresMetadataSequenceIncrementedBy10()
{
$address = $this->_em->getClassMetadata(Models\CMS\CmsAddress::class);
Expand Down Expand Up @@ -133,6 +146,53 @@ public function testUpdateSchemaWithPostgreSQLSchema()

$this->assertCount(0, $sql, implode("\n", $sql));
}

public function provideUpdateSchemaSqlWithSchemaAssetFilter() : array
{
return [
['/^(?!pg_entity_to_r)/', null],
[
null,
static function ($assetName) : bool {
return $assetName !== 'pg_entity_to_remove';
},
],
];
}

/**
* @dataProvider provideUpdateSchemaSqlWithSchemaAssetFilter
*/
public function testUpdateSchemaSqlWithSchemaAssetFilter(?string $filterRegex, ?callable $filterCallback) : void
{
if ($filterRegex && ! method_exists(Configuration::class, 'setFilterSchemaAssetsExpression')) {
self::markTestSkipped(sprintf('Test require %s::setFilterSchemaAssetsExpression method', Configuration::class));
}

$classes = [$this->_em->getClassMetadata(PgMyEntityToRemove::class)];

$tool = new SchemaTool($this->_em);
$tool->createSchema($classes);

$config = $this->_em->getConnection()->getConfiguration();
if ($filterRegex) {
$config->setFilterSchemaAssetsExpression($filterRegex);
} else {
$config->setSchemaAssetsFilter($filterCallback);
}

$sqls = $tool->getUpdateSchemaSql($classes);
$sqls = array_filter($sqls, static function ($sql) {
return strpos($sql, 'pg_entity_to_remove') !== false;
});
self::assertCount(0, $sqls);

if ($filterRegex) {
self::assertEquals($filterRegex, $config->getFilterSchemaAssetsExpression());
} else {
self::assertSame($filterCallback, $config->getSchemaAssetsFilter());
}
}
}

/**
Expand Down Expand Up @@ -201,3 +261,16 @@ class DDC1657Avatar
*/
private $pk;
}

/**
* @Entity
* @Table(name="pg_entity_to_remove")
*/
class PgMyEntityToRemove
{
/**
* @Id @Column(type="integer")
* @GeneratedValue(strategy="AUTO")
*/
public $id;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
<?php

declare(strict_types=1);

namespace Doctrine\Tests\ORM\Functional\SchemaTool;

use Doctrine\DBAL\Configuration;
use Doctrine\ORM\Tools\SchemaTool;
use Doctrine\Tests\OrmFunctionalTestCase;
use function array_filter;
use function current;
use function method_exists;
use function sprintf;
use function strpos;

class SqliteSchemaToolTest extends OrmFunctionalTestCase
{
protected function setUp() : void
{
parent::setUp();

if ($this->_em->getConnection()->getDatabasePlatform()->getName() !== 'sqlite') {
$this->markTestSkipped('The ' . self::class . ' requires the use of sqlite.');
}
}

protected function tearDown() : void
{
$this->_em->getConnection()->exec('DROP TABLE IF EXISTS my_entity');
$this->_em->getConnection()->exec('DROP TABLE IF EXISTS my_other_entity');

parent::tearDown();
}

private function filterCreateTable(array $sqls, string $tableName) : array
{
return array_filter($sqls, static function (string $sql) use ($tableName) : bool {
return strpos($sql, sprintf('CREATE TABLE %s (', $tableName)) === 0;
});
}

public function testUpdateSchemaSql() : void
{
$classes = [
$this->_em->getClassMetadata(MyEntity::class),
];
$tool = new SchemaTool($this->_em);
$sqls = $tool->getUpdateSchemaSql($classes);
$sqls = $this->filterCreateTable($sqls, 'my_entity');
$this->assertCount(1, $sqls);

$this->_em->getConnection()->exec(current($sqls));
$sqls = $tool->getUpdateSchemaSql($classes);
$sqls = array_filter($sqls, static function (string $sql) : bool {
return (bool) strpos($sql, 'my_entity');
});
$this->assertCount(0, $sqls);

$classes[] = $this->_em->getClassMetadata(MyOtherEntity::class);
$sqls = $tool->getUpdateSchemaSql($classes);
self::assertCount(0, $this->filterCreateTable($sqls, 'my_entity'));
self::assertCount(1, $this->filterCreateTable($sqls, 'my_other_entity'));
}

public function provideUpdateSchemaSqlWithSchemaAssetFilter() : array
{
return [
['/^(?!my_enti)/', null],
[
null,
static function ($assetName) : bool {
return $assetName !== 'my_entity';
},
],
];
}

/**
* @dataProvider provideUpdateSchemaSqlWithSchemaAssetFilter
*/
public function testUpdateSchemaSqlWithSchemaAssetFilter(?string $filterRegex, ?callable $filterCallback) : void
{
if ($filterRegex && ! method_exists(Configuration::class, 'setFilterSchemaAssetsExpression')) {
self::markTestSkipped(sprintf('Test require %s::setFilterSchemaAssetsExpression method', Configuration::class));
}

$classes = [$this->_em->getClassMetadata(MyEntity::class)];

$tool = new SchemaTool($this->_em);
$tool->createSchema($classes);

$config = $this->_em->getConnection()->getConfiguration();
if ($filterRegex) {
$config->setFilterSchemaAssetsExpression($filterRegex);
} else {
$config->setSchemaAssetsFilter($filterCallback);
}

$sqls = $tool->getUpdateSchemaSql($classes);
$sqls = array_filter($sqls, static function (string $sql) : bool {
return (bool) strpos($sql, 'my_entity');
});
self::assertCount(0, $sqls);

if ($filterRegex) {
self::assertEquals($filterRegex, $config->getFilterSchemaAssetsExpression());
} else {
self::assertSame($filterCallback, $config->getSchemaAssetsFilter());
}
}
}

/**
* @Entity
* @Table(name="my_entity")
*/
class MyEntity
{
/**
* @Id @Column(type="integer")
* @GeneratedValue(strategy="AUTO")
*/
public $id;
}

/**
* @Entity
* @Table(name="my_other_entity")
*/
class MyOtherEntity
{
/**
* @Id @Column(type="integer")
* @GeneratedValue(strategy="AUTO")
*/
public $id;
}

0 comments on commit 580f8fb

Please sign in to comment.