* @copyright 2020 Copyright XEHub Corp. * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL * @link https://xpressengine.io */ namespace Xpressengine\Tests\Config; use Mockery as m; use PHPUnit\Framework\TestCase; use Xpressengine\Config\Repositories\DatabaseRepository; class DatabaseRepositoryTest extends TestCase { public function tearDown() { m::close(); } public function testFindReturnsConfig() { list($conn) = $this->getMocks(); $instance = new DatabaseRepository($conn); $conn->shouldReceive('table')->once()->withAnyArgs()->andReturn($conn); $conn->shouldReceive('where')->once()->with('site_key', 'default')->andReturn($conn); $conn->shouldReceive('where')->once()->with('name', 'board.instance1')->andReturn($conn); $conn->shouldReceive('first')->once()->withNoArgs()->andReturn((object)[ 'name' => 'board.instance1', 'vars' => '{"limit":20,"perPage":10}' ]); $config = $instance->find('default', 'board.instance1'); $this->assertInstanceOf('Xpressengine\Config\ConfigEntity', $config); $this->assertEquals(20, $config->get('limit')); $this->assertEquals(10, $config->get('perPage')); } public function testFetchAncestorReturnsConfigArray() { list($conn) = $this->getMocks(); $instance = new DatabaseRepository($conn); $conn->shouldReceive('table')->once()->withAnyArgs()->andReturn($conn); $conn->shouldReceive('where')->once()->with('site_key', 'default')->andReturn($conn); $conn->shouldReceive('whereRaw')->once()->with("'board.instance1' like concat(`name`, '.', '%')")->andReturn($conn); $conn->shouldReceive('where')->once()->with('name', '<>', 'board.instance1')->andReturn($conn); $conn->shouldReceive('get')->once()->withNoArgs()->andReturn([ (object)[ 'name' => 'board', 'vars' => '{"limit":10,"perPage":5}' ] ]); $configs = $instance->fetchAncestor('default', 'board.instance1'); $this->assertEquals(1, count($configs)); $this->assertEquals('board', $configs[0]->name); $this->assertEquals(10, $configs[0]->get('limit')); $this->assertEquals(5, $configs[0]->get('perPage')); } public function testFetchDescendantReturnsConfigArray() { list($conn) = $this->getMocks(); $instance = new DatabaseRepository($conn); $conn->shouldReceive('table')->once()->withAnyArgs()->andReturn($conn); $conn->shouldReceive('where')->once()->with('site_key', 'default')->andReturn($conn); $conn->shouldReceive('where')->once()->with('name', 'like', 'board.%')->andReturn($conn); $conn->shouldReceive('where')->once()->with('name', '<>', 'board')->andReturn($conn); $conn->shouldReceive('get')->once()->withNoArgs()->andReturn([ (object)[ 'name' => 'board.instance1', 'vars' => '{"limit":20,"perPage":10}' ] ]); $configs = $instance->fetchDescendant('default', 'board'); $this->assertEquals(1, count($configs)); $this->assertEquals('board.instance1', $configs[0]->name); $this->assertEquals(20, $configs[0]->get('limit')); $this->assertEquals(10, $configs[0]->get('perPage')); } public function testSaveCallInsertWhenNotExists() { list($conn) = $this->getMocks(); $instance = new DatabaseRepository($conn); $mockConfig = m::mock('Xpressengine\Config\ConfigEntity'); $mockConfig->site_key = 'default'; $mockConfig->name = 'board.instance1'; $mockConfig->shouldReceive('getAttributes')->andReturn([ 'name' => 'board.instance1', 'vars' => '{"limit":20,"perPage":10}' ]); $conn->shouldReceive('table')->withAnyArgs()->andReturn($conn); $conn->shouldReceive('where')->once()->with('site_key', 'default')->andReturn($conn); $conn->shouldReceive('where')->once()->with('name', 'board.instance1')->andReturn($conn); $conn->shouldReceive('first')->once()->withNoArgs()->andReturnNull(); $conn->shouldReceive('insert')->once()->with([ 'name' => 'board.instance1', 'vars' => '{"limit":20,"perPage":10}' ])->andReturnNull(); $config = $instance->save($mockConfig); $this->assertInstanceOf('Xpressengine\Config\ConfigEntity', $config); $this->assertEquals(20, $config->get('limit')); $this->assertEquals(10, $config->get('perPage')); } public function testSaveCallUpdateWhenAlreadyExists() { list($conn) = $this->getMocks(); $instance = new DatabaseRepository($conn); $mockConfig = m::mock('Xpressengine\Config\ConfigEntity'); $mockConfig->site_key = 'default'; $mockConfig->name = 'board.instance1'; $mockConfig->shouldReceive('getDirty')->andReturn([ 'vars' => '{"limit":25,"perPage":5}' ]); $mockConfig->shouldReceive('getOriginal')->andReturn([ 'name' => 'board.instance1', 'vars' => '{"limit":20,"perPage":10}' ]); $conn->shouldReceive('table')->withAnyArgs()->andReturn($conn); $conn->shouldReceive('where')->once()->with('site_key', 'default')->andReturn($conn); $conn->shouldReceive('where')->once()->with('name', 'board.instance1')->andReturn($conn); $conn->shouldReceive('first')->once()->withNoArgs()->andReturn((object)[ 'name' => 'board.instance1', 'vars' => '{"limit":20,"perPage":10}' ]); $conn->shouldReceive('where')->once()->with('site_key', 'default')->andReturn($conn); $conn->shouldReceive('where')->once()->with('name', 'board.instance1')->andReturn($conn); $conn->shouldReceive('update')->once()->with([ 'vars' => '{"limit":25,"perPage":5}' ])->andReturn($conn); $config = $instance->save($mockConfig); $this->assertInstanceOf('Xpressengine\Config\ConfigEntity', $config); $this->assertEquals(25, $config->get('limit')); $this->assertEquals(5, $config->get('perPage')); } public function testClearLike() { list($conn) = $this->getMocks(); $mockConfig = m::mock('Xpressengine\Config\ConfigEntity'); $mockConfig->site_key = 'default'; $mockConfig->name = 'board.instance1'; $conn->shouldReceive('table')->withAnyArgs()->andReturn($conn); $conn->shouldReceive('where')->once()->with('site_key', 'default')->andReturn($conn); $conn->shouldReceive('where')->once()->with('name', 'like', 'board.instance1%')->andReturn($conn); $conn->shouldReceive('where')->once()->with('name', '<>', 'board.instance1')->andReturn($conn); $conn->shouldReceive('where')->once()->with('name', 'not like', 'board.instance1.sub2%')->andReturn($conn); $conn->shouldReceive('update')->once()->with(['vars' => '[]'])->andReturnNull(); $instance = new DatabaseRepository($conn); $instance->clearLike($mockConfig, ['board.instance1.sub2']); } public function testRemove() { list($conn) = $this->getMocks(); $query = m::mock('Illuminate\Database\Query\Builder'); $conn->shouldReceive('table')->withAnyArgs()->andReturn($query); $query->shouldReceive('where')->once()->with('site_key', 'default')->andReturn($query); $query->shouldReceive('where')->once()->with(m::on(function ($closure) use ($query) { $query->shouldReceive('where')->once()->with('name', 'like', 'board.instance1.%')->andReturn($query); $query->shouldReceive('orWhere')->once()->with('name', 'board.instance1')->andReturn($query); call_user_func($closure, $query); return true; }))->andReturn($query); $query->shouldReceive('delete')->once()->withNoArgs()->andReturnNull(); $instance = new DatabaseRepository($conn); $instance->remove('default', 'board.instance1'); } public function testFoster() { list($conn) = $this->getMocks(); $query = m::mock('Illuminate\Database\Query\Builder'); $instance = new DatabaseRepository($conn); $mockConfig = m::mock('Xpressengine\Config\ConfigEntity'); $mockConfig->site_key = 'default'; $mockConfig->name = 'board.instance1'; $conn->shouldReceive('table')->andReturn($query); $query->shouldReceive('where')->twice()->with('site_key', 'default')->andReturnSelf(); $query->shouldReceive('where')->twice()->with(m::on(function ($closure) use ($query) { $query->shouldReceive('where')->once()->with('name', 'board.instance1')->andReturnSelf(); $query->shouldReceive('orWhere')->once()->with('name', 'like', 'board.instance1.%')->andReturnSelf(); call_user_func($closure, $query); return true; }))->andReturnSelf(); $conn->shouldReceive('raw')->once()->with("substr(`name`, length('board') + 2)")->andReturn('toNull'); $query->shouldReceive('update')->once()->with(['name' => 'toNull']); $instance->foster($mockConfig, null); $conn->shouldReceive('raw')->once()->with("concat('to', substr(`name`, length('board') + 1))")->andReturn('notToNull'); $query->shouldReceive('update')->once()->with(['name' => 'notToNull']); $instance->foster($mockConfig, 'to'); } public function testAffiliate() { list($conn) = $this->getMocks(); $query = m::mock('Illuminate\Database\Query\Builder'); $instance = new DatabaseRepository($conn); $mockConfig = m::mock('Xpressengine\Config\ConfigEntity'); $mockConfig->site_key = 'default'; $mockConfig->name = 'board.instance1'; $conn->shouldReceive('table')->andReturn($query); $query->shouldReceive('where')->once()->with('site_key', 'default')->andReturnSelf(); $query->shouldReceive('where')->once()->with(m::on(function ($closure) use ($query) { $query->shouldReceive('where')->once()->with('name', 'board.instance1')->andReturnSelf(); $query->shouldReceive('orWhere')->once()->with('name', 'like', 'board.instance1.%')->andReturnSelf(); call_user_func($closure, $query); return true; }))->andReturnSelf(); $conn->shouldReceive('raw')->once()->with("concat('to', '.', `name`)")->andReturn('toName'); $query->shouldReceive('update')->once()->with(['name' => 'toName']); $instance->affiliate($mockConfig, 'to'); } private function getMocks() { return [ m::mock('Xpressengine\Database\VirtualConnectionInterface') ]; } }