Newer
Older
<?php
/**
* Copyright (c) 2012, Agence Française Informatique (AFI). All rights reserved.
*
* BOKEH 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).
*
* BOKEH 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 BOKEH; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
require_once 'tests/fixtures/DilicomFixtures.php';
abstract class BibNumeriqueContollerDilicomTestCase extends AbstractControllerTestCase {
protected
$_http,
$_time_source,
$_storm_default_to_volatile = true;
public function setUp() {
parent::setUp();
$this->fixture('Class_Bib',
['id' => 1,
'gln' => '2345889']);
Class_AdminVar::set('DILICOM_PNB_MAX_LOAN_DURATION', 0);
$logged_user = $this->fixture('Class_Users',
['id' => 6,
'nom'=>'Pito',
'login'=>'Chat',
'password'=>'123456',
'id_site' => 1,
'idabon' => '12345',
'user_groups' => [$this->fixture('Class_UserGroup',
['id' => '20',
'libelle' => 'Multimedia',
'rights' => [Class_UserGroup::RIGHT_ACCES_PNB_DILICOM]])]]);
$logged_user->beAbonneSIGB()->assertSave();
ZendAfi_Auth::getInstance()->logUser($logged_user);
$this->book = $this->fixture('Class_Album',
['id' => 3,
'libelle' => 'Totem et Thora',
'id_origine' => 'Dilicom-88817216',
'external_uri' => 'http://www.edenlivres.fr/p/23416',
'type_doc_id' => Class_TypeDoc::DILICOM,
'isbn' => '435465',
'items' => [$this->fixture('Class_Album_Item',
['id' => 1,
'album_id' => 3,
'loan_count' => 2,
'quantity' => 4])],
'usage_constraints' => [$this->fixture('Class_Album_UsageConstraint',
['id' => 1,
'album_id' => 3,
'usage_type' => Class_Album_UsageConstraint::LOAN_CONSTRAINT,
Class_Album_UsageConstraint::MAX_NB_OF_USERS => 40,
Class_Album_Usageconstraint::QUANTITY => 50,
Class_Album_UsageConstraint::DURATION => '100',
'order_line_id' => 'x321']),
$this->fixture('Class_Album_UsageConstraint',
['id' => 2,
'album_id' => 3,
'usage_type' => Class_Album_UsageConstraint::AVAILABILITY_CONSTRAINT,
Class_Album_UsageConstraint::DURATION => '100',
Class_Album_UsageConstraint::END_DATE => '2018-04-01 00:00:00'])]]);
RessourcesNumeriquesFixtures::activateDilicom();
$this->_http = Storm_Test_ObjectWrapper::mock();
Class_WebService_BibNumerique_Dilicom_Hub::setDefaultHttpClient($this->_http);
$this->_http
->whenCalled('setAuth')
->with('afi-bib', 'secretPassword')
->answers(null);
$this->_time_source = new TimeSourceForTest('2014-05-02 14:14:14');
Class_WebService_BibNumerique_Dilicom_Hub::setTimeSource($this->_time_source);
Class_Album_UsageConstraint::setTimeSource($this->_time_source);
Class_Loan_Pnb::setTimeSource($this->_time_source);
}
public function tearDown() {
Class_WebService_BibNumerique_Dilicom_Hub::setTimeSource(null);
Class_Album_UsageConstraint::setTimeSource(null);
Class_Loan_Pnb::setTimeSource(null);
parent::tearDown();
class BibNumeriqueContollerDilicomAjaxPopupBookActionTest extends BibNumeriqueContollerDilicomTestCase {
protected $_storm_default_to_volatile = true;
public function popupConsultBookShouldContainsLinkToOpenAjax() {
$this->_http
->whenCalled('open_url')
->with('https://pnb-test.centprod.com/v2/pnb-numerique/json/consultBook?glnContractor=123456789&orderLineId=x321&accessMedium=STREAMING&localization=IN_SITU&consultEndDate=2014-05-02T15%3A14%3A14%2B0200&ean13=435465&ipAddress=127.0.0.1&glnColl=afi-bib&loanerColl=2345889&loanId=n4y4nq63')
->answers(DilicomFixtures::loanBookResponse())
->beStrict();
$this->dispatch('/bib-numerique/consult-book-ajax/id/3', true);
$this->assertContains('<div class="popup-content"><p>Êtes vous sûr de vouloir consulter ce document ?</p><a href="/bib-numerique/consult-book-open-ajax/id/3" data-popup="true" class="button blue">oui</a><a href="" onclick="opacDialogClose();return false" class="button red">non</a></div>',
json_decode($this->_response->getBody())->content);
public function popupConsultBookOpenShouldContainsLinkToOpenPnbUrl() {
$this->_http
->whenCalled('open_url')
->with('https://pnb-test.centprod.com/v2/pnb-numerique/json/consultBook?glnContractor=123456789&orderLineId=x321&accessMedium=STREAMING&localization=IN_SITU&consultEndDate=2014-05-02T15%3A14%3A14%2B0200&ean13=435465&ipAddress=127.0.0.1&glnColl=afi-bib&loanerColl=2345889&loanId=n4y4nq63')
->answers(DilicomFixtures::loanBookResponse())
->beStrict();
$this->dispatch('/bib-numerique/consult-book-open-ajax/id/3', true);
$this->assertContains('<div class=\"popup-content\"><a href=\"https:\/\/pnb-dilicom.centprod.com\/v2\/\/link\/3025594195810\/LOAN\/WIKI001\/9782021153057-NUMOIY0785CYO0IGCV83DE9DOAOC1Y1O.do\" target=\"_blank\" class=\"button blue\" onclick=\"opacDialogClose();\">Lire en ligne<\/a><\/div>"',
$this->_response->getBody());
}
/** @test */
public function popupLoanBookOpenAjaxWithPnbErrorShouldContainsScriptToReloadPage() {
$this->_http
->whenCalled('open_url')
->with('https://pnb-test.centprod.com/v2/pnb-numerique/json/consultBook?glnContractor=123456789&orderLineId=x321&accessMedium=STREAMING&localization=IN_SITU&consultEndDate=2014-05-02T15%3A14%3A14%2B0200&ean13=435465&ipAddress=127.0.0.1&glnColl=afi-bib&loanerColl=2345889&loanId=n4y4nq63')
->answers(DilicomFixtures::loanBookErrorResponse())
->beStrict();
$this->dispatch('/bib-numerique/consult-book-open-ajax/id/3', true);
$this->assertContains('<script>window.open(\"\/recherche\/viewnotice\/id\/3\/render\/false\")<\/script>', $this->_response->getBody());
}
/** @test */
public function loanBookPopupShouldContainsQuestion() {
$this->dispatch('/bib-numerique/loan-book-ajax/id/3', true);
$this->assertContains('<p>Êtes vous sûr de vouloir emprunter ce document ?</p>',
json_decode($this->_response->getBody())->content);
/** @test */
public function loanBookPopupShouldContainsLinkToDownload() {
$this->dispatch('/bib-numerique/loan-book-ajax/id/3', true);
$this->assertContains('<a href=\"\/bib-numerique\/download-loan-book-ajax\/id\/3\" data-popup=\"true\" class=\"button blue\">oui<\/a>', $this->_response->getBody());
}
public function loanBookPopupShouldContainsAnswerYes() {
$this->dispatch('/bib-numerique/loan-book-ajax/id/3', true);
$this->assertContains('<a href=\"\/bib-numerique\/download-loan-book-ajax\/id\/3\" data-popup=\"true\" class=\"button blue\">oui<\/a>', $this->_response->getBody());
/** @test */
public function loanBookPopupShouldContainDefaultMessage() {
$this->dispatch('/bib-numerique/loan-book-ajax/id/3', true);
$this->assertContains('Votre compte sera mis à jour dans un délai de 15 minutes après le retour anticipé du document.', json_decode($this->_response->getBody())->content);
}
/** @test */
public function loanBookPopupShouldContainDefinedMessage() {
$this->fixture('Class_AdminVar',
['id' => 'DILICOM_PNB_LOAN_WARNING_MESSAGE',
'valeur' => 'Don\'t use this !'
]);
$this->dispatch('/bib-numerique/loan-book-ajax/id/3', true);
$this->assertContains('Don\'t use this !', json_decode($this->_response->getBody())->content);
}
public function downloadLinkShouldAnswersDilicomLink() {
$this->_http
->whenCalled('open_url')
->with('https://pnb-test.centprod.com/v2/pnb-numerique/json/loanBook?glnContractor=123456789&orderLineId=x321&accessMedium=DOWNLOAD&glnColl=afi-bib&loanerColl=2345889&localization=EX_SITU&loanEndDate=2014-08-10T14%3A14%3A14%2B0200&ean13=435465&loanId=1')
->answers(DilicomFixtures::loanBookResponse())
->beStrict();
$this->dispatch('bib-numerique/download-loan-book-ajax/id/3', true);
$this->assertContains('"<div class=\"popup-content\"><a href=\"https:\/\/pnb-dilicom.centprod.com\/v2\/\/link\/3025594195810\/LOAN\/WIKI001\/9782021153057-NUMOIY0785CYO0IGCV83DE9DOAOC1Y1O.do\" class=\"button blue\" onclick=\"opacDialogClose();\">T\u00e9l\u00e9charger<\/a><\/div>"', $this->_response->getBody());
public function downloadLinkWithPnbErrorShouldConstainsScriptToReloadPage() {
$this->_http
->whenCalled('open_url')
->with('https://pnb-test.centprod.com/v2/pnb-numerique/json/loanBook?glnContractor=123456789&orderLineId=x321&accessMedium=DOWNLOAD&glnColl=afi-bib&loanerColl=2345889&localization=EX_SITU&loanEndDate=2014-08-10T14%3A14%3A14%2B0200&ean13=435465&loanId=1')
->answers(DilicomFixtures::loanBookErrorResponse())
->beStrict();
$this->dispatch('bib-numerique/download-loan-book-ajax/id/3', true);
$this->assertContains('<script>window.open(\"\/recherche\/viewnotice\/id\/3\/render\/false\")<\/script>', $this->_response->getBody());
/** @test */
public function downloadLinkWithNoConnectedUserShouldRenderLoginPopup() {
ZendAfi_Auth::getInstance()->clearIdentity();
$this->dispatch('bib-numerique/download-loan-book-ajax/id/3', true);
$this->assertContains('"title":"Authentification"', $this->_response->getBody());
}
class BibNumeriqueContollerDilicomConsultBookActionTest extends BibNumeriqueContollerDilicomTestCase {
$this->_http
->whenCalled('open_url')
->with('https://pnb-test.centprod.com/v2/pnb-numerique/json/consultBook?glnContractor=123456789&orderLineId=x321'
.'&accessMedium=STREAMING'
.'&localization=IN_SITU'
.'&consultEndDate='.urlencode('2014-05-02T15:14:14+0200')
.'&ean13=435465'
.'&ipAddress=195.251.88.223'
.'&loanId='.base_convert($this->_time_source->time(), 10, 36).'63')
->answers('{"orderLineId":"54e7473f975a2fa6aa4d3e17","consultEndDate":"2014-05-02T15:14:14+0200","loanId":"3","returnStatus":"OK","returnMessage":[],"requestId":"awvzrcttestpnbv2_000000039_201503051511","link":{"url":"https://pnb-test.centprod.com/v2//link/3056000302801/CONSULT/3/9791023501766-FGR9FJJGJCMXYMB8BO87XR9TPHDN9QNS.do","aformatDescription":"EPUB","mimetype":"application/epub+zip","ean13":"9791023501766","format":"E101"}}')
->beStrict();
$this->dispatch('/bib-numerique/consult-book/id/3', true);
}
public function tearDown() {
Class_WebService_BibNumerique_Dilicom_Hub::setDefaultHttpClient(null);
RessourcesNumeriquesFixtures::deactivateDilicom();
parent::tearDown();
}
/** @test */
public function openUrlShouldHaveBeenCalled() {
$this->assertTrue($this->_http->methodHasBeenCalled('open_url'));
}
/** @test */
public function setAuthShouldHaveBeenCalled() {
$this->assertTrue($this->_http->methodHasBeenCalled('setAuth'));
}
/** @test */
public function responseShouldRedirectToConsultBookUrl() {
$this->assertRedirectTo('https://pnb-test.centprod.com/v2//link/3056000302801/CONSULT/3/9791023501766-FGR9FJJGJCMXYMB8BO87XR9TPHDN9QNS.do');
}
}
class BibNumeriqueContollerDilicomConsultBookWithErrorsActionTest extends BibNumeriqueContollerDilicomTestCase {
$this->_http
->whenCalled('open_url')
->answers('{"orderLineId":"54e7473f975a2fa6aa4d3e17","consultEndDate":"","loanId":"3","returnStatus":"ERROR","returnMessage":["Crash boom"],"requestId":"awvzrcttestpnbv2_000000039_201503051511","link":{}}');
$this->dispatch('/bib-numerique/consult-book/id/3', true);
}
/** @test */
public function responseShouldRedirectToReferrer() {
$this->assertRedirectTo('/recherche/viewnotice/id/3', $this->getResponseLocation());
/** @test */
public function errorMessageShouldBeInNotifications() {
$this->assertFlashMessengerContentContains('Crash boom');
}
class BibNumeriqueControllerDilicomLoanBookActionTest extends BibNumeriqueContollerDilicomTestCase {
public function setUp() {
parent::setUp();
$_SERVER['HTTP_REFERER'] = '/viewnotice/id/3';
Class_AdminVar::set('DILICOM_PNB_LOAN_COUNT_LIMIT', 0);
->with('https://pnb-test.centprod.com/v2/pnb-numerique/json/loanBook?glnContractor=123456789&orderLineId=x321&accessMedium=DOWNLOAD&glnColl=afi-bib&loanerColl=2345889&localization=EX_SITU&loanEndDate=2014-08-10T14%3A14%3A14%2B0200&ean13=435465&loanId=1')
->answers(DilicomFixtures::loanBookResponse())
->beStrict();
$this->dispatch('/bib-numerique/loan-book/id/3', true);
}
/** @test */
public function responseShouldReturnDownloadUrl() {
$this->assertRedirectTo('https://pnb-dilicom.centprod.com/v2//link/3025594195810/LOAN/WIKI001/9782021153057-NUMOIY0785CYO0IGCV83DE9DOAOC1Y1O.do');
}
/** @test */
public function bokehLoanShouldHaveBeenSaved() {
$this->assertNotNull(Class_Loan_Pnb::findFirstBy(['record_origin_id' => 'Dilicom-88817216']));
}
/** @test */
public function loanUrlShouldHaveBeenSaved() {
$this->assertEquals('https://pnb-dilicom.centprod.com/v2//link/3025594195810/LOAN/WIKI001/9782021153057-NUMOIY0785CYO0IGCV83DE9DOAOC1Y1O.do', Class_Loan_Pnb::findFirstBy(['record_origin_id' => 'Dilicom-88817216'])->getLoanLink());
}
}
class BibNumeriqueControllerDilicomLoanBookActionErrorsTest extends BibNumeriqueContollerDilicomTestCase {
public function setUp() {
parent::setUp();
$_SERVER['HTTP_REFERER'] = '/viewnotice/id/3';
Class_AdminVar::set('DILICOM_PNB_MAX_LOAN_DURATION', 10);
->with('https://pnb-test.centprod.com/v2/pnb-numerique/json/loanBook?glnContractor=123456789&orderLineId=x321&accessMedium=DOWNLOAD&glnColl=afi-bib&loanerColl=2345889&localization=EX_SITU&loanEndDate=2014-05-12T14%3A14%3A14%2B0200&ean13=435465&loanId=1')
->answers(DilicomFixtures::loanBookErrorResponse())
->beStrict();
$this->dispatch('/bib-numerique/loan-book/id/3', true);
}
/** @test */
public function responseShouldRedirectToReferrer() {
$this->assertRedirectTo('/recherche/viewnotice/id/3', $this->getResponseLocation());
/** @test */
public function errorMessageShouldBeInNotifications() {
$this->assertFlashMessengerContentContains('Are you trying to download this book ?');
}
/** @test */
public function loanShouldHaveBeedDeleted() {
$this->assertNull(Class_Loan_Pnb::find(1));
}
}
class BibNumeriqueControllerDilicomLoanBookWrongAlbumTest extends BibNumeriqueContollerDilicomTestCase {
/** @test */
public function responseShouldRedirectToIndex() {
$_SERVER['HTTP_REFERER'] = '/viewnotice/id/3789';
$this->dispatch('/bib-numerique/loan-book/id/3789', true);
$this->assertRedirectTo('/recherche/viewnotice/id/3789');
class BibNumeriqueControllerDilicomLoanBookActionTwiceWithSameUserTest extends BibNumeriqueContollerDilicomTestCase {
public function setUp() {
parent::setUp();
$_SERVER['HTTP_REFERER'] = '/viewnotice/id/3';
$this->_http
->whenCalled('open_url')
->with('https://pnb-test.centprod.com/v2/pnb-numerique/json/getEndedLoans?glnContractor=123456789&loanId[0]=5')
->answers(DilicomFixtures::getEndedLoansResponse())
->beStrict();
$this->fixture('Class_Loan_Pnb',
['id' => 5,
'user_id' => '6',
'record_origin_id' => 'Dilicom-88817216',
'expected_return_date' => '2014-05-02 18:14:14',
'loan_link' => 'https://pnb-dilicom.centprod.com/v2//link/3025594195810/LOAN/WIKI001/9782021153057-NUMOIY0785CYO0IGCV83DE9DOAOC1Y1O.do']);
$this->dispatch('/bib-numerique/loan-book/id/3', true);
}
/** @test */
public function responseShouldReturnDownloadUrl() {
$this->assertRedirectTo('https://pnb-dilicom.centprod.com/v2//link/3025594195810/LOAN/WIKI001/9782021153057-NUMOIY0785CYO0IGCV83DE9DOAOC1Y1O.do');
}
}
abstract class BibNumeriqueContollerDilicomSecondUserTestCase extends BibNumeriqueContollerDilicomTestCase {
public function setUp() {
parent::setUp();
$_SERVER['HTTP_REFERER'] = '/viewnotice/id/3';
$second_user = $this->fixture('Class_Users',
['id' => 78,
'nom'=>'Dily',
'login'=>'Chaton',
'password'=>'123456',
'id_site' => 1,
'idabon' => '654321',
'user_groups' => [Class_UserGroup::find(20)]]);
$second_user->beAbonneSIGB()->assertSave();
ZendAfi_Auth::getInstance()->logUser($second_user);
$this->_http
->whenCalled('open_url')
->never();
}
}
class BibNumeriqueControllerDilicomLoanBookActionWithASecondUserAndLoanCountExcededTest extends BibNumeriqueContollerDilicomSecondUserTestCase {
public function setUp() {
parent::setUp();
Class_Album_Item::find(1)->setLoanCount(40)->save();
$this->dispatch('/bib-numerique/loan-book/id/3', true);
}
/** @test */
public function responseShouldRedirectToReferer() {
$this->assertRedirectTo('/recherche/viewnotice/id/3');
/** @test */
public function notificationShouldReturnNoLoansAvailable() {
$this->assertFlashMessengerContentContains('Emprunt impossible. Le nombre d\'emprunts simultanés est atteint.');
}
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
class BibNumeriqueControllerDilicomLoanBookActionWithASecondUserAndGlobalLoanCountExcededTest extends BibNumeriqueContollerDilicomSecondUserTestCase {
public function setUp() {
parent::setUp();
Class_AdminVar::set('DILICOM_PNB_LOAN_COUNT_LIMIT', 3);
Class_Album_Item::find(1)->setLoanCount(3)->save();
$this->dispatch('/bib-numerique/loan-book/id/3', true);
}
/** @test */
public function responseShouldRedirectToReferer() {
$this->assertRedirectTo('/recherche/viewnotice/id/3');
}
/** @test */
public function notificationShouldReturnNoLoansAvailable() {
$this->assertFlashMessengerContentContains('Emprunt impossible. Le nombre d\'emprunts simultanés est atteint.');
}
}
class BibNumeriqueControllerDilicomLoanBookActionUserLoanCountExceededTest extends BibNumeriqueContollerDilicomSecondUserTestCase {
public function setUp() {
parent::setUp();
$this->_http
->whenCalled('open_url')
->answers('');
Class_AdminVar::set('DILICOM_PNB_MAX_LOAN_PER_USER', 3);
foreach(range(1, 3) as $step)
$this->fixture('Class_Loan_Pnb',
['id' => $step,
'user_id' => Class_Users::getIdentity()->getId(),
'record_origin_id' => $step,
'expected_return_date' => '2022-06-01']);
$this->dispatch('/bib-numerique/loan-book/id/3', true);
}
/** @test */
public function responseShouldRedirectToReferer() {
$this->assertRedirectTo('/recherche/viewnotice/id/3');
}
/** @test */
public function notificationShouldReturnNoLoansAvailable() {
$this->assertFlashMessengerContentContains('Emprunt impossible. Vous avez atteint votre quota de 3 emprunts.');
}
}
class BibNumeriqueControllerDilicomLoanBookActionWithASecondUserAndQuantityExcededTest extends BibNumeriqueContollerDilicomSecondUserTestCase {
public function setUp() {
parent::setUp();
Class_Album_Item::find(1)->setQuantity(50)->save();
$this->dispatch('/bib-numerique/loan-book/id/3', true);
}
/** @test */
public function responseShouldRedirectToReferer() {
$this->assertRedirectTo('/recherche/viewnotice/id/3');
/** @test */
public function notificationShouldContainsNoLoansAvailable() {
$this->assertFlashMessengerContentContains('Emprunt impossible. Le nombre d\'emprunts disponible est épuisé.', $this->_getFlashMessengerMessages()[0]);
}
class BibNumeriqueControllerDilicomLoanBookActionWithASecondUserAndOfferValidityExcededTest extends BibNumeriqueContollerDilicomSecondUserTestCase {
$this->_time_source = new TimeSourceForTest('2018-05-02 14:14:14');
Class_WebService_BibNumerique_Dilicom_Hub::setTimeSource($this->_time_source);
Class_Album_UsageConstraint::setTimeSource($this->_time_source);
$this->dispatch('/bib-numerique/loan-book/id/3', true);
}
/** @test */
public function notificationShouldContainsErrorMessage() {
$this->assertFlashMessengerContentContains('Emprunt impossible. L\'emprunt du document n\'est plus disponible.', $this->_getFlashMessengerMessages()[0]);
}