/[openfoncier]/trunk/tests/base.php
ViewVC logotype

Annotation of /trunk/tests/base.php

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3730 - (hide annotations)
Fri Mar 18 11:50:26 2016 UTC (8 years, 10 months ago) by mbroquet
File size: 15938 byte(s)
Actualisation du trunk
1 mbroquet 3730 <?php
2     /**
3     * Ce script contient la déclaration des classes BaseTesCase et Base2TestCase.
4     *
5     * @package openfoncier
6     * @version SVN : $Id: base.php 4802 2015-05-27 14:13:05Z nhaye $
7     */
8    
9     class BaseTestCase extends PHPUnit_Extensions_SeleniumTestCase {
10    
11     protected function setUp() {
12     $this->setBrowser("firefox");
13     $this->setBrowserUrl("http://localhost/");
14     //$this->setSleep(1);
15     }
16    
17     protected function tearDown() {
18    
19     }
20    
21     protected function connect($login, $password) {
22     $this->open(BASE_PATH_URL);
23     $this->type("id=login", $login);
24     $this->type("id=password", $password);
25     $this->click("name=login.action.connect");
26     $this->waitForPageToLoad("30000");
27     }
28    
29     protected function deconnect() {
30     $this->click("link=Déconnexion");
31     $this->waitForPageToLoad("30000");
32     }
33    
34     protected function login($login, $password) {
35     // on commence par se connecter
36     $this->connect($login, $password);
37     // On vérifie qu'il n'y a pas d'erreur sur l'élément affiché
38     $this->verifyNoErrors();
39     // On doit être connecté
40     $this->assertTrue($this->isTextPresent("Votre session est maintenant ouverte."));
41     }
42    
43     protected function logout() {
44     // puis on se déconnecte
45     $this->deconnect();
46     // On vérifie qu'il n'y a pas d'erreur sur l'élément affiché
47     $this->verifyNoErrors();
48     // on doit avoir un message nous indiquant que la session est finie
49     $this->assertTrue($this->isTextPresent("Votre session est maintenant terminée."));
50     // on ne doit plus avoir de lien de déconnexion
51     $this->assertFalse($this->isElementPresent("link=Déconnexion"));
52     }
53    
54     /**
55     * Cette méthode permet de fair un assert sur la NON présence d'un message
56     * indiquant une erreur de base de données ou une notice PHP
57     */
58     public function verifyNoErrors() {
59     try {
60     $this->assertFalse($this->isTextPresent("Erreur de base de données. Contactez votre administrateur."));
61     } catch (PHPUnit_Framework_AssertionFailedError $e) {
62     array_push($this->verificationErrors, "Erreur de base de données.");
63     }
64     try {
65     $this->assertFalse($this->isTextPresent("Parse error:"));
66     } catch (PHPUnit_Framework_AssertionFailedError $e) {
67     array_push($this->verificationErrors, "PHP Parse error:");
68     }
69     try {
70     $this->assertFalse($this->isTextPresent("Fatal error:"));
71     } catch (PHPUnit_Framework_AssertionFailedError $e) {
72     array_push($this->verificationErrors, "PHP Fatal error:");
73     }
74     try {
75     $this->assertFalse($this->isTextPresent("Notice:"));
76     } catch (PHPUnit_Framework_AssertionFailedError $e) {
77     array_push($this->verificationErrors, "PHP Notice:");
78     }
79     }
80    
81     }
82    
83     /**
84     * Cette classe est une classe de base à utiliser par les tests (thèmes)
85     * fonctionnels utilisant Selenium2 pour avoir les méthodes communes setUp,
86     * tearDown ainsi que certaines méthodes utilitaires comme login, logout, ou
87     * verifiynoerrors...
88     */
89     class Base2TestCase extends PHPUnit_Extensions_Selenium2TestCase {
90    
91     /**
92     * Url de base
93     * @var string
94     */
95     var $url = BASE_PATH_URL;
96    
97     /**
98     * Chemin dossier des screenshots
99     * @var string
100     */
101     var $screenshotPath = '';
102    
103     /**
104     * Option capture d'écran
105     * @var boolean
106     */
107     var $screenshotOnFailureAndError = true;
108    
109     /**
110     * Cette méthode est appelée avant le lancement de chaque test
111     * (fonctionnalité).
112     */
113     protected function setUp() {
114     $this->screenshotPath = '/var/www/'.BASE_PATH_URL.'tests/results/';
115     // On positionne le navigateur
116     $this->setBrowser("firefox");
117     //$this->setBrowser("chrome");
118     // On positionne l'URL de base
119     $this->setBrowserUrl("http://localhost/");
120     $this->setPort(SELENIUM_PORT);
121     // Instancie la timezone
122     date_default_timezone_set('Europe/Paris');
123     }
124    
125     /**
126     * Cette méthode est appelée après le lancement de chaque test
127     * (fonctionnalité).
128     */
129     protected function tearDown() {
130    
131     // Récupère le statut
132     $status = $this->getStatus();
133     // Si l'option capture d'écran est activé et qu'il y a une erreur(error)
134     // ou un echec(failure)
135     if ($this->screenshotOnFailureAndError === true
136     && ($status == PHPUnit_Runner_BaseTestRunner::STATUS_ERROR
137     || $status == PHPUnit_Runner_BaseTestRunner::STATUS_FAILURE)) {
138     // Si c'est une erreur
139     if ($status == PHPUnit_Runner_BaseTestRunner::STATUS_ERROR) {
140     $startFilename = "error_";
141     }
142     // Si c'est un echec
143     if ($status == PHPUnit_Runner_BaseTestRunner::STATUS_FAILURE) {
144     $startFilename = "failure_";
145     }
146     // Nom de l'image
147     $filename = $startFilename.$this->getName()."_".date("Ymd_His").".png";
148     // Ajout de l'image
149     file_put_contents($this->screenshotPath.$filename,
150     $this->currentScreenshot());
151     }
152     }
153    
154     /**
155     * Cette méthode permet de connecter l'utilisateur à l'application.
156     */
157     protected function connect($login, $password) {
158     // On ouvre l'url openexemple
159     $this->url($this->url);
160     $this->timeouts()->implicitWait(2000);
161     // On saisit le login dans le champ login
162     $this->byId("login")->clear();
163     $this->byId("login")->value($login);
164     // On saisit le mot de passe dans le champ mot de passe
165     $this->byId("password")->clear();
166     $this->byId("password")->value($password);
167     // On clique sur le bouton de connexion
168     $this->byname("login.action.connect")->click();
169     }
170    
171     /**
172     * Cette méthode permet de déconnecter l'utilisateur.
173     */
174     protected function deconnect() {
175     // On clique sur le lien de déconnexion
176     $element = $this->bycssselector("a.actions-logout");
177     $element->click();
178     }
179    
180     /**
181     * Cette méthode permet de connecter l'utilisateur à l'application et de
182     * vérifier que la connecion s'est bien déroulée.
183     */
184     protected function login($login, $password) {
185     // On se connecte
186     $this->connect($login, $password);
187     // Allonge le temps d'attente lors de la recherche d'élément
188     $this->timeouts()->implicitWait(10000);
189     // On vérifie qu'il n'y a pas d'erreur sur l'élément affiché
190     $this->verifynoerrors();
191     // On vérifie qu'un message nous indique que la session est ouverte
192     $element = $this->bycssselector("div.message span.text");
193     $this->assertequals("Votre session est maintenant ouverte.", $element->text());
194     }
195    
196     /**
197     * Cette méthode vérifier que la déconnexion s'est bien déroulée.
198     */
199     protected function verifyDeconnect() {
200     // Réduit le temps d'attente lors de la recherche d'élément
201     $this->timeouts()->implicitWait(240);
202     // On vérifie qu'il n'y a pas d'erreur sur l'élément affiché
203     $this->verifynoerrors();
204     // On vérifie qu'un message nous indique que la session est terminée
205     $element = $this->bycssselector("div.message span.text");
206     $this->assertequals("Votre session est maintenant terminée.", $element->text());
207     // On vérifie que le lien de déconnexion n'est pas présent
208     try {
209     $el = $this->bycssselector("a.actions-logout");
210     $this->fail("The element shouldn't exist.");
211     } catch (RuntimeException $e) {}
212     //Ferme la fenêtre
213     $this->closeWindow();
214     }
215    
216     /**
217     * Cette méthode permet de déconnecter l'utilisateur et de vérifier que la
218     * déconnexion s'est bien déroulée.
219     */
220     protected function logout() {
221     // On se déconnecte
222     $this->deconnect();
223     // On vérifie que la déconnexion s'est bien déroulée
224     $this->verifyDeconnect();
225     }
226    
227     /**
228     * Cette méthode permet de fair un assert sur la NON présence d'un message
229     * indiquant une erreur de base de données ou une notice PHP.
230     * XXX Remplacer les tests par des expressions régulières pour améliorer
231     * les performances et être plus exhaustif
232     */
233     public function verifynoerrors() {
234     // On récupère le contenu du rendu de la page
235     $source = $this->source();
236     // On vérifie la présence du message d'erreur de base de données
237     try {
238     $this->assertNotContains("Erreur de base de données. Contactez votre administrateur.", $source);
239     $this->assertNotContains("Erreur de base de donnees. Contactez votre administrateur.", $source);
240     } catch (PHPUnit_Framework_AssertionFailedError $e) {
241     $this->fail("Failed asserting that the source does not contain \"Erreur de base de données\".");
242     }
243     // On vérifie la présence d'une erreur fatale PHP
244     try {
245     $this->assertNotContains("Fatal error:", $source);
246     } catch (PHPUnit_Framework_AssertionFailedError $e) {
247     $this->fail("Failed asserting that the source does not contain \"PHP Fatal error:\".");
248     }
249     // On vérifie la présence d'une erreur fatale PHP
250     try {
251     $this->assertNotContains("<b>Fatal error</b>", $source);
252     } catch (PHPUnit_Framework_AssertionFailedError $e) {
253     $this->fail("Failed asserting that the source does not contain \"PHP Fatal error:\".");
254     }
255     // On vérifie la présence d'une erreur de syntaxe PHP
256     try {
257     $this->assertNotContains("Parse error:", $source);
258     } catch (PHPUnit_Framework_AssertionFailedError $e) {
259     $this->fail("Failed asserting that the source does not contain \"PHP Parse error:\".");
260     }
261     // On vérifie la présence d'une erreur de syntaxe PHP
262     try {
263     $this->assertNotContains("<b>Parse error</b>", $source);
264     } catch (PHPUnit_Framework_AssertionFailedError $e) {
265     $this->fail("Failed asserting that the source does not contain \"PHP Parse error:\".");
266     }
267     // On vérifie la présence d'une notice PHP
268     try {
269     $this->assertNotContains("Notice:", $source);
270     } catch (PHPUnit_Framework_AssertionFailedError $e) {
271     $this->fail("Failed asserting that the source does not contain \"PHP Notice:\".");
272     }
273     // On vérifie la présence d'une notice PHP
274     try {
275     $this->assertNotContains("<b>Notice</b>", $source);
276     } catch (PHPUnit_Framework_AssertionFailedError $e) {
277     $this->fail("Failed asserting that the source does not contain \"PHP Notice:\".");
278     }
279     }
280    
281     /**
282     * Cette fonction permet de cliquer sur le menu si celui-ci n'est pas déjà
283     * ouvert de base en fonction de l'utilisateur
284     * @param string $menu Titre du menu
285     * @param array $utilisateur Login et mdp de l'utilisateur
286     */
287     public function openMenu($menu, $utilisateur) {
288     // Si le menu est 'Guichet Unique'
289     if ($menu == 'Guichet Unique') {
290     // Vérifie les utilisateurs
291     if ($utilisateur["login"] != "guichet") {
292     // Clique sur le menu
293     $this->byLinkText($menu)->click();
294     $this->verifyNoErrors();
295     }
296     }
297     // Si le menu est 'Instruction'
298     if ($menu == 'Instruction') {
299     // Vérifie les utilisateurs
300     if ($utilisateur["login"] != "instr"
301     && $utilisateur["login"] != "visudadi"
302     && $utilisateur["login"] != "divi"
303     && $utilisateur["login"] != "chef"
304     && $utilisateur["login"] != "adminfonct") {
305     // Clique sur le menu
306     $this->byLinkText($menu)->click();
307     $this->verifyNoErrors();
308     }
309     }
310     // Si le menu est 'Suivi'
311     if ($menu == 'Suivi') {
312     // Vérifie les utilisateurs
313     if ($utilisateur["login"] != "suivi") {
314     // Clique sur le menu
315     $this->byLinkText($menu)->click();
316     $this->verifyNoErrors();
317     }
318     }
319     // Si le menu est 'Demandes D'avis'
320     if ($menu == "Demandes D'avis") {
321     // Vérifie les utilisateurs
322     if ($utilisateur["login"] != "consu"
323     && $utilisateur["login"] != "consu1"
324     && $utilisateur["login"] != "consu2") {
325     // Clique sur le menu
326     $this->byLinkText($menu)->click();
327     $this->verifyNoErrors();
328     }
329     }
330     }
331    
332     /**
333     * COPIE DE LA FONCTION mois_date() DE LA CLASSE utils
334     */
335     /**
336     * Calcule uen date avec l'ajout ou le soustrait de mois.
337     * @param date $date Date de base
338     * @param integer $delay Délais à ajouter (en mois)
339     * @param string $operator Opérateur pour le calcul ("-" ou "+")
340     *
341     * @return date Date calculée
342     */
343     function mois_date($date, $delay, $operator = "+") {
344    
345     // Découpage de la date
346     $temp = explode("-", $date);
347     $day = (int) $temp[2];
348     $month = (int) $temp[1];
349     $year = (int) $temp[0];
350    
351     // Si c'est une addition
352     if ($operator == '+') {
353     // Année à ajouter
354     $year += floor($delay / 12);
355     // Mois restant
356     $nb_month = ($delay % 12);
357     // S'il y a des mois restant
358     if ($nb_month != 0) {
359     // Ajout des mois restant
360     $month += $nb_month;
361     // Si ça dépasse le mois 12 (décembre)
362     if ($month > 12) {
363     // Soustrait 12 au mois
364     $month -= 12;
365     // Ajoute 1 à l'année
366     $year += 1;
367     }
368     }
369     }
370    
371     // Si c'est une soustraction
372     if ($operator == "-") {
373     // Année à soustraire
374     $year -= floor($delay / 12);
375     // Mois restant
376     $nb_month = ($delay % 12);
377     // S'il y a des mois restant
378     if ($nb_month != 0) {
379     // Soustrait le délais
380     $month -= $nb_month;
381     // Si ça dépasse le mois 1 (janvier)
382     if ($month < 1) {
383     // Soustrait 12 au mois
384     $month += 12;
385     // Ajoute 1 à l'année
386     $year -= 1;
387     }
388     }
389     }
390    
391     // Calcul du nombre de jours dans le mois sélectionné
392     switch($month) {
393     // Mois de février
394     case "2":
395     if ($year % 4 == 0 && $year % 100 != 0 || $year % 400 == 0) {
396     $day_max = 29;
397     } else {
398     $day_max = 28;
399     }
400     break;
401     // Mois d'avril, juin, septembre et novembre
402     case "4":
403     case "6":
404     case "9":
405     case "11":
406     $day_max = 30;
407     break;
408     // Mois de janvier, mars, mai, juillet, août, octobre et décembre
409     default:
410     $day_max = 31;
411     }
412    
413     // Si le jour est supérieur au jour maximum du mois
414     if ($day > $day_max) {
415     // Le jour devient le jour maximum
416     $day = $day_max;
417     }
418    
419     // Compléte le mois et le jour par un 0 à gauche si c'est un chiffre
420     $month = str_pad($month, 2, "0", STR_PAD_LEFT);
421     $day = str_pad($day, 2, "0", STR_PAD_LEFT);
422    
423     // Retourne la date calculée
424     return $year."-".$month."-".$day ;
425     }
426    
427     }
428    
429     ?>

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26