<?php 
namespace Model; 
 
class DBObjectTest extends \PHPUnit_Framework_TestCase { 
    protected $db; 
    /** 
     * Do some jiggery to the config 
     *  
     * @return null 
     */ 
    protected function setUp() { 
        $settings=array(); 
        $settings['database'] = array(); 
        $settings['database']['user'] = 'jenkins'; 
        $settings['database']['passwd'] = 'jenkinspasswd123='; 
        $settings['database']['server'] = 'localhost'; 
        $settings['database']['port'] = '3306'; 
        $settings['database']['db'] = 'jenkins'; 
        \Core\Router::$settings = $settings; 
         
 
        $this->db = new \Library\Database\LinqDB( 
            $settings['database']['server'],  
            $settings['database']['user'],  
            $settings['database']['passwd'],  
            $settings['database']['db'],  
            $settings['database']['port'] 
        ); 
        $query = <<<EOF
 
CREATE TABLE `user` (
 
    id int(11) NOT NULL auto_increment,
 
    name varchar(255) NOT NULL,
 
    date int(11) NOT NULL,
 
    PRIMARY KEY (`id`)
 
); 
EOF; 
        $this->db->query($query); 
        $query = <<<EOF
 
CREATE TABLE `login` (
 
    id int(11) NOT NULL auto_increment,
 
    ip varchar(255) NOT NULL,
 
    date int(11) NOT NULL,
 
    user int(11) NOT NULL,
 
    PRIMARY KEY (`id`),
 
    FOREIGN KEY (`user`) REFERENCES `user`(`id`)
 
);
 
EOF; 
        $this->db->query($query); 
    } 
     
    /** 
     * Tests creation logic 
     *  
     * @return null 
     */ 
    public function testTableCreate() { 
         $q = $this->db->query("SHOW COLUMNS IN `user`"); 
        $this->assertEquals(3, $q->num_rows); 
    } 
     
    /** 
     * Test Code Generation Logic 
     *  
     * @depends testTableCreate 
     *  
     * @return null 
     */ 
    public function testGeneration() { 
        $this->testTableCreate(); 
        include __DIR__."/../build/generation/models.php"; 
        $this->assertTrue(class_exists("\Model\User"), "User model created"); 
        $this->assertTrue(class_exists("\Model\Login"), "Login model created"); 
    } 
     
    /**
 
     * Test Creation Logic
 
     * 
     * @covers System\Model\DBObject::Create 
     * 
 
     * @depends testGeneration 
     * 
 
     * @return null
 
     */ 
    public function testCreate() { 
        $this->testGeneration(); 
        $this->user = \Model\User::Create(array("id"=>1, "name"=>"Joe Bloggs", "date"=>time())); 
        $this->login = \Model\Login::Create(array("ip"=>"127.0.0.1", "date"=>time(), "user"=>1)); 
        $this->loginB = \Model\Login::Create(array("ip"=>"127.0.0.1", "date"=>time(), "user"=>1)); 
        $this->assertInstanceOf("\Model\User", $this->user, "User created"); 
        $this->assertInstanceOf("\Model\Login", $this->login, "Login Created"); 
        $this->assertInstanceOf("\Model\Login", $this->loginB, "Login Created"); 
    } 
     
    /** 
     * Tests that foreign keys between tables work properly 
     *  
     * @depends testCreate 
     *  
     * @return null 
     */ 
    public function testForeignKeys() { 
        $this->testCreate(); 
        $this->user = new \Model\User(1); 
        $this->assertTrue(is_array($this->user->getLogins()), "Get logins"); 
        $this->assertEquals(2, count($this->logins = $this->user->getLogins()), "Count logins"); 
        $this->login = $this->logins[0]; 
        $this->assertInstanceOf("\Model\User", $this->login->getUser(), "User returned"); 
         
    } 
     
    /**
 
     * Tests that foreign keys between tables work properly
 
     *
 
     * @depends testCreate
 
     *
 
     * @return null
 
     */ 
    public function testLinqFramework() { 
        $this->testCreate(); 
        $userQuery = $this->db->Select("\Model\User"); 
        $loginQuery = $this->db->Select("\Model\Login"); 
        $loginQuery->addCount("num_logins"); 
        $userQuery->addField("id"); 
        $userQuery->addField("name", "person_name"); 
        $eq = $this->db->getAndFilter(); 
        $eq->eq("id", 1); 
        $userQuery->setFilter($eq); 
        $userQuery->setGroup("id"); 
        $userQuery->setLimit(0, 10); 
        $loginQuery->joinLeft("user", $userQuery, "id"); 
        $this->assertEquals("SELECT COUNT(*) AS `num_logins`,  `user`.`id`, `user`.`name` AS `person_name` FROM `login` LEFT JOIN `user` ON `user`.`id`=`login`.`user` WHERE   (`user`.`id` = '1' ) ", $loginQuery->getSQL()); 
        $q = $loginQuery->Exec(); 
        $this->assertEquals(1, count($q)); 
        $this->assertEquals(array('num_logins'=>"2", 'id'=>"1", 'person_name'=>"Joe Bloggs"), $q[0]); 
    } 
     
    /** 
     * Tear down 
     * 
     * @return null 
     */ 
    protected function tearDown() { 
        $query = <<<EOF 
DROP TABLE `login`; 
EOF; 
        $this->db->query($query); 
        $query = <<<EOF 
DROP TABLE `user`; 
EOF; 
        $this->db->query($query); 
        if (file_exists(__DIR__."/../framework/application/model/Login.php")) { 
            unlink(__DIR__."/../framework/application/model/Login.php"); 
            unlink(__DIR__."/../framework/application/model/User.php"); 
            unlink(__DIR__."/../framework/system/model/Login.php"); 
            unlink(__DIR__."/../framework/system/model/User.php"); 
        } 
    } 
}
 
 |