OneToOneFetchingTestCase.php 10.2 KB
Newer Older
romanb's avatar
romanb committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
<?php
/*
 *  $Id$
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * This software consists of voluntary contributions made by many individuals
 * and is licensed under the LGPL. For more information, see
19
 * <http://www.phpdoctrine.org>.
romanb's avatar
romanb committed
20 21 22 23 24 25 26 27 28
 */

/**
 * Doctrine_Query_MultiJoin2_TestCase
 *
 * @package     Doctrine
 * @author      Konsta Vesterinen <kvesteri@cc.hut.fi>
 * @license     http://www.opensource.org/licenses/lgpl-license.php LGPL
 * @category    Object Relational Mapping
29
 * @link        www.phpdoctrine.org
romanb's avatar
romanb committed
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
 * @since       1.0
 * @version     $Revision$
 */
class Doctrine_Query_OneToOneFetching_TestCase extends Doctrine_UnitTestCase 
{
    public function prepareData()
    { }
    public function prepareTables()
    {
        $this->tables[] = 'QueryTest_Category';
        $this->tables[] = 'QueryTest_Board';
        $this->tables[] = 'QueryTest_User';
        $this->tables[] = 'QueryTest_Entry';
        $this->tables[] = 'QueryTest_Rank';
        parent::prepareTables();
    }
    public function testInitializeData() 
    {
        $query = new Doctrine_Query($this->connection);
        
        $cat = new QueryTest_Category();

        $cat->rootCategoryId = 0;
        $cat->parentCategoryId = 0;
        $cat->name = "Testcat";
        $cat->position = 0;
        $cat->save();
        
        $board = new QueryTest_Board();
        $board->name = "Testboard";
        $board->categoryId = $cat->id;
        $board->position = 0;
        $board->save();
        
        $author = new QueryTest_User();
        $author->username = "romanbb";
        $author->save();
        
        $lastEntry = new QueryTest_Entry();
        $lastEntry->authorId = $author->id;
        $lastEntry->date = 1234;
        $lastEntry->save();
        
        // Set the last entry
        $board->lastEntry = $lastEntry;
        $board->save();
        
        $visibleRank = new QueryTest_Rank();
        $visibleRank->title = "Freak";
        $visibleRank->color = "red";
        $visibleRank->icon = "freak.png";
        $visibleRank->save();
        
        // grant him a rank
        $author->visibleRank = $visibleRank;
        $author->save();

    }
88

romanb's avatar
romanb committed
89 90 91 92 93 94 95 96 97 98 99
    /**
     * Tests that one-one relations are correctly loaded with array fetching
     * when the related records EXIST.
     * 
     * !!! Currently it produces a notice with:
     * !!! Array to string conversion in Doctrine\Hydrate.php on line 937 
     * 
     * !!! And shortly after exits with a fatal error:
     * !!! Fatal error:  Cannot create references to/from string offsets nor overloaded objects
     * !!! in Doctrine\Hydrate.php on line 939
     */
100
    public function testOneToOneArrayFetchingWithExistingRelations()
romanb's avatar
romanb committed
101 102 103
    {
        $query = new Doctrine_Query($this->connection);
        try {
104
            $categories = $query->select("c.*, b.*, le.*, a.username, vr.title, vr.color, vr.icon")
romanb's avatar
romanb committed
105 106 107 108 109 110
                    ->from("QueryTest_Category c")
                    ->leftJoin("c.boards b")
                    ->leftJoin("b.lastEntry le")
                    ->leftJoin("le.author a")
                    ->leftJoin("a.visibleRank vr")
                    ->execute(array(), Doctrine::FETCH_ARRAY);
111

romanb's avatar
romanb committed
112 113 114 115 116 117 118 119 120 121 122 123 124
            // --> currently quits here with a fatal error! <--
                    
            // check boards/categories
            $this->assertEqual(1, count($categories));
            $this->assertTrue(isset($categories[0]['boards']));
            $this->assertEqual(1, count($categories[0]['boards']));
            
            // get the baord for inspection
            $board = $categories[0]['boards'][0];
            
            $this->assertTrue(isset($board['lastEntry']));
            
            // lastentry should've 2 fields. one regular field, one relation.
125
            //$this->assertEqual(2, count($board['lastEntry']));
romanb's avatar
romanb committed
126 127
            $this->assertEqual(1234, (int)$board['lastEntry']['date']);
            $this->assertTrue(isset($board['lastEntry']['author']));
128

romanb's avatar
romanb committed
129
            // author should've 2 fields. one regular field, one relation.
130
            //$this->assertEqual(2, count($board['lastEntry']['author']));
romanb's avatar
romanb committed
131 132
            $this->assertEqual('romanbb', $board['lastEntry']['author']['username']);
            $this->assertTrue(isset($board['lastEntry']['author']['visibleRank']));
133

romanb's avatar
romanb committed
134
            // visibleRank should've 3 regular fields
135
            //$this->assertEqual(3, count($board['lastEntry']['author']['visibleRank']));
romanb's avatar
romanb committed
136 137 138 139 140
            $this->assertEqual('Freak', $board['lastEntry']['author']['visibleRank']['title']);
            $this->assertEqual('red', $board['lastEntry']['author']['visibleRank']['color']);
            $this->assertEqual('freak.png', $board['lastEntry']['author']['visibleRank']['icon']);
                    
        } catch (Doctrine_Exception $e) {
141
            $this->fail();                                    
romanb's avatar
romanb committed
142
        }
143 144
    }

romanb's avatar
romanb committed
145 146 147 148
     /**
     * Tests that one-one relations are correctly loaded with array fetching
     * when the related records DONT EXIST.
     */
149
    public function testOneToOneArrayFetchingWithEmptyRelations()
romanb's avatar
romanb committed
150 151 152 153 154 155 156 157 158
    {
        // temporarily remove the relation to fake a non-existant one
        $board = $this->connection->query("FROM QueryTest_Board b WHERE b.name = ?", array('Testboard'))->getFirst();
        $lastEntryId = $board->lastEntryId;
        $board->lastEntryId = 0;
        $board->save();
        
        $query = new Doctrine_Query($this->connection);
        try {
159
            $categories = $query->select("c.*, b.*, le.*, a.username, vr.title, vr.color, vr.icon")
romanb's avatar
romanb committed
160 161 162 163 164 165
                    ->from("QueryTest_Category c")
                    ->leftJoin("c.boards b")
                    ->leftJoin("b.lastEntry le")
                    ->leftJoin("le.author a")
                    ->leftJoin("a.visibleRank vr")
                    ->execute(array(), Doctrine::FETCH_ARRAY);
166 167


romanb's avatar
romanb committed
168 169 170 171 172 173 174 175
            // check boards/categories
            $this->assertEqual(1, count($categories));
            $this->assertTrue(isset($categories[0]['boards']));
            $this->assertEqual(1, count($categories[0]['boards']));
            
            // get the board for inspection
            $tmpBoard = $categories[0]['boards'][0];
            
176
            $this->assertTrue( ! isset($tmpBoard['lastEntry']));
romanb's avatar
romanb committed
177 178
                    
        } catch (Doctrine_Exception $e) {
179
            $this->fail();                                    
romanb's avatar
romanb committed
180 181 182 183 184
        }
        
        $board->lastEntryId = $lastEntryId;
        $board->save();
    }
185 186 187 188

