Skip to content
Snippets Groups Projects
BibControllerTest.php 15.1 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 BibControllerWithZoneTestCase extends AbstractControllerTestCase {
Patrick Barroca's avatar
Patrick Barroca committed
  public function setUp() {
    parent::setUp();
    unset($_REQUEST['geo_zone']);
    $_SESSION['selection_bib'] = ['nb_notices' => 12345,
                                  'id_bibs' => null];

    $this->bib_annecy = Class_Bib::getLoader()
      ->newInstanceWithId(4)
      ->setIdZone(1)
      ->setLibelle('Annecy')
      ->setAffZone('')
      ->setVille('Annecy')
      ->setUrlWeb('http://www.annecy.fr')
      ->setMail('jp@annecy.com')
      ->setTelephone('04 50 51 32 12')
      ->setAdresse('1 rue Jean Jaures')
      ->setVisibilite(Class_Bib::V_DATA);

    $this->haute_savoie = Class_Zone::getLoader()
      ->newInstanceWithId(1)
      ->setCouleurTexte('#059')
      ->setCouleurOmbre('#234')
      ->setTailleFonte('14')
      ->setImage('carte_moulins.jpg')
      ->setBibs(array($this->bib_annecy));

    $ecrivez_des_tests = Class_Article::getLoader()
      ->newInstanceWithId(2)
      ->setIdSite(0)
      ->setTitre('Ecrivez des tests !')
      ->setContenu('Ça fera le plus grand bien')
      ->setCategorie(Class_ArticleCategorie::getLoader()
                     ->newInstanceWithId(5)
                     ->setLibelle('Bonnes pratiques'));

    Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Article')
      ->whenCalled('getArticlesByPreferences')
      ->with(array('id_bib' => '4'))
      ->answers(array($ecrivez_des_tests))

      ->whenCalled('filterByLocaleAndWorkflow')
      ->with(array($ecrivez_des_tests))
      ->answers(array($ecrivez_des_tests));


    Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Zone')
      ->whenCalled('findAll')
      ->answers(array($this->haute_savoie));
  }
llaffont's avatar
llaffont committed
}



class BibControllerZoneViewOneTest extends BibControllerWithZoneTestCase {
Patrick Barroca's avatar
Patrick Barroca committed
  public function setUp() {
    parent::setUp();
Patrick Barroca's avatar
Patrick Barroca committed
    $this->dispatch('bib/zoneview/id/1');
  }
Patrick Barroca's avatar
Patrick Barroca committed
  /** @test */
  public function bibListShouldBeVisible() {
    $this->assertXPathContentContains("//table//td[@class='listeTitre']",
                                      "Bibliothèque");
  }
Patrick Barroca's avatar
Patrick Barroca committed
  /** @test */
  public function actualitesShouldBeVisible() {
    $this->assertXPathContentContains("//h2", "Actualités :");
  }
Patrick Barroca's avatar
Patrick Barroca committed
  /** @test */
  public function bibAnnecyShouldBeVisible() {
    $this->assertXPathContentContains("//table//td//a",
                                      "Annecy");
  }
Patrick Barroca's avatar
Patrick Barroca committed
  /** @test */
  public function bibAnnecyShouldBeVisibleOnMap() {
    $this->assertXPathContentContains("//span[contains(@onclick, '/bib/bibview/id/4')]", "Annecy");
  }
Patrick Barroca's avatar
Patrick Barroca committed
  /** @test */
  public function mapShouldBeVisible() {
    $this->assertXPath("//div[@id='image_container']");
  }
Patrick Barroca's avatar
Patrick Barroca committed
  /** @test */
  public function imageZoneShouldBeVisible() {
    $this->assertXPath("//div[@id='image_container'][contains(@style, 'images/blank.gif')]");
  }
Patrick Barroca's avatar
Patrick Barroca committed
  /** @test */
  public function articleEcrivezDesTestsShouldBeVisible() {
    $this->assertXPathContentContains("//li//a", "Ecrivez des tests !");
  }
llaffont's avatar
llaffont committed
}


