Skip to content
Snippets Groups Projects
AbonneControllerNewslettersTest.php 17.6 KiB
Newer Older
llaffont's avatar
llaffont committed
<?php
/**
 * Copyright (c) 2012, Agence Française Informatique (AFI). All rights reserved.
 *
Laurent's avatar
Laurent committed
 * BOKEH is free software; you can redistribute it and/or modify
llaffont's avatar
llaffont committed
 * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
 * the Free Software Foundation.
 *
 * There are special exceptions to the terms and conditions of the AGPL as it
 * is applied to this software (see README file).
 *
Laurent's avatar
Laurent committed
 * BOKEH is distributed in the hope that it will be useful,
llaffont's avatar
llaffont committed
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
 *
 * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
Laurent's avatar
Laurent committed
 * along with BOKEH; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
llaffont's avatar
llaffont committed
 */
require_once 'AbstractControllerTestCase.php';


abstract class AbstractAbonneControllerNewslettersTestCase extends AbstractControllerTestCase {
  protected $_storm_default_to_volatile=true;
Patrick Barroca's avatar
Patrick Barroca committed
  public function setUp() {
    parent::setUp();

    Class_AdminVar::newInstanceWithId('CHAMPS_FICHE_UTILISATEUR',
                                      ['valeur' => 'pseudo;nom;prenom;mail;password']);


    $this->marcus = $this->fixture('Class_Users',['id'=> 10,
                                                  'prenom' => 'Marcus',
                                                  'nom' => 'Miller',
                                                  'login' => 'mmiller' ,
                                                  'mail' => 'marcus@gmail.com',
                                                  'pseudo' => 'mimi',
                                                  'password' => 'mysecret',
                                                  'date_debut' => null,
                                                  'role' => 'abonne_sigb',
                                                  'role_level' => 3,
                                                  'id_site' => 999,
                                                  'idabon' => '00123',
                                                  'fiche_SIGB' => ['type_comm' => 0,
                                                                   'nom_aff' => 'Marcus']
                                                  ]);
Patrick Barroca's avatar
Patrick Barroca committed


    ZendAfi_Auth::getInstance()->logUser($this->marcus);
  }
llaffont's avatar
llaffont committed
}


