<?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 ProfilOptionsControllerWithProfilAdulteTestCase extends AbstractControllerTestCase {
	protected function _loginHook($account) {
		$account->ROLE = "";
		$account->ROLE_LEVEL = 0;
		$account->ID_USER = "";
		$account->PSEUDO = "";
	}

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

		Class_AdminVar::newInstanceWithId('MENU_BOITE', ['valeur' => 1]);
		Class_Systeme_ModulesMenu::reset();

		$cfg_menus = ['H' => ['libelle' => 'Menu horizontal',
													'picto' => 'vide.gif',
													'menus' => [['type_menu' => 'MENU',
																			 'libelle' => 'Pratique',
																			 'picto' => 'bookmark.png',
																			 'preferences' => [],
																			 'sous_menus' => [['type_menu' => 'ACCUEIL',
																												 'libelle' => 'Accueil',
																										     'picto' => 'vide.gif',
																										     'preferences' => [],
																										     'sous_menus' => ''],

																											 ['type_menu' => Class_Systeme_ModulesMenu::MODULE_ACCUEIL_PREFIX.'CRITIQUES',
																												'libelle' => 'Critiques',
																												'picto' => 'vide.gif',
																												'preferences' => ['rss_avis' => '1', 'id_panier' => 3]]]],

																			['type_menu' => 'URL',
																			 'libelle' => 'Google',
																			 'picto' => 'vide.gif',
																			 'preferences' => ['url' => 'http://www.google.com',
																												 'target' => 0]],

																			['type_menu' => 'NEWS',
																			 'libelle' => 'Articles',
																			 'picto' => 'vide.gif',
																			 'preferences' => ['id_items' => '1-3',
																												 'display_order' => 'Selection']],

																			['type_menu' => 'FORM_CONTACT',
																			 'libelle' => 'Formulaire contact',
																			 'picto' => 'vide.gif' ],

																			['type_menu' => 'PANIER',
																			 'libelle' => 'Paniers de notices',
																			 'picto' => 'vide.gif' ],

																			['type_menu' => 'SITO',
																			 'libelle' => 'Sitothèque',
																			 'preferences' => ['id_items' => '10-1-2'],
																			 'picto' => 'vide.gif' ],

																			['type_menu' => Class_Systeme_ModulesMenu::MODULE_ACCUEIL_PREFIX.'CALENDAR',
																			 'libelle' => 'Calendrier',
																			 'picto' => 'vide.gif',
																			 'preferences' => ['nb_events' => 5,
																												 'display_cat_select' => true]],

																			['type_menu' => Class_Systeme_ModulesMenu::MODULE_ACCUEIL_PREFIX.'KIOSQUE',
																			 'libelle' => 'Kiosque',
																			 'picto' => 'vide.gif',
																			 'preferences' => ['id_panier' => 1,
																												 'style_liste' => 'mur',
																												 'titre' => 'Nouveautés']],

																			['type_menu' => 'CATALOGUE',
																			 'libelle' => 'mon catalogue',
																			 'preferences' => ['id_catalogue' => '2',
																												 'tri' => 1,
																												 'titre' => 'mon catalogue'],
																			 'picto' => 'vide.gif' ],


																			['type_menu' => 'CONNECT',
																			 'libelle' => 'Connexion',
																			 'preferences' => [],
																			 'picto' => 'vide.gif' ],

																	]
													],

									'V' => ['libelle' => 'Menu vertical',
													'picto' => 'vide.gif']];



		$this->profil_adulte = Class_Profil::getCurrentProfil()
			->setBrowser('opac')
			->setLibelle('Profil Adulte')
			->setHauteurBanniere(150)
			->setCouleurTexteBandeau('#F2C')
			->setCouleurLienBandeau('#234')
			->setMenuHautOn(true)
			->setCfgMenus($cfg_menus)
			->setCommentaire('Super bib')
			->setRefTags('bib,Adulte');
	}
}




class ProfilOptionsControllerProfilAdulteWithCacheTest extends ProfilOptionsControllerWithProfilAdulteTestCase {
	public function setUp(){
		parent::setUp();
		Class_AdminVar::newInstanceWithId('AFFICHER_DISPONIBILITE_SUR_RECHERCHE', ['valeur'=>1] );
		Class_AdminVar::newInstanceWithId('CACHE_ACTIF', ['valeur'=>1] );
		$this->dispatch('/');
		$this->bootstrap();
		Class_ScriptLoader::resetInstance();
		$this->dispatch('/');
	}


	/** @test */
	public function menuHorizontalAccueilShouldNotContainsEmptyUL() {
		$this->assertNotXPath('//li[@class="menu"]//a[text()="Accueil"][following-sibling::ul]', $this->_response->getBody());
	}


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


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


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


	/** @test */
	public function scriptShouldContainsDisponibiliteAjaxBaseUrl() {
		$this->assertXPathContentContains('//script', 'disponibiliteAjaxBaseUrl');
	}


