executeTest($em); $em->getConnection()->close(); } } private function executeTest(EntityManager $em) { $platform = $em->getPlatform(); $platform->createDatabaseIfNotExists(); $platform->dropDatabase(); $platform->createDatabaseIfNotExists(); $paperMigration = PaperMigration::create($em, 'mig_versions', __DIR__ . '/migrations'); $runner = new CommandRunner([ new DatabaseSyncCommand($paperMigration, EntityDirCollector::bootstrap([__DIR__ . '/Entity']), 'test'), ]); $out = []; $code = $runner->run(new CommandParser(['', 'paper:database:sync', '--no-execute']), new Output(function ($message) use(&$out) { $out[] = $message; })); $this->assertEquals(0, $code); $this->assertStringContains( implode(' ', $out), "[INFO] Preview mode only — SQL statements were displayed but NOT executed."); $out = []; $code = $runner->run(new CommandParser(['', 'paper:database:sync']), new Output(function ($message) use(&$out) { $out[] = $message; })); $this->assertEquals(0, $code); $this->assertStringContains( implode(' ', $out), "✔ Executed:"); $out = []; $code = $runner->run(new CommandParser(['', 'paper:database:sync']), new Output(function ($message) use(&$out) { $out[] = $message; })); $this->assertEquals(0, $code); $this->assertStringContains( implode(' ', $out), "No differences detected — all entities are already in sync with the database schema."); $platform->dropDatabase(); } }