abstract class AbonneControllerWithTwoNewslettersTestCase extends AbstractAbonneControllerNewslettersTestCase {
Patrick Barroca's avatar
Patrick Barroca committed
  public function setUp() {
    parent::setUp();
Patrick Barroca's avatar
Patrick Barroca committed
    Class_NewsletterSubscription::beVolatile();
Patrick Barroca's avatar
Patrick Barroca committed
    $this->concerts = $this->fixture('Class_Newsletter',
                                     ['id' => 12,
                                      'titre' =>'Concerts',
                                      'contenu' => 'Festival jazz']);
Patrick Barroca's avatar
Patrick Barroca committed
    $this->visites = $this->fixture('Class_Newsletter',
                                    ['id' => 14,
                                     'titre' =>'Visites',
                                     'contenu' => 'du patrimoine']);
Patrick Barroca's avatar
Patrick Barroca committed
    $this->marcus->setNewsletters([$this->concerts])->save();
  }
class AbonneControllerNewslettersFicheActionWithNoExistingNewslettersTest extends AbstractAbonneControllerNewslettersTestCase {
Patrick Barroca's avatar
Patrick Barroca committed
  public function setUp() {
    parent::setUp();
Patrick Barroca's avatar
Patrick Barroca committed
    $this->dispatch('/opac/abonne');
  }
Patrick Barroca's avatar
Patrick Barroca committed
  public function testInfoAbonnementNewsletterConcerts () {
    $this->assertNotQueryContentContains('div.abonneFiche',
                                         "Vous n'êtes abonné à aucune lettre d'information");
  }
Patrick Barroca's avatar
Patrick Barroca committed
  public function testLinkToEditInformationsInfoAbonnements() {
    $this->assertNotXPathContentContains("//div[@class='abonneFiche']//a[@href='/abonne/edit']",
                                         'Modifier mes abonnements');
Patrick Barroca's avatar
Patrick Barroca committed
  }
Patrick Barroca's avatar
Patrick Barroca committed
  public function testEditFormDoNotShowSubscriptions() {
    $this->dispatch('/opac/abonne/edit');
    $this->assertAction('edit');
    $this->assertNotXPath("//form//input[@type='checkbox'][@name='subscriptions[]']");
    $this->assertNotXPath("//form//label[@for='subscriptions']");
  }
class AbonneControllerNewslettersFicheActionWithOneSubscriptionTest extends AbonneControllerWithTwoNewslettersTestCase {
Patrick Barroca's avatar
Patrick Barroca committed
  public function setUp() {
    parent::setUp();
    $this->fixture('Class_AdminVar', ['id' => 'INTERDIRE_MODIF_FICHE_ABONNE',
                                      'valeur' => '0']);
    $this->dispatch('/opac/abonne', true);
  }
Patrick Barroca's avatar
Patrick Barroca committed
  public function testForwardedToFiche() {
    $this->assertController('abonne');
    $this->assertAction('fiche');
  }
Patrick Barroca's avatar
Patrick Barroca committed
  public function testLinkToEditInformationsInTitle() {
    $this->assertXPathContentContains("//div[@class='abonneTitre']//a[@href='/abonne/edit']",
                                      'Modifier ma fiche',
                                      $this->_response->getBody());
Patrick Barroca's avatar
Patrick Barroca committed
  }
Patrick Barroca's avatar
Patrick Barroca committed
  public function testInfoAbonnementNewsletterConcerts () {
    $this->assertQueryContentContains('div.abonneFiche',
                                      "Vous êtes abonné à la lettre d'information: Concerts");
  }
llaffont's avatar
llaffont committed

Patrick Barroca's avatar
Patrick Barroca committed
  public function testIconeNewsletterDisplayed () {
    $this->assertXPath('//div[contains(@class, "abonneFiche")]//a[contains(@href, "/abonne/edit")]//img[contains(@src, "abonnes/newsletter.png")]');
  }
llaffont's avatar
llaffont committed


Patrick Barroca's avatar
Patrick Barroca committed
  public function testLinkToEditInformationsInfoAbonnements() {
    $this->assertXPathContentContains("//div[contains(@class, 'abonneFiche')]//a[@href='/abonne/edit']",
                                      'Modifier mes abonnements');
Patrick Barroca's avatar
Patrick Barroca committed
  }
class AbonneControllerNewslettersFicheActionWithTwoSubscriptionsTest extends AbonneControllerWithTwoNewslettersTestCase {
Patrick Barroca's avatar
Patrick Barroca committed
  public function setUp() {
    parent::setUp();
Patrick Barroca's avatar
Patrick Barroca committed
    $this->marcus->addNewsletter($this->visites)->save();
Patrick Barroca's avatar
Patrick Barroca committed
    $this->dispatch('/opac/abonne/fiche');
    $this->assertController('abonne');
    $this->assertAction('fiche');
  }
Patrick Barroca's avatar
Patrick Barroca committed
  public function testInfoAbonnementNewsletterConcertsEtVisites () {
    $this->assertQueryContentContains('div.abonneFiche',
                                      "Vous êtes abonné aux lettres d'information: Concerts, Visites");
  }
class AbonneControllerNewslettersFicheActionWithNoSubscriptionTest extends AbonneControllerWithTwoNewslettersTestCase {
Patrick Barroca's avatar
Patrick Barroca committed
  public function setUp() {
    parent::setUp();

    $this->marcus->setNewsletters(array());
    $this->dispatch('/opac/abonne/fiche');
    $this->assertController('abonne');
    $this->assertAction('fiche');
  }