	/** @test */
	public function withOutOptionAfficherDisponibiliteSurRechercheScriptShouldNotContainsDisponibiliteAjaxBaseUrl(){
		Class_AdminVar::newInstanceWithId('AFFICHER_DISPONIBILITE_SUR_RECHERCHE', ['valeur'=>0] );
		$this->bootstrap();
		Class_ScriptLoader::resetInstance();
		$this->dispatch('/');
		$this->assertNotXPathContentContains('//script', 'disponibiliteAjaxBaseUrl=');
	}
}




class ProfilOptionsControllerTwitterLinkWithProfilAdulteTest extends ProfilOptionsControllerWithProfilAdulteTestCase {
	protected $_mock_web_client;

	public function setUp() {
		parent::setUp();
		$this->_mock_web_client = Storm_Test_ObjectWrapper::on(new Class_WebService_SimpleWebClient());
		Class_WebService_ReseauxSociaux::setDefaultWebClient($this->_mock_web_client);

		$this->_mock_web_client
			->whenCalled('open_url')
			->answers('http://is.gd/PkdNgD');

	}


	public function tearDown() {
		Class_WebService_ReseauxSociaux::resetDefaultWebClient();
		parent::tearDown();
	}

	/** @test */
	public function twitterLinkShouldReturnJavascriptForTweet() {
		$this->dispatch('/opac/index/share/on/twitter/titre/Profil+Adulte?url='.urlencode('http://localhost'.BASE_URL.'/index/index'), true);
		$this->assertContains("window.open('http://twitter.com/share?url=http%3A%2F%2Fis.gd%2FPkdNgD&text=Profil+Adulte&counturl=http%3A%2F%2Fis.gd%2FPkdNgD','_blank','toolbar=0,status=0,width=800, height=410');",
													$this->_response->getBody());
	}


	/** @test */
	public function facebookLinkShouldReturnJavascriptForTweet() {
		$this->dispatch('/opac/index/share/on/facebook/titre/Profil+Adulte?url='.urlencode('/index/index'), true);
		$this->assertContains("window.open('https://www.facebook.com/sharer/sharer.php?m2w&s=100&p%5Btitle%5D=Profil+Adulte&p%5Burl%5D=http%3A%2F%2Fis.gd%2FPkdNgD','_blank','toolbar=0,status=0,width=800, height=410');",
													$this->_response->getBody());
	}
}




class ProfilOptionsControllerProfilAdulteTest extends ProfilOptionsControllerWithProfilAdulteTestCase {
	/** @test */
	public function titleShouldBeProfilAdulteSeConnecterInAuth() {
		$this->dispatch('/opac/auth/login');
		$this->assertQueryContentContains('head title', 'Profil Adulte - Se connecter');
	}


	/** @test */
	public function autocompleteShouldBeAuth() {
		$this->profil_adulte->setCfgModules(['auth' =>	['login' => ['autocomplete_off' => 0]]]);
		$this->dispatch('/opac/auth/login');
		$this->assertXPath('//form[@class="login form"][@autocomplete="on"]');
	}


	/** @test */
	public function getHauteurBanniereShouldReturn150() {
		$this->assertEquals(150, $this->profil_adulte->getHauteurBanniere());
	}


	/** @test */
	public function cfgSiteShouldIncludeHauteurBanniere() {
		$cfg_site = $this->profil_adulte->getCfgSiteAsArray();
		$this->assertEquals(150, $cfg_site['hauteur_banniere']);
	}


	/** @test */
	public function PATH_JAVAShouldExists() {
		$this->assertTrue(file_exists(PATH_JAVA));
	}


	/** @test */
	function withSiteDownShouldDisplaySiteBloque() {
		Class_AdminVar::getLoader()
			->newInstanceWithId('SITE_OK')
			->setValeur('0');

		$this->dispatch('/opac/');
		$this->assertXPathContentContains('//div', 'accès au site est momentanément bloqué');
	}
}




class ProfilOptionsControllerViewProfilAdulteTest extends ProfilOptionsControllerWithProfilAdulteTestCase {
	public function setUp() {
		parent::setUp();
		$this->dispatch('/opac/');		
	}


	/** @test */
	public function titleShouldBeProfilAdulteInHomePage() {
		$this->assertQueryContentContains('head title', 'Profil Adulte');
	}

	/** @test */
	public function metaDescriptionShouldBeSuperBibInHomePage() {
		$this->assertXPath("//meta[@name='description'][contains(@content,'Super bib')]");
	}


	/** @test */
	public function metaKeywordsShouldBeBibAndAdulteInHomePage() {
		$this->assertXPath("//meta[@name='keywords'][@content='bib,Adulte']");
	}


	/** @test */
	public function profilCssShouldBeIncludedInHeader() {
		$this->assertXPath("//style[@id='profil_stylesheet']");
	}


