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 ;
}
}
?>