  public function testInfoAbonnementNewsletterConcerts () {
    $this->assertQueryContentContains('div.abonneFiche',
                                      "Vous n'êtes abonné à aucune lettre d'information");
  }
class AbonneControllerNewslettersEditActionTest extends AbonneControllerWithTwoNewslettersTestCase {
Patrick Barroca's avatar
Patrick Barroca committed
  public function setUp() {
    parent::setUp();
Patrick Barroca's avatar
Patrick Barroca committed
    $this->aide_fiche_abonne = new Class_AdminVar();
    $this->aide_fiche_abonne
      ->setId('AIDE_FICHE_ABONNE')
      ->setValeur("Saisissez\nvos données");
    Class_AdminVar::getLoader()
      ->cacheInstance($this->aide_fiche_abonne);
    $this->fixture('Class_Newsletter',
                   ['id' => 5,
                    'titre' => 'hidden newsletter',
                    'draft' => true]);
Patrick Barroca's avatar
Patrick Barroca committed
    $this->dispatch('/opac/abonne/edit');
  }
Patrick Barroca's avatar
Patrick Barroca committed
  public function testNewsletterActionFound() {
    $this->assertController('abonne');
    $this->assertAction('edit');
  }
Patrick Barroca's avatar
Patrick Barroca committed
  public function testAideIsDisplayed() {
    $this->assertContains("<div class='help'>Saisissez<br />\nvos données</div>", $this->_response->getBody());
  }
Patrick Barroca's avatar
Patrick Barroca committed
  public function testUserForm() {
    $this->assertXPath("//form[@id='user'][@method='post'][@action='/abonne/edit/id/10']");
  }
Patrick Barroca's avatar
Patrick Barroca committed
  public function testConcertsInCheckbox() {
    $this->assertXPathContentContains("//form//input[@type='checkbox'][@name='subscriptions[]'][@value=12]/..",
                                      'Concerts');
  }
Patrick Barroca's avatar
Patrick Barroca committed
  public function testConcertsIsChecked() {
    $this->assertXPath("//form//input[@type='checkbox'][@name='subscriptions[]'][@value=12][@checked]");
  }
Patrick Barroca's avatar
Patrick Barroca committed
  public function testVisitesInCheckbox() {
    $this->assertXPathContentContains("//form//input[@type='checkbox'][@name='subscriptions[]'][@value=14]/..",
                                      'Visites');
  }
Patrick Barroca's avatar
Patrick Barroca committed
  public function testVisitesIsNotChecked() {
    $this->assertNotXPath("//form//input[@type='checkbox'][@name='subscriptions[]'][@value=14][@checked]");
  }
Patrick Barroca's avatar
Patrick Barroca committed
  public function testEmailField() {
    $this->assertXPath("//form//input[@id='mail'][@value='marcus@gmail.com']");
  }
Patrick Barroca's avatar
Patrick Barroca committed
  public function testNomField() {
    $this->assertXPath("//form//input[@id='nom'][@value='Miller']");
  }
Patrick Barroca's avatar
Patrick Barroca committed
  public function testPrenomField() {
    $this->assertXPath("//form//input[@id='prenom'][@value='Marcus']");
  }
Patrick Barroca's avatar
Patrick Barroca committed
  public function testPseudoField() {
    $this->assertXPath("//form//input[@id='pseudo'][@value='mimi']");
  }
Patrick Barroca's avatar
Patrick Barroca committed
  public function testSubmitButton() {
    $this->assertXPath("//table//div[contains(@onclick, 'form.submit()')]");
  }
Patrick Barroca's avatar
Patrick Barroca committed
  public function testBackButton() {
    $this->assertXPath("//table//div[contains(@onclick, 'window.location.replace')]");
  }

  /** @test */
  public function hiddenNewsletterShouldNotBedisplayed() {
    $this->assertNotXPathContentContains("//form//input[@type='checkbox'][@name='subscriptions[]']/..",
                                         'hidden newsletter',$this->_response->getBody());
  }

class AbonneControllerNewslettersSaveActionTest extends AbonneControllerWithTwoNewslettersTestCase {
Patrick Barroca's avatar
Patrick Barroca committed
  public function setUp() {
    parent::setUp();

    $data = ['nom' => 'MILLER',
             'prenom' => 'MARCUS',
             'mail' => 'marcus@free.fr',
             'pseudo' => 'M2',
             'subscriptions' => [14],
             'password' => 'amstramgram',
             'confirm_password' => 'amstramgram'];
Patrick Barroca's avatar
Patrick Barroca committed

    $this->getRequest()
      ->setMethod('POST')
      ->setPost($data);

    $this->dispatch('/opac/abonne/edit', true);
  }

  /** @test */
  public function marcusShouldHaveBeenSaved() {
    $this->assertEquals($this->marcus, Class_Users::findFirstBy(['pseudo' => 'M2']));
Patrick Barroca's avatar
Patrick Barroca committed
  }

  public function testNomSetToMILLER() {
    $this->assertEquals('MILLER', $this->marcus->getNom());
  }

  public function testPrenomSetToMARCUS() {
    $this->assertEquals('MARCUS', $this->marcus->getPrenom());
  }

  public function testMailSetToMarcusAtFreeDotFr() {
    $this->assertEquals('marcus@free.fr', $this->marcus->getMail());
  }

  public function testPseudoSetToM2() {
    $this->assertEquals('M2', $this->marcus->getPseudo());
  }

  public function testPasswordSetToAmstramgram() {
    $this->assertEquals('amstramgram', $this->marcus->getPassword());
  }

  public function testNewslettersContainsVisites() {
    $this->assertEquals(array($this->visites), $this->marcus->getNewsletters());
  }

