ValidatorTestCase.php 16.3 KB
Newer Older
1
<?php
zYne's avatar
zYne committed
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
/*
 *  $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>.
 */

22
/**
zYne's avatar
zYne committed
23
 * Doctrine_Validator_TestCase
24 25 26
 * TestCase for Doctrine's validation component.
 * 
 * @todo More tests to cover the full interface of Doctrine_Validator_ErrorStack.
zYne's avatar
zYne committed
27 28 29 30 31 32 33 34
 *
 * @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$
35
 */
zYne's avatar
zYne committed
36 37 38 39
class Doctrine_Validator_TestCase extends Doctrine_UnitTestCase 
{
    public function prepareTables() 
    {
romanb's avatar
romanb committed
40 41 42
        $this->tables[] = 'ValidatorTest';
        $this->tables[] = 'ValidatorTest_Person';
        $this->tables[] = 'ValidatorTest_FootballPlayer';
43 44 45
        $this->tables[] = 'ValidatorTest_ClientModel';
        $this->tables[] = 'ValidatorTest_ClientToAddressModel';
        $this->tables[] = 'ValidatorTest_AddressModel';
46 47
        parent::prepareTables();
    }
48
    
49 50 51
    /**
     * Tests correct type detection.
     */
zYne's avatar
zYne committed
52 53 54 55 56 57 58 59
    public function testIsValidType() 
    {
        $var = '123';
        $this->assertTrue(Doctrine_Validator::isValidType($var, 'string'));
        $this->assertTrue(Doctrine_Validator::isValidType($var, 'integer'));
        $this->assertTrue(Doctrine_Validator::isValidType($var, 'float'));
        $this->assertFalse(Doctrine_Validator::isValidType($var, 'array'));
        $this->assertFalse(Doctrine_Validator::isValidType($var, 'object'));
60 61

        $var = 123;
zYne's avatar
zYne committed
62 63 64 65 66
        $this->assertTrue(Doctrine_Validator::isValidType($var, 'string'));
        $this->assertTrue(Doctrine_Validator::isValidType($var, 'integer'));
        $this->assertTrue(Doctrine_Validator::isValidType($var, 'float'));
        $this->assertFalse(Doctrine_Validator::isValidType($var, 'array'));
        $this->assertFalse(Doctrine_Validator::isValidType($var, 'object'));
67 68

        $var = 123.12;
zYne's avatar
zYne committed
69 70 71 72 73
        $this->assertTrue(Doctrine_Validator::isValidType($var, 'string'));
        $this->assertFalse(Doctrine_Validator::isValidType($var, 'integer'));
        $this->assertTrue(Doctrine_Validator::isValidType($var, 'float'));
        $this->assertFalse(Doctrine_Validator::isValidType($var, 'array'));
        $this->assertFalse(Doctrine_Validator::isValidType($var, 'object'));
74 75

        $var = '123.12';
zYne's avatar
zYne committed
76 77 78 79 80
        $this->assertTrue(Doctrine_Validator::isValidType($var, 'string'));
        $this->assertFalse(Doctrine_Validator::isValidType($var, 'integer'));
        $this->assertTrue(Doctrine_Validator::isValidType($var, 'float'));
        $this->assertFalse(Doctrine_Validator::isValidType($var, 'array'));
        $this->assertFalse(Doctrine_Validator::isValidType($var, 'object'));
81 82

        $var = '';
zYne's avatar
zYne committed
83 84 85 86 87
        $this->assertTrue(Doctrine_Validator::isValidType($var, 'string'));
        $this->assertFalse(Doctrine_Validator::isValidType($var, 'integer'));
        $this->assertFalse(Doctrine_Validator::isValidType($var, 'float'));
        $this->assertFalse(Doctrine_Validator::isValidType($var, 'array'));
        $this->assertFalse(Doctrine_Validator::isValidType($var, 'object'));
88 89

        $var = null;
zYne's avatar
zYne committed
90 91 92 93 94
        $this->assertTrue(Doctrine_Validator::isValidType($var, 'string'));
        $this->assertTrue(Doctrine_Validator::isValidType($var, 'integer'));
        $this->assertTrue(Doctrine_Validator::isValidType($var, 'float'));
        $this->assertTrue(Doctrine_Validator::isValidType($var, 'array'));
        $this->assertTrue(Doctrine_Validator::isValidType($var, 'object'));
95 96

        $var = 'str';
zYne's avatar
zYne committed
97 98 99 100 101
        $this->assertTrue(Doctrine_Validator::isValidType($var, 'string'));
        $this->assertFalse(Doctrine_Validator::isValidType($var, 'integer'));
        $this->assertFalse(Doctrine_Validator::isValidType($var, 'float'));
        $this->assertFalse(Doctrine_Validator::isValidType($var, 'array'));
        $this->assertFalse(Doctrine_Validator::isValidType($var, 'object'));
102 103

        $var = array();
zYne's avatar
zYne committed
104 105 106 107 108
        $this->assertFalse(Doctrine_Validator::isValidType($var, 'string'));
        $this->assertFalse(Doctrine_Validator::isValidType($var, 'integer'));
        $this->assertFalse(Doctrine_Validator::isValidType($var, 'float'));
        $this->assertTrue(Doctrine_Validator::isValidType($var, 'array'));
        $this->assertFalse(Doctrine_Validator::isValidType($var, 'object'));
109 110
        
        $var = new Exception();
zYne's avatar
zYne committed
111 112 113 114 115
        $this->assertFalse(Doctrine_Validator::isValidType($var, 'string'));
        $this->assertFalse(Doctrine_Validator::isValidType($var, 'integer'));
        $this->assertFalse(Doctrine_Validator::isValidType($var, 'float'));
        $this->assertFalse(Doctrine_Validator::isValidType($var, 'array'));
        $this->assertTrue(Doctrine_Validator::isValidType($var, 'object'));
116 117 118 119 120
    }

