/** * @param MigrationsMigrateCommand $command */ public function migrationsMigrate(MigrationsMigrateCommand $command) { try { $status = $this->migrator->status(); $nextAvailableVersion = $status->nextAvailableVersion(); if ($nextAvailableVersion !== null) { $command->getIo()->writeLine('Starting migration to version <c2>' . $nextAvailableVersion->__toString() . '</c2>'); $this->migrator->migrate(); $command->getIo()->writeLine('The migration has been <c1>successfully executed</c1>'); } else { $command->getIo()->writeLine('<warn>There is no migration to execute.</warn>'); } } catch (\Exception $e) { $command->getIo()->writeLine('<error>' . $e->getMessage() . '</error>'); } }
/** * Test migrate method. */ public function testMigrate() { $this->migrationsDirectory = __DIR__ . '/../../Fixtures/Migrations'; require_once __DIR__ . '/../../Fixtures/BlogEventSourced.php'; // simulate an application and aggregate version state $currentApplicationVersion = Version::fromString('0.1.0'); $aggregateVersion = Version::fromString('0.1.0'); VersionManager::setCurrentApplicationVersion($currentApplicationVersion); VersionManager::persistVersionOfClass(PostEventSourced::class, $aggregateVersion); VersionManager::persistVersionOfClass(\BlogEventSourced::class, $aggregateVersion); // creating migration store $aggregates = [PostEventSourced::class, \BlogEventSourced::class]; $migratorStore = new InMemoryMigrationStore(); $migratorStore->persist(new Migration($aggregates, $aggregateVersion, new \DateTime())); // creating event store $eventStore = new InMemoryEventStore(); // add the event store flow $postId1 = PostId::fromNative(md5(rand())); $postEventStream1 = new EventStream($this->streamName(PostEventSourced::class), $postId1, [new PostWasCreated($postId1, 'Best restaurants in barcelona', 'empty'), new PostTitleWasChanged($postId1, 'Best cuban restaurants in barcelona')]); $postId2 = PostId::fromNative(md5(rand())); $postEventStream2 = new EventStream($this->streamName(PostEventSourced::class), $postId2, [new PostWasCreated($postId2, 'Best things to do with children in barcelona', 'empty'), new PostTitleWasChanged($postId2, 'Things to do with children in barcelona this weekend')]); $eventStore->persist($postEventStream1, $aggregateVersion, $currentApplicationVersion); $eventStore->persist($postEventStream2, $aggregateVersion, $currentApplicationVersion); // fake BlogEventSourced event stream $postId2 = PostId::fromNative(md5(rand())); $postEventStream2 = new EventStream($this->streamName(\BlogEventSourced::class), $postId2, []); $eventStore->persist($postEventStream2, $aggregateVersion, $currentApplicationVersion); // creating the migrator $migrator = new Migrator($this->getClassMetadataFactory(), $migratorStore, $eventStore, $this->migrationsDirectory); $emptyMigrator = new Migrator($this->getClassMetadataFactory(), $migratorStore, $eventStore, __DIR__ . '/../../Fixtures/EmptyMigrations'); $this->given($result = $emptyMigrator->migrate())->then()->boolean($result)->isFalse(); $this->given($status = $migrator->status())->and($nextVersion = $status->nextAvailableVersion())->then()->boolean($migratorStore->hasMigration($nextVersion))->isFalse()->and()->when($result = $migrator->migrate())->and(VersionManager::setCurrentApplicationVersion($migratorStore->getLast()->version()))->then()->boolean($migratorStore->hasMigration($nextVersion))->isTrue()->boolean($result)->isTrue()->and()->exception(function () use($migrator) { // because the V1_0_0\BlogEventSourcedMigration class return an invalid stream $migrator->migrate(); })->isInstanceOf(\RuntimeException::class); }