	/** @test */
	public function hauteurBanniere150ShouldBeInProfilCss() {
		$this->assertXPathContentContains("//style[@id='profil_stylesheet']",
																			"div#banniere, div#header{height:150px}");
	}


	/** @test */
	public function headerTextColorShouldBeSharpF2C() {
		$this->assertXPathContentContains("//style[@id='profil_stylesheet']",
																			"div#header * {color:#F2C}");
	}


	/** @test */
	public function headerLinkColorShouldBeSharp234() {
		$this->assertXPathContentContains("//style[@id='profil_stylesheet']",
																			"div#header a, div#header a:visited {color:#234}");
	}

	/** @test */
	public function menuHorizontalShouldIncludeExternalLinkToGoogle() {
		$this->assertXPathContentContains("//div[@id='menu_horizontal']//li//a[@href='http://www.google.com'][@target='_blank']", 
																			'Google');
	}


	/** @test */
	public function menuHorizontalShouldIncludeLinkToArticleCms() {
		$this->assertXPathContentContains("//div[@id='menu_horizontal']//li//a[contains(@href, 'cms/articleviewpreferences?id_items=1-3&nb_aff=5&nb_analyse=10&display_order=Selection')]", 
																			'Articles');
	}


	/** @test */
	public function menuHorizontalShouldIncludeLinkToFormulaireContact() {
		$this->assertXPathContentContains("//div[@id='menu_horizontal']//li[@class='menu']//a[contains(@href, '/index/formulairecontact')]", 
																			'Formulaire contact');
	}


	/** @test */
	public function menuHorizontalShouldIncludeLinkToPanierNotices() {
		$this->assertXPathContentContains("//div[@id='menu_horizontal']//li[@class='menu']//a[contains(@href, '/panier')]", 
																			'Paniers de notices');
	}


	/** @test */
	public function menuHorizontalShouldDisplayBoiteCalendrier() {
		$this->assertXPath('//div[@id="menu_horizontal"]//li[@class="menu boite"]//div[@class="boite calendar"]//td[@class="calendar_title_month"]/a');
	}


	/** @test */
	public function menuHorizontalShouldDisplayBoiteCritiquesInSubMenu() {
		$this->assertXPath('//div[@id="menu_horizontal"]//li[@class="menu"]//li[@class="boite"]//div[@class="boite critiques"]');
	}


	/** @test */
	public function menuHorizontalShouldDisplaySitothequeWithUrl() {
		$this->assertXPath('//div[@id="menu_horizontal"]//li[@class="menu"]//a[contains(@href, "/sito/sitoview?id_categorie=&id_items=10-1-2&nb=10&titre=&picto=vide.gif&libelle=Sitoth%C3%A8que")]');
	}


	/** @test */
	public function menuHorizontalShouldDisplayConnexionWithUrl() {
		$this->assertXPath('//div[@id="menu_horizontal"]//li[@class="menu"]//a[contains(@href, "/auth/login/")]');
	}


	/** @test */
	public function menuHorizontalShouldDisplayCatalogueWithUrl() {
		$this->assertXPath('//div[@id="menu_horizontal"]//li[@class="menu"]//a[contains(@href, "/recherche/simple/titre/mon+catalogue/nb_notices/20/aleatoire/1/tri/date_creation+desc/nb_analyse/50/boite//id_catalogue/2/picto/vide.gif/libelle/mon+catalogue")]');
	}


	/** @test */
	function faviconShouldNotBeSet() {
		$this->assertNotXPath('//link[@rel="shortcut icon"]');
	}


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


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


	/** @test */
	function cycleBanniereScriptsShouldNotBeIncluded() {
		$this->assertNotXPathContentContains('//script', '$("#banniere a").cycle');
	}


	/** @test */
	public function pageShouldIncludeNuageCss() {
		$this->assertXPath('//link[contains(@href, "nuage_tags.css")]');
	}


	/** 
	 * @group integration
	 * @test 
	 */
	public function pageShouldBeHtml5Valid() {
		$this->assertHTML5($this->_response->getBody());
	}
}




abstract class ProfilOptionsControllerProfilAdulteAsAdminTestCase extends ProfilOptionsControllerWithProfilAdulteTestCase {
	public function setUp() {
		parent::setUp();

		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Profil')
			->whenCalled('save')
			->answers(true);

		$admin = Class_Users::newInstanceWithId(34, ['login' => 'admin'])->beAdminPortail();
		ZendAfi_Auth::getInstance()->logUser($admin);
	}
}




class ProfilOptionsControllerViewProfilAdulteAsAdminTest extends ProfilOptionsControllerProfilAdulteAsAdminTestCase {
	public function setUp() {
		parent::setUp();
		$this->dispatch('/opac/');		
	}


