| <?php | 
| /** | 
|  * PhpUnderControl_PhalApiDBNotORM_Test | 
|  * | 
|  * 针对 ../../PhalApi/DB/NotORM.php PhalApi_DB_NotORM 类的PHPUnit单元测试 | 
|  * | 
|  * @author: dogstar 20141122 | 
|  */ | 
|   | 
| require_once dirname(__FILE__) . '/../test_env.php'; | 
|   | 
| if (!class_exists('PhalApi_DB_NotORM')) { | 
|     require dirname(__FILE__) . '/../../PhalApi/DB/NotORM.php'; | 
| } | 
|   | 
| $_GET['__sql__'] = 1; | 
|   | 
| class PhpUnderControl_PhalApiDBNotORM_Test extends PHPUnit_Framework_TestCase | 
| { | 
|     public $notorm; | 
|   | 
|     protected function setUp() | 
|     { | 
|         parent::setUp(); | 
|   | 
|         $this->notorm = new PhalApi_DB_NotORM(DI()->config->get('dbs')/** , true **/); | 
|     } | 
|   | 
|     protected function tearDown() | 
|     { | 
|     } | 
|   | 
|     /** | 
|      * @dataProvider provideTable | 
|      */ | 
|     public function testHere($table) | 
|     { | 
|         $demo = $this->notorm->$table; | 
|         $this->assertNotNull($demo); | 
|         //var_dump($demo); | 
|   | 
|         $rs = $demo->fetchAll(); | 
|         //var_dump($rs); | 
|         $this->assertNotEmpty($rs); | 
|     } | 
|   | 
|     public function provideTable() | 
|     { | 
|         return array( | 
|             array('demo'), | 
|             array('demo_0'), | 
|             array('demo_1'), | 
|             array('demo_3'), | 
|         ); | 
|     } | 
|   | 
|     /** | 
|      * @expectedException PhalApi_Exception | 
|      */ | 
|     public function testNoMap() | 
|     { | 
|         $notorm = new PhalApi_DB_NotORM(array()); | 
|         $rs = $notorm->demo->fetchAll(); | 
|     } | 
|   | 
|     public function testNoDbRouter() | 
|     { | 
|         $rs = $this->notorm->demo->fetchAll(); | 
|         $this->assertNotEmpty($rs); | 
|     } | 
|   | 
|     public function testUseDefaultDbKey() | 
|     { | 
|         $rs = $this->notorm->demo_10->fetchAll(); | 
|         $this->assertNotEmpty($rs); | 
|     } | 
|   | 
|     public function testMultiSet() | 
|     { | 
|         $this->notorm->debug = true; | 
|         $this->notorm->debug = false; | 
|     } | 
|   | 
|     public function testTransactionCommit() | 
|     { | 
|         //Step 1: 开启事务 | 
|         $this->notorm->beginTransaction('DB_A'); | 
|   | 
|         //Step 2: 数据库操作 | 
|         $this->notorm->demo->insert(array('name' => 'commit at ' . $_SERVER['REQUEST_TIME'])); | 
|         $this->notorm->demo->insert(array('name' => 'commit again at ' . $_SERVER['REQUEST_TIME'])); | 
|   | 
|         //Step 3: 提交事务 | 
|         $this->notorm->commit('DB_A'); | 
|   | 
|     } | 
|   | 
|     public function testTransactionRollback() | 
|     { | 
|         //Step 1: 开启事务 | 
|         $this->notorm->beginTransaction('DB_A'); | 
|   | 
|         //Step 2: 数据库操作 | 
|         $this->notorm->demo->insert(array('name' => 'test rollback')); | 
|   | 
|         //Step 3: 回滚事务 | 
|         $this->notorm->rollback('DB_A'); | 
|   | 
|         $rs = $this->notorm->demo->where('name', 'test rollback')->fetchRow(); | 
|         $this->assertEmpty($rs); | 
|     } | 
|   | 
|     /** | 
|      * @expectedException PhalApi_Exception_InternalServerError | 
|      */ | 
|     public function testTransactionException() | 
|     { | 
|         $this->notorm->beginTransaction('NO_THIS_DB'); | 
|     } | 
|   | 
|     public function testFetchPairs() | 
|     { | 
|   | 
|         $rs = $this->notorm->demo->limit(3)->fetchPairs('id', 'name'); | 
|         //var_dump($rs); | 
|         foreach ($rs as $key => $row) { | 
|             $this->assertTrue(is_string($row)); | 
|         } | 
|   | 
|         $rs = $this->notorm->demo->select('name')->limit(3)->fetchPairs('id'); | 
|         //var_dump($rs); | 
|         foreach ($rs as $key => $row) { | 
|             $this->assertTrue(is_array($row)); | 
|             $this->assertArrayHasKey('name', $row); | 
|         } | 
|     } | 
|   | 
|     public function testAllAggreation() | 
|     { | 
|         $rs = $this->notorm->demo->where('id > 10')->count('id'); | 
|         //var_dump($rs); | 
|         $this->assertTrue(is_numeric($rs)); | 
|   | 
|         $rs = $this->notorm->demo->where('id > 10')->min('id'); | 
|         $this->assertTrue(is_numeric($rs)); | 
|   | 
|         $rs = $this->notorm->demo->where('id > 10')->max('id'); | 
|         //var_dump($rs); | 
|         $this->assertTrue(is_numeric($rs)); | 
|   | 
|         $rs = $this->notorm->demo->where('id > 10')->sum('id'); | 
|         //var_dump($rs); | 
|         $this->assertTrue(is_numeric($rs)); | 
|     } | 
|   | 
|     public function testLimit() | 
|     { | 
|         $rs1 = $this->notorm->demo->limit(1, 2)->fetchAll(); | 
|         $rs2 = $this->notorm->demo->limit('1', 2)->fetchAll(); | 
|         $rs3 = $this->notorm->demo->limit(1, '2')->fetchAll(); | 
|         $rs4 = $this->notorm->demo->limit('1', '2')->fetchAll(); | 
|         //var_dump($rs1); | 
|   | 
|         $this->assertEquals($rs1, $rs2); | 
|         $this->assertEquals($rs2, $rs3); | 
|         $this->assertEquals($rs3, $rs4); | 
|     } | 
|   | 
|     public function testLimitInQueryRows() | 
|     { | 
|         //int | 
|         $sql = 'SELECT * FROM tbl_demo LIMIT :start, :len'; | 
|         $params = array(':start' => 1, ':len' => 2); | 
|         $rows = $this->notorm->demo->queryRows($sql, $params); | 
|         //var_dump($rows); | 
|         $this->assertNotEmpty($rows); | 
|   | 
|         //not support yet | 
|         return; | 
|   | 
|         //string | 
|         $params = array(':start' => '1', ':len' => '2'); | 
|         $rows = $this->notorm->demo->queryRows($sql, $params); | 
|         //var_dump($rows); | 
|   | 
|         //int and string | 
|         $params = array(':start' => '1', ':len' => 2); | 
|         $rows = $this->notorm->demo->queryRows($sql, $params); | 
|         //var_dump($rows); | 
|     } | 
|   | 
|     public function testHereAgain() | 
|     { | 
|         $rs = $this->notorm->demo->select('name')->where('id', 1)->fetchRows(); | 
|         $this->assertNotEmpty($rs); | 
|   | 
|         $rs = $this->notorm->demo->select('name')->where('id = ?', 1)->fetchRows(); | 
|         $this->assertNotEmpty($rs); | 
|     } | 
|   | 
|     public function testQueryRowsWithBoundValuesAndInputOnly() | 
|     { | 
|         $sql = 'SELECT * FROM tbl_demo WHERE id = ? OR id = ?'; | 
|         $params = array(1, 2); | 
|         $rows1 = $this->notorm->demo->queryRows($sql, $params); | 
|         //var_dump($rows1); | 
|   | 
|         $sql = 'SELECT * FROM tbl_demo WHERE id = :id1 OR id = :id2'; | 
|         $params = array(':id2' => 2, ':id1' => 1); | 
|         $rows2 = $this->notorm->demo->queryRows($sql, $params); | 
|   | 
|         $this->assertEquals($rows1, $rows2); | 
|   | 
|         //兼容不连续的下标 | 
|         $sql = 'SELECT * FROM tbl_demo WHERE id = ? OR id = ?'; | 
|         $params = array(5 => 1, 9 => 2); | 
|         $rows3 = $this->notorm->demo->queryRows($sql, $params); | 
|         $this->assertEquals($rows1, $rows3); | 
|   | 
|         //should not use in this way | 
|         $sql = 'SELECT * FROM tbl_demo WHERE id = ? OR id = :id'; | 
|         $params = array(1, ':id' => 2); | 
|         //$rows = $this->notorm->demo->queryRows($sql, $params); | 
|     } | 
|   | 
|     public function testParametersMixed() | 
|     { | 
|         $sql = "SELECT * FROM tbl_user WHERE name LIKE ? AND create_date >= '2015-10-1 10:00:00' AND create_date < '2015-12-31 10:00:00'"; | 
|         $params = array('%a%'); | 
|         $rows = $this->notorm->demo->queryRows($sql, $params); | 
|         $this->assertNotEmpty($rows); | 
|     } | 
|   | 
|     public function testNoKeyIndexAgain() | 
|     { | 
|         $notorm = new PhalApi_DB_NotORM(DI()->config->get('dbs')/** , true **/); | 
|         $rs = $notorm->demo->order('id DESC')->limit(1, 2)->fetchAll(); | 
|         //var_dump($rs); | 
|         //echo (json_encode($rs)), "\n\n"; | 
|         $keys = array_keys($rs); | 
|         $this->assertEquals(0, $keys[0]); | 
|   | 
|         $notorm = new PhalApi_DB_NotORM(DI()->config->get('dbs')/** , true **/); | 
|         $notorm->keepPrimaryKeyIndex(); | 
|         $rs = $notorm->demo->order('id DESC')->limit(1, 2)->fetchAll(); | 
|         //var_dump($rs); | 
|         //echo (json_encode($rs)), "\n\n"; | 
|         $keys = array_keys($keys); | 
|         $this->assertGreaterThan($keys[0], $keys[1]); | 
|         $this->assertEquals(0, $keys[0]); | 
|         $this->assertEquals(1, $keys[1]); | 
|     } | 
|   | 
|     public function testInsertMulti() | 
|     { | 
|         $rows = array( | 
|             array('name' => 'A君', 'age' => 12, 'note' => 'AA'), | 
|             array('name' => 'B君', 'age' => 14, 'note' => 'BB'), | 
|             array('name' => 'C君', 'age' => 16, 'note' => 'CC'), | 
|         ); | 
|         $rs = $this->notorm->user->insert_multi($rows); | 
|     } | 
|   | 
|     public function testFetchNothing() | 
|     { | 
|         $rs = $this->notorm->user->where('id', 4040404)->fetch(); | 
|         $this->assertFalse($rs); | 
|   | 
|         $rs = $this->notorm->user->where('id', 4040404)->fetchOne(); | 
|         $this->assertFalse($rs); | 
|   | 
|         $rs = $this->notorm->user->where('id', 4040404)->fetchAll(); | 
|         $this->assertEquals(array(), $rs); | 
|     } | 
|   | 
|     public function testDisConnect() | 
|     { | 
|         // first, none to disconnect | 
|         $this->notorm->disconnect(); | 
|   | 
|         // second, disconnect after some query | 
|         $rs = $this->notorm->user->where('id', 4040404)->fetch(); | 
|         $this->notorm->disconnect(); | 
|   | 
|         // again | 
|         $rs = $this->notorm->user->where('id', 4040404)->fetch(); | 
|         $this->notorm->disconnect(); | 
|   | 
|         $this->notorm->disconnect(); | 
|     } | 
| } |