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

294 lines
12 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\Database;
use Mockery as m;
use PHPUnit\Framework\TestCase;
use Xpressengine\Database\DynamicQuery;
/**
* Class DynamicQueryTest
* @package Xpressengine\Tests\Database
* @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 DynamicQueryTest extends TestCase
{
protected $processor;
protected $grammar;
protected $connection;
protected $connector;
/**
* tear down
*
* @return void
*/
public function tearDown()
{
m::close();
}
/**
* set up
*
* @return void
*/
public function setUp()
{
}
/**
* get query builder instance
*
* @return DynamicQuery
*/
private function getInstance($proxy = false)
{
$processor = m::mock('Illuminate\Database\Query\Processors\Processor');
$grammar = m::mock('Illuminate\Database\Query\Grammars\Grammar');
$grammar->shouldReceive('compileSelect')->andReturn('select * from table');
$connection = m::mock('Illuminate\Database\Connection');
$connection->shouldReceive('getPostProcessor')->andReturn($processor);
$connection->shouldReceive('getQueryGrammar')->andReturn($grammar);
$connector = m::mock('Xpressengine\Database\VirtualConnection');
$connector->shouldReceive('getDefaultConnection')->andReturn($connection);
$this->processor = $processor;
$this->grammar = $grammar;
$this->connection = $connection;
$this->connector = $connector;
/** @var \Xpressengine\Database\VirtualConnection $connector */
$dynamicQuery = m::mock('Xpressengine\Database\DynamicQuery', [$this->connector, $this->grammar, $this->processor])
->shouldAllowMockingProtectedMethods()
->makePartial();
$dynamicQuery->setProxyOption([]);
$dynamicQuery->useDynamic(true);
$dynamicQuery->useProxy($proxy);
return $dynamicQuery->from('table');
}
/**
* test proxy setting
*
* @return void
*/
public function testSetProxy()
{
$query = $this->getInstance();
$query->useProxy(true);
$reflection = new \ReflectionClass(get_class($query));
$propertyProxy = $reflection->getProperty('proxy');
$propertyProxy->setAccessible(true);
$proxy = $propertyProxy->getValue($query);
$propertyDynamic = $reflection->getProperty('dynamic');
$propertyDynamic->setAccessible(true);
$dynamic = $propertyDynamic->getValue($query);
$this->assertTrue($proxy);
$this->assertTrue($dynamic);
$query->useProxy(false);
$proxy = $propertyProxy->getValue($query);
$this->assertFalse($proxy);
$query->useDynamic(false);
$dynamic = $propertyDynamic->getValue($query);
$this->assertFalse($dynamic);
$setOptions = ['option1', 'option2'];
$query->setProxyOption($setOptions);
$property = $reflection->getProperty('options');
$property->setAccessible(true);
$options = $property->getValue($query);
$this->assertEquals($setOptions, $options);
$query->useProxy(true);
$proxyManager = m::mock('Xpressengine\Database\ProxyManager');
$proxyManager->shouldReceive('set');
$this->connector->shouldReceive('getProxyManager')->andReturn($proxyManager);
$this->assertNull($query->getProxyManager());
$query->useDynamic(true);
$this->assertInstanceOf('Xpressengine\Database\ProxyManager', $query->getProxyManager());
}
/**
* test query builder interface without proxy, dynamic
*
* @return void
*/
public function testWithoutDynamicAndProxy()
{
$processor = m::mock('Illuminate\Database\Query\Processors\Processor');
$processor->shouldReceive('processSelect')->andReturn([['id'=>1]]);
$processor->shouldReceive('processInsertGetId')->andReturn(1);
$grammar = m::mock('Illuminate\Database\Query\Grammars\Grammar');
$grammar->shouldReceive('compileInsert')->andReturn('insert into table');
$grammar->shouldReceive('compileInsertGetId')->andReturn('insert into table');
$grammar->shouldReceive('compileUpdate')->andReturn('update table set');
$grammar->shouldReceive('compileDelete')->andReturn('delete from table');
$grammar->shouldReceive('compileSelect')->andReturn('select * from table');
$grammar->shouldReceive('prepareBindingsForUpdate')->andReturn([]);
$grammar->shouldReceive('prepareBindingsForDelete')->andReturn([]);
$connection = m::mock('Illuminate\Database\Connection');
$connection->shouldReceive('getPostProcessor')->andReturn($processor);
$connection->shouldReceive('getQueryGrammar')->andReturn($grammar);
$connector = m::mock('Xpressengine\Database\VirtualConnection');
$connector->shouldReceive('getDefaultConnection')->andReturn($connection);
$connector->shouldReceive('insert')->andReturn(true);
$connector->shouldReceive('insertGetId')->andReturn(1);
$connector->shouldReceive('update')->andReturn(1);
$connector->shouldReceive('delete')->andReturn(1);
$connector->shouldReceive('select')->andReturn(1);
$params = ['some'=>'some'];
/** @var \Xpressengine\Database\VirtualConnection $connector */
$query = new DynamicQuery($connector, $grammar, $processor);
$query->useProxy(false);
$this->assertEquals(true, $query->insert($params));
$this->assertEquals(1, $query->insertGetId($params));
$this->assertEquals(true, $query->update($params));
$this->assertEquals(true, $query->delete($params));
$this->assertEquals([['id'=>1]], $query->get()->all());
$this->assertEquals(['id'=>1], $query->first());
//$this->assertEquals([], $query->paginate(10)); // 쉽지않음
$this->assertInstanceOf('Xpressengine\Database\DynamicQuery', $query->where([]));
}
/**
* test query builder interface without proxy, dynamic
*
* @return void
*/
public function testWithDynamicWithoutProxy()
{
$params = ['some'=>'some'];
$processor = m::mock('Illuminate\Database\Query\Processors\Processor');
$processor->shouldReceive('processSelect')->andReturn([['id'=>1]]);
$processor->shouldReceive('processInsertGetId')->andReturn(1);
$grammar = m::mock('Illuminate\Database\Query\Grammars\Grammar');
$grammar->shouldReceive('compileInsert')->andReturn('insert into table');
$grammar->shouldReceive('compileInsertGetId')->andReturn('insert into table');
$grammar->shouldReceive('compileUpdate')->andReturn('update table set');
$grammar->shouldReceive('compileDelete')->andReturn('delete from table');
$grammar->shouldReceive('compileSelect')->andReturn('select * from table');
$grammar->shouldReceive('prepareBindingsForUpdate')->andReturn([]);
$grammar->shouldReceive('prepareBindingsForDelete')->andReturn([]);
$schemaBuilder = m::mock('Illuminate\Database\Schema\Builder');
$schemaBuilder->shouldReceive('getColumnListing')->andReturn(['some']);
$connection = m::mock('Illuminate\Database\Connection');
$connection->shouldReceive('getPostProcessor')->andReturn($processor);
$connection->shouldReceive('getQueryGrammar')->andReturn($grammar);
$connection->shouldReceive('getSchemaBuilder')->andReturn($schemaBuilder);
$connector = m::mock('Xpressengine\Database\VirtualConnection');
$connector->shouldReceive('getDefaultConnection')->andReturn($connection);
$connector->shouldReceive('getSchemaBuilder')->andReturn($schemaBuilder);
$connector->shouldReceive('insert')->andReturn(true);
$connector->shouldReceive('insertGetId')->andReturn(1);
$connector->shouldReceive('update')->andReturn(1);
$connector->shouldReceive('delete')->andReturn(1);
$connector->shouldReceive('select')->andReturn(1);
$connector->shouldReceive('getSchema')->andReturn($params);
/** @var \Xpressengine\Database\VirtualConnection $connector */
$query = new DynamicQuery($connector, $grammar, $processor);
$query->useProxy(false);
$this->assertEquals(true, $query->insert($params));
$this->assertEquals(1, $query->insertGetId($params));
$this->assertEquals(true, $query->update($params));
$this->assertEquals(true, $query->delete($params));
$this->assertEquals([['id'=>1]], $query->get()->all());
$this->assertEquals(['id'=>1], $query->first());
//$this->assertEquals([], $query->paginate(10)); // 쉽지않음
$this->assertInstanceOf('Xpressengine\Database\DynamicQuery', $query->where([]));
}
/**
* test query builder interface without proxy, dynamic
*
* @return void
*/
public function testWithDynamicAndProxy()
{
$params = ['some'=>'some'];
$processor = m::mock('Illuminate\Database\Query\Processors\Processor');
$processor->shouldReceive('processSelect')->andReturn([['id'=>1]]);
$processor->shouldReceive('processInsertGetId')->andReturn(1);
$grammar = m::mock('Illuminate\Database\Query\Grammars\Grammar');
$grammar->shouldReceive('compileInsert')->andReturn('insert into table');
$grammar->shouldReceive('compileInsertGetId')->andReturn('insert into table');
$grammar->shouldReceive('compileUpdate')->andReturn('update table set');
$grammar->shouldReceive('compileDelete')->andReturn('delete from table');
$grammar->shouldReceive('compileSelect')->andReturn('select * from table');
$grammar->shouldReceive('prepareBindingsForUpdate')->andReturn([]);
$grammar->shouldReceive('prepareBindingsForDelete')->andReturn([]);
$schemaBuilder = m::mock('Illuminate\Database\Schema\Builder');
$schemaBuilder->shouldReceive('getColumnListing')->andReturn(['some']);
$connection = m::mock('Illuminate\Database\Connection');
$connection->shouldReceive('getPostProcessor')->andReturn($processor);
$connection->shouldReceive('getQueryGrammar')->andReturn($grammar);
$connection->shouldReceive('getSchemaBuilder')->andReturn($schemaBuilder);
$proxyManager = m::mock('Xpressengine\Database\ProxyManager');
$proxyManager->shouldReceive('set');
$proxyManager->shouldReceive('insert');
$proxyManager->shouldReceive('update');
$proxyManager->shouldReceive('delete');
$proxyManager->shouldReceive('wheres');
$proxyManager->shouldReceive('orders');
$connector = m::mock('Xpressengine\Database\VirtualConnection');
$connector->shouldReceive('getDefaultConnection')->andReturn($connection);
$connector->shouldReceive('getSchemaBuilder')->andReturn($schemaBuilder);
$connector->shouldReceive('getProxyManager')->andReturn($proxyManager);
$connector->shouldReceive('insert')->andReturn(true);
$connector->shouldReceive('insertGetId')->andReturn(1);
$connector->shouldReceive('update')->andReturn(1);
$connector->shouldReceive('delete')->andReturn(1);
$connector->shouldReceive('select')->andReturn(1);
$connector->shouldReceive('getSchema')->andReturn($params);
/** @var \Xpressengine\Database\VirtualConnection $connector */
$query = new DynamicQuery($connector, $grammar, $processor);
$query->useProxy(true);
$this->assertEquals(true, $query->insert($params));
$this->assertEquals(1, $query->insertGetId($params));
$this->assertEquals(true, $query->update($params));
$this->assertEquals(true, $query->delete($params));
$this->assertInstanceOf('Xpressengine\Database\DynamicQuery', $query->where([]));
$proxyManager->shouldReceive('get');
$proxyManager->shouldReceive('first');
$this->assertEquals([['id'=>1]], $query->get()->all());
$this->assertEquals(['id'=>1], $query->first());
}
}