StateTestCase.php 8.27 KB
Newer Older
zYne's avatar
zYne 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>.
zYne's avatar
zYne committed
20 21 22 23 24 25 26 27 28
 */

/**
 * Doctrine_Record_State_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
zYne's avatar
zYne committed
30 31 32
 * @since       1.0
 * @version     $Revision$
 */
zYne's avatar
zYne committed
33 34 35 36 37 38 39 40 41
class Doctrine_Record_State_TestCase extends Doctrine_UnitTestCase 
{
    public function prepareTables() 
    { 
        $this->tables = array('Entity');
        
        parent::prepareTables();
    }

zYne's avatar
zYne committed
42 43
    public function prepareData() 
    { }
zYne's avatar
zYne committed
44

zYne's avatar
zYne committed
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
    public function testAssigningAutoincId()
    {
        $user = new User();
        
        $this->assertEqual($user->id, null);
        
        $user->name = 'zYne';

        $user->save();

        $this->assertEqual($user->id, 1);
        
        $user->id = 2;

        $this->assertEqual($user->id, 2);
        
        $user->save();
    }
63

zYne's avatar
zYne committed
64 65
    /**
    public function testAssignFieldsToProxies()
zYne's avatar
zYne committed
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
    {
        $user = new User();
        $user->name = 'someuser';
        $user->password = '123';
        $user->save();

        $this->connection->clear();

        $user = $this->connection->queryOne("SELECT u.name FROM User u WHERE u.name = 'someuser'");
        $this->assertEqual($user->name, 'someuser');

        $user->name = 'someother';
        $this->assertEqual($user->name, 'someother');

        $user->save();
        $this->assertEqual($user->name, 'someother');
    }

    public function testAssignUnknownState() 
    {
zYne's avatar
zYne committed
86 87 88 89 90 91 92
        $user = new User();
        try {
            $user->state(123123);
            $this->fail();
        } catch(Doctrine_Record_State_Exception $e) {
            $this->pass();
        }
93
        $this->assertEqual($user->state(), Doctrine_Entity::STATE_TCLEAN);
zYne's avatar
zYne committed
94 95 96
        try {
            $user->state('some unknown state');
            $this->fail();
97
        } catch(Doctrine_Entity_State_Exception $e) {
zYne's avatar
zYne committed
98 99
            $this->pass();
        }
100
        $this->assertEqual($user->state(), Doctrine_Entity::STATE_TCLEAN);
zYne's avatar
zYne committed
101 102
    }

zYne's avatar
zYne committed
103 104
    public function testAssignDirtyState() 
    {
zYne's avatar
zYne committed
105 106
        $user = new User();

107
        $user->state(Doctrine_Entity::STATE_DIRTY);
zYne's avatar
zYne committed
108

109
        $this->assertEqual($user->state(), Doctrine_Entity::STATE_DIRTY);
zYne's avatar
zYne committed
110 111 112
        
        $user->state('dirty');

113
        $this->assertEqual($user->state(), Doctrine_Entity::STATE_DIRTY);
zYne's avatar
zYne committed
114
    }
zYne's avatar
zYne committed
115 116 117

    public function testAssignCleanState() 
    {
zYne's avatar
zYne committed
118 119
        $user = new User();

120
        $user->state(Doctrine_Entity::STATE_CLEAN);
zYne's avatar
zYne committed
121

122
        $this->assertEqual($user->state(), Doctrine_Entity::STATE_CLEAN);
zYne's avatar
zYne committed
123 124 125
        
        $user->state('clean');

126
        $this->assertEqual($user->state(), Doctrine_Entity::STATE_CLEAN);
zYne's avatar
zYne committed
127
    }
zYne's avatar
zYne committed
128 129 130

    public function testAssignTransientCleanState() 
    {
zYne's avatar
zYne committed
131 132
        $user = new User();

133
        $user->state(Doctrine_Entity::STATE_TCLEAN);
zYne's avatar
zYne committed
134

135
        $this->assertEqual($user->state(), Doctrine_Entity::STATE_TCLEAN);
zYne's avatar
zYne committed
136 137 138
        
        $user->state('tclean');

139
        $this->assertEqual($user->state(), Doctrine_Entity::STATE_TCLEAN);
zYne's avatar
zYne committed
140
    }
zYne's avatar
zYne committed
141 142 143

    public function testAssignTransientDirtyState() 
    {
zYne's avatar
zYne committed
144 145
        $user = new User();

146
        $user->state(Doctrine_Entity::STATE_TDIRTY);
zYne's avatar
zYne committed
147

148
        $this->assertEqual($user->state(), Doctrine_Entity::STATE_TDIRTY);
zYne's avatar
zYne committed
149 150 151
        
        $user->state('tdirty');

152
        $this->assertEqual($user->state(), Doctrine_Entity::STATE_TDIRTY);
zYne's avatar
zYne committed
153
    }
zYne's avatar
zYne committed
154 155 156

    public function testAssignProxyState()
    {
zYne's avatar
zYne committed
157 158
        $user = new User();

159
        $user->state(Doctrine_Entity::STATE_PROXY);
zYne's avatar
zYne committed
160

161
        $this->assertEqual($user->state(), Doctrine_Entity::STATE_PROXY);
zYne's avatar
zYne committed
162 163 164
        
        $user->state('proxy');

165
        $this->assertEqual($user->state(), Doctrine_Entity::STATE_PROXY);
zYne's avatar
zYne committed
166
    }
zYne's avatar
zYne committed
167

zYne's avatar
zYne committed
168 169 170 171 172 173 174 175 176 177 178
    public function testProxiesAreAutomaticallyUpdatedWithFetches()
    {
        $user = new User();
        $user->name = 'someuser';
        $user->password = '123';
        $user->save();

        $this->connection->clear();

        $user = $this->connection->queryOne("SELECT u.name FROM User u WHERE u.name = 'someuser'");
        
179
        $this->assertEqual($user->state(), Doctrine_Entity::STATE_PROXY);
zYne's avatar
zYne committed
180 181 182 183 184 185 186 187 188 189
        
        $user2 = $this->connection->queryOne("FROM User u WHERE u.name = 'someuser'");     

        $this->assertEqual($user->getOID(), $user2->getOID());
        
        $count = count($this->dbh);
        
        $this->assertEqual($user->password, '123');
        
        $this->assertEqual($count, count($this->dbh));
zYne's avatar
zYne committed
190 191 192
    }
    
    public function testProxyToDirtyToProxy() {
193 194 195 196 197 198 199 200 201 202 203 204
        
        define('UNAME','someuser') ;
        define('UPWD1','123') ;
        define('UPWD2','456') ;
        define('ULNAME','somelogin') ;
        
        $user = new User() ;
        $user->name      = UNAME ;
        $user->password  = UPWD1 ;
        $user->loginname = ULNAME ;
        $user->save() ;
        
zYne's avatar
zYne committed
205 206 207 208 209 210
        $this->assertEqual($user->name,UNAME) ;
        $this->assertEqual($user->password,UPWD1) ;
        $this->assertEqual($user->loginname,ULNAME) ;
        
        // to make sure it is saved correctly
        $user1 = $this->connection->queryOne("FROM User u WHERE u.name = '" . UNAME . "'");
211
        $this->assertEqual($user1->state(), Doctrine_Entity::STATE_CLEAN);
zYne's avatar
zYne committed
212 213 214 215
        $this->assertEqual($user1->name,UNAME) ;
        $this->assertEqual($user1->password,UPWD1) ;
        $this->assertEqual($user1->loginname,ULNAME) ;
        
216 217 218 219 220
        $this->connection->clear() ;
        //$this->clearCache() ;
        
        // now lets fetch partially the object
        //$users = Doctrine_Query::create($this->connection)->select('u.name')->from('User u')->where("u.name='someuser'")->execute() ;
zYne's avatar
zYne committed
221
        //$user2 = $users[0] ;
222
        $user2 = $this->connection->queryOne("SELECT u.name FROM User u WHERE u.name = '" . UNAME . "'");
zYne's avatar
zYne committed
223 224
        
        // the object should be in state proxy with only 'name' fetched ...
225
        $this->assertEqual($user2->state(), Doctrine_Entity::STATE_PROXY);
zYne's avatar
zYne committed
226 227 228 229 230 231 232 233
        $this->assertEqual($user2->name,UNAME) ;
        $this->assertEqual($user2->password,null) ;
        $this->assertEqual($user2->loginname,null) ;
        
        // lets edit the object
        $user2->password = UPWD2 ;
        
        // now it should be dirty (but may be PDIRTY ... ?)
234
        $this->assertEqual($user2->state(),Doctrine_Entity::STATE_DIRTY) ;
zYne's avatar
zYne committed
235 236 237 238 239 240 241 242
        $this->assertEqual($user2->name,UNAME) ;
        $this->assertEqual($user2->password,UPWD2) ;
        $this->assertEqual($user2->loginname,null) ;
                
        // lets save
        $user2->save() ;

        // the logic would suggest the object to go back to PROXY mode (becausse $user2->loginname is null aka not sync with DB)
243
        $boolState = ($user2->loginname == null) && ($user2->state() === Doctrine_Entity::STATE_PROXY) ;
zYne's avatar
zYne committed
244 245 246
        // this one will currently fail 
        $this->assertTrue($boolState) ;
        // this will also currently fail (becausse it currently goes back to STATE_CLEAN, which shouldnt be the case)
247
        //$this->assertEqual($user2->state(), Doctrine_Entity::STATE_PROXY);
zYne's avatar
zYne committed
248 249 250
        $this->assertEqual($user2->name,UNAME) ;
        $this->assertEqual($user2->password,UPWD2) ;
        $this->assertEqual($user2->loginname,null) ;
251
     }
zYne's avatar
zYne committed
252
     */
zYne's avatar
zYne committed
253
}