diff --git a/VERSIONS_HOTLINE/144497 b/VERSIONS_HOTLINE/144497 new file mode 100644 index 0000000000000000000000000000000000000000..ad6be748620ba2aafab5c163c665e3050220062c --- /dev/null +++ b/VERSIONS_HOTLINE/144497 @@ -0,0 +1 @@ + - correctif #144497 : Mon Compte : Les prêts des membres d'une carte sont désormais affichés dans la page Prêts ou l'onglet mes prêts (Magasin de Thèmes) \ No newline at end of file diff --git a/application/modules/opac/controllers/AbonneController.php b/application/modules/opac/controllers/AbonneController.php index 1c883dc6e1115a30f2f7fd55ecbf07481eb3b1d6..e3f876316b97e5bc42aeafd80fc190f021af4e29 100644 --- a/application/modules/opac/controllers/AbonneController.php +++ b/application/modules/opac/controllers/AbonneController.php @@ -459,9 +459,8 @@ class AbonneController extends ZendAfi_Controller_Action { public function reservationsAction() { - $cards = new Class_User_Cards($this->_user); - if ($delete = $this->_getParam('id_delete')) { + $cards = new Class_User_Cards($this->_user); $title = strip_tags($cards->getHoldTitle($delete)); $result = $cards->cancelHold($delete); $message = array_key_exists('erreur', $result) && $result['erreur'] diff --git a/library/Class/User/Cards.php b/library/Class/User/Cards.php index c0e2bf4ffdea7b284576d1f1fd45e1e7b4b73adc..32ca3c328d236996ba6ea902efbb288b241b3f95 100644 --- a/library/Class/User/Cards.php +++ b/library/Class/User/Cards.php @@ -30,7 +30,11 @@ class Class_User_Cards extends Storm_Model_Collection { if ($user->isAbonne() || $user->hasPnbLoans() || $user->hasPnbHolds()) $this->append($user); - $this->addAll($user->getChildCards()); + if ($user->hasChildCards()) + $this->addAll($user->getChildCards()); + + if ($ilschildcards = $user->getILSChildCards()) + $this->addAll($ilschildcards); } diff --git a/library/Class/Users.php b/library/Class/Users.php index 9f1b9133194137d04339df8a6c5e7519ca37bd52..cb32fee471ba49df1f2e3ec75fa07f2cd56af8a9 100644 --- a/library/Class/Users.php +++ b/library/Class/Users.php @@ -2040,4 +2040,16 @@ class Class_Users extends Storm_Model_Abstract { ? ($this->getIdSite() === $profile->getIdSite()) : $this->hasRightConfigFront() ; } + + + public function getILSChildCards() : array { + if ('1' !== (string) $this->getOrdreabon()) + return []; + + /* findAllBy(['… not' => '…']) is not compatible with volatile fixtures */ + return (new Storm_Model_Collection($this->getLoader()->findAllBy(['idabon' => $this->getIdabon()]))) + ->select((fn($user) => '1' !== (string) $user->getOrdreabon() + && $user->getId() !== $this->getId())) + ->getArrayCopy(); + } } diff --git a/library/Class/WebService/SIGB/Nanook/Service.php b/library/Class/WebService/SIGB/Nanook/Service.php index 0b65c92f7fe13d2f74c6e2998baab595dc4c1c03..8d1ae03ca153a357faf9945b240c460362c7b902 100644 --- a/library/Class/WebService/SIGB/Nanook/Service.php +++ b/library/Class/WebService/SIGB/Nanook/Service.php @@ -111,34 +111,40 @@ class Class_Webservice_SIGB_Nanook_Service extends Class_WebService_SIGB_Abstrac * @return Class_WebService_SIGB_Emprunteur */ public function getEmprunteur($user) { - if (!$user - || (!$patron_id = $this->_patronIdFromUser($user))) + if ( ! $patron_id = $this->_patronIdFromUser($user)) return Class_WebService_SIGB_Emprunteur::nullInstance(); - $emprunteur = $this->ilsdiGetPatronInfo(['patronId' => $user->getIdSigb()], - Class_WebService_SIGB_Nanook_PatronInfoReader::newInstance()); + $emprunteur = $this + ->ilsdiGetPatronInfo(['patronId' => $patron_id], + Class_WebService_SIGB_Nanook_PatronInfoReader::newInstance()); - if (!$emprunteur->getCodeBarres()) + if (!$emprunteur->getCodeBarres() && $user->getLogin()) $emprunteur->setCodeBarres($user->getLogin()); - $emprunteur->setPassword($user->getPassword()); + if ($user->getPassword()) + $emprunteur->setPassword($user->getPassword()); return $emprunteur; } - protected function _patronIdFromUser($user) { - if (Class_Users::isCurrentUserCanAccesBackend() && $user->getIdSigb()) - return $user->getIdSigb(); + protected function _patronIdFromUser(?Class_Users $user) : string { + if ( ! $user ) + return ''; - $patron_id = Class_Users::isLogged($user) - ? $user->getIdSigb() - : ''; + $id_sigb = (string) $user->getIdSigb(); - if (!$patron_id && $this->ilsdiAuthenticatePatron($user)) - $patron_id = $user->getIdSigb(); + if (($logged_user = Class_Users::getIdentity()) + && $logged_user->getIdabon() === $user->getIdabon() + && 1 === (int) $logged_user->getOrdreabon() + && 1 !== (int) $user->getOrdreabon()) + return $id_sigb; - return $patron_id; + return (Class_Users::isCurrentUserCanAccesBackend() + || Class_Users::isLogged($user) + || $this->ilsdiAuthenticatePatron($user)) + ? (string) $user->getIdSigb() + : ''; } diff --git a/tests/application/modules/admin/controllers/AdminAbstractControllerTestCase.php b/tests/application/modules/admin/controllers/AdminAbstractControllerTestCase.php index e22d63fda3892e2ccd2820bf0ce81b6c036b563b..b9c6184ff4ae3f035ec8299a07d4a7b08973e62e 100644 --- a/tests/application/modules/admin/controllers/AdminAbstractControllerTestCase.php +++ b/tests/application/modules/admin/controllers/AdminAbstractControllerTestCase.php @@ -35,7 +35,6 @@ abstract class Admin_AbstractControllerTestCase extends AbstractControllerTestCa } protected function _setDefaultAdminGroups() { - xdebug_break(); $default_categorie = $this->fixture(Class_UserGroupCategorie::class, ['id' => 1, 'libelle' => $this->_('Système')]); diff --git a/tests/application/modules/opac/controllers/AbonneControllerPretsTest.php b/tests/application/modules/opac/controllers/AbonneControllerPretsTest.php index c246f18e2458fafa9560d76050cc504172461357..05e52709157ebe78499222f3f36945aad90d93a7 100644 --- a/tests/application/modules/opac/controllers/AbonneControllerPretsTest.php +++ b/tests/application/modules/opac/controllers/AbonneControllerPretsTest.php @@ -52,7 +52,10 @@ abstract class AbstractAbonneControllerPretsTestCase extends AbstractControllerT $this->florence = $this->fixture('Class_Users', ['id' => '123456', 'login' => 'flo', - 'idabon' => 'x234', + 'idabon' => '123456', + 'ordreabon' => '1', + 'nom' => 'Hinkel', + 'prenom' => 'Florence', 'password' => 'flo', 'role_level' => ZendAfi_Acl_AdminControllerRoles::ABONNE_SIGB, 'int_bib' => $library, @@ -1204,6 +1207,100 @@ class AbonneControllerPretsListMoreThanUndredLoansTest extends AbonneControllerP +class AbonneControllerPretsListWithILSChildCardLinkTest extends AbonneControllerPretsListThreePretsTestCase { + public function setUp() { + parent::setUp(); + $this->fixture(Class_CodifAuteur::class, + ['id' => 456, + 'libelle' => 'JRR Tolkien']); + + $user = $this->fixture(Class_Users::class, + ['id' => 42, + 'idabon' => 123456, + 'login' => 123456, + 'password' => 123456, + 'nom' => 'Lemérovingien', + 'prenom' => 'Romain', + 'ordreabon' => 155 + ]); + + $item = $this->fixture(Class_Exemplaire::class, + ['id' => 1275, + 'id_origine' => 12358, + 'code_barres' => 1235813, + 'id_int_bib' => 1, + 'zone995' => serialize([['clef' => 'a', 'valeur' => 'SaroumaneSansCouleur']]), + 'notice' => $this->fixture('Class_Notice', + ['id' => 990, + 'titre_principal' => 'Le Silmarillion', + 'type_doc' => 1, + 'unimarc' => (new Class_NoticeUnimarc_Fluent) + ->zoneWithContent('001',1275) + ->zoneWithChildren('200', ['a' => 'Le Silmarillion', + 'f' => 'JRR Tolkien']) + ->zoneWithChildren('700', ['a' =>'Tolkien', + 'b' =>'JRR']) + ->render()] + )]); + + $silmarillion = new Class_WebService_SIGB_Emprunt('46', new Class_WebService_SIGB_Exemplaire(1275)); + $silmarillion + ->setCodeBarre(1235813) + ->getExemplaire() + ->setTitre('Le Silmarillion') + ->setRenewals(1) + ->setExemplaireOPAC($item); + $silmarillion + ->parseExtraAttributes(['Dateretourprevue' => '31/10/2023', + 'Section' => 'Espace jeunesse', + 'Auteur' => 'JRR Tolkien', + 'Bibliotheque' => 'Astrolabe', + 'N° de notice' => '12358', + 'Type' => 'P1']); + + + + $emprunteur = new Class_WebService_SIGB_Emprunteur('4567', 'Romain'); + $emprunteur + ->setLibraryCode('IST') + ->empruntsAddAll([$silmarillion]); + + + $user->setFicheSigb(['type_comm' => 2, + 'fiche' => $emprunteur, + 'erreur' => '']); + + $this->dispatch('/opac/abonne/prets'); + } + + + /** @test */ + public function pageshouldContains3Loans() { + $this->assertXpathCount('//table[@id="borrower_loans"]//tbody//tr', 3); + } + + + /** @test */ + public function JRRTolkienAuthorShouldBeInLoansList() { + $this->assertXPathContentContains('//table[@id="borrower_loans"]//tbody/tr//td[5]', 'JRR Tolkien'); + } + + + /** @test */ + public function oneLoantitleShouldBeLeSilmarillion() { + $this->assertXPathContentContains('//table[@id="borrower_loans"]//tbody/tr//td[4]','Le Silmarillion'); + } + + + /** @test */ + public function oneBorrowerNameShouldBeRomainLeMerovingien() { + $this->assertXPathContentContains('//table[@id="borrower_loans"]//tbody/tr//td[1]', 'Romain Lemérovingien'); + } +} + + + + class AbonneControllerPretsListMoreThanUndredHoldsTest extends AbonneControllerPretsListReservationTestCase { public function setUp() { parent::setUp(); diff --git a/tests/library/Class/Notice/DoubleFinderTest.php b/tests/library/Class/Notice/DoubleFinderTest.php index cbe17c057874c4345f8ba30baa95485f0b9295d6..ed0131cbf9fc37b515dfd9c569acfa93aee82530 100644 --- a/tests/library/Class/Notice/DoubleFinderTest.php +++ b/tests/library/Class/Notice/DoubleFinderTest.php @@ -271,8 +271,8 @@ class DoubleFinderWithExistingAlphaKeyTest extends DoubleFinderWithRecordMatchin protected function _prepareFixtures() { parent::_prepareFixtures(); - Class_CosmoVar::set(Class_Notice_DoubleFinder::VAR_DOUBLE_MODE, - Class_CosmoVar::DOUBLE_SEARCH_ALPHA_KEY); + Class_CosmoVar::setValueOf(Class_Notice_DoubleFinder::VAR_DOUBLE_MODE, + Class_CosmoVar::DOUBLE_SEARCH_ALPHA_KEY); } @@ -296,8 +296,8 @@ class DoubleFinderWithExistingItemInAnotherLibraryTest extends DoubleFinderTestC protected function _prepareFixtures() { parent::_prepareFixtures(); - Class_CosmoVar::set(Class_Notice_DoubleFinder::VAR_BARCODE_UNIQ_MODE, - Class_CosmoVar::UNIQ_BARCODE_WITHIN_LIBRARY); + Class_CosmoVar::setValueOf(Class_Notice_DoubleFinder::VAR_BARCODE_UNIQ_MODE, + Class_CosmoVar::UNIQ_BARCODE_WITHIN_LIBRARY); $this->fixture('Class_IntBib', ['id' => 42]); } @@ -321,8 +321,8 @@ class DoubleFinderWithExistingItemAndNoDedupModeTest extends DoubleFinderWithRec protected function _prepareFixtures() { parent::_prepareFixtures(); - Class_CosmoVar::set(Class_Notice_DoubleFinder::VAR_DOUBLE_MODE, - Class_CosmoVar::DOUBLE_SEARCH_NONE); + Class_CosmoVar::setValueOf(Class_Notice_DoubleFinder::VAR_DOUBLE_MODE, + Class_CosmoVar::DOUBLE_SEARCH_NONE); } @@ -342,8 +342,8 @@ class DoubleFinderWithExistingIdOrigneNoDedupModeDefaultTest extends DoubleFinde protected function _prepareFixtures() { parent::_prepareFixtures(); - Class_CosmoVar::set(Class_Notice_DoubleFinder::VAR_DOUBLE_MODE, - Class_CosmoVar::DOUBLE_SEARCH_NONE); + Class_CosmoVar::setValueOf(Class_Notice_DoubleFinder::VAR_DOUBLE_MODE, + Class_CosmoVar::DOUBLE_SEARCH_NONE); } @@ -367,8 +367,8 @@ class DoubleFinderWithExistingIdOrigneNoDedupModeForNanookTestTest extends Doubl ['id' => 1, 'sigb' => Class_IntBib::SIGB_NANOOK]); - Class_CosmoVar::set(Class_Notice_DoubleFinder::VAR_DOUBLE_MODE, - Class_CosmoVar::DOUBLE_SEARCH_NONE); + Class_CosmoVar::setValueOf(Class_Notice_DoubleFinder::VAR_DOUBLE_MODE, + Class_CosmoVar::DOUBLE_SEARCH_NONE); } @@ -395,8 +395,8 @@ class DoubleFinderWithExistingCodeBarreInRemotelyDeletedRecordNoDedupModeForNano ['id' => 1, 'sigb' => Class_IntBib::SIGB_NANOOK]); - Class_CosmoVar::set(Class_Notice_DoubleFinder::VAR_DOUBLE_MODE, - Class_CosmoVar::DOUBLE_SEARCH_NONE); + Class_CosmoVar::setValueOf(Class_Notice_DoubleFinder::VAR_DOUBLE_MODE, + Class_CosmoVar::DOUBLE_SEARCH_NONE); $this->fixture('Class_Notice', ['id' => 55, @@ -430,11 +430,11 @@ class DoubleFinderWithDublinCoreProfileTest extends ModelTestCase { public function setUp() { parent::setUp(); - Class_CosmoVar::set(Class_Notice_DoubleFinder::VAR_BARCODE_UNIQ_MODE, - Class_CosmoVar::UNIQ_BARCODE_WITHIN_LIBRARY); + Class_CosmoVar::setValueOf(Class_Notice_DoubleFinder::VAR_BARCODE_UNIQ_MODE, + Class_CosmoVar::UNIQ_BARCODE_WITHIN_LIBRARY); - Class_CosmoVar::set(Class_Notice_DoubleFinder::VAR_DOUBLE_MODE, - Class_CosmoVar::DOUBLE_SEARCH_ALPHA_KEY); + Class_CosmoVar::setValueOf(Class_Notice_DoubleFinder::VAR_DOUBLE_MODE, + Class_CosmoVar::DOUBLE_SEARCH_ALPHA_KEY); $this->fixture('Class_IntBib', ['id' => 1]); $this->fixture('Class_IntProfilDonnees', @@ -509,8 +509,8 @@ class DoubleFinderWithExistingDoctypeModificationTest extends DoubleFinderTestCa ['id' => 1, 'sigb' => Class_IntBib::SIGB_KOHA]); - Class_CosmoVar::set(Class_Notice_DoubleFinder::VAR_DOUBLE_MODE, - Class_CosmoVar::DOUBLE_SEARCH_NONE); + Class_CosmoVar::setValueOf(Class_Notice_DoubleFinder::VAR_DOUBLE_MODE, + Class_CosmoVar::DOUBLE_SEARCH_NONE); $this->fixture('Class_Notice', ['id' => 1, @@ -542,8 +542,8 @@ class DoubleFinderWithExistingDoctypeModificationTest extends DoubleFinderTestCa class DoubleFinderWithExistingStrategyIdsThenAlphaKeyTest extends ModelTestCase { public function setUp() { parent::setUp(); - Class_CosmoVar::set(Class_Notice_DoubleFinder::VAR_DOUBLE_MODE, - Class_CosmoVar::DOUBLE_SEARCH_IDS_THEN_ALPHA_KEY); + Class_CosmoVar::setValueOf(Class_Notice_DoubleFinder::VAR_DOUBLE_MODE, + Class_CosmoVar::DOUBLE_SEARCH_IDS_THEN_ALPHA_KEY); $this->fixture(Class_Notice::class, ['id' => 8, @@ -610,8 +610,8 @@ class DoubleFinderWithExistingIdOrigneNoDedupModeButItsACafeynAlbumTest extends ['id' => 1, 'sigb' => Class_IntBib::SIGB_NANOOK]); - Class_CosmoVar::set(Class_Notice_DoubleFinder::VAR_DOUBLE_MODE, - Class_CosmoVar::DOUBLE_SEARCH_NONE); + Class_CosmoVar::setValueOf(Class_Notice_DoubleFinder::VAR_DOUBLE_MODE, + Class_CosmoVar::DOUBLE_SEARCH_NONE); $this->fixture('Class_Notice', ['id' => 55, diff --git a/tests/library/Class/WebService/SIGB/NanookTest.php b/tests/library/Class/WebService/SIGB/NanookTest.php index ae89400ef492bf87c384a18c0f04eb229375ebf1..388932c9081e79d8fe341803bea4a49043e1ebf9 100644 --- a/tests/library/Class/WebService/SIGB/NanookTest.php +++ b/tests/library/Class/WebService/SIGB/NanookTest.php @@ -992,7 +992,8 @@ class NanookGetEmprunteurAuthenticateTest extends NanookTestCase { class NanookGetEmprunteurPBTest extends NanookTestCase { /** @var Class_WebService_SIGB_Emprunteur */ - protected $_emprunteur; + protected $_emprunteur, + $_storm_default_to_volatile = true; public function setUp() { @@ -1032,6 +1033,7 @@ class NanookGetEmprunteurPBTest extends NanookTestCase { $this->assertEmpty($this->_emprunteur->getEmail()); } + /** @test */ public function idAbonShouldBeLogin() { $this->assertEquals("77777", $this->_emprunteur->getIdAbon()); diff --git a/tests/scenarios/Templates/TemplatesAbonneTest.php b/tests/scenarios/Templates/TemplatesAbonneTest.php index 12a39ac3c5b727060285e30dc63f75bbc1cc2896..8e7363248507fab7e9e0e0ab139cc0af7a049982 100644 --- a/tests/scenarios/Templates/TemplatesAbonneTest.php +++ b/tests/scenarios/Templates/TemplatesAbonneTest.php @@ -20,6 +20,7 @@ */ require_once 'TemplatesTest.php'; +include_once 'tests/fixtures/NanookFixtures.php'; abstract class TemplatesIntonationAccountTestCase extends TemplatesIntonationTestCase { @@ -164,8 +165,10 @@ abstract class TemplatesIntonationAccountTestCase extends TemplatesIntonationTes $current_user = Class_Users::getIdentity(); $current_user + ->setIdUser(1234) ->setPassword('test') ->setIdabon(123456) + ->setOrdreabon('1') ->setDateFin('2020/01/01') ->setFicheSigb(['type_comm' => 2, 'fiche' => $this->_emprunteur, @@ -502,6 +505,159 @@ class TemplatesDispatchAbonneAjaxLoansTest extends TemplatesIntonationAccountTes +abstract class TemplatesDispatchAbonneWithILSChildCardTestCase extends TemplatesIntonationAccountTestCase { + public function setUp() { + parent::setUp(); + $user = + $this->fixture(Class_Users::class, + ['id' => 42, + 'idabon' => 123456, + 'id_sigb' => 12738917239, + 'login' => 123456, + 'id_int_bib' => 1, + 'id_site' => 1, + 'password' => 123456, + 'nom' => 'Patronymique', + 'prenom' => 'handi', + 'ordreabon' => 12 + ]); + + $web_client = $this + ->mock() + + ->whenCalled('open_url') + ->with('http://localhost:8080/afi_Nanook/ilsdi/service/GetPatronInfo/patronId/12738917239') + ->answers(NanookFixtures::xmlGetPatronChristelDelpeyrouxAfterPost()) + ->beStrict(); + + $service = Class_WebService_SIGB_Nanook_Service::newInstance() + ->setServerRoot('http://localhost:8080/afi_Nanook/ilsdi/') + ->setWebClient($web_client); + + $params = ['url_serveur' => 'http://localhost:8080/afi_Nanook/ilsdi/', + 'id_bib' => 1, + 'type' => Class_IntBib::COM_NANOOK]; + + $this->fixture(Class_Bib::class, + ['id' => 1, + 'libelle' => 'Bibliothèque' + ]); + + $this->fixture(Class_IntBib::class, + ['id' => 1, + 'comm_sigb' => Class_IntBib::COM_NANOOK, + 'comm_params' => serialize($params)]); + + Class_WebService_SIGB_Nanook::setService($params, $service); + + Class_WebService_SIGB_AbstractRESTService::shouldThrowError(true); + } + + + public function tearDown() { + Class_WebService_SIGB_Nanook::reset(); + parent::tearDown(); + } +} + + + +class TemplatesDispatchAbonnesWithILSChildCardFailuresTest extends TemplatesDispatchAbonneWithILSChildCardTestCase { + /** @test */ + public function WithOrdreabonn1LoanlistTitleShouldNotContainsBeartEnPublic() { + Class_Users::find(42)->setOrdreabon(1); + $this->dispatch('/opac/abonne/ajax-loans/id_profil/72'); + $this->assertXPathCount('//div[@class="card"]', 3); + $this->assertNotXPathContentContains('//div[@class="card"]//div[@class="document_title"]', + utf8_encode('Béart en public')); + } + + + /** @test */ + public function withDifferentIdabonnloanlistShouldNotContainsBeartEnPublic() { + Class_Users::find(42)->setIdabon(11234); + $this->dispatch('/opac/abonne/ajax-loans/id_profil/72'); + $this->assertXPathCount('//div[@class="card"]', 3); + $this->assertNotXPathContentContains('//div[@class="card"]//div[@class="document_title"]', + utf8_encode('Béart en public')); + } + + + /** @test + ChildCard is based on same Idabon + */ + public function withDifferentIdabonForCurrentUserloanlistShouldNotContainsBeartEnPublic() { + Class_Users::getIdentity()->setIdabon(42); + $this->dispatch('/opac/abonne/ajax-loans/id_profil/72'); + $this->assertXPathCount('//div[@class="card"]', 3); + $this->assertNotXPathContentContains('//div[@class="card"]//div[@class="document_title"]', + utf8_encode('Béart en public')); + } + + + /** @test + ChildCard Only Displayed for Master Card + */ + public function withDifferentOrdreabonForCurrentUserloanlistShouldNotContainsBeartEnPublic() { + Class_Users::getIdentity()->setOrdreabon(42); + $this->dispatch('/opac/abonne/ajax-loans/id_profil/72'); + $this->assertXPathCount('//div[@class="card"]', 3); + $this->assertNotXPathContentContains('//div[@class="card"]//div[@class="document_title"]', + utf8_encode('Béart en public')); + } +} + + + + +class TemplatesDispatchAbonneAjaxLoansWithILSChildCardTest extends TemplatesDispatchAbonneWithILSChildCardTestCase { + public function setUp(){ + parent::setUp(); + $this->dispatch('/opac/abonne/ajax-loans/id_profil/72'); + } + + + /** @test */ + public function loanlistShouldContainsBeartEnPublic() { + $this->assertXPathContentContains('//div[@class="card"]//div[@class="document_title"]', + utf8_encode('Béart en public')); + } + + + /** @test */ + public function loanlistLoanByShouldContainsHandiPatronymique() { + $this->assertXPathContentContains('//div[@class="card"]//div[@class="loan_by"]', + utf8_encode('Emprunté par <span class="by_idabon d-none">123456</span> handi Patronymique')); + } +} + + + + + +class TemplatesDispatchAbonneReservationWithILSChildCardTest extends TemplatesDispatchAbonneWithILSChildCardTestCase { + public function setUp(){ + parent::setUp(); + $this->dispatch('/opac/abonne/reservations/id_profil/72'); + } + + + /** @test */ + public function holdListDocumentTitleShouldContainsConteDesQuatresVents() { + $this->assertXPathContentContains('//div[@class="document_title"]', + 'Contes des quatre vents'); + } + + + /** @test */ + public function holdlistHoldByShouldContainsHandiPatronymique() { + $this->assertXPathContentContains('//div[@class="hold_by"]', + 'Réservé par <span class="by_idabon d-none">123456</span> handi Patronymique'); + } +} + + + class TemplatesDispatchAbonneMonHistoriqueTest extends TemplatesIntonationAccountTestCase { public function setUp(){