	/** @test */
	public function menuHorizontalCalendrierConfigShouldContainsConfigTypeMenu() {
		$this->assertXPath('//div[@id="menu_horizontal"]//li[@class="menu boite"]//div[@class="boite calendar"]//img[contains(@onclick, "menus/calendrier?config=menu&id_profil=2&id_module=8&type_menu=MODULE_ACCUEIL_CALENDAR&preferences=nb_events%3D5")]');
	}


	/** @test */
	public function menuHorizontalCritiquesConfigShouldContainsConfigTypeMenu() {
		$this->assertXPath('//div[@id="menu_horizontal"]//li[@class="boite"]//div[@class="boite critiques"]//img[contains(@onclick, "menus/critiques?config=menu&id_profil=2&id_module=2&type_menu=MODULE_ACCUEIL_CRITIQUES&preferences=rss_avis%3D1%7Cid_panier%3D3")]');
	}


	/** @test */
	public function menuHorizontalKiosqueConfigShouldContainsConfigTypeMenu() {
		$this->assertXPath('//div[@id="menu_horizontal"]//li[@class="menu boite"]//div[@class="boite kiosque"]//img[contains(@onclick, "menus/kiosque?config=menu&id_profil=2&id_module=9&type_menu=MODULE_ACCUEIL_KIOSQUE&preferences=id_panier%3D1%7Cstyle_liste%3Dmur")]');
	}
}




class ProfilOptionsControllerProfilAdulteAsAdminPostConfigCalendrierTest extends ProfilOptionsControllerProfilAdulteAsAdminTestCase {
	public function setUp() {
		parent::setUp();

		$this->postDispatch('/admin/menus/calendrier?config=menu&id_profil=2&id_module=8&type_menu=MODULE_ACCUEIL_CALENDAR&preferences=nb_events%3D5',
												['nb_events' => 12,
												 'libelle' => 'Agenda']);		
	}


	/** @test */
	public function savedMenuCalendrierShouldHaveNbEvents12() {
		$preferences = $this->profil_adulte->getMenuHorizontal()->getMenuPrefencesByIdModule(8);
		$this->assertEquals(12, $preferences['nb_events']);
	}


	/** @test */
	public function profilShouldBeSaved() {
		$this->assertTrue(Class_Profil::methodHasBeenCalled('save'));
	}
}




class ProfilOptionsControllerProfilAdulteAsAdminPostConfigKiosqueStyleReloadTest extends ProfilOptionsControllerProfilAdulteAsAdminTestCase {
	public function setUp() {
		parent::setUp();

		$this->postDispatch('/admin/menus/kiosque/styles_reload/1?config=menu&id_profil=2&id_module=9&type_menu=MODULE_ACCUEIL_KIOSQUE&preferences=id_panier%3D1%7Cstyle_liste%3Dmur',
												['style_liste' => 'vignettes',
												 'nb_notices' => 2,
												 'nb_analyse' => 2,
												 'id_panier' => 0,
												 'rss_avis' => 0,
												 'titre' => 'Nouveautes',
												 'aleatoire' => 0,
												 'tri' => 0,
												 'only_img' => 0,
												 'id_catalogue' => 0]);		
	}


	/** @test */
	public function selectStyleListeShouldHaveVignettesSelected() {
		$this->assertXPath('//select[@name="style_liste"]//option[@value="vignettes"][@selected="selected"]');
	}


	/** @test */
	public function inputNbAnalyseShouldBeTwo() {
		$this->assertXPath('//input[@name="nb_analyse"][@value="2"]');
	}
}




abstract class ProfilOptionsControllerProfilJeunesseWithPagesJeuxMusiqueTestCase extends AbstractControllerTestCase {
	protected function _loginHook($account) {
		$account->ROLE = "";
		$account->ROLE_LEVEL = 0;
		$account->ID_USER = "";
		$account->PSEUDO = "";
	}

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

		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_CodifAnnexe')
			->whenCalled('findAllBy')
			->with(['invisible' => 0, 'order' => 'libelle'])
			->answers([Class_CodifAnnexe::newInstanceWithId(3, ['code' => 'ARC', 'libelle' => 'Archives'])]);


		$cfg_accueil_jeunesse = ['modules' => ['1' => ['division' => '4',
																									 'type_module' => 'RECH_SIMPLE',
																									 'preferences' => ['recherche_avancee' => "on",
																																		 'select_doc' => 'on',
																																		 'select_annexe' => 'on']],

																					 '2' => ['division' => '4',
																									 'type_module' => 'LOGIN'],

																					 '4' => ['division' => '1',
																									 'type_module' => 'NEWS'],
																					 
																					 '45' => ['division' => '1',
																										'type_module' => 'CALENDAR',
																										'preferences' => ['display_calendar' => '0',
																																			'mode-affichage' => 'simple']],

																					 '8' => ['division' => '2',
																									 'type_module' => 'RESERVATIONS',
																									 'preferences' => ['titre' => 'Mes réservations']],

																					 '9' => ['division' => '2',
																									 'type_module' => 'PRETS',
																									 'preferences' => ['titre' => 'Mes documents']],

																					 '10' => ['division' => '1',
																									 'type_module' => 'NEWSLETTERS',
																									 'preferences' => ['titre' => 'Lettres d\'informations']],

																					 '11' => ['division' => '2',
																									 'type_module' => 'MULTIMEDIA',
																										'preferences' => ['titre' => 'Postes multimédia']],

																					 '12' => ['division' => '2',
																										'type_module' => 'KIOSQUE',
																										'preferences' => ['style_liste' => 'vignettes']],
																					 
																					 '18' => ['division' => '1',
																										'type_module' => 'PANIER',
																										'preferences' => ['titre' => 'Mes Paniers']],

																					 '19' => ['division' => '5',
																										'type_module' => 'PANIER',
																										'preferences' => ['titre' => 'Mes Paniers flottants']]

				],
														 'options' => 	[]];


