From e6d485855e2800de2ba3c8da6f15d3d2bc9ab1d8 Mon Sep 17 00:00:00 2001 From: Timmy38 <101416770+Timmy38@users.noreply.github.com> Date: Mon, 14 Sep 2026 16:34:40 +0200 Subject: [PATCH] =?UTF-8?q?N=C2=B010045=20Fix=20modules=20in=20production-?= =?UTF-8?q?modules=20automatically=20set=20to=20visible=20false?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- setup/setuputils.class.inc.php | 15 +--- .../unitary-tests/setup/SetupUtilsTest.php | 68 +++++++++++++++++++ 2 files changed, 69 insertions(+), 14 deletions(-) diff --git a/setup/setuputils.class.inc.php b/setup/setuputils.class.inc.php index c9e0125c2b..6ea940733b 100644 --- a/setup/setuputils.class.inc.php +++ b/setup/setuputils.class.inc.php @@ -1670,20 +1670,7 @@ JS $oExtensionsMap = iTopExtensionsMap::GetExtensionsMap($oWizard->GetParameter('target_env', ITOP_DEFAULT_ENV)); $oExtensionsMap->DeclareExtensionAsRemoved($aRemovedExtensionCodes); - $aAvailableModules = $oProductionEnv->AnalyzeInstallation($oConfig, $aDirsToScan, $bAbortOnMissingDependency, $aModulesToLoad); - - $bRemoteExtensionsShouldBeMandatory = !$oWizard->GetParameter('force-uninstall', false); - if ($bRemoteExtensionsShouldBeMandatory) { - foreach ($aAvailableModules as $key => $aModule) { - $bIsExtra = (array_key_exists('root_dir', $aModule) && (strpos($aModule['root_dir'], $sExtraDir) !== false)); // Some modules (root, datamodel) have no 'root_dir' - if ($bIsExtra) { - // Modules in data/production-modules/ are considered as mandatory and always installed - $aAvailableModules[$key]['visible'] = false; - } - } - } - - return $aAvailableModules; + return $oProductionEnv->AnalyzeInstallation($oConfig, $aDirsToScan, $bAbortOnMissingDependency, $aModulesToLoad); } /** diff --git a/tests/php-unit-tests/unitary-tests/setup/SetupUtilsTest.php b/tests/php-unit-tests/unitary-tests/setup/SetupUtilsTest.php index 9ffc2d671c..fcdf0ab4a8 100644 --- a/tests/php-unit-tests/unitary-tests/setup/SetupUtilsTest.php +++ b/tests/php-unit-tests/unitary-tests/setup/SetupUtilsTest.php @@ -2,9 +2,13 @@ namespace Combodo\iTop\Test\UnitTest\Setup; +use AnalyzeInstallation; use CheckResult; use Combodo\iTop\Setup\FeatureRemoval\ModelReflectionSerializer; use Combodo\iTop\Test\UnitTest\ItopTestCase; +use Config; +use ModuleDiscovery; +use WizardController; use SetupUtils; /** @@ -28,6 +32,13 @@ class SetupUtilsTest extends ItopTestCase $this->RequireOnceItopFile('setup/setuputils.class.inc.php'); $this->RequireOnceItopFile('setup/setuppage.class.inc.php'); + $this->RequireOnceItopFile('setup/wizardcontroller.class.inc.php'); + } + + protected function tearDown(): void + { + parent::tearDown(); + ModuleDiscovery::ResetCache(); } /** @@ -219,6 +230,30 @@ OUTPUT; $this->ValidateCheckResults($expected, $aRes); } + /** + * Bug N°10045 + */ + public function testAnalyzeInstallationDoesNotAutomaticallySetModulesInProductionModulesVisibilityToFalse() + { + $this->RequireOnceItopFile('setup/moduleinstallation/AnalyzeInstallation.php'); + $this->SetNonPublicProperty(AnalyzeInstallation::GetInstance(), 'aAvailableModules', null); + + $sRemoteEnv = 'production-temp'; + $sExtraDir = \utils::GetDataPath().$sRemoteEnv.'-modules/'; + $sExtraModuleName = 'extra-module'; + + $this->createModule($sExtraDir, $sExtraModuleName, '1.0.0'); + + $oWizard = new WizardController('WizStepWelcome'); + $oWizard->SetParameter('source_dir', APPROOT.'datamodels/2.x'); + $oWizard->SetParameter('remote_env', $sRemoteEnv); + + $aModules = SetupUtils::AnalyzeInstallation($oWizard); + + $this->assertContains($sExtraModuleName, array_keys($aModules), 'Module discovery should have found the extra module'); + $this->assertTrue($aModules[$sExtraModuleName]['visible'], 'AnalyzeInstallation should not have automatically set the extra module visibility to false'); + } + private function ValidateCheckResults(array $expected, array $aActualCheckResults) { $aActual = []; @@ -232,4 +267,37 @@ OUTPUT; self::assertEquals($expected, $aActual); } + protected function createModule($sDirectory, $sModuleName, $sModuleVersion, $bMandatory = false, $bVisible = true) + { + $sModuleDir = $sDirectory.'/'.$sModuleName; + SetupUtils::builddir($sModuleDir); + $this->aFileToClean[] = $sDirectory; + + $sModuleFileName = $sModuleDir.'/module.'.$sModuleName.'.php'; + + $sMandatory = var_export($bMandatory, true); + $sVisible = var_export($bVisible, true); + file_put_contents( + $sModuleFileName, + << "$sModuleName", + 'dependencies' => [], + 'mandatory' => $sMandatory, + 'visible' => $sVisible, + 'datamodel' => [], + 'data.struct' => [], + 'data.sample' => [], + 'doc.manual_setup' => '', + 'doc.more_information' => '', + ] +); +PHP + ); + } + }