<?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',
																										 'date_creation' => '2013-12-31',
																										 '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() {
		ZendAfi_View_Helper_ShareUrl::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();
		ZendAfi_View_Helper_ShareUrl::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();

		$time_source = new TimeSourceForTest('2013-12-27 09:00:00');
		Class_Notice::setTimeSource($time_source);

		$this->notice->setClefChapeau('Gallimard serie');
		$preferences = [
			'barre_nav' => 'Document',
			'entete' =>"ABCDEFGIKLMNOPRSTtYZ8v9",
			'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]]);

		$this->fixture('Class_CodifAuteur', 
									 ['id' => 123,
										'libelle' => 'Bernard Génin']);

		Class_TypeDoc::find(Class_TypeDoc::LIVRE)->setLabel('livres');

		$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 enteteShouldDisplayNouveaute(){
		$this->assertXPathContentContains('//dl//dt[contains(@class,"nouveaute")]/following-sibling::dd','Oui',$this->_response->getBody());
	}

	/** @test **/
	public function noticeHtmlShouldContainsDivNoticeFlagWithSpanNouveaute(){
		$this->assertXpath('//div[@class="flags_notice"]//span[@class="nouveaute"]');
	}

	/** @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 (Auteur)', $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 tabTitleShouldContainTitle() {
		$this->assertXPath('//div[contains(@class, "titre_onglet") and h2]');
	}

	/** @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"',
												 345],
												$this->_web_analytics_client->getAttributesForLastCallOn('trackEvent'));
	}


	/** 
	 * @test 
	 * @group pagetitles
	 */
	public function barreNavShouldContainsCinemaAnimation() {
		$this->assertXPathContentContains('//div[@class="barre_nav"]//span', 'Cinéma d\'animation');
	}
}




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 pageShouldContainsOnlyTwoH1() {
		$this->assertXPathCount('//h1', 2, $this->_response->getBody());
	}

	/** @test */
	public function pageShouldContainsH1WithTitleAndAuthor() {
		$this->assertXPath('//h1//span[contains(text(), "Cinéma d\'animation")][following-sibling::span[text()="Bernard Génin"]]');
	}

	/** @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[@class="retour"][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('')
								 ->setDateCreation('')
									]);
	}

	
	/** @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 withClefAndIdResponseShouldRenderTwilight2() {
		$this->dispatch('recherche/viewnotice/clef/'.urlencode('TWILIGHT--SLADED-3-M6VIDEO-2010-4').'/id/1', true);
		$this->assertXPathContentContains('//div[contains(@class, "view_notice")]//h1', 'Twilight 2');
	}
}




class RechercheControllerUploadVignetteTest extends RechercheControllerNoticeTestCase {
	public function setUp() {
		parent::setUp();
		Class_CodifTypeDoc::beVolatile();
		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Notice')
			->whenCalled('getNoticeIdsByRequeteRecherche')
			->answers([]);

		$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');
	}


	/** @test */
	public function linkToUploadVignetteShouldBePresentForTypeDocThanFiveWhenInKnownFamille() {
		Class_Users::getIdentity()->beAdminPortail();
		$this->notice->setTypeDoc(Class_TypeDoc::EPUB);
		$this->fixture('Class_CodifTypeDoc', ['id' => Class_TypeDoc::EPUB,
																					'famille_id' => Class_CodifTypeDoc::LIVRE]);

		$this->dispatch(sprintf('recherche/viewnotice/id/%d', $this->notice->getId()), true);
		$this->assertXPathContentContains('//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',$this->_response->getBody());
	}	


	/** @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 résultat trouvé',
																			$this->_response->getBody());
	}
}




abstract class RechercheControllerSimpleActionListeFormatTestCase 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']);


	}
}


class RechercheControllerSimpleActionWithListeFormatMurTest extends RechercheControllerSimpleActionListeFormatTestCase {
	protected $_liste_format = Class_Systeme_ModulesAppli::LISTE_FORMAT_MUR;
	public function setUp() {
		parent::setUp();
		$this->dispatch('/recherche/simple/expressionRecherche/potter/facettes/T1/facette/B1/page/2', true);
	}

	/** @test */
	public function pageShouldContainsDivNotice() {
		$this->assertXPath('//div[@class="liste_mur"]//div[@class="notice"]');
	}


	/** @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 iconeSupportShouldHaveTitleLivres() {
    $this->assertXPath('//img[@class="icone_support"][@title="Livres"]');
  }
	
  /** @test */
	public function pageResultatMurShouldBeHTML5Valid() {
		$this->assertHTML5();
	}
}