		$this->profil_jeunesse = Class_Profil::getCurrentProfil()
			->setBrowser('opac')
			->setTitreSite(null)
			->setLibelle('Profil Jeunesse')
			->setCfgAccueil($cfg_accueil_jeunesse)
			->setFavicon('afi-opac3/userfiles/favicon.ico')
			->setHeaderCss('afi-opac3/userfiles/jeunesse.css')
			->setHeaderJs('afi-opac3/userfiles/jeunesse.js')
			->setLogoGaucheImg('/userfiles/mabib.png')
			->setLogoGaucheLink('http://mabib.fr')
			->setLogoDroiteImg('/userfiles/macommune.png')
			->setLogoDroiteLink('http://macommune.fr')
			->setHeaderImgCycle(true);

		$cfg_accueil_jeux = ['modules' => ['4' => ['division' => '1',
																							 'type_module' => 'CRITIQUES'],

																			 '7' => ['division' => '1',
																							 'type_module' => 'KIOSQUE',
																							 'preferences' => ['style_liste' => 'cube',
																																 'op_hauteur_img' => 90]],

																			 '8' => ['division' => '1',
																							 'type_module' => 'RSS'],

																			 '10' => ['division' => '2',
																								'type_module' => 'SITO'],

																			 '12' => ['division' => '2',
																								'type_module' => 'KIOSQUE',
																								'preferences' => ['style_liste' => 'vignettes']],

																			 '13' => ['division' => '2',
																								'type_module' => 'KIOSQUE',
																								'preferences' => ['style_liste' => 'mur']]],
												 'options' => 	[]];

		$this->page_jeux = Class_Profil::newInstanceWithId(12)
			->setParentId($this->profil_jeunesse->getId())
			->setLibelle('Jeux')
			->setCfgAccueil($cfg_accueil_jeux);


		$this->page_musique = Class_Profil::newInstanceWithId(23)
			->setParentId($this->profil_jeunesse->getId())
			->setLibelle('Musique');

		$_SERVER["REQUEST_URI"] = '/';


		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Newsletter')
			->whenCalled('count')->answers(5)
			->whenCalled('findAll')->answers([Class_Newsletter::newInstanceWithId(23, ['titre' => 'Nouveautés'])]);
	}
}




class ProfilOptionsControllerProfilJeunesseAndJeuxTest extends ProfilOptionsControllerProfilJeunesseWithPagesJeuxMusiqueTestCase {
	/** @test */
	function boiteActionForModuleIdOneShouldDisplayBoiteRecherche() {
		$this->dispatch('/opac/index/embed_module/id_profil/2/id_module/1', true);
		$this->assertXPath('//div[@class="recherche_avancee"]//a[contains(@href, "avancee")]');
	}


	/** @test */
	public function titleShouldBeProfilJeunesseSeConnecterInAuth() {
		$this->dispatch('/opac/auth/login');
		$this->assertQueryContentContains('head title', 'Profil Jeunesse - Se connecter');
	}

			
	/** @test **/
	public function titleBoitePanierShouldLinkToPanierIndex() {
		ZendAfi_Auth::getInstance()->logUser(Class_Users::newInstanceWithId(34, ['login' => 'admin'])->beAdminPortail());
		$this->dispatch('/opac');
		$this->assertXPath('//div[contains(@class,"panier")]//h1/a[contains(@href,"/panier")]',$this->_response->getBody());
			}


	/** @test **/
	public function titleBoitePanierShouldNotLinkToAbonne() {
		ZendAfi_Auth::getInstance()->logUser(Class_Users::newInstanceWithId(34, ['login' => 'admin'])->beAdminPortail());
		$this->dispatch('/opac');
		$this->assertNotXPath('//div[contains(@class,"panier")]//h1/a[contains(@href,"/abonne")]');
	}


	/** @test **/
	public function boitePanierFlottantShouldBePresentOnAccueil() {
		ZendAfi_Auth::getInstance()->logUser(Class_Users::newInstanceWithId(34, ['login' => 'admin'])->beAdminPortail());
		$this->dispatch('/opac');
		$this->assertXPathContentContains('//div[contains(@class,"panier")]','Mes Paniers flottants',$this->_response->getBody());
	}


