N°8981: test ModuleDiscovery filtered by removed extensions

This commit is contained in:
odain
2026-01-09 23:21:30 +01:00
parent 3a3f5736c0
commit 63e473e6d0
2 changed files with 101 additions and 3 deletions

View File

@@ -2,7 +2,9 @@
namespace Combodo\iTop\Test\UnitTest\Setup;
use Combodo\iTop\Setup\ModuleDiscovery\ModuleFileReader;
use Combodo\iTop\Test\UnitTest\ItopTestCase;
use iTopExtension;
use MissingDependencyException;
use ModuleDiscovery;
@@ -15,6 +17,12 @@ class ModuleDiscoveryTest extends ItopTestCase
$this->RequireOnceItopFile('setup/modulediscovery.class.inc.php');
}
protected function tearDown(): void
{
parent::tearDown();
ModuleDiscovery::DeclareRemovedExtensions([]);
}
public function testOrderModulesByDependencies_RealExample()
{
$aModules = json_decode(file_get_contents(__DIR__.'/ressources/reallife_discovered_modules.json'), true);
@@ -78,6 +86,41 @@ TXT;
ModuleDiscovery::OrderModulesByDependencies($aModules, true, $aChoices);
}
public function testOrderModulesByDependencies_FailWhenChoosenModuleDependsOnRemovedExtensionModule()
{
$aChoices = ['id1', 'id2'];
$sModuleFilePath = tempnam(sys_get_temp_dir(), 'discovery_test');
$this->aFileToClean[] = $sModuleFilePath;
$sModuleFilePath2 = tempnam(sys_get_temp_dir(), 'discovery_test');
$this->aFileToClean[] = $sModuleFilePath2;
$aModules = [
"id1/1" => [
'dependencies' => [ 'id2/2'],
'label' => 'label1',
ModuleFileReader::MODULE_FILE_PATH => $sModuleFilePath,
],
"id2/2" => [
'dependencies' => [],
'label' => 'label2',
ModuleFileReader::MODULE_FILE_PATH => $sModuleFilePath2,
],
];
$oExtension = $this->CreateExtensionWithModule('id2', '2', $sModuleFilePath2);
ModuleDiscovery::DeclareRemovedExtensions([$oExtension]);
$sExpectedMessage = <<<TXT
The following modules have unmet dependencies:
label1 (id: id1/1) depends on: ❌ id2/2
TXT;
$this->expectException(MissingDependencyException::class);
$this->expectExceptionMessage($sExpectedMessage);
ModuleDiscovery::OrderModulesByDependencies($aModules, true, $aChoices);
}
public function GetModuleNameProvider()
{
return [
@@ -109,6 +152,63 @@ TXT;
*/
public function testGetModuleName($sModuleId, $expectedName, $expectedVersion)
{
$this->assertEquals([$expectedName, $expectedVersion], \ModuleDiscovery::GetModuleName($sModuleId));
$this->assertEquals([$expectedName, $expectedVersion], ModuleDiscovery::GetModuleName($sModuleId));
}
public function testIsModulePartOfRemovedExtension_NoRemovedExtension()
{
ModuleDiscovery::DeclareRemovedExtensions([]);
$this->assertFalse($this->InvokeNonPublicStaticMethod(ModuleDiscovery::class, "IsModulePartOfRemovedExtension", ['module_name', '123', []]));
}
public function testIsModulePartOfRemovedExtension_ModuleWithAnotherVersionIncludedInRemoveExtension()
{
$sModuleFilePath = tempnam(sys_get_temp_dir(), 'discovery_test');
$this->ValidateIsModulePartOfRemovedExtension('module_name', '123', $sModuleFilePath, $sModuleFilePath, false);
}
public function testIsModulePartOfRemovedExtension_AnotherModuleWithSameVersionIncludedInRemoveExtension()
{
$sModuleFilePath = tempnam(sys_get_temp_dir(), 'discovery_test');
$this->ValidateIsModulePartOfRemovedExtension('another_module_name', '456', $sModuleFilePath, $sModuleFilePath, false);
}
public function testIsModulePartOfRemovedExtension_SameExtensionComingFromAnotherLocation()
{
$sModuleFilePath = tempnam(sys_get_temp_dir(), 'discovery_test');
$sModuleFilePath2 = tempnam(sys_get_temp_dir(), 'discovery_test');
$this->ValidateIsModulePartOfRemovedExtension('module_name', '456', $sModuleFilePath, $sModuleFilePath2, false);
}
public function testIsModulePartOfRemovedExtension_ModuleShouldBeExcluded()
{
$sModuleFilePath = tempnam(sys_get_temp_dir(), 'discovery_test');
$this->ValidateIsModulePartOfRemovedExtension('module_name', '456', $sModuleFilePath, $sModuleFilePath, true);
}
public function ValidateIsModulePartOfRemovedExtension($sModuleName, $sModuleVersion, $sModuleFilePath1, $sModuleFilePath2, $bExpected)
{
$this->aFileToClean[] = $sModuleFilePath1;
$this->aFileToClean[] = $sModuleFilePath2;
$oExtension = $this->CreateExtensionWithModule('module_name', '456', $sModuleFilePath2);
ModuleDiscovery::DeclareRemovedExtensions([$oExtension]);
$aCurrentModuleInfo = [
ModuleFileReader::MODULE_FILE_PATH => $sModuleFilePath1,
];
$this->assertEquals(
$bExpected,
$this->InvokeNonPublicStaticMethod(ModuleDiscovery::class, "IsModulePartOfRemovedExtension", [$sModuleName, $sModuleVersion, $aCurrentModuleInfo])
);
}
private function CreateExtensionWithModule(string $sModuleName, string $sVersion, bool|string $sModuleFilePath): iTopExtension
{
$oExt = new iTopExtension();
$oExt->aModuleVersion[$sModuleName] = $sVersion;
$oExt->aModuleInfo[$sModuleName] = [
ModuleFileReader::MODULE_FILE_PATH => $sModuleFilePath,
];
return $oExt;
}
}