| 
<?phpnamespace 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");
 }
 }
 }
 |