    /**
     * Tests Doctrine_Validator::validateRecord()
     */
zYne's avatar
zYne committed
121 122
    public function testValidate2() 
    {
123 124 125 126 127 128 129 130
        $test = new ValidatorTest();
        $test->mymixed = "message";
        $test->myrange = 1;
        $test->myregexp = '123a';
        
        $validator = new Doctrine_Validator();
        $validator->validateRecord($test);

zYne's avatar
zYne committed
131
        $stack = $test->errorStack();
132 133 134

        $this->assertTrue($stack instanceof Doctrine_Validator_ErrorStack);

135 136 137 138
        $this->assertTrue(in_array('notnull', $stack['mystring']));
        $this->assertTrue(in_array('notblank', $stack['myemail2']));
        $this->assertTrue(in_array('range', $stack['myrange']));
        $this->assertTrue(in_array('regexp', $stack['myregexp']));
139 140 141 142 143 144 145 146 147
        $test->mystring = 'str';


        $test->save();
    }

    /**
     * Tests Doctrine_Validator::validateRecord()
     */
zYne's avatar
zYne committed
148 149
    public function testValidate() 
    {
zYne's avatar
zYne committed
150
        $user = $this->connection->getTable('User')->find(4);
151

zYne's avatar
zYne committed
152 153 154 155
        $set = array('password' => 'this is an example of too long password',
                     'loginname' => 'this is an example of too long loginname',
                     'name' => 'valid name',
                     'created' => 'invalid');
156 157
        $user->setArray($set);
        $email = $user->Email;
zYne's avatar
zYne committed
158
        $email->address = 'zYne@invalid';
159 160 161 162 163 164 165

        $this->assertTrue($user->getModified() == $set);

        $validator = new Doctrine_Validator();
        $validator->validateRecord($user);


zYne's avatar
zYne committed
166
        $stack = $user->errorStack();
167 168

        $this->assertTrue($stack instanceof Doctrine_Validator_ErrorStack);
169 170 171
        $this->assertTrue(in_array('length', $stack['loginname']));
        $this->assertTrue(in_array('length', $stack['password']));
        $this->assertTrue(in_array('type', $stack['created']));
172 173

        $validator->validateRecord($email);
zYne's avatar
zYne committed
174
        $stack = $email->errorStack();
175
        $this->assertTrue(in_array('email', $stack['address']));
zYne's avatar
zYne committed
176
        $email->address = 'arnold@example.com';
177 178

        $validator->validateRecord($email);
zYne's avatar
zYne committed
179
        $stack = $email->errorStack();
180

181
        $this->assertTrue(in_array('unique', $stack['address']));
182 183 184 185 186
    }

    /**
     * Tests the Email validator. (Doctrine_Validator_Email)
     */
zYne's avatar
zYne committed
187 188
    public function testIsValidEmail() 
    {
189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208

        $validator = new Doctrine_Validator_Email();

        $email = $this->connection->create("Email");
        $this->assertFalse($validator->validate($email,"address","example@example",null));
        $this->assertFalse($validator->validate($email,"address","example@@example",null));
        $this->assertFalse($validator->validate($email,"address","example@example.",null));
        $this->assertFalse($validator->validate($email,"address","example@e..",null));

        $this->assertFalse($validator->validate($email,"address","example@e..",null));

        $this->assertTrue($validator->validate($email,"address","null@pookey.co.uk",null));
        $this->assertTrue($validator->validate($email,"address","null@pookey.com",null));
        $this->assertTrue($validator->validate($email,"address","null@users.doctrine.pengus.net",null));

    }