class RechercheControllerListeCodeWithNouveauteTest extends AbstractControllerTestCase {
	protected $_liste_format = Class_Systeme_ModulesAppli::LISTE_FORMAT_MUR;

	public function setUp() {
		parent::setUp();
		$time_source = new TimeSourceForTest('2013-12-14 09:00:00');
		Class_Notice::setTimeSource($time_source);
		Class_Notice::beVolatile();
		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Notice')
			->whenCalled('findAllBy')
			->answers([Class_Notice::newInstanceWithId(8,
																				 ['clef_alpha'=>'Nouvelle année',
																					'clef_oeuvre' =>'NA',
																					'url_vignette'=>'no',
																					'url_image'=>'no',
																					'date_creation'=> '2013-12-30']),
								 Class_Notice::newInstanceWithId(9,
																								 ['clef_alpha'=>'New Year',
																									'clef_oeuvre' =>'NY',
																									'url_vignette'=>'no',
																									'url_image'=>'no',
																									'date_creation'=> '2013-12-30'])]);

		Class_Profil::getCurrentProfil()
			->setCfgModules(['recherche' => ['resultatsimple' => [
												'liste_format' => $this->_liste_format ,
												'liste_codes' => "TAN9"]]]);
		$this->dispatch('/recherche/simple/expressionRecherche/hello/tri/%2A/facette/T1', true);
	}

	/** @test **/
	public function pageShouldContainsNoticeWithDivNouveauté() {
		$this->assertXPathContentContains('//div[@class="liste_mur"]//div[@class="notice"]//span[@class="notice_nouveaute"]','Nouveauté',$this->_response->getBody());
	}
}



class RechercheControllerFacetteSelectedTest extends AbstractControllerTestCase {
	protected $_liste_format = Class_Systeme_ModulesAppli::LISTE_FORMAT_MUR;

	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');
		$this->dispatch('/recherche/simple/expressionRecherche/hello/tri/%2A/facette/T1', true);

	}

	/** @test */
	public function pageShouldContainsDivNotice() {
		$this->assertXPath('//div[@class="liste_mur"]//div[@class="notice"]', $this->_response->getBody());
	}


/** @test */
	public function pageShouldContainsFacettes() {
		$this->assertXPath('//div[@class="facette"]');
	}

	
	/** @test */
	public function facetteLivresShouldBeChecked() {
		$this->assertXPath('//div[@class="facette"]//li[contains(@class,"selected")]',$this->_response->getBody());
	}


	/** @test */
	public function liFacetteLivresShouldHaveSiblingsAWidthHrefRemoveFacetteLivre() {
		$this->assertXPath('//div[@class="facette"]//li[contains(@class,"selected")]/a[@href="/recherche/simple/expressionRecherche/hello/tri/%2A"]',$this->_response->getBody());
	}
}


class RechercheControllerSimpleActionLibelleFacetteTest extends AbstractControllerTestCase {
	protected $_liste_format = Class_Systeme_ModulesAppli::LISTE_FORMAT_MUR;
	public function setup() {
		parent::setup();
		Class_AdminVar::newInstanceWithId('FACETTE_AUTEUR_LIBELLE', ['valeur' => 'Les super auteurs']);
		Class_AdminVar::newInstanceWithId('FACETTE_DEWEY_LIBELLE', ['valeur' => 'DEWEY ?!@']);
		
		$this->dispatch('/recherche/simple/?'.
										'operateur_titres=and'.
										'&rech_titres='.
										'&operateur_auteurs=and'.
										'&rech_auteurs=musso'.
										'&operateur_matieres=and'.
										'&rech_matieres='.
										'&operateur_dewey=and'.
										'&rech_dewey=pomme'.
										'&operateur_editeur=and'.
										'&rech_editeur='.
										'&operateur_collection=and'.
										'&rech_collection='.
										'&type_recherche=fulltext'.
										'&tri=*'.
										'&annee_debut='.
										'&annee_fin='.
										'&nouveaute='.
										'&annexe='.
										'&section=', true);
	}


