diff --git a/setup/wizardsteps/WizStepModulesChoice.php b/setup/wizardsteps/WizStepModulesChoice.php index 2fd85f42a..98a610c9e 100644 --- a/setup/wizardsteps/WizStepModulesChoice.php +++ b/setup/wizardsteps/WizStepModulesChoice.php @@ -48,7 +48,7 @@ class WizStepModulesChoice extends WizardStep */ protected bool $bChoicesFromDatabase; - private array $aAnalyzeInstallationModules; + private array $aAnalyzeInstallationModules = []; private ?MissingDependencyException $oMissingDependencyException = null; public function __construct(WizardController $oWizard, $sCurrentState) @@ -486,7 +486,7 @@ EOF * * @return string A text representation of what will be installed */ - protected function GetSelectedModules($aInfo, $aSelectedChoices, &$aModules, $sParentId = '', $sDisplayChoices = '', &$aSelectedExtensions = null) + public function GetSelectedModules($aInfo, $aSelectedChoices, &$aModules, $sParentId = '', $sDisplayChoices = '', &$aSelectedExtensions = null) { if ($sParentId == '') { // Check once (before recursing) that the hidden modules are selected @@ -514,6 +514,9 @@ EOF (isset($aSelectedChoices[$sChoiceId]) && ($aSelectedChoices[$sChoiceId] == $sChoiceId))) { $sDisplayChoices .= '
  • '.$aChoice['title'].'
  • '; if (isset($aChoice['modules'])) { + if (count($aChoice['modules']) === 0) { + throw new Exception('Setup option does not have any module associated'); + } foreach ($aChoice['modules'] as $sModuleId) { $bSelected = true; if (isset($aModuleInfo[$sModuleId])) { diff --git a/tests/php-unit-tests/unitary-tests/setup/WizStepModulesChoiceTest.php b/tests/php-unit-tests/unitary-tests/setup/WizStepModulesChoiceTest.php index 9d21471de..cb120b8e0 100644 --- a/tests/php-unit-tests/unitary-tests/setup/WizStepModulesChoiceTest.php +++ b/tests/php-unit-tests/unitary-tests/setup/WizStepModulesChoiceTest.php @@ -559,4 +559,99 @@ class WizStepModulesChoiceTest extends ItopTestCase return $aSteps[$index] ?? null; } + + public function ProviderGetSelectedModules() + { + return [ + 'No extension selected' => [ + 'aSelected' => [], + 'aExpectedModules' => [], + 'aExpectedExtensions' => [], + ], + 'One extension selected' => [ + 'aSelected' => ['_0' => '_0'], + 'aExpectedModules' => ['combodo-sample-module' => true], + 'aExpectedExtensions' => ['combodo-sample'], + ], + ]; + } + + /** + * @dataProvider ProviderGetSelectedModules + */ + public function testGetSelectedModules($aSelectedExtensions, $aExpectedModules, $aExpectedExtensions) + { + $aExtensionsMapData = [ + 'combodo-sample' => [ + 'installed' => false, + ], + ]; + $this->oStep->setExtensionMap(iTopExtensionsMapFake::createFromArray($aExtensionsMapData, )); + + //GetSelectedModules + $aStepInfo = [ + 'title' => 'Extensions', + 'description' => '', + 'banner' => '', + 'options' => [ + [ + 'extension_code' => 'combodo-sample', + 'title' => 'Sample extension', + 'description' => '', + 'more_info' => '', + 'default' => true, + 'modules' => [ + 'combodo-sample-module', + ], + 'mandatory' => false, + 'source_label' => '', + 'uninstallable' => true, + 'missing' => false, + ], + ], + ]; + + $aModules = []; + $aExtensions = []; + $this->oStep->GetSelectedModules($aStepInfo, $aSelectedExtensions, $aModules, '', '', $aExtensions); + $this->assertEquals($aExpectedModules, $aModules); + $this->assertEquals($aExpectedExtensions, $aExtensions); + } + + public function testGetSelectedModulesShouldThrowAnExceptionWhenAnySelectedExtensionDoesNotHaveAnyAssociatedModules() + { + $aExtensionsMapData = [ + 'combodo-sample' => [ + 'installed' => false, + ], + ]; + $this->oStep->setExtensionMap(iTopExtensionsMapFake::createFromArray($aExtensionsMapData, )); + + //GetSelectedModules + $aStepInfo = [ + 'title' => 'Extensions', + 'description' => '', + 'banner' => '', + 'options' => [ + [ + 'extension_code' => 'combodo-sample', + 'title' => 'Sample extension', + 'description' => '', + 'more_info' => '', + 'default' => true, + 'modules' => [], + 'mandatory' => false, + 'source_label' => '', + 'uninstallable' => true, + 'missing' => false, + ], + ], + ]; + + $aModules = []; + $aExtensions = []; + $this->expectException('Exception'); + $this->oStep->GetSelectedModules($aStepInfo, ['_0' => '_0'], $aModules, '', '', $aExtensions); + } + }