		/** @test **/
	public function boitePanierFlottantShouldBePresentOnRecherche() {
		ZendAfi_Auth::getInstance()->logUser(Class_Users::newInstanceWithId(34, ['login' => 'admin'])->beAdminPortail());
		$this->dispatch('/opac/recherche/simple');
		$this->assertXPathContentContains('//div[contains(@class,"panier")]','Mes Paniers flottants',$this->_response->getBody());
	}


	/** @test **/
	public function divisionFlottantShouldContainsClassColFlottant() {
		ZendAfi_Auth::getInstance()->logUser(Class_Users::newInstanceWithId(34, ['login' => 'admin'])->beAdminPortail());
		$this->dispatch('/opac');
		$this->assertXPath('//div[contains(@class,"colFlottant")]',$this->_response->getBody());
	}

}




class ProfilOptionsControllerPageJeuxViewModuleCritiquesTest extends ProfilOptionsControllerProfilJeunesseWithPagesJeuxMusiqueTestCase {
	public function setUp() {
		parent::setUp();
		$this->dispatch('/opac/blog/viewcritiques?id_module=4&id_profil=12');
	}

	
	/** @test */
	public function iframeKiosqueUrlShouldHaveIdModuleSeven() {
		$this->assertXPath('//iframe[contains(@src, "/id_module/7/id_profil/12/vue/cube")]',
											 $this->_response->getBody());
	}


	/** @test */
	public function linkAccesProShouldLinkToAdminModuleWithUrlReset() {
		$this->assertXPathContentContains('//a[@href="/admin"]', 'Accès pro.');
	}
}




class ProfilOptionsControllerProfilJeunesseViewPageJeuxTest extends ProfilOptionsControllerProfilJeunesseWithPagesJeuxMusiqueTestCase {
	public function setUp() {
		parent::setUp();
		$this->dispatch('/opac/index/index/clef/zork?id_profil=12', true);		
	}


	/** @test */
	public function bodyClassShouldBeIndexIndexProfil12() {
		$this->assertXPath('//body[@class="index_index profil_12"]');
	}


	/** @test */
	public function titleShouldBeJeuxForPageJeux() {
		$this->assertQueryContentContains('head title', 'Jeux');
	}


	/** @test */
	public function boiteLoginShouldBeVisibleInPageJeux() {
		$this->assertXPath("//div[@id='boite_login']");
	}


	/** @test */
	public function boiteLoginShouldHaveAutocompleteSetToOff() {
		$this->assertXPath("//div[@id='boite_login']//form[@autocomplete='off']");
	}


	/** @test */
	public function boiteNewsShouldNotBeVisibleInPageJeux() {
		$this->assertNotXPathContentContains("//a[contains(@href, 'articleviewselection')]",'Articles');
	}


	/** @test */
	public function boiteKiosqueCubeShouldBeVisibleInPageJeux() {
		$this->assertXPath("//iframe[contains(@src, 'kiosque')]");
	}


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


	/** @test */
	public function boiteKiosqueStyleVignettesShouldBeVisibleInPageJeux() {
		$this->assertXPath("//div[@class='boite kiosque']//div[@class='liste_vignettes']");
	}


	/** @test */
	public function boiteKiosqueTitleShouldLinkToMenuCatalogue() {
		$this->assertXPath("//div[@class='boite kiosque']//div//a[contains(@href, 'recherche/simple/titre/Kiosque/style_liste/cube/nb_notices/20/only_img/1/aleatoire/1/tri/date_creation+desc/nb_analyse/50/op_hauteur_img/90/op_transition//op_largeur_img/0/rss_avis/1/id_catalogue/0/id_panier/0/boite/boite_de_la_division_gauche')]");
	}
}




class ProfilOptionsControllerViewProfilJeunesseAccueilTest extends ProfilOptionsControllerProfilJeunesseWithPagesJeuxMusiqueTestCase {
	protected function _loginHook($account) {}
	
