diff --git a/application/Espo/Core/Upgrades/Migration/ExtractedStepsProvider.php b/application/Espo/Core/Upgrades/Migration/ExtractedStepsProvider.php new file mode 100644 index 0000000000..7f05cc1cd0 --- /dev/null +++ b/application/Espo/Core/Upgrades/Migration/ExtractedStepsProvider.php @@ -0,0 +1,53 @@ +. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU Affero General Public License version 3. + * + * In accordance with Section 7(b) of the GNU Affero General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. + ************************************************************************/ + +namespace Espo\Core\Upgrades\Migration; + +class ExtractedStepsProvider +{ + public function __construct( + private StepsProvider $stepsProvider + ) {} + + /** + * @return string[] + */ + public function getAfterUpgrade(string $version, string $targetVersion): array + { + return VersionUtil::extractSteps($version, $targetVersion, $this->stepsProvider->getAfterUpgrade()); + } + + /** + * @return string[] + */ + public function getPrepare(string $version, string $targetVersion): array + { + return VersionUtil::extractSteps($version, $targetVersion, $this->stepsProvider->getPrepare()); + } +} diff --git a/application/Espo/Core/Upgrades/Migration/Runner.php b/application/Espo/Core/Upgrades/Migration/Runner.php index 962c045cdf..0bb5229621 100644 --- a/application/Espo/Core/Upgrades/Migration/Runner.php +++ b/application/Espo/Core/Upgrades/Migration/Runner.php @@ -39,7 +39,7 @@ use RuntimeException; class Runner { public function __construct( - private StepsProvider $stepsProvider, + private ExtractedStepsProvider $stepsProvider, private VersionDataProvider $versionDataProvider, private StepRunner $stepRunner, private DataManager $dataManager, @@ -56,7 +56,7 @@ class Runner $version = $this->versionDataProvider->getPreviousVersion(); $targetVersion = $this->versionDataProvider->getTargetVersion(); - $prepareSteps = VersionUtil::extractSteps($version, $targetVersion, $this->stepsProvider->getPrepare()); + $prepareSteps = $this->stepsProvider->getPrepare($version, $targetVersion); if ($prepareSteps !== []) { $io->write(" Running prepare migrations..."); @@ -66,7 +66,7 @@ class Runner } } - $afterSteps = VersionUtil::extractSteps($version, $targetVersion, $this->stepsProvider->getAfterUpgrade()); + $afterSteps = $this->stepsProvider->getAfterUpgrade($version, $targetVersion); if ($afterSteps === []) { $io->writeLine(" No migrations to run."); diff --git a/tests/unit/Espo/Core/Upgrades/Migration/RunnerTest.php b/tests/unit/Espo/Core/Upgrades/Migration/RunnerTest.php new file mode 100644 index 0000000000..75c9f58c4b --- /dev/null +++ b/tests/unit/Espo/Core/Upgrades/Migration/RunnerTest.php @@ -0,0 +1,117 @@ +. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU Affero General Public License version 3. + * + * In accordance with Section 7(b) of the GNU Affero General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. + ************************************************************************/ + +namespace tests\unit\Espo\Core\Upgrades\Migration; + +use Espo\Core\Console\IO; +use Espo\Core\DataManager; +use Espo\Core\Upgrades\Migration\ExtractedStepsProvider; +use Espo\Core\Upgrades\Migration\Runner; +use Espo\Core\Upgrades\Migration\StepRunner; +use Espo\Core\Upgrades\Migration\VersionDataProvider; +use Espo\Core\Utils\Config\ConfigWriter; +use PHPUnit\Framework\TestCase; + +class RunnerTest extends TestCase +{ + protected ?IO $io = null; + + protected ?ExtractedStepsProvider $stepsProvider = null; + protected ?VersionDataProvider $versionDataProvider; + protected ?StepRunner $stepsRunner = null; + protected ?DataManager $dataManager = null; + protected ?ConfigWriter $configWriter = null; + + protected function setUp(): void + { + $this->io = $this->createMock(IO::class); + + $this->stepsProvider = $this->createMock(ExtractedStepsProvider::class); + $this->versionDataProvider = $this->createMock(VersionDataProvider::class); + $this->stepsRunner = $this->createMock(StepRunner::class); + $this->dataManager = $this->createMock(DataManager::class); + $this->configWriter = $this->createMock(ConfigWriter::class); + } + + public function testRun(): void + { + $this->versionDataProvider + ->expects($this->once()) + ->method('getTargetVersion') + ->willReturn('8.3.5'); + + $this->versionDataProvider + ->expects($this->once()) + ->method('getPreviousVersion') + ->willReturn('8.0.4'); + + $this->stepsProvider + ->expects($this->once()) + ->method('getPrepare') + ->willReturn([ + '8.2', + '8.3', + ]); + + $this->stepsProvider + ->expects($this->once()) + ->method('getAfterUpgrade') + ->willReturn([ + '8.1', + '8.3', + ]); + + $this->stepsRunner + ->expects($this->any()) + ->method('runPrepare') + ->willReturnMap([ + ['8.2', true], + ['8.3', true], + ]); + + $this->stepsRunner + ->expects($this->any()) + ->method('runAfterUpgrade') + ->willReturnMap([ + ['8.1', true], + ['8.3', true], + ]); + + $runner = new Runner( + $this->stepsProvider, + $this->versionDataProvider, + $this->stepsRunner, + $this->dataManager, + $this->configWriter + ); + + /** @noinspection PhpUnhandledExceptionInspection */ + $runner->run($this->io); + } +} diff --git a/tests/unit/Espo/Core/Upgrades/Migration/StepsProviderTest.php b/tests/unit/Espo/Core/Upgrades/Migration/StepsProviderTest.php index 69801988a6..c6404207f1 100644 --- a/tests/unit/Espo/Core/Upgrades/Migration/StepsProviderTest.php +++ b/tests/unit/Espo/Core/Upgrades/Migration/StepsProviderTest.php @@ -27,8 +27,9 @@ * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. ************************************************************************/ -namespace Espo\Core\Upgrades\Migration; +namespace tests\unit\Espo\Core\Upgrades\Migration; +use Espo\Core\Upgrades\Migration\StepsProvider; use Espo\Core\Utils\File\Manager; use PHPUnit\Framework\TestCase;