diff --git a/setup/extensionsmap.class.inc.php b/setup/extensionsmap.class.inc.php index 89d169499b..25a2ef8ece 100644 --- a/setup/extensionsmap.class.inc.php +++ b/setup/extensionsmap.class.inc.php @@ -375,14 +375,14 @@ public function GetAllExtensionsWithPreviouslyInstalled(): array * @return array<\iTopExtension>> */ - public function GetAllExtensionsToDisplayInSetup(bool $bKeepMissingDependencyExtensions = false): array + public function GetAllExtensionsToDisplayInSetup(bool $bKeepMissingDependencyExtensions = false, bool $bRemoteExtensionsShouldBeMandatory = true): array { $aRes = []; foreach ($this->GetAllExtensionsWithPreviouslyInstalled() as $oExtension) { /** @var \iTopExtension $oExtension */ - if (($oExtension->sSource !== iTopExtension::SOURCE_WIZARD) && ($oExtension->bVisible)) { - if ($bKeepMissingDependencyExtensions || (count($oExtension->aMissingDependencies) == 0)) { - if (!$oExtension->bMandatory) { + if ($oExtension->sSource !== iTopExtension::SOURCE_WIZARD && $oExtension->bVisible) { + if ($bKeepMissingDependencyExtensions || count($oExtension->aMissingDependencies) == 0) { + if (!$oExtension->bMandatory && $bRemoteExtensionsShouldBeMandatory) { $oExtension->bMandatory = ($oExtension->sSource === iTopExtension::SOURCE_REMOTE); } $aRes[$oExtension->sCode] = $oExtension; @@ -393,10 +393,10 @@ public function GetAllExtensionsToDisplayInSetup(bool $bKeepMissingDependencyExt return $aRes; } - public function GetAllExtensionsOptionInfo(): array + public function GetAllExtensionsOptionInfo(bool $bRemoteExtensionsShouldBeMandatory = true): array { $aRes = []; - foreach ($this->GetAllExtensionsToDisplayInSetup() as $sCode => $oExtension) { + foreach ($this->GetAllExtensionsToDisplayInSetup(false, $bRemoteExtensionsShouldBeMandatory) as $sCode => $oExtension) { $aRes[] = [ 'extension_code' => $oExtension->sCode, 'title' => $oExtension->sLabel, diff --git a/setup/wizardsteps/WizStepModulesChoice.php b/setup/wizardsteps/WizStepModulesChoice.php index 5cb90bd019..e21c9f11fc 100644 --- a/setup/wizardsteps/WizStepModulesChoice.php +++ b/setup/wizardsteps/WizStepModulesChoice.php @@ -626,7 +626,7 @@ protected function GetStepIndex() protected function GetStepInfo($idx = null) { $index = $idx ?? $this->GetStepIndex(); - + $bRemoteExtensionsShouldBeMandatory = !$this->oWizard->GetParameter('force-uninstall', false); if (is_null($this->aSteps)) { $this->oWizard->SetParameter('additional_extensions_modules', json_encode([])); // Default value, no additional extensions @@ -637,7 +637,7 @@ protected function GetStepInfo($idx = null) if ($index + 1 >= count($this->aSteps)) { //make sure we also cache next step as well - $aOptions = $this->oExtensionsMap->GetAllExtensionsOptionInfo(); + $aOptions = $this->oExtensionsMap->GetAllExtensionsOptionInfo($bRemoteExtensionsShouldBeMandatory); // Display this step of the wizard only if there is something to display if (count($aOptions) > 0) { @@ -651,7 +651,7 @@ protected function GetStepInfo($idx = null) } } } else { - $aOptions = $this->oExtensionsMap->GetAllExtensionsOptionInfo(); + $aOptions = $this->oExtensionsMap->GetAllExtensionsOptionInfo($bRemoteExtensionsShouldBeMandatory); // No wizard configuration provided, build a standard one with just one big list. All items are mandatory, only works when there are no conflicted modules. $this->aSteps = [ diff --git a/tests/php-unit-tests/unitary-tests/setup/WizStepModulesChoiceTest.php b/tests/php-unit-tests/unitary-tests/setup/WizStepModulesChoiceTest.php index 8c4d74edbc..5f167bb2f7 100644 --- a/tests/php-unit-tests/unitary-tests/setup/WizStepModulesChoiceTest.php +++ b/tests/php-unit-tests/unitary-tests/setup/WizStepModulesChoiceTest.php @@ -3,6 +3,7 @@ namespace Combodo\iTop\Test\UnitTest\Integration; use Combodo\iTop\Test\UnitTest\ItopTestCase; +use iTopExtension; use iTopExtensionsMap; use iTopExtensionsMapFake; use ModuleDiscovery; @@ -376,6 +377,44 @@ public function testComputeChoiceFlags($aExtensionsOnDiskOrDb, $aWizardStepDefin $this->assertEquals($aExpectedFlags, $aFlags); } + public function ProviderGetAllExtensionsToDisplayInSetupMandatoryFlag() + { + return [ + 'A manually added extension should not be mandatory by default' => [ + 'bExtensionSource' => 'extensions',//iTopExtension::SOURCE_MANUAL + 'bDisableUninstallChecks' => false, + 'bExpectedMandatory' => false, + ], + 'A remotely added extension should be mandatory by default' => [ + 'bExtensionSource' => 'data',//iTopExtension::SOURCE_REMOTE + 'bDisableUninstallChecks' => false, + 'bExpectedMandatory' => true, + ], + 'A remotely added extension should not be mandatory by default if uninstall checks has been disabled' => [ + 'bExtensionSource' => 'data',//iTopExtension::SOURCE_REMOTE + 'bDisableUninstallChecks' => true, + 'bExpectedMandatory' => false, + ], + + ]; + } + + /** + * @dataProvider ProviderGetAllExtensionsToDisplayInSetupMandatoryFlag + */ + public function testGetAllExtensionsToDisplayInSetupMandatoryFlag($bExtensionSource, $bDisableUninstallChecks, $bExpectedMandatory) + { + $aExtensionsOnDiskOrDb = [ + 'itop-ext1' => [ + 'installed' => true, + 'source' => $bExtensionSource, + ], + ]; + $oMap = iTopExtensionsMapFake::createFromArray($aExtensionsOnDiskOrDb); + $aExtensions = $oMap->GetAllExtensionsToDisplayInSetup(false, !$bDisableUninstallChecks); + $this->assertEquals($bExpectedMandatory, $aExtensions['itop-ext1']->bMandatory); + } + public function ProviderGetAddedAndRemovedExtensions() { return [ diff --git a/tests/php-unit-tests/unitary-tests/setup/iTopExtensionsMapFake.php b/tests/php-unit-tests/unitary-tests/setup/iTopExtensionsMapFake.php index f53eb84c7f..8dbf59085c 100644 --- a/tests/php-unit-tests/unitary-tests/setup/iTopExtensionsMapFake.php +++ b/tests/php-unit-tests/unitary-tests/setup/iTopExtensionsMapFake.php @@ -21,6 +21,7 @@ public static function createFromArray($aExtensions) $oExtension->aModules = $aExtension['modules'] ?? []; $oExtension->bCanBeUninstalled = $aExtension['uninstallable'] ?? null; $oExtension->sVersion = $aExtension['version'] ?? '1.0.0'; + $oExtension->sSource = $aExtension['source'] ?? iTopExtension::SOURCE_MANUAL; $oExtension->aModuleInfo = $aExtension['module_info'] ?? []; $oMap->AddExtension($oExtension); }