DBTestCase.php 16 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 22 23 24 25 26 27 28 29 30 31 32 33 34
/*
 *  $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_Db_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_Db_TestCase extends Doctrine_UnitTestCase
{
zYne's avatar
zYne committed
35

zYne's avatar
zYne committed
36 37 38 39 40 41 42 43
    public function prepareData() 
    { }

    public function prepareTables() 
    { }

    public function init() 
    { }
zYne's avatar
zYne committed
44
    
zYne's avatar
zYne committed
45 46
    public function testInitialize() 
    {
zYne's avatar
zYne committed
47 48
        $this->conn = Doctrine_Manager::getInstance()->openConnection(array('sqlite::memory:'));
        $this->conn->exec('CREATE TABLE entity (id INTEGER, name TEXT)');
zYne's avatar
zYne committed
49

zYne's avatar
zYne committed
50 51
        $this->conn->exec("INSERT INTO entity (id, name) VALUES (1, 'zYne')");
        $this->conn->exec("INSERT INTO entity (id, name) VALUES (2, 'John')");
52 53
        
        
zYne's avatar
zYne committed
54
        $this->assertEqual($this->conn->getAttribute(Doctrine::ATTR_DRIVER_NAME), 'sqlite');
55 56
    }

zYne's avatar
zYne committed
57 58
    public function testAddValidEventListener() 
    {
zYne's avatar
zYne committed
59
        $this->conn->setListener(new Doctrine_EventListener());
zYne's avatar
zYne committed
60

zYne's avatar
zYne committed
61
        $this->assertTrue($this->conn->getListener() instanceof Doctrine_EventListener);
zYne's avatar
zYne committed
62
        try {
zYne's avatar
zYne committed
63
            $ret = $this->conn->addListener(new Doctrine_Connection_TestLogger());
zYne's avatar
zYne committed
64
            $this->pass();
zYne's avatar
zYne committed
65 66
            $this->assertTrue($ret instanceof Doctrine_Connection);
        } catch(Doctrine_EventListener_Exception $e) {
zYne's avatar
zYne committed
67 68
            $this->fail();
        }
zYne's avatar
zYne committed
69 70
        $this->assertTrue($this->conn->getListener() instanceof Doctrine_EventListener_Chain);
        $this->assertTrue($this->conn->getListener()->get(0) instanceof Doctrine_Connection_TestLogger);
zYne's avatar
zYne committed
71

zYne's avatar
zYne committed
72
        try {
zYne's avatar
zYne committed
73
            $ret = $this->conn->addListener(new Doctrine_Connection_TestValidListener());
zYne's avatar
zYne committed
74
            $this->pass();
zYne's avatar
zYne committed
75 76
            $this->assertTrue($ret instanceof Doctrine_Connection);
        } catch(Doctrine_EventListener_Exception $e) {
zYne's avatar
zYne committed
77 78
            $this->fail();
        }
zYne's avatar
zYne committed
79 80 81
        $this->assertTrue($this->conn->getListener() instanceof Doctrine_EventListener_Chain);
        $this->assertTrue($this->conn->getListener()->get(0) instanceof Doctrine_Connection_TestLogger);
        $this->assertTrue($this->conn->getListener()->get(1) instanceof Doctrine_Connection_TestValidListener);
zYne's avatar
zYne committed
82 83
        
        try {
zYne's avatar
zYne committed
84
            $ret = $this->conn->addListener(new Doctrine_EventListener_Chain(), 'chain');
zYne's avatar
zYne committed
85
            $this->pass();
zYne's avatar
zYne committed
86 87
            $this->assertTrue($ret instanceof Doctrine_Connection);
        } catch(Doctrine_EventListener_Exception $e) {
zYne's avatar
zYne committed
88 89
            $this->fail();
        }
zYne's avatar
zYne committed
90 91 92 93
        $this->assertTrue($this->conn->getListener() instanceof Doctrine_EventListener_Chain);
        $this->assertTrue($this->conn->getListener()->get(0) instanceof Doctrine_Connection_TestLogger);
        $this->assertTrue($this->conn->getListener()->get(1) instanceof Doctrine_Connection_TestValidListener);
        $this->assertTrue($this->conn->getListener()->get('chain') instanceof Doctrine_EventListener_Chain);
zYne's avatar
zYne committed
94

zYne's avatar
zYne committed
95 96 97
        // replacing

        try {
zYne's avatar
zYne committed
98
            $ret = $this->conn->addListener(new Doctrine_EventListener_Chain(), 'chain');
zYne's avatar
zYne committed
99
            $this->pass();
zYne's avatar
zYne committed
100 101
            $this->assertTrue($ret instanceof Doctrine_Connection);
        } catch(Doctrine_EventListener_Exception $e) {
zYne's avatar
zYne committed
102 103
            $this->fail();
        }
zYne's avatar
zYne committed
104 105 106 107
        $this->assertTrue($this->conn->getListener() instanceof Doctrine_EventListener_Chain);
        $this->assertTrue($this->conn->getListener()->get(0) instanceof Doctrine_Connection_TestLogger);
        $this->assertTrue($this->conn->getListener()->get(1) instanceof Doctrine_Connection_TestValidListener);
        $this->assertTrue($this->conn->getListener()->get('chain') instanceof Doctrine_EventListener_Chain);
zYne's avatar
zYne committed
108
    }
zYne's avatar
zYne committed
109

zYne's avatar
zYne committed
110 111
    public function testListeningEventsWithSingleListener() 
    {
zYne's avatar
zYne committed
112 113 114
        $this->conn->setListener(new Doctrine_Connection_TestLogger());
        $listener = $this->conn->getListener();
        $stmt = $this->conn->prepare('INSERT INTO entity (id) VALUES(?)');
zYne's avatar
zYne committed
115

116 117
        $this->assertEqual($listener->pop(), 'postPrepare');
        $this->assertEqual($listener->pop(), 'prePrepare');
zYne's avatar
zYne committed
118 119 120
        
        $stmt->execute(array(1));

zYne's avatar
zYne committed
121 122
        $this->assertEqual($listener->pop(), 'postStmtExecute');
        $this->assertEqual($listener->pop(), 'preStmtExecute');
zYne's avatar
zYne committed
123
        
zYne's avatar
zYne committed
124
        $this->conn->exec('DELETE FROM entity');
zYne's avatar
zYne committed
125

126 127
        $this->assertEqual($listener->pop(), 'postExec');
        $this->assertEqual($listener->pop(), 'preExec');
zYne's avatar
zYne committed
128
        
zYne's avatar
zYne committed
129
        $this->conn->beginTransaction();
zYne's avatar
zYne committed
130

131 132
        $this->assertEqual($listener->pop(), 'postTransactionBegin');
        $this->assertEqual($listener->pop(), 'preTransactionBegin');
zYne's avatar
zYne committed
133

zYne's avatar
zYne committed
134
        $this->conn->exec('INSERT INTO entity (id) VALUES (1)');
zYne's avatar
zYne committed
135

136 137
        $this->assertEqual($listener->pop(), 'postExec');
        $this->assertEqual($listener->pop(), 'preExec');
zYne's avatar
zYne committed
138

zYne's avatar
zYne committed
139
        $this->conn->commit();
zYne's avatar
zYne committed
140
        
141 142
        $this->assertEqual($listener->pop(), 'postTransactionCommit');
        $this->assertEqual($listener->pop(), 'preTransactionCommit');
zYne's avatar
zYne committed
143
    }
zYne's avatar
zYne committed
144

zYne's avatar
zYne committed
145 146
    public function testListeningQueryEventsWithListenerChain() 
    {
zYne's avatar
zYne committed
147
        $this->conn->exec('DROP TABLE entity');
zYne's avatar
zYne committed
148

zYne's avatar
zYne committed
149 150
        $this->conn->addListener(new Doctrine_Connection_TestLogger());
        $this->conn->addListener(new Doctrine_Connection_TestLogger());
zYne's avatar
zYne committed
151

zYne's avatar
zYne committed
152
        $this->conn->exec('CREATE TABLE entity (id INT)');
zYne's avatar
zYne committed
153

zYne's avatar
zYne committed
154 155
        $listener = $this->conn->getListener()->get(0);
        $listener2 = $this->conn->getListener()->get(1);
156 157
        $this->assertEqual($listener->pop(), 'postExec');
        $this->assertEqual($listener->pop(), 'preExec');
zYne's avatar
zYne committed
158

159 160
        $this->assertEqual($listener2->pop(), 'postExec');
        $this->assertEqual($listener2->pop(), 'preExec');
161
    }
162

zYne's avatar
zYne committed
163 164
    public function testListeningPrepareEventsWithListenerChain() 
    {
zYne's avatar
zYne committed
165

zYne's avatar
zYne committed
166 167 168
        $stmt = $this->conn->prepare('INSERT INTO entity (id) VALUES(?)');
        $listener = $this->conn->getListener()->get(0);
        $listener2 = $this->conn->getListener()->get(1);
169 170
        $this->assertEqual($listener->pop(), 'postPrepare');
        $this->assertEqual($listener->pop(), 'prePrepare');
zYne's avatar
zYne committed
171

172 173
        $this->assertEqual($listener2->pop(), 'postPrepare');
        $this->assertEqual($listener2->pop(), 'prePrepare');
zYne's avatar
zYne committed
174 175 176

        $stmt->execute(array(1));

zYne's avatar
zYne committed
177 178
        $this->assertEqual($listener->pop(), 'postStmtExecute');
        $this->assertEqual($listener->pop(), 'preStmtExecute');
179

zYne's avatar
zYne committed
180 181 182 183 184 185 186 187 188 189 190 191 192 193 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 228 229 230 231 232 233 234 235
        $this->assertEqual($listener2->pop(), 'postStmtExecute');
        $this->assertEqual($listener2->pop(), 'preStmtExecute');
    }

    public function testListeningErrorHandlingMethodsOnExec()
    {
    	$this->conn->setAttribute(Doctrine::ATTR_THROW_EXCEPTIONS, false);
        $listener = $this->conn->getListener()->get(0);
        $this->conn->exec('DELETE FROM unknown');

        $this->assertEqual($listener->pop(), 'postError');
        $this->assertEqual($listener->pop(), 'preError');

        $this->assertEqual($listener->pop(), 'preExec');
    }

    public function testListeningErrorHandlingMethodsOnQuery()
    {
    	$this->conn->setAttribute(Doctrine::ATTR_THROW_EXCEPTIONS, false);
        $listener = $this->conn->getListener()->get(0);
        $this->conn->execute('DELETE FROM unknown');

        $this->assertEqual($listener->pop(), 'postError');
        $this->assertEqual($listener->pop(), 'preError');

        $this->assertEqual($listener->pop(), 'preQuery');
    }

    public function testListeningErrorHandlingMethodsOnPrepare()
    {
    	$this->conn->setAttribute(Doctrine::ATTR_THROW_EXCEPTIONS, false);
        $listener = $this->conn->getListener()->get(0);

        $this->conn->prepare('INSERT INTO unknown (id) VALUES (?)');

        $this->assertEqual($listener->pop(), 'postError');
        $this->assertEqual($listener->pop(), 'preError');

        $this->assertEqual($listener->pop(), 'prePrepare');
    }

    public function testListeningErrorHandlingMethodsOnStatementExecute()
    {
    	$this->conn->setAttribute(Doctrine::ATTR_THROW_EXCEPTIONS, false);
        $listener = $this->conn->getListener()->get(0);

        $stmt = $this->conn->prepare('INSERT INTO entity (id) VALUES (?)');

        $stmt->execute(array(1, 2, 3));

        $this->assertEqual($listener->pop(), 'postError');
        $this->assertEqual($listener->pop(), 'preError');

        $this->assertEqual($listener->pop(), 'preStmtExecute');
        $this->assertEqual($listener->pop(), 'postPrepare');
        $this->assertEqual($listener->pop(), 'prePrepare');
236
    }
237 238

    public function testListeningExecEventsWithListenerChain()
zYne's avatar
zYne committed
239
    {
zYne's avatar
zYne committed
240 241 242
        $this->conn->exec('DELETE FROM entity');
        $listener = $this->conn->getListener()->get(0);
        $listener2 = $this->conn->getListener()->get(1);
243 244
        $this->assertEqual($listener->pop(), 'postExec');
        $this->assertEqual($listener->pop(), 'preExec');
zYne's avatar
zYne committed
245

246 247
        $this->assertEqual($listener2->pop(), 'postExec');
        $this->assertEqual($listener2->pop(), 'preExec');
248
    }
zYne's avatar
zYne committed
249

zYne's avatar
zYne committed
250 251
    public function testListeningTransactionEventsWithListenerChain() 
    {
zYne's avatar
zYne committed
252 253 254
        $this->conn->beginTransaction();
        $listener = $this->conn->getListener()->get(0);
        $listener2 = $this->conn->getListener()->get(1);
255 256
        $this->assertEqual($listener->pop(), 'postTransactionBegin');
        $this->assertEqual($listener->pop(), 'preTransactionBegin');
zYne's avatar
zYne committed
257

258 259
        $this->assertEqual($listener2->pop(), 'postTransactionBegin');
        $this->assertEqual($listener2->pop(), 'preTransactionBegin');
zYne's avatar
zYne committed
260

zYne's avatar
zYne committed
261
        $this->conn->exec('INSERT INTO entity (id) VALUES (1)');
zYne's avatar
zYne committed
262

zYne's avatar
zYne committed
263
        $this->conn->commit();
zYne's avatar
zYne committed
264

265 266
        $this->assertEqual($listener->pop(), 'postTransactionCommit');
        $this->assertEqual($listener->pop(), 'preTransactionCommit');
zYne's avatar
zYne committed
267
        
268 269
        $this->assertEqual($listener->pop(), 'postExec');
        $this->assertEqual($listener->pop(), 'preExec');
zYne's avatar
zYne committed
270
        
zYne's avatar
zYne committed
271
        $this->conn->exec('DROP TABLE entity');
zYne's avatar
zYne committed
272
    }
zYne's avatar
zYne committed
273

zYne's avatar
zYne committed
274 275
    public function testSetValidEventListener() 
    {
zYne's avatar
zYne committed
276
        try {
zYne's avatar
zYne committed
277
            $this->conn->setListener(new Doctrine_Connection_TestLogger());
zYne's avatar
zYne committed
278
            $this->pass();
zYne's avatar
zYne committed
279
        } catch(Doctrine_EventListener_Exception $e) {
zYne's avatar
zYne committed
280 281
            $this->fail();
        }
zYne's avatar
zYne committed
282
        $this->assertTrue($this->conn->getListener() instanceof Doctrine_Connection_TestLogger);
zYne's avatar
zYne committed
283
        try {
zYne's avatar
zYne committed
284
            $this->conn->setListener(new Doctrine_Connection_TestValidListener());
zYne's avatar
zYne committed
285
            $this->pass();
zYne's avatar
zYne committed
286
        } catch(Doctrine_EventListener_Exception $e) {
zYne's avatar
zYne committed
287 288
            $this->fail();
        }
zYne's avatar
zYne committed
289
        $this->assertTrue($this->conn->getListener() instanceof Doctrine_Connection_TestValidListener);
zYne's avatar
zYne committed
290
        try {
zYne's avatar
zYne committed
291
            $this->conn->setListener(new Doctrine_EventListener_Chain());
zYne's avatar
zYne committed
292 293
            $this->pass();

zYne's avatar
zYne committed
294
        } catch(Doctrine_EventListener_Exception $e) {
zYne's avatar
zYne committed
295 296
            $this->fail();
        }
zYne's avatar
zYne committed
297
        $this->assertTrue($this->conn->getListener() instanceof Doctrine_EventListener_Chain);
zYne's avatar
zYne committed
298
        try {
zYne's avatar
zYne committed
299
            $this->conn->setListener(new Doctrine_EventListener());
zYne's avatar
zYne committed
300
            $this->pass();
zYne's avatar
zYne committed
301
        } catch(Doctrine_EventListener_Exception $e) {
zYne's avatar
zYne committed
302 303
            $this->fail();
        }
zYne's avatar
zYne committed
304
        $this->assertTrue($this->conn->getListener() instanceof Doctrine_EventListener);
zYne's avatar
zYne committed
305
    }
zYne's avatar
zYne committed
306

zYne's avatar
zYne committed
307 308
    public function testSetInvalidEventListener() 
    {
zYne's avatar
zYne committed
309
        try {
zYne's avatar
zYne committed
310
            $this->conn->setListener(new Doctrine_Connection_TestInvalidListener());
zYne's avatar
zYne committed
311
            $this->fail();
zYne's avatar
zYne committed
312
        } catch(Doctrine_EventListener_Exception $e) {
zYne's avatar
zYne committed
313 314 315
            $this->pass();
        }
    }
zYne's avatar
zYne committed
316 317 318
    public function testInvalidDSN() 
    {
    	$manager = Doctrine_Manager::getInstance();
319
        try {
zYne's avatar
zYne committed
320
            $this->conn = $manager->openConnection('');
321
            $this->fail();
zYne's avatar
zYne committed
322
        } catch(Doctrine_Exception $e) {
323 324 325
            $this->pass();
        }
        try {
zYne's avatar
zYne committed
326
            $this->conn = $manager->openConnection('unknown');
327
            $this->fail();
zYne's avatar
zYne committed
328
        } catch(Doctrine_Exception $e) {
329 330 331
            $this->pass();
        }   
        try {
zYne's avatar
zYne committed
332
            $this->conn = $manager->openConnection(0);
333
            $this->fail();
zYne's avatar
zYne committed
334
        } catch(Doctrine_Exception $e) {
335 336 337
            $this->pass();
        }
    }
zYne's avatar
zYne committed
338 339 340
    public function testInvalidScheme() 
    {
    	$manager = Doctrine_Manager::getInstance();
341
        try {
zYne's avatar
zYne committed
342
            $this->conn = $manager->openConnection('unknown://:memory:');
343
            $this->fail();
zYne's avatar
zYne committed
344
        } catch(Doctrine_Exception $e) {
345 346 347
            $this->pass();
        }
    }
zYne's avatar
zYne committed
348 349 350
    public function testInvalidHost() 
    {
    	$manager = Doctrine_Manager::getInstance();
351
        try {
zYne's avatar
zYne committed
352
            $this->conn = $manager->openConnection('mysql://user:password@');
353
            $this->fail();
zYne's avatar
zYne committed
354
        } catch(Doctrine_Exception $e) {
355 356 357
            $this->pass();
        }
    }
zYne's avatar
zYne committed
358 359 360
    public function testInvalidDatabase() 
    {
    	$manager = Doctrine_Manager::getInstance();
361
        try {
zYne's avatar
zYne committed
362
            $this->conn = $manager->openConnection('mysql://user:password@host/');
363
            $this->fail();
zYne's avatar
zYne committed
364
        } catch(Doctrine_Exception $e) {
365 366 367
            $this->pass();
        }
    }
zYne's avatar
zYne committed
368 369 370
    /**
    public function testGetConnectionPdoLikeDSN()
    {
zYne's avatar
zYne committed
371 372 373 374
        $this->conn = Doctrine_Manager::openConnection(array('mysql:host=localhost;dbname=test', 'root', 'password'));
        $this->assertEqual($this->conn->getOption('dsn'), 'mysql:host=localhost;dbname=test');
        $this->assertEqual($this->conn->getOption('username'), 'root');
        $this->assertEqual($this->conn->getOption('password'), 'password');
zYne's avatar
zYne committed
375

376

zYne's avatar
zYne committed
377
        $this->conn = Doctrine_Connection::getConnection('sqlite::memory:');
zYne's avatar
zYne committed
378

zYne's avatar
zYne committed
379 380 381
        $this->assertEqual($this->conn->getOption('dsn'), 'sqlite::memory:');
        $this->assertEqual($this->conn->getOption('username'), false);
        $this->assertEqual($this->conn->getOption('password'), false);
zYne's avatar
zYne committed
382
    }
zYne's avatar
zYne committed
383 384
    public function testDriverName()
    {
zYne's avatar
zYne committed
385 386 387

    }

zYne's avatar
zYne committed
388 389
    public function testGetConnectionWithPearLikeDSN()
    {
zYne's avatar
zYne committed
390 391 392 393
        $this->conn = Doctrine_Connection::getConnection('mysql://zYne:password@localhost/test');
        $this->assertEqual($this->conn->getOption('dsn'), 'mysql:host=localhost;dbname=test');
        $this->assertEqual($this->conn->getOption('username'), 'zYne');
        $this->assertEqual($this->conn->getOption('password'), 'password');
394

zYne's avatar
zYne committed
395

zYne's avatar
zYne committed
396
        $this->conn = Doctrine_Connection::getConnection('sqlite://:memory:');
zYne's avatar
zYne committed
397

zYne's avatar
zYne committed
398 399 400
        $this->assertEqual($this->conn->getOption('dsn'), 'sqlite::memory:');
        $this->assertEqual($this->conn->getOption('username'), false);
        $this->assertEqual($this->conn->getOption('password'), false);
401
    }
zYne's avatar
zYne committed
402 403
    */
}   
zYne's avatar
zYne committed
404

zYne's avatar
zYne committed
405 406 407 408 409 410 411 412 413 414 415 416
class Doctrine_Connection_TestLogger implements Doctrine_Overloadable {
    private $messages = array();
    
    public function __call($m, $a) {
        $this->messages[] = $m;
    }
    public function pop() {
        return array_pop($this->messages);
    }
    public function getAll() {
        return $this->messages;
    }
417
}
zYne's avatar
zYne committed
418 419
class Doctrine_Connection_TestValidListener extends Doctrine_EventListener { }
class Doctrine_Connection_TestInvalidListener { }