diff --git a/config/modules.json b/config/modules.json index ec462e9..6128323 100755 --- a/config/modules.json +++ b/config/modules.json @@ -15,6 +15,16 @@ } }, + "phpunitOptionalParams": { + "description": "Méthode utile à phpunit pour le test des paramètres optionnels.", + "permissions": [], + "parameters": { + "p1": { "description": "Texte", "type": "text" }, + "p2": { "description": "Texte", "type": "text", "optional": false }, + "p3": { "description": "Entier positif (optionnel)", "type": "id", "optional": true } + } + }, + "phpunitPermissions": { "description": "Méthode utile à phpunit pour le test des permissions.", "permissions": ["a", "b"], @@ -126,6 +136,47 @@ "duration": { "description": "Duree du token en nombre de jours", "type": "numeric" } } } + }, + + "subject": { + + "getById": { + "description": "Retourne les informations d'un sujet.", + "permissions": ["admin"], + "parameters": { + "id_user": { "description": "UID du sujet recherche.", "type": "id" } + } + }, + + + "getAll": { + "description": "Retourne les informations de tous les sujets.", + "permissions": ["admin"], + "parameters": {} + }, + + + "create": { + "description": "Creation d'un nouveau sujet.", + "permissions": ["admin"], + "parameters": { + "username" : { "description": "Pseudo du sujet, 30 caracteres maximum.", "type": "varchar(3,30)" }, + "firstname" : { "description": "Prénom du sujet, 30 caracteres maximum.", "type": "varchar(3,30)" }, + "lastname" : { "description": "Nom du sujet, 30 caracteres maximum.", "type": "varchar(3,30)" }, + "id_facebook": { "description": "Id facebook du sujet (optionnel).", "type": "id", "optional": true }, + "number" : { "description": "Numéro de téléphone du sujet (optionnel).", "type": "text" } + } + }, + + + "remove": { + "description": "Suppression d'un utilisateur.", + "permissions": ["admin"], + "parameters": { + "id_user": { "description": "UID de l'utilisateur", "type": "id" } + } + } + } } diff --git a/manager/ModuleRequest.php b/manager/ModuleRequest.php index 26b8f25..bd8d15d 100755 --- a/manager/ModuleRequest.php +++ b/manager/ModuleRequest.php @@ -337,21 +337,33 @@ $method = $this->modules[$this->path['module']][$this->path['method']]; // Si le nombre de parametre en entree est insuffisant - if( count($method['parameters']) > count($params) ) return false; + // if( count($method['parameters']) > count($params) ) return false; /* [2] Si le type est defini, pour chaque param, on teste =========================================================*/ foreach($method['parameters'] as $name=>$paramsdata){ - // Si le parametre n'existe pas dans le tableau recu - if( !isset($params[$name]) ) return false; + /* (1) On récupère si le paramètre est optionnel ou pas */ + $optional = isset($paramsdata['optional']) && $paramsdata['optional'] === true; - // Si le type n'est pas defini, on reboucle + /* (2) Si le paramètre est obligatoire et qu'il n'est pas donné -> erreur */ + if( !isset($params[$name]) && !$optional ) return false; + + /* (3) Si le type n'est pas defini, on a pas besoin de le vérifier */ if( !isset($paramsdata['type']) ) continue; - // Si la verification est fausse, on retourne faux - if( !Database::check($paramsdata['type'], $params[$name]) ) return false; + /* (4) Si le paramètre est optionnel et n'est pas donné */ + if( $optional && !isset($params[$name]) ){ + // On le crée avec la valeur NULL + $params[$name] = null; + // On passe au paramètre suivant + continue; + + /* (5) Si le paramètre est renseigné */ + }else + // Si la verification est fausse, on retourne faux + if( !Database::check($paramsdata['type'], $params[$name]) ) return false; } /* [3] Gestion du retour, si tout s'est bien passe diff --git a/phpunit/coverage/Database.php.html b/phpunit/coverage/Database.php.html index e50b2c3..0211b51 100755 --- a/phpunit/coverage/Database.php.html +++ b/phpunit/coverage/Database.php.html @@ -50,23 +50,23 @@
<?php | |
namespace manager; | |
class DataBase{ | |
/* ATTRIBUTS STATIQUES */ | |
public static $config_path = array( | |
'local' => 'f/json/database-local/conf', | |
$this->dbname = $dbname; | |
$this->username = $username; | |
$this->password = $password; | |
try{ | |
try{ | |
self::$pdo = new \PDO('mysql:host='.$this->host.';dbname='.$this->dbname, $this->username, $this->password); | |
// On signale que tout s'est bien passe | |
self::$instance = new DataBase($conf['host'], $conf['dbname'], $conf['user'], $conf['password']); | |
} | |
return self::$instance; | |
} | |
* @fetchData<Array> le résultat d'une $requeteSQL->fetchAll() | |
* @oneDimension<Boolean> FAUX <=> fetchAll ; VRAI <=> fetch | |
* | |
* @return newFetchData<Array> retourne le tableau donné en paramètre mais sans les valeurs à clés numériques | |
* @return newFetchData<Array> retourne le tableau donné en paramètre mais sans les valeurs à clés numériques | |
* | |
*/ | |
public static function delNumeric($fetchData, $oneDimension=false){ | |
// on supprime les doublons des entrées (indice numérique) | |
for( $i = 0 ; $i < count($fetchData) ; $i++ ) // pour tout les utilisateurs | |
foreach($fetchData[$i] as $col => $val){ // pour toutes les entrées | |
if( !mb_detect_encoding($val, 'UTF-8') ) | |
$fetchData[$i][$col] = utf8_encode($val); | |
if( is_int($col) ){ // Si indice numerique | |
if( $nextEquivalent ) // Si suit un indice textuel | |
unset( $fetchData[$i][$col] ); // on supprime l'indice | |
$nextEquivalent = false; // Dans tous les cas, on dit que le prochain ne pourra pas etre supprime si numerique | |
}else // Si l'indice n'est pas un entier | |
$nextEquivalent = true; // On signale qu'il y aura peut etre un indice numerique suivant | |
} | |
/* [2] 1 dimensions | |
// on supprime les doublons des entrées (indice numérique) | |
foreach($fetchData as $i=>$val){ // pour toutes les entrées | |
if( !mb_detect_encoding($val, 'UTF-8') ) | |
$fetchData[$i] = utf8_encode($val); | |
if( is_int($i) ){ // Si indice numerique | |
if( $nextEquivalent ) // Si suit un indice textuel | |
unset( $fetchData[$i] ); // on supprime l'indice | |
$nextEquivalent = false; // Dans tous les cas, on dit que le prochain ne pourra pas etre supprime si numerique | |
}else // Si l'indice n'est pas un entier | |
//////////////////////////////////////////////////////////////// | |
// _ __ _ _ _ | |
// __ _____ _ __(_)/ _(_) ___ __ _| |_(_) ___ _ __ ___ | |
// _ __ _ _ _ | |
// __ _____ _ __(_)/ _(_) ___ __ _| |_(_) ___ _ __ ___ | |
// \ \ / / _ \ '__| | |_| |/ __/ _` | __| |/ _ \| '_ \/ __| | |
// \ V / __/ | | | _| | (_| (_| | |_| | (_) | | | \__ \ | |
// \_/ \___|_| |_|_| |_|\___\__,_|\__|_|\___/|_| |_|___/ | |
* | |
*/ | |
public static function check($type, $value){ | |
$checker = true; | |
$checker = true; | |
/* [0] On verifie que $value n'est pas nul | |
=========================================================*/ | |
if( is_null($value) ) return false; | |
if( is_null($value) ) return false; | |
/* [1] Si de type VARCHAR(min, max) | |
=========================================================*/ | |
if( preg_match('/^varchar\((\d+), ?(\d+)\)$/', $type, $match) ){ | |
if( preg_match('/^varchar\((\d+), ?(\d+)\)$/', $type, $match) ){ | |
// On recupere la taille min | |
$min = (int) $match[1]; | |
// On recupere la taille max | |
/* [2] Si de type ARRAY(type_elements) | |
=========================================================*/ | |
if( preg_match('/^array<(.+)>$/', $type, $match) ){ | |
if( preg_match('/^array<(.+)>$/', $type, $match) ){ | |
// Si c'est pas un tableau on retourne une erreur | |
if( !is_array($value) ) | |
return false; | |
return true; | |
} | |
/* [n] Sinon, tous les autres types definis | |
=========================================================*/ | |
=========================================================*/ | |
switch($type){ | |
// Entier positif (id dans BDD) | |
case 'id': | |
return $checker && is_numeric($value) && $value <= 2147483647 && $value >= 0; | |
case 'id': | |
return $checker && is_numeric($value) && $value <= 2147483647 && $value >= 0; | |
break; | |
// String quelconque (peut etre vide) | |
case 'text': | |
return $checker && is_string($value); | |
case 'text': | |
return $checker && is_string($value); | |
// Adresse mail (255 caracteres max) | |
case 'mail': | |
return $checker && is_string($value) && strlen($value) <= 50 && preg_match('/^[\w\.-]+@[\w\.-]+\.[a-z]{2,4}$/i', $value); | |
break; | |
// Hash sha1 | |
case 'sha1': | |
return $checker && is_string($value) && preg_match('/^[\da-f]{40}$/i', $value); | |
break; | |
default: | |
return false; | |
break; | |
} | |
return $checker; | |
} | |
//////////////////////////////////// | |
// _ _ | |
// __| | __ _| |_ ___ ___ | |
// / _` |/ _` | __/ _ \/ __| | |
// | (_| | (_| | || __/\__ \ | |
// \__,_|\__,_|\__\___||___/ | |
// | |
//////////////////////////////////// | |
// 1) Convertis une date en en francais explicite | |
public static function frDate($date){ | |
/* [1] On definit les traductions | |
=========================================================*/ | |
// Jours de la semaine | |
$days = array("Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche"); | |
// Mois de l'annee | |
$months = array("Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"); | |
/* [2] On recupere le timestamp et les indices | |
=========================================================*/ | |
$time = strtotime($date); // timestamp | |
$daynum = intval( date('N', $time)-1 ); // jour dans la semaine | |
$monthnum = intval( date('n', $time)-1 ); // numero du mois dans l'annee | |
break; | |
// Numéro de téléphone | |
case 'phone_number': | |
return $checker && is_string($value) && preg_match('/^(?:0|\+33 ?|0?0?33 ?|)([1-9] ?(?:[0-9] ?){8})$/i', $value); | |
break; | |
default: | |
return false; | |
break; | |
} | |
return $checker; | |
} | |
//////////////////////////////////// | |
// _ _ | |
// __| | __ _| |_ ___ ___ | |
// / _` |/ _` | __/ _ \/ __| | |
// | (_| | (_| | || __/\__ \ | |
// \__,_|\__,_|\__\___||___/ | |
// | |
//////////////////////////////////// | |
// 1) Convertis une date en en francais explicite | |
public static function frDate($date){ | |
/* [1] On definit les traductions | |
=========================================================*/ | |
// Jours de la semaine | |
$days = array("Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche"); | |
// Mois de l'annee | |
$months = array("Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"); | |
/* [3] On recupere les infos independemment | |
=========================================================*/ | |
$result = array( | |
$days[$daynum], // nom de jour | |
date('j', $time), // jour du mois | |
$months[$monthnum], // nom du mois | |
date('Y', $time), // annee | |
); | |
return implode(" ", $result); | |
} | |
} | |
?> | |
/* [2] On recupere le timestamp et les indices | |
=========================================================*/ | |
$time = strtotime($date); // timestamp | |
$daynum = intval( date('N', $time)-1 ); // jour dans la semaine | |
$monthnum = intval( date('n', $time)-1 ); // numero du mois dans l'annee | |
/* [3] On recupere les infos independemment | |
=========================================================*/ | |
$result = array( | |
$days[$daynum], // nom de jour | |
date('j', $time), // jour du mois | |
$months[$monthnum], // nom du mois | |
date('Y', $time), // annee | |
); | |
return implode(" ", $result); | |
} | |
} | |
?> |
- Generated by PHP_CodeCoverage 2.1.7 using PHP 5.6.11-1ubuntu3.1 and PHPUnit 4.7.6 at Mon Apr 18 9:37:55 UTC 2016. + Generated by PHP_CodeCoverage 2.1.7 using PHP 5.6.11-1ubuntu3.1 and PHPUnit 4.7.6 at Mon Apr 18 16:55:53 UTC 2016.
diff --git a/phpunit/coverage/ManagerError.php.html b/phpunit/coverage/ManagerError.php.html index 7e86598..2f5ad2c 100755 --- a/phpunit/coverage/ManagerError.php.html +++ b/phpunit/coverage/ManagerError.php.html @@ -247,7 +247,7 @@ Dead Code- Generated by PHP_CodeCoverage 2.1.7 using PHP 5.6.11-1ubuntu3.1 and PHPUnit 4.7.6 at Mon Apr 18 9:37:55 UTC 2016. + Generated by PHP_CodeCoverage 2.1.7 using PHP 5.6.11-1ubuntu3.1 and PHPUnit 4.7.6 at Mon Apr 18 16:55:53 UTC 2016.
diff --git a/phpunit/coverage/ResourceDispatcher.php.html b/phpunit/coverage/ResourceDispatcher.php.html index 328077e..96b3795 100755 --- a/phpunit/coverage/ResourceDispatcher.php.html +++ b/phpunit/coverage/ResourceDispatcher.php.html @@ -262,49 +262,49 @@- Generated by PHP_CodeCoverage 2.1.7 using PHP 5.6.11-1ubuntu3.1 and PHPUnit 4.7.6 at Mon Apr 18 9:37:55 UTC 2016. + Generated by PHP_CodeCoverage 2.1.7 using PHP 5.6.11-1ubuntu3.1 and PHPUnit 4.7.6 at Mon Apr 18 16:55:53 UTC 2016.
diff --git a/phpunit/coverage/autoloader.php.html b/phpunit/coverage/autoloader.php.html index 0b66a5f..b5af751 100755 --- a/phpunit/coverage/autoloader.php.html +++ b/phpunit/coverage/autoloader.php.html @@ -214,7 +214,7 @@ Dead Code- Generated by PHP_CodeCoverage 2.1.7 using PHP 5.6.11-1ubuntu3.1 and PHPUnit 4.7.6 at Mon Apr 18 9:37:55 UTC 2016. + Generated by PHP_CodeCoverage 2.1.7 using PHP 5.6.11-1ubuntu3.1 and PHPUnit 4.7.6 at Mon Apr 18 16:55:53 UTC 2016.
diff --git a/phpunit/coverage/index.html b/phpunit/coverage/index.html index c7effcf..540684a 100755 --- a/phpunit/coverage/index.html +++ b/phpunit/coverage/index.html @@ -43,21 +43,21 @@- Generated by PHP_CodeCoverage 2.1.7 using PHP 5.6.11-1ubuntu3.1 and PHPUnit 4.7.6 at Mon Apr 18 9:37:55 UTC 2016. + Generated by PHP_CodeCoverage 2.1.7 using PHP 5.6.11-1ubuntu3.1 and PHPUnit 4.7.6 at Mon Apr 18 16:55:53 UTC 2016.
- Generated by PHP_CodeCoverage 2.1.7 using PHP 5.6.11-1ubuntu3.1 and PHPUnit 4.7.6 at Mon Apr 18 9:37:55 UTC 2016. + Generated by PHP_CodeCoverage 2.1.7 using PHP 5.6.11-1ubuntu3.1 and PHPUnit 4.7.6 at Mon Apr 18 16:55:53 UTC 2016.
diff --git a/phpunit/tests/ModuleRequest.php b/phpunit/tests/ModuleRequest.php index f7c5b31..2ee2515 100644 --- a/phpunit/tests/ModuleRequest.php +++ b/phpunit/tests/ModuleRequest.php @@ -165,6 +165,41 @@ $this->assertEquals( $ans->get('p1'), $params['p1'] ); $this->assertEquals( $ans->get('p2'), $params['p2'] ); } + + /* (4) Gestion des paramètres optionnels */ + public function testConstructOptionalParamGivenIncorrectType(){ + $_SESSION['permission'] = array(); + + $params = array( 'p1' => 'sometext', 'p2' => 'sometexttoo', 'p3' => -10 ); + + $req = new \manager\ModuleRequest( 'module/phpunitOptionalParams', $params ); + $this->assertEquals( $req->error, \manager\ManagerError::ParamError ); + } + public function testConstructOptionalParamGiven(){ + $_SESSION['permission'] = array(); + + $params = array( 'p1' => 'sometext', 'p2' => 'sometexttoo', 'p3' => 10 ); + + $req = new \manager\ModuleRequest( 'module/phpunitOptionalParams', $params ); + $this->assertEquals( $req->error, \manager\ManagerError::Success ); + } + public function testConstructOptionalParamNotGiven(){ + $_SESSION['permission'] = array(); + + $params = array( 'p1' => 'sometext', 'p2' => 'sometexttoo' ); + + $req = new \manager\ModuleRequest( 'module/phpunitOptionalParams', $params ); + $this->assertEquals( $req->error, \manager\ManagerError::Success ); + } + public function testConstructOptionalParamButRequiredMissing(){ + $_SESSION['permission'] = array(); + + $params = array( 'p1' => 'sometext', 'p3' => 10 ); + + $req = new \manager\ModuleRequest( 'module/phpunitOptionalParams', $params ); + $this->assertEquals( $req->error, \manager\ManagerError::ParamError ); + } + }