  public function testRedirectedToFiche() {
    $this->assertRedirectTo('/abonne/fiche', $this->_response->getBody());
  }
class AbonneControllerNewslettersSaveWithEmptyDataTest extends AbonneControllerWithTwoNewslettersTestCase {
Patrick Barroca's avatar
Patrick Barroca committed
  public function setUp() {
    parent::setUp();
Patrick Barroca's avatar
Patrick Barroca committed
    $this->getRequest()->setMethod('POST');
Patrick Barroca's avatar
Patrick Barroca committed
    $this->dispatch('/opac/abonne/edit');
  }
Patrick Barroca's avatar
Patrick Barroca committed
  /** @test */
  public function marcusShouldHaveBeenSaved() {
    $this->assertEquals($this->marcus, Class_Users::findFirstBy(['idabon' => '00123']));
Patrick Barroca's avatar
Patrick Barroca committed
  }
Patrick Barroca's avatar
Patrick Barroca committed
  public function testNoNewsletters() {
    $this->assertEquals(array(), $this->marcus->getNewsletters());
  }
Patrick Barroca's avatar
Patrick Barroca committed
  public function testPasswordNotChanged() {
    $this->assertEquals('mysecret', $this->marcus->getPassword());
  }
class AbonneControllerNewslettersOpsysCommunicationTest extends AbonneControllerWithTwoNewslettersTestCase {
Patrick Barroca's avatar
Patrick Barroca committed
  public function setUp() {
    parent::setUp();
Patrick Barroca's avatar
Patrick Barroca committed
    $this->opsys_service = $this->getMock('MockOpsysService', array('saveEmprunteur'));
    $this->emprunteur = new Class_WebService_SIGB_Emprunteur('00123', 'Marcus');
    $this->emprunteur->setService($this->opsys_service);
Patrick Barroca's avatar
Patrick Barroca committed
    $this->marcus->setFicheSIGB(array('type_comm' => Class_IntBib::COM_OPSYS,
                                      'fiche' => $this->emprunteur,
                                      'nom_aff' => 'Marcus'));
Patrick Barroca's avatar
Patrick Barroca committed
  }
Patrick Barroca's avatar
Patrick Barroca committed
  protected function _postData() {
    $this->getRequest()
      ->setMethod('POST')
      ->setPost(array('nom' => 'Duchamp',
                      'prenom' => 'Michel',
                      'mail' => 'mduchamp@orange.fr',
                      'password' => 'carambar',
                      'confirm_password' => 'carambar'));
    $this->dispatch('/opac/abonne/edit');
  }
Patrick Barroca's avatar
Patrick Barroca committed
  public function testWithNoSIGBErrorRedirectToFiche() {
    $this->opsys_service
      ->expects($this->once())
      ->method('saveEmprunteur')
      ->with($this->emprunteur)
      ->will($this->returnValue($this->opsys_service));
Patrick Barroca's avatar
Patrick Barroca committed
    $this->_postData();
Patrick Barroca's avatar
Patrick Barroca committed
    $this->assertRedirectTo('/abonne/fiche');
  }
Patrick Barroca's avatar
Patrick Barroca committed
  public function testWithSIGBErrorDisplayErrorMessage() {
    $this->opsys_service
      ->expects($this->once())
      ->method('saveEmprunteur')
      ->with($this->emprunteur)
      ->will($this->throwException(new Exception('(1023) Le SIGB ne réponds pas')));
Patrick Barroca's avatar
Patrick Barroca committed
    $this->_postData();
    $this->assertAction('edit');
Patrick Barroca's avatar
Patrick Barroca committed
    $this->assertQueryContentContains("ul.errors li",
                                      '(1023) Le SIGB ne réponds pas');
  }
class AbonneControllerNewslettersSubscriptionTest extends AbonneControllerWithTwoNewslettersTestCase {

Patrick Barroca's avatar
Patrick Barroca committed
  public function setUp() {
    parent::setUp();
    $_SERVER['HTTP_REFERER'] = '/opac/index';
    $this->dispatch('/opac/abonne/subscribe-newsletter/id/14',true);
Patrick Barroca's avatar
Patrick Barroca committed
  }
Patrick Barroca's avatar
Patrick Barroca committed
  /** @test **/
  public function subscribeActionShouldCallSubscribenewsletterAction() {
    $this->assertAction('subscribe-newsletter');
  }
Patrick Barroca's avatar
Patrick Barroca committed
  /** @test **/
  public function subscribeActionShouldRedirectToCurrentPage() {
    $this->assertRedirectTo('/opac/index');
  }
Patrick Barroca's avatar
Patrick Barroca committed
  /** @test **/
  public function subscribeActionShouldAddNewsletterToUser() {
    $this->assertContains( $this->visites,$this->marcus->getNewsletters());
  }

}


class AbonneControllerNewslettersUnsubscriptionTest extends AbonneControllerWithTwoNewslettersTestCase {

Patrick Barroca's avatar
Patrick Barroca committed
  public function setUp() {
    parent::setUp();
    $_SERVER['REQUEST_URI'] = '/';
    $this->dispatch('/opac/abonne/unsubscribe-newsletter/id/14',true);
Patrick Barroca's avatar
Patrick Barroca committed
  }
Patrick Barroca's avatar
Patrick Barroca committed
  /** @test **/
  public function unsubscribeActionShouldCallSubscribenewsletterAction() {
    $this->assertAction('unsubscribe-newsletter');
  }
Patrick Barroca's avatar
Patrick Barroca committed
  /** @test **/
  public function unsubscribeActionShouldAddNewsletterToUser() {
    $this->assertNotContains( $this->visites,$this->marcus->getNewsletters());
  }
class AbonneControllerNewslettersValidationsTest extends AbonneControllerWithTwoNewslettersTestCase {
Patrick Barroca's avatar
Patrick Barroca committed
  protected function _postData($data) {
    $this->getRequest()
      ->setMethod('POST')
      ->setPost($data);

    $this->dispatch('/opac/abonne/edit', true);
    $this->assertAction('edit');
  }

