tao-test/app/taoQtiItem/test/integration/portableElement/PortableElementServiceTest.php

246 lines
10 KiB
PHP

<?php
/**
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; under version 2
* of the License (non-upgradable).
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* 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) 2018 (original work) Open Assessment Technologies SA;
*
*/
declare(strict_types=1);
namespace oat\taoQtiItem\portableElement\test;
use oat\oatbox\filesystem\FileSystemService;
use oat\oatbox\service\ServiceManager;
use oat\tao\model\websource\ActionWebSource;
use oat\tao\test\TaoPhpUnitTestRunner;
use oat\taoQtiItem\model\portableElement\exception\PortableElementNotFoundException;
use oat\taoQtiItem\model\portableElement\exception\PortableModelMissing;
use oat\taoQtiItem\model\portableElement\PortableElementService;
use oat\taoQtiItem\model\portableElement\storage\PortableElementFileStorage;
use oat\taoQtiItem\model\qti\ParserFactory;
class PortableElementServiceTest extends TaoPhpUnitTestRunner
{
/**
* @var PortableElementService
*/
protected $instance;
/** @var PortableElementService */
private $service;
public function setUp(): void
{
$this->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);
}
}