diff --git a/FEATURES/203399 b/FEATURES/203399 new file mode 100644 index 0000000000000000000000000000000000000000..8fe8a5f10e5806550df91ebf440efcbba945151f --- /dev/null +++ b/FEATURES/203399 @@ -0,0 +1,10 @@ + '203399' => + ['Label' => $this->_('Filtrage bibliothèques à choix multiples pour les profils et les groupes utilisateur'), + 'Desc' => '', + 'Image' => '', + 'Video' => '', + 'Category' => '', + 'Right' => function($feature_description, $user) {return true;}, + 'Wiki' => '', + 'Test' => '', + 'Date' => '2024-06-19'], \ No newline at end of file diff --git a/VERSIONS_WIP/203399 b/VERSIONS_WIP/203399 new file mode 100644 index 0000000000000000000000000000000000000000..f14f22db7086c893042bfbd107650da0d036a3e9 --- /dev/null +++ b/VERSIONS_WIP/203399 @@ -0,0 +1 @@ + - fonctionnalité #203399 : [Ariège] Filtrage bibliothèques à choix multiples pour les profils et les groupes utilisateur \ No newline at end of file diff --git a/application/modules/admin/controllers/ModulesController.php b/application/modules/admin/controllers/ModulesController.php index eafcea23679b62535f475a539f9769225ffd705f..104ac585cd58b702d1dabad168093cf49be29f4b 100644 --- a/application/modules/admin/controllers/ModulesController.php +++ b/application/modules/admin/controllers/ModulesController.php @@ -60,7 +60,7 @@ class Admin_ModulesController extends ZendAfi_Controller_Action { ZendAfi_View_Helper_Accueil_Base::getComboTemplates($this->preferences['boite'], $this->profil); $this->view->id_profil = $this->profil->getId(); - $this->view->id_bib = $this->profil->getIdSite(); + $this->view->id_bibs = $this->profil->getLibraryIds(); $this->view->action = $this->_getParam('type_module').'_'.$this->_getParam('action1'); } diff --git a/application/modules/admin/controllers/ProfilController.php b/application/modules/admin/controllers/ProfilController.php index 6af21eee7c78c297a907c357704a26547b62d9f8..9e1ab4fba97571b4207495caf9a1d34d31e8883c 100644 --- a/application/modules/admin/controllers/ProfilController.php +++ b/application/modules/admin/controllers/ProfilController.php @@ -58,12 +58,8 @@ class Admin_ProfilController extends ZendAfi_Controller_Action { public function indexAction() { $user = Class_Users::getIdentity(); - - $profils = ($user->isModoPortailOrMore()) - ? Class_Profil::findAllByZoneAndBib($this->id_zone, - $this->id_bib) - : Class_Profil::findByZoneAndBibs($this->id_zone, - $user->managedLibraryIds()); + $profils = Class_Profil::findAllByZoneAndBib($this->id_zone, + $this->id_bib); $profils_by_bib = []; foreach ($profils as $profil) { @@ -71,8 +67,11 @@ class Admin_ProfilController extends ZendAfi_Controller_Action { if ($profil->hasParentProfil()) continue; - if (($user->getRoleLevel() <= ZendAfi_Acl_AdminControllerRoles::MODO_PORTAIL) - && !$user->canManageLibrary($profil->getBib())) + if ($user->isModo()) + continue; + + if ($user->isAdminBib() + && !$profil->hasOneOfManagedLibraries($user->managedLibraryIds())) continue; $libelle = $profil->isInPortail() ? 'Portail' : $profil->getBibLibelle(); @@ -417,6 +416,9 @@ class Admin_ProfilController extends ZendAfi_Controller_Action { public function editAction() { $profil = Class_Profil::find($this->id_profil); + if (!$this->_canEdit($profil)) + $this->_doOnCannotEdit($profil); + $params = array_merge($profil->toArray(), $profil->getCfgSiteAsArray()); @@ -503,4 +505,19 @@ class Admin_ProfilController extends ZendAfi_Controller_Action { $export = new Class_Profil_Export($this->_profil); $this->_response->setBody($export->toString()); } + + + protected function _canEdit($profil): bool + { + return ($user = Class_Users::getIdentity()) && $user->isAdminBib() + ? $profil->hasOneOfManagedLibraries($user->managedLibraryIds()) + : true; + } + + + protected function _doOnCannotEdit($profil) { + $this->_helper->notify($this->_('Vous n\'avez pas la permission pour le profil "%s"', + $profil->getLibelle())); + return $this->_redirectClose('/admin'); + } } diff --git a/cosmogramme/sql/patch/patch_473.php b/cosmogramme/sql/patch/patch_473.php new file mode 100644 index 0000000000000000000000000000000000000000..9897b924c88a1638f410151ca74985c6839cd083 --- /dev/null +++ b/cosmogramme/sql/patch/patch_473.php @@ -0,0 +1,6 @@ +<?php +$adapter = Zend_Db_Table_Abstract::getDefaultAdapter(); + +try { + $adapter->query('ALTER TABLE `bib_admin_profil` CHANGE `ID_SITE` `ID_SITE` mediumtext NOT NULL'); +} catch(Exception $e) {} diff --git a/library/Class/Article/Select.php b/library/Class/Article/Select.php index 3acae0aa9ac7892ac283259774c7645626db62d0..079ed89b1679fe5946e9204b8719d2a6cf7926a9 100644 --- a/library/Class/Article/Select.php +++ b/library/Class/Article/Select.php @@ -380,15 +380,20 @@ class Class_Article_Select { * @param array $preferences * @return array */ - protected function _byIdBib($id_bib) { - if (0 === $id_bib || null === $id_bib) + protected function _byIdBib($id_bibs) { + if (!is_array($id_bibs)) + $id_bibs = [$id_bibs]; + + $id_bibs = $id_bibs ? array_filter($id_bibs) : []; + if ( ! $id_bibs) return $this; $this->_select ->join('cms_categorie', 'cms_categorie.ID_CAT = cms_article.ID_CAT', - []) - ->where('cms_categorie.ID_SITE=?', $id_bib); + array()) + ->where('cms_categorie.ID_SITE IN (' + . "'" . implode("','", $id_bibs) . "')"); return $this; } diff --git a/library/Class/Calendar.php b/library/Class/Calendar.php index 08622f0b7459c00187b5ca30c474519c1d5d5977..9d8bc3210977a34a554c5141b4461da77a9baf71 100644 --- a/library/Class/Calendar.php +++ b/library/Class/Calendar.php @@ -50,7 +50,7 @@ class Class_Calendar { $this->year = (int)substr($this->year_month, 0, 4); $this->month = (int)substr($this->year_month, -2); - $this->id_bib = Class_Profil::getCurrentProfil()->getIdSite(); + $this->id_bib = Class_Profil::getCurrentProfil()->getLibraryIds(); if (!array_isset('display_cat_select', $this->preferences)) $this->preferences['display_cat_select'] = false; diff --git a/library/Class/CriteresRecherche.php b/library/Class/CriteresRecherche.php index 17f6f8cecffd80bf17eb162fac3ebd7a78fd0c57..868cebed8cd9a45bed13e6e59acf364d82b23e49 100644 --- a/library/Class/CriteresRecherche.php +++ b/library/Class/CriteresRecherche.php @@ -982,8 +982,8 @@ class Class_CriteresRecherche extends Class_CriteresRecherche_Abstract { public function getBibs() : array { $bibs = explode(',', $this->getParam('bib_select','')); if ($this->_profil - && ($selection_bib = $this->_profil->getIdSite())) - $bibs [] = $selection_bib; + && ($selection_bibs = $this->_profil->getLibraryIds())) + $bibs = array_merge($bibs,$selection_bibs); return array_filter($bibs); } diff --git a/library/Class/Profil.php b/library/Class/Profil.php index db3496feed5ef346e1cdcade5d8b443491a24cf4..5361ff85ebf749e5b9ba4b58be050c03b8c9114b 100644 --- a/library/Class/Profil.php +++ b/library/Class/Profil.php @@ -55,36 +55,70 @@ class ProfilLoader extends Storm_Model_Loader { public function findAllByZoneAndBib($id_zone = 0, $id_bib = 0) { - $conditions = ['order' => 'libelle']; - if ($id_zone && $id_zone !="ALL") - $conditions["ID_SITE"] = $id_zone=="PORTAIL" ? 0 : ["select ID_SITE from bib_c_site where ID_ZONE=$id_zone"]; + $by_zone = null; + if ($id_zone && $id_zone !="ALL" && $id_zone != 'PORTAIL') + $by_zone = $id_zone; - if($id_bib && $id_bib!="ALL") { + $by_idbib = null; + if($id_bib and $id_bib!="ALL") { if($id_bib=="PORTAIL") $id_bib=0; - $conditions["ID_SITE"] = $id_bib; + $by_idbib = $id_bib; } - return Class_Profil::findAllBy($conditions); + $profils = Class_Profil::findAllBy(['order' => 'libelle']); + + if (isset($by_zone)) + $profils = $this->_filterOnIdZone($profils, $by_zone); + + if (isset($by_idbib)) + $profils = $this->_filterOnIdBib($profils, $by_idbib); + + if (Class_Users::getIdentity()->isAdminBib()) + $profils = $this->_filterByManagedLibraries($profils); + + return $profils; + } + + + protected function _filterOnIdZone(array $profils, int $id_zone): array + { + $filtered = []; + $bibs = array_map(fn($bib) => $bib->getId(), + Class_Bib::findAllBy(['id_zone' => $id_zone])); + + foreach ($profils as $profil) + if ($profil->hasOneOfManagedLibraries($bibs)) + $filtered[] = $profil; + + return $filtered; + + } + + + protected function _filterOnIdBib(array $profils, int $id_bib): array + { + $filtered = []; + + foreach ($profils as $profil) + if (in_array($id_bib, $profil->getLibraryIds())) + $filtered[] = $profil; + + return $filtered; } - public function findByZoneAndBibs(string $id_zone = '', - array $bibs = [0]): array + protected function _filterByManagedLibraries(array $profils): array { - if ($id_zone && 'ALL' !== $id_zone && 'PORTAIL' !== $id_zone) - $bibs = array_merge($bibs, array_map(fn($elt) => $elt->getId(), - Class_Bib::query() - ->eq('id_zone', $id_zone) - ->fetchAll())); + $filtered = []; + $managed_libraries = array_filter(Class_Users::getIdentity() + ->managedLibraryIds()); - $query = Class_Profil::query(); - if (count($bibs) >= 1) - $query = $query->in('id_site', $bibs); + foreach ($profils as $profil) + if ($profil->hasOneOfManagedLibraries($managed_libraries)) + $filtered[] = $profil; - return $query - ->order('libelle') - ->fetchAll(); + return $filtered; } @@ -403,7 +437,7 @@ class Class_Profil extends Storm_Model_Abstract { 'display_current_profil_on_breadcrumb' => false, 'ref_description' => '', 'ref_tags' => '', - 'id_site' => 0, + 'id_site' => '', 'sel_section' => '', 'sel_annexe' => '', 'sel_type_doc' => '', @@ -2555,6 +2589,29 @@ class Class_Profil extends Storm_Model_Abstract { } + public function hasOneOfManagedLibraries(array $managed_library_ids): bool + { + foreach ($this->getLibraryIds() as $library_id) + if (in_array($library_id, $managed_library_ids)) + return true; + + return false; + } + + + public function setLibraryIds($ids): self + { + $this->setIdSite(implode(' ', explode(';', $ids))); + return $this; + } + + + public function getLibraryIds(): array + { + return explode(' ', $this->getIdSite()); + } + + public function getAlienLoginPage() { return ($login_page = $this->getLoginPage()) && !$this->isMyselfMyOwnLoginPage() diff --git a/library/Class/Profil/ItemsFilter.php b/library/Class/Profil/ItemsFilter.php index 8bc57c361cc75d2d762211033a8755d30d05eac8..3dc810a395314c876e04f4db1520a5171f51e4e5 100644 --- a/library/Class/Profil/ItemsFilter.php +++ b/library/Class/Profil/ItemsFilter.php @@ -22,7 +22,7 @@ class Class_Profil_ItemsFilter { public function select($profil, $items) : array { - $filter_item_from_profil = ['id_bib' => array_filter([$profil->getIdSite()]), + $filter_item_from_profil = ['id_bib' => array_filter($profil->getLibraryIds()), 'annexe' => $profil->getSelAnnexCodes(), 'section' => $profil->getSelSectionIds()]; @@ -46,4 +46,4 @@ class Class_Profil_ItemsFilter { fn($item) => in_array($item->callGetterByAttributeName($item_attribute), $values)); } -} \ No newline at end of file +} diff --git a/library/Class/User/SearchCriteria.php b/library/Class/User/SearchCriteria.php index c3703687f227650457ac06989f0d889c8fd6a3c0..b4ec4de14df9f8a5714de99c6cf8e813b2b70d1c 100644 --- a/library/Class/User/SearchCriteria.php +++ b/library/Class/User/SearchCriteria.php @@ -100,6 +100,37 @@ class Class_User_SearchCriteriaLibrary extends Class_SearchCriteria_Select { +class Class_User_SearchCriteriaMultiLibraries extends Class_User_SearchCriteriaLibrary +{ + + public function buildElement(): ?Zend_Form_Element + { + return new ZendAfi_Form_Element_CochesSuggestion($this->getName(), + ['label' => $this->_('Bibliothèques'), + 'rubrique' => 'libraries', + 'value' => $this->_value]); + } + + + public function acceptSearchVisitor($visitor): Class_SearchCriteria_Abstract + { + if ( ! $this->_isAllValues()) + $visitor->addQueryClause(fn($query) => $query + ->in($this->_name, explode(';', $this->_value))); + + return $this; + } + + + public function modelMatch(Storm_Model_Abstract $user): bool + { + return $this->_isAllValues() || in_array($user->getIdSite(), explode(';', $this->_value)); + } +} + + + + class Class_User_SearchCriteriaSearchFor extends Class_SearchCriteria_Abstract { protected string $_name = 'search_for'; diff --git a/library/Class/UserGroup/Filter.php b/library/Class/UserGroup/Filter.php index 8ffe3340d87386157adfa94834a8289b211d34fc..b1584d625a6742a02bae2c2b76d1787dc2ad9bb3 100644 --- a/library/Class/UserGroup/Filter.php +++ b/library/Class/UserGroup/Filter.php @@ -24,6 +24,8 @@ class Class_UserGroup_Filter extends Class_User_SearchCriteria { public function __construct($params) { parent::__construct($params); $this->replaceCriteria(Class_User_SearchCriteria_RoleLevelLimited::class, - new Class_User_SearchCriteria_RequiredRoleLevel($params)); + new Class_User_SearchCriteria_RequiredRoleLevel($params)) + ->replaceCriteria(Class_User_SearchCriteriaLibrary::class, + new Class_User_SearchCriteriaMultiLibraries($params)); } } diff --git a/library/Class/Users.php b/library/Class/Users.php index 982f28025266186b0e58703a69c511a90da4b7d9..4a6e184632c7e23087e74f2068859ffbcdb094ea 100644 --- a/library/Class/Users.php +++ b/library/Class/Users.php @@ -672,6 +672,13 @@ class Class_Users extends Storm_Model_Abstract { } + public function isModo(): bool + { + return $this->getRoleLevel() == ZendAfi_Acl_AdminControllerRoles::MODO_BIB + || $this->getRoleLevel() == ZendAfi_Acl_AdminControllerRoles::MODO_PORTAIL; + } + + /** * @return bool */ @@ -708,6 +715,12 @@ class Class_Users extends Storm_Model_Abstract { } + public function isAdminBibOrMore(): bool + { + return $this->getRoleLevel() >= ZendAfi_Acl_AdminControllerRoles::ADMIN_BIB; + } + + public function isRedacteurBib(): bool { return $this->getRoleLevel() == ZendAfi_Acl_AdminControllerRoles::MODO_BIB; @@ -2109,7 +2122,7 @@ class Class_Users extends Storm_Model_Abstract { return true; return $this->isAdminBib() - ? ($this->getIdSite() === $profile->getIdSite()) + ? $profile->hasOneOfManagedLibraries($this->managedLibraryIds()) : $this->hasRightConfigFront() ; } diff --git a/library/ZendAfi/Controller/Plugin/DefineURLs.php b/library/ZendAfi/Controller/Plugin/DefineURLs.php index 138c052c8dace69c3295e0d9e77f877809f976ce..1bfc490dc2b53698052e230a362b3fcfdf2f2ba6 100644 --- a/library/ZendAfi/Controller/Plugin/DefineURLs.php +++ b/library/ZendAfi/Controller/Plugin/DefineURLs.php @@ -190,7 +190,7 @@ class ZendAfi_Controller_Plugin_DefineURLs extends Zend_Controller_Plugin_Abstra // Si role admin_site on force la zone et la bib if ((null !== ($user = Class_Users::getLoader()->getIdentity())) && (null !== ($bib = $user->getBib())) - && (!$user->isModoPortailOrMore()) + && (!$user->isAdminBibOrMore()) ) { $id_bib = $bib->getId(); $id_zone = $bib->getIdZone(); diff --git a/library/ZendAfi/Form/Configuration/Profile.php b/library/ZendAfi/Form/Configuration/Profile.php index c1e210080224a60af391ea9879d29952d692a545..c1885adb69d63a8477d6bbd0d0aeeb522bc54fd3 100644 --- a/library/ZendAfi/Form/Configuration/Profile.php +++ b/library/ZendAfi/Form/Configuration/Profile.php @@ -303,9 +303,12 @@ class ZendAfi_Form_Configuration_Profile extends ZendAfi_Form { 'tags_info', ['value' => $this->_('Entrez la liste des mots-clef et expressions qui caractérisent votre site séparés par des virgules.')]) - ->addElement('comboLibraries', - 'id_site', - ['label' => $this->_('Bibliothèque')]) + ->addElement('cochesSuggestion', + 'library_ids', + ['label' => $this->_('Bibliothèque(s)'), + 'name' => 'library_ids', + 'rubrique' => 'libraries', + 'selected_all_means_nothing' => false]) ->addElement('cochesSuggestion', 'sel_annexe', @@ -378,7 +381,7 @@ class ZendAfi_Form_Configuration_Profile extends ZendAfi_Form { 'referencement_group', ['legend' => $this->_('Référencement')]) - ->addDisplayGroup(['id_site', + ->addDisplayGroup(['library_ids', 'sel_annexe', 'sel_section', 'sel_type_doc', @@ -406,4 +409,11 @@ class ZendAfi_Form_Configuration_Profile extends ZendAfi_Form { $datas[$domain->getId()] = $domain->getLibelle(); return $datas; } -} \ No newline at end of file + + public function populate(array $values) : self { + $values['library_ids'] = implode(';', explode(' ', $values['id_site'] ?? '')); + parent::populate($values); + + return $this; + } +} diff --git a/tests/application/modules/admin/controllers/BibControllerTest.php b/tests/application/modules/admin/controllers/BibControllerTest.php index c2548059e88899a71f6e07e56d7e976acf86d25e..f6075c3322089be4c2e2a4fab4888cb8756f938c 100644 --- a/tests/application/modules/admin/controllers/BibControllerTest.php +++ b/tests/application/modules/admin/controllers/BibControllerTest.php @@ -37,6 +37,7 @@ abstract class BibControllerTestCase extends Admin_AbstractControllerTestCase { $profil_cran = $this->fixture(Class_Profil::class, ['id' => 34, + 'id_site' => '2', 'libelle' => 'Cran/Accueil']); $this->fixture(Class_CosmoVar::class, diff --git a/tests/application/modules/admin/controllers/NewsletterControllerTest.php b/tests/application/modules/admin/controllers/NewsletterControllerTest.php index 7270c0a5d8cc90ddd0269f26e4039c52032c0e68..883738502d9c999c969d36fab3dc219ccd5ea0e0 100644 --- a/tests/application/modules/admin/controllers/NewsletterControllerTest.php +++ b/tests/application/modules/admin/controllers/NewsletterControllerTest.php @@ -96,7 +96,7 @@ class Admin_NewsletterControllerIndexActionTest extends Admin_NewsletterControll /** @test */ public function requestsShouldExists() { - $this->assertSql("SELECT `bib_admin_users`.`id_user` AS `id` FROM `bib_admin_users` WHERE (`bib_admin_users`.`id_site` = 1 AND `bib_admin_users`.`role_level` = 2) ORDER BY `bib_admin_users`.`nom` ASC"); + $this->assertSql("SELECT `bib_admin_users`.`id_user` AS `id` FROM `bib_admin_users` WHERE (`bib_admin_users`.`id_site` IN ('1') AND `bib_admin_users`.`role_level` = 2) ORDER BY `bib_admin_users`.`nom` ASC"); } diff --git a/tests/application/modules/admin/controllers/ProfilControllerManagedLibrariesTest.php b/tests/application/modules/admin/controllers/ProfilControllerManagedLibrariesTest.php new file mode 100644 index 0000000000000000000000000000000000000000..1ad49dfe8966fdac31f281c68a1add33b3544d4b --- /dev/null +++ b/tests/application/modules/admin/controllers/ProfilControllerManagedLibrariesTest.php @@ -0,0 +1,531 @@ +<?php +/** + * Copyright (c) 2012-2024, 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 + */ + + +abstract class ProfilControllerManagedLibrariesTestCase extends Admin_AbstractControllerTestCase +{ + public function setUp() + { + parent::setUp(); + + $this->fixture(Class_Bib::class, ['id' => 21, + 'libelle' => 'One']); + + $this->fixture(Class_Bib::class, ['id' => 22, + 'libelle' => 'Two']); + + $this->fixture(Class_Bib::class, ['id' => 23, + 'libelle' => 'Three']); + + $this->fixture(Class_Profil::class, + ['id' => 428, + 'libelle' => 'Accueil MyBibApp', + 'id_site' => '21']); + + $this->fixture(Class_Profil::class, + ['id' => 429, + 'libelle' => 'Ressources numériques', + 'id_site' => '22']); + + $this->fixture(Class_Profil::class, + ['id' => 430, + 'libelle' => 'Accueil principal', + 'id_site' => '21 23']); + + + ZendAfi_Auth::getInstance()->logUser($this->_getLoggedUser()); + } + + + protected function _createLoggedUser(): Class_Users + { + return $this->fixture(Class_Users::class, + ['id' => 1, + 'login' => 'logged_in', + 'password' => 'secret', + 'id_site' => 1, + 'managed_libraries' => '', + 'role_level' => ZendAfi_Acl_AdminControllerRoles::SUPER_ADMIN, + 'last_login' => 0]) + ->addUserGroup($this->_group); + } + + + protected function _getLoggedUser(): Class_Users + { + return $this->_createLoggedUser(); + } +} + + + + +class ProfilControllerManagedLibrariesEditAsSuperAdminTest + extends ProfilControllerManagedLibrariesTestCase +{ + + public function setUp() + { + parent::setUp(); + $this->dispatch('/admin/profil/edit/id_profil/428'); + } + + + /** @test */ + public function multiInputLibraryIdsShouldExist() + { + $this->assertXPath('//input[@name="library_ids"]'); + } + + + /** @test */ + public function libraryOneShouldBeInLibraryIdsElement() + { + $this->assertxpath('//input[@data-clef="21"]'); + } + + + /** @test */ + public function libraryTwoShouldBeInLibraryIdsElement() + { + $this->assertxpath('//input[@data-clef="22"]'); + } +} + + + + +class ProfilControllerManagedLibrariesPostEditAsSuperAdminTest + extends ProfilControllerManagedLibrariesTestCase +{ + + public function setUp() + { + parent::setUp(); + $this->postDispatch('/admin/profil/edit/id_profil/428', + ['libelle' => 'Accueil MyBibApp', + 'library_ids' => '21;22']); + } + + + /** @test */ + public function profileAccueilMybibappShouldHaveLibrayOneAndTwoSpaceSeparated() + { + $this->assertEquals('21 22', Class_Profil::find(428)->getIdSite()); + } +} + + + + +class ProfilControllerManagedLibrariesIndexAsSuperAdminTest + extends ProfilControllerManagedLibrariesTestCase +{ + + public function setUp() + { + parent::setUp(); + $this->dispatch('/admin/profil/index'); + } + + + /** @test */ + public function libraryOneShouldBePresent() + { + $this->assertXPathContentContains('//div[@class="profils"]/h2', 'One'); + } + + + /** @test */ + public function libraryTwoShouldBePresent() + { + $this->assertXPathContentContains('//div[@class="profils"]/h2', 'Two'); + } + + + /** @test */ + public function profilAccueilMybibappShouldBePresent() + { + $this->assertXPathContentContains('//div[@class="profils"]/ul/li/div', + 'Accueil MyBibApp'); + } + + + /** @test */ + public function profilRessourcesNumeriquesShouldBePresent() + { + $this->assertXPathContentContains('//div[@class="profils"]/ul/li/div', + 'Ressources numériques'); + } + + + /** @test */ + public function profilAccueilPrincipalShouldBePresent() + { + $this->assertXPathContentContains('//div[@class="profils"]/ul/li/div', + 'Accueil principal'); + } +} + + + + +class ProfilControllerManagedLibrariesIndexAsModoBibTest + extends ProfilControllerManagedLibrariesTestCase +{ + + public function setUp() + { + parent::setUp(); + + $this->dispatch('/admin/profil/index?z=ALL&b=ALL'); + } + + + protected function _getLoggedUser(): Class_Users + { + return $this->_createLoggedUser() + ->setManagedLibraries('21;22;23') + ->setRoleLevel(ZendAfi_Acl_AdminControllerRoles::MODO_BIB); + } + + + /** @test */ + public function modoBibShouldNotAccessProfilIndex() + { + $this->assertRedirect('/opac/index'); + } +} + + + + +class ProfilControllerManagedLibrariesIndexAsModoPortailTest + extends ProfilControllerManagedLibrariesTestCase +{ + + public function setUp() + { + parent::setUp(); + + $this->dispatch('/admin/profil/index?z=ALL&b=ALL'); + } + + + protected function _getLoggedUser(): Class_Users + { + return $this->_createLoggedUser() + ->setManagedLibraries('21;22;23') + ->setRoleLevel(ZendAfi_Acl_AdminControllerRoles::MODO_PORTAIL); + } + + + /** @test */ + public function modoPortalShouldNotAccessProfilIndex() + { + $this->assertRedirect('/opac/index'); + } +} + + + + +class ProfilControllerManagedLibrariesIndexAsAdminBibTest + extends ProfilControllerManagedLibrariesTestCase +{ + + public function setUp() + { + parent::setUp(); + + $this->dispatch('/admin/profil/index?z=ALL&b=ALL'); + } + + + protected function _getLoggedUser(): Class_Users + { + return $this->_createLoggedUser() + ->setManagedLibraries('22;23') + ->setRoleLevel(ZendAfi_Acl_AdminControllerRoles::ADMIN_BIB); + } + + + /** @test */ + public function libraryOneShouldNotBePresent() + { + $this->assertNotXPathContentContains('//div[@class="profils"]/h2', 'One'); + } + + + /** @test */ + public function libraryTwoShouldBePresent() + { + $this->assertXPathContentContains('//div[@class="profils"]/h2', 'Two'); + } + + + /** @test */ + public function libraryThreeShouldNotBePresent() + { + $this->assertNotXPathContentContains('//div[@class="profils"]/h2', 'Three'); + } + + + /** @test */ + public function profilAccueilMybibappShouldNotBePresent() + { + $this->assertNotXPathContentContains('//div[@class="profils"]/ul/li/div', + 'Accueil MyBibApp'); + } + + + /** @test */ + public function profilRessourcesNumeriquesShouldBePresent() + { + $this->assertXPathContentContains('//div[@class="profils"]/ul/li/div', + 'Ressources numériques'); + } + + + /** @test */ + public function profilAccueilPrincipalShouldBePresent() + { + $this->assertXPathContentContains('//div[@class="profils"]/ul/li/div', + 'Accueil principal'); + } +} + + + + +class ProfilControllerManagedLibrariesIndexAsAdminPortailTest + extends ProfilControllerManagedLibrariesTestCase +{ + + public function setUp() + { + parent::setUp(); + + $this->dispatch('/admin/profil/index?z=ALL&b=ALL'); + } + + + protected function _getLoggedUser(): Class_Users + { + return $this->_createLoggedUser() + ->setManagedLibraries('') + ->setRoleLevel(ZendAfi_Acl_AdminControllerRoles::ADMIN_PORTAIL); + } + + + /** @test */ + public function libraryOneShouldBePresent() + { + $this->assertXPathContentContains('//div[@class="profils"]/h2', 'One'); + } + + + /** @test */ + public function libraryTwoShouldBePresent() + { + $this->assertXPathContentContains('//div[@class="profils"]/h2', 'Two'); + } + + + /** @test */ + public function profilAccueilMybibappShouldBePresent() + { + $this->assertXPathContentContains('//div[@class="profils"]/ul/li/div', + 'Accueil MyBibApp'); + } + + + /** @test */ + public function profilRessourcesNumeriquesShouldBePresent() + { + $this->assertXPathContentContains('//div[@class="profils"]/ul/li/div', + 'Ressources numériques'); + } + + + /** @test */ + public function profilAccueilPrincipalShouldBePresent() + { + $this->assertXPathContentContains('//div[@class="profils"]/ul/li/div', + 'Accueil principal'); + } +} + + + + +class ProfilControllerManagedLibrariesEditAsModoBibTest + extends ProfilControllerManagedLibrariesTestCase +{ + + protected function _getLoggedUser(): Class_Users + { + return $this->_createLoggedUser() + ->setManagedLibraries('21;22;23') + ->setRoleLevel(ZendAfi_Acl_AdminControllerRoles::MODO_BIB); + } + + + /** @test */ + public function userShouldEditAccueilMybibapp() + { + $this->dispatch('/admin/profil/edit/id_profil/428'); + $this->assertRedirect('/opac/index'); + } + + + /** @test */ + public function userShouldEditRessourceNumerique() + { + $this->dispatch('/admin/profil/edit/id_profil/429'); + $this->assertRedirect('/opac/index'); + } + + + /** @test */ + public function userShouldEditAccueilPrincipal() + { + $this->dispatch('/admin/profil/edit/id_profil/430'); + $this->assertRedirect('/opac/index'); + } +} + + + + +class ProfilControllerManagedLibrariesEditAsAdminBibTest + extends ProfilControllerManagedLibrariesTestCase +{ + + protected function _getLoggedUser(): Class_Users + { + return $this->_createLoggedUser() + ->setManagedLibraries('21;23') + ->setRoleLevel(ZendAfi_Acl_AdminControllerRoles::ADMIN_BIB); + } + + + /** @test */ + public function userShouldEditAccueilMybibapp() + { + $this->dispatch('/admin/profil/edit/id_profil/428'); + $this->assertXPath('//form[@action="/admin/profil/edit/id_profil/428"]'); + } + + + /** @test */ + public function userShouldEditRessourceNumerique() + { + $this->dispatch('/admin/profil/edit/id_profil/429'); + $this->assertRedirect('/opac/index'); + } + + + /** @test */ + public function userShouldEditAccueilPrincipal() + { + $this->dispatch('/admin/profil/edit/id_profil/430'); + $this->assertXPath('//form[@action="/admin/profil/edit/id_profil/430"]'); + } +} + + + + +class ProfilControllerManagedLibrariesEditAsModoPortailTest + extends ProfilControllerManagedLibrariesTestCase +{ + + protected function _getLoggedUser(): Class_Users + { + return $this->_createLoggedUser() + ->setManagedLibraries('21;22;23') + ->setRoleLevel(ZendAfi_Acl_AdminControllerRoles::MODO_PORTAIL); + } + + + /** @test */ + public function userShouldEditAccueilMybibapp() + { + $this->dispatch('/admin/profil/edit/id_profil/428'); + $this->assertRedirect('/opac/index'); + } + + + /** @test */ + public function userShouldEditRessourceNumerique() + { + $this->dispatch('/admin/profil/edit/id_profil/429'); + $this->assertRedirect('/opac/index'); + } + + + /** @test */ + public function userShouldEditAccueilPrincipal() + { + $this->dispatch('/admin/profil/edit/id_profil/430'); + $this->assertRedirect('/opac/index'); + } +} + + + + +class ProfilControllerManagedLibrariesEditAsAdminPortailTest + extends ProfilControllerManagedLibrariesTestCase +{ + + protected function _getLoggedUser(): Class_Users + { + return $this->_createLoggedUser() + ->setManagedLibraries('21;22;23') + ->setRoleLevel(ZendAfi_Acl_AdminControllerRoles::ADMIN_PORTAIL); + } + + + /** @test */ + public function userShouldEditAccueilMybibapp() + { + $this->dispatch('/admin/profil/edit/id_profil/428'); + $this->assertXPath('//form[@action="/admin/profil/edit/id_profil/428"]'); + } + + + /** @test */ + public function userShouldEditRessourceNumerique() + { + $this->dispatch('/admin/profil/edit/id_profil/429'); + $this->assertXPath('//form[@action="/admin/profil/edit/id_profil/429"]'); + } + + + /** @test */ + public function userShouldEditAccueilPrincipal() + { + $this->dispatch('/admin/profil/edit/id_profil/430'); + $this->assertXPath('//form[@action="/admin/profil/edit/id_profil/430"]'); + } +} diff --git a/tests/application/modules/admin/controllers/ProfilControllerTest.php b/tests/application/modules/admin/controllers/ProfilControllerTest.php index 54a91eb543e3d01b0bd045d89d302da55369e1d7..9b8194b76e7f0a18a95d77cd42fe72351b8df891 100644 --- a/tests/application/modules/admin/controllers/ProfilControllerTest.php +++ b/tests/application/modules/admin/controllers/ProfilControllerTest.php @@ -174,7 +174,7 @@ class Admin_ProfilControllerEditProfilJeunesseTest extends Admin_ProfilControlle /** @test */ public function shouldDisplayBibSelection() { - $this->assertXPath('//select[@name="id_site"]'); + $this->assertXPath('//input[@name="library_ids"]'); } @@ -1577,13 +1577,15 @@ class Admin_ProfilControllerEditLibraryFilterTest extends Admin_AbstractControll ['id' => 12, 'libelle' => 'Haute-Savoie'])]); + Class_Profil::find(1)->setIdSite('9')->assertSave(); + $this->dispatch('/admin/profil/edit/id_profil/1', true); } /** @test */ public function annecyFilterShouldBePresent() { - $this->assertXPathContentContains('//select[@name="id_site"]//option[@value="9"]', + $this->assertXPathContentContains('//div[@id="library_ids_aff"]/span[@class="selected"]', 'Annecy'); } } diff --git a/tests/application/modules/admin/controllers/UserGroupControllerTest.php b/tests/application/modules/admin/controllers/UserGroupControllerTest.php index 3d13fa3979ca20537cdc0660846499806d018fb7..2573205d318f5555d550d1643ab1ea2672b99c3c 100644 --- a/tests/application/modules/admin/controllers/UserGroupControllerTest.php +++ b/tests/application/modules/admin/controllers/UserGroupControllerTest.php @@ -258,7 +258,7 @@ class Admin_UserGroupControllerIndexTest extends Admin_UserGroupControllerTestCa public function requestShouldExists() { $this->assertSqlEquals(["SELECT `int_bib`.`sigb`, `int_bib`.`comm_params` FROM `int_bib` WHERE (`int_bib`.`sigb` != 0) GROUP BY `int_bib`.`sigb`, `int_bib`.`comm_params`", "SELECT COUNT(*) AS `numberof` FROM `bib_admin_users`", - "SELECT COUNT(*) AS `numberof` FROM `bib_admin_users` WHERE (`bib_admin_users`.`id_site` = '9' AND `bib_admin_users`.`role_level` = '3')"]); + "SELECT COUNT(*) AS `numberof` FROM `bib_admin_users` WHERE (`bib_admin_users`.`id_site` IN ('9') AND `bib_admin_users`.`role_level` = '3')"]); } @@ -753,13 +753,13 @@ class Admin_UserGroupControllerEditGroupModerateursBibTest /** @test */ public function librarySelectShouldBePresent() { - $this->assertXPath('//select[@name="search_id_site"]'); + $this->assertXPath('//input[@name="search_id_site"]'); } /** @test */ public function librarySelectShouldHaveAnnecySelected() { - $this->assertXPath('//select[@name="search_id_site"]//option[@value="9"][@selected="selected"]'); + $this->assertXPathContentContains('//div[@id="search_id_site_aff"]/span', 'Annecy'); } } @@ -1645,6 +1645,102 @@ class Admin_UserGroupControllerEditMembersWithPaginationAsAutomaticUserGroupTest +class Admin_UserGroupControllerEditMembersWithMultiLibrariesDynamicUserGroupTest + extends Admin_AbstractControllerTestCase { + + public function setup() { + parent::setup(); + + $this->fixture(Class_Users::class, + ['id' => 10001, + 'idabon' => 10001, + 'nom' => 'User 10001', + 'login' => 'user10001', + 'last_login' => '', + 'password' => 'secret', + 'id_site' => 20001, + 'role_level' => ZendAfi_Acl_AdminControllerRoles::ABONNE_SIGB]); + + $this->fixture(Class_Users::class, + ['id' => 10002, + 'idabon' => 10002, + 'nom' => 'User 10002', + 'login' => 'user10002', + 'last_login' => '', + 'password' => 'secret', + 'id_site' => 20002, + 'role_level' => ZendAfi_Acl_AdminControllerRoles::ABONNE_SIGB]); + + $this->fixture(Class_Users::class, + ['id' => 10003, + 'idabon' => 10003, + 'nom' => 'User 10003', + 'login' => 'user10003', + 'last_login' => '', + 'password' => 'secret', + 'id_site' => 20001, + 'role_level' => ZendAfi_Acl_AdminControllerRoles::MODO_BIB]); + + $this->fixture(Class_Users::class, + ['id' => 10004, + 'idabon' => 10004, + 'nom' => 'User 10004', + 'login' => 'user10004', + 'last_login' => '', + 'password' => 'secret', + 'id_site' => 20003, + 'role_level' => ZendAfi_Acl_AdminControllerRoles::ABONNE_SIGB]); + + $this->fixture(Class_UserGroup::class, + ['id' => 1, + 'protected' => false, + 'libelle' => "Group", + 'group_type' => Class_UserGroup::TYPE_DYNAMIC, + 'filters' => json_encode(['search_role_level' => ZendAfi_Acl_AdminControllerRoles::ABONNE_SIGB, + 'search_id_site' => '20001;20002'])]); + + $this->dispatch('admin/usergroup/editmembers/id/1'); + } + + + /** @test */ + public function nb2UsersShouldBeDisplay() { + $this->assertXPathContentContains('//div','2 utilisateurs'); + } + + + /** @test */ + public function user10001ShouldBeDisplayed() + { + $this->assertXPathContentContains('//tbody/tr/td', 'User 10001'); + } + + + /** @test */ + public function user10002ShouldBeDisplayed() + { + $this->assertXPathContentContains('//tbody/tr/td', 'User 10002'); + } + + + /** @test */ + public function user10003ShouldNotBeDisplayed() + { + $this->assertNotXPathContentContains('//tbody/tr/td', 'User 10003'); + } + + + /** @test */ + public function user10004ShouldNotBeDisplayed() + { + $this->assertNotXPathContentContains('//tbody/tr/td', 'User 10004'); + } +} + + + + + class Admin_UserGroupControllerEditMembersNewsletterDedicatedUserGroupTest extends Admin_AbstractControllerTestCase { diff --git a/tests/application/modules/admin/controllers/UsersControllerDynamicGroupsTest.php b/tests/application/modules/admin/controllers/UsersControllerDynamicGroupsTest.php new file mode 100644 index 0000000000000000000000000000000000000000..adb9d0a29503cf405e37ffb018f2bfc75036bc58 --- /dev/null +++ b/tests/application/modules/admin/controllers/UsersControllerDynamicGroupsTest.php @@ -0,0 +1,109 @@ +<?php +/** + * Copyright (c) 2012-2024, 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 + */ + + +abstract class UsersControllerDynamicGroupsTestCase extends Admin_AbstractControllerTestCase +{ + + public function setUp() + { + parent::setUp(); + + $this->fixture(Class_UserGroupCategorie::class, + ['id' => 1001, + 'libelle' => 'Etablissement', + 'parent_id' => 0]); + + $this->fixture(Class_UserGroup::class, + ['id' => 101, + 'id_cat' => 1001, + 'protected' => false, + 'libelle' => 'Admin portail', + 'group_type' => Class_UserGroup::TYPE_DYNAMIC, + 'users' => [], + 'rights' => [], + 'filters' => json_encode(['search_role_level' => '6', + 'search_id_site' => '1;2'])]); + + $this->fixture(Class_UserGroup::class, + ['id' => 102, + 'id_cat' => 1001, + 'protected' => false, + 'libelle' => 'Admin bibliothèque', + 'group_type' => Class_UserGroup::TYPE_DYNAMIC, + 'users' => [], + 'rights' => [], + 'filters' => json_encode(['search_role_level' => '4', + 'search_id_site' => '3'])]); + + $this->fixture(Class_UserGroup::class, + ['id' => 103, + 'id_cat' => 1001, + 'protected' => false, + 'libelle' => 'Contributeurs', + 'group_type' => Class_UserGroup::TYPE_DYNAMIC, + 'users' => [], + 'rights' => [], + 'filters' => json_encode(['search_id_site' => '1'])]); + } + + + protected function _jsonContainsGroup(string $group_name): bool + { + $response = json_decode($this->_response->getBody()); + foreach ($response[0]->categories[0]->items as $group) + if ($group->label == $group_name) + return true; + + return false; + } +} + + + + +class UsersControllerDynamicGroupsAdminPortailTest extends UsersControllerDynamicGroupsTestCase +{ + + public function setUp() + { + parent::setUp(); + + $this->fixture(Class_Users::class, + ['id' => 201, + 'nom' => 'User 201', + 'last_login' => '', + 'idabon' => 201, + 'login' => 'user201', + 'password' => 'secret', + 'id_site' => 1, + 'role_level' => ZendAfi_Acl_AdminControllerRoles::ADMIN_PORTAIL]); + + $this->dispatch('/admin/users/edit/id/201'); + } + + + /** @test */ + public function user201ShouldBeMemberOfGroupAdminPortailAndContributeurs() + { + $this->assertXPath('//input[@id="user_group_ids"][@value="101-103"]'); + } +} diff --git a/tests/application/modules/opac/controllers/CmsControllerCalendarActionTest.php b/tests/application/modules/opac/controllers/CmsControllerCalendarActionTest.php index 3d184848dace299a7aca0c9cde121c90bc5ad2be..ccc3aa881895d73c7d175db9675c7267447bac50 100644 --- a/tests/application/modules/opac/controllers/CmsControllerCalendarActionTest.php +++ b/tests/application/modules/opac/controllers/CmsControllerCalendarActionTest.php @@ -48,6 +48,7 @@ abstract class CmsControllerCalendarActionTestCase ['id' => 3, 'browser' => 'opac', 'libelle' => 'Rendez-vous', + 'id_site' => '1 2', 'cfg_accueil' => $this->cfg_accueil]); Class_AdminVar::newInstanceWithId('CACHE_ACTIF', @@ -236,7 +237,7 @@ class CmsControllerCalendarActionWithMultipleFiltersTest $common_preferences = ['display_order' => 'EventDebut', 'id_categorie' => '12-2', 'events_only' => true, - 'id_bib' => 0, + 'id_bib' => [1, 2], 'id_lieu' => '', 'published' =>true, ]; @@ -258,6 +259,7 @@ class CmsControllerCalendarActionWithMultipleFiltersTest ->answers([$this->_permaculture]) ->whenCalled('getArticlesByPreferences') ->with(array_merge($common_preferences, ['event_date' => '', + 'id_categorie' => '12-2', 'custom_fields' => [2 => [0 => 'culture'], 20 => [0 => 'jardinage']], 'event_start_after' => '2014-07', @@ -321,7 +323,7 @@ abstract class CmsControllerCalendarActionWithFiltersTestCase $this->_common_preferences = ['display_order' => 'EventDebut', 'id_categorie' => '12-2', 'events_only' => true, - 'id_bib' => 0, + 'id_bib' => [1, 2], 'id_lieu' => '', 'custom_fields' => [2 =>[0 => $this->getSetupValueIdForString('opac')]], 'published' => true]; @@ -592,7 +594,7 @@ class CmsControllerCalendarActionWithDayTest extends AbstractControllerTestCase 'id_categorie' => '', 'events_only' => true, 'event_date' => '2014-09', - 'id_bib' => 0, + 'id_bib' => [1, 2], 'id_lieu' => '', 'custom_fields' => [], 'published' => true]) @@ -603,7 +605,7 @@ class CmsControllerCalendarActionWithDayTest extends AbstractControllerTestCase 'id_categorie' => '', 'events_only' => true, 'event_date' => '2014-09', - 'id_bib' => 0, + 'id_bib' => [1, 2], 'id_lieu' => '', 'custom_fields' => [], 'published' => true, @@ -615,7 +617,7 @@ class CmsControllerCalendarActionWithDayTest extends AbstractControllerTestCase 'id_categorie' => '', 'events_only' => true, 'event_date' => '', - 'id_bib' => 0, + 'id_bib' => [1, 2], 'id_lieu' => '', 'custom_fields' => [], 'published' => true, @@ -629,7 +631,7 @@ class CmsControllerCalendarActionWithDayTest extends AbstractControllerTestCase 'id_categorie' => '', 'events_only' => true, 'event_date' => '2014-09-30', - 'id_bib' => 0, + 'id_bib' => [1, 2], 'id_lieu' => '', 'custom_fields' => [], 'published' => true]) @@ -1471,7 +1473,7 @@ class CmsControllerCalendarActionWithOutDateTest extends AbstractControllerTestC 'id_categorie' => '', 'events_only' => true, 'event_date' => '2014-09', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'published' => true, @@ -1483,7 +1485,7 @@ class CmsControllerCalendarActionWithOutDateTest extends AbstractControllerTestC 'id_categorie' => '', 'events_only' => true, 'event_date' => '', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'published' => true, @@ -1496,7 +1498,7 @@ class CmsControllerCalendarActionWithOutDateTest extends AbstractControllerTestC 'id_categorie' => '', 'events_only' => true, 'event_date' => '2014-09', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'published' => true]) @@ -1613,7 +1615,7 @@ class CmsControllerCalenderWithAllCatSelectedAndIdCategorieSetTest 'id_categorie' => '12-2', 'events_only' => true, 'event_date' => '2018-09', - 'id_bib' => 0, + 'id_bib' => [1, 2], 'id_lieu' => '', 'custom_fields' => [], 'published' => true, @@ -1673,7 +1675,7 @@ class CmsControllerCalenderWithAllCatSelectedAndIdCategorieEmptyTest 'id_categorie' => '', 'events_only' => true, 'event_date' => '2018-09', - 'id_bib' => 0, + 'id_bib' => [1, 2], 'id_lieu' => '', 'custom_fields' => [], 'published' => true, @@ -1713,7 +1715,7 @@ class CmsControllerCalendarActionWithFiltersTagTest 'id_categorie' => '12-2', 'events_only' => true, 'event_date' => '2011-02', - 'id_bib' => 0, + 'id_bib' => [1, 2], 'id_lieu' => '', 'custom_fields' => [], 'published' => false]) @@ -1725,7 +1727,7 @@ class CmsControllerCalendarActionWithFiltersTagTest 'id_categorie' => '12-2', 'events_only' => true, 'event_date' => '', - 'id_bib' => 0, + 'id_bib' => [1, 2], 'id_lieu' => '', 'custom_fields' => [], 'published' => false, diff --git a/tests/application/modules/opac/controllers/ProfilOptionsControllerTest.php b/tests/application/modules/opac/controllers/ProfilOptionsControllerTest.php index ae741d95df5f2c459e7e062e275810b035c70736..1e8cd2fab290a61c6e38c92d7a8bf085c1532ad6 100644 --- a/tests/application/modules/opac/controllers/ProfilOptionsControllerTest.php +++ b/tests/application/modules/opac/controllers/ProfilOptionsControllerTest.php @@ -2569,7 +2569,7 @@ class ProfilOptionsControllerProfilBoiteCalendarWithFilterOnMonthsTest 'id_categorie' => '', 'events_only' => true, 'event_date' => '2050-03', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'published' => true]) @@ -2617,7 +2617,7 @@ class ProfilOptionsControllerProfilBoiteCalendarWithNoFilterTest 'id_categorie' => '', 'events_only' => true, 'event_date' => '2050-03', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'published' => true, @@ -2629,7 +2629,7 @@ class ProfilOptionsControllerProfilBoiteCalendarWithNoFilterTest 'id_categorie' => '', 'events_only' => true, 'event_date' => '', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'published' => true, @@ -2687,7 +2687,7 @@ class ProfilOptionsControllerWidgetCalendarWithDisplayFullPageDeactivateShouldUs 'id_categorie' => '', 'events_only' => true, 'event_date' => '2050-03', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'published' => true, @@ -2699,7 +2699,7 @@ class ProfilOptionsControllerWidgetCalendarWithDisplayFullPageDeactivateShouldUs 'id_categorie' => '', 'events_only' => true, 'event_date' => '', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'published' => true, @@ -2712,7 +2712,7 @@ class ProfilOptionsControllerWidgetCalendarWithDisplayFullPageDeactivateShouldUs 'id_categorie' => '', 'events_only' => true, 'event_date' => '2050-03', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'published' => true]) diff --git a/tests/library/Class/ArticleLoaderTest.php b/tests/library/Class/ArticleLoaderTest.php index f9b2a94a6af3fd97929526b3204d4d27084c283f..72c10b746a6823d163d535f094976ee7c8b8390f 100644 --- a/tests/library/Class/ArticleLoaderTest.php +++ b/tests/library/Class/ArticleLoaderTest.php @@ -253,9 +253,9 @@ class ArticleLoaderGetArticlesByPreferencesTest 'id_items' => '', 'id_categorie' => '', 'event_date' => '2011-03', - 'id_bib' => 5]); + 'id_bib' => ['5']]); - $this->assertSelect(sprintf("INNER JOIN `cms_categorie` ON cms_categorie.ID_CAT = cms_article.ID_CAT WHERE %s AND (cms_categorie.ID_SITE=5) AND (left(EVENTS_DEBUT,7) <= '2011-03') AND (left(EVENTS_FIN,7) >= '2011-03') AND (PARENT_ID=0) ORDER BY `DATE_CREATION` DESC", + $this->assertSelect(sprintf("INNER JOIN `cms_categorie` ON cms_categorie.ID_CAT = cms_article.ID_CAT WHERE %s AND (cms_categorie.ID_SITE IN ('5')) AND (left(EVENTS_DEBUT,7) <= '2011-03') AND (left(EVENTS_FIN,7) >= '2011-03') AND (PARENT_ID=0) ORDER BY `DATE_CREATION` DESC", self::WHERE_VISIBLE_CLAUSE)); } @@ -314,6 +314,14 @@ class ArticleLoaderGetArticlesByPreferencesTest $this->assertSelect('WHERE (PARENT_ID=0) ORDER BY `DATE_CREATION` DESC'); } + + + /** @test */ + public function withIdSiteOneAndTwoShouldFilterWithIn() + { + $this->getArticles(['id_bib' => ['1', '2']]); + $this->assertSelect("INNER JOIN `cms_categorie` ON cms_categorie.ID_CAT = cms_article.ID_CAT WHERE ((DEBUT IS NULL) OR (DEBUT <= CURDATE())) AND ((FIN IS NULL) OR (FIN >= CURDATE())) AND (cms_categorie.ID_SITE IN ('1','2')) AND (PARENT_ID=0) ORDER BY `DATE_CREATION` DESC"); + } } diff --git a/tests/library/Class/ProfilTest.php b/tests/library/Class/ProfilTest.php index 4990f7956179b6fe634618fb52989d606015401f..88ea6f23d333778d5bad2d0eb12489cc62f00d09 100644 --- a/tests/library/Class/ProfilTest.php +++ b/tests/library/Class/ProfilTest.php @@ -1828,36 +1828,46 @@ class ProfilfindByZoneAndBibsTest extends ModelTestCase { 'libelle' => 'BaskerVille', 'id_zone' => 1 ]); + + $abon = $this->fixture(Class_Users::class, + ['id' => 1826, + 'login' => 'huguette', + 'password' => 'secret', + 'id_site' => 1, + 'managed_libraries' => '1;3;4', + 'role_level' => ZendAfi_Acl_AdminControllerRoles::ADMIN_BIB]); + + ZendAfi_Auth::getInstance()->logUser($abon); } /** @test */ - public function withBibs2And3FindByZoneAndBibsCountshouldEquals2() { - $profils = Class_Profil::findByZoneAndBibs(0, [2,3]); - $this->assertEquals(2, count($profils)); + public function withManagedLibrariesOneThreeAndFourShouldGetThreeProfiles() { + $profils = Class_Profil::findAllByZoneAndBib(0, 0); + $this->assertEquals(3, count($profils)); return $profils; } /** @test - * @depends withBibs2And3FindByZoneAndBibsCountshouldEquals2 + * @depends withManagedLibrariesOneThreeAndFourShouldGetThreeProfiles */ public function firstProfilReturnedIdShouldBe5($profils) { - $this->assertEquals(5, $profils[0]->getId()); + $this->assertEquals(3, $profils[0]->getId()); } /** @test - * @depends withBibs2And3FindByZoneAndBibsCountshouldEquals2 + * @depends withManagedLibrariesOneThreeAndFourShouldGetThreeProfiles */ public function secondProfilReturnedIdShouldBe3($profils) { - $this->assertEquals(3, $profils[1]->getId()); + $this->assertEquals(2, $profils[1]->getId()); } /** @test */ public function withIdZone1FindByZoneAndBibsCountshouldEquals2() { - $profils = Class_Profil::findByZoneAndBibs(1, []); + $profils = Class_Profil::findAllByZoneAndBib(1, 0); $this->assertEquals(2, count($profils)); return $profils; } diff --git a/tests/library/ZendAfi/View/Helper/Accueil/CalendarTest.php b/tests/library/ZendAfi/View/Helper/Accueil/CalendarTest.php index d950d359270c312e0573425a681989e8ffb57eac..8d0ab772360f9a0cca457adf07cee7acf5f9b5c4 100644 --- a/tests/library/ZendAfi/View/Helper/Accueil/CalendarTest.php +++ b/tests/library/ZendAfi/View/Helper/Accueil/CalendarTest.php @@ -146,7 +146,7 @@ abstract class CalendarViewTodayTestCase extends CalendarWithEmptyPreferencesTes 'event_date' => '2013-08', 'event_end_after' => '2013-08-19', 'events_only' => true, - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'published' => true]) @@ -158,7 +158,7 @@ abstract class CalendarViewTodayTestCase extends CalendarWithEmptyPreferencesTes 'id_categorie' => '', 'event_date' => '2013-08', 'events_only' => true, - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'published' => true]) @@ -405,7 +405,7 @@ class CalendarWithPreferencesNbEventsOneTest extends CalendarWithEmptyPreference 'id_categorie' => '', 'event_end_after' => '2013-08-19', 'event_date' => '2013-08', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'events_only' => true, @@ -416,7 +416,7 @@ class CalendarWithPreferencesNbEventsOneTest extends CalendarWithEmptyPreference ->with(['display_order' => 'EventDebut', 'id_categorie' => '', 'event_date' => '2013-08', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'events_only' => true, @@ -470,7 +470,7 @@ class CalendarWithEmptyParamsLocaleEnAndOnlyTwoArticlesReturnedTest 'id_categorie' => '', 'event_date' => '2013-08', 'event_end_after' => '2013-08-19', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'events_only' => true, @@ -481,7 +481,7 @@ class CalendarWithEmptyParamsLocaleEnAndOnlyTwoArticlesReturnedTest ->with(['display_order' => 'EventDebut', 'id_categorie' => '', 'event_start_after' => '2013-09', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'events_only' => true, @@ -540,7 +540,7 @@ class CalendarWithCategoryLimitAndBibPreferencesTest extends CalendarViewHelperT 'display_order' => 'DebutPublicationDesc', 'id_categorie' => '12-3', 'event_date' => '2011-03', - 'id_bib' => 5, + 'id_bib' => ['5'], 'id_lieu' => '', 'custom_fields' => [], 'events_only' => true, @@ -553,7 +553,7 @@ class CalendarWithCategoryLimitAndBibPreferencesTest extends CalendarViewHelperT 'id_categorie' => '12-3', 'events_only' => true, 'event_date' => '2011-03-17', - 'id_bib' => 5, + 'id_bib' => ['5'], 'id_lieu' => '', 'custom_fields' => [], 'published' => false @@ -661,7 +661,7 @@ class CalendarWithWorkFlowStatusTest extends CalendarWithEmptyPreferencesTestCas 'id_categorie' => '', 'event_end_after' => '2013-08-19', 'event_date' => '2013-08', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'events_only' => true, @@ -674,7 +674,7 @@ class CalendarWithWorkFlowStatusTest extends CalendarWithEmptyPreferencesTestCas 'display_order' => 'EventDebut', 'id_categorie' => '', 'event_date' => '2013-08', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'events_only' => true, @@ -690,7 +690,7 @@ class CalendarWithWorkFlowStatusTest extends CalendarWithEmptyPreferencesTestCas 'event_date' => '', 'event_end_after' => '', 'events_only' => true, - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'published' => true @@ -749,7 +749,7 @@ class CalendarWithCategorySelectorAndRssAndICalPreferencesTest extends CalendarV ->with(['display_order' => 'EventDebut', 'id_categorie' => '12', 'event_date' => '2011-12', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'events_only' => true, @@ -762,7 +762,7 @@ class CalendarWithCategorySelectorAndRssAndICalPreferencesTest extends CalendarV ->with(['display_order' => 'EventDebut', 'id_categorie' => '12', 'event_date' => '2011-12-25', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'events_only' => true, @@ -859,7 +859,7 @@ class CalendarWithCategorySelectorButNoSelectedCategoriesTest ->with(['display_order' => 'EventDebut', 'id_categorie' => '', 'event_date' => '2011-12', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'events_only' => true, @@ -872,7 +872,7 @@ class CalendarWithCategorySelectorButNoSelectedCategoriesTest 'display_order' => 'EventDebut', 'id_categorie' => '', 'event_date' => '2011-12-25', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'events_only' => true, @@ -960,7 +960,7 @@ class CalendarOnJanuaryWithDisplayNextEventTrueTest extends CalendarViewHelperTe 'id_categorie' => '', 'events_only' => true, 'event_date' => '2012-01', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'published' => false @@ -1029,7 +1029,7 @@ class CalendarOnJanuaryWithDisplayNextEventFalseTest extends CalendarViewHelperT 'id_categorie' => '', 'events_only' => true, 'event_date' => '2012-01', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'published' => false diff --git a/tests/scenarios/ArticlesMultipleTimings/ArticlesMultipleTimingsCalendarTest.php b/tests/scenarios/ArticlesMultipleTimings/ArticlesMultipleTimingsCalendarTest.php index 8b33f8208a6f2e31728c57879b6d688aa4d783db..ad04af098c3d3f912a59a1ddc7f84ed59afd3979 100644 --- a/tests/scenarios/ArticlesMultipleTimings/ArticlesMultipleTimingsCalendarTest.php +++ b/tests/scenarios/ArticlesMultipleTimings/ArticlesMultipleTimingsCalendarTest.php @@ -95,7 +95,7 @@ abstract class ArticlesMultipleTimingsCalendarTestCase extends AbstractControlle 'id_categorie' => '', 'events_only' => true, 'event_date' => '2021-06', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'published' => true, @@ -108,7 +108,7 @@ abstract class ArticlesMultipleTimingsCalendarTestCase extends AbstractControlle 'id_categorie' => '', 'events_only' => true, 'event_date' => '', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'published' => true, @@ -125,7 +125,7 @@ abstract class ArticlesMultipleTimingsCalendarTestCase extends AbstractControlle 'id_categorie' => '', 'events_only' => true, 'event_date' => '', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'published' => true, @@ -143,7 +143,7 @@ abstract class ArticlesMultipleTimingsCalendarTestCase extends AbstractControlle 'id_categorie' => '', 'events_only' => true, 'event_date' => '2021-06', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'published' => true]) diff --git a/tests/scenarios/Templates/TemplatesAgendaTest.php b/tests/scenarios/Templates/TemplatesAgendaTest.php index 3f1c9fb33412b07670a1bfab4b0eb20a7bd6b6e4..ea1485c527f4e4554083971035f1561246776199 100644 --- a/tests/scenarios/Templates/TemplatesAgendaTest.php +++ b/tests/scenarios/Templates/TemplatesAgendaTest.php @@ -313,7 +313,7 @@ class TemplatesAgendaWallModeNoDateFilterTestCase 'id_categorie' => '', 'events_only' => true, 'event_date' => '2021-11', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'published' => true, @@ -325,7 +325,7 @@ class TemplatesAgendaWallModeNoDateFilterTestCase 'id_categorie' => '', 'events_only' => true, 'event_date' => '', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'published' => true, @@ -338,7 +338,7 @@ class TemplatesAgendaWallModeNoDateFilterTestCase 'id_categorie' => '', 'events_only' => true, 'event_date' => '2021-11', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'published' => true]) @@ -382,7 +382,7 @@ class TemplatesAgendaWallModeNoDateFilterAndNoEventTest 'id_categorie' => '', 'events_only' => true, 'event_date' => '2021-11', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'published' => true, @@ -394,7 +394,7 @@ class TemplatesAgendaWallModeNoDateFilterAndNoEventTest 'id_categorie' => '', 'events_only' => true, 'event_date' => '', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'published' => true, @@ -407,7 +407,7 @@ class TemplatesAgendaWallModeNoDateFilterAndNoEventTest 'id_categorie' => '', 'events_only' => true, 'event_date' => '2021-11', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'published' => true]) @@ -440,7 +440,7 @@ class TemplatesAgendaWallModeSelectedMonthIsCurrentMonthTest 'id_categorie' => '', 'events_only' => true, 'event_date' => '2021-11', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'published' => true]) @@ -487,7 +487,7 @@ class TemplatesAgendaWallModeSelectedMonthIsCurrentMonthNoEventsTest 'id_categorie' => '', 'events_only' => true, 'event_date' => '2021-11', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'published' => true]) @@ -498,7 +498,7 @@ class TemplatesAgendaWallModeSelectedMonthIsCurrentMonthNoEventsTest 'id_categorie' => '', 'events_only' => true, 'event_date' => '', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'published' => true, @@ -534,7 +534,7 @@ class TemplatesAgendaWallModeSelectedMonthIsCurrentMonthEventsInNextMonthTest 'id_categorie' => '', 'events_only' => true, 'event_date' => '2021-11', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'published' => true]) @@ -545,7 +545,7 @@ class TemplatesAgendaWallModeSelectedMonthIsCurrentMonthEventsInNextMonthTest 'id_categorie' => '', 'events_only' => true, 'event_date' => '', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'published' => true, @@ -580,7 +580,7 @@ class TemplatesAgendaWallModeSelectedMonthNextMonthTest 'id_categorie' => '', 'events_only' => true, 'event_date' => '2021-12', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'published' => true]) @@ -626,7 +626,7 @@ class TemplatesAgendaWallModeSelectedMonthNextMonthNoEventTest 'id_categorie' => '', 'events_only' => true, 'event_date' => '2021-12', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'published' => true]) @@ -637,7 +637,7 @@ class TemplatesAgendaWallModeSelectedMonthNextMonthNoEventTest 'id_categorie' => '', 'events_only' => true, 'event_date' => '', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'published' => true, @@ -678,7 +678,7 @@ class TemplatesAgendaWallModeSelectedMonthIsCurrentMonthArticleWithoutEndDateTes 'id_categorie' => '', 'events_only' => true, 'event_date' => '2021-11', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'published' => true]) diff --git a/tests/scenarios/Templates/TemplatesSearchItemsTest.php b/tests/scenarios/Templates/TemplatesSearchItemsTest.php index 969ed306da804fb9b7b763d8c9161ed84ef5d864..fb00108ae1663e445e431b086c6167ef2ebeb49e 100644 --- a/tests/scenarios/Templates/TemplatesSearchItemsTest.php +++ b/tests/scenarios/Templates/TemplatesSearchItemsTest.php @@ -156,7 +156,7 @@ class TemplatesSearchItemsViewNoticeInSectionDocumentItemsTest Class_Profil::find(1)->setIdSite(23)->assertSave(); ZendAfi_Auth::getInstance()->logUser(Class_Users::newInstanceWithId(54) - ->setIdSite(23) + ->setManagedLibraries(23) ->beAdminBib()); $this->dispatch('/opac/recherche/viewnotice/id/456/id_profil/1'); $this->assertXPath('//div[contains(@class, "wrapper_document_items")]/a[@href="/admin/modulesnotice/exemplaires/id_profil/1"]'); diff --git a/tests/scenarios/Templates/TemplatesWidgetTest.php b/tests/scenarios/Templates/TemplatesWidgetTest.php index c7bd71e46abc8b89a0678e7ec124c03272a83958..29f6383c2e202e67ecee1a71bd4c8456dd77dc6f 100644 --- a/tests/scenarios/Templates/TemplatesWidgetTest.php +++ b/tests/scenarios/Templates/TemplatesWidgetTest.php @@ -288,7 +288,7 @@ class TemplatesWidgetFilterTest extends TemplatesWidgetRenderAllTestCase { 'id_categorie' => '', 'events_only' => true, 'event_date' => '2020-11', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'published' => true, @@ -300,7 +300,7 @@ class TemplatesWidgetFilterTest extends TemplatesWidgetRenderAllTestCase { 'id_categorie' => '', 'events_only' => true, 'event_date' => '', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'place_town' => 'Grand Annecy', 'custom_fields' => [], @@ -316,7 +316,7 @@ class TemplatesWidgetFilterTest extends TemplatesWidgetRenderAllTestCase { 'id_categorie' => '', 'events_only' => true, 'event_date' => '2020-11', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'published' => true @@ -1011,7 +1011,7 @@ class TemplatesWidgetCalendarTest extends TemplatesIntonationTestCase { 'id_categorie' => '22', 'events_only' => true, 'event_date' => '2020-04', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'published' => true, @@ -1023,7 +1023,7 @@ class TemplatesWidgetCalendarTest extends TemplatesIntonationTestCase { 'id_categorie' => '22', 'events_only' => true, 'event_date' => '', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'published' => true, @@ -1036,7 +1036,7 @@ class TemplatesWidgetCalendarTest extends TemplatesIntonationTestCase { 'id_categorie' => '22', 'events_only' => true, 'event_date' => '2020-04', - 'id_bib' => 0, + 'id_bib' => [''], 'id_lieu' => '', 'custom_fields' => [], 'published' => true])