diff --git a/application/modules/opac/controllers/AbonneController.php b/application/modules/opac/controllers/AbonneController.php
index bb8b998f2df1d2d9e637f1d18b92edf079825564..aaf71ff92b898faad34ff183ccff877217431524 100644
--- a/application/modules/opac/controllers/AbonneController.php
+++ b/application/modules/opac/controllers/AbonneController.php
@@ -596,23 +596,23 @@ class AbonneController extends ZendAfi_Controller_Action {
 		$response->auth = 0;
 		$response->until = '';
 
-		$request = Class_Multimedia_AuthenticateRequest::newWithRequest($this->_request);
-
+		$request = Class_Multimedia_AuthenticateRequest::newWithRequest($this->_request);		
 		if ($user = $request->getUser()) {
-			foreach (array('id', 'login', 'password', 'nom', 'prenom') as $attribute)
+			foreach (['id', 'login', 'password', 'nom', 
+								'prenom', 'date_debut', 'date_fin'] as $attribute)
 				$response->$attribute = $user->$attribute;
-
 			$response->groupes = $user->getUserGroupsLabels();
 			$response->date_naissance = $user->getDateNaissanceIso8601();
 		}
 
-		if ($request->isValid()) {
-			$response->auth = 1;
-			$response->until = date('c', $request->getCurrentHoldEnd());
-		} else {
+		if (!$request->isValid()) {
 			$response->error = $request->getError();
-		} 
+			$this->_response->setBody(json_encode($response));
+			return;
+		}
 
+		$response->auth = 1;
+		$response->until = date('c', $request->getCurrentHoldEnd());
 
 		$this->_response->setBody(json_encode($response));
 	}