	/** @test */
	public function criteresRechercheShouldContainsLesAuteurs() {
		$this->assertXPathContentContains('//div[@class="criteres_recherche"]//div', 'Les super auteurs',$this->_response->getBody());
	}


  /** @test */
	public function criteresRechercheShouldContainsDEWEY() {
		$this->assertXPathContentContains('//div[@class="criteres_recherche"]//div', 'DEWEY ?!@',$this->_response->getBody());
	}
}



class RechercheControllerSimpleActionWithListeFormatVignettesTest extends RechercheControllerSimpleActionListeFormatTestCase {
	protected $_liste_format = Class_Systeme_ModulesAppli::LISTE_FORMAT_VIGNETTES;
	public function setUp() {
		parent::setUp();
		$this->dispatch('/recherche/simple/expressionRecherche/potter/facettes/T1/facette/B1/page/2', true);
	}
	/** @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();
	}

	/** @test */
	public function noticeUrlShouldContainsExpressionRecherchePotter() {
		$this->assertXPath('//div[@class="vignette_titre"]//a[contains(@href,"expressionRecherche/potter")]');
	}
}




class RechercheControllerSimpleActionWithListeFormatChronoTest extends RechercheControllerSimpleActionListeFormatTestCase {
	protected $_liste_format = Class_Systeme_ModulesAppli::LISTE_FORMAT_CHRONO;
	public function setUp() {
		parent::setUp();
		$this->dispatch('/recherche/simple/expressionRecherche/potter/facettes/T1/facette/B1/page/2', true);
	}
	/** @test */
	public function pageShouldContainsDivListeChrono() {
		$this->assertXPath('//div[@class="liste_chrono"][@id="liste_chrono_1"]');
	}


	/** @test */
	public function timelineJSShouldBeLoaded() {
		$this->assertXPath('//script[contains(@src, "public/opac/TimelineJS-2.25/compiled/js/storyjs-embed.js")]');
	}


	/** @test */
	public function createStoryJSFunctionShouldBeIncluded() {
		$this->assertXPathContentContains('//script', 'createStoryJS');
		$this->assertXPathContentContains('//script', '"embed_id":"liste_chrono_3"', $this->_response->getBody());
	}

 
	/** @test */
	public function withListeFormat3InUrlShouldDisplayWithModeVignettes() {
		$this->bootstrap();
		$this->dispatch('/recherche/simple/expressionRecherche/potter/facettes/T1/facette/B1/page/2/liste_format/3', true);
		$this->assertXPath('//div[@class="liste_vignettes"]');
	}
}




class RechercheControllerSimpleActionWithListeFormatAccordeonTest extends RechercheControllerSimpleActionListeFormatTestCase {
	protected $_liste_format = Class_Systeme_ModulesAppli::LISTE_FORMAT_ACCORDEON;
	public function setUp() {
		parent::setUp();
		$this->dispatch('/recherche/simple/expressionRecherche/potter/facettes/T1/facette/B1/page/2', true);
	}


	/** @test */
	public function ajaxToGetNotice() {
		$this->assertXPath('//img[contains(@onclick, "getNoticeAjax")]');
	}
}




class RechercheControllerSimpleActionWithListeFormatTableauTest extends RechercheControllerSimpleActionListeFormatTestCase {
	protected $_liste_format = Class_Systeme_ModulesAppli::LISTE_FORMAT_TABLEAU;
	public function setUp() {
		parent::setUp();
		$this->dispatch('/recherche/simple/expressionRecherche/potter/facettes/T1/facette/B1/page/2', true);
	}


	/** @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);

		$this->fixture('Class_Bib', ['id' => 4, 'libelle' => 'Astrolabe']);
		$this->fixture('Class_Notice', ['id' => 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 aCinema d'animationbTexte impriméedessin animé, marionnettes, images de synthèsefBernard Genin  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 |32547161aGeninbBernardf1946-....4070 0aFRbBNFc20031107gAFNOR2intermrc"]);

		$this->postDispatch('/recherche/reservation',
												['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();
		$this->first_mail = array_first($this->_sent_mails);
		$this->first_content = $this->first_mail->getBodyText()->getContent();
		$this->last_mail = array_last($this->_sent_mails);
	}


	/** @test */
	public function twoMailsShouldHaveBeenSent() {
		$this->assertEquals(2, count($this->_sent_mails));
	}