    /**
     * Tests saving records with invalid attributes.
     */
zYne's avatar
zYne committed
209 210
    public function testSave() 
    {
211
        $this->manager->setAttribute(Doctrine::ATTR_VLD, true);
zYne's avatar
zYne committed
212
        $this->manager->setAttribute(Doctrine::ATTR_AUTO_LENGTH_VLD, true);
213 214 215 216 217 218 219 220
        $user = $this->connection->getTable("User")->find(4);
        try {
            $user->name = "this is an example of too long name not very good example but an example nevertheless";
            $user->save();
        } catch(Doctrine_Validator_Exception $e) {
            $this->assertEqual($e->count(), 1);
            $invalidRecords = $e->getInvalidRecords();
            $this->assertEqual(count($invalidRecords), 1);
zYne's avatar
zYne committed
221
            $stack = $invalidRecords[0]->errorStack();
222
            $this->assertTrue(in_array('length', $stack['name']));
223 224 225 226 227
        }

        try {
            $user = $this->connection->create("User");
            $user->Email->address = "jackdaniels@drinkmore.info...";
zYne's avatar
zYne committed
228
            $user->name = "this is an example of too long user name not very good example but an example nevertheless";
229 230 231 232 233
            $user->save();
            $this->fail();
        } catch(Doctrine_Validator_Exception $e) {
            $this->pass();
            $a = $e->getInvalidRecords();
romanb's avatar
romanb committed
234
            //var_dump($a[1]->getErrorStack());
235 236 237 238 239 240
            $this->assertTrue(is_array($a));
            //var_dump(array_search($user, $a));
            $emailStack = $user->Email->errorStack();
            $userStack  = $user->errorStack();            
            $this->assertTrue(in_array('email', $emailStack['address']));
            $this->assertTrue(in_array('length', $userStack['name']));
241 242 243
        }
        
        $this->manager->setAttribute(Doctrine::ATTR_VLD, false);
zYne's avatar
zYne committed
244
        $this->manager->setAttribute(Doctrine::ATTR_AUTO_LENGTH_VLD, false);
245 246 247
    }

    /**
248
     * Tests whether the validate() callback works correctly
249 250
     * in descendants of Doctrine_Record.
     */
zYne's avatar
zYne committed
251 252
    public function testValidationHooks() 
    {
253
        $this->manager->setAttribute(Doctrine::ATTR_VLD, true);
254 255 256
        
        // Tests validate() and validateOnInsert()
        $user = new User();
257 258
         try {
            $user->name = "I'm not The Saint";
259
            $user->password = "1234";
260 261 262 263 264
            $user->save();
        } catch(Doctrine_Validator_Exception $e) {
            $this->assertEqual($e->count(), 1);
            $invalidRecords = $e->getInvalidRecords();
            $this->assertEqual(count($invalidRecords), 1);
zYne's avatar
zYne committed
265 266

            $stack = $invalidRecords[0]->errorStack();
267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284

            $this->assertEqual($stack->count(), 2);
            $this->assertTrue(in_array('notTheSaint', $stack['name']));  // validate() hook constraint
            $this->assertTrue(in_array('pwNotTopSecret', $stack['password'])); // validateOnInsert() hook constraint
        }
        
        // Tests validateOnUpdate()
        $user = $this->connection->getTable("User")->find(4);
        try {
            $user->name = "The Saint";  // Set correct name
            $user->password = "Top Secret"; // Set correct password
            $user->loginname = "Somebody"; // Wrong login name!
            $user->save();
            $this->fail();
        } catch(Doctrine_Validator_Exception $e) {
            $invalidRecords = $e->getInvalidRecords();
            $this->assertEqual(count($invalidRecords), 1);
            
zYne's avatar
zYne committed
285
            $stack = $invalidRecords[0]->errorStack();
286 287
            
            $this->assertEqual($stack->count(), 1);
288
            $this->assertTrue(in_array('notNobody', $stack['loginname']));  // validateOnUpdate() hook constraint
289
        }
290
        
291 292 293 294 295 296 297
        $this->manager->setAttribute(Doctrine::ATTR_VLD, false);
    }
    