class BibControllerZoneViewOneWithHideNewsTest extends BibControllerWithZoneTestCase {
Patrick Barroca's avatar
Patrick Barroca committed
  public function setUp() {
    parent::setUp();
    Class_Profil::getCurrentProfil()->setCfgModules(array("bib" => array("zoneview" => array("hide_news" => 1))));
    $this->dispatch('bib/zoneview/id/1');
  }
Patrick Barroca's avatar
Patrick Barroca committed
  /** @test */
  public function actualitesShouldNotBeVisible() {
    $this->assertNotXPathContentContains("//h2",  "Actualités :");
  }
Patrick Barroca's avatar
Patrick Barroca committed
  /** @test */
  public function articleEcrivezDesTestsShouldNotBeVisible() {
    $this->assertNotXPathContentContains("//li//a", "Ecrivez des tests !");
  }
llaffont's avatar
llaffont committed
}


class BibControllerIndexWithHideNewsTest extends BibControllerWithZoneTestCase {
Patrick Barroca's avatar
Patrick Barroca committed
  public function setUp() {
    parent::setUp();
    Class_Profil::getCurrentProfil()->setCfgModules(array("bib" => array("index" => array("hide_news" => 1))));
    $this->dispatch('bib/index');
  }
Patrick Barroca's avatar
Patrick Barroca committed
  /** @test */
  public function actualitesShouldNotBeVisible() {
    $this->assertNotXPathContentContains("//h2",  "Actualités :");
  }
Patrick Barroca's avatar
Patrick Barroca committed
  /** @test */
  public function articleEcrivezDesTestsShouldNotBeVisible() {
    $this->assertNotXPathContentContains("//li//a", "Ecrivez des tests !");
  }
llaffont's avatar
llaffont committed
}



