setBrowser("firefox"); $this->setBrowserUrl("http://localhost/"); $this->setPort(SELENIUM_PORT); //$this->setSleep(1); } protected function tearDown() { } protected function connect($login, $password) { $this->open(BASE_PATH_URL); $this->type("id=login", $login); $this->type("id=password", $password); $this->click("name=login.action.connect"); $this->waitForPageToLoad("30000"); } protected function deconnect() { $this->click("link=Déconnexion"); $this->waitForPageToLoad("30000"); } protected function login($login, $password) { // on commence par se connecter $this->connect($login, $password); // On vérifie qu'il n'y a pas d'erreur sur l'élément affiché $this->verifyNoErrors(); // On doit être connecté $this->assertTrue($this->isTextPresent("Votre session est maintenant ouverte.")); } protected function logout() { // puis on se déconnecte $this->deconnect(); // On vérifie qu'il n'y a pas d'erreur sur l'élément affiché $this->verifyNoErrors(); // on doit avoir un message nous indiquant que la session est finie $this->assertTrue($this->isTextPresent("Votre session est maintenant terminée.")); // on ne doit plus avoir de lien de déconnexion $this->assertFalse($this->isElementPresent("link=Déconnexion")); } /** * Cette méthode permet de fair un assert sur la NON présence d'un message * indiquant une erreur de base de données ou une notice PHP */ public function verifyNoErrors() { try { $this->assertFalse($this->isTextPresent("Erreur de base de données. Contactez votre administrateur.")); } catch (PHPUnit_Framework_AssertionFailedError $e) { array_push($this->verificationErrors, "Erreur de base de données."); } try { $this->assertFalse($this->isTextPresent("Parse error:")); } catch (PHPUnit_Framework_AssertionFailedError $e) { array_push($this->verificationErrors, "PHP Parse error:"); } try { $this->assertFalse($this->isTextPresent("Fatal error:")); } catch (PHPUnit_Framework_AssertionFailedError $e) { array_push($this->verificationErrors, "PHP Fatal error:"); } try { $this->assertFalse($this->isTextPresent("Notice:")); } catch (PHPUnit_Framework_AssertionFailedError $e) { array_push($this->verificationErrors, "PHP Notice:"); } } } /** * Cette classe est une classe de base à utiliser par les tests (thèmes) * fonctionnels utilisant Selenium2 pour avoir les méthodes communes setUp, * tearDown ainsi que certaines méthodes utilitaires comme login, logout, ou * verifiynoerrors... */ class Base2TestCase extends PHPUnit_Extensions_Selenium2TestCase { /** * Url de base * @var string */ var $url = BASE_PATH_URL; /** * Chemin dossier des screenshots * @var string */ var $screenshotPath = ''; /** * Option capture d'écran * @var boolean */ var $screenshotOnFailureAndError = true; /** * Cette méthode est appelée avant le lancement de chaque test * (fonctionnalité). */ protected function setUp() { $this->screenshotPath = '/var/www/'.BASE_PATH_URL.'tests/results/'; // On positionne le navigateur $this->setBrowser("firefox"); //$this->setBrowser("chrome"); // On positionne l'URL de base $this->setBrowserUrl("http://localhost/"); $this->setPort(SELENIUM_PORT); // Instancie la timezone date_default_timezone_set('Europe/Paris'); } /** * Cette méthode est appelée après le lancement de chaque test * (fonctionnalité). */ protected function tearDown() { // Récupère le statut $status = $this->getStatus(); // Si l'option capture d'écran est activé et qu'il y a une erreur(error) // ou un echec(failure) if ($this->screenshotOnFailureAndError === true && ($status == PHPUnit_Runner_BaseTestRunner::STATUS_ERROR || $status == PHPUnit_Runner_BaseTestRunner::STATUS_FAILURE)) { // Si c'est une erreur if ($status == PHPUnit_Runner_BaseTestRunner::STATUS_ERROR) { $startFilename = "error_"; } // Si c'est un echec if ($status == PHPUnit_Runner_BaseTestRunner::STATUS_FAILURE) { $startFilename = "failure_"; } // Nom de l'image $filename = $startFilename.$this->getName()."_".date("Ymd_His").".png"; // Ajout de l'image file_put_contents($this->screenshotPath.$filename, $this->currentScreenshot()); } } /** * Cette méthode permet de connecter l'utilisateur à l'application. */ protected function connect($login, $password) { // On ouvre l'url openexemple $this->url($this->url); $this->timeouts()->implicitWait(2000); // On saisit le login dans le champ login $this->byId("login")->clear(); $this->byId("login")->value($login); // On saisit le mot de passe dans le champ mot de passe $this->byId("password")->clear(); $this->byId("password")->value($password); // On clique sur le bouton de connexion $this->byname("login.action.connect")->click(); } /** * Cette méthode permet de déconnecter l'utilisateur. */ protected function deconnect() { // On clique sur le lien de déconnexion $element = $this->bycssselector("a.actions-logout"); $element->click(); } /** * Cette méthode permet de connecter l'utilisateur à l'application et de * vérifier que la connecion s'est bien déroulée. */ protected function login($login, $password) { // On se connecte $this->connect($login, $password); // Allonge le temps d'attente lors de la recherche d'élément $this->timeouts()->implicitWait(10000); // On vérifie qu'il n'y a pas d'erreur sur l'élément affiché $this->verifynoerrors(); // On vérifie qu'un message nous indique que la session est ouverte $element = $this->bycssselector("div.message span.text"); $this->assertequals("Votre session est maintenant ouverte.", $element->text()); } /** * Cette méthode vérifier que la déconnexion s'est bien déroulée. */ protected function verifyDeconnect() { // Réduit le temps d'attente lors de la recherche d'élément $this->timeouts()->implicitWait(240); // On vérifie qu'il n'y a pas d'erreur sur l'élément affiché $this->verifynoerrors(); // On vérifie qu'un message nous indique que la session est terminée $element = $this->bycssselector("div.message span.text"); $this->assertequals("Votre session est maintenant terminée.", $element->text()); // On vérifie que le lien de déconnexion n'est pas présent try { $el = $this->bycssselector("a.actions-logout"); $this->fail("The element shouldn't exist."); } catch (RuntimeException $e) {} //Ferme la fenêtre $this->closeWindow(); } /** * Cette méthode permet de déconnecter l'utilisateur et de vérifier que la * déconnexion s'est bien déroulée. */ protected function logout() { // On se déconnecte $this->deconnect(); // On vérifie que la déconnexion s'est bien déroulée $this->verifyDeconnect(); } /** * Cette méthode permet de fair un assert sur la NON présence d'un message * indiquant une erreur de base de données ou une notice PHP. * XXX Remplacer les tests par des expressions régulières pour améliorer * les performances et être plus exhaustif */ public function verifynoerrors() { // On récupère le contenu du rendu de la page $source = $this->source(); // On vérifie la présence du message d'erreur de base de données try { $this->assertNotContains("Erreur de base de données. Contactez votre administrateur.", $source); $this->assertNotContains("Erreur de base de donnees. Contactez votre administrateur.", $source); } catch (PHPUnit_Framework_AssertionFailedError $e) { $this->fail("Failed asserting that the source does not contain \"Erreur de base de données\"."); } // On vérifie la présence d'une erreur fatale PHP try { $this->assertNotContains("Fatal error:", $source); } catch (PHPUnit_Framework_AssertionFailedError $e) { $this->fail("Failed asserting that the source does not contain \"PHP Fatal error:\"."); } // On vérifie la présence d'une erreur fatale PHP try { $this->assertNotContains("Fatal error", $source); } catch (PHPUnit_Framework_AssertionFailedError $e) { $this->fail("Failed asserting that the source does not contain \"PHP Fatal error:\"."); } // On vérifie la présence d'une erreur de syntaxe PHP try { $this->assertNotContains("Parse error:", $source); } catch (PHPUnit_Framework_AssertionFailedError $e) { $this->fail("Failed asserting that the source does not contain \"PHP Parse error:\"."); } // On vérifie la présence d'une erreur de syntaxe PHP try { $this->assertNotContains("Parse error", $source); } catch (PHPUnit_Framework_AssertionFailedError $e) { $this->fail("Failed asserting that the source does not contain \"PHP Parse error:\"."); } // On vérifie la présence d'une notice PHP try { $this->assertNotContains("Notice:", $source); } catch (PHPUnit_Framework_AssertionFailedError $e) { $this->fail("Failed asserting that the source does not contain \"PHP Notice:\"."); } // On vérifie la présence d'une notice PHP try { $this->assertNotContains("Notice", $source); } catch (PHPUnit_Framework_AssertionFailedError $e) { $this->fail("Failed asserting that the source does not contain \"PHP Notice:\"."); } } /** * Cette fonction permet de cliquer sur le menu si celui-ci n'est pas déjà * ouvert de base en fonction de l'utilisateur * @param string $menu Titre du menu * @param array $utilisateur Login et mdp de l'utilisateur */ public function openMenu($menu, $utilisateur) { // Si le menu est 'Guichet Unique' if ($menu == 'Guichet Unique') { // Vérifie les utilisateurs if ($utilisateur["login"] != "guichet") { // Clique sur le menu $this->byLinkText($menu)->click(); $this->verifyNoErrors(); } } // Si le menu est 'Instruction' if ($menu == 'Instruction') { // Vérifie les utilisateurs if ($utilisateur["login"] != "instr" && $utilisateur["login"] != "visudadi" && $utilisateur["login"] != "divi" && $utilisateur["login"] != "chef" && $utilisateur["login"] != "adminfonct") { // Clique sur le menu $this->byLinkText($menu)->click(); $this->verifyNoErrors(); } } // Si le menu est 'Suivi' if ($menu == 'Suivi') { // Vérifie les utilisateurs if ($utilisateur["login"] != "suivi") { // Clique sur le menu $this->byLinkText($menu)->click(); $this->verifyNoErrors(); } } // Si le menu est 'Demandes D'avis' if ($menu == "Demandes D'avis") { // Vérifie les utilisateurs if ($utilisateur["login"] != "consu" && $utilisateur["login"] != "consu1" && $utilisateur["login"] != "consu2") { // Clique sur le menu $this->byLinkText($menu)->click(); $this->verifyNoErrors(); } } } /** * COPIE DE LA FONCTION mois_date() DE LA CLASSE utils */ /** * Calcule uen date avec l'ajout ou le soustrait de mois. * @param date $date Date de base * @param integer $delay Délais à ajouter (en mois) * @param string $operator Opérateur pour le calcul ("-" ou "+") * * @return date Date calculée */ function mois_date($date, $delay, $operator = "+") { // Découpage de la date $temp = explode("-", $date); $day = (int) $temp[2]; $month = (int) $temp[1]; $year = (int) $temp[0]; // Si c'est une addition if ($operator == '+') { // Année à ajouter $year += floor($delay / 12); // Mois restant $nb_month = ($delay % 12); // S'il y a des mois restant if ($nb_month != 0) { // Ajout des mois restant $month += $nb_month; // Si ça dépasse le mois 12 (décembre) if ($month > 12) { // Soustrait 12 au mois $month -= 12; // Ajoute 1 à l'année $year += 1; } } } // Si c'est une soustraction if ($operator == "-") { // Année à soustraire $year -= floor($delay / 12); // Mois restant $nb_month = ($delay % 12); // S'il y a des mois restant if ($nb_month != 0) { // Soustrait le délais $month -= $nb_month; // Si ça dépasse le mois 1 (janvier) if ($month < 1) { // Soustrait 12 au mois $month += 12; // Ajoute 1 à l'année $year -= 1; } } } // Calcul du nombre de jours dans le mois sélectionné switch($month) { // Mois de février case "2": if ($year % 4 == 0 && $year % 100 != 0 || $year % 400 == 0) { $day_max = 29; } else { $day_max = 28; } break; // Mois d'avril, juin, septembre et novembre case "4": case "6": case "9": case "11": $day_max = 30; break; // Mois de janvier, mars, mai, juillet, août, octobre et décembre default: $day_max = 31; } // Si le jour est supérieur au jour maximum du mois if ($day > $day_max) { // Le jour devient le jour maximum $day = $day_max; } // Compléte le mois et le jour par un 0 à gauche si c'est un chiffre $month = str_pad($month, 2, "0", STR_PAD_LEFT); $day = str_pad($day, 2, "0", STR_PAD_LEFT); // Retourne la date calculée return $year."-".$month."-".$day ; } } ?>