From cdac8652931a12e72bc6be2770bd1798c0ef5240 Mon Sep 17 00:00:00 2001 From: xdrm-brackets Date: Fri, 12 Feb 2016 22:07:46 +0100 Subject: [PATCH] - [x] [phpunit/tests/Database_*] Tests unitaire de delNumeric() - [x] [Database] Mise a jour des methodes de Database - [x] [Database::construct] Gestion du singleton et de la config --- manager/Database.php | 49 +- manager/ManagerError.php | 6 + phpunit/coverage/Database.php.html | 464 ++++++++++-------- phpunit/coverage/ManagerError.php.html | 214 ++++++++ phpunit/coverage/ResourceDispatcher.php.html | 461 +++++++++++++++++ phpunit/coverage/autoloader.php.html | 14 +- .../coverage/css/bootstrap-responsive.min.css | 0 phpunit/coverage/css/bootstrap.min.css | 0 phpunit/coverage/css/style.css | 0 .../img/glyphicons-halflings-white.png | Bin phpunit/coverage/img/glyphicons-halflings.png | Bin phpunit/coverage/index.dashboard.html | 20 +- phpunit/coverage/index.html | 80 ++- phpunit/coverage/js/bootstrap.min.js | 0 phpunit/coverage/js/html5shiv.js | 0 phpunit/coverage/js/jquery.min.js | 0 phpunit/phpunit.xml | 1 + phpunit/tests/Database_check.php | 0 phpunit/tests/Database_construct.php | 64 +++ phpunit/tests/Database_delNumeric.php | 0 todo.md | 5 +- 21 files changed, 1130 insertions(+), 248 deletions(-) mode change 100644 => 100755 phpunit/coverage/Database.php.html create mode 100644 phpunit/coverage/ManagerError.php.html create mode 100644 phpunit/coverage/ResourceDispatcher.php.html mode change 100644 => 100755 phpunit/coverage/autoloader.php.html mode change 100644 => 100755 phpunit/coverage/css/bootstrap-responsive.min.css mode change 100644 => 100755 phpunit/coverage/css/bootstrap.min.css mode change 100644 => 100755 phpunit/coverage/css/style.css mode change 100644 => 100755 phpunit/coverage/img/glyphicons-halflings-white.png mode change 100644 => 100755 phpunit/coverage/img/glyphicons-halflings.png mode change 100644 => 100755 phpunit/coverage/index.dashboard.html mode change 100644 => 100755 phpunit/coverage/index.html mode change 100644 => 100755 phpunit/coverage/js/bootstrap.min.js mode change 100644 => 100755 phpunit/coverage/js/html5shiv.js mode change 100644 => 100755 phpunit/coverage/js/jquery.min.js mode change 100644 => 100755 phpunit/phpunit.xml mode change 100644 => 100755 phpunit/tests/Database_check.php create mode 100755 phpunit/tests/Database_construct.php mode change 100644 => 100755 phpunit/tests/Database_delNumeric.php diff --git a/manager/Database.php b/manager/Database.php index 6f51cee..e1e7b81 100755 --- a/manager/Database.php +++ b/manager/Database.php @@ -6,7 +6,11 @@ class DataBase{ /* ATTRIBUTS STATIQUES */ - public static $config_path = array('f/json/database/conf', 'f/json/database-local/conf'); + public static $config_path = array( + 'local' => 'f/json/database-local/conf', + 'remote' => 'f/json/database/conf' + ); + private static $pdo; private static $instance; @@ -17,6 +21,8 @@ private $username; private $password; + public static $error; + public function __construct($host, $dbname, $username, $password){ $this->host = $host; @@ -24,20 +30,28 @@ $this->username = $username; $this->password = $password; - // password: Qt358nUdyeTxLDM8 - self::$pdo = new \PDO('mysql:host='.$host.';dbname='.$dbname, $username, $password); + 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::$error = \manager\ManagerError::Success; + + }catch(Exception $e){ + // On signale qu'il y a une erreur + self::$error = \manager\ManagerError::PDOConnection; + } } /* retourne une instance de la classe */ public static function getInstance(){ - if( self::$instance == null ){ + if( self::$instance == null || self::$error != \manager\ManagerError::Success ){ // Si aucune instance existante OU erreur de connection // chargement de la configuration du server SQL - if( $_SERVER['HTTP_HOST'] != 'stefproject' ) - $conf = json_decode( ResourceDispatcher::getResource(self::$config_path[0]), true ); + if( !isset($_SERVER['HTTP_HOST']) || isset($_SERVER['HTTP_HOST']) && $_SERVER['HTTP_HOST'] == 'stefproject' ) + $conf = json_decode( ResourceDispatcher::getResource(self::$config_path['local']), true ); else - $conf = json_decode( ResourceDispatcher::getResource(self::$config_path[1]), true ); + $conf = json_decode( ResourceDispatcher::getResource(self::$config_path['remote']), true ); // creation de l'instance en fonction des parametres self::$instance = new DataBase($conf['host'], $conf['dbname'], $conf['user'], $conf['password']); @@ -50,10 +64,31 @@ /* retourne la connection statique */ public static function getPDO(){ $instance = self::getInstance(); + return self::$pdo; } + + + + + + + + public function getConfig(){ + return array( + 'host' => $this->host, + 'username' => $this->username + ); + } + + + + + + + /*************************************************************/ /* _____ ______ _ _ ______ _____ _ */ /* / ____| ____| \ | | ____| __ \ /\ | | */ diff --git a/manager/ManagerError.php b/manager/ManagerError.php index 8c043a1..3f43929 100755 --- a/manager/ManagerError.php +++ b/manager/ManagerError.php @@ -46,6 +46,11 @@ // Module non specifie dans la conf const UnknownRepo = 10; + /* Database */ + + // Erreur lors de la creation d'un objet PDO (connection) + const PDOConnection = 11; + /* EXPLICITE UN CODE D'ERREUR * @@ -67,6 +72,7 @@ case self::UnknownRepo: return "Le repo n'existe pas"; break; case self::UnknownMethod: return "Le methode n'existe pas"; break; case self::UncallableMethod: return "Le methode n'est pas amorcable"; break; + case self::PDOConnection: return "La connexion avec la base de donnees a echoue"; break; default: return "Erreur inconnue..."; break; } diff --git a/phpunit/coverage/Database.php.html b/phpunit/coverage/Database.php.html old mode 100644 new mode 100755 index 18d05b9..3b02af0 --- a/phpunit/coverage/Database.php.html +++ b/phpunit/coverage/Database.php.html @@ -48,19 +48,19 @@
0.00%
0 / 1
-
-
+
+
-
20.00%
-
1 / 5
- CRAP +
50.00%
+
3 / 6
+ CRAP
-
+
-
71.43%
-
40 / 56
+
95.16%
+
59 / 62
@@ -71,74 +71,91 @@
0.00%
0 / 1
-
-
+
+
-
20.00%
-
1 / 5
- 83.14 +
50.00%
+
3 / 6
+ 47
-
+
-
71.43%
-
40 / 56
+
95.16%
+
59 / 62
-  __construct($host, $dbname, $username, $password) +  __construct($host, $dbname, $username, $password)
0.00%
0 / 1
- 2 -
-
+ 2.01 +
+
-
0.00%
-
0 / 6
+
88.89%
+
8 / 9
-  getInstance() +  getInstance()
0.00%
0 / 1
- 12 -
-
+ 6.10 +
+
-
0.00%
-
0 / 7
+
85.71%
+
6 / 7
-  getPDO() -
-
+  getPDO() +
+
-
0.00%
-
0 / 1
- 2 -
-
+
100.00%
+
1 / 1
+ 1 +
+
-
0.00%
-
0 / 2
+
100.00%
+
2 / 2
-  delNumeric($fetchData, $oneDimension=false) +  getConfig() +
+
+
+ +
100.00%
+
1 / 1
+ 1 +
+
+
+ +
100.00%
+
3 / 3
+ + + +  delNumeric($fetchData, $oneDimension=false)
@@ -155,7 +172,7 @@ -  check($type, $value) +  check($type, $value)
@@ -184,186 +201,221 @@ class DataBase{ /* ATTRIBUTS STATIQUES */ - public static $config_path = array('f/json/database/conf', 'f/json/database-local/conf'); - private static $pdo; - private static $instance; - + public static $config_path = array( + 'local' => 'f/json/database-local/conf', + 'remote' => 'f/json/database/conf' + ); - /* ATTRIBUTS */ - private $host; - private $dbname; - private $username; - private $password; - - - public function __construct($host, $dbname, $username, $password){ - $this->host = $host; - $this->dbname = $dbname; - $this->username = $username; - $this->password = $password; + private static $pdo; + private static $instance; + + + /* ATTRIBUTS */ + private $host; + private $dbname; + private $username; + private $password; + + public static $error; + - // password: Qt358nUdyeTxLDM8 - self::$pdo = new \PDO('mysql:host='.$host.';dbname='.$dbname, $username, $password); - } - - - /* retourne une instance de la classe */ - public static function getInstance(){ - if( self::$instance == null ){ + public function __construct($host, $dbname, $username, $password){ + $this->host = $host; + $this->dbname = $dbname; + $this->username = $username; + $this->password = $password; + + try{ + self::$pdo = new \PDO('mysql:host='.$this->host.';dbname='.$this->dbname, $this->username, $this->password); - // chargement de la configuration du server SQL - if( $_SERVER['HTTP_HOST'] != 'stefproject' ) - $conf = json_decode( ResourceDispatcher::getResource(self::$config_path[0]), true ); - else - $conf = json_decode( ResourceDispatcher::getResource(self::$config_path[1]), true ); - - // creation de l'instance en fonction des parametres - self::$instance = new DataBase($conf['host'], $conf['dbname'], $conf['user'], $conf['password']); + // On signale que tout s'est bien passe + self::$error = \manager\ManagerError::Success; + + }catch(Exception $e){ + // On signale qu'il y a une erreur + self::$error = \manager\ManagerError::PDOConnection; + } + } - } - - return self::$instance; - } + + /* retourne une instance de la classe */ + public static function getInstance(){ + if( self::$instance == null || self::$error != \manager\ManagerError::Success ){ // Si aucune instance existante OU erreur de connection - /* retourne la connection statique */ - public static function getPDO(){ - $instance = self::getInstance(); - return self::$pdo; - } + // chargement de la configuration du server SQL + if( !isset($_SERVER['HTTP_HOST']) || isset($_SERVER['HTTP_HOST']) && $_SERVER['HTTP_HOST'] == 'stefproject' ) + $conf = json_decode( ResourceDispatcher::getResource(self::$config_path['local']), true ); + else + $conf = json_decode( ResourceDispatcher::getResource(self::$config_path['remote']), true ); - - /*************************************************************/ - /* _____ ______ _ _ ______ _____ _ */ - /* / ____| ____| \ | | ____| __ \ /\ | | */ - /* | | __| |__ | \| | |__ | |__) | / \ | | */ - /* | | |_ | __| | . ` | __| | _ / / /\ \ | | */ - /* | |__| | |____| |\ | |____| | \ \ / ____ \| |____ */ - /* \_____|______|_| \_|______|_| \_\/_/ \_\______| */ - /* */ - /*************************************************************/ - - /* SUPPRIME LES VALEURS À CLÉS NUMÉRIQUES DANS UN FETCH D'UNE TABLE DE LA BDD - * - * @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 - * - */ - public static function delNumeric($fetchData, $oneDimension=false){ - $nextEquivalent = false; // Vaut VRAI si le prochain est peut-etre un equivalent numerique + // creation de l'instance en fonction des parametres + self::$instance = new DataBase($conf['host'], $conf['dbname'], $conf['user'], $conf['password']); + + } + + return self::$instance; + } + + /* retourne la connection statique */ + public static function getPDO(){ + $instance = self::getInstance(); + + return self::$pdo; + } + + + + + + + - /* [1] 2 dimensions - ===============================================*/ - if( !$oneDimension && is_array($fetchData[0]) ){ - - // 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 + + public function getConfig(){ + return array( + 'host' => $this->host, + 'username' => $this->username + ); + } - 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 - ===============================================*/ - }else{ - - // 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 - $nextEquivalent = true; // On signale qu'il y aura peut etre un indice numerique suivant - - } + + + + /*************************************************************/ + /* _____ ______ _ _ ______ _____ _ */ + /* / ____| ____| \ | | ____| __ \ /\ | | */ + /* | | __| |__ | \| | |__ | |__) | / \ | | */ + /* | | |_ | __| | . ` | __| | _ / / /\ \ | | */ + /* | |__| | |____| |\ | |____| | \ \ / ____ \| |____ */ + /* \_____|______|_| \_|______|_| \_\/_/ \_\______| */ + /* */ + /*************************************************************/ + + /* SUPPRIME LES VALEURS À CLÉS NUMÉRIQUES DANS UN FETCH D'UNE TABLE DE LA BDD + * + * @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 + * + */ + public static function delNumeric($fetchData, $oneDimension=false){ + $nextEquivalent = false; // Vaut VRAI si le prochain est peut-etre un equivalent numerique + + /* [1] 2 dimensions + ===============================================*/ + if( !$oneDimension && is_array($fetchData[0]) ){ + + // 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 - } - - return $fetchData; - } - - + 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 - //////////////////////////////////////////////////////////////// - // _ __ _ _ _ - // __ _____ _ __(_)/ _(_) ___ __ _| |_(_) ___ _ __ ___ - // \ \ / / _ \ '__| | |_| |/ __/ _` | __| |/ _ \| '_ \/ __| - // \ V / __/ | | | _| | (_| (_| | |_| | (_) | | | \__ \ - // \_/ \___|_| |_|_| |_|\___\__,_|\__|_|\___/|_| |_|___/ - // - //////////////////////////////////////////////////////////////// - - - /* VERIFICATIONS DES TYPES UTILES GENERIQUES - * - * @type<String> Type que l'on veut verifier - * @value<mixed*> Valeur a verifier - * - * @return match<Boolean> Retourne si oui ou non la valeur @value est du bon type @type - * - */ - public static function check($type, $value){ - $checker = !is_null($value); + $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 + ===============================================*/ + }else{ + + // 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 - switch($type){ - /* (1) Global */ - case 'auto_increment_id': - return $checker && is_numeric($value) && $value <= 2147483647 && $value >= -2147483647; - break; - - /* (2) Utilisateur */ - case 'user.code': - case 'machine.code': - return $checker && is_string($value) && preg_match('/^[\dA-F]{2}(\-[\dA-F]{2}){3,5}$/i', $value); - break; + $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 + + } + + } + + return $fetchData; + } - case 'user.username': - case 'machine.name': - case 'group.name': - return $checker && is_string($value) && preg_match('/^[\w-]{1,30}$/i', $value); - break; - - case 'user.firstname': - case 'user.lastname': - return $checker && is_string($value) && preg_match('/^[a-z -]{3,30}$/i', $value); - break; + + + //////////////////////////////////////////////////////////////// + // _ __ _ _ _ + // __ _____ _ __(_)/ _(_) ___ __ _| |_(_) ___ _ __ ___ + // \ \ / / _ \ '__| | |_| |/ __/ _` | __| |/ _ \| '_ \/ __| + // \ V / __/ | | | _| | (_| (_| | |_| | (_) | | | \__ \ + // \_/ \___|_| |_|_| |_|\___\__,_|\__|_|\___/|_| |_|___/ + // + //////////////////////////////////////////////////////////////// - case 'user.mail': - return $checker && is_string($value) && strlen($value) <= 50 && preg_match('/^[\w\.-]+@[\w\.-]+\.[a-z]{2,4}$/i', $value); - break; - - case 'user.password': - return $checker && is_string($value) && preg_match('/^[\da-f]{40}$/i', $value); - break; - - } - - return $checker; + + /* VERIFICATIONS DES TYPES UTILES GENERIQUES + * + * @type<String> Type que l'on veut verifier + * @value<mixed*> Valeur a verifier + * + * @return match<Boolean> Retourne si oui ou non la valeur @value est du bon type @type + * + */ + public static function check($type, $value){ + $checker = !is_null($value); - } - - - } - ?> + switch($type){ + /* (1) Global */ + case 'auto_increment_id': + return $checker && is_numeric($value) && $value <= 2147483647 && $value >= -2147483647; + break; + + /* (2) Utilisateur */ + case 'user.code': + case 'machine.code': + return $checker && is_string($value) && preg_match('/^[\dA-F]{2}(\-[\dA-F]{2}){3,5}$/i', $value); + break; + + case 'user.username': + case 'machine.name': + case 'group.name': + return $checker && is_string($value) && preg_match('/^[\w-]{1,30}$/i', $value); + break; + + case 'user.firstname': + case 'user.lastname': + return $checker && is_string($value) && preg_match('/^[a-z -]{3,30}$/i', $value); + break; + + case 'user.mail': + return $checker && is_string($value) && strlen($value) <= 50 && preg_match('/^[\w\.-]+@[\w\.-]+\.[a-z]{2,4}$/i', $value); + break; + + case 'user.password': + return $checker && is_string($value) && preg_match('/^[\da-f]{40}$/i', $value); + break; + + } + + return $checker; + + } + + + } + ?> @@ -375,7 +427,7 @@ Dead Code

- Generated by PHP_CodeCoverage 1.2.13 using PHP 5.5.9-1ubuntu4.14 and PHPUnit 3.7.28 at Fri Feb 12 20:46:41 CET 2016. + Generated by PHP_CodeCoverage 1.2.13 using PHP 5.5.9-1ubuntu4.14 and PHPUnit 3.7.28 at Fri Feb 12 22:01:41 CET 2016.

diff --git a/phpunit/coverage/ManagerError.php.html b/phpunit/coverage/ManagerError.php.html new file mode 100644 index 0000000..eb5c9be --- /dev/null +++ b/phpunit/coverage/ManagerError.php.html @@ -0,0 +1,214 @@ + + + + + Code Coverage for /var/www/stefproject/manager/ManagerError.php + + + + + + + +
+
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
+
+
+
0.00%
0 / 1
+
+
+
0.00%
0 / 1
CRAP
+
+
+
0.00%
0 / 14
ManagerError
+
+
+
0.00%
0 / 1
+
+
+
0.00%
0 / 1
182
+
+
+
0.00%
0 / 14
 explicit($error)
+
+
+
0.00%
0 / 1
182
+
+
+
0.00%
0 / 14
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
<?php
namespace manager;
class ManagerError{
/* SUCCESS */
const Success = 0;
/* Parsage json */
const ParsingFailed = 1;
/* ResourceDispatcher */
// Drapeaux invalides
const InvalidFlags = 2;
// Fichier inexistant
const UnreachableResource = 3;
/* ModuleRequest */
// Le @path n'est pas renseigne
const MissingPath = 4;
// Verification de la coherence du chemin (existe dans la conf)
const WrongPathModule = 5;
// Module non specifie dans la conf
const UnknownModule = 6;
// Methode non specifie pour ce Module dans la conf
const UnknownMethod = 7;
// Methode inamorcable
const UncallableMethod = 8;
/* Repo */
// Verification de la coherence du chemin (existe dans la conf)
const WrongPathRepo = 9;
// Module non specifie dans la conf
const UnknownRepo = 10;
/* Database */
// Erreur lors de la creation d'un objet PDO (connection)
const PDOConnection = 11;
/* EXPLICITE UN CODE D'ERREUR
*
* @error<Integer> Code d'erreur
*
* @return explicit<String> Description explicite du code d'erreur
*
*/
public static function explicit($error){
switch($error){
case self::Success: return "Tout s'est bien deroule"; break;
case self::ParsingFailed: return "La lecture du fichier JSON a echoue"; break;
case self::InvalidFlags: return "Les specifications (drapeaux) sont incorrects"; break;
case self::UnreachableResource: return "La ressource n'existe pas (404)"; break;
case self::MissingPath: return "Le chemin de delegation n'a pas ete renseigne"; break;
case self::WrongPathModule: return "Le chemin de delegation est incorrect ('nomModule/nomMethode')"; break;
case self::WrongPathRepo: return "Le chemin de delegation est incorrect ('nomRepo/nomMethode')"; break;
case self::UnknownModule: return "Le module n'existe pas"; break;
case self::UnknownRepo: return "Le repo n'existe pas"; break;
case self::UnknownMethod: return "Le methode n'existe pas"; break;
case self::UncallableMethod: return "Le methode n'est pas amorcable"; break;
case self::PDOConnection: return "La connexion avec la base de donnees a echoue"; break;
default: return "Erreur inconnue..."; break;
}
return 'Aucune erreur trouvee';
}
}
+ +
+ + + + + diff --git a/phpunit/coverage/ResourceDispatcher.php.html b/phpunit/coverage/ResourceDispatcher.php.html new file mode 100644 index 0000000..c2500a2 --- /dev/null +++ b/phpunit/coverage/ResourceDispatcher.php.html @@ -0,0 +1,461 @@ + + + + + Code Coverage for /var/www/stefproject/manager/ResourceDispatcher.php + + + + + + + +
+
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
+
+
+
0.00%
0 / 1
+
+
+
66.67%
4 / 6
CRAP
+
+
+
75.93%
41 / 54
ResourceDispatcher
+
+
+
0.00%
0 / 1
+
+
+
66.67%
4 / 6
32.04
+
+
+
75.93%
41 / 54
 __construct($url, $view=false)
+
+
+
0.00%
0 / 1
8.30
+
+
+
60.00%
12 / 20
 getResource($route)
+
+
+
100.00%
1 / 1
1
+
+
+
100.00%
2 / 2
 createFlags($serialFlags)
+
+
+
100.00%
1 / 1
9
+
+
+
100.00%
16 / 16
 buildPath()
+
+
+
100.00%
1 / 1
4
+
+
+
100.00%
8 / 8
 view()
+
+
+
0.00%
0 / 1
6
+
+
+
0.00%
0 / 5
 getContent()
+
+
+
100.00%
1 / 1
2
+
+
+
100.00%
3 / 3
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
<?php
namespace manager;
class ResourceDispatcher{
// Constantes
public static $extension_config_path = '/config/dispatcher-extensions.json';
public static $parents_config_path = '/config/dispatcher-tree.json';
public static $supported_extensions;
public static $supported_parents;
// Attributs prives utiles (initialisation)
private $header;
private $path;
private $flags;
public $error;
/* CONSTRUCTEUR & AMORCAGE DU DISPATCHER
*
* @url<String> L'url courante
* @view<Boolean> Si VRAI, retourne header+contenu, sinon cree juste l'objet
*
* @return status<Boolean> Retourne si oui ou non tout s'est bien passe
*
*/
public function __construct($url, $view=false){
$this->error = ManagerError::Success;
/* [0] On met a jour la configuration
=====================================================*/
// Extensions supportees
$extensions_conf = json_decode( file_get_contents(__ROOT__.self::$extension_config_path), true );
// Gestion de l'erreur de parsage
if( $extensions_conf == null ){
$this->error = ManagerError::ParsingFailed;
return false;
}
self::$supported_extensions = $extensions_conf;
// Dossiers supportes
$parents_conf = json_decode( file_get_contents(__ROOT__.self::$parents_config_path), true );
// Gestion de l'erreur de parsage
if( $parents_conf == null ){
$this->error = ManagerError::ParsingFailed;
return false;
}
self::$supported_parents = $parents_conf;
/* [1] On recupere les donnees de l'URL
==================================================*/
$serialFlags = array_slice( explode('/',$url), 1 );
/* [2] On check/cree les drapeaux avec ces donnees
==================================================*/
if( !$this->createFlags($serialFlags) ){ // Creation des drapeaux
$this->error = ManagerError::InvalidFlags;
return false;
}
/* [3] On construit le chemin a partir des tags
==================================================*/
if( !$this->buildPath() ){ // Construction du chemin
$this->error = ManagerError::UnreachableResource;
return false;
}
/* [4] On gere l'affichage pour l'appel externe/interne
==================================================*/
if( $view ) // Appel externe
$this->view();
return true;
}
/* INCLUSION PHP D'UNE RESSOURCE UTILISANT LE DISPATCHER
*
* @route<String> Route associee a une ressource
*
* @return content<*> Retourne le contenu de la ressource
*
*/
public static function getResource($route){
$instance = new ResourceDispatcher($route);
return $instance->getContent();
}
/* FONCTION QUI VERIFIE LES DRAPEAUX
*
* @serialFlags<Array> Tableau a indice numerique
*
* @return correct<Boolean> Retourne si oui ou non les drapeaux sont corrects
*
*/
private function createFlags($serialFlags){
/* [1] Verification des flags (version serialisee)
======================================================*/
$correct = true;
// Verification du nombre de drapeaux () au moins 3
$correct = $correct && count($serialFlags) >= 3;
// Verification que l'extension est correcte
$correct = $correct && array_key_exists($serialFlags[0], self::$supported_extensions);
// Verification du filename
$correct = $correct && preg_match('#^[\w_-]+$#i', $serialFlags[1]);
// Verification du parent
$correct = $correct && array_key_exists($serialFlags[2], self::$supported_parents);
// Verification du sous-parent (optionnel)
$opt_subParent = count($serialFlags) >= 4;
if( $opt_subParent )
$correct = $correct && preg_match('#^[\w_-]+$#i', $serialFlags[3]);
if( !$correct )
return false;
/* [2] Creation (non serialisee) des flags
======================================================*/
// Si tout se deroule bien, on cree les flags
$this->flags = array(
'extension' => $serialFlags[0],
'filename' => $serialFlags[1],
'parent' => $serialFlags[2]
);
// Ajout du sous-parent optionnel
if( $opt_subParent )
$this->flags['subparent'] = $serialFlags[3];
return true;
}
/* FONCTION QUI CONSTRUIT LE CHEMIN A PARTIR DU PATH
*
* @return fileExists<Boolean> Retourne si oui ou non le fichier cible existe
*
* @format
*
* f/extension/filename/parent/:subparent:/ (:OPT:)
*
*/
private function buildPath(){
/* [1] On recupere le HEADER associe a l'extension
==========================================================*/
// Si aucun header pour cet cle, on retourne une erreur
if( !isset(self::$supported_extensions[$this->flags['extension']]) ) return false;
// On recupere le header associe
$header = self::$supported_extensions[$this->flags['extension']];
/* [2] On recupere le chemin associe au parent
==========================================================*/
// Si aucun dossier pour cet indice, on retourne une erreur
if( !isset(self::$supported_parents[$this->flags['parent']]) ) return false;
// On recupere le dossier associe
$parent = self::$supported_parents[$this->flags['parent']];
/* [3] Gestion du sous-parent optionnel
==========================================================*/
$opt_subParent = (isset($this->flags['subparent'])) ? $this->flags['subparent'].'/' : '';
/* [4] On definit le header
==========================================================*/
$this->header = $header;
/* [5] On construit le chemin
==========================================================*/
$this->path = __ROOT__.$parent.'/'.$opt_subParent.$this->flags['filename'].'.'.$this->flags['extension'];
/* [6] On retourne si le fichier existe ou non
==========================================================*/
return @file_get_contents( $this->path ) != false;
}
/* FUNCTION QUI AFFICHE LA RESSOURCE EN QUESTION
*
*/
public function view(){
// S'il y a eu une erreur en amont
if( $this->error != ManagerError::Success )
return false; // on retourne faux
// On definit le header
header('Content-Type: '.$this->header);
// On inclut le contenu
echo file_get_contents($this->path);
}
/* FUNCTION QUI RETOURNE LE CONTENU DE LA RESSOURCE EN QUESTION
*
*/
public function getContent(){
// S'il y a eu une erreur en amont
if( $this->error != ManagerError::Success )
return false; // on retourne faux
// On inclut le contenu
return file_get_contents($this->path);
}
}
+ +
+ + + + + diff --git a/phpunit/coverage/autoloader.php.html b/phpunit/coverage/autoloader.php.html old mode 100644 new mode 100755 index f6dd793..39c0b9f --- a/phpunit/coverage/autoloader.php.html +++ b/phpunit/coverage/autoloader.php.html @@ -110,18 +110,18 @@ function autoloader($className){ - $path = ''; + $path = ''; /* [1] On utilise le namespace pour localiser ===============================================*/ // On remplace les '\' par des '/' - $path = str_replace('\\', '/', $className) . '.php'; - $path = __ROOT__.'/'.$path; + $path = str_replace('\\', '/', $className) . '.php'; + $path = __ROOT__.'/'.$path; // Si le fichier existe, on l'inclut - if( file_exists($path) ) - require_once $path; - } + if( file_exists($path) ) + require_once $path; + } // On definit l'autoloader comme autoloader (obvious) spl_autoload_register('autoloader', false, true); @@ -138,7 +138,7 @@ Dead Code

- Generated by PHP_CodeCoverage 1.2.13 using PHP 5.5.9-1ubuntu4.14 and PHPUnit 3.7.28 at Fri Feb 12 20:46:41 CET 2016. + Generated by PHP_CodeCoverage 1.2.13 using PHP 5.5.9-1ubuntu4.14 and PHPUnit 3.7.28 at Fri Feb 12 22:01:41 CET 2016.

diff --git a/phpunit/coverage/css/bootstrap-responsive.min.css b/phpunit/coverage/css/bootstrap-responsive.min.css old mode 100644 new mode 100755 diff --git a/phpunit/coverage/css/bootstrap.min.css b/phpunit/coverage/css/bootstrap.min.css old mode 100644 new mode 100755 diff --git a/phpunit/coverage/css/style.css b/phpunit/coverage/css/style.css old mode 100644 new mode 100755 diff --git a/phpunit/coverage/img/glyphicons-halflings-white.png b/phpunit/coverage/img/glyphicons-halflings-white.png old mode 100644 new mode 100755 diff --git a/phpunit/coverage/img/glyphicons-halflings.png b/phpunit/coverage/img/glyphicons-halflings.png old mode 100644 new mode 100755 diff --git a/phpunit/coverage/index.dashboard.html b/phpunit/coverage/index.dashboard.html old mode 100644 new mode 100755 index 906abdd..9e06cbb --- a/phpunit/coverage/index.dashboard.html +++ b/phpunit/coverage/index.dashboard.html @@ -40,24 +40,28 @@

Top Project Risks

@@ -88,7 +92,7 @@ $(document).ready(function() { min: 0 }, series: [{ - data: [0,0,0,0,0,0,0,0,1,0,0,0] + data: [1,0,0,0,0,0,0,0,1,0,1,0] }], }); @@ -116,7 +120,7 @@ $(document).ready(function() { } }, series: [{ - data: [[71.428571428571,42,"DataBase<\/a>"]], + data: [[95.161290322581,47,"DataBase<\/a>"],[0,13,"ManagerError<\/a>"],[75.925925925926,24,"ResourceDispatcher<\/a>"]], marker: { symbol: 'diamond' } diff --git a/phpunit/coverage/index.html b/phpunit/coverage/index.html old mode 100644 new mode 100755 index 1832f68..c7ce2c0 --- a/phpunit/coverage/index.html +++ b/phpunit/coverage/index.html @@ -41,19 +41,41 @@ - Total + Total +
+
+
+ +
75.71%
+
106 / 140
-
+
-
69.70%
-
46 / 66
+
53.85%
+
7 / 13
-
+
-
20.00%
-
1 / 5
+
0.00%
+
0 / 3
+ + + +
Database.php +
+
+
+ +
95.16%
+
59 / 62
+
+
+
+ +
50.00%
+
3 / 6
@@ -63,19 +85,41 @@ - Database.php -
-
-
- -
71.43%
-
40 / 56
+ ManagerError.php
-
+
-
20.00%
-
1 / 5
+
0.00%
+
0 / 14
+
+
+
+ +
0.00%
+
0 / 1
+
+
+
+ +
0.00%
+
0 / 1
+ + + + ResourceDispatcher.php +
+
+
+ +
75.93%
+
41 / 54
+
+
+
+ +
66.67%
+
4 / 6
@@ -111,7 +155,7 @@ High: 70% to 100%

- Generated by PHP_CodeCoverage 1.2.13 using PHP 5.5.9-1ubuntu4.14 and PHPUnit 3.7.28 at Fri Feb 12 20:46:41 CET 2016. + Generated by PHP_CodeCoverage 1.2.13 using PHP 5.5.9-1ubuntu4.14 and PHPUnit 3.7.28 at Fri Feb 12 22:01:41 CET 2016.

diff --git a/phpunit/coverage/js/bootstrap.min.js b/phpunit/coverage/js/bootstrap.min.js old mode 100644 new mode 100755 diff --git a/phpunit/coverage/js/html5shiv.js b/phpunit/coverage/js/html5shiv.js old mode 100644 new mode 100755 diff --git a/phpunit/coverage/js/jquery.min.js b/phpunit/coverage/js/jquery.min.js old mode 100644 new mode 100755 diff --git a/phpunit/phpunit.xml b/phpunit/phpunit.xml old mode 100644 new mode 100755 index 2470e97..0746731 --- a/phpunit/phpunit.xml +++ b/phpunit/phpunit.xml @@ -4,6 +4,7 @@ tests/Database_check.php tests/Database_delNumeric.php + tests/Database_construct.php diff --git a/phpunit/tests/Database_check.php b/phpunit/tests/Database_check.php old mode 100644 new mode 100755 diff --git a/phpunit/tests/Database_construct.php b/phpunit/tests/Database_construct.php new file mode 100755 index 0000000..827a58f --- /dev/null +++ b/phpunit/tests/Database_construct.php @@ -0,0 +1,64 @@ +assertEquals( 'localhost', $instance->getConfig()['host'] ); + } + + public function testGetInstanceWithSERVERLocal(){ + // Pour regenerer une instance, on definit une erreur + \manager\Database::$error = \manager\ManagerError::PDOConnection; + + + $_SERVER['HTTP_HOST'] = 'stefproject'; + $instance = \manager\Database::getInstance(); + + $this->assertEquals( 'localhost', $instance->getConfig()['host'] ); + } + + + + /* [2] Verification du singleton (getInstance) + =========================================================*/ + public function testInstancePersistence(){ + \manager\Database::$error = \manager\ManagerError::PDOConnection; + + $instance_construct = \manager\Database::getInstance(); + $instance_nextuse = \manager\Database::getInstance(); + + $this->assertSame( $instance_construct, $instance_nextuse ); + } + + public function testInstancePersistenceRefutation(){ + \manager\Database::$error = \manager\ManagerError::PDOConnection; + $instance_construct = \manager\Database::getInstance(); + + \manager\Database::$error = \manager\ManagerError::PDOConnection; + $instance_nextuse = \manager\Database::getInstance(); + + $this->assertNotSame( $instance_construct, $instance_nextuse ); + } + + + + /* [3] Verification de l'objet PDO + =========================================================*/ + public function testPDO(){ + $pdo = \manager\Database::getPDO(); + + $this->assertGreaterThan( 10, count($pdo->query('SELECT * FROM user')->fetchAll()), '[!] Moins de 10 utilisateurs trouves.'); + } + + + + + + + } + +?> \ No newline at end of file diff --git a/phpunit/tests/Database_delNumeric.php b/phpunit/tests/Database_delNumeric.php old mode 100644 new mode 100755 diff --git a/todo.md b/todo.md index cf7ff99..1d4578c 100755 --- a/todo.md +++ b/todo.md @@ -13,7 +13,6 @@ ############ # EN COURS # ############ -- [ ] [Database] Checker de type - [ ] Gestion des groupes (utilisateurs/machines) - [x] bdd - [ ] Creation d'un groupe individuel pour utilisateurs @@ -40,12 +39,14 @@ ######## # FAIT # ######## -- [x] [phpunit/tests/Database_delNumeric] Tests unitaire de delNumeric() +- [x] [phpunit/tests/Database_*] Tests unitaire de delNumeric() - [x] [Database] Mise a jour des methodes de Database + - [x] [Database::construct] Gestion du singleton et de la config - [x] [Database::check] Suite de l'implementation (couverture des types de la BDD actuelle: 100%) - [x] [Database::delNumeric] Prevention si oubli @oneDimension + ne supprime plus les indices numeriques associees a aucun indice textuel - [x] [phpunit/tests/Database_check] Tests unitaire du checker - [x] [phpunit/] Install+Config phpunit +- [x] [Database] Checker de type (types utilises dans la BDD) - [x] [manager/Repo] Gestion des Repo - [x] [ManagerError] Correction/ajout des codes erreurs - [x] [ModuleRequest] Modification des erreurs