class BibControllerIndexWithShowNewsTest extends BibControllerWithZoneTestCase {
Patrick Barroca's avatar
Patrick Barroca committed
  public function setUp() {
    parent::setUp();
    Class_Profil::getCurrentProfil()->setCfgModules(array("bib" => array("index" => array("hide_news" => 0))));
    $this->dispatch('bib/index');
  }
Patrick Barroca's avatar
Patrick Barroca committed
  /** @test */
  public function actualitesShouldBeVisible() {
    $this->assertXPathContentContains("//h2", "Actualités :");
  }
Patrick Barroca's avatar
Patrick Barroca committed
  /** @test */
  public function articleEcrivezDesTestsShouldBeVisible() {
    $this->assertXPathContentContains("//li//a", "Ecrivez des tests !");
  }
Patrick Barroca's avatar
Patrick Barroca committed
  /** @test */
  function hrefForArticleEcrivezDesTestsShouldLinkToArticleView() {
    $this->assertXPath('//li//a[contains(@href, "cms/articleview/id/2")]',
                       $this->_response->getBody());
  }
Ghislain Loas's avatar
Ghislain Loas committed

abstract class BibControllerMapViewTest extends BibControllerWithZoneTestCase {
Patrick Barroca's avatar
Patrick Barroca committed
  public function setUp() {
    parent::setUp();
Patrick Barroca's avatar
Patrick Barroca committed
    $this->fixture('Class_Profil',
                   ['id' => 3,
                    'libelle' => 'Annecy']);
  }
Ghislain Loas's avatar
Ghislain Loas committed

Ghislain Loas's avatar
Ghislain Loas committed
class BibControllerMapViewWithProfilTest extends BibControllerMapViewTest {

Patrick Barroca's avatar
Patrick Barroca committed
  public function setUp() {
    parent::setUp();
Patrick Barroca's avatar
Patrick Barroca committed
    $aff_zone = ['profilID' => '3',
                 'libelle' => 'Annecy',
                 'posX' => 2,
                 'posY' => 5,
                 'posPoint' => 'droite'];
Patrick Barroca's avatar
Patrick Barroca committed
    $this->bib_annecy->setAffZone(ZendAfi_Filters_Serialize::serialize($aff_zone));
Patrick Barroca's avatar
Patrick Barroca committed
    $this->dispatch('bib/mapzoneview/id/1');
  }
Patrick Barroca's avatar
Patrick Barroca committed
  /** @test */
  public function actionShouldBeMapZoneView() {
    $this->assertAction('mapzoneview');
  }
Patrick Barroca's avatar
Patrick Barroca committed
  /** @test */
  public function mapShouldBeVisible() {
    $this->assertXPath("//div[@id='image_container']");
  }
Patrick Barroca's avatar
Patrick Barroca committed
  /** @test */
  public function imageZoneShouldBeVisible() {
    $this->assertXPath("//div[@id='image_container'][contains(@style, 'images/blank.gif')]");
  }
Patrick Barroca's avatar
Patrick Barroca committed
  /** @test */
  public function bibAnnecyShouldBeVisibleOnMap() {
    $this->assertXPathContentContains("//span[contains(@onclick, 'index/index/id_profil/3')]", "Annecy", $this->_response->getBody());
  }
Ghislain Loas's avatar
Ghislain Loas committed
}



class BibControllerMapViewWithoutProfilTest extends BibControllerMapViewTest {

Patrick Barroca's avatar
Patrick Barroca committed
  public function setUp() {
    parent::setUp();
Patrick Barroca's avatar
Patrick Barroca committed
    $aff_zone = ['profilID' => '',
                 'libelle' => 'Annecy',
                 'posX' => 2,
                 'posY' => 5,
                 'posPoint' => 'droite'];
Patrick Barroca's avatar
Patrick Barroca committed
    $this->bib_annecy->setAffZone(ZendAfi_Filters_Serialize::serialize($aff_zone));
Patrick Barroca's avatar
Patrick Barroca committed
    $this->dispatch('bib/mapzoneview/id/1');
  }
Patrick Barroca's avatar
Patrick Barroca committed
  /** @test */
  public function bibAnnecyShouldBeVisibleOnMap() {
    $this->assertXPathContentContains("//span[contains(@onclick, 'bibview/id/4')]", "Annecy", $this->_response->getBody());
  }
llaffont's avatar
llaffont committed
}



class BibControllerBibViewAnnecyTest extends BibControllerWithZoneTestCase {
Patrick Barroca's avatar
Patrick Barroca committed
  protected $_mock_sql;
Patrick Barroca's avatar
Patrick Barroca committed
  public function setUp() {
    parent::setUp();
Patrick Barroca's avatar
Patrick Barroca committed
    $this->_mock_sql = Storm_Test_ObjectWrapper::mock();
    Zend_Registry::set('sql', $this->_mock_sql);
Patrick Barroca's avatar
Patrick Barroca committed
    Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Exemplaire')
      ->whenCalled('countBy')
      ->with(['model' => $this->bib_annecy, 'role' => 'bib'])
      ->answers(20)
      ->beStrict();
Patrick Barroca's avatar
Patrick Barroca committed
    $this->_mock_sql
      ->whenCalled('fetchOne')
      ->answers('');
Patrick Barroca's avatar
Patrick Barroca committed
    $this->dispatch('bib/bibview/id/4', true);
  }
Patrick Barroca's avatar
Patrick Barroca committed
  /** @test */
  public function formRechercheShouldLinkToCurrentBib() {
    $this->assertXPath('//form[contains(@action, "/recherche/simple/id/4/geo_bib/4")]', $this->_response->getBody());
  }
Patrick Barroca's avatar
Patrick Barroca committed
  /** @test */
  function AdresseShouldBe1RueJeanJaures() {
    $this->assertXPathContentContains('//tr', '1 rue Jean Jaures');
  }
Patrick Barroca's avatar
Patrick Barroca committed
  /** @test */
  function articleEcrivezDesTestsShouldBeVisible() {
    $this->assertXPathContentContains('//h2', 'Ecrivez des tests !');
  }
Patrick Barroca's avatar
Patrick Barroca committed
  /** @test */
  function libelleCatBonnesPratiquesShouldBeVisible() {
    $this->assertXPathContentContains('//h1', 'Bonnes pratiques');
  }
Patrick Barroca's avatar
Patrick Barroca committed
  /** @test */
  public function urlRetourShouldBeZoneViewIdOne() {
    $this->assertXPathContentContains('//a[contains(@href, "/bib/zoneview/id/1")]',
                                      'Retour');
  }
llaffont's avatar
llaffont committed
}


class BibControllerBibViewAnnecyWithParamRetourHistoriqueTest extends BibControllerWithZoneTestCase {
Patrick Barroca's avatar
Patrick Barroca committed
  /** @test */
  public function withUrlRetourCmsArticleViewFiveShouldBeAccepted() {
    $this->dispatch('bib/bibview/id/4?retour=cms+articleview+5');
    $this->assertXPathContentContains('//a[contains(@href, "/cms/articleview/id/5")]',
                                      'Retour');
  }

