2009-11-22 06:16:38 +01:00
< ? php
class DataQueryTest extends SapphireTest {
/**
2011-10-29 06:11:27 +02:00
* Test the leftJoin () and innerJoin method of the DataQuery object
2009-11-22 06:16:38 +01:00
*/
2012-09-19 12:07:39 +02:00
public function testJoins () {
2009-11-22 06:16:38 +01:00
$dq = new DataQuery ( 'Member' );
2011-10-29 06:11:27 +02:00
$dq -> innerJoin ( " Group_Members " , " \" Group_Members \" . \" MemberID \" = \" Member \" . \" ID \" " );
2009-11-22 06:16:38 +01:00
$this -> assertContains ( " INNER JOIN \" Group_Members \" ON \" Group_Members \" . \" MemberID \" = \" Member \" . \" ID \" " , $dq -> sql ());
2011-10-29 06:11:27 +02:00
$dq = new DataQuery ( 'Member' );
$dq -> leftJoin ( " Group_Members " , " \" Group_Members \" . \" MemberID \" = \" Member \" . \" ID \" " );
$this -> assertContains ( " LEFT JOIN \" Group_Members \" ON \" Group_Members \" . \" MemberID \" = \" Member \" . \" ID \" " , $dq -> sql ());
2009-11-22 06:16:38 +01:00
}
2012-06-25 01:34:02 +02:00
2012-09-19 12:07:39 +02:00
public function testRelationReturn () {
2012-06-25 01:34:02 +02:00
$dq = new DataQuery ( 'DataQueryTest_C' );
$this -> assertEquals ( 'DataQueryTest_A' , $dq -> applyRelation ( 'TestA' ), 'DataQuery::applyRelation should return the name of the related object.' );
$this -> assertEquals ( 'DataQueryTest_A' , $dq -> applyRelation ( 'TestAs' ), 'DataQuery::applyRelation should return the name of the related object.' );
$this -> assertEquals ( 'DataQueryTest_A' , $dq -> applyRelation ( 'ManyTestAs' ), 'DataQuery::applyRelation should return the name of the related object.' );
$this -> assertEquals ( 'DataQueryTest_B' , $dq -> applyRelation ( 'TestB' ), 'DataQuery::applyRelation should return the name of the related object.' );
$this -> assertEquals ( 'DataQueryTest_B' , $dq -> applyRelation ( 'TestBs' ), 'DataQuery::applyRelation should return the name of the related object.' );
$this -> assertEquals ( 'DataQueryTest_B' , $dq -> applyRelation ( 'ManyTestBs' ), 'DataQuery::applyRelation should return the name of the related object.' );
}
2012-09-20 13:28:54 +02:00
public function testDisjunctiveGroup () {
$dq = new DataQuery ( 'DataQueryTest_A' );
$dq -> where ( 'DataQueryTest_A.ID = 2' );
$subDq = $dq -> disjunctiveGroup ();
$subDq -> where ( 'DataQueryTest_A.Name = \'John\'' );
$subDq -> where ( 'DataQueryTest_A.Name = \'Bob\'' );
$this -> assertContains ( " WHERE (DataQueryTest_A.ID = 2) AND ((DataQueryTest_A.Name = 'John') OR (DataQueryTest_A.Name = 'Bob')) " , $dq -> sql ());
}
public function testConjunctiveGroup () {
$dq = new DataQuery ( 'DataQueryTest_A' );
$dq -> where ( 'DataQueryTest_A.ID = 2' );
$subDq = $dq -> conjunctiveGroup ();
$subDq -> where ( 'DataQueryTest_A.Name = \'John\'' );
$subDq -> where ( 'DataQueryTest_A.Name = \'Bob\'' );
$this -> assertContains ( " WHERE (DataQueryTest_A.ID = 2) AND ((DataQueryTest_A.Name = 'John') AND (DataQueryTest_A.Name = 'Bob')) " , $dq -> sql ());
}
public function testNestedGroups () {
$dq = new DataQuery ( 'DataQueryTest_A' );
$dq -> where ( 'DataQueryTest_A.ID = 2' );
$subDq = $dq -> disjunctiveGroup ();
$subDq -> where ( 'DataQueryTest_A.Name = \'John\'' );
$subSubDq = $subDq -> conjunctiveGroup ();
$subSubDq -> where ( 'DataQueryTest_A.Age = 18' );
$subSubDq -> where ( 'DataQueryTest_A.Age = 50' );
$subDq -> where ( 'DataQueryTest_A.Name = \'Bob\'' );
$this -> assertContains ( " WHERE (DataQueryTest_A.ID = 2) AND ((DataQueryTest_A.Name = 'John') OR ((DataQueryTest_A.Age = 18) AND (DataQueryTest_A.Age = 50)) OR (DataQueryTest_A.Name = 'Bob')) " , $dq -> sql ());
}
public function testEmptySubgroup () {
$dq = new DataQuery ( 'DataQueryTest_A' );
$dq -> conjunctiveGroup ();
$this -> assertContains ( 'WHERE (1=1)' , $dq -> sql ());
}
public function testSubgroupHandoff () {
$dq = new DataQuery ( 'DataQueryTest_A' );
$subDq = $dq -> disjunctiveGroup ();
$orgDq = clone $dq ;
$subDq -> sort ( '"DataQueryTest_A"."Name"' );
$orgDq -> sort ( '"DataQueryTest_A"."Name"' );
$this -> assertEquals ( $dq -> sql (), $orgDq -> sql ());
$subDq -> limit ( 5 , 7 );
$orgDq -> limit ( 5 , 7 );
$this -> assertEquals ( $dq -> sql (), $orgDq -> sql ());
}
2012-06-25 01:34:02 +02:00
}
class DataQueryTest_A extends DataObject implements TestOnly {
public static $db = array (
'Name' => 'Varchar' ,
);
public static $has_one = array (
'TestC' => 'DataQueryTest_C' ,
);
2009-11-22 06:16:38 +01:00
}
2012-06-25 01:34:02 +02:00
class DataQueryTest_B extends DataQueryTest_A {
public static $db = array (
'Title' => 'Varchar' ,
);
public static $has_one = array (
'TestC' => 'DataQueryTest_C' ,
);
}
class DataQueryTest_C extends DataObject implements TestOnly {
public static $has_one = array (
'TestA' => 'DataQueryTest_A' ,
'TestB' => 'DataQueryTest_B' ,
);
public static $has_many = array (
'TestAs' => 'DataQueryTest_A' ,
'TestBs' => 'DataQueryTest_B' ,
);
public static $many_many = array (
'ManyTestAs' => 'DataQueryTest_A' ,
'ManyTestBs' => 'DataQueryTest_B' ,
);
}