From 3663d0a0781adb71c6c9fd24fb9ed6c266b43037 Mon Sep 17 00:00:00 2001
From: llaffont <llaffont@git-test.afi-sa.fr>
Date: Tue, 21 Aug 2012 15:16:25 +0000
Subject: [PATCH] CommSigb: refacto ficheAbonne

---
 library/Class/CommSigb.php           | 92 +++++++++++-----------------
 tests/library/Class/CommSigbTest.php | 27 +++++---
 2 files changed, 54 insertions(+), 65 deletions(-)

diff --git a/library/Class/CommSigb.php b/library/Class/CommSigb.php
index 45e4e2f6aaa..34b12516455 100644
--- a/library/Class/CommSigb.php
+++ b/library/Class/CommSigb.php
@@ -123,73 +123,53 @@ class Class_CommSigb {
 
 
 	/**
-	 * @param int $id_bib
-	 * @param int $id_origine
-	 * @param string $code_annexe
+	 * @param Class_Users $user
 	 * @return array
 	 */
-	public function reserverExemplaire($id_bib, $exemplaire_id, $code_annexe) {
-		$mode_comm = $this->getModeComm($id_bib);
-		if (!$user = Class_Users::getLoader()->getIdentity())
-			return array('erreur' => $this->_translate->_('Vous devez vous connecter pour réserver un document.'));
-		Class_WebService_SIGB_EmprunteurCache::newInstance()->remove($user);
+	public function ficheAbonne($std_user) {
+		$user = Class_Users::getLoader()->find($std_user->ID_USER);
+		$cache = Class_WebService_SIGB_EmprunteurCache::newInstance();
+		if ($cache->isCached($user))
+			return ['fiche' => $cache->load($user)];
 
-		$exemplaire = Class_Exemplaire::getLoader()->find($exemplaire_id);
-		$ret = array('statut' => 2,
-								 'erreur' => '');
-
-		switch ($mode_comm['type']) {
-			// Pergame
-			case self::COM_PERGAME:
-				$pergame = new Class_Systeme_PergameService($user);
-				$ret = $pergame->ReserverExemplaire($id_bib, $exemplaire->getIdOrigine(), $code_annexe);
-				break;
-
-			// Autres
-		  case self::COM_OPSYS:
-		  case self::COM_VSMART:
-  		case self::COM_KOHA:
-		  case self::COM_CARTHAME:
-			case self::COM_NANOOK:
-			case self::COM_ORPHEE:
-			case self::COM_MICROBIB:
-		  case self::COM_BIBLIXNET:
-				if (false == $sigb = $this->getSIGBComm($mode_comm))
-					return array("erreur" => $this->msg_erreur_comm);
-				
-				if (!$user->IDABON)
-					return array("erreur" => $this->_translate->_('Vous devez vous connecter sous votre numéro de carte pour effectuer une réservation.'));
-					
-				$ret = $sigb->reserverExemplaire($user, $exemplaire, $code_annexe);
-				break;
-		}
+		$ficheAbonneClosure = function ($user, $sigb) use ($cache) {
+			try {
+				return ['fiche' =>  $cache->loadFromCacheOrSIGB($user, $sigb)];
+			} catch (Exception $e) {
+				return ['erreur' =>  $e->getMessage()];
+			}
+		};
 
-		return $ret;
+
+    return $this->withUserAndSIGBDo($std_user, $ficheAbonneClosure);
 	}
 
 
 	/**
-	 * @param Class_Users $user
+	 * @param int $id_bib
+	 * @param int $id_origine
+	 * @param string $code_annexe
 	 * @return array
 	 */
-	public function ficheAbonne($user) {
-		$mode_comm = $this->getModeComm($user->ID_SITE);
-		if (!$mode_comm['type'])
-			return array();
+	public function reserverExemplaire($id_bib, $exemplaire_id, $code_annexe) {
+		if (!$user = Class_Users::getIdentity())
+			return ['statut' => 2,
+							'erreur' => $this->_translate->_('Vous devez vous connecter pour réserver un document.')];
+		
+		if (!$user->getIdabon())
+			return ['statut' => 2,
+							"erreur" => $this->_translate->_('Vous devez vous connecter sous votre numéro de carte pour effectuer une réservation.')];
 
-		$user = Class_Users::getLoader()->find($user->ID_USER);
-		$cache = Class_WebService_SIGB_EmprunteurCache::newInstance();
-		if ($cache->isCached($user))
-			return array('fiche' => $cache->load($user));
+		$exemplaire = Class_Exemplaire::find($exemplaire_id);
 
-		if (false == $sigb = $this->getSIGBComm($mode_comm))
-			return array('erreur' => $this->msg_erreur_comm);
+		$reserver = function ($user, $sigb) use ($exemplaire, $code_annexe) {
+			if ($sigb->isPergame())
+				return (new Class_Systeme_PergameService($user))->reserverExemplaire($id_bib, $exemplaire->getIdOrigine(), $code_annexe);
+			
+			return $sigb->reserverExemplaire($user, $exemplaire, $code_annexe);
+		};
 
-		try {
-			return array('fiche' =>  $cache->loadFromCacheOrSIGB($user, $sigb));
-		} catch (Exception $e) {
-			return array('erreur' =>  $e->getMessage());
-		}
+		return $this->withUserAndSIGBDo($user, $reserver);
 	}
 
 
@@ -228,11 +208,11 @@ class Class_CommSigb {
 
 
 	public function withUserAndSIGBDo($std_user, $closure) {
-		$user = Class_Users::getLoader()->find($std_user->ID_USER);
+		$user = is_a($std_user, 'Class_Users') ? $std_user : Class_Users::find($std_user->ID_USER);
 		Class_WebService_SIGB_EmprunteurCache::newInstance()->remove($user);
 
 		if (null == $sigb = $user->getSIGBComm())
-			return [];
+			return ['erreur' => $this->_translate->_('Communication SIGB indisponible')];
 		
 		if (!$sigb->isConnected())
 			return array('erreur' => $this->msg_erreur_comm);
diff --git a/tests/library/Class/CommSigbTest.php b/tests/library/Class/CommSigbTest.php
index 67a955e3b1f..ba63ccb4870 100644
--- a/tests/library/Class/CommSigbTest.php
+++ b/tests/library/Class/CommSigbTest.php
@@ -539,15 +539,20 @@ class CommSigbBiblixNetTest extends CommSigbTestCase {
 
 
 
-class CommSigbWithNotAbonneTest extends PHPUnit_Framework_TestCase {
+class CommSigbWithNotAbonneTest extends Storm_Test_ModelTestCase {
 	public function setUp() {
+		parent::setUp();
+
 		$this->user = new stdClass();
 		$this->user->ID_SITE = 0;
 		$this->user->ID_USER = 66;
+		$this->user->IDABON = 6;
+		Zend_Auth::getInstance()->getStorage()->write($this->user);
 		$this->comm_sigb = new Class_CommSigb();
 		Class_Users::getLoader()
 			->newInstanceWithId(66)
-			->setIdSite(0);
+			->setIdSite(0)
+			->setIdabon(3);
 	}
 
 
@@ -560,25 +565,29 @@ class CommSigbWithNotAbonneTest extends PHPUnit_Framework_TestCase {
 	}
 
 	/** @test */
-	public function prolongerPretShouldReturnEmptyArray() {
-		$this->assertEquals(array(), $this->comm_sigb->prolongerPret($this->user, 0));
+	public function prolongerPretShouldReturnError() {
+		$this->assertEquals(['erreur' => 'Communication SIGB indisponible'], 
+												$this->comm_sigb->prolongerPret($this->user, 0));
 	}
 
 
 	/** @test */
-	public function supprimerReservationShouldReturnEmptyArray() {
-		$this->assertEquals(array(), $this->comm_sigb->supprimerReservation($this->user, 0));
+	public function supprimerReservationShouldReturnError() {
+		$this->assertEquals(['erreur' => 'Communication SIGB indisponible'], 
+												$this->comm_sigb->supprimerReservation($this->user, 0));
 	}
 
 	/** @test */
-	public function ficheAbonneShouldReturnEmptyArray() {
-		$this->assertEquals(array(), $this->comm_sigb->ficheAbonne($this->user));
+	public function ficheAbonneShouldReturnError() {
+		$this->assertEquals(['erreur' => 'Communication SIGB indisponible'], 
+												$this->comm_sigb->ficheAbonne($this->user));
 	}
 
 
 	/** @test */
 	public function reserverExemplaireShouldReturnError() {
-		$this->assertEquals(array('statut' => 2, 'erreur' => ''), $this->comm_sigb->reserverExemplaire(0, 0, 0));
+		$this->assertEquals(['erreur' => 'Communication SIGB indisponible'], 
+												$this->comm_sigb->reserverExemplaire(0, 0, 0));
 	}
 
 
-- 
GitLab