	public function setUp() {
		parent::setUp();
		Class_AdminVar::newInstanceWithId('MULTIMEDIA_KEY',['valeur'=>'81b3ab7b0b9a621afb6044a9c2f48ed2']);
		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_TypeDoc')
			->whenCalled('findUsedTypeDocIds')
			->answers([1, 2, 4]);


		Class_Profil::setFileWriter(Storm_Test_ObjectWrapper::mock()
																->whenCalled('fileExists')
																->answers(true));


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


	public function tearDown() {
		Class_Profil::setFileWriter(null);
		parent::tearDown();
	}


	/** @test */
	public function hauteurBanniereShouldBe100() {
		$this->assertEquals(100, $this->profil_jeunesse->getHauteurBanniere());
	}


	/** @test */
	function faviconShouldBeSet() {
		$this->assertXPath('//link[@rel="shortcut icon"][@href="afi-opac3/userfiles/favicon.ico"]');
	}


	/** @test */
	function headerCssJeunesseShouldBeIncluded() {
		$this->assertXPath('//link[@rel="stylesheet"][@type="text/css"][contains(@href, "afi-opac3/userfiles/jeunesse.css")]');
	}


	/** @test */
	function headerJsJeunesseShouldBeIncluded() {
		$this->assertXPath('//script[contains(text(), "afi-opac3/userfiles/jeunesse.js")]');
	}


	/** @test */
	function rechercheAvanceLinkShouldBeVisible() {
		$this->assertXPath('//div[@class="recherche_avancee"]//a[contains(@href, "avancee")]');
	}


	/** @test */
	public function comboRechSimpleTypeDocShouldBeVisible() {
		$this->assertXPath('//form[@class="rechSimpleForm"]//select[@name="type_doc"]');
	}


	/** @test */
	public function hiddenInputShouldContainsTriPertinence() {
		$this->assertXPath('//form[@class="rechSimpleForm"]//input[@name="tri"][@value="*"][@type="hidden"]');
	}


	/** @test */
	public function comboRechSimpleTypeDocShouldOnlyContainsTypesOneTwoAndFour() {
		foreach([1,2,4] as $id)
			$this->assertXPath('//form[@class="rechSimpleForm"]//select[@name="type_doc"]//option[@value="'.$id.'"]');
		$this->assertNotXPath('//form[@class="rechSimpleForm"]//select[@name="type_doc"]//option[@value="3"]');
	}


	/** @test */
	public function comboRechSimpleSelectAnnexeBeVisible() {
		$this->assertXPathContentContains('//form[@class="rechSimpleForm"]//select[@name="annexe"]//option[@value="ARC"]', 
																			'Archives');
	}


	/** @test */
	public function titleShouldBeProfilJeunesseInHomePage() {
		$this->dispatch('/opac/');
		$this->assertQueryContentContains('head title', 'Profil Jeunesse');
	}

	
	/** @test */
	public function boiteLoginShouldBeVisibleInProfilJeunesse() {
		$this->assertXPath("//div[@id='boite_login']");
	}


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



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



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


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


	/** @test */
	public function boiteNewsShouldBeVisibleInProfilJeunesse() {
		$this->assertXPathContentContains("//a[contains(@href, 'articleviewselection')]",'Articles');
	}


	/** @test */
	public function logoGaucheShouldBeInBanniere() {
		$this->assertXPath("//div[@id='banniere']//div[@class='logo_gauche']//a[@href='http://mabib.fr']//img[@src='/userfiles/mabib.png']",
											 $this->_response->getBody());
	}


	/** @test */
	public function logoDroiteShouldBeInBanniere() {
		$this->assertXPath("//div[@id='banniere']//div[@class='logo_droite']//a[@href='http://macommune.fr']//img[@src='/userfiles/macommune.png']",
											 $this->_response->getBody());
	}


	/** @test */
	public function hauteurBanniereShouldBe100InProfilCss() {
		$this->assertXPath("//style[@id='profil_stylesheet']");
		$this->assertXPathContentContains("//style[@id='profil_stylesheet']",
																			"div#banniere, div#header{height:100px}");
	}


	/** @test */
	public function headerLinkColorShouldNotBePresent() {
		$this->assertNotXPathContentContains("//style[@id='profil_stylesheet']",
																				 "div#header a");
	}


	/** @test */
	public function headerColorShouldNotBePresent() {
		$this->assertNotXPathContentContains("//style[@id='profil_stylesheet']",
																				 "div#header *");
	}


	/** @test */
	function cycleBanniereScriptsShouldBeIncluded() {
		$this->assertXPathContentContains('//script', '$("#banniere a.home").cycle');
	}


	/** @test */
	public function banniereClassLinkShouldBeHome() {
		$this->assertXPath('//div[@id="banniere"]//a[@class="home"]');
	}


	/** @test */
	public function constantPathSkinShouldBeRelative() {
		$this->assertTrue(0===strpos(PATH_SKIN, './'));
	}

}




class ProfilOptionsControllerProfilJeunesseWithOrdreDivisionsReversedTest extends ProfilOptionsControllerProfilJeunesseWithPagesJeuxMusiqueTestCase {
	protected function _loginHook($account) {}

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

		$this->profil_jeunesse->setOrdreDivisions(1);		
		$this->dispatch('/opac/', true);
	}


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




class UserRoleLevelThreeViewPrivateProfilTest extends AbstractControllerTestCase {
	protected function _loginHook($account) {
		$account->ROLE = "";
		$account->ROLE_LEVEL = 3;
		$account->ID_USER = "";
		$account->PSEUDO = "";
	}


	public function setUp() {
		parent::setUp();
		$this->private_profil = Class_Profil::getCurrentProfil()
			->setBrowser('opac')
			->setTitreSite(null)
			->setLibelle('Profil privé');
	}