	/** @test */
	public function firstMailFromShouldBeNanuk() {
		$this->assertEquals('nanuk@gloub.com', 
												$this->first_mail->getFrom());
	}


	/** @test */
	public function firstMailSubjectShouldBeDemandeDeReservation() {
		$this->assertContains('Demande de réservation de document', 
													quoted_printable_decode($this->first_mail->getSubject()));
	}


	/** @test */
	public function firstMailToShouldBeZork() {
		$this->assertContains('zork@gloub.fr', 
													$this->first_mail->getRecipients());
	}


	/** @test */
	public function titleShouldBePresent() {
		$this->assertTrue(false !== strpos($this->first_content, 'Titre : Cinema d\'animation'));
	}


	/** @test */
	public function authorShouldBePresent() {
		$this->assertTrue(false !== strpos($this->first_content, 'Auteur : Bernard Genin'),
											$this->first_content);
	}


	/** @test */
	public function secondMailFromShouldBeNobody() {
		$this->assertEquals('nobody@noreply.fr', 
												$this->last_mail->getFrom());
	}


	/** @test */
	public function secondMailToShouldBeNanuk() {
		$this->assertContains('nanuk@gloub.com', 
													$this->last_mail->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');
	}
}


abstract class RechercheControllerSearchResultGuideeFixtures 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);
	}
}



class RechercheControllerGuideeWithFiltersSelectedTest extends RechercheControllerSearchResultGuideeFixtures {
	public function setUp() {
		parent::setUp();
		$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 RechercheControllerNoticeTestCase {
	protected $_original_sql;

	public function setUp() {
		parent::setUp();

		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Notice')
			->whenCalled('findAllByRequeteRecherche')
			->answers([Class_Notice::newInstanceWithId(1,
																				 ['clef_alpha'=>'COMBAT ORDINAIRE']),
								 Class_Notice::newInstanceWithId(12,
																								 ['clef_alpha'=>'tarzan'])]);

		Class_Profil::getCurrentProfil()
			->setCfgModules(['recherche' => ['resultatsimple' => ['liste_nb_par_page' => 1]]]);


		$this->_original_sql = Zend_Registry::get('sql');
		$mock_sql = Storm_Test_ObjectWrapper::mock();
		Zend_Registry::set('sql', $mock_sql);
		$mock_sql
			->whenCalled('fetchOne')
			->with("Select count(*) from notices Where notices.clef_alpha in('COMBAT ORDINAIRE','BLACKSAD')")
			->answers(2)

			->whenCalled('fetchAll')
			->with("Select id_notice,type_doc,facettes from notices Where notices.clef_alpha in('COMBAT ORDINAIRE','BLACKSAD') limit 15000")
			->answers([ 
									['id_notice' => 1,
									 'type_doc' => 1,
									 'facettes' => ''],

									['id_notice' => 12,
									 'type_doc' => 1,
									 'facettes' => '']])
			->beStrict();

		$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);
	}

	public function tearDown() {
		Zend_Registry::set('sql', $this->_original_sql);
		parent::tearDown();
	}


	/** @test */
	public function retourRechercheInitialeShouldLinkToPanierAbonne() {
		$this->assertXPath('//a[contains(@href, "/panier/index/id_panier/2")]');
	}


	/** @test **/
	public function MesBDLibelleShouldBeDisplay() {
		$this->assertXPathContentContains('//span', "Mes BD");
	}


	/** @test */
	public function urlPage2ShouldBeRechercheSimpleWithIdPanerAndRetourAndPage2() {
		$this->assertXPath('//a[contains(@href,"/recherche/simple/id_panier/2/retour_panier/2/page/2")]',
											 $this->_response->getBody());
	}
}



class RechercheControllerSimpleActionWithCatalogueAndDomainBrowserWidgetTest extends RechercheControllerSimpleActionTestCase {
	public function setUp() {
		parent::setUp();
		Class_CodifThesaurus::beVolatile();
		Class_MoteurRecherche::setInstance(Storm_Test_ObjectWrapper::mock()
																			 ->whenCalled('lancerRecherche')
																			 ->answers(['req_liste' => '',
																									'nombre' => 0,
																									'req_facettes' => '',
																									'statut' => 'erreur'])
																			 ->whenCalled('getFacettes')
																			 ->answers(['facettes' => ''])
																			 );

		Class_Profil::getCurrentProfil()
			->updateModuleConfigAccueil(9,
																['type_module' => 'DOMAIN_BROWSER',
																 'division' => 1,
																 'id_module' => 9,
																 'preferences' => ['display_mode' => Class_Systeme_ModulesAppli::LISTE_FORMAT_MUR,
																									 'root_domain_id' =>4
																	 ]])
			->updateModuleConfigAccueil(10,
																	['type_module' => 'RSS',
																	 'division' => 1,
																	 'id_module' => 10,
																		]);

		
		$this->fixture('Class_Catalogue',
									 ['id'=>4,
										'libelle' => 'A',
										'domaine_parent' => $this->fixture('Class_Catalogue',
																											 ['id'=>3, 
																												'libelle' => 'Nouveautés'])]);
		
	}


