Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 949 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
96 jpm 1
<?php
2
// declare(encoding='UTF-8');
3
/**
4
 * Classe contenant des méthodes :
949 raphael 5
 *	- d'intialisation des tests,
6
 *	- refactorisant le code des tests,
7
 *	- facilitant les tests.
96 jpm 8
 *
9
 * @category	php 5.3
10
 * @package		Tests/Services
11
 * @author		Jean-Pascal MILCENT <jpm@tela-botanica.org>
12
 * @copyright	Copyright (c) 2011, Tela Botanica (accueil@tela-botanica.org)
13
 * @license		http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
14
 * @license		http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
15
 * @version		$Id$
16
 */
947 raphael 17
 
96 jpm 18
abstract class ServiceEflorePhpUnit extends PHPUnit_Framework_TestCase {
19
 
20
	/** Définir la valeur de cet attribut dans le constructeur de la classe de test.*/
21
	protected $projet = '';
22
	/** Définir la valeur de cet attribut dans le constructeur de la classe de test.*/
23
	protected $service = '';
24
 
25
	//+------------------------------------------------------------------------------------------------------+
26
	// Intialisation
27
 
28
	public static function setUpBeforeClass() {
29
		error_reporting(E_ALL);
30
 
31
		self::chargerFramework();
32
 
33
		// Enregistrement en première position des autoload de la méthode gérant les classes des services
34
		spl_autoload_register(array(get_class(), 'chargerClasseAuto'));
35
	}
36
 
37
	public static function chargerClasseAuto($classe) {
38
		if (class_exists($classe)) {
39
			return null;
40
		}
195 jpm 41
		$cheminBase = realpath(__DIR__.'/../../modules/0.1').'/';
96 jpm 42
		$cheminsTests = __DIR__.'/';
43
		$chemins = array($cheminBase, $cheminsTests);
44
		foreach ($chemins as $chemin) {
45
			$chemin = $chemin.$classe.'.php';
46
			if (file_exists($chemin)) {
47
				require_once $chemin;
48
			}
49
		}
50
	}
51
 
52
	private static function chargerFramework() {
947 raphael 53
		static $cheminRacine;
949 raphael 54
		if(!$cheminRacine) {
55
			$cheminRacine = realpath(dirname(__FILE__).'/../..').'/';
56
			$framework = $cheminRacine.'framework.php';
57
			if (!file_exists($framework)) {
58
				$e = "Veuillez paramétrer l'emplacement et la version du Framework dans le fichier $framework";
59
				trigger_error($e, E_USER_ERROR);
60
			} else {
61
				// Inclusion du Framework
62
				require_once $framework;
63
				// Ajout d'information concernant cette application
64
				Framework::setCheminAppli($cheminRacine);// Obligatoire
65
			}
66
		}
67
	}
96 jpm 68
 
69
	//+------------------------------------------------------------------------------------------------------+
70
	// Refactorisation
833 raphael 71
	public function consulterJson($service, $projet, $ressources, $parametres = NULL) {
790 raphael 72
		$retourJson = self::consulterBrut($service, $projet, $ressources, $parametres);
96 jpm 73
		$retour = json_decode($retourJson, true);
790 raphael 74
		$url = self::creerUrl($service, $ressources, $parametres);
137 jpm 75
		$this->assertEquals(JSON_ERROR_NONE, json_last_error(), "Le json contient des erreurs qui bloquent le décodage. Voir : $url\n".print_r($retourJson, true));
96 jpm 76
		return $retour;
77
	}
78
 
833 raphael 79
	static function consulterBrut($service, $projet, $ressources, $parametres = NULL) {
855 raphael 80
		if(is_null($ressources)) $ressources = array();
833 raphael 81
		array_unshift($ressources, $projet, $service);
96 jpm 82
		$projets = new Projets();
83
		$retourJson = $projets->consulter($ressources, $parametres);
84
		return $retourJson;
85
	}
86
 
833 raphael 87
	static function creerUrl($service, $ressources, $parametres = NULL) {
790 raphael 88
		// TODO ? $version
96 jpm 89
		$ressourcesUrl = array();
949 raphael 90
		if($ressources) foreach ($ressources as $ressource) $ressourcesUrl[] = $ressource;
96 jpm 91
		$ressourcesUrl = count($ressourcesUrl) > 0 ? '/'.implode('/', $ressourcesUrl) : '';
92
 
93
		$parametresUrl = '';
833 raphael 94
		if ($parametres) {
96 jpm 95
			foreach ($parametres as $cle => $valeur) {
96
				$parametresUrl[] = $cle.'='.rawurlencode($valeur);
97
			}
98
			$parametresUrl = '?'.implode('&', $parametresUrl);
99
		}
97 jpm 100
 
790 raphael 101
		return Config::get('url_service') . '/' . $service . $ressourcesUrl . $parametresUrl;
96 jpm 102
	}
103
 
104
	//+------------------------------------------------------------------------------------------------------+
105
	// Méthodes facilitant les tests
106
 
107
	/**
108
	* Récupère un bouchon de classe abstraite.
109
	* Comment l'utiliser :
949 raphael 110
	*	$classeAstraite = $this->getClasseAbstraite('MaClasse', array('param1', 'param2'));
111
	*	$foo = $classeAstraite->methodeConcretePublique();
96 jpm 112
	*
113
	* @param String $classeNom Le nom de la classe
114
	* @param Array $parametres Les paramètres à passer au constructeur.
115
	* @return Object Le bouchon de la classe abstraite
116
	*/
117
	public function getClasseAbstraite($classeNom, Array $parametres) {
118
		$efloreScript = $this->getMockForAbstractClass($classeNom, $parametres);
119
		return $efloreScript;
120
	}
121
 
122
	/**
123
	 * Récupère une méthode privée d'une classe pour tester/documenter.
124
	 * Comment l'utiliser :
949 raphael 125
	 *	MyClass->foo():
126
	 *	 $cls = new MyClass();
127
	 *	 $foo = self::getPrivateMethode($cls, 'foo');
128
	 *	 $foo->invoke($cls, $...);
96 jpm 129
	 *
130
	 * @param object $objet Une instance de votre classe
131
	 * @param string $methode Le nom de la méthode private
132
	 * @return ReflectionMethod La méthode demandée
133
	 */
134
	public static function getMethodePrivee($objet, $nomMethode) {
135
		$classe = new ReflectionClass($objet);
136
		$methode = $classe->getMethod($nomMethode);
137
		$methode->setAccessible(true);
138
		return $methode;
139
	}
140
 
141
	/**
142
	* Récupère une méthode protégée d'une classe pour tester/documenter.
143
	* Comment l'utiliser :
949 raphael 144
	*	MyClass->foo():
145
	*	$cls = new MyClass();
146
	*	$foo = self::getProtectedMethode($cls, 'foo');
147
	*	$foo->invoke($cls, $...);
96 jpm 148
	* @param object $objet Une instance de votre classe
149
	* @param string $methode Le nom de la méthode protected
150
	* @return ReflectionMethod La méthode demandée
151
	*/
152
	public static function getMethodeProtegee($objet, $nomMethode) {
153
		return self::getMethodePrivee($objet, $nomMethode);
154
	}
949 raphael 155
 
156
	public function assertArrayHasKeys(array $keys, array $array, $message = null) {
157
		foreach ($keys as $key) {
158
			$this->assertArrayHasKey($key, $array, $message);
159
		}
160
	}
96 jpm 161
}
790 raphael 162
 
163
/*
164
sed -i 's/$this->consulterBrut(/ServiceEflorePhpUnit::consulterBrut($this->service, $this->projet, /' $(grep -rl consulterBrut)
165
sed -i 's/$this->consulterJson(/$this->consulterJson($this->service, $this->projet, /' $(grep -rl consulterJson)
166
sed -i 's/$this->creerUrl(/ServiceEflorePhpUnit::creerUrl($this->service, /' $(grep -rl creerUrl)
167
*/
168
?>