    /**
     * Tests whether the validateOnInsert() callback works correctly
     * in descendants of Doctrine_Record.
     */
zYne's avatar
zYne committed
298 299
    public function testHookValidateOnInsert() 
    {
300 301 302 303 304
        $this->manager->setAttribute(Doctrine::ATTR_VLD, true);
        
        $user = new User();
        $user->password = "1234";
        
305 306 307
        try {
            $user->save();
            $this->fail();
308
        } catch (Doctrine_Validator_Exception $ex) {
zYne's avatar
zYne committed
309
            $errors = $user->errorStack();
310
            $this->assertTrue(in_array('pwNotTopSecret', $errors['password']));
311 312
        }
        
313 314
        $this->manager->setAttribute(Doctrine::ATTR_VLD, false);
    }
romanb's avatar
romanb committed
315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345
    
    /*
    public function testIssue()
    {
        $this->manager->setAttribute(Doctrine::ATTR_VLD, true);
        
        try {
            $person = new ValidatorTest_Person();
            $person->name = '';  // will raise a validation exception since name must be 'notblank'
            $person->is_football_player = true;
        
            $person->ValidatorTest_FootballPlayer->team_name = 'liverpool';
            $person->ValidatorTest_FootballPlayer->goals_count = 2;
        
            $person->save();
        }
        catch(Doctrine_Validator_Exception $e) {
            $this->fail("test");
            //var_dump($person->getErrorStack());
            //var_dump($person->ValidatorTest_FootballPlayer->getErrorStack());
        }
        
        $this->manager->setAttribute(Doctrine::ATTR_VLD, false);
    }
    */
    
    /**
     * Enter description here...
     *
     * @todo move to a separate test file (tests/Validator/UniqueTestCase) .
     */
346
    public function testSetSameUniqueValueOnSameRecordThrowsNoException()
romanb's avatar
romanb committed
347 348 349 350
    {
        $this->manager->setAttribute(Doctrine::ATTR_VLD, true);
        
        $r = new ValidatorTest_Person();
351
        $r->identifier = '1234';
romanb's avatar
romanb committed
352 353 354
        $r->save();
        
        $r = $this->connection->getTable('ValidatorTest_Person')->findAll()->getFirst();
355
        $r->identifier = 1234;
romanb's avatar
romanb committed
356 357 358
        try {
           $r->save();
        }
359
        catch (Doctrine_Validator_Exception $e) {
romanb's avatar
romanb committed
360 361 362
           $this->fail("Validator exception raised without reason!");
        }
        
363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385
        $r->delete(); // clean up
        
        $this->manager->setAttribute(Doctrine::ATTR_VLD, false);
    }
    
    public function testSetSameUniqueValueOnDifferentRecordThrowsException()
    {
        $this->manager->setAttribute(Doctrine::ATTR_VLD, true);
        
        $r = new ValidatorTest_Person();
        $r->identifier = '1234';
        $r->save();
        
        $r = new ValidatorTest_Person();
        $r->identifier = 1234;
        try {
            $r->save();
            $this->fail("No validator exception thrown on unique validation.");
        } catch (Doctrine_Validator_Exception $e) {
            $this->pass();
        }
        $r->delete(); // clean up
        
romanb's avatar
romanb committed
386 387
        $this->manager->setAttribute(Doctrine::ATTR_VLD, false);
    }
388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412
    
    public function testValidationOnManyToManyRelations()
    {
        $this->manager->setAttribute(Doctrine::ATTR_VLD, true);
        try {
            $client = new ValidatorTest_ClientModel();
            $client->short_name = 'test';
            $client->ValidatorTest_AddressModel[0]->state = 'az';
            $client->save();
            $this->fail();
        } catch (Doctrine_Validator_Exception $dve) {
            $this->assertEqual(1, count($dve->getInvalidRecords()));
            $stack = $client->ValidatorTest_AddressModel[0]->getErrorStack();
            $this->assertTrue(in_array('notnull', $stack['address1']));
            $this->assertTrue(in_array('notblank', $stack['address1']));
            $this->assertTrue(in_array('notnull', $stack['address2']));
            $this->assertTrue(in_array('notnull', $stack['city']));
            $this->assertTrue(in_array('notblank', $stack['city']));
            $this->assertTrue(in_array('usstate', $stack['state']));
            $this->assertTrue(in_array('notnull', $stack['zip']));
            $this->assertTrue(in_array('notblank', $stack['zip']));
        }
        
        $this->manager->setAttribute(Doctrine::ATTR_VLD, false);
    }
413 414
}
?>