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

449 lines
16 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\Document;
use ArrayIterator;
use Mockery as m;
use PHPUnit\Framework\TestCase;
use Xpressengine\Document\DocumentHandler;
/**
* Class DocumentHandler
* @package Xpressengine\Tests\Document
* @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 DocumentHandlerTest extends TestCase
{
protected $conn;
protected $configHandler;
protected $instanceManager;
protected $request;
/**
* tear down
*
* @return void
*/
public function tearDown()
{
m::close();
}
/**
* set up
*
* @return void
*/
public function setUp()
{
$conn = m::mock('Xpressengine\Database\VirtualConnectionInterface');
$conn->shouldReceive('beginTransaction');
$conn->shouldReceive('commit');
$configHandler = m::mock('Xpressengine\Document\ConfigHandler');
$instanceManager = m::mock('Xpressengine\Document\InstanceManager');
$request = m::mock('\Illuminate\Http\Request');
$this->conn = $conn;
$this->configHandler = $configHandler;
$this->instanceManager = $instanceManager;
$this->request = $request;
}
/**
* @return m\MockInterface|\Xpressengine\Document\Models\Document
*/
private function getDocModel()
{
$doc = m::mock('Xpressengine\Document\Models\Document');
$doc->shouldReceive('getConnection')->andReturn($this->conn);
return $doc;
}
/**
* @return m\MockInterface|\Xpressengine\Document\Models\Revision
*/
private function getRevisionModel()
{
$revision = m::mock('Xpressengine\Document\Models\Revision');
$revision->shouldReceive('getConnection')->andReturn($this->conn);
return $revision;
}
/**
* get User instance
*
* @return m\MockInterface|\Xpressengine\User\UserInterface
*/
private function getUser()
{
$user = m::mock(
'Xpressengine\User\Models\User',
'Xpressengine\User\UserInterface'
);
return $user;
}
/**
* get config entity
*
* @return m\MockInterface|\Xpressengine\Config\ConfigEntity
*/
private function getConfigEntity()
{
return m::mock('Xpressengine\Config\ConfigEntity');
}
/**
* @param array $items items
*
* @return m\MockInterface|\Illuminate\Pagination\LengthAwarePaginator
*/
private function getPaginator(array $items)
{
$paginator = m::mock('Illuminate\Pagination\LengthAwarePaginator');
$paginator->shouldReceive('offsetSet');
$arrayIterator = new ArrayIterator($items);
$paginator->shouldReceive('getIterator')->andReturn($arrayIterator);
return $paginator;
}
/**
* get document handler instance
*
* return DocumentHandler
*/
private function getHandler()
{
$conn = $this->conn;
$configHandler = $this->configHandler;
$instanceManager = $this->instanceManager;
$request = $this->request;
$handler = m::mock('Xpressengine\Document\DocumentHandler', [
$conn,
$configHandler,
$instanceManager,
$request
])
->shouldAllowMockingProtectedMethods()
->makePartial();
return $handler;
}
/**
* test get property
*
* @return void
*/
public function testGetProperty()
{
$handler = $this->getHandler();
$this->assertInstanceOf('Xpressengine\Document\ConfigHandler', $handler->getConfigHandler());
$this->assertInstanceOf('Xpressengine\Document\InstanceManager', $handler->getInstanceManager());
}
/**
* test add document
*
* @return void
*/
public function testAdd()
{
$docId = 'document-id';
$instanceId = 'instance-id';
$revision = true;
$group = 'document-group';
$configEntity = $this->getConfigEntity();
$configEntity->shouldReceive('get')->with('revision')->andReturn($revision);
$configEntity->shouldReceive('get')->with('instanceId')->andReturn($instanceId);
$configEntity->shouldReceive('get')->with('group')->andReturn($group);
$this->configHandler->shouldReceive('get')->andReturn(null);
$this->configHandler->shouldReceive('getOrDefault')->andReturn($configEntity);
$this->request->shouldReceive('ip')->andReturn('127.0.0.1');
$this->instanceManager->shouldReceive('getDivisionTableName')
->with($configEntity)->andReturn('new-division-table-name');
$handler = $this->getHandler();
$attributes = [
'id' => $docId,
'instance_id' => $instanceId,
];
$docModel = $this->getDocModel();
$docModel->shouldReceive('getAttribute')->once()->andReturn($instanceId);
$docModel->shouldReceive('setConfig');
$docModel->shouldReceive('fixedAttributes')->once()->with($attributes)->andReturn($attributes);
$docModel->shouldReceive('getAttribute')->andReturn($attributes);
$docModel->shouldReceive('checkRequired');
$docModel->shouldReceive('setProxyOptions');
$docModel->shouldReceive('fill');
$docModel->shouldReceive('save');
$docModel->shouldReceive('getDynamicAttributes')->andReturn([]);
$docModel->shouldReceive('hasMacro')->andReturn(false);
$docModel->shouldReceive('getAttributes')->andReturn($attributes);
$revisionModel = $this->getRevisionModel();
$revisionModel->shouldReceive('where')->andReturnSelf();
$revisionModel->shouldReceive('max')->andReturn(1);
$revisionModel->shouldReceive('setProxyOptions');
$revisionModel->shouldReceive('setAttribute');
$revisionModel->shouldReceive('fill');
$revisionModel->shouldReceive('save');
$handler->shouldReceive('newModel')->andReturn($docModel);
$handler->shouldReceive('getRevisionModel')->andReturn($revisionModel);
$handler->shouldReceive('newRevisionModel')->andReturn($revisionModel);
$result = $handler->add($attributes);
$this->assertInstanceOf('Xpressengine\Document\Models\Document', $result);
}
/**
* test add document
*
* @return void
*/
public function testPut()
{
$docId = 'document-id';
$instanceId = 'instance-id';
$revision = true;
$group = 'document-group';
$content = 'content';
$configEntity = $this->getConfigEntity();
$configEntity->shouldReceive('get')->with('revision')->andReturn($revision);
$configEntity->shouldReceive('get')->with('instanceId')->andReturn($instanceId);
$configEntity->shouldReceive('get')->with('group')->andReturn($group);
$this->configHandler->shouldReceive('get')->andReturn(null);
$this->configHandler->shouldReceive('getOrDefault')->andReturn($configEntity);
$this->request->shouldReceive('ip')->andReturn('127.0.0.1');
$this->instanceManager->shouldReceive('getDivisionTableName')
->with($configEntity)->andReturn('new-division-table-name');
$handler = $this->getHandler();
$attributes = [
'id' => $docId,
'instance_id' => $instanceId,
];
$docModel = $this->getDocModel();
$docModel->shouldReceive('getAttribute')->with('id')->andReturn($docId);
$docModel->shouldReceive('getAttribute')->with('instance_id')->andReturn($instanceId);
$docModel->shouldReceive('getAttribute')->with('content')->andReturn($content);
$docModel->shouldReceive('setConfig');
$docModel->shouldReceive('fixedAttributes')->with($attributes)->andReturn($attributes);
$docModel->shouldReceive('checkRequired');
$docModel->shouldReceive('setProxyOptions');
$docModel->shouldReceive('fill');
$docModel->shouldReceive('save');
$docModel->shouldReceive('getDynamicAttributes')->andReturn([]);
$docModel->shouldReceive('hasMacro')->andReturn(false);
$docModel->shouldReceive('getAttributes')->andReturn($attributes);
$docModel->shouldReceive('getAttribute')->with('ipaddress')->andReturn('127.0.0.1');
$docModel->shouldReceive('setAttribute');
$docModel->shouldReceive('getPureContent')->andReturn($content);
$docModel->shouldReceive('setAttribute')->with('pureContent', $content);
$docModel->shouldReceive('toArray')->andReturn($attributes);
$docModel->shouldReceive('find')->with($docId)->andReturnSelf();
$revisionModel = $this->getRevisionModel();
$revisionModel->shouldReceive('where')->andReturnSelf();
$revisionModel->shouldReceive('max')->andReturn(1);
$revisionModel->shouldReceive('setProxyOptions');
$revisionModel->shouldReceive('setAttribute');
$revisionModel->shouldReceive('fill');
$revisionModel->shouldReceive('save');
$handler->shouldReceive('newModel')->andReturn($docModel);
$handler->shouldReceive('getRevisionModel')->andReturn($revisionModel);
$handler->shouldReceive('newRevisionModel')->andReturn($revisionModel);
$result = $handler->put($docModel);
$this->assertInstanceOf('Xpressengine\Document\Models\Document', $result);
}
/**
* instance id 를 변경해서 수정하는 경우
*
* @return void
*/
public function testPutWithDifferentInstanceId()
{
$originInstanceId = 'origin-instance-id';
$originDivisionTableName = 'origin-division-table-name';
$docId = 'document-id';
$instanceId = 'instance-id';
$revision = true;
$division = true;
$group = 'document-group';
$content = 'content';
$attributes = [
'id' => $docId,
'instance_id' => $instanceId,
];
$configEntity = $this->getConfigEntity();
$configEntity->shouldReceive('get')->with('revision')->andReturn($revision);
$configEntity->shouldReceive('get')->with('instanceId')->andReturn($instanceId);
$configEntity->shouldReceive('get')->with('group')->andReturn($group);
$this->configHandler->shouldReceive('get')->with($instanceId)->andReturn($configEntity);
$this->configHandler->shouldReceive('getOrDefault')->with($instanceId)->andReturn($configEntity);
$originConfigEntity = $this->getConfigEntity();
$originConfigEntity->shouldReceive('get')->with('revision')->andReturn($revision);
$originConfigEntity->shouldReceive('get')->with('division')->andReturn($division);
$originConfigEntity->shouldReceive('get')->with('instanceId')->andReturn($originInstanceId);
$originConfigEntity->shouldReceive('get')->with('group')->andReturn($group);
$this->configHandler->shouldReceive('get')->with($originInstanceId)->andReturn($originConfigEntity);
$this->configHandler->shouldReceive('getOrDefault')->with($originInstanceId)->andReturn($originConfigEntity);
$this->configHandler->shouldReceive('getOrDefault')->with(null)->andReturn($originConfigEntity);
$this->request->shouldReceive('ip')->andReturn('127.0.0.1');
$this->instanceManager->shouldReceive('getDivisionTableName')
->with($originConfigEntity)->andReturn($originDivisionTableName);
$handler = $this->getHandler();
$docModel = $this->getDocModel();
$docModel->shouldReceive('getAttribute')->with('id')->andReturn($docId);
$docModel->shouldReceive('getAttribute')->with('instance_id')->andReturn($instanceId);
$docModel->shouldReceive('getAttribute')->with('content')->andReturn($content);
$docModel->shouldReceive('setAttribute')->with('pure_content', $content);
$docModel->shouldReceive('getAttribute')->with('ipaddress')->andReturn('127.0.0.1');
$docModel->shouldReceive('getPureContent')->andReturn($content);
$docModel->shouldReceive('checkRequired');
$docModel->shouldReceive('setProxyOptions');
$docModel->shouldReceive('toArray')->andReturn($attributes);
$docModel->shouldReceive('save');
$docModel->shouldReceive('getOriginal')->with('instance_id')->andReturn($originInstanceId);
$docModel->shouldReceive('getDynamicAttributes')->andReturn([]);
$docModel->shouldReceive('hasMacro')->andReturn(false);
$docModel->shouldReceive('getAttributes')->andReturn($attributes);
$orgModel = $this->getDocModel();
$orgModel->shouldReceive('hasMacro')->andReturn(false);
$orgModel->shouldReceive('getAttribute')->with('id')->andReturn($docId);
$orgModel->shouldReceive('getAttribute')->with('instance_id')->andReturn($originInstanceId);
$newModel = $this->getDocModel();
$newModel->shouldReceive('setConfig');
$newModel->shouldReceive('find')->with($docId)->andReturn($orgModel);
$newModel->shouldReceive('setTable');
$newModel->shouldReceive('delete');
$revisionModel = $this->getRevisionModel();
$revisionModel->shouldReceive('where')->andReturnSelf();
$revisionModel->shouldReceive('max')->andReturn(1);
$revisionModel->shouldReceive('fill');
$revisionModel->shouldReceive('setProxyOptions');
$revisionModel->shouldReceive('setAttribute');
$revisionModel->shouldReceive('save');
$handler->shouldReceive('newModel')->andReturn($newModel);
$handler->shouldReceive('getRevisionModel')->andReturn($revisionModel);
$handler->shouldReceive('newRevisionModel')->andReturn($revisionModel);
$result = $handler->put($docModel);
$this->assertInstanceOf('Xpressengine\Document\Models\Document', $result);
}
/**
* test remove
*
* @return void
*/
public function testRemove()
{
$handler = $this->getHandler();
$instanceId = 'instance-id';
$configEntity = $this->getConfigEntity();
$configEntity->shouldReceive('get')->with('instanceId')->andReturn($instanceId);
$this->configHandler->shouldReceive('get')->with($instanceId)->andReturn($configEntity);
$this->configHandler->shouldReceive('getOrDefault')->with($instanceId)->andReturn($configEntity);
$docModel = $this->getDocModel();
$docModel->shouldReceive('hasMacro')->andReturn(false);
$docModel->shouldReceive('getAttribute')->with('instance_id')->andReturn($instanceId);
$docModel->shouldReceive('setProxyOptions');
$docModel->shouldReceive('delete')->andReturn(1);
$handler->remove($docModel);
}
/**
* test get
*
* @return void
*/
public function testGet()
{
$docId = 'document-id';
$instanceId = 'instance-id';
$handler = $this->getHandler();
$docModel = $this->getDocModel();
$docModel->shouldReceive('where')->andReturn($docModel);
$docModel->shouldReceive('first')->andReturn($docModel);
$handler->shouldReceive('newModel')->andReturn($docModel);
$doc = $handler->get($docId, $instanceId);
$this->assertInstanceOf('\Xpressengine\Document\Models\Document', $doc);
}
/**
* test get
*
* @expectedException \Xpressengine\Document\Exceptions\DocumentNotFoundException
*/
public function testGetFailDocumentNotFound()
{
$docId = 'document-id';
$instanceId = 'instance-id';
$handler = $this->getHandler();
$docModel = $this->getDocModel();
$docModel->shouldReceive('where')->andReturn($docModel);
$docModel->shouldReceive('first')->andReturn(null);
$handler->shouldReceive('newModel')->andReturn($docModel);
$handler->get($docId, $instanceId);
}
}