420 lines
9.7 KiB
PHP
420 lines
9.7 KiB
PHP
<?php
|
|
/**
|
|
* Author: Nil Portugués Calderó <contact@nilportugues.com>
|
|
* Date: 6/3/14
|
|
* Time: 12:31 AM.
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace NilPortugues\Tests\Sql\QueryBuilder\Syntax;
|
|
|
|
use NilPortugues\Sql\QueryBuilder\Manipulation\Select;
|
|
use NilPortugues\Sql\QueryBuilder\Syntax\Where;
|
|
use NilPortugues\Tests\Sql\QueryBuilder\Manipulation\Resources\DummyQuery;
|
|
|
|
/**
|
|
* Class WhereTest.
|
|
*/
|
|
class WhereTest extends \PHPUnit_Framework_TestCase
|
|
{
|
|
/**
|
|
* @var Where
|
|
*/
|
|
protected $where;
|
|
|
|
/**
|
|
* @var string
|
|
*/
|
|
protected $whereClass = '\NilPortugues\Sql\QueryBuilder\Syntax\Where';
|
|
|
|
/**
|
|
* @var string
|
|
*/
|
|
protected $columnClass = '\NilPortugues\Sql\QueryBuilder\Syntax\Column';
|
|
|
|
/**
|
|
* @var string
|
|
*/
|
|
protected $queryException = '\NilPortugues\Sql\QueryBuilder\Manipulation\QueryException';
|
|
|
|
/**
|
|
*
|
|
*/
|
|
protected function setUp()
|
|
{
|
|
$query = new DummyQuery();
|
|
$query->setTable('users');
|
|
|
|
$this->where = new Where($query);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function itShouldBeCloneable()
|
|
{
|
|
$this->assertEquals($this->where, clone $this->where);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function itShouldBeEmptyOnConstruct()
|
|
{
|
|
$this->assertTrue($this->where->isEmpty());
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function itShouldReturnDefaultConjuctionAnd()
|
|
{
|
|
$this->assertSame('AND', $this->where->getConjunction());
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function itShouldReturnDefaultSubWhere()
|
|
{
|
|
$this->assertSame(array(), $this->where->getSubWheres());
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function itShouldReturnSubFilter()
|
|
{
|
|
$filter = $this->where->subWhere();
|
|
|
|
$this->assertSame(array(), $filter->getSubWheres());
|
|
$this->assertInstanceOf($this->whereClass, $filter);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function itShouldReturnTheSameEqAndEqual()
|
|
{
|
|
$column = 'user_id';
|
|
$value = 1;
|
|
|
|
$this->assertSame(
|
|
$this->where->equals($column, $value),
|
|
$this->where->eq($column, $value)
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function itShouldNotBeEqualTo()
|
|
{
|
|
$column = 'user_id';
|
|
$value = 1;
|
|
|
|
$result = $this->where->notEquals($column, $value)->getComparisons();
|
|
|
|
$this->assertSame('<>', $result[0]['conjunction']);
|
|
$this->assertSame($column, $result[0]['subject']->getName());
|
|
$this->assertSame($value, $result[0]['target']);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function itShouldBeGreaterThan()
|
|
{
|
|
$column = 'user_id';
|
|
$value = 1;
|
|
|
|
$result = $this->where->greaterThan($column, $value)->getComparisons();
|
|
|
|
$this->assertSame('>', $result[0]['conjunction']);
|
|
$this->assertSame($column, $result[0]['subject']->getName());
|
|
$this->assertSame($value, $result[0]['target']);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function itShouldBeGreaterThanOrEqual()
|
|
{
|
|
$column = 'user_id';
|
|
$value = 1;
|
|
|
|
$result = $this->where->greaterThanOrEqual($column, $value)->getComparisons();
|
|
|
|
$this->assertSame('>=', $result[0]['conjunction']);
|
|
$this->assertSame($column, $result[0]['subject']->getName());
|
|
$this->assertSame($value, $result[0]['target']);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function itShouldBeLessThan()
|
|
{
|
|
$column = 'user_id';
|
|
$value = 1;
|
|
|
|
$result = $this->where->lessThan($column, $value)->getComparisons();
|
|
|
|
$this->assertSame('<', $result[0]['conjunction']);
|
|
$this->assertSame($column, $result[0]['subject']->getName());
|
|
$this->assertSame($value, $result[0]['target']);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function itShouldBeLessThanOrEqual()
|
|
{
|
|
$column = 'user_id';
|
|
$value = 1;
|
|
|
|
$result = $this->where->lessThanOrEqual($column, $value)->getComparisons();
|
|
|
|
$this->assertSame('<=', $result[0]['conjunction']);
|
|
$this->assertSame($column, $result[0]['subject']->getName());
|
|
$this->assertSame($value, $result[0]['target']);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function itShouldBeLike()
|
|
{
|
|
$column = 'user_id';
|
|
$value = 1;
|
|
|
|
$result = $this->where->like($column, $value)->getComparisons();
|
|
|
|
$this->assertSame('LIKE', $result[0]['conjunction']);
|
|
$this->assertSame($column, $result[0]['subject']->getName());
|
|
$this->assertSame($value, $result[0]['target']);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function itShouldBeNotLike()
|
|
{
|
|
$column = 'user_id';
|
|
$value = 1;
|
|
|
|
$result = $this->where->notLike($column, $value)->getComparisons();
|
|
|
|
$this->assertSame('NOT LIKE', $result[0]['conjunction']);
|
|
$this->assertSame($column, $result[0]['subject']->getName());
|
|
$this->assertSame($value, $result[0]['target']);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function itShouldAccumulateMatchConditions()
|
|
{
|
|
$column = array('user_id');
|
|
|
|
$result = $this->where
|
|
->match($column, array(1, 2, 3))
|
|
->getMatches();
|
|
|
|
$expected = array(
|
|
0 => array(
|
|
'columns' => array('user_id'),
|
|
'values' => array(1, 2, 3),
|
|
'mode' => 'natural',
|
|
),
|
|
);
|
|
$this->assertEquals($expected, $result);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function itShouldAccumulateMatchBooleanConditions()
|
|
{
|
|
$column = array('user_id');
|
|
|
|
$result = $this->where
|
|
->matchBoolean($column, array(1, 2, 3))
|
|
->getMatches();
|
|
|
|
$expected = array(
|
|
0 => array(
|
|
'columns' => array('user_id'),
|
|
'values' => array(1, 2, 3),
|
|
'mode' => 'boolean',
|
|
),
|
|
);
|
|
$this->assertEquals($expected, $result);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function itShouldAccumulateMatchQueryExpansionConditions()
|
|
{
|
|
$column = array('user_id');
|
|
|
|
$result = $this->where
|
|
->matchWithQueryExpansion($column, array(1, 2, 3))
|
|
->getMatches();
|
|
|
|
$expected = array(
|
|
0 => array(
|
|
'columns' => array('user_id'),
|
|
'values' => array(1, 2, 3),
|
|
'mode' => 'query_expansion',
|
|
),
|
|
);
|
|
$this->assertEquals($expected, $result);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function itShouldAccumulateInConditions()
|
|
{
|
|
$column = 'user_id';
|
|
|
|
$result = $this->where
|
|
->in($column, array(1, 2, 3))
|
|
->getIns();
|
|
|
|
$expected = array($column => array(1, 2, 3));
|
|
$this->assertEquals($expected, $result);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function itShouldAccumulateNotInConditions()
|
|
{
|
|
$column = 'user_id';
|
|
|
|
$result = $this->where
|
|
->notIn($column, array(1, 2, 3))
|
|
->getNotIns();
|
|
|
|
$expected = array($column => array(1, 2, 3));
|
|
$this->assertEquals($expected, $result);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function itShouldWriteBetweenConditions()
|
|
{
|
|
$column = 'user_id';
|
|
|
|
$result = $this->where
|
|
->between($column, 1, 2)
|
|
->getBetweens();
|
|
|
|
$this->assertInstanceOf($this->columnClass, $result[0]['subject']);
|
|
$this->assertEquals(1, $result[0]['a']);
|
|
$this->assertEquals(2, $result[0]['b']);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function itShouldSetNullValueCondition()
|
|
{
|
|
$column = 'user_id';
|
|
|
|
$result = $this->where
|
|
->isNull($column)
|
|
->getNull();
|
|
|
|
$this->assertInstanceOf($this->columnClass, $result[0]['subject']);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function itShouldSetIsNotNullValueCondition()
|
|
{
|
|
$column = 'user_id';
|
|
|
|
$result = $this->where
|
|
->isNotNull($column)
|
|
->getNotNull();
|
|
|
|
$this->assertInstanceOf($this->columnClass, $result[0]['subject']);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function itShouldSetBitClauseValueCondition()
|
|
{
|
|
$column = 'user_id';
|
|
|
|
$result = $this->where
|
|
->addBitClause($column, 1)
|
|
->getBooleans();
|
|
|
|
$this->assertEquals(1, $result[0]['value']);
|
|
$this->assertInstanceOf($this->columnClass, $result[0]['subject']);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function ItShouldChangeAndToOrOperator()
|
|
{
|
|
$result = $this->where->conjunction('OR');
|
|
$this->assertEquals('OR', $result->getConjunction());
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function itShouldThrowExceptionOnUnknownConjunction()
|
|
{
|
|
$this->setExpectedException($this->queryException);
|
|
$this->where->conjunction('NOT_VALID_CONJUNCTION');
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function itShouldSetExistsCondition()
|
|
{
|
|
$select1 = new Select('user');
|
|
$select1->where()->equals('user_id', 10);
|
|
|
|
$result = $this->where->exists($select1)->getExists();
|
|
|
|
$this->assertEquals(array($select1), $result);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function itShouldSetNotExistsCondition()
|
|
{
|
|
$select1 = new Select('user');
|
|
$select1->where()->equals('user_id', 10);
|
|
|
|
$result = $this->where->notExists($select1)->getNotExists();
|
|
|
|
$this->assertEquals(array($select1), $result);
|
|
}
|
|
|
|
/**
|
|
* @test
|
|
*/
|
|
public function itShouldReturnLiterals()
|
|
{
|
|
$result = $this->where->asLiteral('(username is not null and status=:status)')->getComparisons();
|
|
$this->assertSame('(username is not null and status=:status)', $result[0]);
|
|
}
|
|
}
|