TP6

Techniques mises en oeuvre

  1. Tests unitaires PHPUnit
  2. TDD (Test Driven Development)
  3. Refactoring (réusinage de code)
  4. envoi de mail

Expression des besoins

On veut pouvoir tester le site facilement, notamment pour s'assurer que les modifications apportées régulièrement au code source n'introduisent pas des régressions. On doit donc développer des batteries de tests unitaires UnitTestCase. On aimerait bien pouvoir tester aussi automatiquement tous les enchainements d'écran du site web en écrivant des test de recettes web WebTestCase.

Le responsable d'une application doit recevoir un courrier électronique lorsque qu'un ticket relatif à l'application dont il a la responsabilité est créé (le mail du responsable est aussi spécifié dans le fichier app.csv qui contient désormais par exemple :
1;Paye        ;paye@cnam.fr
2;Inscriptions;inscriptions@cnam.fr
3;mon appli   ;moi@cnam.fr
).

Travail demandé

Test Unitaire de la classe Product

Définir (dans un fichier appelé ProductTest.class.php, dans le même répertoire que Product.class.php) la classe de tests ProductTest. Cette classe doit définir les méthodes de test suivantes : testGetMail, testSetMail, testCheckMailWithValidLength, testCheckTooShortMail, testCheckMailWithoutArrobas, testCheckMailDomain, testCheckMailName, ....

Définir (dans un fichier Product.class.php) la classe Product qui a pour attributs les différentes infos associées à une application : id, name et mail.
Définir également dans cette classe Product un constructeur (Product($name, $mail, $id = -1)), les accesseurs getMail() et setMail($mail).

Important : le but est de développer la classe Product avec une approche TDD.

Implémenter la méthode checkMail itérativement, - en faisant (échouer puis) passer successivement les tests testCheckMailWithValidLength, testCheckTooLongMail,  testCheckMailWithoutArrobas, ...-,  ... et en respectant la documentation suivante:

 /**
  * check a mail address
  *
  * check the correctness of length, domain and contents
  * of a mail address
  *
  * @param string $mail mail address to check
  *   if this $mail parameter is '', check the mail
  *   atribute of the current object
  * @return boolean true if mail OK, false else
  */
 function checkMail($mail = '') {
  if ( $mail == '' )
   $mail = $this->mail;
  // 1. tests sur longueur
  // TODO

Plus précisément, une adresse mail (nom@domaine) sera considérée comme valable si elle vérifie chacune des conditions suivantes :
  1. sa longueur est supérieure à 10 et inférieure à 35,
  2. contient un arrobase '@',
  3. la partie domaine se termine par .fr,
  4. la partie nom ne contient que des lettres de a à z et/ou des points ou tirets (indication : utiliser le masque '/^[a-zA-Z.-]+$/'  avec preg_match).

Test Unitaire de la classe FileProductDAO

A l'image de la classe FileTicketDAO qui est responsable de lire/écrire dans un fichier csv les instances de Ticket, la classe FileProductDAO va permettre d'accéder à des instances de Product stokées dans le fichier texte app.csv .
Ecrire cette classe FileProductDAO qui satisfait le test unitaire FileProductDAOTest qui est fourni dans le fichier FileProductDAOTest.class.php .

Notez que FileProductDAO définit un constructeur ayant un paramètre optionnel : FileProductDAO($productFile='app.csv'), constructeur appelé par la classe de test :

class FileProductDAOTest extends UnitTestCase {
    private $dao; // fixture
    function setUp() {
        $this->dao = new FileProductDAO('app_test.csv');
    }

Le fichier app_test.csv utilisé par le test est le suivant :

1;Paye        ;paye@cnam.fr
2;Inscriptions;inscriptions@cnam.fr
3;mon appli   ;moi@cnam.fr

Refactoring de editTicket.php pour utiliser AppService

La page editTicket.php contient du code qu'on va déplacer vers la couche Service dans la classe AppService.

Dans la classe AppService définir l'attribut _productDAO (à initialiser dans le constructeur) et les nouvelles méthodes :
  1. getAppList() (à supprimer de editTicket.php et à adapter pour utiliser la classe FileProductDAO)
  2. getAllApplisAsOptions()  (à supprimer de editTicket.php et à adapter),
  3. getProductMailFromName($productName),
  4. sendMailForTicket($ticket).
Dans la page editTicket.php utiliser une méthode de la classe AppService pour initialiser $allApplisAsOptions.

Dans la page editTicketAction.php utiliser la méthode sendMailForTicket($ticket) de la classe AppService pour prévenir le responsable de l'application de la création d'un nouveau ticket.