Newer
Older
<?php
/**
* Copyright (c) 2012, Agence Française Informatique (AFI). All rights reserved.
*
* 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).
*
* 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
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
require_once 'AbstractControllerTestCase.php';

Patrick Barroca
committed
require_once 'tests/fixtures/DilicomFixtures.php';
abstract class AbstractAbonneControllerPretsTestCase extends AbstractControllerTestCase {

Patrick Barroca
committed
$_http, $_time_source,
$_storm_default_to_volatile = true;
protected function _loginHook($account) {
$account->ROLE = "abonne_sigb";
$account->ROLE_LEVEL = 2;
$account->ID_USER = '123456';
$account->PSEUDO = "Florence";
$this->account = $account;
}
public function setUp() {
parent::setUp();
Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Users')->whenCalled('save')->answers(true);
$this->florence = Class_Users::getLoader()->newInstanceWithId('123456');
$this->zend_cache = Storm_Test_ObjectWrapper::mock();
Storm_Cache::setDefaultZendCache($this->zend_cache);
$this->zend_cache
->whenCalled('save')
->answers(true)
->whenCalled('remove')
->answers(true);

Patrick Barroca
committed
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
$this->fixture('Class_AdminVar',
['id' => 'DILICOM_PNB_GLN_COLLECTIVITE',
'valeur' => 'test-gln']);
$this->fixture('Class_AdminVar',
['id' => 'DILICOM_PNB_PWD_COLLECTIVITE',
'valeur' => 'test-gln-pass']);
$this->fixture('Class_AdminVar',
['id' => 'DILICOM_PNB_GLN_CONTRACTOR',
'valeur' => '777']);
$this->_http = $this->mock()
->whenCalled('setAuth')
->with('test-gln', 'test-gln-pass')
->answers(null)
->whenCalled('open_url')
->with('/v2/pnb-numerique/json/getEndedLoans?glnContractor=777&loanId[0]=5')
->answers(DilicomFixtures::getEndedLoansResponse())
;
Class_WebService_BibNumerique_Dilicom_Hub::setDefaultHttpClient($this->_http);
$this->_time_source = $this->mock()
->whenCalled('dateFormat')
->with('Y-m-d\TH:i:sO')
->answers('2015-09-30T16:51:09+02:00')
->beStrict();
Class_WebService_BibNumerique_Dilicom_Hub::setTimeSource($this->_time_source);
Class_Loan_Pnb::setTimeSource($this->_time_source);
}
public function tearDown() {
Class_WebService_BibNumerique_Dilicom_Hub::setDefaultHttpClient(null);
Class_WebService_BibNumerique_Dilicom_Hub::setTimeSource(null);
Class_Loan_Pnb::setTimeSource(null);
parent::tearDown();
}
public function assertUserRemovedFromEmprunteurCache($user) {
$user_key = md5(serialize(['local',
Class_WebService_SIGB_EmprunteurCache::newInstance()->keyFor($user)]));
$this->assertTrue($this->zend_cache
->methodHasBeenCalledWithParams('remove', array($user_key)));
}
abstract class AbonneControllerPretsListThreePretsTestCase extends AbstractAbonneControllerPretsTestCase {
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
public function setUp() {
parent::setUp();
$potter = new Class_WebService_SIGB_Emprunt('12', new Class_WebService_SIGB_Exemplaire(123));
$potter->getExemplaire()->setTitre('Potter');
$potter->parseExtraAttributes(['Dateretourprevue' => '29/10/2022',
'Section' => 'Espace jeunesse',
'Auteur' => 'JK Rowling',
'Bibliotheque' => 'Astrolabe',
'N° de notice' => '1234',
'Type' => 'P1']);
$this->fixture('Class_Exemplaire',
['id' => 967,
'id_origine' => 1234,
'zone995' => serialize([['clef' => 'a', 'valeur' => 'PotterItem']]),
'notice' => $this->fixture('Class_Notice',
['id' => 889,
'titre_principal' => 'Potter',
'unimarc' => '00577nam0 2200181 450 001001500000010001800015100004100033101000800074200010700082210003000189215001100219461002000230606002900250676000800279700004500287801005600332940000700388frOr1314913787 a9781408812792 a20140320 0103 aEng1 aHarry Potter and the deathly hallowsdHarry Potter et les reliques de la mortfJoanne Kathleen Rowling aLondrescBloomsburyd2010 a831 p. 1tHarry Potterv7 aAnglais (langue)2Rameau a420 1aRowlingbJoanne Kathleenf1965-....4070 aFRbBibliothèque de l\'agglomération de Saint-Omer apm'])]);
$alice = new Class_WebService_SIGB_Emprunt('13', new Class_WebService_SIGB_Exemplaire(456));
$alice->getExemplaire()->setTitre('Alice');
$alice->parseExtraAttributes(['Dateretourprevue' => '21/10/2010',
'Section' => 'Espace jeunesse',
'Auteur' => 'Lewis Caroll',
'Bibliotheque' => 'Almont',
'N° de notice' => '5678']);
$this->fixture('Class_Exemplaire',
['id' => 918,
'id_origine' => 5678,
'zone995' => serialize([['clef' => 'a', 'valeur' => 'AliceItem']]),
'notice' => $this->fixture('Class_Notice',
['id' => 827,
'titre_principal' => 'Alice',
'unimarc' => '01175cam0 22002771 450 001001500000010003700015100004100052101000800093102000700101105001800108106000600126200009300132210002400225211001300249215006400262300002400326307002900350330027300379345001800652461005600670700001800726701003000744801003300774856008300807940000700890frOr0354235228 a978-2-35592-635-8bbr.d7,65 EUR a20140225d2014 | |0fre|0103||||ba afre aFR a 0||y| ar1 aAlice au royaume de TrèfleeCheshire cat Waltzh5fQuinRosegdessin Mamenosuke Fujimaru aPariscKi-oond2014 1a20140227 a1 vol. (164 p.)cillustrations en noir et blancd18 x 13 cm aTraduit du japonais aSens de lecture japonais aPerdue dans la forêt aux portes, Alice tombe nez à nez avec Ace. Devenue malgré elle la confidente du chevalier, elle ne sait comment repousser ses avances. Lorsque le chat du Cheshire, qui a assisté à la scène, intervient, la rencontre tourne à l\'affrontement. b9782355926358 1tAlice au royaume de Trèfle : Cheshire cat Waltzv5 1aQuinRose4070 1aFujimarubMamenosuke4440 aFRbElectrec20140225gAFNOR uhttp://www.electre.com//GetBlob.ashx?Ean=9782355926358,0-1913692&Size=Original aLR'])]);
$emprunteur = new Class_WebService_SIGB_Emprunteur('1234', 'Florence');
$emprunteur->empruntsAddAll([$potter, $alice]);
$this->fixture('Class_Loan_Pnb',
['id' => 5,
'user_id' => $this->florence->getId(),
'ongoing' => true,

Patrick Barroca
committed
'expected_return_date' => '2022-05-02T18:14:14+02:00',
'album' => $this->fixture('Class_Album',
['id' => 4,
'notice_id' => 5,
'id_origine' => 'Dilicom-88817216',
'titre' => 'Pinocchio'])->addAuthor('Collodi')
]);
$this->florence
->setFicheSigb(['type_comm' => 2, //OPSYS
'fiche' => $emprunteur,
'message' => '',
'erreur' => '',
'nom_aff' => 'FloFlo'])
->setPseudo('FloFlo');
}
}
class AbonneControllerPretsExportThreePretsTest extends AbonneControllerPretsListThreePretsTestCase {
protected
$_storm_default_to_volatile = true,
$_dl_file,
$unimarc = '01201nam0 22002891 450 001001500000010003700015100004100052101000800093102000700101105001800108106000600126200009300132210002400225211001300249215006400262300002400326307002900350330027300379345001800652461005600670700001800726701003000744801003300774856008300807940000700890995001400897frOr0354235228 a978-2-35592-635-8bbr.d7,65 EUR a20140225d2014 | |0fre|0103||||ba afre aFR a 0||y| ar1 aAlice au royaume de TrefleeCheshire cat Waltzh5fQuinRosegdessin Mamenosuke Fujimaru aPariscKi-oond2014 1a20140227 a1 vol. (164 p.)cillustrations en noir et blancd18 x 13 cm aTraduit du japonais aSens de lecture japonais aPerdue dans la foret aux portes, Alice tombe nez a nez avec Ace. Devenue malgre elle la confidente du chevalier, elle ne sait comment repousser ses avances. Lorsque le chat du Cheshire, qui a assiste a la scene, intervient, la rencontre tourne a l\'affrontement. b9782355926358 1tAlice au royaume de Trefle : Cheshire cat Waltzv5 1aQuinRose4070 1aFujimarubMamenosuke4440 aFRbElectrec20140225gAFNOR uhttp://www.electre.com//GetBlob.ashx?Ean=9782355926358,0-1913692&Size=Original aLR 1aAliceItem00604nam0 22001931 450 001001500000010001800015100004100033101000800074200010700082210003000189215001100219461002000230606002900250676000800279700004500287801005600332940000700388995001500395frOr1314913787 a9781408812792 a20140320 0103 aEng1 aHarry Potter and the deathly hallowsdHarry Potter et les reliques de la mortfJoanne Kathleen Rowling aLondrescBloomsburyd2010 a831 p. 1tHarry Potterv7 aAnglais (langue)2Rameau a420 1aRowlingbJoanne Kathleenf1965-....4070 aFRbBibliotheque de l\'agglomeration de Saint-Omer apm 1aPotterItem';
public function setUp() {
parent::setUp();
$this->dispatch('/opac/abonne/loan-export', true);
$this->_dl_file = tempnam('/tmp', 'UNIMARC');
file_put_contents($this->_dl_file, $this->_response->getBody());
}
/** @test */
public function controllerAndActionShouldBeAbonnePrets() {
$this->assertController('abonne');
$this->assertAction('loan-export');
}
/** @test */
public function responseBodyShouldBeAttachment() {
$this->assertHeaderContains('Content-Disposition', 'attachment');
}
/** @test */
public function responseFileNameShouldContainsPrets() {
$this->assertHeaderContains('Content-Disposition', 'filename="prets_');
$this->assertHeaderContains('Content-Type', 'name="prets_');
}
/** @test */
public function bodyShouldContainsUnimarcs() {
$this->assertSame($this->unimarc, $this->_response->getBody());
}
/** @test */
public function dlFileShouldContainsUnimarc() {
$this->assertEquals($this->unimarc, file_get_contents($this->_dl_file));
}
}
class AbonneControllerPretsListThreePretsTest extends AbonneControllerPretsListThreePretsTestCase {
public function setUp() {
parent::setUp();
$this->dispatch('/opac/abonne/prets', true);
}

Ghislain Loas
committed
/** @test */
public function returnToMyHomeShouldBePresent() {
$this->assertXPathContentContains('//a[contains(@href, "/abonne/fiche")]',
utf8_encode('Retour mon compte'));
}
/** @test */
public function controllerAndActionShouldBeAbonnePrets() {
$this->assertController('abonne');
$this->assertAction('prets');
}
/** @test */
public function cacheShouldHaveBeenCleared() {
$this->assertUserRemovedFromEmprunteurCache($this->florence);
}
/** @test */
public function userNameShouldBePresent() {
$this->assertQueryContentContains('div.abonneTitre', 'FloFlo');
}
/** @test */
public function loanExportLinkShouldBePresent() {
$this->assertXPathContentContains('//a[contains(@href, "/abonne/loan-export")]',
'Export unimarc',
$this->_response->getBody());
}
/** @test */
public function tableShouldHaveClassTableSorter() {
$this->assertXPath('//table[@class="tablesorter"]');
}
/** @test */
public function tableSorterShouldBeLoaded() {
$this->assertXPath('//script[contains(@src, "tablesorter.min")]');
$this->assertXPath('//link[contains(@href, "tablesorter/css/theme.default.css")]');
$this->assertXPathContentContains('//script', '$(".tablesorter").tablesorter()');
}
/** @test */
public function aliceLoanShouldBePresent() {
$this->assertXPathContentContains("//tbody/tr[1][@class=\"pret_en_retard\"]//td//a[contains(@href, '/recherche/viewnotice/id/827/retour_abonne/prets')]",
'Alice');
}
/** @test */
public function aliceLibraryShouldBeAlmont() {
$this->assertXPathContentContains("//tbody/tr[1]//td", 'Almont');
}
/** @test */
public function aliceAuthorShouldBeLewisCaroll() {
$this->assertXPathContentContains("//tbody/tr[1]//td", 'Lewis Caroll');
}
/** @test */
public function aliceDueDateShouldBeTwentyOneOctober() {
$this->assertXPathContentContains("//tbody/tr[1]//td", '21/10/2010');
}
/** @test */
public function aliceLoanShouldHaveExtendLink() {
$this->assertXPathContentContains("//tbody/tr[1]//td//a[@href='/abonne/prolongerPret/id_pret/13'][@data-popup='true']",
'Prolonger');
}
/** @test */
public function potterLoanShouldBePresent() {
$this->assertXPathContentContains("//tbody/tr[2]//td", 'Potter', $this->_response->getBody());
}
/** @test */
public function potterLibraryShouldBeAstrolab() {
$this->assertXPathContentContains("//tbody/tr[2]//td", 'Astrolabe');
}
/** @test */
public function potterAuthorShouldBeJKRolling() {
$this->assertXPathContentContains("//tbody/tr[2]//td", 'JK Rowling');
}
/** @test */
public function potterDueDateShouldBeTwentyNineOctober2022() {
$this->assertXPathContentContains("//tbody/tr[2][not(@class)]//td", '29/10/2022');
}
/** @test */
public function potterLoanShouldHaveExtendLink() {
$this->assertXPathContentContains("//tbody/tr[2]//td//a[@href='/abonne/prolongerPret/id_pret/12'][@data-popup='true']",
'Prolonger');
}
/** @test **/
public function colonneInformationShouldBeDisplay(){
$this->assertXPathContentContains('//thead//th','Informations');
}
/** @test **/
public function colonneInformationShouldContainsP1(){
$this->assertXPathContentContains('//tbody//td','P1', $this->_response->getBody());
}
/** @test */
public function pnbH2TitleShouldBePresent() {

Patrick Barroca
committed
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
$this->assertXpathContentContains('//h2',
utf8_encode('Prts numriques en cours'),
$this->_response->getBody());
}
/** @test */
public function pinocchioPnbLoanShouldBePresent() {
$this->assertXPathContentContains('//tbody//a[contains(@href, "viewnotice/id/5")]',
'Pinocchio');
}
/** @test */
public function pinocchioPnbLoanReturnDateShouldBeAsExpected() {
$this->assertXPathContentContains('//tbody//td[@class="date_retour"]',
'2022-05-02T18:14:14+02:00');
}
}
class AbonneControllerPretsListThreePretsPnbEarlyReturnTest extends AbonneControllerPretsListThreePretsTestCase {
public function setUp() {
parent::setUp();
$this->_http
->whenCalled('open_url')
->with('/v2/pnb-numerique/json/getEndedLoans?glnContractor=777&loanId[0]=5')
->answers(DilicomFixtures::getEndedLoansResponse(['{"loanId":"5","returnDate":"2015-09-18T14:30:00+02:00"}']))
->beStrict();
$this->dispatch('/opac/abonne/prets', true);
}
/** @test */
public function pnbTitleShouldNotBePresent() {
$this->assertNotXpathContentContains('//h2',
utf8_encode('Prts numriques en cours'));
}
/** @test */
public function pnbLoanReturnDateShouldBeUpdated() {
$this->assertEquals('2015-09-18T14:30:00+02:00',
Class_Loan_Pnb::find(5)->getExpectedReturnDate());
class AbonneControllerPretsListReservationTest extends AbstractAbonneControllerPretsTestCase {
$potter =
(new Class_WebService_SIGB_Reservation('12',
(new Class_WebService_SIGB_Exemplaire(123))->setTitre('Potter')))
->parseExtraAttributes(['Etat' => 'Réservation émise',
'Rang' => '2',
'Bibliotheque' => 'Tombouctou',
'N° de notice' => 564]);
// This item has no library: non-regression test.
$dobby =
(new Class_WebService_SIGB_Reservation('13',
(new Class_WebService_SIGB_Exemplaire(124))->setTitre('Dobby')))
->parseExtraAttributes(['Etat' => 'Réservation émise',
'Rang' => '2',
'N° de notice' => 565]);
$this->fixture('Class_Notice',
['id' => 820,
'titre_principal' => 'Potter']);
$this->fixture('Class_Notice',
['id' => 824,
'titre_principal' => 'Dobby']);
$this->fixture('Class_Exemplaire',
['id' => 120,
'id_origine' => 564,
'id_notice' => 820]);
$this->fixture('Class_Exemplaire',
['id' => 130,
'id_origine' => 565,
'id_notice' => '824',
'zone995' => '']);
$this->florence
->setPseudo('FloFlo')
->setFicheSigb(['type_comm' => Class_IntBib::COM_OPSYS,
'fiche' => (new Class_WebService_SIGB_Emprunteur('1234', 'Florence'))
->reservationsAddAll([$potter, $dobby]),
'message' => '',
'erreur' => '']);
/** @test */
public function controllerShouldBeAbonne() {
$this->assertController('abonne');
}
/** @test */
public function cacheShouldHaveBeenCleared() {
$this->assertUserRemovedFromEmprunteurCache($this->florence);
}
/** @test */
public function actionShouldBeReservations() {
$this->assertAction('reservations');
}
/** @test */
public function nomShouldBeFloFlo() {
$this->assertQueryContentContains('div.abonneTitre', 'FloFlo');
}
/** @test */
public function tableShouldHaveClassTableSorter() {
$this->assertXPath('//table[@class="tablesorter"]');
}
/** @test */
public function tableSorterShouldBeLoaded() {
$this->assertXPath('//script[contains(@src, "tablesorter.min")]');
}
/** @test */
public function titreShouldBePotterAndLinkToNotice() {
$this->assertXPathContentContains('//tbody/tr[1]//td//a[contains(@href, "recherche/viewnotice/id/820/retour_abonne/reservations")]',
'Potter',
$this->_response->getBody());
}
/** @test */
public function etatShouldBeReservationEmise() {
$this->assertXPathContentContains('//tbody/tr[1]//td', 'Réservation émise');
}
/** @test */
public function rangShouldBeTwo() {
$this->assertXPathContentContains('//tbody/tr[1]//td', '2');
}
/** @test */
public function linkToDeleteShouldBeAsExpected() {
$this->assertXPath("//tbody/tr[1]//td//a[@href='/abonne/reservations/id_delete/12']");
}
/** @test */
public function bibliothequeShouldBeTombouctou() {
$this->assertXPathContentContains('//tbody/tr[1]//td', 'Tombouctou', $this->_response->getBody());
}
/** @test */
public function secondReservationTitleShouldBeDobby() {
$this->assertXPathContentContains('//tbody/tr[2]//td//a', 'Dobby',
$this->_response->getBody());
}
abstract class AbonneControllerPretsRenewThreePretsTestCase extends AbonneControllerPretsListThreePretsTestCase {
public function setUp() {
parent::setUp();
Class_CommSigb::setInstance($this->getSigbMock());
$this->dispatch('/opac/abonne/prolongerPret/render/popup', true);
$this->json = json_decode($this->_response->getBody());
}
protected function getSigbMock() {
return $this->mock();
}
public function tearDown() {
Class_CommSigb::setInstance(null);
parent::tearDown();
}
/** @test */
public function responseShouldBeJson() {
$this->assertNotNull($this->json);
}
/** @test */
public function popupShouldBeModal() {
$this->assertEquals('true', $this->json->show_modal);
}
/** @test */
public function popupShouldBeContered() {
$this->assertEquals('center center', $this->json->position->my);
$this->assertEquals('center center', $this->json->position->at);
}
class AbonneControllerPretsRenewErrorThreePretsTest extends AbonneControllerPretsRenewThreePretsTestCase {
protected function getSigbMock() {
return $this->mock()
->whenCalled('prolongerPret')
->answers(['statut' => 0,
'erreur' => '<strong>Patron not found</strong>']);
}
/** @test */
public function popupTitleShouldBeErreur() {
$this->assertEquals('Erreur', $this->json->title);
}
/** @test */
public function popupContentShouldContainsPatronNotFound() {
$this->assertEquals('<strong>Patron not found</strong>', $this->json->content);
}
class AbonneControllerPretsRenewSuccessThreePretsTest extends AbonneControllerPretsRenewThreePretsTestCase {
protected function getSigbMock() {
return $this->mock()
->whenCalled('prolongerPret')
->answers(['statut' => 1]);
}
/** @test */
public function popupTitleShouldBeErreur() {
$this->assertEquals(utf8_encode('Prt prolong'), $this->json->title);
}
/** @test */
public function popupContentShouldContainsPatronNotFound() {
$this->assertEquals(utf8_encode('Votre prt a bien t prolong.'), $this->json->content);
}