<?php /** * Copyright (c) 2012, Agence Française Informatique (AFI). All rights reserved. * * AFI-OPAC 2.0 is free software; you can redistribute it and/or modify * 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). * * AFI-OPAC 2.0 is distributed in the hope that it will be useful, * 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 * along with AFI-OPAC 2.0; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ require_once 'AbstractControllerTestCase.php'; abstract class RechercheControllerNoticeTestCase extends AbstractControllerTestCase { public function setUp() { parent::setUp(); $this->notice = Class_Notice::newInstanceWithId(345, ['annee' => 2002, 'editeur' => 'Gallimard', 'isbn' => '1-234-56789-0', 'type_doc' => Class_TypeDoc::LIVRE, 'url_vignette' => 'NO', 'url_image' => 'NO', 'facettes' => 'A123', 'unimarc' => "01570nam0 2200325 450 0010007000000100033000070200017000400210027000571000041000841010008001251020007001331050018001401060006001582000106001642100075002702150044003452250023003893000125004123000020005373000137005573300265006943450018009594100051009775120027010286060033010556060060010886760012011487000045011608010039012052218529 a2-86642-370-4bbr.d8,95 EUR aFRb00347575 aFRbDLE-20031204-51138 a20031107d2003 m h0frey0103 ba| afre aFR ay z 000y| ar1 aCinéma d'animationbTexte impriméedessin animé, marionnettes, images de synthèsefBernard Génin a[Paris]c\"Cahiers du cinéma\"cSCEREN-CNDPdcop. 2003gimpr. en Italie a95 p.cill., couv. ill. en coul.d19 cm2 aLes petits cahiers aLa couv. porte en plus : \"du crayon à l'ordinateur, pour ou contre Disney, Europe-Japon : le dessin animé aujourd'hui\" aBibliogr. p. 93 aSCEREN = Services, cultures, éditions, ressources pour l'éducation nationale. CNDP = Centre national de documentation pédagogique aPrésente un historique du cinéma d'animation, un survol des différentes productions nationales à travers le monde (Etats-Unis, Japon, France, Canada), les techniques du volume animé, l'image de synthèse, mais aussi l'oeuvre de Disney et le film d'auteur. b9782866423704 032525826tLes Petits cahiers (Paris)x1633-90531 aLe cinéma d'animation| 31053394aAnimation (cinéma)| 31031625aDessins animés32195497xHistoire et critique a791.431 |32547161aGéninbBernardf1946-....4070 0aFRbBNFc20031107gAFNOR2intermrc"])->setExemplaires([Class_Exemplaire::getLoader() ->newInstanceWithId(34) ->setIdBib('456') ->setIdOrigine('12') ->setCodeBarres('12256663233656') ->setSigbExemplaire(Storm_Test_ObjectWrapper::mock() ->whenCalled('isReservable') ->answers(true))]); } } class RechercheControllerReseauTest extends RechercheControllerNoticeTestCase { public function setUp() { Class_WebService_ReseauxSociaux::setDefaultWebClient(Storm_Test_ObjectWrapper::mock() ->whenCalled('open_url') ->answers(false)); parent::setUp(); $this->dispatch(sprintf('recherche/reseau/id_notice/%d/type_doc/1', $this->notice->getId()), true); } public function tearDown() { parent::tearDown(); Class_WebService_ReseauxSociaux::setDefaultWebClient(null); } /** @test */ public function getResauShouldContainsTwitterGif() { $this->assertXPath('//img[contains(@src, "twitter.gif")]'); } /** @test */ public function getResauShouldContainsTwitterLink() { $this->assertContains("$.getScript('/social-network/share/id_notice/345/type_doc/1/on/twitter/url", $this->_response->getBody()); } } class RechercheControllerViewNoticeBabelthequeTest extends RechercheControllerNoticeTestCase { /** @test */ public function withoutBabelthequeJSShouldNotBeLoaded() { Class_AdminVar::newInstanceWithId('BABELTHEQUE_JS')->setValeur(''); $this->dispatch(sprintf('recherche/viewnotice/id/%d', $this->notice->getId()), true); $this->assertNotXpath('//script[contains(@src, "babeltheque.js")]'); } /** @test */ public function withBabelthequeJSShouldBeLoadedWithRightId() { Class_AdminVar::newInstanceWithId('BABELTHEQUE_JS')->setValeur('http://www.babeltheque.com/bw_666.js'); $this->dispatch(sprintf('recherche/viewnotice/id/%d', $this->notice->getId()), true); $this->assertXpath('//script[contains(@src, "babeltheque.js?bwid=666")]'); } } class RechercheControllerViewNoticeWithPreferencesTest extends RechercheControllerNoticeTestCase { protected $_web_analytics_client; public function setUp() { parent::setUp(); $this->notice->setClefChapeau('Gallimard serie'); $preferences = [ 'barre_nav' => 'Document', 'entete' =>"ABCDEFGIKLMNOPRSTtYZ8v", 'onglets' => [ 'detail' => ['titre' => 'Details', 'aff' => '1', 'ordre' => 1, 'largeur' => 10], 'avis' => ['titre' => 'avis', 'aff' => '1', 'ordre' => 2, 'largeur' => 10], 'exemplaires' => ['titre' => 'exemplaires', 'aff' => '2', 'ordre' => 3, 'largeur' => 10], 'resume' => ['titre' => 'resume', 'aff' => '2', 'ordre' => 4, 'largeur' => 10], 'tags' => ['titre' => 'tags', 'aff' => '2', 'ordre' => 5, 'largeur' => 10], 'biographie' => ['titre' => 'biographie', 'aff' => '2', 'ordre' => 6, 'largeur' => 10], 'similaires' => ['titre' => 'similaires', 'aff' => '2', 'ordre' => 7, 'largeur' => 10], 'bibliographie' => ['titre' => 'bibliographie','aff' => '3', 'ordre' => 7, 'largeur' => 10], 'morceaux' => ['titre' => 'morceaux', 'aff' => '3', 'ordre' => 8, 'largeur' => 10], 'bandeAnnonce' => ['titre' => 'bande annonce','aff' => '3', 'ordre' => 9, 'largeur' => 10], 'photos' => ['titre' => 'photos', 'aff' => '3', 'ordre' => 14, 'largeur' => 10], 'videos' => ['titre' => 'videos', 'aff' => '3', 'ordre' => 11, 'largeur' => 10], 'resnumeriques' => ['titre' => 'ressources n', 'aff' => '3', 'ordre' => 12, 'largeur' => 10], 'babeltheque' => ['titre' => 'babeltheque', 'aff' => '3', 'ordre' => 13, 'largeur' => 10], 'frbr' => ['titre' => 'frbr', 'aff' => '0', 'ordre' => 10, 'largeur' => 10], 'serie' => ['titre' => 'serie', 'aff' => '0', 'ordre' => 11, 'largeur' => 10]], 'boite' => null]; Class_Profil::getCurrentProfil() ->setBarreNavOn(true) ->setCfgModules(['recherche' => ['viewnotice1' => $preferences]]); Class_CodifAuteur::newInstanceWithId(123, ['libelle' => 'Bernard Génin']); $this->_web_analytics_client = Storm_Test_ObjectWrapper::mock() ->whenCalled('trackEvent') ->answers(true); ZendAfi_Controller_Action_Helper_TrackEvent::setDefaultWebAnalyticsClient($this->_web_analytics_client); $this->dispatch('recherche/viewnotice/id/345', true); } /** @test */ public function enteteShouldDisplayAnnee2002() { $this->assertXPathContentContains('//dl//dd', '2002'); } /** @test */ public function enteteShouldDisplayDocumentDeLaMemeSerie() { $this->assertXPathContentContains('//div//a[contains(@href,"Gallimard+serie")]', 'Voir tous les tomes de Cinéma d\'animation',$this->_response->getBody()); } /** @test */ public function enteteShouldDisplayDocumentLinkOrderByDateNouveaute() { $this->assertXPathContentContains('//div//a[contains(@href,"Gallimard+serie/tri/date_creation+desc")]', 'Voir tous les tomes de',$this->_response->getBody()); } /** @test */ public function enteteShouldDisplayDtEditeur() { $this->assertXPathContentContains('//dl//dt', 'Editeur'); } /** @test */ public function enteteShouldDisplayEditeurGallimard() { $this->assertXPathContentContains('//dl//dd', 'Gallimard'); } /** @test */ public function enteteShouldDisplayRebondAuteurBernardGenin() { $this->assertXPathContentContains('//dl//dd[contains(@class, "first")]/a[contains(@href, "recherche/simple/id/345/code_rebond/A123")]', 'Bernard Génin', $this->_response->getBody()); } /** @test */ public function enteteShouldDisplayDtDdCollectionWithClassSecond() { $this->assertXPathContentContains('//dl//dt[contains(@class, "second")]', 'Collection',$this->_response->getBody()); } /** @test */ public function detailsBlocShouldHaveIdBloc_345_0() { $this->assertXPathContentContains('//div[@id="bloc_345_0"][@class="notice_bloc_titre"]', 'Details'); } /** @test */ public function javascriptShouldOpenFirstBlocDetails() { $this->assertXPathContentContains('//script', "infos_bloc(\"bloc_345_0\",'1-234-56789-0','detail',0,'',0, 'http://localhost".BASE_URL."/noticeajax/detail/id/345')",$this->_response->getBody()); } /** @test */ public function javascriptShouldOpenSecondBlocAvis() { $this->assertXPathContentContains('//script', "infos_bloc(\"bloc_345_1\",'1-234-56789-0','avis',0,'',1, 'http://localhost".BASE_URL."/noticeajax/avis/id/345')"); } /** @test */ public function noJavascriptShouldOpenThirdBlocExemplaires() { $this->assertNotXPathContentContains('//script', "infos_bloc(\"bloc_345_2\"",$this->_response->getBody()); } /** @test */ public function bibliographieOngletShouldHaveIdSet345_onglet_0() { $this->assertXPathContentContains('//div[@id="set345_onglet_0"][@class="titre_onglet"]', 'bibliographie'); } /** @test */ public function javascriptShouldOpenFirstOngletBibliographie() { $this->assertXPathContentContains('//script', "infos_onglet('set345_onglet_0','1-234-56789-0','bibliographie',0,'',0, 'http://localhost".BASE_URL."/noticeajax/bibliographie/id/345')"); } /** @test */ public function videosOngletShouldHaveIdSet345_onglet_3() { $this->assertXPathContentContains('//div[@id="set345_onglet_3"][@class="titre_onglet"]', 'videos',$this->_response->getBody()); } /** @test */ public function noJavascriptShouldOpenSecondOnglet() { $this->assertNotXPathContentContains('//script', "infos_onglet('set345_onglet_1')"); } /** @test */ public function linkReserverShouldBeDisplayed() { $this->assertXPathContentContains('//a[contains(@onclick, "openDialogExemplaires")]', 'Réserver'); } /** @test */ public function vignetteShouldBeGenerated() { $this->assertXPath('//div[@class="nothumbnail type_doc_1"]'); } /** @test */ public function vignetteForZoomShouldNotBeGenerated() { $this->assertNotXPath('//a[@id="vignette"]'); } /** @test */ public function divViewNoticeShouldHaveClassTypeDocOne() { $this->assertXPath('//div[@class="view_notice type_doc_1"]'); } /** @test */ public function pageShouldBeHTML5Valid() { $this->assertHTML5(); } /** * @test */ public function trackEventShouldContainsNoticeTitreAuteur() { $this->assertEquals(['recherche', 'notice', '"titre: Cinéma d\'animation","auteur: Bernard Génin","editeur: Gallimard","tome: ","support: livres","ressource: http://localhost'.BASE_URL.'/recherche/viewnotice/id/345/clef/"', 345], $this->_web_analytics_client->getAttributesForLastCallOn('trackEvent')); } /** @test */ public function barreNavShouldContainsDocument() { $this->assertXPathContentContains('//div[@class="barre_nav"]//span', 'Document'); } } abstract class RechercheControllerViewNoticeTestCase extends RechercheControllerNoticeTestCase { /** @test */ public function titleShouldBeDisplayed() { $this->assertXPathContentContains('//h1', array_first(explode('<br />', $this->notice->getTitrePrincipal())), $this->_response->getBody()); } /** @test */ public function tagReseauSociauxShouldBePresent() { $this->assertXPath('//div[@id="reseaux-sociaux"]'); } /** @test */ public function headShouldContainsRechercheJS() { $this->assertXPath('//head//script[contains(@src,"public/opac/js/recherche.js")]'); } } class RechercheControllerViewNoticeClefAlphaTest extends RechercheControllerViewNoticeTestCase { public function setUp() { parent::setUp(); Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Notice') ->whenCalled('findAllBy') ->with(['clef_alpha' => 'TESTINGALPHAKEY---101']) ->answers([$this->notice]); $this->dispatch('recherche/viewnotice/clef/TESTINGALPHAKEY---101/expressionRecherche/Millenium', true); } /** @test */ public function retourListeShouldLinkToRechercheSimpleWithHashTagIdNotice() { $this->assertXPathContentContains('//div/a[contains(@href, "/recherche/simple/expressionRecherche/Millenium#345")]', 'Retour à la liste'); } /** @test */ public function resultatSuivantShouldLinkToNavigationSuivant() { $this->assertXPathContentContains('//div//a[contains(@href, "recherche/viewnotice/clef/TESTINGALPHAKEY---101/expressionRecherche/Millenium/navigation/suivant")]', 'Document suivant', $this->_response->getBody()); } /** @test */ public function resultatPrecedentShouldLinkToNavigationPrecedent() { $this->assertXPathContentContains('//div//a[contains(@href, "recherche/viewnotice/clef/TESTINGALPHAKEY---101/expressionRecherche/Millenium/navigation/precedent")]', 'Document précédent', $this->_response->getBody()); } } class RechercheControllerViewNoticeClefAlphaWithDoublonsTest extends RechercheControllerNoticeTestCase { public function setUp() { parent::setUp(); Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Notice') ->whenCalled('findAllBy') ->with(['clef_alpha' => 'TWILIGHT--SLADED-3-M6VIDEO-2010-4']) ->answers([Class_Notice::newInstanceWithId($this->notice->getId()) ->setTitrePrincipal('Twilight 1') ->setClefAlpha('TWILIGHT--SLADED-3-M6VIDEO-2010-4') ->setFacettes('') ->setUrlVignette('NO') ->setUrlImage('NO'), Class_Notice::newInstanceWithId(1) ->setTitrePrincipal('Twilight 2') ->setClefAlpha('TWILIGHT--SLADED-3-M6VIDEO-2010-4') ->setFacettes('') ->setUrlVignette('') ->setUrlImage('') ]); } /** @test */ public function withOnlyClefResponseShouldRedirectToRechercheTWILIGHT_SLADED() { $this->dispatch('recherche/viewnotice/clef/'.urlencode('TWILIGHT--SLADED-3-M6VIDEO-2010-4'), true); $this->assertRedirectTo('/opac/recherche?q=TWILIGHT+SLADED'); } /** @test */ public function withClefAndIdResponseShouldNotRedirectTo() { $this->dispatch('recherche/viewnotice/clef/'.urlencode('TWILIGHT--SLADED-3-M6VIDEO-2010-4').'/id/'.$this->notice->getId(), true); $this->assertNotRedirect(); } } class RechercheControllerUploadVignetteTest extends RechercheControllerNoticeTestCase { public function setUp() { parent::setUp(); $this->notice->setTypeDoc(5); } /** @test */ public function linkToUploadVignetteShouldNotBePresentForAbonneSIGB() { Class_Users::getIdentity()->beAbonneSIGB(); $this->dispatch(sprintf('recherche/viewnotice/id/%d', $this->notice->getId()), true); $this->assertNotXPathContentContains('//a', 'Modifier la vignette'); } /** @test */ public function linkToUploadVignetteShouldBePresentForModoBib() { Class_Users::getIdentity()->changeRoleTo(ZendAfi_Acl_AdminControllerRoles::MODO_BIB); $this->dispatch(sprintf('recherche/viewnotice/id/%d', $this->notice->getId()), true); $this->assertXPathContentContains('//a', 'Modifier la vignette'); } /** @test */ public function linkToUploadVignetteShouldNotBePresentForTypeDocMoreThanFive() { Class_Users::getIdentity()->beAdminPortail(); $this->notice->setTypeDoc(6); $this->dispatch(sprintf('recherche/viewnotice/id/%d', $this->notice->getId()), true); $this->assertNotXPathContentContains('//a', 'Modifier la vignette'); } } class RechercheControllerViewNoticeAsAdminTest extends RechercheControllerNoticeTestCase { public function setUp() { parent::setUp(); $this->notice->setTypeDoc(5); Class_Users::getIdentity()->beAdminPortail(); $this->dispatch(sprintf('recherche/viewnotice/id/%d', $this->notice->getId()), true); } /** @test */ public function linkToUploadVignetteShouldBePresent() { $this->assertXPathContentContains('//a', 'Modifier la vignette'); } /** @test */ public function linkToConfigModulesRechercheShouldHaveActionViewNotice() { $this->assertXPath('//img[contains(@onclick, "admin/modules/recherche?config=site&type_module=recherche&id_profil=2&action1=viewnotice&action2=5")]'); } /** @test */ public function pageShouldBeHTML5Valid() { $this->assertHTML5(); } } class RechercheControllerReadNoticeTest extends RechercheControllerNoticeTestCase { public function setUp() { parent::setUp(); $this->dispatch(sprintf('recherche/readnotice/id/%d', $this->notice->getId()), true); } /** @test */ public function titreShouldBeDisplayed() { $this->assertXPathContentContains('//p', 'Titre: Cinéma d\'animation'); } /** @test */ public function auteurShouldBeDisplayed() { $this->assertXPathContentContains('//p', 'Auteur: Bernard Génin'); } /** @test */ public function anneeShouldBe2002() { $this->assertXPathContentContains('//p', 'Année: 2002'); } } class RechercheControllerReservationPickupAjaxActionTest extends AbstractControllerTestCase { protected $_json, $_xpath; public function setUp() { parent::setUp(); Storm_Test_ObjectWrapper::onLoaderOfModel('Class_CodifAnnexe') ->whenCalled('findAllBy') ->with(array('no_pickup' => '0', 'order' => 'libelle')) ->answers(array(Class_CodifAnnexe::getLoader()->newInstanceWithId(2) ->setLibelle('Annecy') ->setCode('ANN'), Class_CodifAnnexe::getLoader()->newInstanceWithId(3) ->setLibelle('Cran') ->setCode('CRN'))); Class_CosmoVar::newInstanceWithId('site_retrait_resa', ['valeur'=>1]); $this->dispatch('recherche/reservation-pickup-ajax?id_bib=2&id_origine=12&code_annexe=ANN',true); $this->_json = json_decode($this->_response->getBody()); $this->_xpath = new Storm_Test_XPath(); } /** @test */ public function shouldRenderAnnecyCheckedRadio() { $this->_xpath->assertXPath($this->_json->content, '//input[@name="code_annexe"][@value="ANN"][@checked="checked"]',$this->_json->content); } /** @test */ public function shouldRenderCranRadio() { $this->_xpath->assertXPath($this->_json->content, '//input[@name="code_annexe"][@value="CRN"]'); } /** @test */ public function layoutShouldBeEmpty() { $this->_xpath->assertNotXPath($this->_json->content, '//div[@id="banniere"]'); } } abstract class RechercheControllerSimpleActionTestCase extends AbstractControllerTestCase { public function setUp() { parent::setUp(); Class_AdminVar::newInstanceWithId('FACETTE_TYPE_DOC_LIBELLE', ['valeur' => 'Type de document']); } } class RechercheControllerSimpleActionWithDefaultConfigTest extends RechercheControllerSimpleActionTestCase { public function setUp() { parent::setUp(); Class_Profil::getCurrentProfil()->setCfgModules([]); $this->dispatch('/recherche/simple/expressionRecherche/pomme/tri/alpha_auteur',true); } /** @test */ public function pommeShouldBePresentInRedirectedPageAsResultatInSession() { $this->assertXPathContentContains('//div', 'pomme'); } /** @test */ public function pageShouldContainsLinkToSuggestionAchats() { $this->assertXPathContentContains('//a[contains(@href, "/abonne/suggestion-achat")]', 'Suggérer un achat'); } /** @test */ public function selectedTriShouldBeAlphaAuteur() { $this->assertXPath('//select[@name="tri"]//option[@value="alpha_auteur"][@selected="selected"]'); } } class RechercheControllerIndexActionTestWithParamQ extends RechercheControllerSimpleActionTestCase { public function setUp() { parent::setUp(); $this->dispatch('/recherche/index?q=pomme',true); } /** @test */ public function pommeShouldBePresentInResult() { $this->assertXPathContentContains('//div', 'pomme'); } } class RechercheControllerSimpleActionWithConfigWithoutSuggestionAchatAsAdminTest extends RechercheControllerSimpleActionTestCase { public function setUp() { parent::setUp(); Class_Profil::getCurrentProfil()->setCfgModules(['recherche' => ['resultatsimple' => ['suggestion_achat' => 0, 'liste_format' => 3]]]); $_SESSION['recherche'] = ['selection' => ['expressionRecherche' => 'potter', 'mode' => 'simple'], 'resultat' => ['req_liste' => "select id_notice,MATCH(alpha_titre) AGAINST(' (POMME POMMES POM)' ) as rel1, MATCH(alpha_auteur) AGAINST(' (POMME POMMES POM)' ) as rel2 from notices Where MATCH(titres,auteurs,editeur,collection,matieres,dewey) AGAINST('+(POMME POMMES POM)' IN BOOLEAN MODE) order by (rel1 * 1.5)+(rel2) desc", 'req_facettes' => "select id_notice,type_doc,facettes from notices Where MATCH(titres,auteurs,editeur,collection,matieres,dewey) AGAINST('+(POMME POMMES POM)' IN BOOLEAN MODE) limit 15000", 'nombre' => 5, 'facettes' => [], 'tags' => []]]; Class_Users::getIdentity()->beAdminPortail(); $this->dispatch('/recherche/simple', true); } /** @test */ public function pageShouldNotContainsLinkToSuggestionAchats() { $this->assertNotXPath('//a[contains(@href, "/abonne/suggestion-achat")]'); } /** @test */ public function linkToConfigModulesRechercheShouldHaveActionResultatAction2Simple() { $this->assertXPath('//img[contains(@onclick, "admin/modules/recherche?config=site&type_module=recherche&id_profil=2&action1=resultat&action2=simple")]'); } } class RechercheControllerSimpleActionWithWrongParametersTest extends RechercheControllerSimpleActionTestCase { public function setUp() { parent::setUp(); $this->dispatch('/recherche/simple/expressionRecherche/pomme/tri/zork', true); } /** @test */ public function pageShouldDisplayResults() { $this->assertXPathContentContains('//div', 'pomme'); } } class RechercheControllerSimpleActionWithEmptyExpressionTest extends RechercheControllerSimpleActionTestCase { public function setUp() { parent::setUp(); $this->dispatch('/recherche/simple/expressionRecherche/%', true); } /** @test */ public function pageShouldDisplayAucunMotSignificatif() { $this->assertXPathContentContains('//div//div//h2', 'aucun mot assez significatif pour la recherche',$this->_response->getBody()); } } abstract class RechercheControllerSimpleActionhListeFormatTestCase extends RechercheControllerSimpleActionTestCase { protected $_liste_format; public function setUp() { parent::setUp(); Class_Profil::getCurrentProfil() ->setCfgModules(['recherche' => ['resultatsimple' => [ 'liste_format' => $this->_liste_format , 'liste_codes' => "TANECR"]]]) ->setSelTypeDoc('1;2;3;4;5'); Class_IntBib::newInstanceWithId(1, ['nom_court' => 'Annecy']); $bib_mock = Storm_Test_ObjectWrapper::mock() ->whenCalled('getSigbExemplaire')->answers(false) ->whenCalled('getId')->answers(1) ->whenCalled('getLibelle')->answers('Tombouctou'); Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Bib')->whenCalled('find')->answers($bib_mock); Class_TypeDoc::newInstanceWithId(1, ['label' => 'Livres']); Class_TypeDoc::newInstanceWithId(2, ['label' => 'Périodique']); $this->dispatch('/recherche/simple/expressionRecherche/potter/facettes/T1/facette/B1/page/2', true); } } class RechercheControllerSimpleActionWithListeFormatMurTest extends RechercheControllerSimpleActionhListeFormatTestCase { protected $_liste_format = Class_Systeme_ModulesAppli::LISTE_FORMAT_MUR; /** @test */ public function pageShouldContainsDivNotice() { $this->assertXPath('//div[@class="liste_mur"]//div[@class="notice"]', $this->_response->getBody()); } /** @test */ public function urlForSousFacettesShouldContainsFacettest1AndB1() { $this->assertXPath('//div[@class="facette"]//a[contains(@href,"/facettes/T1-B1")]'); } /** @test */ public function urlForSousFacettesShouldNotContainsPage() { $this->assertNotXPath('//div[@class="facette"]//a[contains(@href,"/page/2")]'); } /** @test */ public function criteresRechercheShouldContainsBibAnnecy() { $this->assertXPathContentContains('//div[@class="criteres_recherche"]//div[2]', 'Bibliothèque: Annecy', $this->_response->getBody()); } /** @test */ public function facetteBibAnnecyShouldHaveLinkToRemove() { $this->assertXPath('//div[@class="criteres_recherche"]//div[2]//a[@href="/recherche/simple/expressionRecherche/potter/facettes/T1"]'); } /** @test */ public function criteresRechercheShouldContainsTypeDocLivre() { $this->assertXPathContentContains('//div[@class="criteres_recherche"]//div', 'Type de document: Livre'); } /** @test */ public function pageResultatMurShouldBeHTML5Valid() { $this->assertHTML5(); } } class RechercheControllerSimpleActionWithListeFormatVignettesTest extends RechercheControllerSimpleActionhListeFormatTestCase { protected $_liste_format = Class_Systeme_ModulesAppli::LISTE_FORMAT_VIGNETTES; /** @test */ public function pageShouldContainsDivListeVignette() { $this->assertXPath('//div[@class="liste_vignettes"]'); } /** @test */ public function pageShouldContainsTdAnnee() { $this->assertXPathContentContains('//div[@class="liste_vignettes"]//dt', 'Année'); } /** @test */ public function pageShouldContainsTdEditeur() { $this->assertXPathContentContains('//div[@class="liste_vignettes"]//dt', 'Editeur'); } /** @test */ public function pageShouldContainsTdCollection() { $this->assertXPathContentContains('//div[@class="liste_vignettes"]//dt', 'Collection'); } /** @test */ public function pageShouldContainsTdResume() { $this->assertXPathContentContains('//div[@class="liste_vignettes"]//dt', 'Résumé'); } /** @test */ public function pageResultatVignetteShouldBeHtml5Valid() { $this->assertHTML5(); } } class RechercheControllerSimpleActionWithListeFormatAccordeonTest extends RechercheControllerSimpleActionhListeFormatTestCase { protected $_liste_format = Class_Systeme_ModulesAppli::LISTE_FORMAT_ACCORDEON; /** @test */ public function ajaxToGetNotice() { $this->assertXPath('//img[contains(@onclick, "getNoticeAjax")]'); } } class RechercheControllerSimpleActionWithListeFormatTableauTest extends RechercheControllerSimpleActionhListeFormatTestCase { protected $_liste_format = Class_Systeme_ModulesAppli::LISTE_FORMAT_TABLEAU; /** @test */ public function pageShouldContainsTdWithListeTitres() { $this->assertXPath('//td[@class="listeTitre"]'); } } class RechercheControllerSimpleByISBNActionTest extends RechercheControllerSimpleActionTestCase { public function setUp() { parent::setUp(); $this->dispatch('/recherche/simple/expressionRecherche/2-203-00119-4', true); } /** @test */ public function pageResultatRechecheShouldBeDisplayed() { $this->assertXPathContentContains('//span', '2-203-00119-4',$this->_response->getBody()); } } class RechercheControllerAvanceeActionTest extends AbstractControllerTestCase { public function setUp() { parent::setUp(); $this->dispatch('/recherche/simple/tri/alpha_titre', true); } /** @test */ public function pageRechercheAvanceeShouldBeDisplayed() { $this->assertXPathContentContains('//h1', 'recherche'); } /** @test */ public function selectTriShouldHaveAlphaTitreSelected() { $this->assertXPath('//select[@name="tri"]//option[@value="alpha_titre"][@selected="selected"]',$this->_response->getBody()); } /** @test */ public function urlPage2ShouldBeWithTriParameter() { $this->assertXPath('//a[contains(@href,"/tri/alpha_titre/page/2")]',$this->_response->getBody()); } } class RechercheControllerPostReservationAction extends AbstractControllerTestCase { protected $_sent_mails; public function setUp() { parent::setUp(); $_SESSION["captcha_code"] = '1234'; $mock_transport = new MockMailTransport(); Zend_Mail::setDefaultTransport($mock_transport); Class_Bib::getLoader()->newInstanceWithId(4)->setLibelle('Astrolabe'); Class_Notice::newInstanceWithId(4, ['unimarc' => "01570nam0 2200325 450 0010007000000100033000070200017000400210027000571000041000841010008001251020007001331050018001401060006001582000106001642100075002702150044003452250023003893000125004123000020005373000137005573300265006943450018009594100051009775120027010286060033010556060060010886760012011487000045011608010039012052218529 a2-86642-370-4bbr.d8,95 EUR aFRb00347575 aFRbDLE-20031204-51138 a20031107d2003 m h0frey0103 ba| afre aFR ay z 000y| ar1 aCinéma d'animationbTexte impriméedessin animé, marionnettes, images de synthèsefBernard Génin a[Paris]c\"Cahiers du cinéma\"cSCEREN-CNDPdcop. 2003gimpr. en Italie a95 p.cill., couv. ill. en coul.d19 cm2 aLes petits cahiers aLa couv. porte en plus : \"du crayon à l'ordinateur, pour ou contre Disney, Europe-Japon : le dessin animé aujourd'hui\" aBibliogr. p. 93 aSCEREN = Services, cultures, éditions, ressources pour l'éducation nationale. CNDP = Centre national de documentation pédagogique aPrésente un historique du cinéma d'animation, un survol des différentes productions nationales à travers le monde (Etats-Unis, Japon, France, Canada), les techniques du volume animé, l'image de synthèse, mais aussi l'oeuvre de Disney et le film d'auteur. b9782866423704 032525826tLes Petits cahiers (Paris)x1633-90531 aLe cinéma d'animation| 31053394aAnimation (cinéma)| 31031625aDessins animés32195497xHistoire et critique a791.431 |32547161aGéninbBernardf1946-....4070 0aFRbBNFc20031107gAFNOR2intermrc"]); $this->postDispatch('/recherche/reservation', array('id_notice' => 4, 'id_bib' => 4, 'mail_bib' => 'zork@gloub.fr', 'user_name' => 'nanuk', 'demande' => 'je veux le livre', 'user_mail' => 'nanuk@gloub.com', 'code_saisi' => '1234', 'cote' => 'XYZ'), true); $this->_sent_mails = $mock_transport->getSentMails(); } /** @test */ public function twoMailsShouldHaveBeenSent() { $this->assertEquals(2, count($this->_sent_mails)); } /** @test */ public function firstMailFromShouldBeNanuk() { $this->assertEquals('nanuk@gloub.com', array_first($this->_sent_mails)->getFrom()); } /** @test */ public function firstMailSubjectShouldBeDemandeDeReservation() { $this->assertContains('Demande de réservation de document', quoted_printable_decode(array_first($this->_sent_mails)->getSubject())); } /** @test */ public function firstMailToShouldBeZork() { $this->assertContains('zork@gloub.fr', array_first($this->_sent_mails)->getRecipients()); } /** @test */ public function secondMailFromShouldBeNobody() { $this->assertEquals('nobody@noreply.fr', array_last($this->_sent_mails)->getFrom()); } /** @test */ public function secondMailToShouldBeNanuk() { $this->assertContains('nanuk@gloub.com', array_last($this->_sent_mails)->getRecipients()); } } class RechercheControllerRebondTest extends AbstractControllerTestCase { public function setUp() { parent::setUp(); $facettes = Class_Notice::findFirstBy(['where' => 'facettes>""'])->getFacettes(); $code_rebond = explode(' ', trim($facettes))[0]; $this->dispatch('/recherche/simple/expressionRecherche/Potter/code_rebond/'.$code_rebond.'/tri/alpha_titre', true); } /** @test */ public function comboTriShouldHaveAnneePublicationSelected() { $this->assertXPathContentContains('//select[@id="tri"]//option[@value="alpha_titre"][@selected="selected"]', 'Titre',$this->_response->getBody()); } /** @test */ public function lienRetourRechercheInitialeShouldBeRechercheSimple() { $this->assertXPathContentContains('//a[@href="/recherche/saisie/expressionRecherche/Potter/tri/alpha_titre"]', 'Retour', $this->_response->getBody()); } /** @test */ public function lienNouvelleRechercheShouldBeRechercheSimple() { $this->assertXPathContentContains('//a[@href="/recherche/saisie"]', 'Nouvelle recherche', $this->_response->getBody()); } } class RechercheControllerRebondWithFacettesTest extends AbstractControllerTestCase { public function setUp() { parent::setUp(); $this->dispatch('/recherche/simple/expressionRecherche/france/facette/T1/tri/alpha_titre/page/2', true); } /** @test */ public function rebondUrlShouldNotContainsFacettesAndPage() { $this->assertXPath("//div[@class=\"nuage\"]//a[contains(@href,'/recherche/simple/expressionRecherche/france/tri/alpha_titre/code_rebond/')]", $this->_response->getBody()); } } class RechercheControllerGuideeTest extends AbstractControllerTestCase { public function setUp() { parent::setUp(); $this->mock_sql = Storm_Test_ObjectWrapper::mock(); Zend_Registry::set('sql', $this->mock_sql); $this->mock_sql ->whenCalled('fetchAll') ->with('select * from codif_dewey where LENGTH(id_dewey)=1 order by id_dewey') ->answers([ ['id_dewey'=>66, 'libelle' => 'Generalites', 'nb_notices'=>1], ['id_dewey'=>77, 'libelle' => 'Arts', 'nb_notices' => 0]] )->beStrict(); Class_CodifDewey::newInstanceWithId(66, ['libelle' => 'Generalites']); Class_CodifDewey::newInstanceWithId(77, ['libelle' => 'Arts']); Class_AdminVar::newInstanceWithId('FACETTE_DEWEY_LIBELLE', ['valeur' => 'Bouquins']); $this->dispatch('/recherche/simple/rubrique/X1/fil/;X1', true); } /** @test */ public function indiceShouldBeDisplayed() { $this->assertXPathContentContains("//a[contains(@href,'recherche/simple/rubrique/X1')]", 'Bouquins', $this->_response->getBody()); } /** @test */ public function generalitesShouldBeDisplayed() { $this->assertXPathContentContains("//a[contains(@href,'recherche/simple/rubrique/D66')]", 'Generalites'); } /** @test */ public function artsShouldBeDisplayed() { $this->assertXPathContentContains("//a[contains(@href,'recherche/simple/rubrique/D77')]", 'Arts'); } } class RechercheControllerGuideeHomePageTest extends AbstractControllerTestCase { public function setUp() { parent::setUp(); $this->mock_sql = Storm_Test_ObjectWrapper::mock(); Zend_Registry::set('sql', $this->mock_sql); $this->mock_sql ->whenCalled('fetchAll') ->with('select * from codif_dewey where LENGTH(id_dewey)=1 order by id_dewey') ->answers([[ 'id_dewey'=>66, 'libelle' => 'Generalites', 'nb_notices'=>1], [ 'id_dewey'=>77, 'libelle' => 'Arts', 'nb_notices' => 0]] )->beStrict(); $this->mock_sql ->whenCalled('fetchOne') ->with('select libelle from codif_dewey where id_dewey=\'66\'') ->answers( 'Generalites')->beStrict(); $this->mock_sql ->whenCalled('fetchOne') ->with('select libelle from codif_dewey where id_dewey=\'77\'') ->answers('Arts')->beStrict(); Class_AdminVar::newInstanceWithId('FACETTE_DEWEY_LIBELLE', ['valeur' => 'Bouquins']); Class_AdminVar::newInstanceWithId('FACETTE_PCDM4_LIBELLE', ['valeur' => 'Zic']); $this->dispatch('/recherche/guidee', true); } /** @test */ public function x1ShouldBeDisplayedWithLibelleBouquins() { $this->assertXPathContentContains("//a[contains(@href,'recherche/simple/rubrique/X1')]", 'Bouquins'); } /** @test */ public function x2ShouldBeDisplayedWithLibelleZic() { $this->assertXPathContentContains("//a[contains(@href,'recherche/simple/rubrique/X2')]", 'Zic'); } } class RechercheControllerGuideeWithFiltersSelectedTest extends AbstractControllerTestCase { public function setUp() { parent::setUp(); $this->mock_sql = Storm_Test_ObjectWrapper::mock(); $this->mock_moteur_recherche = Storm_Test_ObjectWrapper::mock(); $this->mock_codif = Storm_Test_ObjectWrapper::mock(); $this->mock_moteur_recherche ->whenCalled('getFacettes') ->answers([ "facettes" => [ "T" => [ "titre" => "Type de document", 1 => [ "id" => "D3", "libelle" => "disques", "nombre" =>"2", "url" => "/une/url/Bidon"] ]] , "tags" => [ 1=>[ "id" => "M1355", "libelle" => "CD", "nombre" => 2]], "url_facette" => "/recherche/simple/facettes/" ] ); Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Notice') ->whenCalled('findAllByRequeteRecherche') ->answers([Class_Notice::newInstanceWithId(8), Class_Notice::newInstanceWithId(9)]); $this->mock_codif ->whenCalled('getNomFacette') ->answers('nom de la facette'); $this->mock_codif ->whenCalled('getLibelleFacette') ->answers('facette'); $this->mock_codif ->whenCalled('getNomChamp') ->answers('champ'); $this->mock_moteur_recherche ->whenCalled('lancerRecherche') ->answers([ "req_liste" => "select" , "nombre" => 10, "req_facettes" => "select", 'facettes' => 'M123-A989' ]); Class_Codification::setInstance($this->mock_codif); Class_MoteurRecherche::setInstance($this->mock_moteur_recherche); $this->mock_sql ->whenCalled('fetchOne') ->with('select libelle from codif_dewey where id_dewey=\'66\'') ->answers( 'Generalites')->beStrict(); $this->mock_sql ->whenCalled('fetchOne') ->with('select libelle from codif_dewey where id_dewey=\'77\'') ->answers('Arts')->beStrict(); Zend_Registry::set('sql', $this->mock_sql); $this->dispatch('/recherche/simple/rubrique/D66/facette/A19684', true); } /** @test */ public function facettesShouldBeRemovedInRetirerUrl() { $this->assertXPathContentContains("//a[contains(@href,'recherche/simple/rubrique/D66')]", "suppression",$this->_response->getBody()); } } class RechercheControllerWithPanierTest extends AbstractControllerTestCase { public function setUp() { parent::setUp(); $this->panier_bd = Class_PanierNotice::newInstanceWithId(2, ['id_panier' => 1, 'libelle' => 'Mes BD', 'date_maj' => '10/02/2011', 'notices' => 'COMBAT ORDINAIRE;BLACKSAD']); $this->dispatch('/recherche/simple/id_panier/2/retour_panier/2', true); } /** @test */ public function retourRechercheInitialeShouldLinkToPanierAbonne() { $this->assertXPath('//a[contains(@href, "/panier/index/id_panier/2")]'); } /** @test **/ public function MesBDLibelleShouldBeDisplay() { $this->assertXPathContentContains('//span', "Mes BD",$this->_response->getBody()); } } class RechercheControllerWithCatalogueTest extends AbstractControllerTestCase { public function setUp() { parent::setUp(); $this->catalogue_nouveautes = Class_Catalogue::newInstanceWithId(3, ['libelle' => 'Nouveautés']); $this->dispatch('/recherche/simple/id_catalogue/3'); } /** @test **/ public function MesBDLibelleShouldBeDisplay() { $this->assertXPathContentContains('//span', "Nouveautés",$this->_response->getBody()); } } class RechercheControllerActionSimpleWithResetTest extends AbstractControllerTestCase { /** @test */ public function responseShouldRedirectToActionSaisie() { $this->dispatch('/recherche/simple/statut/reset', true); $this->assertRedirectTo('/opac/recherche/saisie'); } } class RechercheControllerGuideeThesaurusTest extends RechercheControllerGuideeHomePageTest{ public function setUp() { parent::setUp(); $this->mock_sql = Storm_Test_ObjectWrapper::mock(); Storm_Test_ObjectWrapper::onLoaderOfModel('Class_CodifThesaurus') ->whenCalled('findByIdOrigineAndCode') ->answers([Class_CodifThesaurus::newInstanceWithId(59, ['id_thesaurus'=>'59','libelle' => 'Generalites','libelle_facette'=>null])]) ->whenCalled('findFirstBy') ->answers(Class_CodifThesaurus::newInstanceWithId(59, ['id_thesaurus'=>'59','libelle' => 'Generalites','libelle_facette'=>null])) ; Zend_Registry::set('sql', $this->mock_sql); $this->mock_sql ->whenCalled('fetchAll') ->with('select * from codif_dewey where LENGTH(id_dewey)=1 order by id_dewey') ->answers([ ['id_dewey'=>66, 'libelle' => 'Generalites', 'nb_notices'=>1], ['id_dewey'=>77, 'libelle' => 'Arts', 'nb_notices' => 0]] )->beStrict(); $this->mock_sql ->whenCalled('fetchOne') ->with('select libelle from codif_thesaurus where id_thesaurus=\'59\'') ->answers( 'Generalites') ->whenCalled('fetchOne') ->with("Select count(*) from notices Where MATCH(facettes) AGAINST('+H59*' IN BOOLEAN MODE)") ->answers('10'); Class_Profil::getCurrentProfil() ->setCfgModules(['recherche' => ['resultatsimple' => [ 'liste_format' => $this->_liste_format , 'liste_codes' => "TANECRH"]]]) ->setSelTypeDoc('1;2;3;4;5'); $this->dispatch('/recherche/simple/rubrique/H59', true); } /** @test */ public function generaliteThesaurusShouldBeDisplayed() { $this->assertXPathContentContains("//a[contains(@href,'recherche/simple/rubrique/H59')]", 'Generalites', $this->_response->getBody()); } } class RechercheControllerAjoutNoticePanierUrlWithMurConfigTest extends RechercheControllerSimpleActionhListeFormatTestCase { protected $_liste_format = Class_Systeme_ModulesAppli::LISTE_FORMAT_MUR; public function setUp() { parent::setUp(); ZendAfi_Auth::getInstance()->clearIdentity(); Class_Profil::getCurrentProfil()->setCfgModules([]); $this->dispatch('/recherche/simple/expressionRecherche/pomme/tri/alpha_auteur/ajoutPanier/702167',true); } /** @test */ public function pommeShouldBePresentInRedirectedPageAsResultatInSession() { $this->assertXPathContentContains('//div', 'pomme'); } /** @test */ public function pageShouldContainsLinkToSuggestionAchats() { $this->assertXPathContentContains('//a[contains(@href, "/abonne/suggestion-achat")]', 'Suggérer un achat'); } /** @test */ public function selectedTriShouldBeAlphaAuteur() { $this->assertXPath('//select[@name="tri"]//option[@value="alpha_auteur"][@selected="selected"]'); } /** @test */ public function withOutLoggedUserPopupLoginShouldBeInitialized() { $this->assertXPathContentContains('//script', 'initializePopups', $this->_response->getBody()); } /** @test */ public function linksAjoutPanierShouldHaveDataPopupTrue() { $this->assertXPath('//a[contains(@href, "/panier/ajout-ajax/id_notice/")][@data-popup="true"]'); } } class RechercheControllerNavigationTest extends RechercheControllerNoticeTestCase { public function setUp(){ parent::setUp(); $batman = Class_Notice::newInstanceWithId(1, ['clef_alpha'=>'batman']); $tarzan = Class_Notice::newInstanceWithId(12, ['clef_alpha'=>'tarzan']); $batman = Class_Notice::newInstanceWithId(28, ['clef_alpha'=>'musso']); $tarzan = Class_Notice::newInstanceWithId(99, ['clef_alpha'=>'lesarbres']); Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Notice') ->whenCalled('getNoticeIdsByRequeteRecherche') ->with('Select id_notice from notices order by alpha_titre') ->answers([28,12,345,1,99]); } /** @test */ public function navigationSuivantShouldRedirectToBatmanViewnotice() { $this->dispatch('/recherche/viewnotice/id/345/tri/alpha_titre/navigation/suivant',true); $this->assertRedirectRegex('|/recherche/viewnotice/id/1/tri/alpha_titre/clef/batman|'); } /** @test */ public function navigationPrecedentShouldRedirectToTarzanViewnotice() { $this->dispatch('/recherche/viewnotice/id/345/tri/alpha_titre/navigation/precedent',true); $this->assertRedirectRegex('|/recherche/viewnotice/id/12/tri/alpha_titre/clef/tarzan|'); } /** @test */ public function navigationPrecedentOnTheFirstNoticeMussoOfResultatRechercheShouldRedirectToMusso() { $this->dispatch('/recherche/viewnotice/id/28/tri/alpha_titre/navigation/precedent',true); $this->assertRedirectRegex('|/recherche/viewnotice/id/28/tri/alpha_titre/clef/musso|'); } /** @test */ public function navigationSuivantOnTheLastNoticeLesArbresOfResultatRechercheShouldRedirectToLesarbres() { $this->dispatch('/recherche/viewnotice/id/99/tri/alpha_titre/navigation/suivant',true); $this->assertRedirectRegex('|/recherche/viewnotice/id/99/tri/alpha_titre/clef/lesarbres|'); } /** @test */ public function navigationSuivantOnTheFirstNoticeMussoOfResultatRechercheShouldRedirectToTarzan() { $this->dispatch('/recherche/viewnotice/id/28/tri/alpha_titre/navigation/suivant',true); $this->assertRedirectRegex('|/recherche/viewnotice/id/12/tri/alpha_titre/clef/tarzan|'); } /** @test */ public function navigationPrecedentOnTheLastNoticeLesarbresOfResultatRechercheShouldRedirectToBatman() { $this->dispatch('/recherche/viewnotice/id/99/tri/alpha_titre/navigation/precedent',true); $this->assertRedirectRegex('|/recherche/viewnotice/id/1/tri/alpha_titre/clef/batman|'); } /** @test */ public function navigationSuivantOnNoticeLesarbresWhenResultatRechercheIsEmptyShouldRedirectToCurrentNoticeLsearbres() { Class_Notice::whenCalled('getNoticeIdsByRequeteRecherche') ->with('Select id_notice from notices order by alpha_titre') ->answers([]); $this->dispatch('/recherche/viewnotice/id/99/tri/alpha_titre/navigation/suivant',true); $this->assertRedirectRegex('|/recherche/viewnotice/id/99/tri/alpha_titre/clef/lesarbres|'); } /** @test */ public function navigationSuivantOnNoticeLesarbresWhenResultatRechercheAsMussoResultShouldRedirectToCurrentNoticeMusso() { Class_Notice::whenCalled('getNoticeIdsByRequeteRecherche') ->with('Select id_notice from notices order by alpha_titre') ->answers([28]); $this->dispatch('/recherche/viewnotice/id/28/tri/alpha_titre/navigation/suivant',true); $this->assertRedirectRegex('|/recherche/viewnotice/id/28/tri/alpha_titre/clef/musso|'); } } class RechercheControllerAvanceeTest extends RechercheControllerNoticeTestCase { public function setUp() { parent::setUp(); $this->dispatch('/recherche/avancee', true); } /** @test */ public function formActionShouldBeRechercheSimple() { $this->assertXPath('//form[@action="/recherche/simple"]'); } } ?>