JoinedTestCase.php 8.38 KB
Newer Older
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
<?php

class Doctrine_Inheritance_Joined_TestCase extends Doctrine_UnitTestCase
{
    public function prepareData() 
    { }

    public function prepareTables()
    {
        $this->tables[] = 'CTI_User';
        $this->tables[] = 'CTI_Manager';
        $this->tables[] = 'CTI_Customer';
        $this->tables[] = 'CTI_SuperManager';
        
        parent::prepareTables();   
    }
    
    public function setUp()
    {
        parent::setUp();
        $this->prepareTables();
    }

    public function testMetadataSetup()
    {        
26 27 28 29
        $suManagerTable = $this->conn->getMetadata('CTI_SuperManager');
        $userTable = $this->conn->getMetadata('CTI_User');
        $customerTable = $this->conn->getMetadata('CTI_Customer');
        $managerTable = $this->conn->getMetadata('CTI_Manager');
30 31 32 33 34 35
        $this->assertTrue($suManagerTable !== $userTable);
        $this->assertTrue($suManagerTable !== $customerTable);
        $this->assertTrue($userTable !== $customerTable);
        $this->assertTrue($managerTable !== $suManagerTable);
        
        // expected column counts
36
        $this->assertEqual(6, count($suManagerTable->getColumns()));
37
        $this->assertEqual(4, count($userTable->getColumns()));
38 39
        $this->assertEqual(5, count($managerTable->getColumns()));
        $this->assertEqual(5, count($customerTable->getColumns()));
40 41 42 43 44 45 46 47
        
        // expected table names
        $this->assertEqual('cti_user', $userTable->getTableName());
        $this->assertEqual('cti_manager', $managerTable->getTableName());
        $this->assertEqual('cti_customer', $customerTable->getTableName());
        $this->assertEqual('cti_supermanager', $suManagerTable->getTableName());
        
        // expected joined parents option
48 49 50 51
        $this->assertEqual(array(), $userTable->getParentClasses());
        $this->assertEqual(array('CTI_User'), $managerTable->getParentClasses());
        $this->assertEqual(array('CTI_User'), $customerTable->getParentClasses());
        $this->assertEqual(array('CTI_Manager', 'CTI_User'), $suManagerTable->getParentClasses());
52 53
        
        // check inheritance map
54 55
        $this->assertEqual(array(1 => 'CTI_User', 2 => 'CTI_Manager',
                3 => 'CTI_Customer', 4 => 'CTI_SuperManager'), $userTable->getInheritanceOption('discriminatorMap'));
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
        
    }
    
    protected function _createManager()
    {
        $manager = new CTI_Manager();
        $manager->salary = 80000;
        $manager->name = 'John Smith';
        try {
            $manager->save();
            $this->pass();
            return $manager;
        } catch (Exception $e) {
            $this->fail("Inserting record in class table inheritance failed: " . $e->getMessage());
        }
    }
    
    protected function _createSuperManager()
    {
        $manager = new CTI_SuperManager();
        $manager->salary = 1000000;
        $manager->name = 'Bill Gates';
        $manager->gosutitle = 'BillyBoy';
        try {
            $manager->save();
            $this->pass();
            return $manager;
        } catch (Exception $e) {
            $this->fail("Inserting record in class table inheritance failed: " . $e->getMessage());
        }
        
    }
    