  /** @test */
  public function withUrlRetourCmsOnlyShouldNotBeAccepted() {
    $this->dispatch('bib/bibview/id/4?retour=cms');
    $this->assertXPathContentContains('//a[contains(@href, "/bib/zoneview/id/1")]',
                                      'Retour');
  }
llaffont's avatar
llaffont committed
}


class BibControllerBibViewInexistantTest extends BibControllerWithZoneTestCase {
Patrick Barroca's avatar
Patrick Barroca committed
  public function setUp() {
    parent::setUp();
Patrick Barroca's avatar
Patrick Barroca committed
    $this->dispatch('bib/bibview/');
  }
Patrick Barroca's avatar
Patrick Barroca committed
  /** @test */
  public function responseShouldRedirectToIndex() {
    $this->assertRedirectTo('/opac/bib/index');
  }
abstract class BibControllerSelectionTestCase extends AbstractControllerTestCase {
Patrick Barroca's avatar
Patrick Barroca committed
  protected $_session;
Patrick Barroca's avatar
Patrick Barroca committed
  public function setUp() {
    parent::setUp();
Patrick Barroca's avatar
Patrick Barroca committed
    $this->_session = Zend_Registry::get('session');
Patrick Barroca's avatar
Patrick Barroca committed
    unset($_REQUEST['geo_zone']);
    unset($_REQUEST['geo_bib']);
    unset($_SESSION['selection_bib']);
Patrick Barroca's avatar
Patrick Barroca committed
    $_SESSION['selection_bib'] = ['id_bibs' => []];
Patrick Barroca's avatar
Patrick Barroca committed
    $this->fixture('Class_Zone',
                   ['id' => 1,
                    'libelle' => 'Africa']);
Patrick Barroca's avatar
Patrick Barroca committed
    $this->fixture('Class_Zone',
                   ['id' => 2,
                    'libelle' => 'Europe']);
Patrick Barroca's avatar
Patrick Barroca committed
    $cairo = $this->fixture('Class_Bib',
                            ['id' => 1,
                             'id_site' => 1,
                             'libelle' => 'Cairo',
                             'id_zone' => 1,
                             'visibilite' => 2]);
Patrick Barroca's avatar
Patrick Barroca committed
    $casablanca = $this->fixture('Class_Bib',
                                 ['id' => 2,
                                  'id_site' => '2',
                                  'libelle' => 'Casablanca',
                                  'visibilite' => 2,
                                  'id_zone' => 1]);
Patrick Barroca's avatar
Patrick Barroca committed
    $paris = $this->fixture('Class_Bib',
                            ['id' => 3,
                             'id_site' => '2',
                             'libelle' => 'Paris',
                             'visibilite' => 2,
                             'id_zone' => 2]);
  }
class BibControllerBibSelectionWithEmptySessionTest extends BibControllerSelectionTestCase {
Patrick Barroca's avatar
Patrick Barroca committed
  public function setUp() {
    parent::setUp();
Patrick Barroca's avatar
Patrick Barroca committed
    $_SERVER['HTTP_REFERER'] = 'http://mybokeh.fr/index/index/profil/1';
    $this->dispatch('bib/selection', true);
  }
Patrick Barroca's avatar
Patrick Barroca committed
  /** @test */
  public function pageShouldBeHtml5Valid() {
    $this->assertHTML5($this->_response->getBody());
  }
Patrick Barroca's avatar
Patrick Barroca committed
  /** @test */
  public function cairoShouldBeInBibList() {
    $this->assertXPathContentContains('//li/span', 'Cairo');
  }
Patrick Barroca's avatar
Patrick Barroca committed
  /** @test */
  public function casablancaShouldBeInBibList() {
    $this->assertXPathContentContains('//li/span', 'Casablanca');
  }
Patrick Barroca's avatar
Patrick Barroca committed
  /** @test */
  public function inputTypeSubmitShouldBePresent() {
    $this->assertXPath('//form//input[@type="submit"]');
  }
class BibControllerBibSelectionWithBibsIdsInSessionTest extends BibControllerSelectionTestCase {
Patrick Barroca's avatar
Patrick Barroca committed
  public function setUp() {
    parent::setUp();
    $this->_session->id_bibs = [1, 2];
    $this->dispatch('bib/selection', true);
  }
Patrick Barroca's avatar
Patrick Barroca committed
  /** @test */
  public function formActionShouldBeBibSelection() {
    $this->assertXPath('//form[contains(@action, "bib/selection")]');
  }
Patrick Barroca's avatar
Patrick Barroca committed
  /** @test */
  public function cairoShouldBeChecked() {
    $this->assertXPath('//li/input[@checked="checked"][@value="1"]', $this->_response->getBody());
  }
Patrick Barroca's avatar
Patrick Barroca committed
  /** @test */
  public function casablancaShouldBeChecked() {
    $this->assertXPath('//li/input[@checked="checked"][@value="2"]');
  }
Patrick Barroca's avatar
Patrick Barroca committed
  /** @test */
  public function parisShouldNotBeChecked() {
    $this->assertNotXPath('//li/input[@checked="checked"][@value="3"]');
  }
class BibControllerBibSelectionPostDispatchTest extends BibControllerSelectionTestCase {
Patrick Barroca's avatar
Patrick Barroca committed
  public function setUp() {
    parent::setUp();
    $_SERVER['HTTP_REFERER'] = 'http://mybokeh.org/recherche/simple/expressionRecherche/pomme/bib_select/2';
    $this->postDispatch('bib/selection', ['update_bib_select' => 1, 'bib_select' => [1, 2]]);
Patrick Barroca's avatar
Patrick Barroca committed
  }
Patrick Barroca's avatar
Patrick Barroca committed
  /** @test */
  public function shouldRedirectToRefererWithNewParams() {
    $this->assertRedirectTo('/recherche/simple/expressionRecherche/pomme/bib_select/1%2C2');
  }
Patrick Barroca's avatar
Patrick Barroca committed
  /** @test */
  public function sessionShouldContainsCasablancaAndCairo() {
Patrick Barroca's avatar
Patrick Barroca committed
    $this->assertEquals([1, 2] , $this->_session->id_bibs);
  }
class BibControllerBibSelectionUnselectPostDispatch extends BibControllerSelectionTestCase {
Patrick Barroca's avatar
Patrick Barroca committed
  public function setUp() {
    parent::setUp();
lbrun's avatar
lbrun committed
    $_SERVER['HTTP_REFERER'] = 'http://mybokeh.org/recherche/simple/expressionRecherche/pomme/bib_select/2';
    $this->postDispatch('bib/selection', ['update_bib_select' => 1]);
  }

