diff --git a/setup/runtimeenv.class.inc.php b/setup/runtimeenv.class.inc.php index 945e913225..2dd8a66d39 100644 --- a/setup/runtimeenv.class.inc.php +++ b/setup/runtimeenv.class.inc.php @@ -1029,4 +1029,4 @@ public function CheckMetaModel() return sprintf("Checked %d classes in %.1f ms. No error found.\n", $iCount, $fDuration * 1000.0); } -} // End of class \ No newline at end of file +} // End of class diff --git a/setup/wizardsteps.class.inc.php b/setup/wizardsteps.class.inc.php index 148da3011e..88ce73756a 100644 --- a/setup/wizardsteps.class.inc.php +++ b/setup/wizardsteps.class.inc.php @@ -1368,6 +1368,52 @@ public function GetPossibleSteps() return ['WizStepModulesChoice', 'WizStepSummary']; } + public function GetAddedAndRemovedExtensions($aSelectedExtensions) + { + $aExtensionsAdded = []; + $aExtensionsRemoved = []; + $aExtensionsNotUninstallable = []; + foreach ($this->oExtensionsMap->GetAllExtensionsWithPreviouslyInstalled() as $oExtension) { + /* @var \iTopExtension $oExtension */ + $bSelected = in_array($oExtension->sCode, $aSelectedExtensions); + if ($oExtension->bInstalled && !$bSelected) { + $aExtensionsRemoved[$oExtension->sCode] = $oExtension->sLabel; + if (!$oExtension->CanBeUninstalled()) { + $aExtensionsNotUninstallable[$oExtension->sCode] = true; + } + } elseif (!$oExtension->bInstalled && $bSelected) { + $aExtensionsAdded[$oExtension->sCode] = $oExtension->sLabel; + } + } + + $sExtensionsAdded = ''; + if (count($aExtensionsAdded) > 0) { + $sExtensionsAdded = ''; + } else { + $sExtensionsAdded = ''; + } + + $sExtensionsRemoved = ''; + if (count($aExtensionsRemoved) > 0) { + $sExtensionsRemoved = ''; + } else { + $sExtensionsRemoved = ''; + } + return [$sExtensionsAdded, $sExtensionsRemoved]; + } + public function ProcessParams($bMoveForward = true) { // Accumulates the selected modules: @@ -1397,9 +1443,14 @@ public function ProcessParams($bMoveForward = true) if (class_exists('CreateITILProfilesInstaller')) { $this->oWizard->SetParameter('old_addon', true); } + + [$sExtensionsAdded, $sExtensionsRemoved] = $this->GetAddedAndRemovedExtensions($aExtensions); + $this->oWizard->SetParameter('selected_modules', json_encode(array_keys($aModules))); $this->oWizard->SetParameter('selected_extensions', json_encode($aExtensions)); $this->oWizard->SetParameter('display_choices', $sDisplayChoices); + $this->oWizard->SetParameter('extensions_added', $sExtensionsAdded); + $this->oWizard->SetParameter('extensions_removed', $sExtensionsRemoved); return ['class' => 'WizStepSummary', 'state' => '']; } @@ -2217,6 +2268,14 @@ public function Display(WebPage $oPage) $oPage->add('
Installation Parameters'); $oPage->add('
'); + + $oPage->add('
Extensions to be installed'); + $oPage->add($this->oWizard->GetParameter('extensions_added')); + $oPage->add('
'); + $oPage->add('
Extensions to be uninstalled'); + $oPage->add($this->oWizard->GetParameter('extensions_removed')); + $oPage->add('
'); + $oPage->add('
Database Parameters
    '); $oPage->add('
  • Server Name: '.$aInstallParams['database']['server'].'
  • '); $oPage->add('
  • DB User Name: '.$aInstallParams['database']['user'].'
  • '); diff --git a/tests/php-unit-tests/unitary-tests/datamodels/2.x/itop-config/ConfigTest/config-itop-joker.php b/tests/php-unit-tests/unitary-tests/datamodels/2.x/itop-config/ConfigTest/config-itop-joker.php index 7c4a359c28..cbce0bb87d 100644 --- a/tests/php-unit-tests/unitary-tests/datamodels/2.x/itop-config/ConfigTest/config-itop-joker.php +++ b/tests/php-unit-tests/unitary-tests/datamodels/2.x/itop-config/ConfigTest/config-itop-joker.php @@ -7,30 +7,26 @@ * * */ -$MySettings = array( - - +$MySettings = [ // app_root_url: Root URL used for navigating within the application, or from an email to the application (you can put $SERVER_NAME$ as a placeholder for the server's name) // default: '' 'app_root_url' => 'http://%server(SERVER_NAME)?:localhost%/itop/iTop/', - -); +]; /** * * Modules specific settings * */ -$MyModuleSettings = array( -); +$MyModuleSettings = [ +]; /** * * Data model modules to be loaded. Names are specified as relative paths * */ -$MyModules = array( -); -?> \ No newline at end of file +$MyModules = [ +]; diff --git a/tests/php-unit-tests/unitary-tests/datamodels/2.x/itop-config/ConfigTest/config-itop-var.php b/tests/php-unit-tests/unitary-tests/datamodels/2.x/itop-config/ConfigTest/config-itop-var.php index a9e41ee35f..3dc1986cd1 100644 --- a/tests/php-unit-tests/unitary-tests/datamodels/2.x/itop-config/ConfigTest/config-itop-var.php +++ b/tests/php-unit-tests/unitary-tests/datamodels/2.x/itop-config/ConfigTest/config-itop-var.php @@ -7,30 +7,26 @@ * * */ -$MySettings = array( - - +$MySettings = [ // app_root_url: Root URL used for navigating within the application, or from an email to the application (you can put $SERVER_NAME$ as a placeholder for the server's name) // default: '' - 'app_root_url' => 'http://' . (isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : 'localhost') . '/itop/iTop/', - + 'app_root_url' => 'http://'.(isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : 'localhost').'/itop/iTop/', -); +]; /** * * Modules specific settings * */ -$MyModuleSettings = array( -); +$MyModuleSettings = [ +]; /** * * Data model modules to be loaded. Names are specified as relative paths * */ -$MyModules = array( -); -?> \ No newline at end of file +$MyModules = [ +]; diff --git a/tests/php-unit-tests/unitary-tests/setup/WizStepModulesChoiceTest.php b/tests/php-unit-tests/unitary-tests/setup/WizStepModulesChoiceTest.php index 11a11fd46c..7bdeac6afc 100644 --- a/tests/php-unit-tests/unitary-tests/setup/WizStepModulesChoiceTest.php +++ b/tests/php-unit-tests/unitary-tests/setup/WizStepModulesChoiceTest.php @@ -257,4 +257,99 @@ public function testComputeChoiceFlags($aExtensions, $bUpgrade, $bDisableUninsta $this->assertEquals($aExpectedFlags, $aFlags); } + public function ProviderGetAddedAndRemovedExtensions() + { + return [ + 'no extensions' => [ + 'aExtensions' => [], + + 'aSelected' => [], + 'sExpectedAddedList' => '
    • No extension added.
    ', + 'sExpectedRemovedList' => '
    • No extension removed.
    ', + ], + 'no extensions selected' => [ + 'aExtensions' => [ + 'itop-ext1' => [ + 'installed' => false, + ], + ], + 'aSelected' => [], + 'sExpectedAddedList' => '
    • No extension added.
    ', + 'sExpectedRemovedList' => '
    • No extension removed.
    ', + ], + 'no extensions removed' => [ + 'aExtensions' => [ + 'itop-ext1' => [ + 'installed' => true, + ], + ], + 'aSelected' => ['itop-ext1'], + 'sExpectedAddedList' => '
    • No extension added.
    ', + 'sExpectedRemovedList' => '
    • No extension removed.
    ', + ], + 'One added extension' => [ + 'aExtensions' => [ + 'itop-ext1' => [ + 'installed' => false, + ], + ], + 'aSelected' => ['itop-ext1'], + 'sExpectedAddedList' => '
    • itop-ext1
    ', + 'sExpectedRemovedList' => '
    • No extension removed.
    ', + ], + 'One removed extension' => [ + 'aExtensions' => [ + 'itop-ext1' => [ + 'installed' => true, + ], + ], + 'aSelected' => [], + 'sExpectedAddedList' => '
    • No extension added.
    ', + 'sExpectedRemovedList' => '
    • itop-ext1
    ', + ], + 'Forced removed extension' => [ + 'aExtensions' => [ + 'itop-ext1' => [ + 'installed' => true, + 'uninstallable' => false, + ], + ], + 'aSelected' => [], + 'sExpectedAddedList' => '
    • No extension added.
    ', + 'sExpectedRemovedList' => '
    • itop-ext1 (forced uninstallation)
    ', + ], + 'added and removed extensions' => [ + 'aExtensions' => [ + 'itop-ext-added1' => [ + 'installed' => false, + ], + 'itop-ext-added2' => [ + 'installed' => false, + ], + 'itop-ext-removed1' => [ + 'installed' => true, + ], + 'itop-ext-removed2' => [ + 'installed' => true, + ], + ], + 'aSelected' => ['itop-ext-added1', 'itop-ext-added2'], + 'sExpectedAddedList' => '
    • itop-ext-added1
    • itop-ext-added2
    ', + 'sExpectedRemovedList' => '
    • itop-ext-removed1
    • itop-ext-removed2
    ', + ], + + ]; + } + + /** + * @dataProvider ProviderGetAddedAndRemovedExtensions + */ + public function testGetAddedAndRemovedExtensions($aExtensions, $aSelectedExtensions, $sExpectedAddedList, $sExpectedRemovedList) + { + $this->oStep->setExtensionMap(iTopExtensionsMapFake::createFromArray($aExtensions)); + [$sAddedList, $sRemovedList] = $this->oStep->GetAddedAndRemovedExtensions($aSelectedExtensions); + $this->assertEquals($sExpectedAddedList, $sAddedList); + $this->assertEquals($sExpectedRemovedList, $sRemovedList); + } + } diff --git a/tests/php-unit-tests/unitary-tests/setup/iTopExtensionsMapFake.php b/tests/php-unit-tests/unitary-tests/setup/iTopExtensionsMapFake.php index e80b88eb6e..ff1a204afd 100644 --- a/tests/php-unit-tests/unitary-tests/setup/iTopExtensionsMapFake.php +++ b/tests/php-unit-tests/unitary-tests/setup/iTopExtensionsMapFake.php @@ -12,9 +12,11 @@ public function __construct($sFromEnvironment = 'production', $aExtraDirs = []) public static function createFromArray($aExtensions) { $oMap = new static(); + foreach ($aExtensions as $sCode => $aExtension) { $oExtension = new iTopExtension(); $oExtension->sCode = $sCode; + $oExtension->sLabel = $sCode; $oExtension->bInstalled = $aExtension['installed']; $oExtension->aModules = $aExtension['modules'] ?? []; $oExtension->bCanBeUninstalled = $aExtension['uninstallable'] ?? null;