/[openfoncier]/branches/3.14.x/tests/base.php
ViewVC logotype

Diff of /branches/3.14.x/tests/base.php

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

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

Legend:
Removed from v.1649  
changed lines
  Added in v.3164

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26