tao-test/app/taoItems/test/unit/preview/ItemPreviewerServiceTest.php

389 lines
15 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;
*
*/
namespace oat\taoItems\test\unit\preview;
use oat\generis\test\TestCase;
use oat\oatbox\service\ConfigurableService;
use oat\tao\model\ClientLibConfigRegistry;
use oat\tao\model\modules\DynamicModule;
use oat\taoItems\model\preview\ItemPreviewerService;
use Prophecy\Argument;
use Prophecy\Prophet;
/**
* Test the ItemPreviewerService
*
* @author Jean-Sébastien Conan <jean-sebastien@taotesting.com>
*/
class ItemPreviewerServiceTest extends TestCase
{
//data to stub the registry content
private static $adapterData = [
'taoItems/previewer/factory' => [
'previewers' => [
'taoQtiTest/previewer/adapter/qtiItem' => [
'id' => 'qtiItem',
'module' => 'taoQtiTest/previewer/adapter/qtiItem',
'bundle' => 'taoQtiTest/loader/qtiPreviewer.min',
'position' => null,
'name' => 'QTI Item Previewer',
'description' => 'QTI implementation of the item previewer',
'category' => 'previewer',
'active' => true,
'tags' => [
'core',
'qti',
'previewer'
]
],
'taoQtiTest/previewer/adapter/qtiTest' => [
'id' => 'qtiTest',
'module' => 'taoQtiTest/previewer/adapter/qtiTest',
'bundle' => 'taoQtiTest/loader/qtiPreviewer.min',
'position' => null,
'name' => 'QTI Test Previewer',
'description' => 'QTI implementation of the test previewer',
'category' => 'previewer',
'active' => false,
'tags' => [
'core',
'qti',
'previewer'
]
]
],
'plugins' => [
[
'id' => 'plugin1',
'module' => 'taoQtiTest/previewer/plugins/plugin1',
'bundle' => 'taoQtiTest/loader/qtiPlugins.min',
'position' => null,
'name' => 'Plugin 1',
'description' => 'Sample plugin 1',
'category' => 'previewer',
'active' => true,
'tags' => [
'core',
'qti',
'previewer'
]
],
[
'id' => 'plugin2',
'module' => 'taoQtiTest/previewer/plugins/plugin2',
'bundle' => 'taoQtiTest/loader/qtiPlugins.min',
'position' => null,
'name' => 'Plugin 2',
'description' => 'Sample plugin 2',
'category' => 'previewer',
'active' => false,
'tags' => [
'core',
'qti',
'previewer'
]
]
]
]
];
/**
* Get the service with the stubbed registry
* @return ItemPreviewerService
*/
protected function getItemPreviewerService()
{
$itemPreviewerService = new ItemPreviewerService();
$prophet = new Prophet();
$prophecy = $prophet->prophesize(ClientLibConfigRegistry::class);
$data = self::$adapterData;
$prophecy->isRegistered(Argument::type('string'))->will(function ($args) use (&$data) {
return isset($data[$args[0]]);
});
$prophecy->get(Argument::type('string'))->will(function ($args) use (&$data) {
return $data[$args[0]];
});
$prophecy->set(Argument::type('string'), Argument::type('array'))->will(function ($args) use (&$data) {
$data[$args[0]] = $args[1];
});
$itemPreviewerService->setRegistry($prophecy->reveal());
return $itemPreviewerService;
}
/**
* Check the service is a service
*/
public function testApi()
{
$itemPreviewerService = $this->getItemPreviewerService();
$this->assertInstanceOf(ItemPreviewerService::class, $itemPreviewerService);
$this->assertInstanceOf(ConfigurableService::class, $itemPreviewerService);
}
/**
* Test the method ItemPreviewerService::getAdapters
*/
public function testGetAdapters()
{
$itemPreviewerService = $this->getItemPreviewerService();
$adapters = $itemPreviewerService->getAdapters();
$this->assertEquals(2, count($adapters));
$this->assertArrayHasKey('taoQtiTest/previewer/adapter/qtiItem', $adapters);
$adapter0 = $adapters['taoQtiTest/previewer/adapter/qtiItem'];
$this->assertArrayHasKey('id', $adapter0);
$this->assertArrayHasKey('module', $adapter0);
$this->assertArrayHasKey('bundle', $adapter0);
$this->assertArrayHasKey('category', $adapter0);
$this->assertArrayHasKey('active', $adapter0);
$this->assertEquals('qtiItem', $adapter0['id']);
$this->assertEquals('taoQtiTest/previewer/adapter/qtiItem', $adapter0['module']);
$this->assertEquals('taoQtiTest/loader/qtiPreviewer.min', $adapter0['bundle']);
$this->assertEquals('previewer', $adapter0['category']);
$this->assertEquals(true, $adapter0['active']);
$this->assertArrayHasKey('taoQtiTest/previewer/adapter/qtiTest', $adapters);
$adapter1 = $adapters['taoQtiTest/previewer/adapter/qtiTest'];
$this->assertArrayHasKey('id', $adapter1);
$this->assertArrayHasKey('module', $adapter1);
$this->assertArrayHasKey('bundle', $adapter1);
$this->assertArrayHasKey('category', $adapter1);
$this->assertArrayHasKey('active', $adapter1);
$this->assertEquals('qtiTest', $adapter1['id']);
$this->assertEquals('taoQtiTest/previewer/adapter/qtiTest', $adapter1['module']);
$this->assertEquals('taoQtiTest/loader/qtiPreviewer.min', $adapter1['bundle']);
$this->assertEquals('previewer', $adapter1['category']);
$this->assertEquals(false, $adapter1['active']);
}
/**
* Test the method ItemPreviewerService::getPlugins
*/
public function testGetPlugins()
{
$itemPreviewerService = $this->getItemPreviewerService();
$plugins = $itemPreviewerService->getPlugins();
$this->assertEquals(2, count($plugins));
$this->assertArrayHasKey('0', $plugins);
$plugin0 = $plugins[0];
$this->assertArrayHasKey('id', $plugin0);
$this->assertArrayHasKey('module', $plugin0);
$this->assertArrayHasKey('bundle', $plugin0);
$this->assertArrayHasKey('category', $plugin0);
$this->assertArrayHasKey('active', $plugin0);
$this->assertEquals('plugin1', $plugin0['id']);
$this->assertEquals('taoQtiTest/previewer/plugins/plugin1', $plugin0['module']);
$this->assertEquals('taoQtiTest/loader/qtiPlugins.min', $plugin0['bundle']);
$this->assertEquals('previewer', $plugin0['category']);
$this->assertEquals(true, $plugin0['active']);
$this->assertArrayHasKey('1', $plugins);
$plugin1 = $plugins[1];
$this->assertArrayHasKey('id', $plugin1);
$this->assertArrayHasKey('module', $plugin1);
$this->assertArrayHasKey('bundle', $plugin1);
$this->assertArrayHasKey('category', $plugin1);
$this->assertArrayHasKey('active', $plugin1);
$this->assertEquals('plugin2', $plugin1['id']);
$this->assertEquals('taoQtiTest/previewer/plugins/plugin2', $plugin1['module']);
$this->assertEquals('taoQtiTest/loader/qtiPlugins.min', $plugin1['bundle']);
$this->assertEquals('previewer', $plugin1['category']);
$this->assertEquals(false, $plugin1['active']);
}
/**
* Test the method ItemPreviewerService::registerAdapter
*/
public function testRegisterAdapter()
{
$itemPreviewerService = $this->getItemPreviewerService();
$adapters = $itemPreviewerService->getAdapters();
$this->assertEquals(2, count($adapters));
$this->assertArrayHasKey('taoQtiTest/previewer/adapter/qtiItem', $adapters);
$this->assertArrayHasKey('taoQtiTest/previewer/adapter/qtiTest', $adapters);
$this->assertArrayNotHasKey('taoQtiTest/previewer/adapter/qtiMock', $adapters);
$module = DynamicModule::fromArray([
'id' => 'qtiMock',
'name' => 'QTI Mock Previewer',
'module' => 'taoQtiTest/previewer/adapter/qtiMock',
'bundle' => 'taoQtiTest/loader/qtiPreviewer.min',
'description' => 'QTI implementation of the item previewer',
'category' => 'previewer',
'active' => true,
'tags' => ['core', 'qti', 'previewer']
]);
$this->assertEquals(true, $itemPreviewerService->registerAdapter($module));
$adapters = $itemPreviewerService->getAdapters();
$this->assertEquals(3, count($adapters));
$this->assertArrayHasKey('taoQtiTest/previewer/adapter/qtiItem', $adapters);
$this->assertArrayHasKey('taoQtiTest/previewer/adapter/qtiTest', $adapters);
$this->assertArrayHasKey('taoQtiTest/previewer/adapter/qtiMock', $adapters);
}
/**
* Test the method ItemPreviewerService::unregisterAdapter
*/
public function testUnregisterAdapter()
{
$itemPreviewerService = $this->getItemPreviewerService();
$adapters = $itemPreviewerService->getAdapters();
$this->assertEquals(2, count($adapters));
$this->assertArrayHasKey('taoQtiTest/previewer/adapter/qtiItem', $adapters);
$this->assertArrayHasKey('taoQtiTest/previewer/adapter/qtiTest', $adapters);
$this->assertEquals(true, $itemPreviewerService->unregisterAdapter('taoQtiTest/previewer/adapter/qtiTest'));
$adapters = $itemPreviewerService->getAdapters();
$this->assertEquals(1, count($adapters));
$this->assertArrayHasKey('taoQtiTest/previewer/adapter/qtiItem', $adapters);
$this->assertArrayNotHasKey('taoQtiTest/previewer/adapter/qtiTest', $adapters);
$this->assertEquals(false, $itemPreviewerService->unregisterAdapter('taoQtiTest/previewer/adapter/qtiTest'));
}
/**
* Test the method ItemPreviewerService::registerPlugin
*/
public function testRegisterPlugin()
{
$itemPreviewerService = $this->getItemPreviewerService();
$plugins = $itemPreviewerService->getPlugins();
$this->assertEquals(2, count($plugins));
$this->assertArrayHasKey('0', $plugins);
$this->assertArrayHasKey('id', $plugins[0]);
$this->assertEquals('plugin1', $plugins[0]['id']);
$this->assertArrayHasKey('1', $plugins);
$this->assertArrayHasKey('id', $plugins[1]);
$this->assertEquals('plugin2', $plugins[1]['id']);
$this->assertArrayNotHasKey('2', $plugins);
$module = DynamicModule::fromArray(
[
'id' => 'plugin3',
'module' => 'taoQtiTest/previewer/plugins/plugin3',
'bundle' => 'taoQtiTest/loader/qtiPlugins.min',
'name' => 'Plugin 3',
'description' => 'Sample plugin 3',
'category' => 'previewer',
'active' => true,
'tags' => []
]
);
$this->assertEquals(true, $itemPreviewerService->registerPlugin($module));
$plugins = $itemPreviewerService->getPlugins();
$this->assertEquals(3, count($plugins));
$this->assertArrayHasKey('0', $plugins);
$this->assertArrayHasKey('id', $plugins[0]);
$this->assertEquals('plugin1', $plugins[0]['id']);
$this->assertArrayHasKey('1', $plugins);
$this->assertArrayHasKey('id', $plugins[1]);
$this->assertEquals('plugin2', $plugins[1]['id']);
$this->assertArrayHasKey('2', $plugins);
$this->assertArrayHasKey('id', $plugins[2]);
$this->assertEquals('plugin3', $plugins[2]['id']);
$module = DynamicModule::fromArray(
[
'id' => 'plugin3bis',
'module' => 'taoQtiTest/previewer/plugins/plugin3',
'bundle' => 'taoQtiTest/loader/qtiPlugins.min',
'name' => 'Plugin 3 bis',
'description' => 'Sample plugin 3',
'category' => 'previewer',
'active' => true,
'tags' => []
]
);
$this->assertEquals(true, $itemPreviewerService->registerPlugin($module));
$plugins = $itemPreviewerService->getPlugins();
$this->assertEquals(3, count($plugins));
$this->assertArrayHasKey('2', $plugins);
$this->assertArrayHasKey('id', $plugins[2]);
$this->assertEquals('plugin3bis', $plugins[2]['id']);
}
/**
* Test the method ItemPreviewerService::unregisterPlugin
*/
public function testUnregisterPlugin()
{
$itemPreviewerService = $this->getItemPreviewerService();
$plugins = $itemPreviewerService->getPlugins();
$this->assertEquals(2, count($plugins));
$this->assertArrayHasKey('0', $plugins);
$this->assertArrayHasKey('id', $plugins[0]);
$this->assertEquals('plugin1', $plugins[0]['id']);
$this->assertArrayHasKey('1', $plugins);
$this->assertArrayHasKey('id', $plugins[1]);
$this->assertEquals('plugin2', $plugins[1]['id']);
$this->assertEquals(true, $itemPreviewerService->unregisterPlugin('taoQtiTest/previewer/plugins/plugin2'));
$plugins = $itemPreviewerService->getPlugins();
$this->assertEquals(1, count($plugins));
$this->assertArrayHasKey('0', $plugins);
$this->assertArrayHasKey('id', $plugins[0]);
$this->assertEquals('plugin1', $plugins[0]['id']);
$this->assertArrayNotHasKey('1', $plugins);
$this->assertEquals(false, $itemPreviewerService->unregisterPlugin('taoQtiTest/previewer/plugins/plugin2'));
}
}