    // Tests that one-one relations are correctly loaded with record fetching
    // when the related records EXIST.
    public function testOneToOneRecordFetchingWithExistingRelations()
romanb's avatar
romanb committed
189 190 191
    {
        $query = new Doctrine_Query($this->connection);
        try {
192
            $categories = $query->select("c.*, b.*, le.date, a.username, vr.title, vr.color, vr.icon")
romanb's avatar
romanb committed
193 194 195 196 197 198 199 200 201 202 203 204 205
                    ->from("QueryTest_Category c")
                    ->leftJoin("c.boards b")
                    ->leftJoin("b.lastEntry le")
                    ->leftJoin("le.author a")
                    ->leftJoin("a.visibleRank vr")
                    ->execute();
 
            // check boards/categories
            $this->assertEqual(1, count($categories));
            $this->assertEqual(1, count($categories[0]['boards']));
            
            // get the baord for inspection
            $board = $categories[0]['boards'][0];
206

romanb's avatar
romanb committed
207 208 209 210 211 212 213 214 215 216 217
            $this->assertEqual(1234, (int)$board['lastEntry']['date']);
            $this->assertTrue(isset($board['lastEntry']['author']));
            
            $this->assertEqual('romanbb', $board['lastEntry']['author']['username']);
            $this->assertTrue(isset($board['lastEntry']['author']['visibleRank']));
            
            $this->assertEqual('Freak', $board['lastEntry']['author']['visibleRank']['title']);
            $this->assertEqual('red', $board['lastEntry']['author']['visibleRank']['color']);
            $this->assertEqual('freak.png', $board['lastEntry']['author']['visibleRank']['icon']);
                    
        } catch (Doctrine_Exception $e) {
218
            $this->fail();                                    
romanb's avatar
romanb committed
219 220
        }
    }
221 222 223 224 225 226


    // Tests that one-one relations are correctly loaded with record fetching
    // when the related records DONT EXIST.

    public function testOneToOneRecordFetchingWithEmptyRelations()
romanb's avatar
romanb committed
227 228 229 230 231 232 233 234 235
    {
        // temporarily remove the relation to fake a non-existant one
        $board = $this->connection->query("FROM QueryTest_Board b WHERE b.name = ?", array('Testboard'))->getFirst();
        $lastEntryId = $board->lastEntryId;
        $board->lastEntryId = 0;
        $board->save();
        
        $query = new Doctrine_Query($this->connection);
        try {
236
            $categories = $query->select("c.*, b.*, le.*, a.username, vr.title, vr.color, vr.icon")
romanb's avatar
romanb committed
237 238 239 240 241 242
                    ->from("QueryTest_Category c")
                    ->leftJoin("c.boards b")
                    ->leftJoin("b.lastEntry le")
                    ->leftJoin("le.author a")
                    ->leftJoin("a.visibleRank vr")
                    ->execute();
243

romanb's avatar
romanb committed
244 245 246 247
            // check boards/categories
            $this->assertEqual(1, count($categories));
            $this->assertTrue(isset($categories[0]['boards']));
            $this->assertEqual(1, count($categories[0]['boards']));
248

romanb's avatar
romanb committed
249 250
            // get the board for inspection
            $tmpBoard = $categories[0]['boards'][0];
251 252
            
            $this->assertTrue( ! isset($tmpBoard['lastEntry']));
253

romanb's avatar
romanb committed
254
        } catch (Doctrine_Exception $e) {
255 256
            print $e;
            $this->fail();
romanb's avatar
romanb committed
257
        }
258

romanb's avatar
romanb committed
259
        $board->lastEntryId = $lastEntryId;
260
        //$board->save();
romanb's avatar
romanb committed
261
    }
262

romanb's avatar
romanb committed
263
}