OneToOneFetchingTestCase.php 10.6 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 19 20 21 22 23 24 25 26 27 28 29 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 88 89 90 91 92 93 94 95 96 97 98 99
<?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
 * <http://www.phpdoctrine.com>.
 */

/**
 * 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
 * @link        www.phpdoctrine.com
 * @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();

    }
    
    /**
     * 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 141 142
            $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) {
            $this->fail();                                	
        }
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 150

    public function testOneToOneArrayFetchingWithEmptyRelations()
romanb's avatar
romanb committed
151 152 153 154 155 156 157 158 159
    {
        // 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 {
160
            $categories = $query->select("c.*, b.*, le.*, a.username, vr.title, vr.color, vr.icon")
romanb's avatar
romanb committed
161 162 163 164 165 166
                    ->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);
167 168


romanb's avatar
romanb committed
169 170 171 172 173 174 175 176
            // 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];
            
177
            $this->assertTrue( ! isset($tmpBoard['lastEntry']));
romanb's avatar
romanb committed
178 179 180 181 182 183 184 185
                    
        } catch (Doctrine_Exception $e) {
            $this->fail();                                	
        }
        
        $board->lastEntryId = $lastEntryId;
        $board->save();
    }
186 187 188 189

    // Tests that one-one relations are correctly loaded with record fetching
    // when the related records EXIST.
    public function testOneToOneRecordFetchingWithExistingRelations()
romanb's avatar
romanb committed
190 191 192
    {
        $query = new Doctrine_Query($this->connection);
        try {
193
            $categories = $query->select("c.*, b.*, le.*, a.username, vr.title, vr.color, vr.icon")
romanb's avatar
romanb committed
194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227
                    ->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];
            
            // lastentry should've 2 fields. one regular field, one relation.
            $this->assertEqual(2, count($board['lastEntry']));
            $this->assertEqual(1234, (int)$board['lastEntry']['date']);
            $this->assertTrue(isset($board['lastEntry']['author']));
            
            // author should've 2 fields. one regular field, one relation.
            $this->assertEqual(2, count($board['lastEntry']['author']));
            $this->assertEqual('romanbb', $board['lastEntry']['author']['username']);
            $this->assertTrue(isset($board['lastEntry']['author']['visibleRank']));
            
            // visibleRank should've 3 regular fields
            $this->assertEqual(3, count($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) {
            $this->fail();                                	
        }
    }
228 229 230 231 232 233


    // 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
234 235 236 237 238 239 240 241 242
    {
        // 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 {
243
            $categories = $query->select("c.*, b.*, le.*, a.username, vr.title, vr.color, vr.icon")
romanb's avatar
romanb committed
244 245 246 247 248 249
                    ->from("QueryTest_Category c")
                    ->leftJoin("c.boards b")
                    ->leftJoin("b.lastEntry le")
                    ->leftJoin("le.author a")
                    ->leftJoin("a.visibleRank vr")
                    ->execute();
250

romanb's avatar
romanb committed
251 252 253 254
            // check boards/categories
            $this->assertEqual(1, count($categories));
            $this->assertTrue(isset($categories[0]['boards']));
            $this->assertEqual(1, count($categories[0]['boards']));
255

romanb's avatar
romanb committed
256 257
            // get the board for inspection
            $tmpBoard = $categories[0]['boards'][0];
258 259 260

            $this->assertTrue( ! isset($board['lastEntry']));

romanb's avatar
romanb committed
261
        } catch (Doctrine_Exception $e) {
262 263
            print $e;
            $this->fail();
romanb's avatar
romanb committed
264
        }
265

romanb's avatar
romanb committed
266
        $board->lastEntryId = $lastEntryId;
267
        //$board->save();
romanb's avatar
romanb committed
268
    }
269

romanb's avatar
romanb committed
270
}