Compare commits

...

1 Commits

Author SHA1 Message Date
lenaick.moreira
a687bb5812 N°9134 - Detect extension with no code when installing by data feature removal extension 2026-08-24 17:22:10 +02:00
5 changed files with 25 additions and 12 deletions

View File

@@ -24,6 +24,7 @@ use ContextTag;
use CoreException;
use Dict;
use Exception;
use iTopExtension;
use MetaModel;
use MFCompiler;
use RunTimeEnvironment;
@@ -451,13 +452,14 @@ class DataFeatureRemovalController extends Controller
'extensions_not_uninstallable' => [],
];
foreach ($aAvailableExtensions as $sCode => &$aExtensionData) {
$sCode = $sCode !== '' ? $sCode : iTopExtension::CODE_NO_CODE;
if (!isset($aSelectedExtensionsFromUI[$sCode])) {
continue;
}
if ($aExtensionData['installed'] && $aSelectedExtensionsFromUI[$sCode] !== 'on') {
$aExtensionData['extra_flags']['selected'] = false;
$sLabel = $aAvailableExtensions[$sCode]['label'];
$sLabel = $aExtensionData['label'];
$this->aExtensionsToCheck['to_be_removed'][$sCode] = $sLabel;
if (! $this->bForcedUninstallation && $aExtensionData['extra_flags']['uninstallable']) {
$this->bForcedUninstallation = true;
@@ -467,7 +469,7 @@ class DataFeatureRemovalController extends Controller
}
} elseif (!$aExtensionData['installed'] && $aSelectedExtensionsFromUI[$sCode] === 'on') {
$aExtensionData['extra_flags']['selected'] = true;
$sLabel = $aAvailableExtensions[$sCode]['label'];
$sLabel = $aExtensionData['label'];
$this->aExtensionsToCheck['to_be_installed'][$sCode] = $sLabel;
}
}

View File

@@ -13,6 +13,7 @@ class iTopExtension
public const SOURCE_WIZARD = 'datamodels';
public const SOURCE_MANUAL = 'extensions';
public const SOURCE_REMOTE = 'data';
public const CODE_NO_CODE = 'no_code';
/**
* @var string
@@ -193,7 +194,7 @@ class iTopExtension
public function HasCode(): bool
{
return $this->sCode !== '';
return $this->sCode !== '' && $this->sCode !== self::CODE_NO_CODE;
}
public function HasLabel(): bool

View File

@@ -1330,7 +1330,8 @@ class RunTimeEnvironment
$oExtensionsMap->DeclareExtensionAsRemoved($aRemovedExtensionCodes);
foreach ($oExtensionsMap->GetAllExtensions() as $oExtension) {
$oExtension->MarkAsChosen(in_array($oExtension->sCode, $aSelectedExtensionCodes));
$sExtensionCode = $oExtension->sCode !== '' ? $oExtension->sCode : iTopExtension::CODE_NO_CODE;
$oExtension->MarkAsChosen(in_array($sExtensionCode, $aSelectedExtensionCodes));
}
// Check that all the extensions have a code

View File

@@ -9,6 +9,7 @@ use Combodo\iTop\Application\UI\Base\Component\PopoverMenu\PopoverMenu;
use Combodo\iTop\Application\UI\Base\Component\PopoverMenu\PopoverMenuItem\PopoverMenuItemFactory;
use Combodo\iTop\Application\UI\Base\Layout\UIContentBlock;
use Dict;
use iTopExtension;
use JSButtonItem;
class ExtensionDetails extends UIContentBlock
@@ -179,7 +180,8 @@ class ExtensionDetails extends UIContentBlock
protected function InitializeToggler()
{
$sName = 'aSelectedExtensions['.$this->GetCode().']';
$sCode = $this->GetCode() !== '' ? $this->GetCode() : iTopExtension::CODE_NO_CODE;
$sName = 'aSelectedExtensions['.$sCode.']';
$this->oToggler = new Toggler();
$this->oToggler->SetName($sName);
$this->oToggler->SetTooltip(Dict::Format('UI:Layout:ExtensionsDetails:TogglerTooltip', $this->GetLabel()));

View File

@@ -2,15 +2,10 @@
namespace Combodo\iTop\Test\UnitTest\Setup;
use Combodo\iTop\DataFeatureRemoval\Service\DataFeatureRemoverExtensionService;
use Combodo\iTop\Test\UnitTest\ItopTestCase;
use Config;
use CoreException;
use DOMFormatException;
use Exception;
use iTopExtensionsMap;
use RunTimeEnvironment;
use utils;
class RunTimeEnvironmentTest extends ItopTestCase
{
@@ -20,7 +15,19 @@ class RunTimeEnvironmentTest extends ItopTestCase
$this->RequireOnceItopFile('/setup/runtimeenv.class.inc.php');
}
public function testDoCompileCallCheckExtensionsValidity(): void
public function provideDoCompileCallCheckExtensionsValidity(): array
{
$this->RequireOnceItopFile('/approot.inc.php');
$this->RequireOnceItopFile('/setup/itopextension.class.inc.php');
return [
'setup call DoCompile with empty string' => [['']],
'data feature removal call DoCompile with fake code' => [[\iTopExtension::CODE_NO_CODE]],
];
}
/** @dataProvider provideDoCompileCallCheckExtensionsValidity */
public function testDoCompileCallCheckExtensionsValidity(array $aSelectedExtensionCodes): void
{
[$sEnvironment, $sExtensionsDirRelative] = $this->CreateFixtureContext('env-missing-label-');
@@ -45,7 +52,7 @@ XML;
$this->expectException(CoreException::class);
$oExtensionMap->expects($this->once())->method('CheckExtensionsValidity')->willThrowException(new CoreException(''));
$oRuntimeEnvironment->DoCompile([""], [], [], false);
$oRuntimeEnvironment->DoCompile($aSelectedExtensionCodes, aRemovedExtensionCodes: [], aSelectedModules: []);
}
private function CreateFixtureContext(string $sEnvPrefix): array