diff --git a/composer.json b/composer.json index 80a601694..262b08f9b 100644 --- a/composer.json +++ b/composer.json @@ -65,7 +65,7 @@ "qtism/qtism": ">=0.28.3", "oat-sa/generis" : ">=15.22", "oat-sa/tao-core": ">=53.0.0", - "oat-sa/extension-tao-item" : ">=12.0.0", + "oat-sa/extension-tao-item" : ">=12.1.0", "oat-sa/extension-tao-itemqti" : ">=30.0.0", "oat-sa/extension-tao-test" : ">=16.0.0", "oat-sa/extension-tao-delivery" : ">=15.0.0", diff --git a/models/classes/class.QtiTestService.php b/models/classes/class.QtiTestService.php index a200b4129..0f179b1bb 100644 --- a/models/classes/class.QtiTestService.php +++ b/models/classes/class.QtiTestService.php @@ -15,8 +15,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * Copyright (c) 2013-2018 (original work) Open Assessment Technologies SA (under the project TAO-PRODUCT); - * + * Copyright (c) 2013-2023 (original work) Open Assessment Technologies SA (under the project TAO-PRODUCT); */ use League\Flysystem\FileExistsException; @@ -26,7 +25,7 @@ use oat\tao\model\resources\ResourceAccessDeniedException; use oat\tao\model\resources\SecureResourceServiceInterface; use oat\tao\model\TaoOntology; -use oat\taoBackOffice\model\tree\TreeService; +use oat\taoItems\model\Command\DeleteItemCommand; use oat\taoQtiItem\model\qti\ImportService; use oat\taoQtiItem\model\qti\metadata\importer\MetadataImporter; use oat\taoQtiItem\model\qti\metadata\MetadataGuardianResource; @@ -40,6 +39,7 @@ use oat\taoQtiTest\models\render\QtiPackageImportPreprocessing; use oat\taoQtiTest\models\test\AssessmentTestXmlFactory; use oat\taoTests\models\event\TestUpdatedEvent; +use Psr\Container\ContainerInterface; use qtism\common\utils\Format; use qtism\data\AssessmentItemRef; use qtism\data\QtiComponentCollection; @@ -57,7 +57,6 @@ * @author Bertrand Chevrier * @author Jerome Bogaerts * @package taoQtiTest - */ class taoQtiTest_models_classes_QtiTestService extends TestService { @@ -348,7 +347,6 @@ public function importMultipleTests( bool $overwriteTest = false, ?string $itemClassUri = null ) { - $testClass = $targetClass; $report = new common_report_Report(common_report_Report::TYPE_INFO); $validPackage = false; @@ -866,6 +864,9 @@ protected function importTest( return $report; } + /** + * @throws common_Exception + */ private function deleteTestsFromClassByLabel( string $testLabel, string $itemsClassLabel, @@ -873,19 +874,14 @@ private function deleteTestsFromClassByLabel( core_kernel_classes_Class $itemClass ): void { $testService = $this->getTestService(); - $itemTreeService = $this->getItemTreeService(); + + $this->deleteItemSubclassesByLabel($itemClass, $itemsClassLabel); foreach ($testClass->getInstances() as $testInstance) { if ($testInstance->getLabel() === $testLabel) { $testService->deleteTest($testInstance); } } - - foreach ($itemClass->getSubClasses() as $subClass) { - if ($subClass->getLabel() === $itemsClassLabel) { - $itemTreeService->deleteClass($subClass); - } - } } /** @@ -1446,21 +1442,42 @@ private function verifyItemPermissions(core_kernel_classes_Resource $oldTest, st $this->getSecureResourceService()->validatePermissions($ids, ['READ']); } - /** - * @return QtiPackageImportPreprocessing - */ - private function getQtiPackageImportPreprocessing() + private function deleteItemSubclassesByLabel( + core_kernel_classes_Class $root, + string $label + ): void { + $itemTreeService = $this->getItemTreeService(); + + foreach ($root->getSubClasses() as $subClass) { + if ($subClass->getLabel() !== $label) { + continue; + } + + foreach ($subClass->getInstances(true) as $instance) { + $itemTreeService->delete(new DeleteItemCommand($instance, true)); + } + + $itemTreeService->deleteClass($subClass); + } + } + + private function getQtiPackageImportPreprocessing(): QtiPackageImportPreprocessing { - return $this->getServiceLocator()->get(QtiPackageImportPreprocessing::SERVICE_ID); + return $this->getPsrContainer()->get(QtiPackageImportPreprocessing::SERVICE_ID); } private function getItemTreeService(): taoItems_models_classes_ItemsService { - return taoItems_models_classes_ItemsService::singleton(); + return $this->getPsrContainer()->get(taoItems_models_classes_ItemsService::class); } private function getTestService(): taoTests_models_classes_TestsService { - return taoTests_models_classes_TestsService::singleton(); + return $this->getPsrContainer()->get(taoTests_models_classes_TestsService::class); + } + + private function getPsrContainer(): ContainerInterface + { + return $this->getServiceLocator()->getContainer(); } } diff --git a/test/unit/models/classes/xml/XmlEditorTest.php b/test/unit/models/classes/xml/XmlEditorTest.php index 7f15f1535..bd00d89d9 100644 --- a/test/unit/models/classes/xml/XmlEditorTest.php +++ b/test/unit/models/classes/xml/XmlEditorTest.php @@ -1,9 +1,28 @@ load(__DIR__ . '/../../../../samples/xml/test.xml'); $this->xmlDoc = $doc; + $this->testResourceMock = $this->createMock(core_kernel_classes_Resource::class); + $this->qtiTestServiceMock = $this->createMock(taoQtiTest_models_classes_QtiTestService::class); - $this->qtiTestServiceMock->method('getDoc')->with($this->testResourceMock)->willReturn($this->xmlDoc); + $this->qtiTestServiceMock + ->method('getDoc') + ->with($this->testResourceMock) + ->willReturn($this->xmlDoc); + + $this->featureFlagCheckerMock = $this->createMock(FeatureFlagChecker::class); + $this->serviceLocatorMock = $this->getServiceLocatorMock([ - taoQtiTest_models_classes_QtiTestService::class => $this->qtiTestServiceMock + taoQtiTest_models_classes_QtiTestService::class => $this->qtiTestServiceMock, + FeatureFlagChecker::class => $this->featureFlagCheckerMock, ]); } @@ -145,6 +171,13 @@ public function testSaveStringTest() public function testIsLocked() { $service = new XmlEditor([XmlEditor::OPTION_XML_EDITOR_LOCK => false]); + $service->setServiceLocator($this->serviceLocatorMock); + + $this->featureFlagCheckerMock + ->method('isEnabled') + ->with('XML_EDITOR_ENABLED') + ->willReturn(true); + $this->assertEquals(false, $service->isLocked()); } }