	/** @test **/
	public function onRechercheSimpleCatalogue3IdModule9LibelleNouveautesShouldBeDisplay() {
		$this->dispatch('/recherche/simple/id_catalogue/3/id_module/9', true);
		$this->assertXPathContentContains('//span[@class="expression-recherche"]', 
																			'Nouveautés');
	}

	
  /** @test */
	public function onRechercheSimpleCatalogue3IdModule9BreadcrumbShouldBeDisplayed() {
		$this->dispatch('/recherche/simple/id_catalogue/3/id_module/9', true);
		$this->assertXPath('//div[@class="domains liste_mur"]//div[@class="breadcrumb"]//a[@href="/"]', 
											 $this->_response->getBody());
	}


  /** @test */
	public function onRechercheSimpleCatalogue3IdModule9BreadcrumbPageShouldBeHtml5Valid() {
		$this->dispatch('/recherche/simple/id_catalogue/3/id_module/9', true);
		$this->assertHTML5();
	}


  /** @test */
	public function onRechercheSimpleCatalogue3IdModule10BreadcrumbShouldNotBeDisplayed() {
		$this->dispatch('/recherche/simple/id_catalogue/3/id_module/10', true);
		$this->assertNotXPath('//div[@class="domains liste_mur"]//div[@class="breadcrumb"]');
	}
}




class RechercheControllerSimpleActionWithCatalogueAndNoParentsTest extends RechercheControllerSimpleActionTestCase {
	public function setUp() {
		parent::setUp();
		Class_CodifThesaurus::beVolatile();
		Class_MoteurRecherche::setInstance(Storm_Test_ObjectWrapper::mock()
																			 ->whenCalled('lancerRecherche')
																			 ->answers(['req_liste' => '',
																									'nombre' => 0,
																									'req_facettes' => '',
																									'statut' => 'erreur'])
																			 ->whenCalled('getFacettes')
																			 ->answers(['facettes' => ''])
																			 );
		
		$this->fixture('Class_Catalogue',
									 ['id'=>4,
										'libelle' => 'A',
										'domaine_parent' => $this->fixture('Class_Catalogue',
																											 ['id'=>3, 
																												'libelle' => 'Nouveautés'])]);
		
		$this->dispatch('/recherche/simple/id_catalogue/3', true);
	}


	/** @test **/
	public function catalogueLibelleShouldBeDisplay() {
		$this->assertXPathContentContains('//span[@class="expression-recherche"]', "Nouveautés",$this->_response->getBody());
	}

	
  /** @test */
	public function catalogueBreadcrumbShouldNotDisplay() {
		$this->assertNotXPath('//div[@class="liste_mur breadcrumb_domains"]');
	}
}



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 RechercheControllerSimpleActionListeFormatTestCase {
	protected $_liste_format = Class_Systeme_ModulesAppli::LISTE_FORMAT_MUR;

	public function setUp() {
		parent::setUp();
		$this->dispatch('/recherche/simple/expressionRecherche/potter/facettes/T1/facette/B1/page/2', true);
	  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"]');
	}


	/** @test **/
	public function permalinkShouldBeDisplay() {
		$this->assertXPath('//input[contains(@value,"recherche/viewnotice")][contains(@value,"/clef/")][contains(@value,"/id/")]');
	}
}




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 AbstractControllerTestCase {
	public function setUp() {
		parent::setUp();
		$this->dispatch('/recherche/avancee', true);
	}


	/** @test */
	public function formActionShouldBeRechercheSimple() {
		$this->assertXPath('//form[@action="/recherche/simple"]');
	}


	/** @test **/
	public function formShouldContainTagListCocheGenre() {
		$this->assertXPath('//form//input[@id="genre"][following-sibling::div[@class="tag_selection"]]');
	}


	/** @test **/
	public function scriptControlMajShouldNotBePresent() {
		$this->assertNotXPath('//script[contains(@src,"controle_maj")]');
	}


	/** @test **/
	public function scriptTagSlectionShouldBePresent() {
		$this->assertXPath('//script[contains(@src,"/admin/js/tag_selection")]');
	}
}



class RechercheControllerViewNoticeWichIsInMyPanier extends AbstractControllerTestCase {