    public function testSaveInsertsDataAcrossJoinedTablesTransparently()
    {
        $manager = $this->_createManager();
        $this->assertEqual(1, $manager->id);
        $this->assertEqual(80000, $manager->salary);
        $this->assertEqual('John Smith', $manager->name);
95
        $this->assertTrue($manager instanceof CTI_Manager);
96 97 98 99 100 101
        
        $superManager = $this->_createSuperManager();
        $this->assertEqual(2, $superManager->id);
        $this->assertEqual(1000000, $superManager->salary);
        $this->assertEqual('Bill Gates', $superManager->name);
        $this->assertEqual('BillyBoy', $superManager->gosutitle);
102
        $this->assertTrue($superManager instanceof CTI_SuperManager);
103 104
    }
    
105 106 107 108 109 110 111 112 113 114 115 116 117
    public function testUpdateUpdatesOnlyChangedFields()
    {
        $manager = $this->_createManager();        
        try {
            $manager->salary = 12;
            $manager->save();
            $this->pass();
        } catch (Exception $e) {
            $this->fail("Update failed [{$e->getMessage()}].");
        }
        
    }
    
118 119 120 121 122 123 124 125 126 127 128 129 130 131
    public function testUpdateUpdatesDataAcrossJoinedTablesTransparently()
    {
        $manager = $this->_createManager();
        $manager->salary = 90000; // he got a pay rise...
        $manager->name = 'John Locke'; // he got married ...
        try {
            $manager->save();
            $this->pass();
        } catch (Exception $e) {
            $this->fail("Updating record in class table inheritance failed: " . $e->getMessage());
        }  
        $this->assertEqual(1, $manager->id);
        $this->assertEqual(90000, $manager->salary);
        $this->assertEqual('John Locke', $manager->name);
132
        $this->assertTrue($manager instanceof CTI_Manager);
133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
        
        
        $superManager = $this->_createSuperManager();
        $superManager->salary = 0; // he got fired...
        $superManager->name = 'Bill Clinton'; // he got married ... again
        $superManager->gosutitle = 'Billy the Kid'; // ... and went mad
        try {
            $superManager->save();
            $this->pass();
        } catch (Exception $e) {
            $this->fail("Updating record in class table inheritance failed: " . $e->getMessage());
        }  
        $this->assertEqual(2, $superManager->id);
        $this->assertEqual(0, $superManager->salary);
        $this->assertEqual('Bill Clinton', $superManager->name);
        $this->assertEqual('Billy the Kid', $superManager->gosutitle);
149
        $this->assertTrue($superManager instanceof CTI_SuperManager);
150
    }
151 152 153 154
    
    public function testDqlQueryJoinsTransparentlyAcrossParents()
    {
        $this->_createManager();
155
        $this->conn->clear('CTI_Manager');
156 157 158 159 160 161 162 163 164 165 166 167 168 169
        
        $query = $this->conn->createQuery();
        $query->parseQuery("SELECT m.* FROM CTI_Manager m");
        $manager = $query->execute()->getFirst();
        
        $this->assertTrue($manager instanceof CTI_Manager);
        $this->assertEqual(1, $manager->id);
        $this->assertEqual(80000, $manager->salary);
        $this->assertEqual('John Smith', $manager->name);
    }
    
    public function testQueryingBaseClassOuterJoinsSubClassesAndReturnsSubclassInstances()
    {
        $this->_createManager();
170 171
        $this->conn->clear('CTI_Manager');
        $this->conn->clear('CTI_User');
172 173 174 175 176 177 178 179 180 181 182
        
        $query = $this->conn->createQuery();
        $query->parseQuery("SELECT u.* FROM CTI_User u");
        //echo $query->getSql();
        $user = $query->execute()->getFirst();
        
        $this->assertTrue($user instanceof CTI_Manager);
        $this->assertEqual(1, $user->id);
        $this->assertEqual(80000, $user->salary);
        $this->assertEqual('John Smith', $user->name);
    }
183 184 185
}


186
class CTI_User extends Doctrine_Entity
187
{    
188
    public static function initMetadata($class)
189
    {
romanb's avatar
romanb committed
190
        $class->setInheritanceType(Doctrine::INHERITANCE_TYPE_JOINED, array(
191 192 193
                'discriminatorColumn' => 'dtype',
                'discriminatorMap' => array(1 => 'CTI_User', 2 => 'CTI_Manager',
                        3 => 'CTI_Customer', 4 => 'CTI_SuperManager')
194
                ));
195 196 197 198
        $class->setSubclasses(array('CTI_Manager', 'CTI_Customer', 'CTI_SuperManager'));  
        $class->setTableName('cti_user');
        $class->setColumn('cti_id as id', 'integer', 4, array('primary' => true, 'autoincrement' => true));
        $class->setColumn('cti_foo as foo', 'integer', 4);
199
        $class->setColumn('cti_name as name', 'string', 50, array('notnull' => true));
200 201
        $class->setColumn('dtype', 'integer', 2);
    }    
202 203 204 205
}

class CTI_Manager extends CTI_User 
{
206 207 208
    protected $name;
    
    public static function initMetadata($class)
209
    {
210 211 212
        $class->setTableName('cti_manager');
        $class->setSubclasses(array('CTI_SuperManager')); 
        $class->setColumn('ctim_salary as salary', 'varchar', 50, array());
213 214 215 216 217
    }
}

class CTI_Customer extends CTI_User
{
218
    public static function initMetadata($class)
219
    {
220 221
        $class->setTableName('cti_customer');
        $class->setColumn('ctic_bonuspoints as bonuspoints', 'varchar', 50, array());
222 223 224 225 226
    }
}

class CTI_SuperManager extends CTI_Manager
{
227
    public static function initMetadata($class)
228
    {
229 230
        $class->setTableName('cti_supermanager');
        $class->setColumn('ctism_gosutitle as gosutitle', 'varchar', 50, array());
231 232
    }
}