Skip to content

Commit

Permalink
Merge pull request #1050 from veewee/diff-on-schema
Browse files Browse the repository at this point in the history
Add a schema_provider option that enables the diff command for DBAL
  • Loading branch information
goetas authored Dec 3, 2020
2 parents ef92f3a + 68fb5b7 commit 2af8596
Show file tree
Hide file tree
Showing 5 changed files with 68 additions and 6 deletions.
19 changes: 17 additions & 2 deletions lib/Doctrine/Migrations/DependencyFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -245,10 +245,25 @@ private function getEmptySchemaProvider(): SchemaProvider
});
}

private function getSchemaProvider(): SchemaProvider
public function hasSchemaProvider(): bool
{
try {
$this->getSchemaProvider();
} catch (MissingDependency $exception) {
return false;
}

return true;
}

public function getSchemaProvider(): SchemaProvider
{
return $this->getDependency(SchemaProvider::class, function (): SchemaProvider {
return new OrmSchemaProvider($this->getEntityManager());
if ($this->hasEntityManager()) {
return new OrmSchemaProvider($this->getEntityManager());
}

throw MissingDependency::noSchemaProvider();
});
}

Expand Down
5 changes: 5 additions & 0 deletions lib/Doctrine/Migrations/Exception/MissingDependency.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,9 @@ public static function noEntityManager(): self
{
return new self('The entity manager is not available.');
}

public static function noSchemaProvider(): self
{
return new self('The schema provider is not available.');
}
}
2 changes: 1 addition & 1 deletion lib/Doctrine/Migrations/Tools/Console/ConsoleRunner.php
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ public static function addCommands(Application $cli, ?DependencyFactory $depende
new ListCommand($dependencyFactory),
]);

if ($dependencyFactory === null || ! $dependencyFactory->hasEntityManager()) {
if ($dependencyFactory === null || ! $dependencyFactory->hasSchemaProvider()) {
return;
}

Expand Down
42 changes: 42 additions & 0 deletions tests/Doctrine/Migrations/Tests/DependencyFactoryTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
use Doctrine\Migrations\Finder\GlobFinder;
use Doctrine\Migrations\Finder\RecursiveRegexFinder;
use Doctrine\Migrations\Metadata\Storage\TableMetadataStorageConfiguration;
use Doctrine\Migrations\Provider\OrmSchemaProvider;
use Doctrine\Migrations\Provider\SchemaProvider;
use Doctrine\ORM\EntityManager;
use PHPUnit\Framework\MockObject\MockObject;
use Psr\Log\LoggerInterface;
Expand Down Expand Up @@ -125,6 +127,46 @@ public function testEntityManager(): void
self::assertTrue($di->isFrozen());
}

public function testNoSchemaProviderRaiseException(): void
{
$di = DependencyFactory::fromConnection(new ExistingConfiguration($this->configuration), new ExistingConnection($this->connection));
self::assertFalse($di->hasSchemaProvider());

$this->expectException(MissingDependency::class);
$di->getSchemaProvider();
}

public function testSchemaProviderFromEntityManager(): void
{
$di = DependencyFactory::fromEntityManager(new ExistingConfiguration($this->configuration), new ExistingEntityManager($this->entityManager));

self::assertTrue($di->hasSchemaProvider());
self::assertEquals(new OrmSchemaProvider($this->entityManager), $di->getSchemaProvider());
self::assertTrue($di->isFrozen());
}

public function testSchemaProviderFromManualService(): void
{
$schemaProvider = $this->createMock(SchemaProvider::class);
$di = DependencyFactory::fromConnection(new ExistingConfiguration($this->configuration), new ExistingConnection($this->connection));
$di->setService(SchemaProvider::class, $schemaProvider);

self::assertTrue($di->hasSchemaProvider());
self::assertSame($schemaProvider, $di->getSchemaProvider());
self::assertFalse($di->isFrozen());
}

public function testProvidedSchemaProviderHasPrecedenceOverProviderFromEntityManagerConfig(): void
{
$schemaProvider = $this->createMock(SchemaProvider::class);
$di = DependencyFactory::fromEntityManager(new ExistingConfiguration($this->configuration), new ExistingEntityManager($this->entityManager));
$di->setService(SchemaProvider::class, $schemaProvider);

self::assertTrue($di->hasSchemaProvider());
self::assertSame($schemaProvider, $di->getSchemaProvider());
self::assertFalse($di->isFrozen());
}

public function testCustomLogger(): void
{
$logger = $this->createMock(LoggerInterface::class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ public function testHasDiffCommand(): void
$dependencyFactory = $this->createMock(DependencyFactory::class);
$dependencyFactory
->expects(self::atLeastOnce())
->method('hasEntityManager')
->method('hasSchemaProvider')
->willReturn(true);

ConsoleRunner::addCommands($this->application, $dependencyFactory);
Expand All @@ -248,12 +248,12 @@ public function testCreateApplication(): void
self::assertCount(12, $commands);
}

public function testCreateApplicationWithEntityManager(): void
public function testCreateApplicationWithSchemaProvider(): void
{
$dependencyFactory = $this->createMock(DependencyFactory::class);
$dependencyFactory
->expects(self::atLeastOnce())
->method('hasEntityManager')
->method('hasSchemaProvider')
->willReturn(true);

$application = ConsoleRunner::createApplication([], $dependencyFactory);
Expand Down

0 comments on commit 2af8596

Please sign in to comment.