Rajout de doctrine/orm
[zf2.biz/galerie.git] / vendor / doctrine / orm / tests / Doctrine / Tests / ORM / Functional / PaginationTest.php
1 <?php
2
3 namespace Doctrine\Tests\ORM\Functional;
4
5 use Doctrine\ORM\Tools\SchemaTool;
6 use Doctrine\ORM\Query;
7 use Doctrine\Tests\Models\CMS\CmsUser;
8 use Doctrine\Tests\Models\CMS\CmsPhonenumber;
9 use Doctrine\Tests\Models\CMS\CmsAddress;
10 use Doctrine\Tests\Models\CMS\CmsGroup;
11 use Doctrine\Tests\Models\CMS\CmsArticle;
12 use Doctrine\Tests\Models\CMS\CmsComment;
13 use Doctrine\ORM\Tools\Pagination\Paginator;
14
15 /**
16  * @group DDC-1613
17  */
18 class PaginationTest extends \Doctrine\Tests\OrmFunctionalTestCase
19 {
20     protected function setUp()
21     {
22         $this->useModelSet('cms');
23         parent::setUp();
24         $this->populate();
25     }
26
27     /**
28      * @dataProvider useOutputWalkers
29      */
30     public function testCountSimpleWithoutJoin($useOutputWalkers)
31     {
32         $dql = "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u";
33         $query = $this->_em->createQuery($dql);
34
35         $paginator = new Paginator($query);
36         $paginator->setUseOutputWalkers($useOutputWalkers);
37         $this->assertCount(3, $paginator);
38     }
39
40     /**
41      * @dataProvider useOutputWalkers
42      */
43     public function testCountWithFetchJoin($useOutputWalkers)
44     {
45         $dql = "SELECT u,g FROM Doctrine\Tests\Models\CMS\CmsUser u JOIN u.groups g";
46         $query = $this->_em->createQuery($dql);
47
48         $paginator = new Paginator($query);
49         $paginator->setUseOutputWalkers($useOutputWalkers);
50         $this->assertCount(3, $paginator);
51     }
52
53     public function testCountComplexWithOutputWalker()
54     {
55         $dql = "SELECT g, COUNT(u.id) AS userCount FROM Doctrine\Tests\Models\CMS\CmsGroup g LEFT JOIN g.users u GROUP BY g HAVING COUNT(u.id) > 0";
56         $query = $this->_em->createQuery($dql);
57
58         $paginator = new Paginator($query);
59         $paginator->setUseOutputWalkers(true);
60         $this->assertCount(9, $paginator);
61     }
62
63     /**
64      * @dataProvider useOutputWalkers
65      */
66     public function testIterateSimpleWithoutJoinFetchJoinHandlingOff($useOutputWalkers)
67     {
68         $dql = "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u";
69         $query = $this->_em->createQuery($dql);
70
71         $paginator = new Paginator($query, false);
72         $paginator->setUseOutputWalkers($useOutputWalkers);
73         $this->assertCount(3, $paginator->getIterator());
74     }
75
76     /**
77      * @dataProvider useOutputWalkers
78      */
79     public function testIterateSimpleWithoutJoinFetchJoinHandlingOn($useOutputWalkers)
80     {
81         $dql = "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u";
82         $query = $this->_em->createQuery($dql);
83
84         $paginator = new Paginator($query, true);
85         $paginator->setUseOutputWalkers($useOutputWalkers);
86         $this->assertCount(3, $paginator->getIterator());
87     }
88
89     /**
90      * @dataProvider useOutputWalkers
91      */
92     public function testIterateWithFetchJoin($useOutputWalkers)
93     {
94         $dql = "SELECT u,g FROM Doctrine\Tests\Models\CMS\CmsUser u JOIN u.groups g";
95         $query = $this->_em->createQuery($dql);
96
97         $paginator = new Paginator($query, true);
98         $paginator->setUseOutputWalkers($useOutputWalkers);
99         $this->assertCount(3, $paginator->getIterator());
100     }
101
102     public function testIterateComplexWithOutputWalker()
103     {
104         $dql = "SELECT g, COUNT(u.id) AS userCount FROM Doctrine\Tests\Models\CMS\CmsGroup g LEFT JOIN g.users u GROUP BY g HAVING COUNT(u.id) > 0";
105         $query = $this->_em->createQuery($dql);
106
107         $paginator = new Paginator($query);
108         $paginator->setUseOutputWalkers(true);
109         $this->assertCount(9, $paginator->getIterator());
110     }
111
112     public function testDetectOutputWalker()
113     {
114         // This query works using the output walkers but causes an exception using the TreeWalker
115         $dql = "SELECT g, COUNT(u.id) AS userCount FROM Doctrine\Tests\Models\CMS\CmsGroup g LEFT JOIN g.users u GROUP BY g HAVING COUNT(u.id) > 0";
116         $query = $this->_em->createQuery($dql);
117
118         // If the Paginator detects the custom output walker it should fall back to using the
119         // Tree walkers for pagination, which leads to an exception. If the query works, the output walkers were used
120         $query->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, 'Doctrine\ORM\Query\SqlWalker');
121         $paginator = new Paginator($query);
122
123         $this->setExpectedException(
124             'RuntimeException',
125             'Cannot count query that uses a HAVING clause. Use the output walkers for pagination'
126         );
127
128         count($paginator);
129     }
130
131     public function testCloneQuery()
132     {
133         $dql = "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u";
134         $query = $this->_em->createQuery($dql);
135
136         $paginator = new Paginator($query);
137         $paginator->getIterator();
138
139         $this->assertTrue($query->getParameters()->isEmpty());
140     }
141
142     public function populate()
143     {
144         for ($i = 0; $i < 3; $i++) {
145             $user = new CmsUser();
146             $user->name = "Name$i";
147             $user->username = "username$i";
148             $user->status = "active";
149             $this->_em->persist($user);
150
151             for ($j = 0; $j < 3; $j++) {;
152                 $group = new CmsGroup();
153                 $group->name = "group$j";
154                 $user->addGroup($group);
155                 $this->_em->persist($group);
156             }
157         }
158         $this->_em->flush();
159     }
160
161     public function useOutputWalkers()
162     {
163         return array(
164             array(true),
165             array(false),
166         );
167     }
168 }