  /** @test */
  public function shouldRedirectToRefererWithNoNewParams() {
    $this->assertRedirectTo('/recherche/simple/expressionRecherche/pomme');
  }

  /** @test */
  public function sessionShouldNotContainsCasablancaAndCairo() {
    $this->assertEquals([] , $this->_session->id_bibs);
Patrick Barroca's avatar
Patrick Barroca committed
  }

class BibControllerBibSelectionWithProfilIdParamTest extends BibControllerSelectionTestCase {
Patrick Barroca's avatar
Patrick Barroca committed
  public function setUp() {
    parent::setUp();
    Class_Profil::setCurrentProfil(Class_Profil::find(1));
    $this->_session->id_bibs = [1, 2];
    $this->dispatch('opac/index/index/id_profil/1', true);
  }


  /** @test */
  public function sessionSlectionBibShouldNotExist() {
    $this->assertEquals([1,2], $this->_session->id_bibs);
  }
class BibControllerBibSelectionWithProfilHasChangedTest extends BibControllerSelectionTestCase {
Patrick Barroca's avatar
Patrick Barroca committed
  public function setUp() {
    parent::setUp();
    Class_Profil::setCurrentProfil(Class_Profil::find(1));
    $this->_session->id_bibs = [1, 2];
    $this->dispatch('opac/index/index/id_profil/2', true);
  }


  /** @test */
  public function sessionSlectionBibShouldNotExist() {
    $this->assertEmpty($this->_session->id_bibs);
  }