  public function testWrongMail() {
    $this->_postData(array('mail' => 'marc'));
    $this->assertQueryContentContains("form ul.errors li",
                                      "'marc' n'est pas un email valide");
  }


  public function testOnlyPasswordFilled() {
    $this->_postData(array('password' => 'picetpic'));
    $this->assertQueryContentContains('form ul.errors li',
                                      'Vous devez confirmer le mot de passe');
  }

  public function testOnlyConfirmPasswordFilled() {
    $this->_postData(array('confirm_password' => 'ratatam'));
    $this->assertQueryContentContains('form ul.errors li',
                                      'Vous devez saisir un mot de passe');
  }

  public function testPasswordAndConfirmationDoesNotMatch() {
    $this->_postData(array('password' => 'picetpic',
                           'confirm_password' => 'ratatam'));
    $this->assertQueryContentContains('form ul.errors li',
                                      'Les mots de passe ne correspondent pas');
  }

  public function testPasswordTooShort() {
    $this->_postData(array('password' => 'pic',
                           'confirm_password' => 'pic'));
    $this->assertQueryContentContains('form ul.errors li',
                                      "'***' contient moins de 4 caractères");
  }

  public function testPasswordTooLong() {
    $this->_postData(array('password' => '26 caracteres *************',
                           'confirm_password' => '26 caracteres **************'));
    $this->assertQueryContentContains('form ul.errors li',
                                      "'***************************' contient plus de 24 caractères");
  }

  /** @test */
  public function withEmptyPasswordMarcusShouldBeSaved() {
    $this->_postData(array('password' => ''));
    $this->assertEquals($this->marcus->getPassword(), Class_Users::findFirstBy(['idabon' => '00123'])->getPassword());
Patrick Barroca's avatar
Patrick Barroca committed
  }


class AbonneControllerNewslettersSubscriptionTwiceTest extends AbstractControllerTestCase {

Patrick Barroca's avatar
Patrick Barroca committed
  public function setUp() {
    parent::setUp();
    $_SERVER['HTTP_REFERER'] = '/opac/index';
Patrick Barroca's avatar
Patrick Barroca committed
    $newsletter = $this->fixture('Class_Newsletter',
                                 ['id' => 5,
                                  'titre' => 'Daily News']);
Patrick Barroca's avatar
Patrick Barroca committed
    $user = $this->fixture('Class_Users',
                               ['id' => 156,
                                'login' => 'tomato',
                                'password' => 'pwd']);
Patrick Barroca's avatar
Patrick Barroca committed
    $this->fixture('Class_NewsletterSubscription',
                   ['id' => 1,
                    'user' => $user,
                    'newsletter' => $newsletter]);
Patrick Barroca's avatar
Patrick Barroca committed
    ZendAfi_Auth::getInstance()
      ->logUser($user);
Patrick Barroca's avatar
Patrick Barroca committed
    $this->dispatch('/opac/abonne/subscribe-newsletter/id/5',true);
  }
Patrick Barroca's avatar
Patrick Barroca committed
  /** @test **/
  public function dailyNewsSubscribersShouldContainsTomatoOnlyOne() {
    $this->assertEquals(1 , Class_NewsletterSubscription::countBy(['user_id' => 156]));
  }