Browse Source

add paper:database:sync command to synchronize database with entities

phpdevcommunity 1 month ago
parent
commit
6705582e89

+ 3 - 2
src/Command/DatabaseSyncCommand.php

@@ -2,6 +2,7 @@
 
 namespace PhpDevCommunity\PaperORM\Command;
 
+use PhpDevCommunity\Console\Command\CommandInterface;
 use PhpDevCommunity\Console\InputInterface;
 use PhpDevCommunity\Console\Option\CommandOption;
 use PhpDevCommunity\Console\Output\ConsoleOutput;
@@ -9,7 +10,7 @@ use PhpDevCommunity\Console\OutputInterface;
 use PhpDevCommunity\PaperORM\Migration\PaperMigration;
 use PhpDevCommunity\PaperORM\Tools\EntityExplorer;
 
-class DatabaseSyncCommand
+class DatabaseSyncCommand implements CommandInterface
 {
 
     private PaperMigration $paperMigration;
@@ -43,7 +44,7 @@ class DatabaseSyncCommand
     public function getOptions(): array
     {
         return [
-            new CommandOption('--no-execute', 'n', 'Show the generated SQL statements without executing them.', true)
+            new CommandOption('no-execute', 'n', 'Show the generated SQL statements without executing them.', true)
         ];
     }
 

+ 2 - 0
src/Michel/Package/MichelPaperORMPackage.php

@@ -6,6 +6,7 @@ use LogicException;
 use PhpDevCommunity\Michel\Package\PackageInterface;
 use PhpDevCommunity\PaperORM\Command\DatabaseCreateCommand;
 use PhpDevCommunity\PaperORM\Command\DatabaseDropCommand;
+use PhpDevCommunity\PaperORM\Command\DatabaseSyncCommand;
 use PhpDevCommunity\PaperORM\Command\Migration\MigrationDiffCommand;
 use PhpDevCommunity\PaperORM\Command\Migration\MigrationMigrateCommand;
 use PhpDevCommunity\PaperORM\Command\QueryExecuteCommand;
@@ -88,6 +89,7 @@ class MichelPaperORMPackage implements PackageInterface
         return [
             DatabaseCreateCommand::class,
             DatabaseDropCommand::class,
+            DatabaseSyncCommand::class,
             MigrationDiffCommand::class,
             MigrationMigrateCommand::class,
             QueryExecuteCommand::class,

+ 1 - 0
tests/DatabaseShowTablesCommandTest.php

@@ -5,6 +5,7 @@ namespace Test\PhpDevCommunity\PaperORM;
 use PhpDevCommunity\Console\CommandParser;
 use PhpDevCommunity\Console\CommandRunner;
 use PhpDevCommunity\Console\Output;
+use PhpDevCommunity\PaperORM\Command\DatabaseSyncCommand;
 use PhpDevCommunity\PaperORM\Command\ShowTablesCommand;
 use PhpDevCommunity\PaperORM\EntityManager;
 use PhpDevCommunity\PaperORM\Mapping\Column\BoolColumn;

+ 80 - 0
tests/DatabaseSyncCommandTest.php

@@ -0,0 +1,80 @@
+<?php
+
+namespace Test\PhpDevCommunity\PaperORM;
+
+use PhpDevCommunity\Console\CommandParser;
+use PhpDevCommunity\Console\CommandRunner;
+use PhpDevCommunity\Console\Output;
+use PhpDevCommunity\PaperORM\Command\DatabaseSyncCommand;
+use PhpDevCommunity\PaperORM\Command\ShowTablesCommand;
+use PhpDevCommunity\PaperORM\EntityManager;
+use PhpDevCommunity\PaperORM\Mapping\Column\BoolColumn;
+use PhpDevCommunity\PaperORM\Mapping\Column\IntColumn;
+use PhpDevCommunity\PaperORM\Mapping\Column\JoinColumn;
+use PhpDevCommunity\PaperORM\Mapping\Column\PrimaryKeyColumn;
+use PhpDevCommunity\PaperORM\Mapping\Column\StringColumn;
+use PhpDevCommunity\PaperORM\Migration\PaperMigration;
+use PhpDevCommunity\UniTester\TestCase;
+use Test\PhpDevCommunity\PaperORM\Entity\UserTest;
+use Test\PhpDevCommunity\PaperORM\Helper\DataBaseHelperTest;
+
+class DatabaseSyncCommandTest extends TestCase
+{
+
+    protected function setUp(): void
+    {
+
+    }
+
+    protected function tearDown(): void
+    {
+    }
+
+    protected function execute(): void
+    {
+        foreach (DataBaseHelperTest::drivers() as $params) {
+            $em = new EntityManager($params);
+            $this->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, __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:show:tables', 'post', '--columns']), new Output(function ($message) use(&$out) {
+//            $out[] = $message;
+//        }));
+//
+//        $this->assertEquals(0, $code);
+//        $this->assertEquals(62, count($out));
+
+
+        $platform->dropDatabase();
+    }
+}