	public function setup() {
		parent::setup();

		parent::setUp();
		Class_Users::beVolatile();
		Class_Notice::beVolatile();
		Class_PanierNotice::beVolatile();
		Class_PanierNoticeCatalogue::beVolatile();

		$this->user = Class_Users::newInstanceWithId(23, ['pseudo' => 'Pioup', 
																											'nom' => 'Jojo',
																											'login' => 'Super',
																											'password' => '123789']);

		$this->user->save();
		ZendAfi_Auth::getInstance()->logUser($this->user);

		$this->panier_bd = Class_PanierNotice::newInstanceWithId(2,
																														 ['id_panier' => 1,
																															'libelle' => 'Mes BD',
																															'date_maj' => '10/02/2011',
																															'notices' => 'POMME;POIRE',
																															'user' => $this->user]);
		$this->panier_bd->save();

		$this->panier_bd_2 = Class_PanierNotice::newInstanceWithId(3,
																															 ['id_panier' => 1,
																																'libelle' => 'Mes BD 2',
																																'date_maj' => '10/02/2011',
																																'notices' => 'POIRE',
																																'user' => $this->user]);
		$this->panier_bd_2->save();

		$pomme = Class_Notice::newInstanceWithId(10,
																						 ['titre_principal' => 'Le combat des pommes',
																							'clef_alpha' => 'POMME',
																							'date_creation' => '2010-01']);
			
		$poire = Class_Notice::newInstanceWithId(12, ['titre_principal' => 'Le combat des poires',
																									'clef_alpha' => 'POIRE',
																									'date_creation' => '2010-01']);

		

		$this->panier_loader = Storm_Test_ObjectWrapper::onLoaderOfModel('Class_PanierNotice')
			->whenCalled('save')->answers(true)
			->whenCalled('delete')->answers(true)

			->whenCalled('findAll')->answers([$this->panier_bd])

			->whenCalled('findAllBy')
			->with(['role' => 'user', 'model' => $this->user])
			->answers([$this->panier_bd]);

			
	}


	/** @test **/
	public function viewNoticePommeShouldContainsLinkAddToPanier() {
		$this->dispatch('recherche/viewnotice/id/10',true);
		$this->assertXpath('//div[@class="navigation"]/a[@class="panier dans_panier"]',$this->_response->getBody());
	}


	/** @test **/
	public function viewnoticeLinkAddToPanierTitleShouldBeDansBd() {
		$this->dispatch('recherche/viewnotice/id/10',true);
		$this->assertXpath('//div[@class="navigation"]/a[@class="panier dans_panier"][@title="Dans le panier Mes BD"]',$this->_response->getBody());
	}

	
	/** @test **/
	public function viewNoticePommeShouldContainsTagDansPanierBd() {
		$this->dispatch('recherche/viewnotice/id/10',true);
		$this->assertXpath('//div[@class="flags_notice"]/span[@class="dans_panier"][@title="Dans le panier Mes BD"]',$this->_response->getBody());
	}


	/** @test **/
	public function viewNoticePoireShouldContainsTagDansPanierBdEtBd2() {
		$this->dispatch('recherche/viewnotice/id/12',true);
		$this->assertXpath('//div[@class="flags_notice"]/span[@class="dans_panier"][@title="Dans les paniers Mes BD 2 - Mes BD"]',$this->_response->getBody());
	}


	/** @test **/
	public function withOutLoggedUserFlagsNoticeShouldNotContainsDansPanier() {
		ZendAfi_Auth::getInstance()->clearIdentity();
		$this->dispatch('recherche/viewnotice/id/12',true);
		$this->assertNotXpath('//div[@class="flags_notice"]/span[@class="dans_panier"]',$this->_response->getBody());
	}

}



class RechercheControllerSimpleActionWithCvsActivatedTest extends RechercheControllerSimpleActionTestCase {

