285 lines
6.5 KiB
PHP

<?php
/**
* Author: Nil Portugués Calderó <contact@nilportugues.com>
* Date: 6/16/14
* Time: 8:56 PM.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace NilPortugues\Tests\Sql\QueryBuilder\Builder;
use NilPortugues\Sql\QueryBuilder\Builder\GenericBuilder;
use NilPortugues\Sql\QueryBuilder\Manipulation\Select;
class GenericBuilderTest extends \PHPUnit_Framework_TestCase
{
/**
* @var GenericBuilder
*/
private $writer;
/**
*
*/
public function setUp()
{
$this->writer = new GenericBuilder();
}
/**
* @test
*/
public function itShouldCreateSelectObject()
{
$className = '\NilPortugues\Sql\QueryBuilder\Manipulation\Select';
$this->assertInstanceOf($className, $this->writer->select());
}
/**
* @test
*/
public function itShouldCreateInsertObject()
{
$className = '\NilPortugues\Sql\QueryBuilder\Manipulation\Insert';
$this->assertInstanceOf($className, $this->writer->insert());
}
/**
* @test
*/
public function itShouldCreateUpdateObject()
{
$className = '\NilPortugues\Sql\QueryBuilder\Manipulation\Update';
$this->assertInstanceOf($className, $this->writer->update());
}
/**
* @test
*/
public function itShouldCreateDeleteObject()
{
$className = '\NilPortugues\Sql\QueryBuilder\Manipulation\Delete';
$this->assertInstanceOf($className, $this->writer->delete());
}
/**
* @test
*/
public function itShouldCreateIntersectObject()
{
$className = '\NilPortugues\Sql\QueryBuilder\Manipulation\Intersect';
$this->assertInstanceOf($className, $this->writer->intersect());
}
/**
* @test
*/
public function itShouldCreateMinusObject()
{
$className = '\NilPortugues\Sql\QueryBuilder\Manipulation\Minus';
$this->assertInstanceOf($className, $this->writer->minus(new Select('table1'), new Select('table2')));
}
/**
* @test
*/
public function itShouldCreateUnionObject()
{
$className = '\NilPortugues\Sql\QueryBuilder\Manipulation\Union';
$this->assertInstanceOf($className, $this->writer->union());
}
/**
* @test
*/
public function itShouldCreateUnionAllObject()
{
$className = '\NilPortugues\Sql\QueryBuilder\Manipulation\UnionAll';
$this->assertInstanceOf($className, $this->writer->unionAll());
}
/**
* @test
*/
public function itCanAcceptATableNameForSelectInsertUpdateDeleteQueries()
{
$table = 'user';
$queries = [
'select' => $this->writer->select($table),
'insert' => $this->writer->insert($table),
'update' => $this->writer->update($table),
'delete' => $this->writer->delete($table),
];
foreach ($queries as $type => $query) {
$this->assertEquals($table, $query->getTable()->getName(), "Checking table in $type query");
}
}
/**
* @test
*/
public function itCanAcceptATableAndColumnsForSelect()
{
$table = 'user';
$columns = ['id', 'role'];
$expected = <<<QUERY
SELECT
user.id,
user.role
FROM
user
QUERY;
$select = $this->writer->select($table, $columns);
$this->assertSame($expected, $this->writer->writeFormatted($select));
}
/**
* @test
*/
public function itCanAcceptATableAndValuesForInsert()
{
$table = 'user';
$values = ['id' => 1, 'role' => 'admin'];
$expected = <<<QUERY
INSERT INTO user (user.id, user.role)
VALUES
(:v1, :v2)
QUERY;
$insert = $this->writer->insert($table, $values);
$this->assertSame($expected, $this->writer->writeFormatted($insert));
}
/**
* @test
*/
public function itCanAcceptATableAndValuesForUpdate()
{
$table = 'user';
$values = ['id' => 1, 'role' => 'super-admin'];
$expected = <<<QUERY
UPDATE
user
SET
user.id = :v1,
user.role = :v2
QUERY;
$update = $this->writer->update($table, $values);
$this->assertSame($expected, $this->writer->writeFormatted($update));
}
/**
* @test
*/
public function itShouldOutputHumanReadableQuery()
{
$selectRole = $this->writer->select();
$selectRole
->setTable('role')
->setColumns(array('role_name'))
->limit(1)
->where()
->equals('role_id', 3);
$select = $this->writer->select();
$select->setTable('user')
->setColumns(array('user_id', 'username'))
->setSelectAsColumn(array('user_role' => $selectRole))
->setSelectAsColumn(array($selectRole))
->where()
->equals('user_id', 4);
$expected = <<<QUERY
SELECT
user.user_id,
user.username,
(
SELECT
role.role_name
FROM
role
WHERE
(role.role_id = :v1)
LIMIT
:v2,
:v3
) AS "user_role",
(
SELECT
role.role_name
FROM
role
WHERE
(role.role_id = :v4)
LIMIT
:v5,
:v6
) AS "role"
FROM
user
WHERE
(user.user_id = :v7)
QUERY;
$this->assertSame($expected, $this->writer->writeFormatted($select));
}
/**
* @test
*/
public function it_should_inject_the_builder()
{
$query = $this->writer->select();
$this->assertSame($this->writer, $query->getBuilder());
}
/**
* @test
*/
public function itShouldWriteWhenGettingSql()
{
$query = $this->writer->select()
->setTable('user');
$expected = $this->writer->write($query);
$this->assertSame($expected, $query->getSql());
}
/**
* @test
*/
public function itShouldWriteFormattedWhenGettingFormattedSql()
{
$query = $this->writer->select()
->setTable('user');
$formatted = true;
$expected = $this->writer->writeFormatted($query);
$this->assertSame($expected, $query->getSql($formatted));
}
/**
* @test
*/
public function itShouldWriteSqlWhenCastToString()
{
$query = $this->writer->select()
->setTable('user');
$expected = $this->writer->write($query);
$this->assertSame($expected, (string) $query);
}
}