diff --git a/application/modules/push/controllers/MultimediaController.php b/application/modules/push/controllers/MultimediaController.php
index 1a8b4b639ac6b3402ffa6db9cb2f1016b645fc1c..5c56218edd5f828aee8c627d7fe0a6d55661c7d4 100644
--- a/application/modules/push/controllers/MultimediaController.php
+++ b/application/modules/push/controllers/MultimediaController.php
@@ -20,7 +20,8 @@
  */
 class Push_MultimediaController extends Zend_Controller_Action {
 	public function configAction() {
-		$log = Class_Multimedia::getLog();
+		$multimedia = Class_Multimedia::getInstance();
+		$log = $multimedia->getLog();
 		$log->info('Push multimedia start');
 		
 		$this->_helper->getHelper('viewRenderer')->setNoRender();
@@ -40,7 +41,7 @@ class Push_MultimediaController extends Zend_Controller_Action {
 			return;
 		}
 		
-		if (!Class_Multimedia::isValidHash($sign, $this->_getParam('json'))) {
+		if (!$multimedia->isValidHash($sign, $this->_getParam('json'))) {
 			$log->err('Sign check failure');
 			return;
 		}
@@ -77,18 +78,16 @@ class Push_MultimediaController extends Zend_Controller_Action {
 
 	
 		
-	public function getAllBorrowersAction(){
-		$attributes = ['idabon', 'login', 'password', 'nom', 'prenom', 'mail',
-									 'dateNaissanceIso8601', 'dateFin', 'dateDebut'];
-
-
+	public function getAllBorrowersAction() {
 		$this->getHelper('ViewRenderer')->setNoRender();
-		$response = Class_Multimedia_PushAllUsersRequest::newWith(
-			Class_Multimedia_Connector_Multimedia::getInstance()
-			->initAttributes($attributes))
-			->getResponse($this->_request);
 
-		$this->_response->setBody($response);
+		$connector = Class_Multimedia_Connector_Multimedia::getInstance()
+			->initAttributes(['idabon', 'login', 'password', 'nom', 'prenom', 'mail',
+												'dateNaissanceIso8601', 'dateFin', 'dateDebut']);
+
+		$this->_response->setBody(
+			Class_Multimedia_PushAllUsersRequest::newWith($connector)
+			->getResponse($this->_request));
 	}
 }
 ?>
\ No newline at end of file
diff --git a/library/Class/AdminVar.php b/library/Class/AdminVar.php
index b8a185958d39d34dec03d9c3049efe0791a6a853..df1d6da054d22ed2953b12c77bd1671bd81a1cd1 100644
--- a/library/Class/AdminVar.php
+++ b/library/Class/AdminVar.php
@@ -308,7 +308,7 @@ class Class_AdminVar extends Storm_Model_Abstract {
 				'ARTE_VOD_KEY' => 'Clé ARTE VOD',
 				'ARTE_VOD_SSO_KEY' => 'Clé ARTE VOD Single Sign-On',
 				'BABELTHEQUE_JS' => 'URL du javascript Babelthèque à insérer dans l\'OPAC',
-				'MULTIMEDIA_KEY' => 'Clé AFI-multimédia',
+				'MULTIMEDIA_KEY' => 'Clé publique pour le cryptage des données AFI-Multimédia',
 				'WEBKIOSK_KEY' => 'Clé publique pour le cryptage des données Aesis Webkiosk',
 				'WEBKIOSK_RESERVATION_URL' => 'URL d\'accès à l\'interface de réservation des postes Aesis Webkiosk',
 				'CSS_EDITOR' => '',
diff --git a/library/Class/Multimedia.php b/library/Class/Multimedia.php
index 1826f2278fc7cea1e94aa7c8de89c3f063ba9aba..28e2150e9623a26ba98129dd29b8f27598ec4463 100644
--- a/library/Class/Multimedia.php
+++ b/library/Class/Multimedia.php
@@ -20,84 +20,92 @@
  */
 
 class Class_Multimedia {
-	const SEPARATOR = '--@--';
+	use Trait_Singleton;
 	const LOG_FILE = 'push.log';
 
-	/** @var Class_Multimedia */
-	protected static $_instance;
-
 	/** @var Zend_Log */
-	protected static $_log;
+	protected $_log;
 
 
 	/** @return Zend_Log */
-	public static function getLog() {
-		if (null == self::$_log)
-			self::$_log = new Zend_Log(new Zend_Log_Writer_Stream(PATH_TEMP . self::LOG_FILE));
-		return self::$_log;
+	public function getLog() {
+		if (null == $this->_log)
+			$this->_log = new Zend_Log(new Zend_Log_Writer_Stream(PATH_TEMP . self::LOG_FILE));
+		return $this->_log;
 	}
 
 
 	/**
 	 * @param $log Zend_Log
 	 */
-	public static function setLog($log) {
-		self::$_log = $log;
+	public function setLog($log) {
+		$this->_log = $log;
+		return $this;
 	}
 
 		
 	/** @return boolean */
-	public static function isValidHash($hash, $content) {
-		return self::getInstance()->isValidHashForContent($hash, $content);
+	public function isValidHash($hash, $content) {
+		$validators = [new Class_Multimedia_HashValidator_Md5(),
+									 new Class_Multimedia_HashValidator_Ssl()];
+
+		foreach ($validators as $validator)
+			if ($validator->isValid($hash, $content))
+				return true;
+		return false;
 	}
+}
 
 
-	/** @return boolean */
-	public function isValidHashForContent($hash, $content) {
-		return $hash == $this->getHashForContent($content);
-	}
 
+class Class_Multimedia_HashValidator_Null {
+	const KEY_VAR_NAME = 'MULTIMEDIA_KEY';
 
-	/** @return Class_Multimedia */
-	public static function getInstance() {
-		if (null == self::$_instance)
-			self::$_instance = new self();
-		return self::$_instance;
+	public function isValid($hash, $content) {
+		return false;
 	}
 
 
-	/** @category testing */
-	public static function setInstance($instance) {
-		self::$_instance = $instance;
+	protected function getKey() {
+		return Class_AdminVar::get(self::KEY_VAR_NAME);
 	}
+}
+
+
 
+class Class_Multimedia_HashValidator_Ssl extends Class_Multimedia_HashValidator_Null{
+	public function isValid($hash, $content) {
+		$isValidated = (new Class_Multimedia_Utils_OpensslUtil())
+			->opensslVerify($content, 
+											base64_decode($hash), 
+											$this->getKey());
 
-	/** @return string */
-	public function getHashForContent($content) {
-		return md5($this->getFullContent($content));
+		return -1 !== $isValidated && 0 !== $isValidated;
 	}
+}
 
 
-	/**
-	 * @param $content string
-	 * @return string
-	 */
-	public function getFullContent($content) {
-		return $content . self::SEPARATOR . $this->getKey() . self::SEPARATOR . $this->getDate();
+
+class Class_Multimedia_HashValidator_Md5 extends Class_Multimedia_HashValidator_Null{
+	use Trait_TimeSource;
+
+	const SEPARATOR = '--@--';
+
+	public function isValid($hash, $content) {
+		return $hash == $this->getHashForContent($content);
 	}
 
 
-	/** @return string */
-	public function getKey() {
-		return Class_AdminVar::get('MULTIMEDIA_KEY');
+	protected function getHashForContent($content) {
+		$content = implode(self::SEPARATOR, [$content, $this->getKey(), $this->getDate()]);
+		return md5($content);
 	}
 
 
-	/** @return string formated date */
-	public function getDate() {
+	protected function getDate() {
 		$oldTimeZone = date_default_timezone_get();
 		date_default_timezone_set('UTC');
-		$date = date('Y-m-d');
+		$date = date('Y-m-d', $this->getCurrentTime());
 		date_default_timezone_set($oldTimeZone);
 		return $date;
 	}
diff --git a/library/Class/Multimedia/AuthenticateRequest.php b/library/Class/Multimedia/AuthenticateRequest.php
index 12df83c335b15a9c970ef5400d36bc74fc26b163..87b4d76e8eb48872ab6bb5c6ec6cae972cf567cc 100644
--- a/library/Class/Multimedia/AuthenticateRequest.php
+++ b/library/Class/Multimedia/AuthenticateRequest.php
@@ -59,7 +59,7 @@ class Class_Multimedia_AuthenticateRequest {
 																					$password, 
 																					[$auth->newAuthSIGB(), $auth->newAuthDb()])) {
 			if (Class_Users::findFirstBy(['login' => $login]))
-					return $this->_error('PasswordIsWrong');
+				return $this->_error('PasswordIsWrong');
 			return 	$this->_error('UserNotFound');
 		}
 
diff --git a/library/Class/Multimedia/Connector/Abstract.php b/library/Class/Multimedia/Connector/Abstract.php
new file mode 100644
index 0000000000000000000000000000000000000000..8f3cd0072738f4959ddf6ad1e5f6af2b0f437e80
--- /dev/null
+++ b/library/Class/Multimedia/Connector/Abstract.php
@@ -0,0 +1,101 @@
+<?php
+/**
+ * Copyright (c) 2012-2014, 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 
+ */
+
+class Class_Multimedia_Connector_Abstract {
+	const DATA_SEPARATOR = '--@--';
+
+	protected $_generatorRendering;
+
+	public function __construct() {
+		$this->_generatorRendering = new Class_Multimedia_Connector_GeneratorRendering($this);
+	}
+
+
+	public function getGeneratorRendering(){
+		return $this->_generatorRendering;
+	}
+
+
+	public function initAttributes($attributes){
+		$this->_generatorRendering->initAttributes($attributes);
+		return $this;
+	}
+
+
+	public function generateRenderer($request, $itemClosure){
+		if (!$this->isValid($request))
+			return $this->_generatorRendering->renderResponse();
+		return $this->_generatorRendering->render($request, $itemClosure);
+	}
+
+
+	public function dataFor($data) {
+		return $data . self::DATA_SEPARATOR . date('Ymd');
+	}
+
+
+	public function isValid($request) {
+		if (!($sign = $request->getParam('sign'))) {
+			$this->_generatorRendering->prepareResponseError('NO_PARAMETERS');
+			return false;
+		}
+
+		if (!$this->isEnabled()) {
+			$this->_generatorRendering->prepareResponseError($this->getDisabledError());
+			return false;
+		}
+
+		$openssl =  new Class_Multimedia_Utils_OpensslUtil();
+		$isValidated =$openssl->opensslVerify(
+			$this->dataFor($request->getActionName()), 
+			base64_decode($request->getParam('sign')),
+			$this->getPublicKey());
+		restore_error_handler();
+
+		if ($isValidated == -1) {
+			$this->_generatorRendering->prepareResponseError('ERROR_CHECKING_SIGNATURE');
+			return false;
+		}
+
+		if ($isValidated == 0) {
+			$this->_generatorRendering->prepareResponseError('INVALID_SIGNATURE');
+			return false;
+		}
+		
+		return true;
+	}
+
+
+	public function getPublicKey() {
+		return '';
+	}
+
+
+	protected function isEnabled() {
+		return false;
+	}
+
+
+	protected function getDisabledError() {
+		return 'DISABLED';
+	}
+}
+?>
\ No newline at end of file
diff --git a/library/Class/Multimedia/Connector/GeneratorRendering.php b/library/Class/Multimedia/Connector/GeneratorRendering.php
index 6736d94b5bcaff05e255a83a126f4425c326d33f..71ad5bf1a95c39992d56c210a4e644b6608d6f47 100644
--- a/library/Class/Multimedia/Connector/GeneratorRendering.php
+++ b/library/Class/Multimedia/Connector/GeneratorRendering.php
@@ -20,38 +20,44 @@
  */
 
 class Class_Multimedia_Connector_GeneratorRendering {
-
-
+	const RENDERER_PREFIX = 'Class_Multimedia_Connector_Renderer_';
 
 	protected $_response;
-	protected $_attributes;
 	protected $_currentDate = null;
 
-  /** Listes des objets renders dans l'ordre à effectuer sur les datas */ 
-  protected $_renderers = array();
+	protected $_connector = null;
+	protected $_attributes = []; 
+  protected $_renderers = ['Json', 'Encrypt', 'Json'];  /** executer selon l'ordre */
 	
-	public function __construct() {
+	public function __construct($connector) {
 		$this->_response = new StdClass();
 		$this->_response->data = [];
 		$this->_response->error = '';
 		$this->_response->date_export = '';
-
-		$this->_renderers = [new Class_Multimedia_Connector_Renderer_Json(), new Class_Multimedia_Connector_Renderer_Encrypt(), new Class_Multimedia_Connector_Renderer_Json()];
+		
+		$this->_connector = $connector;
 	}
 	
 
-	public function initAttributes($attributes){
+	public function initAttributes($attributes) {
 		$this->_attributes = $attributes;
 		return $this;
 	}
+
+
 	public function setRenderers($renderers){
 		$this->_renderers = $renderers;
+		return $this;
 	}
 
+
 	public function renderResponse() {
 		$this->initializeDateExport();
-		foreach ($this->_renderers as $renderer)
-			$this->_response = $renderer->render($this->_response);
+		foreach ($this->_renderers as $renderer) {
+			$renderer = self::RENDERER_PREFIX . $renderer;
+			$this->_response = (new $renderer())
+				->render($this->_response, $this->_connector);
+		}
 		return $this->_response;
 	}
 
@@ -64,10 +70,12 @@ class Class_Multimedia_Connector_GeneratorRendering {
 		return $this->renderResponse();
 	}
 
+
 	public function newItem($item) {
 		$this->_response->data[] = $this->stdClassFrom($item);
 	}
 
+
 	public function stdClassFrom($item) {
 		$data = new StdClass();
 		foreach ($this->_attributes as $attribute) {
@@ -82,9 +90,11 @@ class Class_Multimedia_Connector_GeneratorRendering {
 		$this->_response->error = $msg;
 	}
 
+
 	public function initializeDateExport(){
 		$this->_response->date_export = $this->getCurrentDate()->format('c');
 	}
+
 	
 	private function getCurrentDate(){
 		if(null !== $this->_currentDate)
@@ -92,13 +102,16 @@ class Class_Multimedia_Connector_GeneratorRendering {
 		return new DateTime();
 	} 
 
+
 	public function setCurrentDate($currentDate){
 		$this->_currentDate = new DateTime($currentDate);
+		return $this;
 	}
 
+
 	public function addFullImportInResponse($value){
 		$this->_response->fullImport = $value;
+		return $this;
 	}
-
 }
 ?>
diff --git a/library/Class/Multimedia/Connector/Multimedia.php b/library/Class/Multimedia/Connector/Multimedia.php
index 4572bba4b2db2434e5ee2e476d86984a5b616f95..a92ee129475952a2a824c634f4121a6d121f6c54 100644
--- a/library/Class/Multimedia/Connector/Multimedia.php
+++ b/library/Class/Multimedia/Connector/Multimedia.php
@@ -18,79 +18,20 @@
  * 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 
  */
-class Class_Multimedia_Connector_Multimedia{
-	const DATA_SEPARATOR = '--@--';
+class Class_Multimedia_Connector_Multimedia extends Class_Multimedia_Connector_Abstract{
+	use Trait_Singleton;
 
-	/** @category testing */
-	protected static $_instance;
-
-	protected $_generatorRendering;
-
-	public function __construct() {
-		$this->_generatorRendering = new Class_Multimedia_Connector_GeneratorRendering();
+	public function getPublicKey() {
+		return Class_AdminVar::get('MULTIMEDIA_KEY');
 	}
-	
-	/** @category testing */
-	public static function setInstance($instance) {
-		self::$_instance = $instance;
-	}
-
 
-  public static function getInstance(){
-		if (null !== self::$_instance)
-			return self::$_instance;
-		return new self();
-	}
 
-	public function getGeneratorRendering(){
-		return $this->_generatorRendering;
+	protected function isEnabled() {
+		return Class_AdminVar::isMultimediaEnabled();
 	}
 
-	public function initAttributes($attributes){
-		$this->_generatorRendering->initAttributes($attributes);
-		return $this;
-	}
 
-	public function generateRenderer($request, $itemClosure){
-		if (!$this->isValid($request))
-			return $this->_generatorRendering->renderResponse();
-		
-		return $this->_generatorRendering->render($request, $itemClosure);		
+	protected function getDisabledError() {
+		return 'MULTIMEDIA_DISABLED';
 	}
-
-	public function isValid($request) {
-		if (!($sign = $request->getParam('sign'))) {
-			$this->_generatorRendering->prepareResponseError('NO_PARAMETERS');
-			return false;
-		}
-
-		if(!Class_AdminVar::isMultimediaEnabled()){
-			$this->_generatorRendering->prepareResponseError('MULTIMEDIA_DISABLED');
-			return false;
-		}
-
-		$openssl =  new Class_Multimedia_Utils_OpensslUtil();
-		$isValidated =$openssl->opensslVerify(
-			$this->dataFor($request->getActionName()), 
-			base64_decode($sign), 
-			Class_AdminVar::get('MULTIMEDIA_KEY'));
-		restore_error_handler();
-
-		if($isValidated == -1){
-			$this->_generatorRendering->prepareResponseError('ERROR_CHECKING_SIGNATURE');
-			return false;
-		}
-
-		if($isValidated == 0){
-			$this->_generatorRendering->prepareResponseError('INVALID_SIGNATURE');
-			return false;
-		}
-		
-		return true;
-	}
-
-	public function dataFor($data) {
-		return $data . self::DATA_SEPARATOR . date('Ymd');
-	}
-
 }
\ No newline at end of file
diff --git a/library/Class/Multimedia/Connector/Renderer/Abstract.php b/library/Class/Multimedia/Connector/Renderer/Abstract.php
new file mode 100644
index 0000000000000000000000000000000000000000..0a6d45a222a61ee3163672b93b1471c3198ca25a
--- /dev/null
+++ b/library/Class/Multimedia/Connector/Renderer/Abstract.php
@@ -0,0 +1,28 @@
+<?php
+/**
+ * Copyright (c) 2012-2014, 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 
+ */
+
+
+class Class_Multimedia_Connector_Renderer_Abstract {
+	public function render($response, $connector) {
+		return $response;
+	}
+}
+?>
\ No newline at end of file
diff --git a/library/Class/Multimedia/Connector/Renderer/Encrypt.php b/library/Class/Multimedia/Connector/Renderer/Encrypt.php
index 5a7bd01c675a15704fb1079dea0359f836d21263..e94c7db5c16f44bbccfbe2ede70edacfd1bed9d8 100644
--- a/library/Class/Multimedia/Connector/Renderer/Encrypt.php
+++ b/library/Class/Multimedia/Connector/Renderer/Encrypt.php
@@ -19,15 +19,16 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
  */
 
-class Class_Multimedia_Connector_Renderer_Encrypt{
-
+class Class_Multimedia_Connector_Renderer_Encrypt
+extends Class_Multimedia_Connector_Renderer_Abstract{
 	protected static $_openssl;
-	
-	public function render($data){
+
+	public function render($data, $connector) {
 		$sealed_data = '';
-		$env_keys = array();
-		$this->getOpenssl()->opensslSeal($data , $sealed_data ,$env_keys , 
-									[Class_AdminVar::get('WEBKIOSK_KEY')]);
+		$env_keys = [];
+		$this->getOpenssl()
+			->opensslSeal($data , $sealed_data ,$env_keys , 
+										[$connector->getPublicKey()]);
 		$response = new StdClass();
 		$response->data_encrypted = base64_encode($sealed_data);
 		$response->symetric_key = base64_encode($env_keys[0]);
@@ -41,6 +42,8 @@ class Class_Multimedia_Connector_Renderer_Encrypt{
 		return new Class_Multimedia_Utils_OpensslUtil();
 	}
 
+
+	/** @category testing */
 	public static function setOpenssl($openssl){
 		self::$_openssl = $openssl;
 	}
diff --git a/library/Class/Multimedia/Connector/Renderer/Json.php b/library/Class/Multimedia/Connector/Renderer/Json.php
index bf52d1a0d1c4319591262c480d9c388b0ebcfc83..8c1878151bfa5ff72eb9deb95b83cf51ac650003 100644
--- a/library/Class/Multimedia/Connector/Renderer/Json.php
+++ b/library/Class/Multimedia/Connector/Renderer/Json.php
@@ -19,8 +19,9 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
  */
 
-class Class_Multimedia_Connector_Renderer_Json {
-	public function render($data) {
+class Class_Multimedia_Connector_Renderer_Json
+extends Class_Multimedia_Connector_Renderer_Abstract {
+	public function render($data, $connector) {
 		return json_encode($data);
 	}
 }
\ No newline at end of file
diff --git a/library/Class/Multimedia/Connector/Webkiosk.php b/library/Class/Multimedia/Connector/Webkiosk.php
index 12c070b61a64249c787d691643f7db40e63e6645..95173c5c2c1b9478e28d30e412d9e0ebc745241a 100644
--- a/library/Class/Multimedia/Connector/Webkiosk.php
+++ b/library/Class/Multimedia/Connector/Webkiosk.php
@@ -19,89 +19,30 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
  */
 
-class Class_Multimedia_Connector_Webkiosk {
-	const DATA_SEPARATOR = '--@--';
+class Class_Multimedia_Connector_Webkiosk extends Class_Multimedia_Connector_Abstract{
+	use Trait_Singleton;
 
-	/** @category testing */
-	protected static $_instance;
-
-	protected $_generatorRendering;
-
-
-	
-	public function __construct() {
-			$this->_generatorRendering = new Class_Multimedia_Connector_GeneratorRendering();
+	public function getPublicKey() {
+		return Class_AdminVar::get('WEBKIOSK_KEY');
 	}
 
 
-  public static function getInstance(){
-		if (null !== self::$_instance)
-			return self::$_instance;
-		return new self();
+	protected function isEnabled() {
+		return Class_AdminVar::isWebkioskEnabled();
 	}
 
-	/** @category testing */
-	public static function setInstance($instance) {
-		self::$_instance = $instance;		
-	}
-	
-	public function initAttributes($attributes){
-		$this->_generatorRendering->initAttributes($attributes);
-		return $this;
-	}
 
-	public function getGeneratorRendering(){
-		return $this->_generatorRendering;
+	protected function getDisabledError() {
+		return 'WEBKIOSK_DISABLED';
 	}
 
-	public function flagImportIncrementialOnFull(){
+
+	public function flagImportIncrementialOnFull() {
 		$this->_generatorRendering->addFullImportInResponse(true);
 	}
 	
+
 	public function intFlagImportIncremential(){
 		$this->_generatorRendering->addFullImportInResponse(false);
 	}
-
-	public function generateRenderer($request, $itemClosure){
-		if (!$this->isValid($request))
-			return $this->_generatorRendering->renderResponse();
-		
-		return $this->_generatorRendering->render($request, $itemClosure);		
-	}
-	
-	public function isValid($request) {
-		if (!($sign = $request->getParam('sign'))) {
-			$this->_generatorRendering->prepareResponseError('NO_PARAMETERS');
-			return false;
-		}
-
-		if(!Class_AdminVar::isWebkioskEnabled()){
-			$this->_generatorRendering->prepareResponseError('WEBKIOSK_DISABLED');
-			return false;
-		}
-
-		$openssl =  new Class_Multimedia_Utils_OpensslUtil();
-		$isValidated =$openssl->opensslVerify(
-			$this->dataFor($request->getActionName()), 
-																	 base64_decode($sign), 
-																	 Class_AdminVar::get('WEBKIOSK_KEY'));
-		restore_error_handler();
-
-		//	openssl_free_key($public_key);
-		if($isValidated == -1){
-			$this->_generatorRendering->prepareResponseError('ERROR_CHECKING_SIGNATURE');
-			return false;
-		}
-
-		if($isValidated == 0){
-			$this->_generatorRendering->prepareResponseError('INVALID_SIGNATURE');
-			return false;
-		}
-		
-		return true;
-	}
-
-	public function dataFor($data) {
-		return $data . self::DATA_SEPARATOR . date('Ymd');
-	}
 }
\ No newline at end of file
diff --git a/library/Class/Multimedia/PushAllUsersRequest.php b/library/Class/Multimedia/PushAllUsersRequest.php
index 6a3feb0ef0b6f13a3c13167be0df5e38ee185ca7..929970e0bb05e59a8fff1479e062b4839ffe6d61 100644
--- a/library/Class/Multimedia/PushAllUsersRequest.php
+++ b/library/Class/Multimedia/PushAllUsersRequest.php
@@ -20,20 +20,31 @@
  */
 
 class Class_Multimedia_PushAllUsersRequest extends Class_Multimedia_PushUsersRequest{
-
 	public static function newWith($connector) {
 		return new self($connector);
 	}
 
+
 	public function getResponse($request) {
 		return $this->_connector->generateRenderer($request, function () {
 		  $this->withBorrowersDo();
 	  });
 	}
 
+
 	public function withBorrowersDo() {
-		$users = Class_Users::getAllBorrowers();
-		if ($users)
-			parent::withUsersDo($users);
+		$total = Class_Users::countBorrowers();
+		$page_size = 1000;
+		$page_count = (int)($total / $page_size);
+		if (0 < $total % $page_size)
+			$page_count++;
+
+		for ($i = 1; $i <= $page_count; ++$i) {
+			Class_Users::clearCache();
+			Storm_Model_Loader::resetCache();
+			gc_collect_cycles();
+			if ($users = Class_Users::getBorrowersByPage($i, $page_size))
+				parent::withUsersDo($users);
+		}
 	}
 }
\ No newline at end of file
diff --git a/library/Class/Multimedia/Utils/OpensslUtil.php b/library/Class/Multimedia/Utils/OpensslUtil.php
index f530d4f881e6877567e13a956cfbc910ef4dacd5..e15d6ceff28cc8c0999dc36d864feb2c09f27fe5 100644
--- a/library/Class/Multimedia/Utils/OpensslUtil.php
+++ b/library/Class/Multimedia/Utils/OpensslUtil.php
@@ -19,28 +19,25 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
  */
 
-class Class_Multimedia_Utils_OpensslUtil{
-
+class Class_Multimedia_Utils_OpensslUtil {
 	protected $_error_verify_sign;
 
-	public function opensslSeal($data , &$sealed_data , 
-																		 &$env_keys ,  $pub_key_ids){
-
-				return openssl_seal ($data , $sealed_data ,$env_keys ,$pub_key_ids);
-
+	public function opensslSeal($data, &$sealed_data , &$env_keys, $pub_key_ids) {
+		return openssl_seal($data, $sealed_data, $env_keys, $pub_key_ids);
 	}
 
-		public function opensllVerifyHandlerError($errno, $errstr, $errfile, $errline){
+
+	public function opensllVerifyHandlerError($errno, $errstr, $errfile, $errline) {
 		$this->_error_verify_sign = true;
 		return true;
 	}
 
 
-	public function opensslVerify($data ,$sign, $pub_key){
-		set_error_handler(array($this, 'opensllVerifyHandlerError'));
+	public function opensslVerify($data, $sign, $pub_key) {
+		set_error_handler([$this, 'opensllVerifyHandlerError']);
 		$result = @openssl_verify($data, $sign, $pub_key);
 		restore_error_handler();
-		if($this->_error_verify_sign)
+		if ($this->_error_verify_sign)
 			return -1;
 		return $result;
 	}
diff --git a/library/Class/Users.php b/library/Class/Users.php
index 362b2c342b601b25106a1fe0b59b485cc348ee4f..422a430a8533f8afff525b555c2777c7314199ec 100644
--- a/library/Class/Users.php
+++ b/library/Class/Users.php
@@ -153,8 +153,8 @@ class UsersLoader extends Storm_Model_Loader {
 	/**
 	 * @return array
 	 */
-	public function getAllBorrowers(){
-    return  $this->findAllBy(['role_level' => 2]);
+	public function getAllBorrowers() {
+    return $this->findAllBy(['role_level' => 2]);
 	}
 
 	public function getBorrowersModifiedAfter($dateMaj){
@@ -163,6 +163,17 @@ class UsersLoader extends Storm_Model_Loader {
 	}
 
 
+	public function countBorrowers() {
+		return Class_Users::countBy(['role_level' => 2]);
+	}
+
+
+	public function getBorrowersByPage($page, $page_size) {
+		return Class_Users::findAllBy(['role_level' => 2,
+																	 'limitPage' => [$page, $page_size]]);
+	}
+
+
 	public function mapUser($destination, $source) {
 		$destination
 			->setIdSigb($source->getIdSigb())
diff --git a/library/Class/WebkioskLink.php b/library/Class/WebkioskLink.php
index 996a89b99ca96e8131a2f8b8dd560fcceea93175..0aae5ac1201c99abc9d3f2e1b4e1130d60c24403 100644
--- a/library/Class/WebkioskLink.php
+++ b/library/Class/WebkioskLink.php
@@ -39,17 +39,17 @@ class Class_WebkioskLink {
 	}
 
 
-	public function url() {		
+	public function url() {
+		$connector = Class_Multimedia_Connector_Webkiosk::getInstance();
 		$response_jsonencode =(new Class_Multimedia_Connector_Renderer_Json())
-			->render(
-				['login' => $this->_user->getLogin(), 
-				 'password' => $this->_user->getPassword(), 
-				 'date' => date('Ymd')
-				]
-			);
-		$response_encrypted = (new Class_Multimedia_Connector_Renderer_Encrypt())->render($response_jsonencode);
-
-		$auth_crypte_base64 = urlencode(base64_encode((new Class_Multimedia_Connector_Renderer_Json())->render($response_encrypted)));
+			->render(['login' => $this->_user->getLogin(), 
+								'password' => $this->_user->getPassword(), 
+								'date' => date('Ymd')], $connector);
+
+		$response_encrypted = (new Class_Multimedia_Connector_Renderer_Encrypt())
+			->render($response_jsonencode, $connector);
+
+		$auth_crypte_base64 = urlencode(base64_encode((new Class_Multimedia_Connector_Renderer_Json())->render($response_encrypted, $connector)));
 
 		return $this->getBaseUrl().'?sso='.$auth_crypte_base64;
 	}
diff --git a/tests/application/modules/opac/controllers/AbonneControllerMultimediaTest.php b/tests/application/modules/opac/controllers/AbonneControllerMultimediaTest.php
index 2ff7419218d8df02863609ffa038b0d2db4e2904..3af31e31b738a05eb3ed6fe8df1185993b35ffb6 100644
--- a/tests/application/modules/opac/controllers/AbonneControllerMultimediaTest.php
+++ b/tests/application/modules/opac/controllers/AbonneControllerMultimediaTest.php
@@ -206,6 +206,12 @@ class AbonneControllerMultimediaAuthenticateMireilleTest extends AbonneControlle
 	public function shouldReturnSubscriptionExpired() {
 		$this->assertEquals('SubscriptionExpired', $this->_json->error);	
 	}
+
+
+	/** @test */
+	public function dateFinShouldNotBePresent() {
+		$this->assertFalse(isset($this->_json->date_fin));
+	}
 }
 
 
@@ -418,7 +424,20 @@ class AbonneControllerMultimediaAuthenticateBaptisteTest extends AbonneControlle
 		
 	/** @test */
 	public function groupsShouldBeMineurAbonneAndOldSchool() {
-		$this->assertEquals(array('mineur','abonne_sigb', 'Devs Oldschool'), $this->_json->groupes);	
+		$this->assertEquals(['mineur','abonne_sigb', 'Devs Oldschool'], 
+												$this->_json->groupes);	
+	}
+
+
+	/** @test */
+	public function dateFinShouldBe3000_01_01() {
+		$this->assertEquals('3000-01-01', $this->_json->date_fin);
+	}
+
+
+	/** @test */
+	public function dateDebutShouldBe1978_05_23() {
+		$this->assertEquals('1978-05-23', $this->_json->date_debut);
 	}
 }
 
@@ -1252,6 +1271,7 @@ class AbonneControllerMultimediaUsersFixtures {
 			->setPassword("afi")
 			->beAbonneSIGB()
 			->setNaissance('2005-02-17')
+			->setDateDebut('1978-05-23')
 			->setDateFin('3000-01-01');
 	}
 
diff --git a/tests/application/modules/opac/controllers/AbonneControllerWebkioskTest.php b/tests/application/modules/opac/controllers/AbonneControllerWebkioskTest.php
index 34affcf6871c3ed34b4321b95d14051c43ed4b46..a90148accfa8b901dd69a525e206a5868f6d89dc 100644
--- a/tests/application/modules/opac/controllers/AbonneControllerWebkioskTest.php
+++ b/tests/application/modules/opac/controllers/AbonneControllerWebkioskTest.php
@@ -26,27 +26,27 @@ abstract class AbonneControllerWebkioskTestCase extends AbstractControllerTestCa
 	public function setUp() {
 		parent::setUp();
 
-		Class_AdminVar::newInstanceWithId('WEBKIOSK_KEY', ['valeur' => '-----BEGIN PUBLIC KEY-----
+		Class_AdminVar::newInstanceWithId(
+			'WEBKIOSK_KEY', 
+			['valeur' => '-----BEGIN PUBLIC KEY-----
 MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCm1hgee4LI7ji06BkuV8O4XpxH
 e59n80Gge/r3uROj+Tuxx2AOSk9gX7e4JNVsdfw22ft+xVqwAii8qu4/fYuicrrZ
 l66WXceACmsgGWEdHMB7ZPUd4HqR5bdE1Xnr1Q0Z9IIku6Naxt/yy0P5Gv+ZlW7U
 287hF3sdh2dp7UgguQIDAQAB
 -----END PUBLIC KEY-----']);
 
-
 		Class_AdminVar::newInstanceWithId('WEBKIOSK_RESERVATION_URL',
 																			['valeur' => 'http://resa.zebib.net']);
 
 		$this->_amadou = Class_Users::newInstanceWithId(87,
-																						 ['login' => 'amadou',
-																							'password' => 'secret']);
+																										['login' => 'amadou',
+																										 'password' => 'secret']);
 		ZendAfi_Auth::getInstance()->logUser($this->_amadou);
 	}
 }
 
 
 
-
 class AbonneControllerWebkioskWithAbonneSIGBTest extends AbonneControllerWebkioskTestCase {
 	public function setUp() {
 		parent::setUp();
diff --git a/tests/application/modules/push/controllers/MultimediaControllerTest.php b/tests/application/modules/push/controllers/MultimediaControllerTest.php
index 3f7028de3cdf215dfe037bee2c59bbd936c8497a..91b10198686d3b2bce27c8e51c376c97684e8495 100644
--- a/tests/application/modules/push/controllers/MultimediaControllerTest.php
+++ b/tests/application/modules/push/controllers/MultimediaControllerTest.php
@@ -20,35 +20,48 @@
  */
 require_once 'AbstractControllerTestCase.php';
 
-abstract class Push_MultimediaControllerInvalidConfigTestCase extends AbstractControllerTestCase {
+abstract class Push_MultimediaControllerTestCase extends AbstractControllerTestCase {
 	/** @var Storm_Test_ObjectWrapper */
 	protected $_log;
 
 	public function setUp() {
 		parent::setUp();
-				
-		$this->_log = Storm_Test_ObjectWrapper::mock()
-				->whenCalled('err')
-				->answers(null)
-				
-				->whenCalled('info')
-				->answers(null);
+		$this->_log = Storm_Test_ObjectWrapper::mock();
+		Class_Multimedia::getInstance()->setLog($this->_log);
+	}
+}
+
 
-		Class_Multimedia::setLog($this->_log);
 
-		$this->postDispatch('/push/multimedia/config', $this->_getInvalidParams());
+class Push_MultimediaControllerInvalidConfigTest extends Push_MultimediaControllerTestCase {
+	public function setUp() {
+		parent::setUp();				
+		$this->_log
+			->whenCalled('err')->answers(null)
+			->whenCalled('info')->answers(null);
 	}
 
 
-	/** @test */
-	public function startShouldBeLogged() {
-		$this->assertTrue($this->_log->methodHasBeenCalled('info'));
+	public function datas() {
+		return [
+			[[], 'Missing json parameter'],
+			[['json' => '{}'], 'Missing sign parameter'],
+			[['json' => 'it is invalid', 'sign' => 'iu/-@+uieiucrc'], 'Invalid json'],
+			[['json' => '[{"libelle":"Groupe 1", "id":1, "site":{"id":1,"libelle":"Site 1"}, "postes":[{"id":1, "libelle":"Poste 1", "os":"Windows XP", "maintenance":"1"}, {"id":2, "libelle":"Poste 2", "os":"Ubuntu Lucid Lynx", "maintenance":"0"}]}]',
+				'sign' => 'iu/-@+uieiucrc'], 
+			 'Sign check failure']
+			];
 	}
 
 
-	/** @return array */
-	protected function _getInvalidParams() {
-		return array();
+	/** 
+	 * @test 
+	 * @dataProvider datas
+	 */
+	public function withParamsShouldHaveError($params, $message) {
+		$this->postDispatch('/push/multimedia/config', $params);
+		$this->assertTrue($this->_log->methodHasBeenCalled('info'));
+		$this->_assertErrorLogWithMessage($message);
 	}
 
 
@@ -59,105 +72,69 @@ abstract class Push_MultimediaControllerInvalidConfigTestCase extends AbstractCo
 }
 
 
-class Push_MultimediaControllerMissingJsonConfigTest extends Push_MultimediaControllerInvalidConfigTestCase {	
-	/** @test */
-	public function missingJsonErrorShouldBeLogged() {
-		$this->_assertErrorLogWithMessage('Missing json parameter');
-	}
-}
-
-
-class Push_MultimediaControllerMissingSignConfigTest extends Push_MultimediaControllerInvalidConfigTestCase {
-	/** @return array */
-	protected function _getInvalidParams() {
-		return array('json' => '{}');
-	}
-	
-	/** @test */
-	public function missingSignErrorShouldBeLogged() {
-		$this->_assertErrorLogWithMessage('Missing sign parameter');
-	}
-}
-
-
-class Push_MultimediaControllerInvalidJsonConfigTest extends Push_MultimediaControllerInvalidConfigTestCase {
-	/** @return array */
-	protected function _getInvalidParams() {
-		return array('json' => 'it is invalid', 'sign' => 'iu/-@+uieiucrc');
-	}
-	
-	/** @test */
-	public function invalidJsonErrorShouldBeLogged() {
-		$this->_assertErrorLogWithMessage('Invalid json');
-	}
-}
-
 
-class Push_MultimediaControllerInvalidSignConfigTest extends Push_MultimediaControllerInvalidConfigTestCase {
-	/** @return array */
-	protected function _getInvalidParams() {
-		return array('json' => '[{"libelle":"Groupe 1", "id":1, "site":{"id":1,"libelle":"Site 1"}, "postes":[{"id":1, "libelle":"Poste 1", "os":"Windows XP", "maintenance":"1"}, {"id":2, "libelle":"Poste 2", "os":"Ubuntu Lucid Lynx", "maintenance":"0"}]}]',
-			                     'sign' => 'iu/-@+uieiucrc');
-	}
-	
-	/** @test */
-	public function signCheckFailureErrorShouldBeLogged() {
-		$this->_assertErrorLogWithMessage('Sign check failure');
-	}
-}
+class Push_MultimediaControllerValidConfigTest extends Push_MultimediaControllerTestCase {
+	protected $_private_key ="-----BEGIN RSA PRIVATE KEY-----
+MIICWwIBAAKBgQCm1hgee4LI7ji06BkuV8O4XpxHe59n80Gge/r3uROj+Tuxx2AO
+Sk9gX7e4JNVsdfw22ft+xVqwAii8qu4/fYuicrrZl66WXceACmsgGWEdHMB7ZPUd
+4HqR5bdE1Xnr1Q0Z9IIku6Naxt/yy0P5Gv+ZlW7U287hF3sdh2dp7UgguQIDAQAB
+AoGAUQv+aYh8r1myqId7/Bxckws7BirS9G+iuPChqYf6N5US37lIO4jz6JB3MniK
+SYdDf+4DE8GR3aEe4xBybttxYi9JSG28LxSMvUCv13AOpj8GT34cDxDgwczDI9nb
+549/hdGpRF+vW0imfA1lguyuteoQHRMUImoHdl8ZRzPXlaUCQQDWEThzawIlbjah
+v5uEQ5OjHIJfDECDyV4IIBGfwcpsiCH98Rb4SzcFRvoIJ7HtmNuHT6/fR5JQmnQG
+0Vn6qTw3AkEAx4Rk4e/uLSxdDrsqI3rXg+mSNUAXc1IlHUJpRvoktbpfxTwRjwxO
+Pp7HmcaApw5RuJ0nOnNGE0J4GBjEAglyjwJAKJ+p+9VB2gKZYYawJ6B/YwPlBc6Y
+a6oKKzaSwaOQG5qWANAA0OvNLDY0+tk1neZVOs93i8LUVHGLNUQDdFsrbwJATEXi
+wzUUGpThJmaK33Fwvm8mg9DyphV7NspSsN2j9w0+24nxNHyB1RKiP7lRKYwh1a/O
+dVvoKCi6/ItLM3QlJQJAEyvWEfvqKnFH13ID5oe/GVOih7O6VzgecEgd3ZawBVWd
+dsZ77MnSRzIyzrfJ3LlluaXhJl2qJBITE7X8y5RTKw==
+-----END RSA PRIVATE KEY-----";
 
+	protected $_public_key = "-----BEGIN PUBLIC KEY-----
+MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCm1hgee4LI7ji06BkuV8O4XpxH
+e59n80Gge/r3uROj+Tuxx2AOSk9gX7e4JNVsdfw22ft+xVqwAii8qu4/fYuicrrZ
+l66WXceACmsgGWEdHMB7ZPUd4HqR5bdE1Xnr1Q0Z9IIku6Naxt/yy0P5Gv+ZlW7U
+287hF3sdh2dp7UgguQIDAQAB
+-----END PUBLIC KEY-----";
 
-class Push_MultimediaControllerValidConfigTest extends AbstractControllerTestCase {
 	protected $_group;
 	protected $_device_wrapper;
 	protected $_device_to_delete;
-	protected $_devices = array();
+	protected $_devices = [];
 
 	public function setUp() {
 		parent::setUp();
-		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Multimedia_Location')
-				->whenCalled('findFirstBy')
-				->answers(null)
-				
-				->whenCalled('save')
-				->willDo(function($model) {$model->setId(1);return true;});
-
-		$device_group_wrapper = Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Multimedia_DeviceGroup')
-				->whenCalled('findFirstBy')
-				->answers(null)
-				
-				->whenCalled('save')
-				->answers(true);
 
-		$this->_device_wrapper = Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Multimedia_Device')
-				->whenCalled('findFirstBy')
-				->answers(null)
-
-				->whenCalled('delete')
-				->answers(null)
-				
-				->whenCalled('save')
-				->willDo(function ($model) {
-						$this->_devices[] = $model;
-						return true;
-					})
+		$this->_log->whenCalled('info')->answers(null);
+
+		Class_AdminVar::newInstanceWithId('MULTIMEDIA_KEY')
+			->setValeur($this->_public_key);
 
+		Class_Multimedia_Location::beVolatile();
+		Class_Multimedia_DeviceGroup::beVolatile();
+
+		$this->_device_wrapper = Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Multimedia_Device')
 			->whenCalled('findAllBy')
   		->with(['where' => 'id_origine not in(\'1-1\',\'1-2\') and id_origine like \'1-%\''])		 
-			->answers([$this->_device_to_delete = Class_Multimedia_Device::newInstanceWithId(34)
-								 ->setIdOrigine('1-34')]);
+			->answers([
+									$this->fixture('Class_Multimedia_Device', 
+																 ['id' => 34, 'id_origine' => '1-34'])]);
 
-		Class_Multimedia::setInstance(Storm_Test_ObjectWrapper::mock()
-			->whenCalled('isValidHashForContent')
-			->answers(true));
+		$datas = '[{"libelle":"Groupe 1", "id":1, "site":{"id":1,"libelle":"Site 1","admin_url":"192.168.2.92"}, "postes":[{"id":1, "libelle":"Poste 1", "os":"Windows XP", "maintenance":"1"}, {"id":2, "libelle":"Poste 2", "os":"Ubuntu Lucid Lynx", "maintenance":"0"}]}]';
 
 		$this->postDispatch(
 				'/push/multimedia/config',
-				array(
-						'json' => '[{"libelle":"Groupe 1", "id":1, "site":{"id":1,"libelle":"Site 1","admin_url":"192.168.2.92"}, "postes":[{"id":1, "libelle":"Poste 1", "os":"Windows XP", "maintenance":"1"}, {"id":2, "libelle":"Poste 2", "os":"Ubuntu Lucid Lynx", "maintenance":"0"}]}]',
-						'sign' => 'auieau09676IUE96'));
+				['json' => $datas,
+				 'sign' => $this->sign($datas)]);
 
-		$this->_group = $device_group_wrapper->getFirstAttributeForLastCallOn('save');
+		$this->_group = Class_Multimedia_DeviceGroup::find(1);
+		$this->_devices = Class_Multimedia_Device::findAll();
+	}
+
+
+	protected function sign($datas) {
+		openssl_sign($datas, $sign, $this->_private_key);
+		return base64_encode($sign);
 	}
 
 		
@@ -246,12 +223,10 @@ class Push_MultimediaControllerValidConfigTest extends AbstractControllerTestCas
 	}
 
 
-
 	/** @test */
 	public function deviceNotInPushShouldHaveBeenDeleted() {
-		$this->assertEquals($this->_device_to_delete, Class_Multimedia_Device::getFirstAttributeForLastCallOn('delete'));
+		$this->assertNull(Class_Multimedia_Device::find(34));
 	}
-
 }
 
 
@@ -303,25 +278,30 @@ yIuUs1qpg+Vx0R+3VwIDAQAB
 	}
 	
 	public function signUrl($action){
-		$connector = new Class_Multimedia_Connector_Webkiosk();
+		$connector = new Class_Multimedia_Connector_Multimedia();
 		openssl_sign($connector->dataFor($action), 
 								 $sign, 
 								 $this->_private_key);
-		return  base64_encode($sign);
+		return base64_encode($sign);
 	}
 }
 
-abstract class AllBorrowersMultimediaControllerJsonEncodeOnlyTestCase extends AllBorrowersMultimediaControllerTestCase {
-		public function setUp() {
+
+abstract class AllBorrowersMultimediaControllerJsonEncodeOnlyTestCase 
+extends AllBorrowersMultimediaControllerTestCase {
+	public function setUp() {
 		parent::setUp();
-			$connector = new Class_Multimedia_Connector_Multimedia();
-			$connector->getGeneratorRendering()->setRenderers([new Class_Multimedia_Connector_Renderer_Json()]);
-			$connector->getGeneratorRendering()->setCurrentDate('2013-10-15 16:26:23');
-			Class_Multimedia_Connector_Multimedia::setInstance($connector);
+		$connector = new Class_Multimedia_Connector_Multimedia();
+		$connector->getGeneratorRendering()
+			->setRenderers(['Json'])
+			->setCurrentDate('2013-10-15 16:26:23');
+		Class_Multimedia_Connector_Multimedia::setInstance($connector);
  	}
 }
 
-class AllBorrowersMultimediaControllerGetAllBorrowersValidationTest extends AllBorrowersMultimediaControllerJsonEncodeOnlyTestCase {
+
+class AllBorrowersMultimediaControllerGetAllBorrowersValidationTest 
+extends AllBorrowersMultimediaControllerJsonEncodeOnlyTestCase {
 	public function setUp() {
 		parent::setUp();
 		$this->_resp = $this->getResponseJsonDecode('get-all-borrowers');
@@ -348,16 +328,10 @@ class AllBorrowersMultimediaControllerNoParameterTest extends AllBorrowersMultim
 	public function setUp() {
 		parent::setUp();
 
-		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Users')
-			->whenCalled('getAllBorrowers')
-			->answers([AbonneMultimediaControllerMultimediaUsersFixtures::getLoas(), 
-								 AbonneMultimediaControllerMultimediaUsersFixtures::getAmadou()]);
-
 	  Class_AdminVar::getLoader()
 			->newInstanceWithId('MULTIMEDIA_KEY')
 			->setValeur($this->getPublicKey());
 
-		$sign = $this->signUrl('get-all-borrowers');
 		$this->_resp = $this->getResponseJsonDecode('get-all-borrowers');
  	}
 
@@ -373,16 +347,12 @@ class AllBorrowersMultimediaControllerNoParameterTest extends AllBorrowersMultim
 	}
 }
 
-class AllBorrowersMultimediaControllerWebkioskDisabledTest extends AllBorrowersMultimediaControllerJsonEncodeOnlyTestCase {
+
+class AllBorrowersMultimediaControllerDisabledTest extends AllBorrowersMultimediaControllerJsonEncodeOnlyTestCase {
 
 	public function setUp() {
 		parent::setUp();
 
-		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Users')
-			->whenCalled('getAllBorrowers')
-			->answers([AbonneMultimediaControllerMultimediaUsersFixtures::getLoas(), 
-								 AbonneMultimediaControllerMultimediaUsersFixtures::getAmadou()]);
-
 	  Class_AdminVar::getLoader()
 			->newInstanceWithId('MULTIMEDIA_KEY')
 			->setValeur('');
@@ -410,11 +380,6 @@ class AllBorrowersMultimediaControllerInvalidSignatureTest extends AllBorrowersM
 	public function setUp() {
 		parent::setUp();
 
-		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Users')
-			->whenCalled('getAllBorrowers')
-			->answers([AbonneMultimediaControllerMultimediaUsersFixtures::getLoas(), 
-								 AbonneMultimediaControllerMultimediaUsersFixtures::getAmadou()]);
-
 	  Class_AdminVar::getLoader()
 			->newInstanceWithId('MULTIMEDIA_KEY')
 			->setValeur($this->_invalid_public_key);
@@ -442,11 +407,6 @@ class AllBorrowersMultimediaControllerErrorCheckingSignatureTest extends AllBorr
 	public function setUp() {
 		parent::setUp();
 
-		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Users')
-			->whenCalled('getAllBorrowers')
-			->answers([AbonneMultimediaControllerMultimediaUsersFixtures::getLoas(), 
-								 AbonneMultimediaControllerMultimediaUsersFixtures::getAmadou()]);
-
 	  Class_AdminVar::getLoader()
 			->newInstanceWithId('MULTIMEDIA_KEY')
 			->setValeur('"-----BEGIN PUBLIC KEY-----
@@ -476,7 +436,9 @@ class AllBorrowersMultimediaControllerGetAllBorrowersNumberOfOccurencesReturnedT
 		parent::setUp();
 
 		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Users')
-			->whenCalled('getAllBorrowers')
+			->whenCalled('countBorrowers')
+			->answers(2)
+			->whenCalled('getBorrowersByPage')
 			->answers([AbonneMultimediaControllerMultimediaUsersFixtures::getLoas(), 
 								 AbonneMultimediaControllerMultimediaUsersFixtures::getAmadou()]);
 
@@ -502,12 +464,13 @@ class AllBorrowersMultimediaControllerGetAllBorrowersNumberOfOccurencesReturnedT
 
 
 class AllBorrowersMultimediaControllerFirstBorrowerReturnedIsLoasTest extends AllBorrowersMultimediaControllerJsonEncodeOnlyTestCase {
- 
-
 	public function setUp() {
 		parent::setUp();
-				Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Users')
-			->whenCalled('getAllBorrowers')
+
+		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Users')
+			->whenCalled('countBorrowers')
+			->answers(2)
+			->whenCalled('getBorrowersByPage')
 			->answers([AbonneMultimediaControllerMultimediaUsersFixtures::getLoas(), 
 								 AbonneMultimediaControllerMultimediaUsersFixtures::getAmadou()]);
 
@@ -534,7 +497,6 @@ class AllBorrowersMultimediaControllerFirstBorrowerReturnedIsLoasTest extends Al
 	public function roleLevelShouldNotBePresent() {
 		$this->assertFalse( property_exists($this->_resp->data[0],'roleLevel'));
 	}
-
 }
 
 
diff --git a/tests/application/modules/push/controllers/WebkioskControllerTest.php b/tests/application/modules/push/controllers/WebkioskControllerTest.php
index 877ad7e6fd3f0bac4ace6caff89e2738b3521d36..17e0f0f4263b856a4c06064be87767d90f3897ee 100644
--- a/tests/application/modules/push/controllers/WebkioskControllerTest.php
+++ b/tests/application/modules/push/controllers/WebkioskControllerTest.php
@@ -80,12 +80,13 @@ yIuUs1qpg+Vx0R+3VwIDAQAB
 
 
 abstract class WebkioskControllerJsonEncodeOnlyTestCase extends WebkioskControllerTestCase {
-		public function setUp() {
+	public function setUp() {
 		parent::setUp();
-			$connector = new Class_Multimedia_Connector_Webkiosk();
-			$connector->getGeneratorRendering()->setRenderers([new Class_Multimedia_Connector_Renderer_Json()]);
-			$connector->getGeneratorRendering()->setCurrentDate('2013-10-15 16:26:23');
-			Class_Multimedia_Connector_Webkiosk::setInstance($connector);
+		$connector = new Class_Multimedia_Connector_Webkiosk();
+		$connector->getGeneratorRendering()
+			->setRenderers(['Json'])
+			->setCurrentDate('2013-10-15 16:26:23');
+		Class_Multimedia_Connector_Webkiosk::setInstance($connector);
  	}
 }
 
@@ -245,7 +246,9 @@ class WebkioskControllerGetAllBorrowersNumberOfOccurencesReturnedTest extends We
 		parent::setUp();
 
 		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Users')
-			->whenCalled('getAllBorrowers')
+			->whenCalled('countBorrowers')
+			->answers(2)
+			->whenCalled('getBorrowersByPage')
 			->answers([AbonneControllerWebkioskUsersFixtures::getLoas(), 
 								 AbonneControllerWebkioskUsersFixtures::getAmadou()]);
 
@@ -275,8 +278,10 @@ class WebkioskControllerFirstBorrowerReturnedIsLoasTest extends WebkioskControll
 
 	public function setUp() {
 		parent::setUp();
-				Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Users')
-			->whenCalled('getAllBorrowers')
+		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Users')
+			->whenCalled('countBorrowers')
+			->answers(2)
+			->whenCalled('getBorrowersByPage')
 			->answers([AbonneControllerWebkioskUsersFixtures::getLoas(), 
 								 AbonneControllerWebkioskUsersFixtures::getAmadou()]);
 
@@ -301,7 +306,7 @@ class WebkioskControllerFirstBorrowerReturnedIsLoasTest extends WebkioskControll
 
 	/** @test */
 	public function roleLevelShouldNotBePresent() {
-		$this->assertFalse( property_exists($this->_resp->data[0],'roleLevel'));
+		$this->assertFalse(property_exists($this->_resp->data[0],'roleLevel'));
 	}
 
 }
@@ -311,9 +316,7 @@ class WebkioskControllerFirstBorrowerReturnedIsLoasTest extends WebkioskControll
 abstract class WebkioskControllerJsonEncryptedTestCase extends WebkioskControllerTestCase {
 		public function setUp() {
 		parent::setUp();
-			$connector = new Class_Multimedia_Connector_Webkiosk();
-			$connector->getGeneratorRendering()->setRenderers([new Class_Multimedia_Connector_Renderer_Json(), new Class_Multimedia_Connector_Renderer_Encrypt(), new Class_Multimedia_Connector_Renderer_Json()]);
-			Class_Multimedia_Connector_Webkiosk::setInstance($connector);
+			Class_Multimedia_Connector_Webkiosk::setInstance(new Class_Multimedia_Connector_Webkiosk());
  	}
 }
 
@@ -322,12 +325,12 @@ class WebkioskControllerEncryptedDataTest extends WebkioskControllerJsonEncrypte
 
 	public function setUp() {
 		parent::setUp();
-				Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Users')
+		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Users')
 			->whenCalled('getAllBorrowers')
 			->answers([AbonneControllerWebkioskUsersFixtures::getLoas(), 
 								 AbonneControllerWebkioskUsersFixtures::getAmadou()]);
-
-				Class_Multimedia_Connector_Renderer_Encrypt::setOpenssl(new OpensslTesting());
+		
+		Class_Multimedia_Connector_Renderer_Encrypt::setOpenssl(new OpensslTesting());
 	  Class_AdminVar::getLoader()
 			->newInstanceWithId('WEBKIOSK_KEY')
 			->setValeur($this->getPublicKey());
diff --git a/tests/library/Class/MultimediaTest.php b/tests/library/Class/MultimediaTest.php
index 09b43caab998767b2688f12d7ff257702f1ee760..a982506e6e6cc990555bf9f27e0a1e139771d39a 100644
--- a/tests/library/Class/MultimediaTest.php
+++ b/tests/library/Class/MultimediaTest.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * Copyright (c) 2012, Agence Française Informatique (AFI). All rights reserved.
+ * Copyright (c) 2012-2014, 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
@@ -19,28 +19,40 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
  */
 
-class MultimediaTest extends PHPUnit_Framework_TestCase {
+
+class Class_MultimediaHashTest extends PHPUnit_Framework_TestCase{
+	protected $_datas = '[{"libelle":"Actualit\u00e9","id":"5","site":{"id":"1","libelle":"antibes"},"postes":[{"id":"44","libelle":"ANACTU05","os":"Windows XP","maintenance":"0"},{"id":"46","libelle":"ANACTU04","os":"Windows XP","maintenance":"0"},{"id":"48","libelle":"ANACTU12","os":"Windows XP","maintenance":"0"},{"id":"49","libelle":"ANACTU11","os":"Windows XP","maintenance":"0"},{"id":"50","libelle":"ANACTU10","os":"Windows XP","maintenance":"0"},{"id":"51","libelle":"ANACTU08","os":"Windows XP","maintenance":"0"},{"id":"52","libelle":"ANACTU06","os":"Windows XP","maintenance":"0"},{"id":"62","libelle":"ANACTU07","os":"Windows XP","maintenance":"0"},{"id":"63","libelle":"ANACTU13","os":"Windows XP","maintenance":"0"},{"id":"64","libelle":"ANACTU09","os":"Windows XP","maintenance":"0"}]},{"libelle":"default","id":"1","site":{"id":"1","libelle":"antibes"},"postes":[{"id":"77","libelle":"ANFICT30","os":"Windows XP","maintenance":"0"}]},{"libelle":"Documentation","id":"3","site":{"id":"1","libelle":"antibes"},"postes":[{"id":"13","libelle":"ANDOCU07","os":"Windows XP","maintenance":"0"},{"id":"14","libelle":"ANDOCU05","os":"Windows XP","maintenance":"0"},{"id":"15","libelle":"ANDOCU06","os":"Windows XP","maintenance":"0"},{"id":"17","libelle":"ANDOCU10","os":"Windows XP","maintenance":"0"},{"id":"18","libelle":"ANDOCU09","os":"Windows XP","maintenance":"0"},{"id":"20","libelle":"ANDOCU12","os":"Windows XP","maintenance":"0"},{"id":"21","libelle":"ANDOCU11","os":"Windows XP","maintenance":"0"},{"id":"22","libelle":"ANDOCU04","os":"Windows XP","maintenance":"0"},{"id":"57","libelle":"ANDOCU14","os":"Windows XP","maintenance":"0"},{"id":"59","libelle":"ANDOCU15","os":"Windows XP","maintenance":"0"},{"id":"61","libelle":"ANDOCU16","os":"Windows XP","maintenance":"0"}]},{"libelle":"Fiction","id":"2","site":{"id":"1","libelle":"antibes"},"postes":[{"id":"9","libelle":"ANFICT03","os":"Windows XP","maintenance":"0"},{"id":"10","libelle":"ANFICT04","os":"Windows XP","maintenance":"0"},{"id":"11","libelle":"ANFICT02","os":"Windows XP","maintenance":"0"},{"id":"12","libelle":"ANFICT01","os":"Windows XP","maintenance":"0"},{"id":"66","libelle":"ANFICT05","os":"Windows 7","maintenance":"0"}]},{"libelle":"Handicap\u00e9","id":"8","site":{"id":"1","libelle":"antibes"},"postes":[{"id":"42","libelle":"ANFICT10","os":"Windows XP","maintenance":"0"},{"id":"43","libelle":"ANFICT11","os":"Windows XP","maintenance":"0"}]},{"libelle":"Jeunesse","id":"6","site":{"id":"1","libelle":"antibes"},"postes":[{"id":"26","libelle":"ANJEUN02","os":"Windows XP","maintenance":"0"},{"id":"27","libelle":"ANJEUN03","os":"Windows XP","maintenance":"0"},{"id":"28","libelle":"ANJEUN04","os":"Windows XP","maintenance":"0"},{"id":"29","libelle":"ANJEUN05","os":"Windows XP","maintenance":"0"},{"id":"30","libelle":"ANJEUN08","os":"Windows XP","maintenance":"0"},{"id":"31","libelle":"ANJEUN06","os":"Windows XP","maintenance":"0"},{"id":"32","libelle":"ANJEUN09","os":"Windows XP","maintenance":"0"},{"id":"33","libelle":"ANJEUN07","os":"Windows XP","maintenance":"0"},{"id":"56","libelle":"ANJEUN10","os":"Windows XP","maintenance":"0"}]},{"libelle":"Musique","id":"4","site":{"id":"1","libelle":"antibes"},"postes":[{"id":"38","libelle":"ANMUSI04","os":"Windows XP","maintenance":"0"},{"id":"39","libelle":"ANMUSI03","os":"Windows XP","maintenance":"0"},{"id":"40","libelle":"ANMUSI06","os":"Windows XP","maintenance":"0"},{"id":"41","libelle":"ANMUSI05","os":"Windows XP","maintenance":"0"}]},{"libelle":"Opac","id":"7","site":{"id":"1","libelle":"antibes"},"postes":[{"id":"4","libelle":"ANFICT06","os":"Windows XP","maintenance":"0"},{"id":"7","libelle":"ANFICT07","os":"Windows XP","maintenance":"0"},{"id":"8","libelle":"ANFICT08","os":"Windows XP","maintenance":"0"},{"id":"19","libelle":"ANDOCU08","os":"Windows XP","maintenance":"0"},{"id":"23","libelle":"ANDOCU13","os":"Windows XP","maintenance":"0"},{"id":"24","libelle":"ANDOCU02","os":"Windows XP","maintenance":"0"},{"id":"25","libelle":"ANDOCU01","os":"Windows XP","maintenance":"0"},{"id":"34","libelle":"ANJEUN11","os":"Windows XP","maintenance":"0"},{"id":"35","libelle":"ANJEUN01","os":"Windows XP","maintenance":"0"},{"id":"36","libelle":"ANMUSI02","os":"Windows XP","maintenance":"0"},{"id":"37","libelle":"ANMUSI01","os":"Windows XP","maintenance":"0"},{"id":"45","libelle":"ANACTU03","os":"Windows XP","maintenance":"0"},{"id":"47","libelle":"ANACTU02","os":"Windows XP","maintenance":"0"},{"id":"65","libelle":"ANACTU01","os":"Windows XP","maintenance":"0"}]}]';
+
+	protected $_multimedia;
+
+	public function setUp() {
+		parent::setUp();
+		$this->_multimedia = Class_Multimedia::getInstance();
+
+		Class_AdminVar::newInstanceWithId(Class_Multimedia_HashValidator_Null::KEY_VAR_NAME)
+			->setValeur('a7de41db2505672d8052117869c08517');
+
+		$oldTimeZone = date_default_timezone_get();
+		date_default_timezone_set('UTC');
+		Class_Multimedia_HashValidator_Md5::setTimeSource(
+			Storm_Test_ObjectWrapper::mock()
+			->whenCalled('time')
+			->answers(strtotime('2012-07-17')));
+		date_default_timezone_set($oldTimeZone);
+	}
+
+
 	/** @test */
 	public function validHashShouldBeValid() {
-		Class_Multimedia::setInstance(new Class_MultimediaTesting);
-
-		$this->assertTrue(Class_Multimedia::isValidHash(
-				'b2d76718d5ba373c8c65b1dd9c724e7b', //'a1e3bdf173b8060891fb4c8af6099e10',
-				'[{"libelle":"Actualit\u00e9","id":"5","site":{"id":"1","libelle":"antibes"},"postes":[{"id":"44","libelle":"ANACTU05","os":"Windows XP","maintenance":"0"},{"id":"46","libelle":"ANACTU04","os":"Windows XP","maintenance":"0"},{"id":"48","libelle":"ANACTU12","os":"Windows XP","maintenance":"0"},{"id":"49","libelle":"ANACTU11","os":"Windows XP","maintenance":"0"},{"id":"50","libelle":"ANACTU10","os":"Windows XP","maintenance":"0"},{"id":"51","libelle":"ANACTU08","os":"Windows XP","maintenance":"0"},{"id":"52","libelle":"ANACTU06","os":"Windows XP","maintenance":"0"},{"id":"62","libelle":"ANACTU07","os":"Windows XP","maintenance":"0"},{"id":"63","libelle":"ANACTU13","os":"Windows XP","maintenance":"0"},{"id":"64","libelle":"ANACTU09","os":"Windows XP","maintenance":"0"}]},{"libelle":"default","id":"1","site":{"id":"1","libelle":"antibes"},"postes":[{"id":"77","libelle":"ANFICT30","os":"Windows XP","maintenance":"0"}]},{"libelle":"Documentation","id":"3","site":{"id":"1","libelle":"antibes"},"postes":[{"id":"13","libelle":"ANDOCU07","os":"Windows XP","maintenance":"0"},{"id":"14","libelle":"ANDOCU05","os":"Windows XP","maintenance":"0"},{"id":"15","libelle":"ANDOCU06","os":"Windows XP","maintenance":"0"},{"id":"17","libelle":"ANDOCU10","os":"Windows XP","maintenance":"0"},{"id":"18","libelle":"ANDOCU09","os":"Windows XP","maintenance":"0"},{"id":"20","libelle":"ANDOCU12","os":"Windows XP","maintenance":"0"},{"id":"21","libelle":"ANDOCU11","os":"Windows XP","maintenance":"0"},{"id":"22","libelle":"ANDOCU04","os":"Windows XP","maintenance":"0"},{"id":"57","libelle":"ANDOCU14","os":"Windows XP","maintenance":"0"},{"id":"59","libelle":"ANDOCU15","os":"Windows XP","maintenance":"0"},{"id":"61","libelle":"ANDOCU16","os":"Windows XP","maintenance":"0"}]},{"libelle":"Fiction","id":"2","site":{"id":"1","libelle":"antibes"},"postes":[{"id":"9","libelle":"ANFICT03","os":"Windows XP","maintenance":"0"},{"id":"10","libelle":"ANFICT04","os":"Windows XP","maintenance":"0"},{"id":"11","libelle":"ANFICT02","os":"Windows XP","maintenance":"0"},{"id":"12","libelle":"ANFICT01","os":"Windows XP","maintenance":"0"},{"id":"66","libelle":"ANFICT05","os":"Windows 7","maintenance":"0"}]},{"libelle":"Handicap\u00e9","id":"8","site":{"id":"1","libelle":"antibes"},"postes":[{"id":"42","libelle":"ANFICT10","os":"Windows XP","maintenance":"0"},{"id":"43","libelle":"ANFICT11","os":"Windows XP","maintenance":"0"}]},{"libelle":"Jeunesse","id":"6","site":{"id":"1","libelle":"antibes"},"postes":[{"id":"26","libelle":"ANJEUN02","os":"Windows XP","maintenance":"0"},{"id":"27","libelle":"ANJEUN03","os":"Windows XP","maintenance":"0"},{"id":"28","libelle":"ANJEUN04","os":"Windows XP","maintenance":"0"},{"id":"29","libelle":"ANJEUN05","os":"Windows XP","maintenance":"0"},{"id":"30","libelle":"ANJEUN08","os":"Windows XP","maintenance":"0"},{"id":"31","libelle":"ANJEUN06","os":"Windows XP","maintenance":"0"},{"id":"32","libelle":"ANJEUN09","os":"Windows XP","maintenance":"0"},{"id":"33","libelle":"ANJEUN07","os":"Windows XP","maintenance":"0"},{"id":"56","libelle":"ANJEUN10","os":"Windows XP","maintenance":"0"}]},{"libelle":"Musique","id":"4","site":{"id":"1","libelle":"antibes"},"postes":[{"id":"38","libelle":"ANMUSI04","os":"Windows XP","maintenance":"0"},{"id":"39","libelle":"ANMUSI03","os":"Windows XP","maintenance":"0"},{"id":"40","libelle":"ANMUSI06","os":"Windows XP","maintenance":"0"},{"id":"41","libelle":"ANMUSI05","os":"Windows XP","maintenance":"0"}]},{"libelle":"Opac","id":"7","site":{"id":"1","libelle":"antibes"},"postes":[{"id":"4","libelle":"ANFICT06","os":"Windows XP","maintenance":"0"},{"id":"7","libelle":"ANFICT07","os":"Windows XP","maintenance":"0"},{"id":"8","libelle":"ANFICT08","os":"Windows XP","maintenance":"0"},{"id":"19","libelle":"ANDOCU08","os":"Windows XP","maintenance":"0"},{"id":"23","libelle":"ANDOCU13","os":"Windows XP","maintenance":"0"},{"id":"24","libelle":"ANDOCU02","os":"Windows XP","maintenance":"0"},{"id":"25","libelle":"ANDOCU01","os":"Windows XP","maintenance":"0"},{"id":"34","libelle":"ANJEUN11","os":"Windows XP","maintenance":"0"},{"id":"35","libelle":"ANJEUN01","os":"Windows XP","maintenance":"0"},{"id":"36","libelle":"ANMUSI02","os":"Windows XP","maintenance":"0"},{"id":"37","libelle":"ANMUSI01","os":"Windows XP","maintenance":"0"},{"id":"45","libelle":"ANACTU03","os":"Windows XP","maintenance":"0"},{"id":"47","libelle":"ANACTU02","os":"Windows XP","maintenance":"0"},{"id":"65","libelle":"ANACTU01","os":"Windows XP","maintenance":"0"}]}]'));
+		$this->assertTrue($this->_multimedia->isValidHash('b2d76718d5ba373c8c65b1dd9c724e7b',
+																											$this->_datas));
 	}
 
 
 	/** @test */
 	public function invalidHashShouldNotBeValid() {
-		Class_Multimedia::setInstance(new Class_MultimediaTesting);
-		$this->assertFalse(Class_Multimedia::isValidHash(
-				'3dd16uiessseruiest8973iue98759',
-				'[{"libelle":"Actualit\u00e9","id":"5","site":{"id":"1","libelle":"antibes"},"postes":[{"id":"44","libelle":"ANACTU05","os":"Windows XP","maintenance":"0"},{"id":"46","libelle":"ANACTU04","os":"Windows XP","maintenance":"0"},{"id":"48","libelle":"ANACTU12","os":"Windows XP","maintenance":"0"},{"id":"49","libelle":"ANACTU11","os":"Windows XP","maintenance":"0"},{"id":"50","libelle":"ANACTU10","os":"Windows XP","maintenance":"0"},{"id":"51","libelle":"ANACTU08","os":"Windows XP","maintenance":"0"},{"id":"52","libelle":"ANACTU06","os":"Windows XP","maintenance":"0"},{"id":"62","libelle":"ANACTU07","os":"Windows XP","maintenance":"0"},{"id":"63","libelle":"ANACTU13","os":"Windows XP","maintenance":"0"},{"id":"64","libelle":"ANACTU09","os":"Windows XP","maintenance":"0"}]},{"libelle":"default","id":"1","site":{"id":"1","libelle":"antibes"},"postes":[{"id":"77","libelle":"ANFICT30","os":"Windows XP","maintenance":"0"}]},{"libelle":"Documentation","id":"3","site":{"id":"1","libelle":"antibes"},"postes":[{"id":"13","libelle":"ANDOCU07","os":"Windows XP","maintenance":"0"},{"id":"14","libelle":"ANDOCU05","os":"Windows XP","maintenance":"0"},{"id":"15","libelle":"ANDOCU06","os":"Windows XP","maintenance":"0"},{"id":"17","libelle":"ANDOCU10","os":"Windows XP","maintenance":"0"},{"id":"18","libelle":"ANDOCU09","os":"Windows XP","maintenance":"0"},{"id":"20","libelle":"ANDOCU12","os":"Windows XP","maintenance":"0"},{"id":"21","libelle":"ANDOCU11","os":"Windows XP","maintenance":"0"},{"id":"22","libelle":"ANDOCU04","os":"Windows XP","maintenance":"0"},{"id":"57","libelle":"ANDOCU14","os":"Windows XP","maintenance":"0"},{"id":"59","libelle":"ANDOCU15","os":"Windows XP","maintenance":"0"},{"id":"61","libelle":"ANDOCU16","os":"Windows XP","maintenance":"0"}]},{"libelle":"Fiction","id":"2","site":{"id":"1","libelle":"antibes"},"postes":[{"id":"9","libelle":"ANFICT03","os":"Windows XP","maintenance":"0"},{"id":"10","libelle":"ANFICT04","os":"Windows XP","maintenance":"0"},{"id":"11","libelle":"ANFICT02","os":"Windows XP","maintenance":"0"},{"id":"12","libelle":"ANFICT01","os":"Windows XP","maintenance":"0"},{"id":"66","libelle":"ANFICT05","os":"Windows 7","maintenance":"0"}]},{"libelle":"Handicap\u00e9","id":"8","site":{"id":"1","libelle":"antibes"},"postes":[{"id":"42","libelle":"ANFICT10","os":"Windows XP","maintenance":"0"},{"id":"43","libelle":"ANFICT11","os":"Windows XP","maintenance":"0"}]},{"libelle":"Jeunesse","id":"6","site":{"id":"1","libelle":"antibes"},"postes":[{"id":"26","libelle":"ANJEUN02","os":"Windows XP","maintenance":"0"},{"id":"27","libelle":"ANJEUN03","os":"Windows XP","maintenance":"0"},{"id":"28","libelle":"ANJEUN04","os":"Windows XP","maintenance":"0"},{"id":"29","libelle":"ANJEUN05","os":"Windows XP","maintenance":"0"},{"id":"30","libelle":"ANJEUN08","os":"Windows XP","maintenance":"0"},{"id":"31","libelle":"ANJEUN06","os":"Windows XP","maintenance":"0"},{"id":"32","libelle":"ANJEUN09","os":"Windows XP","maintenance":"0"},{"id":"33","libelle":"ANJEUN07","os":"Windows XP","maintenance":"0"},{"id":"56","libelle":"ANJEUN10","os":"Windows XP","maintenance":"0"}]},{"libelle":"Musique","id":"4","site":{"id":"1","libelle":"antibes"},"postes":[{"id":"38","libelle":"ANMUSI04","os":"Windows XP","maintenance":"0"},{"id":"39","libelle":"ANMUSI03","os":"Windows XP","maintenance":"0"},{"id":"40","libelle":"ANMUSI06","os":"Windows XP","maintenance":"0"},{"id":"41","libelle":"ANMUSI05","os":"Windows XP","maintenance":"0"}]},{"libelle":"Opac","id":"7","site":{"id":"1","libelle":"antibes"},"postes":[{"id":"4","libelle":"ANFICT06","os":"Windows XP","maintenance":"0"},{"id":"7","libelle":"ANFICT07","os":"Windows XP","maintenance":"0"},{"id":"8","libelle":"ANFICT08","os":"Windows XP","maintenance":"0"},{"id":"19","libelle":"ANDOCU08","os":"Windows XP","maintenance":"0"},{"id":"23","libelle":"ANDOCU13","os":"Windows XP","maintenance":"0"},{"id":"24","libelle":"ANDOCU02","os":"Windows XP","maintenance":"0"},{"id":"25","libelle":"ANDOCU01","os":"Windows XP","maintenance":"0"},{"id":"34","libelle":"ANJEUN11","os":"Windows XP","maintenance":"0"},{"id":"35","libelle":"ANJEUN01","os":"Windows XP","maintenance":"0"},{"id":"36","libelle":"ANMUSI02","os":"Windows XP","maintenance":"0"},{"id":"37","libelle":"ANMUSI01","os":"Windows XP","maintenance":"0"},{"id":"45","libelle":"ANACTU03","os":"Windows XP","maintenance":"0"},{"id":"47","libelle":"ANACTU02","os":"Windows XP","maintenance":"0"},{"id":"65","libelle":"ANACTU01","os":"Windows XP","maintenance":"0"}]}]'));
+		$this->assertFalse($this->_multimedia->isValidHash('3dd16uiessseruiest8973iue98759', 
+																											 $this->_datas));
 	}
 }
-
-
-class Class_MultimediaTesting extends Class_Multimedia {
-	public function getKey() {return 'a7de41db2505672d8052117869c08517';}
-	public function getDate() {return '2012-07-17';}
-}
\ No newline at end of file
+?>
\ No newline at end of file