Subversion Repositories eFlore/Applications.del

Rev

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

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