// does not check whether callable - done in execute_method()
$API_METHODS[$method]["function"] = $function;
- if ($parameters != NULL && !is_array($parameters)) {
- throw new InvalidParameterException(sprintf(elgg_echo('InvalidParameterException:APIParametersNotArray'), $method));
+ if ($parameters != NULL) {
+ if (!is_array($parameters)) {
+ throw new InvalidParameterException(sprintf(elgg_echo('InvalidParameterException:APIParametersArrayStructure'), $method));
+ }
+
+ // catch common mistake of not setting up param array correctly
+ $first = current($parameters);
+ if (!is_array($first)) {
+ throw new InvalidParameterException(sprintf(elgg_echo('InvalidParameterException:APIParametersArrayStructure'), $method));
+ }
}
if ($parameters != NULL) {
case 'boolean':
// change word false to boolean false
if (strcasecmp(trim($parameters[$key]), "false") == 0) {
- $parameters[$key] = false;
+ $serialised_parameters .= ',false';
+ } else if ($parameters[$key] == 0) {
+ $serialised_parameters .= ',false';
+ } else {
+ $serialised_parameters .= ',true';
}
- $serialised_parameters .= "," . (bool)trim($parameters[$key]);
break;
case 'string':
$serialised_parameters .= ",'" . (string)mysql_real_escape_string(trim($parameters[$key])) . "'";
break;
case 'array':
// we can handle an array of strings, maybe ints, definitely not booleans or other arrays
- $array = "array(";
if (!is_array($parameters[$key]))
{
throw APIException(sprintf(elgg_echo('APIException:ParameterNotArray'), $key));
}
-
+
+ $array = "array(";
+
foreach ($parameters[$key] as $k => $v)
{
$k = sanitise_string($k);
$v = sanitise_string($v);
-
+
$array .= "'$k'=>'$v',";
}
\r
// expose_function\r
public function testExposeFunctionNoMethod() {\r
+ \r
$this->expectException('InvalidParameterException');\r
expose_function();\r
}\r
expose_function('test', 'test', 'BAD');\r
}\r
\r
+ public function testExposeFunctionParametersNotArray() {\r
+ $this->expectException('InvalidParameterException');\r
+ expose_function('test', 'test', array('param1' => 'string'));\r
+ }\r
+ \r
public function testExposeFunctionBadHttpMethod() {\r
$this->expectException('InvalidParameterException');\r
expose_function('test', 'test', null, '', 'BAD');\r
\r
// execute_method\r
public function testExecuteMethodNonCallable() {\r
+ expose_function('test', 'foo');\r
+ \r
+ $this->expectException('ApiException');\r
+ execute_method('test');\r
+ }\r
+\r
+ public function testExecuteMethodWrongMethod() {\r
$this->registerFunction();\r
\r
- $this->expectException('APIException');\r
+ // get when it should be a post\r
+ $this->expectException('CallException');\r
execute_method('test');\r
}\r
\r
\r
public function testserialise_parameters() {\r
\r
+ // int and bool\r
+ $this->registerFunction();\r
+ $parameters = array('param1' => 1, 'param2' => 0);\r
+ $s = serialise_parameters('test', $parameters);\r
+ $this->assertIdentical($s, ',1,false');\r
+ \r
+ // string\r
+ $this->registerFunction(false, false, array('param1' => array('type' => 'string')));\r
+ $parameters = array('param1' => 'testing');\r
+ $s = serialise_parameters('test', $parameters);\r
+ $this->assertIdentical($s, ",'testing'");\r
+\r
+ // float\r
+ $this->registerFunction(false, false, array('param1' => array('type' => 'float')));\r
+ $parameters = array('param1' => 2.5);\r
+ $s = serialise_parameters('test', $parameters);\r
+ $this->assertIdentical($s, ',2.5');\r
+\r
+ // indexed array of strings\r
+ $this->registerFunction(false, false, array('param1' => array('type' => 'array')));\r
+ $parameters = array('param1' => array('one', 'two'));\r
+ $s = serialise_parameters('test', $parameters);\r
+ $this->assertIdentical($s, "array('0'=>'one','1'=>'two')");\r
+\r
+ // associative array of strings\r
+ $this->registerFunction(false, false, array('param1' => array('type' => 'array')));\r
+ $parameters = array('param1' => array('first' => 'one', 'second' => 'two'));\r
+ $s = serialise_parameters('test', $parameters);\r
+ $this->assertIdentical($s, "array('first'=>'one','second'=>'two')");\r
+\r
+ // indexed array of strings\r
+ $this->registerFunction(false, false, array('param1' => array('type' => 'array')));\r
+ $parameters = array('param1' => array(1, 2));\r
+ $s = serialise_parameters('test', $parameters);\r
+ $this->assertIdentical($s, "array('0'=>'1','1'=>'2')");\r
+\r
+ // test unknown type\r
+ $this->registerFunction(false, false, array('param1' => array('type' => 'bad')));\r
+ $parameters = array('param1' => 'test');\r
+ $this->expectException('APIException');\r
+ $s = serialise_parameters('test', $parameters);\r
}\r
\r
- protected function registerFunction($api_auth = false, $user_auth = false) {\r
+ protected function registerFunction($api_auth = false, $user_auth = false, $params = null) {\r
$parameters = array('param1' => array('type' => 'int', 'required' => true),\r
'param2' => array('type' => 'bool', 'required' => false), );\r
+ \r
+ if ($params == null) {\r
+ $params = $parameters;\r
+ }\r
\r
- expose_function('test', 'foo', $parameters, '', 'GET', $api_auth, $user_auth);\r
+ expose_function('test', 'elgg_echo', $params, '', 'POST', $api_auth, $user_auth);\r
}\r
\r
}\r