service = new PortableElementService(); $this->service->setServiceLocator(ServiceManager::getServiceManager()); $this->createFileStorage(); $this->clearSamplePortableElements(); } private function createFileStorage(): void { $fsId = 'portableElementStorage'; /** @var FileSystemService $fsm */ $fsm = ServiceManager::getServiceManager()->get(FileSystemService::SERVICE_ID); if (!ServiceManager::getServiceManager()->has(FileSystemService::SERVICE_ID)) { ServiceManager::getServiceManager()->registerService(FileSystemService::SERVICE_ID, $fsm); } if (! $fsm->hasDirectory($fsId)) { $fsm->createFileSystem($fsId); } $itemImsPci = 'qtiItemImsPci'; if (!$fsm->hasDirectory($itemImsPci)) { $fsm->createFileSystem($itemImsPci); } if (!ServiceManager::getServiceManager()->has(PortableElementFileStorage::SERVICE_ID) ) { $portableElementStorage = new PortableElementFileStorage([ PortableElementFileStorage::OPTION_FILESYSTEM => $fsId, PortableElementFileStorage::OPTION_WEBSOURCE => ActionWebSource::spawnWebsource($fsId)->getId() ]); ServiceManager::getServiceManager()->register(PortableElementFileStorage::SERVICE_ID, $portableElementStorage); } } public function tearDown(): void { $this->clearSamplePortableElements(); $this->service = null; } private function clearSamplePortableElements(): void { $pciLast = $this->service->getPortableElementByIdentifier('PCI', 'pciSampleA'); if (!is_null($pciLast)) { $pciLast = $this->service->getPortableElementByIdentifier('PCI', 'pciSampleA'); $pciLast->getModel()->getRegistry()->removeAllVersions('pciSampleA'); } } public function testRegisterFromDirectorySource(): void { //register an initial version v0.4.0; $this->service->registerFromDirectorySource(__DIR__ . '/samples/pciDir040'); $pciLast = $this->service->getPortableElementByIdentifier('PCI', 'pciSampleA'); $registry = $pciLast->getModel()->getRegistry(); $this->assertEquals('0.4.0', $pciLast->getVersion()); $this->assertNotFalse(strpos($registry->getFileStream($pciLast, 'pciCreator.js')->getContents(), '[version=0.4.0]')); $pci040 = $this->service->getPortableElementByIdentifier('PCI', 'pciSampleA', '0.4.0'); $this->assertEquals('0.4.0', $pci040->getVersion()); $this->assertNotFalse(strpos($registry->getFileStream($pci040, 'pciCreator.js')->getContents(), '[version=0.4.0]')); //check that the actual file is the same as 0.4.0 $pciAlias = $this->service->getPortableElementByIdentifier('PCI', 'pciSampleA', '0.4.*'); $this->assertEquals('0.4.*', $pciAlias->getVersion()); $this->assertNotFalse(strpos($registry->getFileStream($pciAlias, 'pciCreator.js')->getContents(), '[version=0.4.0]')); //register a fix v0.4.1 $this->service->registerFromDirectorySource(dirname(__FILE__) . '/samples/pciDir041'); $pci040 = $this->service->getPortableElementByIdentifier('PCI', 'pciSampleA', '0.4.0'); $this->assertEquals('0.4.0', $pci040->getVersion()); $this->assertNotFalse(strpos($registry->getFileStream($pci040, 'pciCreator.js')->getContents(), '[version=0.4.0]')); $pci041 = $this->service->getPortableElementByIdentifier('PCI', 'pciSampleA', '0.4.1'); $this->assertEquals('0.4.1', $pci041->getVersion()); $this->assertNotFalse(strpos($registry->getFileStream($pci041, 'pciCreator.js')->getContents(), '[version=0.4.1]')); //check that the alias points to the same files as the new v0.4.1 $pciAlias = $this->service->getPortableElementByIdentifier('PCI', 'pciSampleA', '0.4.*'); $this->assertEquals('0.4.*', $pciAlias->getVersion()); $this->assertNotFalse(strpos($registry->getFileStream($pciAlias, 'pciCreator.js')->getContents(), '[version=0.4.1]')); //the most recent version is still v0.4.1 $pciLast = $this->service->getPortableElementByIdentifier('PCI', 'pciSampleA'); $this->assertEquals('0.4.1', $pciLast->getVersion()); $this->assertNotFalse(strpos($registry->getFileStream($pciLast, 'pciCreator.js')->getContents(), '[version=0.4.1]')); } public function testGetPortableElementByClass() { $xml = new \DOMDocument(); $xml->load(__DIR__ . '/samples/item/pci_pic_sample_1.xml'); $parser = new ParserFactory($xml); $item = $parser->load(); $pcis = $this->service->getPortableElementByClass(PortableElementService::PORTABLE_CLASS_INTERACTION, $item); $this->assertEquals(2, count($pcis)); $this->assertTrue(isset($pcis['likertScaleInteraction'])); $this->assertEquals(1, count($pcis['likertScaleInteraction'])); $this->assertTrue(isset($pcis['liquidsInteraction'])); $this->assertEquals(1, count($pcis['liquidsInteraction'])); } public function testGetPortableElementByClassAlias() { $xml = new \DOMDocument(); $xml->load(__DIR__ . '/samples/item/pci_sample_1.xml'); $parser = new ParserFactory($xml); $item = $parser->load(); $this->service->registerFromDirectorySource(dirname(__FILE__) . '/samples/pciDir040'); $pcis = $this->service->getPortableElementByClass(PortableElementService::PORTABLE_CLASS_INTERACTION, $item); $this->assertEquals(1, count($pcis)); $this->assertTrue(isset($pcis['pciSampleA'])); $pci = reset($pcis['pciSampleA']); $this->assertEquals('0.4.0', $pci['version']); $pcis = $this->service->getPortableElementByClass(PortableElementService::PORTABLE_CLASS_INTERACTION, $item, true); $pci = reset($pcis['pciSampleA']); $this->assertEquals('0.4.*', $pci['version']); $this->service->registerFromDirectorySource(dirname(__FILE__) . '/samples/pciDir041'); $pcis = $this->service->getPortableElementByClass(PortableElementService::PORTABLE_CLASS_INTERACTION, $item); $pci = reset($pcis['pciSampleA']); $this->assertEquals('0.4.1', $pci['version']); $pcis = $this->service->getPortableElementByClass(PortableElementService::PORTABLE_CLASS_INTERACTION, $item, true); $pci = reset($pcis['pciSampleA']); $this->assertEquals('0.4.*', $pci['version']); } public function testSetBaseUrlToPortableData() { $xml = new \DOMDocument(); $xml->load(__DIR__ . '/samples/item/pci_sample_1.xml'); $parser = new ParserFactory($xml); $item = $parser->load(); $this->service->registerFromDirectorySource(dirname(__FILE__) . '/samples/pciDir040'); $pcis = $this->service->getPortableElementByClass(PortableElementService::PORTABLE_CLASS_INTERACTION, $item); $this->assertEquals(1, count($pcis)); $this->assertTrue(isset($pcis['pciSampleA'])); $pci = reset($pcis['pciSampleA']); $this->service->setBaseUrlToPortableData($pci); $this->assertTrue(isset($pci['baseUrl'])); } public function testSetBaseUrlToPortableDataUnknownVersion() { $this->expectException(PortableElementNotFoundException::class); $xml = new \DOMDocument(); $xml->load(__DIR__ . '/samples/item/pci_sample_1.xml'); $parser = new ParserFactory($xml); $item = $parser->load(); $this->service->registerFromDirectorySource(dirname(__FILE__) . '/samples/pciDir040'); $pcis = $this->service->getPortableElementByClass(PortableElementService::PORTABLE_CLASS_INTERACTION, $item); $this->assertEquals(1, count($pcis)); $this->assertTrue(isset($pcis['pciSampleA'])); $pci = reset($pcis['pciSampleA']); //setting a version that does not exist $pci['version'] = '9.9.9'; $this->service->setBaseUrlToPortableData($pci); } public function testSetBaseUrlToPortableDataUnknownModel() { $this->expectException(PortableModelMissing::class); $xml = new \DOMDocument(); $xml->load(__DIR__ . '/samples/item/pci_sample_1.xml'); $parser = new ParserFactory($xml); $item = $parser->load(); $this->service->registerFromDirectorySource(dirname(__FILE__) . '/samples/pciDir040'); $pcis = $this->service->getPortableElementByClass(PortableElementService::PORTABLE_CLASS_INTERACTION, $item); $this->assertEquals(1, count($pcis)); $this->assertTrue(isset($pcis['pciSampleA'])); $pci = reset($pcis['pciSampleA']); //setting a version that does not exist $pci['model'] = 'UNKNOWN_MODEL'; $this->service->setBaseUrlToPortableData($pci); } }