| <?php | 
| /** | 
|  * PhpUnderControl_PhalApiRequestVar_Test | 
|  * | 
|  * 针对 ../../PhalApi/Request/Var.php PhalApi_Request_Var 类的PHPUnit单元测试 | 
|  * | 
|  * @author: dogstar 20141012 | 
|  */ | 
|   | 
| require_once dirname(__FILE__) . '/../test_env.php'; | 
|   | 
| if (!class_exists('PhalApi_Request_Var')) { | 
|     require dirname(__FILE__) . '/../../PhalApi/Request/Var.php'; | 
| } | 
|   | 
| class PhpUnderControl_PhalApiRequestVar_Test extends PHPUnit_Framework_TestCase | 
| { | 
|     public $coreRequestVar; | 
|   | 
|     protected function setUp() | 
|     { | 
|         parent::setUp(); | 
|   | 
|         $this->coreRequestVar = new PhalApi_Request_Var(); | 
|     } | 
|   | 
|     protected function tearDown() | 
|     { | 
|     } | 
|   | 
|   | 
|     /** | 
|      * @group testFormat | 
|      */ | 
|     public function testFormat() | 
|     { | 
|         $varName = 'testKey'; | 
|         $rule = array('type' => 'int', 'default' => '2014'); | 
|         $params = array(); | 
|   | 
|         $rs = PhalApi_Request_Var::format($varName, $rule, $params); | 
|   | 
|         $this->assertSame(2014, $rs); | 
|     } | 
|   | 
|     /** | 
|      * @group testFormatString | 
|      */ | 
|     public function testFormatString() | 
|     { | 
|         $rs = PhalApi_Request_Var::format( | 
|             'testKey', array('name' => 'testKey'), array('testKey' => 2014)); | 
|   | 
|         $this->assertSame('2014', $rs); | 
|     } | 
|   | 
|     /** | 
|      * @group testFormatStringMinMax | 
|      */ | 
|     public function testFormatStringMinMax() | 
|     { | 
|         $rs = PhalApi_Request_Var::format( | 
|             'testKey', array('name' => 'testKey', "max" => 9, 'min' => 9, "format" => 'utf8'), array('testKey' => 'PhalApi测试')); | 
|   | 
|         $this->assertSame('PhalApi测试', $rs); | 
|     } | 
|   | 
|   | 
|     /** | 
|      * @group testFormatStringMinMax | 
|      * @expectedException PhalApi_Exception_BadRequest | 
|      */ | 
|     public function testFormatStringExceptionMinMax() | 
|     { | 
|         $rs = PhalApi_Request_Var::format( | 
|             'testKey', array('name' => 'testKey', "max" => 8, 'min' => 8, "format" => 'utf8'), array('testKey' => 'PhalApi测试')); | 
|   | 
|     } | 
|   | 
|     /** | 
|      * @group testFormatString | 
|      * @expectedException PhalApi_Exception_InternalServerError | 
|      */ | 
|     public function testFormatStringWithRuleExceptionMinGtMax() | 
|     { | 
|         $rs = PhalApi_Request_Var::format( | 
|             'testKey', array('name' => 'testKey', 'min' => 9, 'max' => 5), array('testKey' => '2014')); | 
|     } | 
|   | 
|     /** | 
|      * @group testFormatString | 
|      * @expectedException PhalApi_Exception_BadRequest | 
|      */ | 
|     public function testFormatStringWithParamExceptionLtMin() | 
|     { | 
|         $rs = PhalApi_Request_Var::format( | 
|             'testKey', array('name' => 'testKey', 'min' => 8), array('testKey' => 2014)); | 
|     } | 
|   | 
|     /** | 
|      * @group testFormatString | 
|      * @expectedException PhalApi_Exception_BadRequest | 
|      */ | 
|     public function testFormatStringWithParamExceptionGtMax() | 
|     { | 
|         $value = '2014'; | 
|         $rule = array('name' => 'testKey', 'max' => 2, ); | 
|   | 
|         $rs = PhalApi_Request_Var::format( | 
|             'testKey', array('name' => 'testKey', 'max' => 2), array('testKey' => 2014)); | 
|     } | 
|   | 
|     /** | 
|      * @group testFormatInt | 
|      */ | 
|     public function testFormatInt() | 
|     { | 
|         $rs = PhalApi_Request_Var::format( | 
|             'testKey', array('name' => 'testKey', 'type' => 'int'), array('testKey' => 2014)); | 
|   | 
|         $this->assertSame(2014, $rs); | 
|     } | 
|   | 
|     /** | 
|      * @group testFormatFloat | 
|      */ | 
|     public function testFormatFloat() | 
|     { | 
|         $rs = PhalApi_Request_Var::format( | 
|             'testKey', array('name' => 'testKey', 'type' => 'float'), array('testKey' => '3.14')); | 
|   | 
|         $this->assertSame(3.14, $rs); | 
|     } | 
|   | 
|     /** | 
|      * @dataProvider provideDataForFormatBoolean | 
|      * @group testFormatBoolean | 
|      */ | 
|     public function testFormatBoolean($oriValue, $expValue) | 
|     { | 
|         $rs = PhalApi_Request_Var::format( | 
|             'testKey', array('name' => 'testKey', 'type' => 'boolean'), array('testKey' => $oriValue)); | 
|   | 
|         $this->assertSame($expValue, $rs); | 
|     } | 
|   | 
|     public function provideDataForFormatBoolean() | 
|     { | 
|         return array( | 
|             array('on', true), | 
|             array('yes', true), | 
|             array('true', true), | 
|             array('success', true), | 
|             array('false', false), | 
|             array('1', true), | 
|             ); | 
|     } | 
|   | 
|     /** | 
|      * @group testFormatDate | 
|      */ | 
|     public function testFormatDate() | 
|     { | 
|         $rs = PhalApi_Request_Var::format( | 
|             'testKey', array('name' => 'testKey', 'type' => 'date', 'format' => 'timestamp'), array('testKey' => '2014-10-01 12:00:00')); | 
|   | 
|         $this->assertTrue(is_numeric($rs)); | 
|         $this->assertSame(1412136000, $rs); | 
|     } | 
|   | 
|     /** | 
|      * @group testFormatDate | 
|      */ | 
|     public function testFormatDateIllegal() | 
|     { | 
|         $rs = PhalApi_Request_Var::format( | 
|             'testKey', array('name' => 'testKey', 'type' => 'date', 'format' => 'timestamp'), array('testKey' => '2014-99-99 XX:XX:XX')); | 
|         $this->assertEquals(0, $rs); | 
|     } | 
|   | 
|     /** | 
|      * @group testFormatDate | 
|      * @expectedException PhalApi_Exception_BadRequest | 
|      */ | 
|     public function testFormatDateRange() | 
|     { | 
|         $rs = PhalApi_Request_Var::format( | 
|             'testKey', array('name' => 'testKey', 'type' => 'date', 'format' => 'timestamp', 'max' => 100), array('testKey' => '2014-10-01 12:00:00')); | 
|     } | 
|   | 
|     /** | 
|      * @group testFormatArray | 
|      */ | 
|     public function testFormatArrayWithJson() | 
|     { | 
|         $arr = array('age' => 100, 'sex' => 'male'); | 
|   | 
|         $rs = PhalApi_Request_Var::format( | 
|             'testKey', | 
|             array('name' => 'testKey', 'type' => 'array', 'format' => 'json'), | 
|             array('testKey' => json_encode($arr)) | 
|         ); | 
|   | 
|         $this->assertSame($arr, $rs); | 
|     } | 
|   | 
|     public function testFormatArrayWithExplode() | 
|     { | 
|         $rs = PhalApi_Request_Var::format( | 
|             'testKey', | 
|             array('name' => 'testKey', 'type' => 'array', 'format' => 'explode', 'separator' => '|'), | 
|             array('testKey' => '1|2|3|4|5') | 
|         ); | 
|   | 
|         $this->assertEquals(array(1, 2, 3, 4, 5), $rs); | 
|     } | 
|   | 
|     public function testFormatArrayDefault() | 
|     { | 
|         $rs = PhalApi_Request_Var::format( | 
|             'testKey', | 
|             array('name' => 'testKey', 'type' => 'array'), | 
|             array('testKey' => 'phalapi') | 
|         ); | 
|   | 
|         $this->assertEquals(array('phalapi'), $rs); | 
|     } | 
|   | 
|     /** | 
|      * @expectedException PhalApi_Exception_BadRequest | 
|      */ | 
|     public function testFormatArrayRange() | 
|     { | 
|         $rs = PhalApi_Request_Var::format( | 
|             'testKey', | 
|             array('name' => 'testKey', 'type' => 'array', 'format' => 'explode', 'separator' => '|', 'max' => 3), | 
|             array('testKey' => '1|2|3|4|5') | 
|         ); | 
|     } | 
|   | 
|     /** | 
|      * @group testFile | 
|      */ | 
|     public function testFormatFile() | 
|     { | 
|         $_FILES['aFile'] = array('name' => 'aHa~', 'type' => 'image/jpeg', 'size' => 100, 'tmp_name' => '/tmp/123456', 'error' => 0); | 
|   | 
|         $rule = array('name' => 'aFile', 'range' => array('image/jpeg'), 'min' => 50, 'max' => 1024, 'require' => true, 'default' => array(), 'type' => 'file'); | 
|   | 
|         $rs = PhalApi_Request_Var::format('aFile', $rule, array()); | 
|   | 
|         $this->assertEquals($_FILES['aFile'], $rs); | 
|     } | 
|   | 
|     /** | 
|      * @group testFile | 
|      */ | 
|     public function testFormatFileInsensiveCase() | 
|     { | 
|         $_FILES['aFile'] = array('name' => 'aHa~', 'type' => 'image/jpeg', 'size' => 100, 'tmp_name' => '/tmp/123456', 'error' => 0); | 
|   | 
|         $rule = array('name' => 'aFile', 'range' => array('image/JPEG'), 'min' => 50, 'max' => 1024, 'require' => true, 'default' => array(), 'type' => 'file'); | 
|   | 
|         $rs = PhalApi_Request_Var::format('aFile', $rule, array()); | 
|   | 
|         $this->assertEquals($_FILES['aFile'], $rs); | 
|     } | 
|   | 
|     /** | 
|      * @group testFile | 
|      * @expectedException PhalApi_Exception_BadRequest | 
|      */ | 
|     public function testFormatFileButTooLarge() | 
|     { | 
|         $_FILES['aFile'] = array('name' => 'aHa~', 'type' => 'image/jpeg', 'size' => 9999, 'tmp_name' => '/tmp/123456', 'error' => 0); | 
|   | 
|         $rule = array('name' => 'aFile', 'range' => array('image/jpeg'), 'min' => 50, 'max' => 1024, 'require' => true, 'default' => array(), 'type' => 'file'); | 
|   | 
|         $rs = PhalApi_Request_Var::format('aFile', $rule, array()); | 
|     } | 
|   | 
|     /** | 
|      * @group testFile | 
|      * @expectedException PhalApi_Exception_BadRequest | 
|      */ | 
|     public function testFormatFileButWrongType() | 
|     { | 
|         $_FILES['aFile'] = array('name' => 'aHa~', 'type' => 'image/png', 'size' => 100, 'tmp_name' => '/tmp/123456', 'error' => 0); | 
|   | 
|         $rule = array('name' => 'aFile', 'range' => array('image/jpeg'), 'min' => 50, 'max' => 1024, 'require' => true, 'default' => array(), 'type' => 'file'); | 
|   | 
|         $rs = PhalApi_Request_Var::format('aFile', $rule, array()); | 
|     } | 
|   | 
|     /** | 
|      * @group testFile | 
|      * @expectedException PhalApi_Exception_BadRequest | 
|      */ | 
|     public function testFormatFileButError() | 
|     { | 
|         $_FILES['aFile'] = array('name' => 'aHa~', 'type' => 'image/png', 'size' => 100, 'tmp_name' => '/tmp/123456', 'error' => 2); | 
|   | 
|         $rule = array('name' => 'aFile', 'range' => array('image/jpeg'), 'min' => 50, 'max' => 1024, 'require' => true, 'default' => array(), 'type' => 'file'); | 
|   | 
|         $rs = PhalApi_Request_Var::format('aFile', $rule, array()); | 
|     } | 
|   | 
|     /** | 
|      * @group testFile | 
|      * @expectedException PhalApi_Exception_BadRequest | 
|      */ | 
|     public function testFormatFileEmptyButRequire() | 
|     { | 
|         $rule = array('name' => 'aFile', 'type' => 'file'); | 
|   | 
|         $rs = PhalApi_Request_Var::format('aFile', $rule, array()); | 
|         $this->assertEquals(NULL, $rs); | 
|     } | 
|   | 
|     /** | 
|      * $group testFile | 
|      */ | 
|     public function testFormatFileEmptyWithDefualt() | 
|     { | 
|         $default = array('name' => 'test.txt', 'type' => 'txt', 'tmp_name' => '/tmp/test.txt'); | 
|         $rule = array('name' => 'aFile', 'default' => $default, 'type' => 'file'); | 
|         $_FILES['aFile'] = null; | 
|   | 
|         $rs = PhalApi_Request_Var::format('aFile', $rule, array()); | 
|         $this->assertEquals($default, $rs); | 
|     } | 
|   | 
|     /** | 
|      * @group testFormatEnum | 
|      */ | 
|     public function testFormatEnum() | 
|     { | 
|         $rs = PhalApi_Request_Var::format( | 
|             'testKey', array('range' => array('ios', 'android'), 'type' => 'enum'), array('testKey' => 'ios')); | 
|   | 
|         $this->assertSame('ios', $rs); | 
|     } | 
|   | 
|     /** | 
|      * @group testFormatEnum | 
|      * @expectedException PhalApi_Exception_InternalServerError | 
|      */ | 
|     public function testFormatEnumWithRuleException() | 
|     { | 
|         $rs = PhalApi_Request_Var::format( | 
|             'testKey', array('type' => 'enum', 'name' => 'testKey'), array('testKey' => 'ios')); | 
|     } | 
|   | 
|     /** | 
|      * @group testFormatEnum | 
|      * @expectedException PhalApi_Exception_BadRequest | 
|      */ | 
|     public function testFormatEnumWithParamException() | 
|     { | 
|         $rs = PhalApi_Request_Var::format( | 
|             'testKey', array('type' => 'enum', 'name' => 'testKey', 'range' => array('ios', 'android')), array('testKey' => 'pc')); | 
|     } | 
|   | 
|     public function testFormatAllTypes() | 
|     { | 
|         $params = array( | 
|             'floatVal' => '1.0', | 
|             'booleanVal' => '1', | 
|             'dateVal' => '2015-02-05 00:00:00', | 
|             'arrayVal' => 'a,b,c', | 
|             'enumVal' => 'male', | 
|         ); | 
|   | 
|         $rule = array('name' => 'floatVal', 'type' => 'float'); | 
|         $rs = PhalApi_Request_Var::format('floatVal', $rule,  $params); | 
|         $this->assertSame(1.0, $rs); | 
|   | 
|         $rule = array('name' => 'booleanVal', 'type' => 'boolean'); | 
|         $rs = PhalApi_Request_Var::format('booleanVal', $rule,  $params); | 
|         $this->assertSame(true, $rs); | 
|   | 
|         $rule = array('name' => 'dateVal', 'type' => 'date', 'format' => 'timestamp'); | 
|         $rs = PhalApi_Request_Var::format('dateVal', $rule,  $params); | 
|         $this->assertSame( 1423065600, $rs); | 
|   | 
|         $rule = array('name' => 'arrayVal', 'type' => 'array', 'format' => 'explode'); | 
|         $rs = PhalApi_Request_Var::format('arrayVal', $rule,  $params); | 
|         $this->assertSame(array('a', 'b', 'c'), $rs); | 
|   | 
|         $rule = array('name' => 'enumVal', 'type' => 'enum', 'range' => array('female', 'male')); | 
|         $rs = PhalApi_Request_Var::format('enumVal', $rule,  $params); | 
|         $this->assertSame('male', $rs); | 
|   | 
|         $rule = array('name' => 'noThisKey'); | 
|         $rs = PhalApi_Request_Var::format('noThisKey', $rule,  $params); | 
|         $this->assertSame(null, $rs); | 
|   | 
|         $rule = array('name' => 'noThisKey', 'type' => 'noThisType'); | 
|         $rs = PhalApi_Request_Var::format('noThisKey', $rule,  $params); | 
|         $this->assertSame(null, $rs); | 
|   | 
|         $_FILES['aFile'] = array('name' => 'aHa~', 'type' => 'image/jpeg', 'size' => 100, 'tmp_name' => '/tmp/123456', 'error' => 0); | 
|         $rule = array('name' => 'aFile', 'range' => array('image/jpeg'), 'min' => 50, 'max' => 1024, 'require' => true, 'default' => array(), 'type' => 'file'); | 
|         $rs = PhalApi_Request_Var::format('aFile', $rule, $params); | 
|         $this->assertNotEmpty($rs); | 
|     } | 
|   | 
|     /** | 
|      * @expectedException PhalApi_Exception_InternalServerError | 
|      */ | 
|     public function testGetEnumWithEmptyRange() | 
|     { | 
|         PhalApi_Request_Var::format('key',  array('name' => 'key', 'type' => 'enum', 'range' => array()), array('key' => 'aHa~')); | 
|     } | 
|   | 
|     public function testStringWithRegxRight() | 
|     { | 
|         //very simple mobile phone | 
|         $rule = array('name' => 'key', 'type' => 'string', 'regex' => '/^[0-9]{11}/'); | 
|         PhalApi_Request_Var::format('testKey', $rule, array('testKey' => '13800138000')); | 
|     } | 
|   | 
|     /** | 
|      * @expectedException PhalApi_Exception_BadRequest | 
|      */ | 
|     public function testStringWithRegxWrong() | 
|     { | 
|         $rule = array('name' => 'key', 'type' => 'string', 'regex' => '/^[0-9]{11}/'); | 
|         PhalApi_Request_Var::format('key', $rule, array('key' => 'no a number')); | 
|     } | 
|   | 
|     public function testFormatCallable() | 
|     { | 
|         $rs = PhalApi_Request_Var::format( | 
|             'testKey', | 
|             array('name' => 'testKey', 'type' => 'callable', 'callback' => array('PhalApi_Request_Var_MyCallback', 'go')), | 
|             array('testKey' => 1) | 
|         ); | 
|   | 
|         $this->assertSame(2, $rs); | 
|     } | 
|   | 
|     /** | 
|      * @expectedException PhalApi_Exception_InternalServerError | 
|      */ | 
|     public function testFormatCallableButWroing() | 
|     { | 
|         $rs = PhalApi_Request_Var::format( | 
|             'testKey', | 
|             array('name' => 'testKey', 'type' => 'callable', 'callback' => 'xxx'), | 
|             array('testKey' => 1) | 
|         ); | 
|     } | 
| } | 
|   | 
| class PhalApi_Request_Var_MyCallback { | 
|   | 
|     public static function go($value, $rule) { | 
|         return $value + 1; | 
|     } | 
| } |