diff --git a/library/Class/WebService/AllServices.php b/library/Class/WebService/AllServices.php
index 8edd42e491f54a3b11fe199891859e3c450694a9..691602bcd6b32623bfcec572d68c3b3bbeb5a1fc 100644
--- a/library/Class/WebService/AllServices.php
+++ b/library/Class/WebService/AllServices.php
@@ -18,116 +18,94 @@
  * 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 
  */
-//////////////////////////////////////////////////////////////////////////////////////
-// OPAC3 : REPERTOIRE DES WEB_SERVICES
-//////////////////////////////////////////////////////////////////////////////////////
 
 class Class_WebService_AllServices {
 	const RETOUR_SERVICE_OK = 2;
 
 	private static $_http_client;
 
-	private $services = array
-		(
-			"Amazon" => array
-				(
-					"valeurs" => array("isbn" => "2709624931","auteur" => "zola","page" => "1"),
-					"services" => array("rend_avis(@isbn,@page)"
-												,"rend_analyses(@isbn)"
-												,"rend_bibliographies(@isbn)"
-												,"rend_livres_auteur(@auteur,@page)"
-												,"rend_livres_similaires(@isbn)"
-												,"rend_images(@isbn)")
-				),
-			"AmazonSonores" => array
-				(
-					"valeurs" => array("ean" => "0794881405923","asin" => "B00005BH6V","volume" => "1","track" => "1"),
-					"services" => array("rend_notice_ean(@ean)"
-												,"getImages(@ean)")
-				),
-			"AmazonVideo" => array
-				(
-					"valeurs" => array("ean" => "3388334500012"),
-					"services" => array("rend_notice_ean(@ean)"
-												,"getImages(@ean)")
-				),
-			"AmazonCdrom" => array
-				(
-					"valeurs" => array("ean" => "5030931031182"),
-					"services" => array("rend_notice_ean(@ean)"
-												,"getImages(@ean)")
-				),
-			"Lastfm" => array
-				(
-					"valeurs" => array("titre" => "Unplugged","auteur" => "Eric Clapton"),
-					"services" => array("getAlbum(@titre,@auteur)"
-												,"getMorceaux(@titre,@auteur)"
-												,"getPhotos(@auteur)"
-												,"getDiscographie(@auteur)")
-				),
-			"Premiere" => array
-				(
-					"valeurs" => array("titre" => "avatar"),
-					"services" => array("get_resume(@titre)"
-												,"getImages(@titre)")
-				),
-			"LibraryThing" => array
-				(
-					"valeurs" => array("isbn" => "978-2-07-061239-0"),
-					"services" => array("rend_isbn_proches(@isbn)")
-				),
-			"Fnac" => array
-				(
-					"valeurs" => array("isbn" => "978-2-7427-6501-0"),
-					"services" => array("getResume(@isbn)")
-				 ),
-			"OAI" => array
-			(
-			 "valeurs" => array("oai_handler" => 'http://oai.bnf.fr/oai2/OAIHandler', "set" => "gallica"),
-			 "services" => array("getSetsFromHandler(@oai_handler)",
-													 "getRecordsFromHandlerAndSet(@oai_handler, @set)")
-			 ),
-			"SRU" => array
-			(
-			 "valeurs" => array("service_url" => 'http://bvpb.mcu.es/i18n/sru/sru.cmd', "query" => "spain"),
-			 "services" => array("search(@service_url, @query)")
-			 )
-		);
-
-//------------------------------------------------------------------------------------------------------
-// Lance un service AFI et renvoie le resultat
-//------------------------------------------------------------------------------------------------------
-	static function runServiceAfiBiographie($args) {
+	private $services = [
+		'Amazon' => ['valeurs' => ['isbn' => '2709624931', 'auteur' => 'zola', 'page' => '1'],
+								 'services' => ['rend_avis(@isbn,@page)',
+																'rend_analyses(@isbn)',
+																'rend_bibliographies(@isbn)',
+																'rend_livres_auteur(@auteur,@page)',
+																'rend_livres_similaires(@isbn)',
+																'rend_images(@isbn)']],
+
+		'AmazonSonores' => ['valeurs' => ['ean' => '0794881405923', 
+																			'asin' => 'B00005BH6V', 
+																			'volume' => '1', 
+																			'track' => '1'],
+												'services' => ['rend_notice_ean(@ean)', 'getImages(@ean)']],
+
+		'AmazonVideo' => ['valeurs' => ['ean' => '3388334500012'],
+											'services' => ['rend_notice_ean(@ean)', 'getImages(@ean)']],
+
+		'AmazonCdrom' => ['valeurs' => ['ean' => '5030931031182'],
+											'services' => ['rend_notice_ean(@ean)', 'getImages(@ean)']],
+
+		'Lastfm' => ['valeurs' => ['titre' => 'Unplugged', 'auteur' => 'Eric Clapton'],
+								 'services' => ['getAlbum(@titre,@auteur)',
+																'getMorceaux(@titre,@auteur)',
+																'getPhotos(@auteur)',
+																'getDiscographie(@auteur)']],
+
+		'Premiere' => ['valeurs' => ['titre' => 'avatar'],
+									 'services' => ['get_resume(@titre)', 'getImages(@titre)']],
+
+		'LibraryThing' => ['valeurs' => ['isbn' => '978-2-07-061239-0'],
+											 'services' => ['rend_isbn_proches(@isbn)']],
+
+		'Fnac' => ['valeurs' => ['isbn' => '978-2-7427-6501-0'],
+							 'services' => ['getResume(@isbn)']],
+
+		'OAI' => ['valeurs' => ['oai_handler' => 'http://oai.bnf.fr/oai2/OAIHandler', 
+														'set' => 'gallica'],
+							'services' => ['getSetsFromHandler(@oai_handler)',
+														 'getRecordsFromHandlerAndSet(@oai_handler, @set)']],
+
+		'SRU' => ['valeurs' => ['service_url' => 'http://bvpb.mcu.es/i18n/sru/sru.cmd', 
+														'query' => 'spain'],
+							'services' => ['search(@service_url, @query)']]];
+
+
+	public static function runServiceAfiBiographie($args) {
 		return self::runServiceAfi(8, $args);
 	}
 
 
-	static function runServiceAfiVideo($args) {
+	public static function runServiceAfiVideo($args) {
 		return self::runServiceAfi(9, $args);
 	}
 
-	static function runServiceAfiInterviews($args) {
+
+	public static function runServiceAfiInterviews($args) {
 		return self::runServiceAfi(7, $args);
 	}
 
-	static function runServiceAfiUploadVignette($args) {
+
+	public static function runServiceAfiUploadVignette($args) {
 		return self::runServiceAfi(12, $args);
 	}
 
-	static function runServiceAfiUploadBiographie($args) {
+
+	public static function runServiceAfiUploadBiographie($args) {
 		return self::runServiceAfi(13, $args);
 	}
 
-	static function runServiceGetUrlVignette($args) {
+
+	public static function runServiceGetUrlVignette($args) {
 		return self::runServiceAfi(10, $args);
 	}
 
-	static function setHttpClient($client) {
+
+	public static function setHttpClient($client) {
 		self::$_http_client = $client;
 	}
 
 
-	static function uploadVignetteForNotice($url, $id) {
+	public static function uploadVignetteForNotice($url, $id) {
 		$notice = Class_Notice::find($id);
 		$result = static::runServiceAfiUploadVignette(array_filter(['isbn' => $notice->getIsbn(),
 																																'ean' => $notice->getEan(),
@@ -149,7 +127,7 @@ class Class_WebService_AllServices {
 	}
 
 
-	static function uploadBiographieForNotice($url, $id) {
+	public static function uploadBiographieForNotice($url, $id) {
 		$notice = Class_Notice::find($id);
 		$result = static::runServiceAfiUploadBiographie(array_filter(['url_auteur' => $url,
 																																	'clef_oeuvre' => $notice->getClefOeuvre()]));
@@ -158,14 +136,14 @@ class Class_WebService_AllServices {
 	}
 
 
-	static function httpGet($url, $args) {
+	public static function httpGet($url, $args) {
 		if (!isset(self::$_http_client))
 			self::$_http_client = new Class_WebService_SimpleWebClient();
 		return self::$_http_client->open_url($url.'?'.http_build_query($args));
 	}
 
 
-	static function runServiceAfi($service,$args)	{
+	public static function runServiceAfi($service,$args)	{
 		if (!$url_service = Class_CosmoVar::get('url_services'))
 			return false;
 
@@ -185,9 +163,6 @@ class Class_WebService_AllServices {
 	}
 	
 
-//------------------------------------------------------------------------------------------------------
-// Test d'un service
-//------------------------------------------------------------------------------------------------------
 	public function testService($id_service,$id_fonction)	{
 		if(!$id_service) return false;
 		$instruction="\$cls=new Class_WebService_".$id_service."();";
@@ -215,12 +190,9 @@ class Class_WebService_AllServices {
 		return $ret;
 	}
 
-//------------------------------------------------------------------------------------------------------
-// Liste des services
-//------------------------------------------------------------------------------------------------------
-	public function getServices()
-	{
+
+	public function getServices() {
 		return $this->services;
 	}
-
-}
\ No newline at end of file
+}
+?>
\ No newline at end of file
diff --git a/tests/application/modules/admin/controllers/ProfilControllerProfilJeunesseAndAdultesWithMenusTest.php b/tests/application/modules/admin/controllers/ProfilControllerProfilJeunesseAndAdultesWithMenusTest.php
index ae1ac1ad1ea4aec3016f27c0c50804f121b65863..bbdb811c76c34ba1b50541531437dfdc3286160b 100644
--- a/tests/application/modules/admin/controllers/ProfilControllerProfilJeunesseAndAdultesWithMenusTest.php
+++ b/tests/application/modules/admin/controllers/ProfilControllerProfilJeunesseAndAdultesWithMenusTest.php
@@ -25,14 +25,19 @@ abstract class ProfilControllerProfilJeunesseAndAdultesWithMenusTestCase extends
 	public function setUp() {
 		parent::setUp();
 
-		$picsou = Class_Article::getLoader()
-			->newInstanceWithId(4)
-			->setTitre('Picsou fait faillite');
+		$picsou = $this->fixture('Class_Article', 
+														 ['id' => 4, 
+															'titre' => 'Picsou fait faillite',
+															'contenu' => 'un drame familiale']);
+		$donald = $this->fixture('Class_Article', 
+														 ['id' => 5, 
+															'titre' => 'Donald a la plage',
+															'contenu' => 'des vacances de rêve']);
 
 		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Article')
 			->whenCalled('getArticlesByPreferences')
-			->with(array('nb_aff' => '2'))
-			->answers(array($picsou))
+			->with(['nb_aff' => '2'])
+			->answers([$picsou, $donald])
 			->getWrapper()
 
 			->whenCalled('filterByLocaleAndWorkflow')
@@ -51,6 +56,7 @@ abstract class ProfilControllerProfilJeunesseAndAdultesWithMenusTestCase extends
 																						 'picto' => 'vide.gif',
 																						 'preferences' => ['url' => 'http://www.google.com',
 																															 'target' => 0]],
+
 																						['type_menu' => 'NEWS',
 																						 'libelle' => 'Actu',
 																						 'picto' => 'vide.gif',
@@ -175,7 +181,7 @@ class ProfilControllerProfilJeunesseAndAdultesWithMenusTestAccessors extends Pro
 class ProfilControllerProfilJeunesseAndAdultesWithMenusTestRender extends ProfilControllerProfilJeunesseAndAdultesWithMenusTestCase {
 	public function setUp() {
 		parent::setUp();
-		$this->dispatch('/opac?id_profil='.$this->page_musique->getId());
+		$this->dispatch('/opac?id_profil=' . $this->page_musique->getId());
 	}
 
 
@@ -210,12 +216,26 @@ class ProfilControllerProfilJeunesseAndAdultesWithMenusTestRender extends Profil
 
 
 	/** @test */
-	public function linkForArticlePicsouShouldBeCmsArticleViewFourAndNamedActu() {
-		$this->assertXPathContentContains('//a[contains(@href, "cms/articleview/id/4")]',
+	public function boiteMenuVerticalMenuActuShouldOpenSubmenu() {
+		$this->assertXPathContentContains('//ul[@class="menuGauche"]/li/a[contains(@onclick, "afficher_sous_menu")]', 
 																			'Actu');
 	}
 
 
+	/** @test */
+	public function linkForArticlePicsouShouldBePresent() {
+		$this->assertXPathContentContains('//a[contains(@href, "cms/articleview/id/4")]',
+																			'Picsou fait faillite');
+	}
+
+
+	/** @test */
+	public function linkForArticleDonaldShouldBePresent() {
+		$this->assertXPathContentContains('//a[contains(@href, "cms/articleview/id/5")]',
+																			'Donald a la plage');
+	}
+
+
 	/** @test */
 	public function articlesShouldHaveBeenFilterByLocaleAndWorkflow() {
 		$this->assertTrue(Class_Article::getLoader()->methodHasBeenCalled('filterByLocaleAndWorkflow'));
diff --git a/tests/application/modules/telephone/controllers/RechercheControllerHarryPotterTest.php b/tests/application/modules/telephone/controllers/RechercheControllerHarryPotterTest.php
index dfc848b160ea31f018325a8ce4f3bf2ef870f4e4..35384c3c60a9330d8aec46de01288f9b2f3f9b0a 100644
--- a/tests/application/modules/telephone/controllers/RechercheControllerHarryPotterTest.php
+++ b/tests/application/modules/telephone/controllers/RechercheControllerHarryPotterTest.php
@@ -244,6 +244,23 @@ class Telephone_RechercheControllerHarryPotterTagsTest extends Telephone_Recherc
 
 
 class Telephone_RechercheControllerHarryPotterBiographieTest extends Telephone_RechercheControllerHarryPotterTestCase {
+	public function setUp() {
+		parent::setUp();
+		$httpClient = Storm_Test_ObjectWrapper::mock()
+			->whenCalled('open_url')
+			->answers(json_encode(['biographie' => [['texte' => 'Inspiration et controverse']], 
+														 'source' => 'afi', 
+														 'vignette' => '']));
+		Class_WebService_AllServices::setHttpClient($httpClient);
+	}
+
+
+	public function tearDown() {
+		Class_WebService_AllServices::setHttpClient(null);
+		parent::tearDown();
+	}
+
+
 	/**
 	 * @group longtest
 	 * @group integration