/[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 2771 by softime, Tue Feb 25 14:56:56 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            // On clique sur le bouton de connexion
163            $this->byname("login.action.connect")->click();
164        }
165    
166        /**
167         * Cette méthode permet de déconnecter l'utilisateur.
168         */
169        protected function deconnect() {
170            // On clique sur le lien de déconnexion
171            $element = $this->bycssselector("a.actions-logout");
172            $element->click();
173        }
174    
175        /**
176         * Cette méthode permet de connecter l'utilisateur à l'application et de
177         * vérifier que la connecion s'est bien déroulée.
178         */
179        protected function login($login, $password) {
180            // On se connecte
181            $this->connect($login,  $password);
182            // Allonge le temps d'attente lors de la recherche d'élément
183            $this->timeouts()->implicitWait(10000);
184            // On vérifie qu'il n'y a pas d'erreur sur l'élément affiché
185            $this->verifynoerrors();
186            // On vérifie qu'un message nous indique que la session est ouverte
187            $element = $this->bycssselector("div.message span.text");
188            $this->assertequals("Votre session est maintenant ouverte.", $element->text());
189        }
190    
191        /**
192         * Cette méthode vérifier que la déconnexion s'est bien déroulée.
193         */
194        protected function verifyDeconnect() {
195            // Réduit le temps d'attente lors de la recherche d'élément
196            $this->timeouts()->implicitWait(240);
197            // On vérifie qu'il n'y a pas d'erreur sur l'élément affiché
198            $this->verifynoerrors();
199            // On vérifie qu'un message nous indique que la session est terminée
200            $element = $this->bycssselector("div.message span.text");
201            $this->assertequals("Votre session est maintenant terminée.", $element->text());
202            // On vérifie que le lien de déconnexion n'est pas présent
203            try {
204                $el = $this->bycssselector("a.actions-logout");
205                $this->fail("The element shouldn't exist.");
206            } catch (RuntimeException $e) {}
207            //Ferme la fenêtre
208            $this->closeWindow();
209        }
210    
211        /**
212         * Cette méthode permet de déconnecter l'utilisateur et de vérifier que la
213         * déconnexion s'est bien déroulée.
214         */
215        protected function logout() {
216            // On se déconnecte
217            $this->deconnect();
218            // On vérifie que la déconnexion s'est bien déroulée
219            $this->verifyDeconnect();
220        }
221    
222        /**
223         * Cette méthode permet de fair un assert sur la NON présence d'un message
224         * indiquant une erreur de base de données ou une notice PHP.
225         * XXX Remplacer les tests par des expressions régulières pour améliorer
226         *     les performances et être plus exhaustif
227         */
228        public function verifynoerrors() {
229            // On récupère le contenu du rendu de la page
230            $source = $this->source();
231            // On vérifie la présence du message d'erreur de base de données
232            try {
233                $this->assertNotContains("Erreur de base de données. Contactez votre administrateur.", $source);
234                $this->assertNotContains("Erreur de base de donnees. Contactez votre administrateur.", $source);
235            } catch (PHPUnit_Framework_AssertionFailedError $e) {
236                $this->fail("Failed asserting that the source does not contain \"Erreur de base de données\".");
237            }
238            // On vérifie la présence d'une erreur fatale PHP
239            try {
240                $this->assertNotContains("Fatal error:", $source);
241            } catch (PHPUnit_Framework_AssertionFailedError $e) {
242                $this->fail("Failed asserting that the source does not contain \"PHP Fatal error:\".");
243            }
244            // On vérifie la présence d'une erreur fatale PHP
245            try {
246                $this->assertNotContains("<b>Fatal error</b>", $source);
247            } catch (PHPUnit_Framework_AssertionFailedError $e) {
248                $this->fail("Failed asserting that the source does not contain \"PHP Fatal error:\".");
249            }
250            // On vérifie la présence d'une erreur de syntaxe PHP
251            try {
252                $this->assertNotContains("Parse error:", $source);
253            } catch (PHPUnit_Framework_AssertionFailedError $e) {
254                $this->fail("Failed asserting that the source does not contain \"PHP Parse error:\".");
255            }
256            // On vérifie la présence d'une erreur de syntaxe PHP
257            try {
258                $this->assertNotContains("<b>Parse error</b>", $source);
259            } catch (PHPUnit_Framework_AssertionFailedError $e) {
260                $this->fail("Failed asserting that the source does not contain \"PHP Parse error:\".");
261            }
262            // On vérifie la présence d'une notice PHP
263            try {
264                $this->assertNotContains("Notice:", $source);
265            } catch (PHPUnit_Framework_AssertionFailedError $e) {
266                $this->fail("Failed asserting that the source does not contain \"PHP Notice:\".");
267            }
268            // On vérifie la présence d'une notice PHP
269            try {
270                $this->assertNotContains("<b>Notice</b>", $source);
271            } catch (PHPUnit_Framework_AssertionFailedError $e) {
272                $this->fail("Failed asserting that the source does not contain \"PHP Notice:\".");
273            }
274        }
275    
276        /**
277         * Cette fonction permet de cliquer sur le menu si celui-ci n'est pas déjà
278         * ouvert de base en fonction de l'utilisateur
279         * @param  string   $menu           Titre du menu
280         * @param  array    $utilisateur    Login et mdp de l'utilisateur
281         */
282        public function openMenu($menu, $utilisateur) {
283            // Si le menu est 'Guichet Unique'
284            if ($menu == 'Guichet Unique') {
285                // Vérifie les utilisateurs
286                if ($utilisateur["login"] != "guichet") {
287                    // Clique sur le menu
288                    $this->byLinkText($menu)->click();
289                    $this->verifyNoErrors();
290                }
291            }
292            // Si le menu est 'Instruction'
293            if ($menu == 'Instruction') {
294                // Vérifie les utilisateurs
295                if ($utilisateur["login"] != "instr"
296                    && $utilisateur["login"] != "visudadi"
297                    && $utilisateur["login"] != "divi"
298                    && $utilisateur["login"] != "chef"
299                    && $utilisateur["login"] != "adminfonct") {
300                    // Clique sur le menu
301                    $this->byLinkText($menu)->click();
302                    $this->verifyNoErrors();
303                }
304            }
305            // Si le menu est 'Suivi'
306            if ($menu == 'Suivi') {
307                // Vérifie les utilisateurs
308                if ($utilisateur["login"] != "suivi") {
309                    // Clique sur le menu
310                    $this->byLinkText($menu)->click();
311                    $this->verifyNoErrors();
312                }
313            }
314            // Si le menu est 'Demandes D'avis'
315            if ($menu == "Demandes D'avis") {
316                //  Vérifie les utilisateurs
317                if ($utilisateur["login"] != "consu"
318                    && $utilisateur["login"] != "consu1"
319                    && $utilisateur["login"] != "consu2") {
320                    // Clique sur le menu
321                    $this->byLinkText($menu)->click();
322                    $this->verifyNoErrors();
323                }
324            }
325        }
326    
327        /**
328         * COPIE DE LA FONCTION mois_date() DE LA CLASSE utils
329         */
330        /**
331         * Calcule uen date avec l'ajout ou le soustrait de mois.
332         * @param date    $date     Date de base
333         * @param integer $delay    Délais à ajouter (en mois)
334         * @param string  $operator Opérateur pour le calcul ("-" ou "+")
335         *
336         * @return date             Date calculée
337         */
338        function mois_date($date, $delay, $operator = "+") {
339    
340            // Découpage de la date
341            $temp = explode("-" , $date);
342            $day = (int) $temp[2];
343            $month = (int) $temp[1];
344            $year = (int) $temp[0];
345    
346            // Si c'est une addition
347            if ($operator == '+') {
348                // Si le délais est supérieur à 12 mois
349                if ($delay >= 12) {
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                } else {
367                    // Ajoute le délais
368                    $month += $delay;
369                    // Si ça dépasse le mois 12 (décembre)
370                    if ($month > 12) {
371                        // Soustrait 12 au mois
372                        $month -= 12;
373                        // Ajoute 1 à l'année
374                        $year += 1;
375                    }
376                }
377            }
378    
379            // Si c'est une soustraction
380            if ($operator == "-") {
381                // Si le délais est supérieur à 12 mois
382                if ($delay >= 12) {
383                    // Année à soustraire
384                    $year -= floor($delay / 12);
385                    // Mois restant
386                    $nb_month = ($delay % 12);
387                    // S'il y a des mois restant
388                    if ($nb_month != 0) {
389                        // Soustrait le délais
390                        $month -= $nb_month;
391                        // Si ça dépasse le mois 1 (janvier)
392                        if ($month < 1) {
393                            // Soustrait 12 au mois
394                            $month += 12;
395                            // Ajoute 1 à l'année
396                            $year -= 1;
397                        }
398                    }
399                } else {
400                    // Soustrait le délais
401                    $month -= $delay;
402                    // Si ça dépasse le mois 1 (janvier)
403                    if ($month < 1) {
404                        // Soustrait 12 au mois
405                        $month += 12;
406                        // Ajoute 1 à l'année
407                        $year -= 1;
408                    }
409                }
410            }
411    
412            // Calcul du nombre de jours dans le mois sélectionné
413            switch($month) {
414                // Mois de février
415                case "2":
416                    if ($year % 4 == 0 && $year % 100 != 0 || $year % 400 == 0) {
417                        $day_max = 29;
418                    } else {
419                        $day_max = 28;
420                    }
421                break;
422                // Mois d'avril, juin, septembre et novembre
423                case "4":
424                case "6":
425                case "9":
426                case "11":
427                    $day_max = 30;
428                break;
429                // Mois de janvier, mars, mai, juillet, août, octobre et décembre
430                default:
431                    $day_max = 31;
432            }
433    
434            // Si le jour est supérieur au jour maximum du mois
435            if ($day > $day_max) {
436                // Le jour devient le jour maximum
437                $day = $day_max;
438            }
439    
440            // Retourne la date calculée
441            return $year."-".$month."-".$day ;
442        }
443    
444  }  }
445    
446  ?>  ?>

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26