<?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]); } }