PHP Code:
<?php
require_once('../Dev/dev_funcs.php');
require_once('../Dev/PDOBench.php');
ra('../ORM/Interfaces/');
ra('../ORM/');
ra('../Objects/');
require('simpletest/unit_tester.php');
require('simpletest/reporter.php');
require('simpletest/reporter_showpasses.php');
/**
* Host, Username, Password and Database for tests:
*/
define('DBHOST','localhost');
define('DBUSER','secret <_<');
define('DBPASS','secret >_>');
define('DBNAME','development');
/* NOTICE: These tests will drop/create the tables named
"Groups_test","Persons_test","Memeberships_test", "Posts_test",
"Log_test", "Locks_test" and "Presentations_test" on the
database the tests are pointed at - these tests should
NOT be run on anything else then a database used for
testing purposes. If you don't know what something of the above
means - don't run the tests
NOTICE: These test will only work on a mysql database.
To get the tests to run, define RUN_TESTS to true
*/
define('RUN_TESTS',true);
if(RUN_TESTS === true){
abstract class ORMBaseTest extends UnitTestCase{
function ORMBaseTest(){
// This is used in setUp() and tearDown()
$this->pdo = new PDO("mysql:host=" . DBHOST . ";dbname=" . DBNAME, DBUSER, DBPASS);
// This is used by the session
$this->pdoBench = new PDOBench("mysql:host=" . DBHOST . ";dbname=" . DBNAME, DBUSER, DBPASS);
// Session::__construct(PDO $pdo, $mapperPath, $classPath, $sqlEscapeChar = '`');
$this->session = new Session($this->pdoBench, '../Mappers/', '../Classes/', '`');
}
function setUp(){
$table = array();
$table[] = 'CREATE TABLE `Groups_test` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(50) NOT NULL,
`comment` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1';
$table[] = 'CREATE TABLE `Locks_test` (
`owner` varchar(32) NOT NULL,
`type` varchar(25) NOT NULL,
`key` varchar(255) NOT NULL,
`lock` tinyint(1) NOT NULL,
PRIMARY KEY (`owner`,`type`,`key`,`lock`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1';
$table[] = 'CREATE TABLE `Log_test` (
`id` int(11) NOT NULL auto_increment,
`time` int(11) NOT NULL,
`ip` varchar(15) NOT NULL,
`uri` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1';
$table[] = 'CREATE TABLE `Memberships_test` (
`person` int(11) NOT NULL,
`group` int(11) NOT NULL,
PRIMARY KEY (`person`,`group`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1';
$table[] = 'CREATE TABLE `Persons_test` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(50) NOT NULL,
`email` varchar(50) NOT NULL,
`parent` int(11) NOT NULL,
`savings` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`),
UNIQUE KEY `name_2` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1';
$table[] = 'CREATE TABLE `Posts_test` (
`id` int(11) NOT NULL auto_increment,
`subject` varchar(50) NOT NULL,
`author` int(11) NOT NULL,
`text` text NOT NULL,
`date` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1';
$table[] = 'CREATE TABLE `Presentations_test` (
`owner` int(11) NOT NULL,
`text` text NOT NULL,
PRIMARY KEY (`owner`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1';
$data = array();
$data[] = "INSERT INTO `Groups_test` VALUES (1, 'BOFH', '******* Operators From Hell');";
$data[] = "INSERT INTO `Groups_test` VALUES (2, 'Users', 'BOFH victims...');";
$data[] = "INSERT INTO `Log_test` VALUES (1, 21525134, '127.0.0.1', 'http://www.mirkk.nu/index.php');";
$data[] = "INSERT INTO `Log_test` VALUES (2, 215125123, '192.168.0.1', 'http://www.mirkk.nu/xxx');";
$data[] = "INSERT INTO `Memberships_test` VALUES (1, 1);";
$data[] = "INSERT INTO `Memberships_test` VALUES (2, 2);";
$data[] = "INSERT INTO `Memberships_test` VALUES (3, 2);";
$data[] = "INSERT INTO `Persons_test` VALUES (1, 'Fredrik', 'thrthr@gmail.com', 2, 20000);";
$data[] = "INSERT INTO `Persons_test` VALUES (2, 'Madeleine', 'censored@unkown.host', 3, 2000);";
$data[] = "INSERT INTO `Persons_test` VALUES (3, 'Lillis', 'not_know@no.host', 1, 100);";
$data[] = "INSERT INTO `Posts_test` VALUES (1, 'First post!!', 1, 'Yay, first post!', 1253623);";
$data[] = "INSERT INTO `Posts_test` VALUES (2, 'How about this?', 3, 'This is my first post /cheer!', 0);";
$data[] = "INSERT INTO `Presentations_test` VALUES (1, 'This is fredriks presentation, have a beer and take a seat ;).');";
$data[] = "INSERT INTO `Presentations_test` VALUES (2, 'And here''s madeleins, cheers ;)');";
foreach($table as $t) $this->pdo->query($t);
foreach($data as $d) $this->pdo->query($d);
}
public function tearDown(){
$this->pdo->query('DROP TABLE `Groups_test`, `Memberships_test`, `Persons_test`, `Posts_test`, `Log_test`, `Presentations_test`, `Locks_test`');
}
}
class TestObjectRelationalMapping extends ORMBaseTest{
function testFindBySql(){
list($fredrik) = $this->session->person->findBySql('select Person.* from Person where id = ?', array(1));
$this->assertIsA($fredrik, "Person");
}
function testFindByFields(){
list($fredrik) = $this->session->person->findByFields(array('id' => 1));
$this->assertIsA($fredrik, "Person");
}
function testFindByPk(){
list($fredrik) = $this->session->person->findByPk(1);
$this->assertIsA($fredrik, "Person");
}
function testFindByStmt(){
$stmt = $this->pdoBench->prepare("select Persons_test.* from Persons_test where id = ?");
list($fredrik) = $this->session->person->findByStmt($stmt, array(1));
$this->assertIsA($fredrik, "Person");
}
function testObjectsAreUnique(){
list($fredrik1) = $this->session->person->findByPk(1);
list($fredrik2) = $this->session->person->findByPk(1);
$this->assertEqual(strval($fredrik1), strval($fredrik2));
}
function testFindMultipleBySql(){
$persons = $this->session->person->findBySql("select Person.* from Person where name like '%i%'");
$this->assertEqual(count($persons), 3);
foreach($persons as $person)
$this->assertIsA($person, "Person");
}
function testValueObjects(){
list($madeleine) = $this->session->person->findBySql("select Person.* from Person where name = ?", array('Madeleine') );
$this->assertIsA($madeleine->savings, "Money");
$this->assertIsA($madeleine->savings, "ValueObject");
}
function testHasOneRelationship(){
list($fredrik) = $this->session->person->findByPk(1);
$this->assertIsA($fredrik->pres, "Presentation");
}
function testBelongsToRelationship(){
list($pres) = $this->session->presentation->findBySql('select Presentation.* from Presentation where owner = ?', array(1));
$this->assertIsA($pres, 'Presentation');
$this->assertIsA($pres->owner, "Person");
}
function testHasManyRelationship(){
list($fredrik) = $this->session->person->findByPk(1);
$this->assertIsA($fredrik->posts, 'DomainCollection');
foreach($fredrik->posts as $post)
$this->assertIsA($post, 'Post');
}
function testManyToManyNamedWithIntermediateRelationship(){
list($fredrik) = $this->session->person->findByPk(1);
$this->assertIsA($fredrik->memberships, 'DomainCollection');
foreach($fredrik->memberships as $membership){
$this->assertIsA($membership, 'Membership');
$this->assertIsA($membership->group, "Group");
}
}
function testCreateInCollection(){
list($fredrik1) = $this->session->person->findByPk(1);
for($i = 0;$i < 30; $i++){
$post = $fredrik1->posts->create();
$post->text = "text...";
$post->subject = "subject...";
$post->date = time();
}
$this->session->getActiveTransaction()->commit();
$newSession = new Session($this->pdoBench, '', '');
list($fredrik2) = $newSession->person->findByPk(1);
$this->assertNotEqual(strval($fredrik1), strval($fredrik2));
$this->assertEqual($fredrik2->posts->count(),31);
}
function testUpdatesAreSaved(){
list($fredrik) = $this->session->person->findByPk(1);
$newSession = new Session($this->pdoBench, '', '');
$fredrik->email = "mynew@email.com";
$this->session->getActiveTransaction()->registerDirty($fredrik);
$this->session->getActiveTransaction()->commit();
list($fredrik2) = $newSession->person->findByPk(1);
$this->assertNotEqual(strval($fredrik), strval($fredrik2));
$this->assertEqual($fredrik2->email, 'mynew@email.com');
$this->assertEqual($fredrik2->email, $fredrik->email);
}
function testMultipleTransactionsAreSeparate(){
list($fredrik) = $this->session->person->findByPk(1);
$fredrik->name = "thr";
$this->session->getActiveTransaction()->registerDirty($fredrik);
list($madeleine) = $this->session->person->findByPk(2);
$madeleine->name = "maddis";
$this->session->setActiveTransaction($this->session->createTransaction('second'));
$this->session->getActiveTransaction()->registerDirty($madeleine);
// Commit first transaction
$this->session->getTransactionByName('default')->commit();
// Get a new session
$newSession = new Session($this->pdoBench, '', '');
list($fredrik2) = $newSession->person->findByPk(1);
list($madeleine2) = $newSession->person->findByPk(2);
$this->assertEqual($fredrik2->name, $fredrik->name);
// Should not be equal cos 2nd transaction is not commited
$this->assertNotEqual($madeleine2->name, $madeleine->name);
}
function testSimpleObjectWithoutMapperLog(){
list($log1, $log2) = $this->session->log_test->findByFields();
$this->assertIsA($log1, "Log_test");
$this->assertIsA($log2, "Log_test");
}
function testDisplayQueries(){
echo "<br> PDO Queries/Prepared Statements: " . $this->pdoBench->queryAmount() . "<br /><br />";
}
}
class TestPessimisticLockingSeperateFromSession extends ORMBaseTest{
function setUp(){
parent::setUp();
if(!isset($this->lm1) || !isset($this->lm2)){
// trick that gives you two unique sess ids and two different lockers
session_id(md5((string)microtime())); session_start();
// PessimisticLockManager::__construct(Session $session, PDOProxy $pdo, $lockTable);
$this->lm1 = new PessimisticLockManager($this->session, new PDOProxy($this->pdoBench, '`'), 'Locks_test');
session_destroy(); session_id(md5((string)microtime())); session_start();
$this->lm2 = new PessimisticLockManager($this->session, new PDOProxy($this->pdoBench, '`'), 'Locks_test');
session_destroy();
}
}
function testReadLock(){
list($fredrik) = $this->session->person->findByPk(1);
$this->assertTrue($this->lm1->readLock($fredrik));
}
function testWriteLock(){
list($fredrik) = $this->session->person->findByPk(1);
$this->assertTrue($this->lm1->writeLock($fredrik));
}
function testCheckReadLock(){
list($fredrik) = $this->session->person->findByPk(1);
$this->lm1->readLock($fredrik);
$this->assertTrue($this->lm1->checkReadLock($fredrik));
}
function testCheckWriteLock(){
list($fredrik) = $this->session->person->findByPk(1);
$this->lm1->writeLock($fredrik);
$this->assertTrue($this->lm1->checkWriteLock($fredrik));
}
function testMultipleReadsAreOk(){
list($fredrik) = $this->session->person->findByPk(1);
$this->assertTrue($this->lm1->readLock($fredrik));
$this->assertTrue($this->lm2->readLock($fredrik));
}
function testMultipleWritesAreNotOk(){
list($fredrik) = $this->session->person->findByPk(1);
$this->assertTrue($this->lm1->writeLock($fredrik));
$this->assertFalse($this->lm2->writeLock($fredrik));
}
function testCantLockWriteWhenReadIsActive(){
list($fredrik) = $this->session->person->findByPk(1);
$this->assertTrue($this->lm1->readLock($fredrik));
$this->assertFalse($this->lm2->writeLock($fredrik));
}
function testCantLockReadWhenWriteIsActive(){
list($fredrik) = $this->session->person->findByPk(1);
$this->assertTrue($this->lm1->writeLock($fredrik));
$this->assertTrue($this->lm1->checkWriteLock($fredrik));
$this->assertFalse($this->lm2->readLock($fredrik));
$this->assertFalse($this->lm2->checkReadLock($fredrik));
}
function testWriteLockAlsoMakesReadLockReturnTrue(){
list($fredrik) = $this->session->person->findByPk(1);
$this->assertTrue($this->lm1->writeLock($fredrik));
$this->assertTrue($this->lm1->checkWriteLock($fredrik));
$this->assertTrue($this->lm1->checkReadLock($fredrik));
}
function testReadLockMakesWriteLockReturnFalse(){
list($fredrik) = $this->session->person->findByPk(1);
$this->assertTrue($this->lm1->readLock($fredrik));
$this->assertTrue($this->lm1->checkReadLock($fredrik));
$this->assertFalse($this->lm1->checkWriteLock($fredrik));
}
function testCanLockDifferentObjects(){
list($madeleine, $fredrik, $lillis) = $this->session->person->findByFields();
$this->assertTrue($this->lm1->readLock($madeleine));
$this->assertTrue($this->lm1->readLock($fredrik));
$this->assertTrue($this->lm2->writeLock($lillis));
}
function testComplexLocking(){
list($madeleine, $fredrik, $lillis) = $this->session->person->findByFields();
$this->assertTrue($this->lm1->readLock($madeleine)); // ok non has locked madeleine
$this->assertTrue($this->lm1->readLock($fredrik)); // ok none has locked fredrik
$this->assertTrue($this->lm2->writeLock($lillis)); // ok, none has locked lillis
$this->assertTrue($this->lm1->writeLock($madeleine)); // ok, you have readlock on madeleine
$this->assertTrue($this->lm2->readLock($fredrik)); // ok, lm1 only has readlock on fredrik
$this->assertFalse($this->lm1->writeLock($lillis)); // false, lm2 has writelock on lillis
$this->assertFalse($this->lm2->writeLock($fredrik)); // false, lm1 has readlock on fredrik
$this->assertFalse($this->lm1->writeLock($fredrik)); // false lm2 has readlock on fredrik
$this->assertFalse($this->lm2->readLock($madeleine)); // false lm1 has writelock on madeleine
}
function testDisplayQueries(){
echo "<br> PDO Queries/Prepared Statements: " . $this->pdoBench->queryAmount() . "<br /><br />";
}
}
class TestLockingManagerFromSession extends ORMBaseTest{
/**
* No tests written
*/
}
class TestImplicitPessimisticLockingMapper extends ORMBaseTest{
/**
* Tests not written yet,
*/
}
ob_start();
$tests = new GroupTest('Object Relational Mapping Test Suit');
$tests->addTestCase(new TestObjectRelationalMapping());
$tests->addTestCase(new TestPessimisticLockingSeperateFromSession());
$tests->addTestCase(new TestLockingManagerFromSession());
$tests->addTestCase(new TestImplicitPessimisticLockingMapper());
$tests->run(new ShowPasses());
ob_end_flush();
}
?>
Bookmarks