From 63e473e6d0e14a47d791f6cd50fac0003d89a844 Mon Sep 17 00:00:00 2001 From: odain Date: Fri, 9 Jan 2026 23:21:30 +0100 Subject: [PATCH] =?UTF-8?q?N=C2=B08981:=20test=20ModuleDiscovery=20filtere?= =?UTF-8?q?d=20by=20removed=20extensions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- setup/modulediscovery.class.inc.php | 2 - .../setup/ModuleDiscoveryTest.php | 102 +++++++++++++++++- 2 files changed, 101 insertions(+), 3 deletions(-) diff --git a/setup/modulediscovery.class.inc.php b/setup/modulediscovery.class.inc.php index e1c00e76b..4acd00318 100755 --- a/setup/modulediscovery.class.inc.php +++ b/setup/modulediscovery.class.inc.php @@ -239,7 +239,6 @@ class ModuleDiscovery } } } - return ModuleDependencySort::GetInstance()->GetModulesOrderedForInstallation($aFilteredModules, $bAbortOnMissingDependency); } @@ -260,7 +259,6 @@ class ModuleDiscovery if (count(self::$m_aRemovedExtensions) === 0) { return false; } - $aNonMatchingPaths = []; $sModuleFilePath = $aModuleInfo[ModuleFileReader::MODULE_FILE_PATH]; diff --git a/tests/php-unit-tests/unitary-tests/setup/ModuleDiscoveryTest.php b/tests/php-unit-tests/unitary-tests/setup/ModuleDiscoveryTest.php index badaaafb6..5252c4b50 100644 --- a/tests/php-unit-tests/unitary-tests/setup/ModuleDiscoveryTest.php +++ b/tests/php-unit-tests/unitary-tests/setup/ModuleDiscoveryTest.php @@ -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 = <<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; } }