	protected $_cvs;
	
	public function setUp() {
		parent::setUp();
		$this->dispatch('/recherche/simple/expressionRecherche/potter/facettes/T1/facette/B1/page/2', true);
		Class_Profil::getCurrentProfil()
			->setCfgModules(['recherche' =>	
											 ['resultatsimple' => [	'cvs_autres_resultats' => 'Results from opac',
																							'cvs_resultat_titre' => 'CVS Ressources',
																							'cvs_nb_result' => '5',
																							'cvs_display_position' => '1']]]);

		RessourcesNumeriquesFixtures::activateCVS();
		$group_cvs = $this->fixture('Class_UserGroup', ['id' => 20 ,
																										'libelle' => 'CVS acces'])
			->addRight(Class_UserGroup::RIGHT_ACCES_CVS);
		
		$polo = $this->fixture('Class_Users', ['id' => 15, 
																					 'login' => 'polo',
																					 'password' => '456',
																					 'pseudo' => 'polo',
																					 'date_fin' => '2025-04-26'])
			->beAbonneSIGB()
			->setUserGroups([$group_cvs]);

		ZendAfi_Auth::getInstance()->logUser($polo);
		$record = $this->fixture('Class_Notice',['id'=> 10,
																						 'titre_principal' => 'Le photographe',
																						 'auteur_principal' => 'Guibert']);
		$this->_cvs = Class_CVSLink::forUser($record);
		$http_client = Storm_Test_ObjectWrapper::mock();
		
		Class_CVSLink::setDefaultHttpClient($http_client);
		Class_Xml::setDefaultHttpClient($http_client);
		RessourcesNumeriquesFixtures::activateCVS();

		$http_client
			->whenCalled('postData')
			->answers($this->_returnedXML());
		
		$this->dispatch('/recherche/simple/expressionRecherche/pomme/tri/alpha_auteur',true);

	}

	protected function _returnedXML() {
		$xml = file_get_contents(realpath(dirname(__FILE__)). '/../../../../fixtures/cvs_search_ecole.xml');
		return $xml;
	}

	
	/** @test **/
	public function titleResultFromOpacShouldBeDiplay() {
		$this->assertXPathContentContains('//h1','Results from opac');
	}


	/** @test */
	public function simpleContentShouldContainsCVSDiv() {
		$this->assertXPath('//div[@class="conteneur_simple"]//div[contains(@class,"cvs_container")]', $this->_response->getBody());
	}


	/** @test **/
	public function cvsBoiteShouldHaveTitreCVSRessources() {
		$this->assertXPathContentContains('//div[@class="conteneur_simple"]//div[contains(@class,"cvs_container")]//h1', 'CVS Ressources', $this->_response->getBody());
	}

	/** @test **/
	public function cvsBoiteClassShouldHavePosition1() {
		$this->assertXPath('//div[@class="conteneur_simple"]//div[@class="cvs_container position_1"]', $this->_response->getBody());
	}
}



class RechercheControllerSimpleActionWithCvsActivatedAndPreferencesHiddenTest extends RechercheControllerSimpleActionTestCase {
	public function setUp() {
		parent::setUp();

		Class_Profil::getCurrentProfil()
			->setCfgModules(['recherche' =>	
											 ['resultatsimple' => [	'cvs_display_position' => '0']]]);
		$zork = $this->fixture('Class_Users',
													 ['id' => 4,
														'login' => 'zork_sigb',
														'role_level' => 2,
														'idabon' => '98475',
														'id_site' => 2,
														'password' => 'xzy']);
		$group_multimedia = $this->fixture('Class_UserGroup',
																			 ['id' => 20, 
																				'libelle' => 'Multimedia'])
			->addRight(Class_UserGroup::RIGHT_ACCES_CVS);
		

		$zork->beAbonneSIGB()
			->setUserGroups([$this->group_multimedia])
			->save();
		ZendAfi_Auth::getInstance()->logUser($zork);
		RessourcesNumeriquesFixtures::activateCVS();

		$this->dispatch('/recherche/simple/expressionRecherche/pomme/tri/alpha_auteur',true);

	}


	/** @test */
	public function simpleContentShouldNotContainsCVSDiv() {
		$this->assertNotXPath('//div[@class="conteneur_simple"]//div[contains(@class,"cvs_container")]');
	}

}

?>