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
        $this->assertEqual($listener2->pop(), 'postStmtExecute');
        $this->assertEqual($listener2->pop(), 'preStmtExecute');
    }

    public function testListeningErrorHandlingMethodsOnExec()
    {
186
        $this->conn->setAttribute(Doctrine::ATTR_THROW_EXCEPTIONS, false);
zYne's avatar
zYne committed
187 188 189 190 191 192 193 194 195 196 197
        $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()
    {
198
        $this->conn->setAttribute(Doctrine::ATTR_THROW_EXCEPTIONS, false);
zYne's avatar
zYne committed
199 200 201 202 203 204 205 206 207 208 209
        $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()
    {
210
        $this->conn->setAttribute(Doctrine::ATTR_THROW_EXCEPTIONS, false);
zYne's avatar
zYne committed
211 212 213 214 215 216 217 218 219 220 221 222
        $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()
    {
223
        $this->conn->setAttribute(Doctrine::ATTR_THROW_EXCEPTIONS, false);
zYne's avatar
zYne committed
224 225 226 227 228 229 230 231 232 233 234 235
        $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
    public function testInvalidDSN() 
    {
318
        $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
    public function testInvalidScheme() 
    {
340
        $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
    public function testInvalidHost() 
    {
350
        $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
    public function testInvalidDatabase() 
    {
360
        $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();
        }
    }
368

zYne's avatar
zYne committed
369 370 371
    /**
    public function testGetConnectionPdoLikeDSN()
    {
zYne's avatar
zYne committed
372 373 374 375
        $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
376

377

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

zYne's avatar
zYne committed
380 381 382
        $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
383
    }
zYne's avatar
zYne committed
384 385
    public function testDriverName()
    {
zYne's avatar
zYne committed
386 387 388

    }

zYne's avatar
zYne committed
389 390
    public function testGetConnectionWithPearLikeDSN()
    {
zYne's avatar
zYne committed
391 392 393 394
        $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');
395

zYne's avatar
zYne committed
396

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

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

zYne's avatar
zYne committed
406 407 408 409 410 411 412 413 414 415 416 417
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;
    }
418
}
zYne's avatar
zYne committed
419 420
class Doctrine_Connection_TestValidListener extends Doctrine_EventListener { }
class Doctrine_Connection_TestInvalidListener { }