	/** @test */
	public function shouldRenderLoginPageWhenProfilAccessLevelIsFour() {
			$this->private_profil->setAccessLevel(4);
			$this->dispatch('/opac/');
			$this->assertModule('admin');
			$this->assertController('auth');
			$this->assertAction('login');
	}

	/** @test */
	public function shouldRenderIndexPageWhenProfilAccessLevelIsThree() {
			$this->private_profil->setAccessLevel(3);
			$this->dispatch('/opac/');
			$this->assertController('index');
			$this->assertAction('index');
	}

}





abstract class ProfilOptionsControllerProfilBoiteCalendarTestCase extends AbstractControllerTestCase {
	public function setup() {
		parent::setup();


		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Article')
			->whenCalled('getArticlesByPreferences')
			->answers([Class_Article::newInstanceWithId(34, [
																						'titre' => 'Fête du caion',
																						'description' => 'à Annecy'])]);
	}
}



class ProfilOptionsControllerProfilBoiteCalendarWithCalendarDisplayedAndModeSimpleTest extends ProfilOptionsControllerProfilBoiteCalendarTestCase {

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

		$cfg_accueil = ['modules' => ['45' => ['division' => '1',
																					 'type_module' => 'CALENDAR',
																					 'preferences' => ['display_calendar' => '1',
																														 'mode-affichage' => 'simple']]]];

		$this->profil_with_calendar = Class_Profil::getCurrentProfil()
			->setBrowser('opac')
			->setTitreSite('Test Calendar')
			->setLibelle('Profil Portail')
			->setCfgAccueil($cfg_accueil);

		$this->dispatch('/opac');
	}


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


	/** @test **/
	public function boiteCalendarShouldBeDisplayCalendarTable() {
		$this->assertXPath('//table[@class="calendar_main"]', $this->_response->getBody());
	}


	/** @test **/
	public function boiteCalendarShouldDisplayNextEventAsSimpleListe() {
		$this->assertXPath('//ul/li/a[@class="calendar_event_info"]', $this->_response->getBody());
	}
}




class ProfilOptionsControllerProfilBoiteCalendarWithCalendarNotDisplayedAndModeArticleTest extends ProfilOptionsControllerProfilBoiteCalendarTestCase {

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

		$cfg_accueil = ['modules' => ['45' => ['division' => '1',
																					 'type_module' => 'CALENDAR',
																					 'preferences' => ['display_calendar' => '0',
																														 'mode-affichage' => 'article']]]];

		$this->profil_with_calendar = Class_Profil::getCurrentProfil()
			->setBrowser('opac')
			->setTitreSite('Test Calendar')
			->setLibelle('Profil Portail')
			->setCfgAccueil($cfg_accueil);

		$this->dispatch('/opac');
	}


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


	/** @test **/
	public function boiteCalendarShouldBeNotDisplayCalendarTable() {
		$this->assertNotXPath('//table[@class="calendar_main"]', $this->_response->getBody());
	}


	/** @test **/
	public function boiteCalendarShouldDisplayNextEventAsArticleListe() {
		$this->assertXPath('//div[contains(@class,"agenda-summaries")]', $this->_response->getBody());
	}
}

	

class ProfilOptionsControllerProfilBoiteCalendarWithCalendarNotDisplayedAndDonTDisplayNextEventTest extends AbstractControllerTestCase {

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

		$cfg_accueil = ['modules' => ['45' => ['division' => '1',
																					 'type_module' => 'CALENDAR',
																					 'preferences' => ['display_calendar' => '0',
																														 'mode-affichage' => 'none']]]];

		$this->profil_with_calendar = Class_Profil::getCurrentProfil()
			->setBrowser('opac')
			->setTitreSite('Test Calendar')
			->setLibelle('Profil Portail')
			->setCfgAccueil($cfg_accueil);

		$this->dispatch('/opac');
	}


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


	/** @test **/
	public function boiteCalendarShouldBeNotDisplayCalendarTable() {
		$this->assertNotXPath('//table[@class="calendar_main"]', $this->_response->getBody());
	}


	/** @test **/
	public function boiteCalendarShouldNotDisplayNextEvent() {
		$this->assertNotXPath('//div[@class="calendar"]/div[2]', $this->_response->getBody());
	}


	/** @test **/
	public function boiteCalendarShouldDisplayScriptAjaxifyCalendar() {
		$this->assertXPathContentContains('//script','ajaxify_calendars();');
	}
}



class ModulesAccueilControllerWithProfilJeunesse extends ProfilOptionsControllerProfilJeunesseWithPagesJeuxMusiqueTestCase {

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

	/** @test **/
	public function renderModuleKiosqueShouldReturnBoiteKiosque(){
		$this->dispatch('/opac/modules-accueil/render-module/id/12',true);
		$this->assertXPath('//div[@class="boite kiosque"]',$this->_response->getBody());
	}

}

?>