webworld888/core/tests/DynamicField/DynamicFieldHandlerTest.php
2021-10-26 19:14:12 +09:00

596 lines
17 KiB
PHP

<?php
/**
* @author XE Developers <developers@xpressengine.com>
* @copyright 2020 Copyright XEHub Corp. <https://www.xehub.io>
* @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL
* @link https://xpressengine.io
*/
namespace Xpressengine\Tests\DynamicField;
use Mockery as m;
use PHPUnit\Framework\TestCase;
use Xpressengine\Config\ConfigEntity;
use Xpressengine\DynamicField\AbstractSkin;
use Xpressengine\DynamicField\AbstractType;
use Xpressengine\DynamicField\DynamicFieldHandler;
use Xpressengine\Plugin\PluginRegister;
/**
* Class DatabaseProxyTest
* @package Xpressengine\Tests\DynamicField
* @author XE Developers <developers@xpressengine.com>
* @copyright 2020 Copyright XEHub Corp. <https://www.xehub.io>
* @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL
* @link https://xpressengine.io
*/
class DynamicFieldHandlerTest extends TestCase
{
/**
* @var m\MockInterface|\Xpressengine\Database\VirtualConnectionInterface
*/
protected $conn;
/**
* @var m\MockInterface|\Xpressengine\DynamicField\ConfigHandler
*/
protected $configHandler;
/**
* @var m\MockInterface|\Xpressengine\DynamicField\RegisterHandler
*/
protected $registerHandler;
/**
* @var m\MockInterface|\Illuminate\View\Factory
*/
protected $view;
/**
* @var PluginRegister
*/
protected $register;
/**
* tear down
*
* @return void
*/
public function tearDown()
{
m::close();
}
/**
* set up
*
* @return void
*/
public function setUp()
{
$conn = m::mock('Xpressengine\Database\VirtualConnectionInterface');
$configHandler = m::mock('Xpressengine\DynamicField\ConfigHandler');
$registerHandler = m::mock('Xpressengine\DynamicField\RegisterHandler');
$view = m::mock('Illuminate\View\Factory');
$pluginRegister = m::mock('Xpressengine\Plugin\PluginRegister');
$this->conn = $conn;
$this->configHandler = $configHandler;
$this->registerHandler = $registerHandler;
$this->view = $view;
$this->register = $pluginRegister;
}
/**
* get config entity
*
* @return m\MockInterface|\Xpressengine\Config\ConfigEntity
*/
private function getConfigEntity()
{
return m::mock('Xpressengine\Config\ConfigEntity');
}
/**
* test get property
*
* @return void
*/
public function testGetProperty()
{
$conn = $this->conn;
$configHandler = $this->configHandler;
$registerHandler = $this->registerHandler;
$view = $this->view;
$register = $this->register;
$handler = new DynamicFieldHandler($conn, $configHandler, $registerHandler, $view, $register);
$this->assertInstanceOf('Xpressengine\DynamicField\ConfigHandler', $handler->getConfigHandler());
$this->assertInstanceOf('Xpressengine\DynamicField\RegisterHandler', $handler->getRegisterHandler());
$this->assertInstanceOf('Xpressengine\Database\VirtualConnectionInterface', $handler->connection());
$this->assertInstanceOf('Illuminate\View\Factory', $handler->getViewFactory());
}
/**
* test set connection
*
* @return void
*/
public function testSetConnection()
{
$conn = $this->conn;
$configHandler = $this->configHandler;
$registerHandler = $this->registerHandler;
$view = $this->view;
$register = $this->register;
$handler = new DynamicFieldHandler($conn, $configHandler, $registerHandler, $view, $register);
$newConn = m::mock('NewConnector', 'Xpressengine\Database\VirtualConnectionInterface');
$handler->setConnection($newConn);
$this->assertInstanceOf('NewConnector', $handler->connection());
}
/**
* test create
*
* @return void
*/
public function testCreate()
{
$conn = $this->conn;
$configHandler = $this->configHandler;
$registerHandler = $this->registerHandler;
$view = $this->view;
$register = $this->register;
$handler = new DynamicFieldHandler($conn, $configHandler, $registerHandler, $view, $register);
$config = $this->getConfigEntity();
$config->shouldReceive('get')->with('id')->andReturn('fieldId');
$config->shouldReceive('get')->with('typeId')->andReturn('type');
$config->shouldReceive('get')->with('group')->andReturn('group-name');
$config->shouldReceive('set');
$conn->shouldReceive('beginTransaction');
$conn->shouldReceive('commit');
$configHandler->shouldReceive('add');
$configHandler->shouldReceive('get')->andReturn(null);
$configHandler->shouldReceive('parent')->andReturn(null);
$configHandler->shouldReceive('setParent');
$type = m::mock('Type', 'Xpressengine\DynamicField\AbstractType');
$type->shouldReceive('setConfig');
$type->shouldReceive('checkExistTypeTables')->andReturn(false);
$type->shouldReceive('createTypeTable');
$registerHandler->shouldReceive('getType')->andReturn($type);
$handler->create($config);
}
/**
* test create invalid config
*
* @expectedException \Xpressengine\DynamicField\Exceptions\InvalidConfigException
* @return void
*/
public function testCreateInvalidConfig()
{
$conn = $this->conn;
$configHandler = $this->configHandler;
$registerHandler = $this->registerHandler;
$view = $this->view;
$register = $this->register;
$handler = new DynamicFieldHandler($conn, $configHandler, $registerHandler, $view, $register);
$config = $this->getConfigEntity();
$config->shouldReceive('get')->with('id')->andReturn(null);
$config->shouldReceive('get')->with('typeId')->andReturn('type');
$config->shouldReceive('get')->with('group')->andReturn('group-name');
$handler->create($config);
}
/**
* test create invalid config
*
* @expectedException \Xpressengine\DynamicField\Exceptions\AlreadyExistException
* @return void
*/
public function testCreateAlreadyExist()
{
$conn = $this->conn;
$configHandler = $this->configHandler;
$registerHandler = $this->registerHandler;
$view = $this->view;
$register = $this->register;
$handler = new DynamicFieldHandler($conn, $configHandler, $registerHandler, $view, $register);
$config = $this->getConfigEntity();
$config->shouldReceive('get')->with('id')->andReturn('id');
$config->shouldReceive('get')->with('typeId')->andReturn('type');
$config->shouldReceive('get')->with('group')->andReturn('group-name');
$configHandler->shouldReceive('get')->andReturn(1);
$handler->create($config);
}
/**
* test put
*
* @return void
*/
public function testPut()
{
$conn = $this->conn;
$configHandler = $this->configHandler;
$registerHandler = $this->registerHandler;
$view = $this->view;
$register = $this->register;
$handler = new DynamicFieldHandler($conn, $configHandler, $registerHandler, $view, $register);
$config = $this->getConfigEntity();
$configHandler->shouldReceive('put');
$handler->put($config);
}
/**
* test drop
*
* @return void
*/
public function testDrop()
{
$conn = $this->conn;
$configHandler = $this->configHandler;
$registerHandler = $this->registerHandler;
$view = $this->view;
$register = $this->register;
$handler = new DynamicFieldHandler($conn, $configHandler, $registerHandler, $view, $register);
$config = $this->getConfigEntity();
$config->shouldReceive('get')->with('typeId')->andReturn('type');
$configHandler->shouldReceive('remove');
$conn->shouldReceive('beginTransaction');
$conn->shouldReceive('commit');
$type = m::mock('Type', 'Xpressengine\DynamicField\AbstractType');
$type->shouldReceive('setConfig');
$type->shouldReceive('dropData');
$registerHandler->shouldReceive('getType')->andReturn($type);
$handler->drop($config);
}
/**
* test gets
*
* @return void
*/
public function testGets()
{
$conn = $this->conn;
$configHandler = $this->configHandler;
$registerHandler = $this->registerHandler;
$view = $this->view;
$register = $this->register;
$handler = m::mock('Xpressengine\DynamicField\DynamicFieldHandler', [
$conn, $configHandler, $registerHandler, $view, $register
])->shouldAllowMockingProtectedMethods()->makePartial();
$group = 'group';
$type = m::mock('Type', 'Xpressengine\DynamicField\AbstractType');
$handler->shouldReceive('getByConfig')->andReturn($type);
$config1 = $this->getConfigEntity();
$config1->shouldReceive('get')->with('id')->andReturn('id');
$configs = [
$config1
];
$configHandler->shouldReceive('gets')->andReturn($configs);
$result = $handler->gets($group);
$this->assertEquals([$config1->get('id') => $type], $result);
foreach ($result as $instance) {
$this->assertInstanceOf('Xpressengine\DynamicField\AbstractType', $instance);
}
}
/**
* test get
*
* @return void
*/
public function testGet()
{
$conn = $this->conn;
$configHandler = $this->configHandler;
$registerHandler = $this->registerHandler;
$view = $this->view;
$register = $this->register;
$handler = m::mock('Xpressengine\DynamicField\DynamicFieldHandler', [
$conn, $configHandler, $registerHandler, $view, $register
])->shouldAllowMockingProtectedMethods()->makePartial();
$group = 'group';
$id = 'id';
$type = m::mock('Type', 'Xpressengine\DynamicField\AbstractType');
$handler->shouldReceive('getByConfig')->andReturn($type);
$configHandler->shouldReceive('get')->once()->andReturn(null);
$result = $handler->get($group, $id);
$this->assertNull($result);
$config = $this->getConfigEntity();
$config->shouldReceive('get')->with('id')->andReturn('id');
$configHandler->shouldReceive('get')->once()->andReturn($config);
$result = $handler->get($group, $id);
$this->assertInstanceOf('Xpressengine\DynamicField\AbstractType', $result);
}
/**
* test has
*
* @return void
*/
public function testHas()
{
$conn = $this->conn;
$configHandler = $this->configHandler;
$registerHandler = $this->registerHandler;
$view = $this->view;
$register = $this->register;
$handler = m::mock('Xpressengine\DynamicField\DynamicFieldHandler', [
$conn, $configHandler, $registerHandler, $view, $register
])->shouldAllowMockingProtectedMethods()->makePartial();
$group = 'group';
$id = 'id';
$type = m::mock('Type', 'Xpressengine\DynamicField\AbstractType');
$handler->shouldReceive('getByConfig')->andReturn($type);
$configHandler->shouldReceive('get')->once()->andReturn(null);
$result = $handler->has($group, $id);
$this->assertFalse($result);
$config = $this->getConfigEntity();
$config->shouldReceive('get')->with('id')->andReturn('id');
$configHandler->shouldReceive('get')->once()->andReturn($config);
$result = $handler->has($group, $id);
$this->assertTrue($result);
}
/**
* test get by config
*
* @return void
*/
public function testGetByConfig()
{
$conn = $this->conn;
$configHandler = $this->configHandler;
$registerHandler = $this->registerHandler;
$view = $this->view;
$register = $this->register;
$handler = new DynamicFieldHandler($conn, $configHandler, $registerHandler, $view, $register);
$config = $this->getConfigEntity();
$config->shouldReceive('get')->with('typeId')->andReturn('type');
$config->shouldReceive('get')->with('skinId')->andReturn('skin');
$type = m::mock('Type', 'Xpressengine\DynamicField\AbstractType');
$type->shouldReceive('setConfig');
$type->shouldReceive('setSkin');
$skin = m::mock('Skin', 'Xpressengine\DynamicField\AbstractSkin');
$skin->shouldReceive('setConfig');
$registerHandler->shouldReceive('getType')->andReturn($type);
$registerHandler->shouldReceive('getSkin')->andReturn($skin);
$result = $handler->getByConfig($config);
$this->assertInstanceOf('Xpressengine\DynamicField\AbstractType', $result);
}
/**
* test get type
*
* @return void
*/
public function testGetType()
{
$conn = $this->conn;
$configHandler = $this->configHandler;
$registerHandler = $this->registerHandler;
$view = $this->view;
$register = $this->register;
$handler = new DynamicFieldHandler($conn, $configHandler, $registerHandler, $view, $register);
$group = 'group';
$id = 'id';
$configHandler->shouldReceive('get')->once()->andReturn(null);
$result = $handler->getType($group, $id);
$this->assertNull($result);
$config = $this->getConfigEntity();
$config->shouldReceive('get')->with('typeId')->andReturn('type');
$configHandler->shouldReceive('get')->once()->andReturn($config);
$type = m::mock('Type', 'Xpressengine\DynamicField\AbstractType');
$type->shouldReceive('setConfig');
$registerHandler->shouldReceive('getType')->andReturn($type);
$result = $handler->getType($group, $id);
$this->assertInstanceOf('Xpressengine\DynamicField\AbstractType', $result);
}
/**
* test get rules
*
* @return void
*/
public function testGetRules()
{
$conn = $this->conn;
$configHandler = $this->configHandler;
$registerHandler = $this->registerHandler;
$view = $this->view;
$register = $this->register;
$handler = m::mock('Xpressengine\DynamicField\DynamicFieldHandler', [
$conn, $configHandler, $registerHandler, $view, $register
])->shouldAllowMockingProtectedMethods()->makePartial();
$id = 'id';
$config = $this->getConfigEntity();
$config->shouldReceive('get')->with('required')->andReturn(false);
$config->shouldReceive('get')->with('typeId')->andReturn(TestType2::getId());
$config->shouldReceive('get')->with('skinId')->andReturn(TestSkin2::getId());
$config->shouldReceive('get')->with('id')->andReturn($id);
$type2 = new TestType2($handler);
$skin2 = new TestSkin2($handler);
$registerHandler->shouldReceive('getType')->andReturn($type2);
$registerHandler->shouldReceive('getSkin')->andReturn($skin2);
$result =$handler->getRules($config);
$this->assertEquals('required', $result[$id . '_f1']);
}
}
class TestType2 extends AbstractType
{
static protected $id = 'typeId';
/**
* get field type name
*
* @return string
*/
public function name()
{
return 'name';
}
/**
* get field type description
*
* @return string
*/
public function description()
{
return 'description';
}
/**
* return columns
*
* @return \Xpressengine\DynamicField\ColumnEntity[]
*/
public function getColumns()
{
$column = m::mock('Xpressengine\DynamicField\ColumnEntity');
$column->shouldReceive('add');
$column->shouldReceive('get')->with('name')->andReturn('id');
$column->shouldReceive('drop');
return [$column];
}
/**
* return rules
*
* @return array
*/
public function getRules()
{
return [
'f1' => 'required',
];
}
/**
* 다이나믹필스 생성할 때 타입 설정에 적용될 rule 반환
*
* @return array
*/
public function getSettingsRules()
{
return ['settings_rules'];
}
/**
* Dynamic Field 설정 페이지에서 각 fieldType 에 필요한 설정 등록 페이지 반환
* return html tag string
*
* @param ConfigEntity $config config entity
* @return string
*/
public function getSettingsView(ConfigEntity $config = null)
{
return '';
}
}
class TestSkin2 extends AbstractSkin
{
static protected $id = 'skinId';
/**
* get name of skin
*
* @return string
*/
public function name()
{
return 'skin_name';
}
/**
* get view file directory path
*
* @return string
*/
public function getPath()
{
return 'skin_path';
}
/**
* 다이나믹필스 생성할 때 스킨 설정에 적용될 rule 반환
*
* @return array
*/
public function getSettingsRules()
{
return ['skin_setting_rules'];
}
}