Commit eb30262ce9febceef5e9f29f795e921ca4df9dfc

Authored by Etienne Pallier
1 parent 8cd3a34f
Exists in master and in 1 other branch dev

Quelques bugfixes du test de la vue matériels/view...

README.md
... ... @@ -54,9 +54,12 @@ Logiciel testé et validé sur les configurations suivantes :
54 54 VERSION ACTUELLE
55 55  
56 56 Date: 23/06/2020
57   -Version: 3.7.9.42
  57 +Version: 3.7.9.43
58 58 Author: EP
59   -Commentaire: Amélioration de la page de log (/pages/logs)
  59 +Commentaire:
  60 + - Ajout d'un gros test générique de la vue détaillée de Materiels (/materiels/view) qui teste le CONTENU de la vue
  61 + - TODO1 : enrichir ce test
  62 + - TODO2 : faire pareil pour tester la vue 'index'
60 63  
61 64 - Tests génériques automatiques pour (presque) toutes les actions de (presque) tous les controleurs principaux (Materiels, Suivis, Emprunts, Users) mais aussi du controleur "quelconque" SurCategories (pour vérifier que ça marche aussi !!!)
62 65 - Dans ces tests génériques, on teste non seulement qu'une action s'exécute seulement quand elle y est autorisée, mais aussi qu'elle s'exécute correctement (au moins pour les actions CRUD : add,edit,delete...)
... ...
TESTS.sh
... ... @@ -12,8 +12,9 @@ TESTALL=1
12 12 #echo "all is: $*"
13 13  
14 14 # Souvent necessaire pour que les tests se passent bien:
  15 +sudo rm -rf tmp/cache/*
15 16 #rm -rf tmp/cache/*/*
16   -sudo chmod o+w tmp/cache/persistent/myapp_cake_core_translations_* > /dev/null 2>&1
  17 +##sudo chmod o+w tmp/cache/persistent/myapp_cake_core_translations_* > /dev/null 2>&1
17 18  
18 19 if [[ "$1" != "" ]] ; then
19 20 #$TESTEXEC --filter $*
... ... @@ -42,5 +43,6 @@ elif [[ $TESTALL == 0 ]] ; then
42 43  
43 44 fi
44 45  
45   -sudo rm -f tmp/cache/persistent/myapp_cake_core_translations_*
  46 +##sudo rm -f tmp/cache/persistent/myapp_cake_core_translations_*
  47 +sudo rm -rf tmp/cache/*
46 48  
... ...
src/Controller/AppController.php
... ... @@ -30,6 +30,7 @@ use App\Model\Entity\Emprunt;
30 30  
31 31 use Cake\Log\Log;
32 32 use Cake\Http\Exception\NotImplementedException;
  33 +use Cake\Controller\Component\AuthComponent;
33 34  
34 35  
35 36  
... ... @@ -526,6 +527,7 @@ class AppController extends Controller
526 527 public function isAuthorizedAction($action, $id=null, $related_matos_id=null, $user=null) {
527 528 //return $this->isAuthorizedActionForRole($this->user_role, $action, $id);
528 529 //return $this->isAuthorizedActionForRole($this->getUserRole($user), $action, $id, $IS_RELATED_ENTITY_ID, $user);
  530 + $this->d("IN isAuthorizedAction(): controleur $this->name, action $action");
529 531 return $this->isAuthorizedActionForRole($this->getUserRole($user), $action, $id, $related_matos_id, $user);
530 532 }
531 533  
... ... @@ -550,6 +552,7 @@ class AppController extends Controller
550 552 //$this->d("********* USER :"); $this->d2($user);
551 553 if ($this->SUPERADMIN_CAN_DO_EVERYTHING) return TRUE;
552 554  
  555 + //if ($action=='statusTobearchived'); exit;
553 556 //$m = ($m_id) ? $this->getCurrentMateriel($m_id) : null;
554 557 //$m = null;
555 558 /*
... ... @@ -1315,6 +1318,9 @@ class AppController extends Controller
1315 1318 public function getCurrentUserEntity() { return $this->getUserEntity(); }
1316 1319 public function getUserEntity($user = null) {
1317 1320 //if (! $this->CURRENT_PRIVILEDGED_USER) {
  1321 + //debug("user is"); debug($user);
  1322 + //debug("1)"); debug($_SESSION);
  1323 +
1318 1324 if (! $this->u) {
1319 1325 $configuration = $this->confLabinvent;
1320 1326 $ldapAuthType = $configuration->ldap_authenticationType;
... ... @@ -1322,8 +1328,23 @@ class AppController extends Controller
1322 1328 // par défaut, user est DEJA une Entity User => rien à faire
1323 1329 // Si $user non défini ou bien array, il faut rechercher ce user dans la BD pour créer un User entity
1324 1330 if (!$user || is_array($user)) {
1325   - //debug("ICI2 !!!");
1326   - $username = $user ? $user[$ldapAuthType] : $this->LdapAuth->user($ldapAuthType);
  1331 + //debug("2)"); debug($_SESSION['Auth']['User'][$ldapAuthType]);
  1332 + // (EP 202006) Marche pas avec les TESTS : ça flingue carrément la variable $_SESSION !!!
  1333 + //$username = $user ? $user[$ldapAuthType] : $this->LdapAuth->user($ldapAuthType);
  1334 + // Donc je remplace par :
  1335 + $username = $user ? $user[$ldapAuthType] : $_SESSION['Auth']['User'][$ldapAuthType];
  1336 + //debug("ldapAuthType is '$ldapAuthType'");
  1337 +
  1338 + /* CAKEPHP 3 way :
  1339 + $req = $this->getRequest(); //debug($req);
  1340 + $session = $req->getSession();
  1341 + debug($session->read());
  1342 + //debug($session->read('Auth.User'));
  1343 + */
  1344 + //debug("username is"); debug($username);
  1345 + //debug("3)"); debug($_SESSION);
  1346 + //debug($this->LdapAuth);
  1347 + //exit;
1327 1348 if (!$username) throw new \ErrorException("L'utilisateur courant n'a pas été trouvé !!!");
1328 1349 //debug("user name is:"); debug($username);
1329 1350 $username = $username[0];
... ... @@ -1605,6 +1626,7 @@ class AppController extends Controller
1605 1626 // - L'action demandée et son id le cas échéant (nul par défaut, égal 0)
1606 1627 $this->a = $this->getActionPassed();
1607 1628 $this->myDebug("- action passed : ".$this->a);
  1629 + //debug("- action passed : ".$this->a);
1608 1630 $this->e_id = $this->getIdPassed();
1609 1631 $this->myDebug("- id passed : ".$this->a);
1610 1632  
... ...
src/Controller/MaterielsController.php
... ... @@ -464,8 +464,13 @@ class MaterielsController extends AppController {
464 464  
465 465 // Action 'printLabelRuban' (impression d'une étiquette)
466 466 $this->setAuthorizationsForAction('printLabelRuban', ['VALIDATED && conf.hasPrinter',0] );
  467 + $this->setAuthorizationsForAction('setLabelIsPlaced', ['VALIDATED && conf.hasPrinter',0] );
  468 + $this->setAuthorizationsForAction('setLabelIsNotPlaced', ['VALIDATED && conf.hasPrinter',0] );
  469 + /*
467 470 $this->setAuthorizationsForAction('setLabelIsPlaced', 0); // autorisé sans condition
468 471 $this->setAuthorizationsForAction('setLabelIsNotPlaced', 0); // autorisé sans condition
  472 + */
  473 +
469 474 // Action 'execActions'
470 475 $this->setAuthorizationsForAction('execActions', 0, [ // par défaut autorisé sans condition
471 476 // sauf pour user et resp
... ... @@ -2545,6 +2550,7 @@ class MaterielsController extends AppController {
2545 2550 //TODO: avec des arguments
2546 2551 //'getDateGarantie',
2547 2552 );
  2553 + $actions = ['printLabelRuban'];
2548 2554 // Retourne toutes les méthodes publiques, mêmes celles qui ne sont pas des actions, donc pas bon
2549 2555 //$actions = get_class_methods('App\Controller\MaterielsController');
2550 2556 return $actions;
... ... @@ -3744,6 +3750,7 @@ class MaterielsController extends AppController {
3744 3750 //$this->response->sendHeaders();
3745 3751  
3746 3752 // Select current default format (set from configuration) : etiquette_format1, or etiquette_format2, or etiquette_format3, etc...
  3753 + //debug($this->confLabinvent);
3747 3754 $label_format_num = $this->confLabinvent->label_format_num;
3748 3755 //debug($this->confLabinvent);
3749 3756 //debug("label_format_num is $label_format_num");
... ...
src/Template/Materiels/view.ctp
... ... @@ -561,7 +561,7 @@ if (h($entity->etiquette) == 0)
561 561 else
562 562 $etiq = "Oui";
563 563  
564   -$displayElement(__('Etiquette collée'), $etiq, $etiq=="Oui"?$style_green:$style_red);
  564 +$displayElement(__('Etiquette placée'), $etiq, $etiq=="Oui"?$style_green:$style_red);
565 565  
566 566 $displayElement(__('N° de série'), $entity->numero_serie);
567 567 $displayElement(__($configuration->nom_groupe_thematique), $entity->has('groupes_thematique') ? $this->Html->link($entity->groupes_thematique->nom, [
... ...
src/Template/Pages/logs.ctp 0 → 100644
... ... @@ -0,0 +1,81 @@
  1 +<?php
  2 +// parameters passed by controller
  3 +$info_levels = $info_levels; // ['info','notice','debug'];
  4 +$error_levels = $error_levels; // ['warning', 'error', 'critical', 'alert', 'emergency']
  5 +$level = $level;
  6 +?>
  7 +<h2>
  8 + <!--
  9 + <i class="icon-print"></i>
  10 + -->
  11 + <center>MESSAGES DE LOG</center>
  12 +</h2>
  13 +
  14 +<p>
  15 +<center>
  16 +<?php
  17 + foreach ($info_levels as $info_level) echo $this->Html->link(" [$info_level] ", ['action' => "logs?level=$info_level"]);
  18 + echo '<br>';
  19 + foreach ($error_levels as $error_level) echo $this->Html->link(" [$error_level] ", ['action' => "logs?level=$error_level"]);
  20 +?>
  21 +</center>
  22 +</p>
  23 +
  24 +
  25 +
  26 +<?php
  27 +
  28 +/*
  29 + * Lecture des $nblines_to_read dernières lignes du fichier logs/debug.log
  30 + * puis
  31 + * Affichage de ces lignes dans l'ordre inverse (ordre anti-chrono : de la plus récente à la plus ancienne)
  32 + */
  33 +
  34 +// On lit le fichier /WWWROOT/../logs/debug.log
  35 +$wwwroot_dir = new Cake\Filesystem\Folder(WWW_ROOT);
  36 +$logfile_name = in_array($level, $info_levels) ? 'debug':'error';
  37 +$logfile_path = $wwwroot_dir->pwd() . DS . '..' . DS . 'logs' . DS . $logfile_name.'.log';
  38 +$nblines_to_read = 5000;
  39 +
  40 +
  41 +
  42 +/*
  43 +$f = fopen($logfile_path, "r") or die("Unable to open file!");
  44 +//echo fgets($f);
  45 +while(!feof($f)) {
  46 + echo fgets($f) . "<br>";
  47 +}
  48 +fclose($f);
  49 +*/
  50 +
  51 +// On va direct à la fin du fichier
  52 +try {
  53 + $f = new SplFileObject($logfile_path, "r");
  54 +} catch (Exception $e) {
  55 + echo("Le fichier de log '/logs/".basename($logfile_path)."' n'existe pas encore...");
  56 + return;
  57 +}
  58 +$f->seek(PHP_INT_MAX);
  59 +$last_line = $f->key();
  60 +
  61 +// Lire TOUT le fichier
  62 +//$lines = new LimitIterator($f, 0, $last_line);
  63 +// Lire seulement les $nblines_to_read dernières lignes
  64 +$line_num_from = max(0,$last_line-$nblines_to_read);
  65 +$lines = new LimitIterator($f, $line_num_from);
  66 +//$lines = new LimitIterator($f, $last_line-$nblines_to_read, $last_line);
  67 +//print_r(iterator_to_array($lines));
  68 +
  69 +// Inversion des lignes pour affichage anti-chrono
  70 +$lines_reversed = array_reverse(iterator_to_array($lines));
  71 +$level = ucfirst($level);
  72 +foreach ($lines_reversed as $line) {
  73 + if (mb_strpos($line, "$level: ") !== FALSE) echo $line.'<br><br>';
  74 + //if (mb_strpos($line, 'Info: ') !== FALSE) echo $line.'<br><br>';
  75 + //if (mb_strpos($line, '/materiels/edit/') !== FALSE) echo $line.'<br><br>';
  76 +}
  77 +
  78 +// Close file
  79 +$f=null;
  80 +
  81 +?>
0 82 \ No newline at end of file
... ...
tests/TestCase/Controller/General.php
... ... @@ -78,6 +78,8 @@ class General extends TestCase {
78 78 ['RESP'],
79 79 ['ADMIN'],
80 80 ['SUPER']
  81 + /*
  82 + */
81 83 ];
82 84  
83 85 const PROFILES = AppController::PROFILES;
... ... @@ -125,6 +127,19 @@ class General extends TestCase {
125 127 if ($this->DEBUG) pr($msg);
126 128 }
127 129  
  130 + /*
  131 + * On recupère une entité quelconque de la BD (fixture), peu importe ce que c'est car on va la modifier
  132 + * Par défaut, on utilise la première entité de la BD (id 1)
  133 + */
  134 + static protected function _getEntityIdOkForTesting() {
  135 + return 1;
  136 + }
  137 +
  138 + // To be overriden by subclasses
  139 + protected function getNewEntityWithAllMandatoryFields() {
  140 + throw new NotImplementedException(__METHOD__);
  141 + }
  142 +
128 143 protected function getEntitiesName() {
129 144 //throw new NotImplementedException("Méthode getEntitiesName() non implémentée !!");
130 145 $test_class_name = get_class($this);
... ... @@ -152,34 +167,35 @@ class General extends TestCase {
152 167 return $m;
153 168 */
154 169 }
155   -
156   - /*
157   - * On recupère une entité quelconque de la BD (fixture), peu importe ce que c'est car on va la modifier
158   - * Par défaut, on utilise la première entité de la BD (id 1)
159   - */
160   - static protected function _getEntityIdOkForTesting() {
161   - return 1;
162   - }
163   -
164 170  
165 171 protected function getMaterielsController() {
166 172 // On est dans MaterielsControllerTest => on retourne le controleur courant
167   - if ($this->getEntitiesName()=='Materiels') return $this->getController();
  173 + if ($this->getEntitiesName()=='Materiels') return $this->_getController();
168 174 // Sinon, on retourne une instance spécifique pour les materiels
169 175 if (!$this->controller_materiels_instance) $this->controller_materiels_instance = new MaterielsController();
170 176 return $this->controller_materiels_instance;
171 177 }
172 178  
173   - protected function getController() {
  179 + protected function _getController() {
174 180 //if (!$this->controller_instance) $this->controller_instance = new MaterielsController();
175 181 $entities_name = $this->getEntitiesName(); // ex: 'Materiels', 'Suivis', ...
176   - //$controller_name = 'App\\Controller\\'.$this->getEntitiesName().'Controller'; // ex: 'Materiels' ou 'Suivis'...
177   - $controller_name = 'App\\Controller\\'.$entities_name.'Controller'; // ex: 'MaterielsController' ou 'SuivisController'...
178   - //$controller_name = 'App\\Controller\\'.$this->getEntitiesName().'Controller'; // ex: 'Materiels' ou 'Suivis'...
179   - //if (!$this->controller_instance || ($this->controller_instance && $this->controller_instance->name != $this->getEntitiesName()))
  182 + $controller_name = $this->_getControllerFullNameFromEntitiesName($entities_name);
180 183 if (!$this->controller_instance) $this->controller_instance = new $controller_name();
181 184 return $this->controller_instance;
182 185 }
  186 + protected static function _getControllerInstanceFromName($entities_name) {
  187 + //$controller_name = $this->_getControllerFullNameFromEntitiesName($entities_name);
  188 + $controller_name = self::_getControllerFullNameFromEntitiesName($entities_name);
  189 + return new $controller_name();
  190 + }
  191 + private static function _getControllerFullNameFromEntitiesName($entities_name) {
  192 + $entities_name = ucfirst(strtolower($entities_name)); // Materiels, Suivis, Emprunts...
  193 + //$controller_name = 'App\\Controller\\'.$this->getEntitiesName().'Controller'; // ex: 'Materiels' ou 'Suivis'...
  194 + return 'App\\Controller\\'.$entities_name.'Controller'; // ex: 'MaterielsController' ou 'SuivisController'...
  195 + //$controller_name = 'App\\Controller\\'.$this->getEntitiesName().'Controller'; // ex: 'Materiels' ou 'Suivis'...
  196 + }
  197 +
  198 +
183 199  
184 200 // This are data providers used for a lot of tests
185 201 // See https://jtreminio.com/2013/03/unit-testing-tutorial-part-2-assertions-writing-a-useful-test-and-dataprovider
... ... @@ -190,7 +206,19 @@ class General extends TestCase {
190 206  
191 207 protected function getActions() {
192 208 //return ['toto'];
193   - return $this->getController()->getActions();
  209 + return $this->_getController()->getActions();
  210 + }
  211 +
  212 + // Combinaison de roles (U,R,A,S) et statuts (C,V,T,A)
  213 + public function dataProviderRoles4AndStatuses4() {
  214 + $roles_and_statuses = [];
  215 + foreach ($this->ROLES4 as $user_role) {
  216 + //debug($user_role[0]);
  217 + foreach ($this->MATOS_STATUSES as $matos_status)
  218 + $roles_and_statuses[] = [$user_role[0], $matos_status[0]];
  219 + }
  220 + //$this->d($roles_and_statuses);
  221 + return $roles_and_statuses;
194 222 }
195 223  
196 224 //public function dataProviderActionsAndRoles4($controller) {
... ... @@ -708,7 +736,7 @@ class General extends TestCase {
708 736 $c = new $controller_name();
709 737 //$entity_name =$c->name;
710 738 */
711   - $c = $this->getController();
  739 + $c = $this->_getController();
712 740  
713 741 // POUR CHAQUE $action et $role (fournis par le dataProvider) :
714 742  
... ... @@ -767,7 +795,7 @@ class General extends TestCase {
767 795 else {
768 796 // id = celui de l'entité (suivi, emprunt, document....)
769 797 // matos_id = celui associé à l'entité
770   - $e = $this->getController()->getEntity($id);
  798 + $e = $this->_getController()->getEntity($id);
771 799 if ($e->has('materiel_id')) $matos_id = $e->materiel_id;
772 800 }
773 801 }
... ... @@ -887,8 +915,13 @@ class General extends TestCase {
887 915 else throw new \ErrorException("La conditions d'accès $access_condition est incorrecte (2)");
888 916 } // testAuthorizationsForAllActionsOfController()
889 917  
890   -
891   - private function _updateMatosWithStatusAs($id, $status, $WITH_SAME_STATUS=true) {
  918 +
  919 + protected function _updateMatosStatusAndBelongingWith($id, $status, $BELONGS=true, $SAMEGROUP=true) {
  920 + $this->_updateMatosWithStatusAs($id, $status);
  921 + $this->_updateMatosBelongingToCurrentUserAndInSameGroup($id, $BELONGS, $SAMEGROUP);
  922 + }
  923 +
  924 + private function _updateMatosWithStatusAs($id, $status, $WITH_SAME_STATUS=true, $DO_SAVE=true) {
892 925 //$mc = new MaterielsController();
893 926 $mc = $this->getMaterielsController();
894 927 $u = $this->getCurrentUser();
... ... @@ -925,15 +958,17 @@ class General extends TestCase {
925 958  
926 959 // On sauvegarde le matos modifié
927 960 //if (! $this->Materiels->save($m))
928   - if (! $this->getMaterielsTable()->save($m))
  961 + if ($DO_SAVE && !$this->getMaterielsTable()->save($m))
929 962 throw new \Exception("La sauvegarde du materiel modifié ne se fait pas !!!");
  963 +
  964 + return $m;
930 965 }
931 966  
932 967 else throw new \Exception("Le statut du matériel est incorrect !!!");
933 968  
934 969 }
935 970  
936   - private function _updateMatosBelongingToCurrentUserAndInSameGroup($id, $BELONGS=true, $SAMEGROUP=true) {
  971 + private function _updateMatosBelongingToCurrentUserAndInSameGroup($id, $BELONGS=true, $SAMEGROUP=true, $DO_SAVE=true) {
937 972 $u = $this->getCurrentUser();
938 973 $m = $this->Materiels->get($id);
939 974  
... ... @@ -951,14 +986,12 @@ class General extends TestCase {
951 986 //debug($matos);
952 987  
953 988 // On sauvegarde le matos modifié
954   - if (! $this->Materiels->save($m))
  989 + if ( $DO_SAVE && !$this->Materiels->save($m) )
955 990 throw new \Exception("La sauvegarde du materiel modifié ne se fait pas !!!");
  991 +
  992 + return $m;
956 993 }
957 994  
958   - // To be overriden by subclasses
959   - protected function getNewEntityWithAllMandatoryFields() {
960   - throw new NotImplementedException(__METHOD__);
961   - }
962 995  
963 996 //private function _testExecActionForId($action,$id,$SHOULD_BE_SUCCESS) {
964 997 private function _testExecActionForId($action,$id,$getpost,$posted_data,$SHOULD_BE_SUCCESS,$nbentities) {
... ... @@ -1044,7 +1077,7 @@ class General extends TestCase {
1044 1077 $entity_name = substr($entities_name,0,-1);
1045 1078 $entity_name = $this->inflectEntityName($entity_name);
1046 1079 //if ($entity_name=='materiel') $entity_name='matériel';
1047   - $c = $this->getController();
  1080 + $c = $this->_getController();
1048 1081 $article = $c->getArticle();
1049 1082 if ($entity_name=='domaine') $article='Le ';
1050 1083 // "Le materiel/suivi/emprunt a bien été"
... ...
tests/TestCase/Controller/MaterielsControllerTest.php
... ... @@ -30,25 +30,33 @@ class MaterielsControllerTest extends General {
30 30 */
31 31 public $fixtures = [
32 32 'app.materiels',
  33 +
  34 + 'app.configurations',
  35 +
33 36 'app.sur_categories',
34 37 'app.categories',
35 38 'app.sous_categories',
  39 +
36 40 'app.groupes_thematiques',
37 41 'app.groupes_metiers',
  42 +
38 43 'app.fakeldapusers',
39 44 'app.users',
  45 +
40 46 'app.organismes',
41 47 'app.sites',
  48 +
42 49 'app.documents',
  50 + 'app.type_documents',
43 51 'app.suivis',
44   - 'app.emprunts',
45   - 'app.configurations',
46 52 'app.type_suivis',
47   - 'app.type_documents',
  53 + 'app.emprunts',
  54 +
48 55 'app.fournisseurs',
49 56 'app.unites'
50 57 ];
51 58  
  59 + // AVIRER
52 60 private $nb_matos_in_fixture = 7;
53 61  
54 62 /*
... ... @@ -183,6 +191,7 @@ class MaterielsControllerTest extends General {
183 191 public function dataProviderRoles6() { return $this->ROLES6; }
184 192 */
185 193 //public function dataProviderStatuses4() { return $this->MATOS_STATUSES; }
  194 + /*
186 195 public function dataProviderRoles4AndStatuses4() {
187 196 $roles_and_statuses = [];
188 197 foreach ($this->ROLES4 as $user_role) {
... ... @@ -193,6 +202,7 @@ class MaterielsControllerTest extends General {
193 202 $this->d($roles_and_statuses);
194 203 return $roles_and_statuses;
195 204 }
  205 + */
196 206  
197 207 /*
198 208 protected function getController() {
... ... @@ -1669,7 +1679,7 @@ class MaterielsControllerTest extends General {
1669 1679 $this->post('/materiels/set-label-is-placed/11/view');
1670 1680 $this->get('/materiels/view/11');
1671 1681 $this->assertResponseContains(
1672   - '<TR> <TD><strong>Etiquette collée</strong></TD> <TD style="color: green">Oui</TD> </TR>',
  1682 + '<TR> <TD><strong>Etiquette placée</strong></TD> <TD style="color: green">Oui</TD> </TR>',
1673 1683 "Le placement de l'étiquette sur le materiel ne se fait pas correctement."
1674 1684 );
1675 1685 //$this->assertResponseContains('Etiquette collée</strong></TD> <TD>Oui', "Le placement de l'étiquette sur le materiel ne se fait pas correctement.");
... ... @@ -1686,7 +1696,7 @@ class MaterielsControllerTest extends General {
1686 1696 $this->get('/materiels/view/12');
1687 1697 $this->assertResponseContains(
1688 1698 //'<TR> <TD><strong>Etiquette collée</strong></TD> <TD style="color: #FF0000">Non</TD> </TR>',
1689   - '<TR> <TD><strong>Etiquette collée</strong></TD> <TD style="color: red">Non</TD> </TR>',
  1699 + '<TR> <TD><strong>Etiquette placée</strong></TD> <TD style="color: red">Non</TD> </TR>',
1690 1700 "La déclaration d'une étiquette non collée sur le materiel ne se fait pas correctement.");
1691 1701 //$this->assertResponseContains('Etiquette collée</strong></TD> <TD>Non', "L'enlevement de l'étiquette sur le materiel ne se fait pas correctement.");
1692 1702 }
... ... @@ -1890,142 +1900,141 @@ class MaterielsControllerTest extends General {
1890 1900 *
1891 1901 * @return void
1892 1902 *
1893   - * (OLD dataProvider dataProviderRoles4)
1894 1903 * @dataProvider dataProviderRoles4AndStatuses4
1895 1904 */
1896   - public function OFF_testViewsViewAndIndexForRole($user_role, $matos_status) {
1897   - // Force le rechargement des entités materiel en BD (car on les modifie en cours de route)
1898   - //AppController::forceReload();
1899   -
1900   - //$actions = ['view', 'index', 'delete'];
1901   - //$actions = ['view', ];
1902   - //$actions = ['index', ];
1903   - $actions = ['delete', ];
1904   - foreach ($actions as $action) $this->OFF_testViewForRole($action, $user_role, $matos_status);
1905   - //foreach (['view', ] as $view) $this->_testViewForRole($view, $user_role, $matos_status);
1906   - //foreach (['index'] as $view) $this->_testViewForRole($view, $user_role, $matos_status);
1907   - //foreach (['view', 'index'] as $view) $this->_testViewForRole($view, $user_role, $matos_status);
1908   - }
1909   - /**
1910   - * Test de la vue détaillée $view.ctp (essentiellement les vues view.ctp et index.ctp)
1911   - *
1912   - * @return void
1913   - *
1914   - */
1915   - private function OFF_testViewForRole($view, $user_role, $matos_status) {
1916   -
1917   - // Force le rechargement des entités materiel en BD (car on les modifie en cours de route)
1918   - //AppController::forceReload();
1919   -
  1905 + public function testMaterielViewPage($role, $status) {
1920 1906 $this->d("*******************");
1921   - $this->d(" ROLE = ".$user_role);
  1907 + $this->d(" ROLE $role, STATUT $status :");
1922 1908 $this->d("*******************");
1923   - //$this->setUp();
1924 1909  
1925   - //$this->authSuperAdmin();
1926   - $this->authAs($user_role);
  1910 + // Tous les boutons d'action accessibles (selon le role et le matériel) depuis la vue détaillée d'un matériel (materiels/view)
  1911 + $action_buttons = [
  1912 +
  1913 + // - Entité matériel
  1914 + 'actionInconnue' => 'Action inconnue',
  1915 + 'edit' => 'Editer', // 'Editer ce matériel'
  1916 + 'delete' => 'Supprimer',
  1917 + 'add_by_copy' => 'Copier',
  1918 +
  1919 + 'statusCreated' => 'Dévalider',
  1920 + 'statusValidated' => 'Valider',
  1921 + 'statusTobearchived' => "Demander sortie",
  1922 + 'statusArchived' => 'Sortie inventaire',
  1923 +
  1924 + // - Entités associées
  1925 +
  1926 + 'suivis/add' => 'Nouv. Suivi',
  1927 + 'emprunts/add' => 'Nouv. Prêt',
  1928 + 'documents/add' => 'Lier un Doc.',
  1929 +
  1930 + 'documents/ficheMateriel' => 'Fiche PDF du matériel',
  1931 +
  1932 + 'documents/admission' => 'Doc. admission',
  1933 + 'documents/sortie' => 'Doc. sortie',
  1934 +
  1935 + 'printLabelRuban' => 'étiquette',
  1936 + ];
1927 1937  
1928   - // On recupère un matos quelconque de la BD (fixture), peu importe ce que c'est car on va le modifier
1929   - // PAS le 1 (ni le 3 ni le 12) car il a des suivis et donc on ne pourra pas le supprimer !!!
1930   - $matos_id = 2;
  1938 + // On prend un id de materiel ok pour le test
  1939 + // On va modifier à souhait ce materiel en BD (fixture)
  1940 + $id = $this->_getEntityIdOkForTesting();
1931 1941  
1932   - //$nbmat = $this->nb_matos_in_fixture;
1933   - $nbmat = $this->_getNbMaterielsInIndexViewForRole($user_role);
1934   - $this->_checkNbMaterielInIndexViewIsAsAwaited($nbmat);
  1942 + // On ajoute les actions qui dépendent de l'état du matériel
  1943 + $m = $this->Materiels->get($id); // ou Cake\Datasource\Exception\RecordNotFoundException
  1944 + /* Pour changer d'action :
  1945 + $m->etiquette = false;
  1946 + $m->etiquette = true;
  1947 + $this->Materiels->save($m);
  1948 + */
  1949 + if ($m->etiquette)
  1950 + $action_buttons['setLabelIsNotPlaced'] = 'Etiquette NON collée';
  1951 + else
  1952 + $action_buttons['setLabelIsPlaced'] = 'Etiquette collée';
1935 1953  
1936   - // POUR CHAQUE statut matériel :
1937   - // CREATED, puis VALIDATED, puis TBA, puis ARCHIVED
1938   - //foreach (['CREATED'] as $matos_status) {
1939   - //foreach (['VALIDATED'] as $matos_status) {
1940   - //foreach (['ARCHIVED'] as $matos_status) {
1941   - ///////foreach (array_keys($this->STATUSES) as $matos_status) {
1942   -
1943   - $this->d("**** ".$matos_status." ****");
1944   - $matos = $this->Materiels->get($matos_id);
1945   - $matos->status = $matos_status;
1946   - //debug($matos);
1947   -
1948   - // POUR CHAQUE numéro de matériel (0 ou 1) :
1949   - // matos_CREATED0 puis matos_CREATED1 puis matos_VALIDATED0 puis matos_VALIDATED1 puis matos_TOBEARCHIVED0...
1950   - foreach ([0,1] as $i) {
1951   -
1952   - $matos_name = "matos_${matos_status}$i";
1953   - $this->d("* ".$matos_name." :");
1954   - // i=0
1955   - // Le materiel matos_XXXXXX0 doit appartenir à un utilisateur quelconque
1956   - // et à un groupe (métier et thématique) quelconque
1957   - if ($i==0) {
1958   - $matos->nom_responsable = 'inconnu';
1959   - $matos->nom_createur = 'inconnu';
1960   - $matos->groupes_thematique_id = 2;
1961   - $matos->groupes_metier_id = 2;
1962   - //pr("modif matos pour i=0");
1963   - }
1964   - // i=1
1965   - // Le materiel matos_XXXXXX1 doit appartenir à l'utilisateur qui a le role UTILISATEUR dans les tests
1966   - // et au groupe (métier et thématique) de l'utilisateur utilisé pour le role RESPONSABLE dans les tests
1967   - else {
1968   - $matos->nom_responsable = 'user5 USER';
1969   - $matos->nom_createur = 'user5 USER';
1970   - $matos->groupes_thematique_id = 1;
1971   - $matos->groupes_metier_id = 1;
1972   - //pr("modif matos pour i=1");
1973   - }
1974   - //pr($matos->getDirty());
1975   - //$fields_changed = ['nom_responsable', 'nom_createur'];
1976   - //$matos->setDirty('*',true);
1977   - //$matos->setDirty('nom_responsable',true);
1978   - //$matos->setDirty('nom_createur',true);
1979   - // On sauvegarde le matos modifié
1980   - // pour pouvoir l'afficher avec /materiels/view/1
1981   - //pr("nom bef is ".$matos->nom_responsable);
1982   - if (! $this->Materiels->save($matos))
1983   - throw new \Exception("La sauvegarde du materiel modifié ne se fait pas !!!");
1984   - /*
1985   - $m = $this->Materiels->get(1);
1986   - pr("new nom is ".$m->nom_responsable);
1987   - */
1988   -
1989   - // 1) Test des VUES
1990   -
1991   - // Et maintenant, le test qui tue
1992   - //$this->get('/materiels/view/1');
1993   - // Vue view.ctp
1994   - if ($view == 'view') {
1995   - $this->get("/materiels/$view/$matos_id");
1996   - $this->_checkViewPageContentForRoleAndMatos($user_role, $matos_status, $i, $matos_id);
1997   - }
1998   - // Vue index.ctp
1999   - if ($view == 'index') {
2000   - $this->get("/materiels/$view");
2001   - $this->_checkIndexPageContentForRoleAndMatos($user_role, $matos_status, $i);
2002   - //$this->assertResponseContains("(HORS SERVICE)", "Le matériel n'est pas hors-service comme demandé.");
2003   - }
2004   -
2005   - // 2) Test des ACTIONS
2006   -
2007   - $action = $view;
2008   - // Action 'delete'
2009   - if ($action == 'delete') {
2010   - $this->post("/materiels/$action/$matos_id");
2011   - $authorized = $this->isAuthorizedAction($action, $user_role, $matos_status, $i);
2012   - $this->d("isAuthorizedAction $action pour $user_role sur materiel $matos_status,$i ? : " . (int)$authorized);
2013   - if ($authorized) $nbmat--;
2014   - // Check qu'il y a bien un matériel en moins (ou pas)
2015   - //$this->get('/materiels/index');
2016   - $this->_checkNbMaterielInIndexViewAfterActionIsOK($authorized, $action, $nbmat, $user_role, $matos_id);
2017   - break;
  1954 + // Attention, le role n'est pas encore écrit dans la session !!!
  1955 + // La variable $_SESSION n'existe même pas encore
  1956 + $this->authAs($role);
  1957 + //debug($_SESSION); // null why ???
  1958 +
  1959 + // INDISPENSABLE, NE PAS SUPPRIMER !!!
  1960 + // On doit donc faire ceci (qui appelle l'action index) pour que la variable $_SESSION existe !!!
  1961 + // et donc aussi le USER authentifié ci-dessus avec authAs()
  1962 + $nbentities = $this->getNbEntitiesExpectedInIndexView();
  1963 + //debug($_SESSION); // NULL why ?
  1964 + $this->_checkNbEntitiesInIndexViewIsAsExpected('materiels', $nbentities);
  1965 + //debug($_SESSION);return;
  1966 + // pas NULL why ?
  1967 + // On sauvegarde le user courant
  1968 + /*
  1969 + $configuration = TableRegistry::getTableLocator()->get('Configurations')->find()->first();
  1970 + $ldapAuthType = $configuration->ldap_authenticationType;
  1971 + $user = $_SESSION['Auth']['User'][$ldapAuthType];
  1972 + */
  1973 + $user = $_SESSION['Auth']['User'];
  1974 + //debug("(0) user is"); debug($user);
  1975 +
  1976 +
  1977 + // Force le rechargement des materiels car ils vont être modifiés par les tests
  1978 + AppController::forceReload();
  1979 +
  1980 + // On récup une instance de MaterielsController
  1981 + $cm = $this->_getController();
  1982 +
  1983 + // Condition d'appartenance, couple (belong,samegroup)
  1984 + // Toutes les combinaisons de (bool,bool) : TT, TF, FT, FF
  1985 + foreach ([false,true] as $belong) {
  1986 + foreach ([false,true] as $samegroup) {
  1987 + $this->_updateMatosStatusAndBelongingWith($id, $status, $belong, $samegroup);
  1988 + // Si l'action 'view' est autorisée, on l'exécute, puis on teste le contenue de la vue
  1989 + if ($cm->isAuthorizedAction('view', $id)) {
  1990 + $this->get("/materiels/view/$id");
  1991 + $this->assertResponseOk();
  1992 + foreach ($action_buttons as $action_name=>$action_label) {
  1993 + //debug("action:");debug("$action_name => $action_label");
  1994 + $controller = $this->_getControllerForAction($action_name);
  1995 + // Controleur materiel
  1996 + //debug($controller->name);
  1997 + //if ($controller==$cm) {
  1998 + if ($controller->name == 'Materiels') {
  1999 + $action_button_should_be_present = $controller->isAuthorizedAction($action_name, $id);
  2000 + //if ($action_name=='setLabelIsPlaced')
  2001 + //debug("action_button_should_be_present is"); debug($action_button_should_be_present);
  2002 + }
  2003 + // Autre controleur
  2004 + else {
  2005 + $action_name = explode('/',$action_name)[1];
  2006 +
  2007 + $action_button_should_be_present = $controller->isAuthorizedAction($action_name, null, $id, $user);
  2008 + }
  2009 + $this->_checkViewPageContainsThisActionButton($action_name, $action_label, $id, $action_button_should_be_present);
  2010 + }
2018 2011 }
2019   -
2020   - } // matos num : 0,1
2021   -
2022   - //////} // matos status : CREATED, VALIDATED, ...
  2012 + } // each samegroup
  2013 + } // each belong
2023 2014  
2024   - } // _testViewForRole(role)
  2015 + } // testMaterielViewPage()
2025 2016  
  2017 + private function _getControllerForAction($action_name) {
  2018 + $args = explode('/', $action_name);
  2019 + // Controleur materiel
  2020 + if (count($args)==1)
  2021 + return $this->_getController();
  2022 + // Autre controleur
  2023 + else
  2024 + return $this->_getControllerInstanceFromName($args[0]);
  2025 + }
  2026 +
  2027 +
  2028 + private function _checkViewPageContainsThisActionButton($action_name, $action_label, $id, $action_button_should_be_present=true) {
  2029 + if ($action_button_should_be_present)
  2030 + $this->assertResponseContains($action_label, "La vue détaillée du matériel (/materiels/view/$id) ne contient pas de bouton '$action_label' comme attendu !");
  2031 + else
  2032 + $this->assertResponseNotContains($action_label, "La vue du matériel (/materiels/view/$id) contient le bouton '$action_label', alors qu'elle ne devrait PAS !");
  2033 + }
  2034 +
2026 2035  
2027 2036 // Check du contenu de la vue view.ctp (surtout la présence ou non des boutons d'actions)
2028   - private function _checkViewPageContentForRoleAndMatos($role, $matos_status, $i, $matos_id) {
  2037 + private function OFF_checkViewPageContentForRoleAndMatos($role, $matos_status, $i, $matos_id) {
2029 2038  
2030 2039 // bouton Edit présent ?
2031 2040 $action = 'edit';
... ... @@ -2056,7 +2065,7 @@ class MaterielsControllerTest extends General {
2056 2065 } // _checkViewPageContentForRoleAndMatos()
2057 2066  
2058 2067 // Check du contenu de la vue index.ctp (surtout la présence ou non des boutons d'actions)
2059   - private function _checkIndexPageContentForRoleAndMatos($role, $matos_status, $i, $matos_id) {
  2068 + private function OFF_checkIndexPageContentForRoleAndMatos($role, $matos_status, $i, $matos_id) {
2060 2069  
2061 2070 // Par défaut, les boutons sont absents
2062 2071 $bEdit = $bDelete = $bUpgrade = '';
... ... @@ -2102,359 +2111,7 @@ class MaterielsControllerTest extends General {
2102 2111 }
2103 2112  
2104 2113  
2105   - /**
2106   - * Test de la vue détaillée $view.ctp (essentiellement les vues view.ctp et index.ctp)
2107   - *
2108   - * @return void
2109   - *
2110   - */
2111   - //public function testAuthorizationsForAllActionsOfController($controller_name, $action, $role_short, $role_long) {
2112   - public function MAT_testAuthorizationsForAllActionsOfController($action, $role_short, $role_long) {
2113   -
2114   - // Force le rechargement des entités materiel en BD (car on les modifie en cours de route)
2115   - //AppController::forceReload();
2116   -
2117   - $controller_name = 'MaterielsController';
2118   - $controller_name = 'App\Controller\\'.$controller_name;
2119   - // POUR CHAQUE $action et $role (fournis par le dataProvider) :
2120   -
2121   - //$mc = new MaterielsController();
2122   - $c = new $controller_name();
2123   - $entity_name =$c->name;
2124   -
2125   - $this->d("*******************");
2126   - $this->d(" CONTROLEUR $c->name, ACTION $action, ROLE $role_short");
2127   - $this->d("*******************");
2128   - //$this->setUp();
2129   -
2130   - //$this->authSuperAdmin();
2131   - $this->authAs($role_long);
2132   - // NULL why ?
2133   - //debug($_SESSION);return;
2134   -
2135   - // On recupère un matos quelconque de la BD (fixture), peu importe ce que c'est car on va le modifier
2136   - // PAS le 1 (ni le 3 ni le 12) car il a des suivis et donc on ne pourra pas le supprimer !!!
2137   - $id = 2;
2138   -
2139   - //$nbmat = $this->nb_matos_in_fixture;
2140   - switch ($entity_name) {
2141   - case 'Materiels' : $nbmat = $this->_getNbMaterielsInIndexViewForCurrentRole(); break;
2142   - case 'Suivis' : $nbmat = 3; break;
2143   - }
2144   - // NULL why ?
2145   - //debug($_SESSION);return;
2146   - //$this->_checkNbMaterielInIndexViewIsAsAwaited($nbmat);
2147   - $this->_checkNbEntitiesInIndexViewIsAsAwaited($entity_name, $nbmat);
2148   - // pas NULL why ?
2149   - //debug($_SESSION);return;
2150   -
2151   - //$matos = $this->Materiels->get($id);
2152   - //$matos->status = $matos_status;
2153   -
2154   - $access_condition = $c->getAccessConditionForActionAndRole($action,$role_short);
2155   - //debug("Condition d'accès pour l'action $action et le rôle $role_short"); debug($access_condition);
2156   -
2157   - // Test de l'accès à l'action : 3 GRANDS CAS POSSIBLES
2158   - /*
2159   - if ($access_condition==='default') {
2160   - debug("is default");
2161   - }
2162   - */
2163   - // 1) ACCÈS AUTORISÉ
2164   - if ($access_condition===0) {
2165   - $this->d("is 0");
2166   - $this->_testExecActionForId($action,$id,true);
2167   - }
2168   - // 2) ACCÈS REFUSÉ
2169   - elseif ($access_condition===-1) {
2170   - $this->d("is -1");
2171   - $this->_testExecActionForId($action,$id,false);
2172   - }
2173   - // 3) ACCÈS AUTORISÉ SOUS CONDITION
2174   - // ATTENTION : toujours tester le cas où ca marche (AUTORISÉ) en dernier
2175   - // Utile pour des actions telles que 'delete' !!!
2176   - elseif (is_array($access_condition)) {
2177   - $this->d("is array");
2178   - $access_condition_on_status = $access_condition[0];
2179   - $access_condition_on_belonging = $access_condition[1];
2180   - // 4 cas possibles :
2181   - /*
2182   - * a) [0,0] => idem cas 1) ci-dessus => accès autorisé (avec matos quelconque)
2183   - */
2184   - //if ($access_condition_on_status===0 && $access_condition_on_belonging===0) {
2185   - if ([$access_condition_on_status,$access_condition_on_belonging]===[0,0]) {
2186   - $this->d("- is [0,0]");
2187   - $this->_testExecActionForId($action,$id,true);
2188   - }
2189   - /*
2190   - * b) [0,1] => on ne teste que l'appartenance, soit 2 tests :
2191   - * - (1) on crée un materiel (T,F) => on teste que l'accès être bien AUTORISÉ
2192   - * - (2) on crée un materiel (F,T) => on teste que l'accès être bien REFUSÉ, SAUF si le profil est RESP (AUTORISÉ)
2193   - */
2194   - elseif ([$access_condition_on_status,$access_condition_on_belonging]===[0,1]) {
2195   - $this->d("- is [0,1]");
2196   - //$m = $this->Materiels->get($id);
2197   - // - (1) (T,F)
2198   - $this->_updateMatosBelongingToCurrentUserAndInSameGroup($id, true, false);
2199   - $this->_testExecActionForId($action,$id,true);
2200   - // - (2) (F,T)
2201   - $this->_updateMatosBelongingToCurrentUserAndInSameGroup($id, false, true);
2202   - // ok seulement pour RESP
2203   - $this->_testExecActionForId($action,$id,$this->USER_IS_RESP());
2204   - }
2205   - /*
2206   - * c) [*,0] => on ne teste que le statut, soit 2 tests :
2207   - * - (1) on crée un matériel qui A le statut demandé => on teste que l'accès être bien AUTORISÉ
2208   - * - (2) on crée un matériel qui n'A PAS le statut demandé => on teste que l'accès être bien REFUSÉ
2209   - */
2210   - elseif (is_string($access_condition_on_status) && $access_condition_on_belonging===0) {
2211   - $this->d("- is [*,0]");
2212   - //$m = $this->Materiels->get($id);
2213   - // - (1) statut KO
2214   - /*
2215   - $this->_updateMatosWithStatusAs($id, $access_condition_on_status, false);
2216   - $this->_testExecActionForId($action,$id,false);
2217   - */
2218   - // - (2) statut OK
2219   - $this->_updateMatosWithStatusAs($id, $access_condition_on_status, true);
2220   - $this->_testExecActionForId($action,$id,true);
2221   - }
2222   - /*
2223   - * d) [*,1] => Cas général, on teste les 2 conditions, soit 2x2=4 tests
2224   - * Les 2 conditions (A-statut et B-appartenance) doivent être vérifiées : A && B (c'est un AND)
2225   - * On va donc tester le couple (A,B), ce qui nous donne 3 cas :
2226   - */
2227   - elseif (is_string($access_condition_on_status) && $access_condition_on_belonging===1) {
2228   - $this->d("- is [*,1]");
2229   - //$m = $this->Materiels->get($id);
2230   - // (1) (T,F) => accès REFUSÉ
2231   - $this->d("(TF) should be KO");
2232   - $this->_updateMatosWithStatusAs($id, $access_condition_on_status, true);
2233   - $this->_updateMatosBelongingToCurrentUserAndInSameGroup($id, false, false);
2234   - $m = $this->Materiels->get($id);
2235   - $this->d("$m->status, $m->nom_responsable, $m->nom_createur");
2236   - $this->_testExecActionForId($action,$id,false);
2237   - // (2) (F,T) => accès REFUSÉ
2238   - $this->d("(FT) should be KO");
2239   - $this->_updateMatosWithStatusAs($id, $access_condition_on_status, false);
2240   - $this->_updateMatosBelongingToCurrentUserAndInSameGroup($id, true, true);
2241   - $m = $this->Materiels->get($id);
2242   - $this->d("$m->status, $m->nom_responsable, $m->nom_createur");
2243   - $this->_testExecActionForId($action,$id,false);
2244   - // (3) (F,F) => accès REFUSÉ => inutile de tester ce cas
2245   - // (4) (T,T) => accès AUTORISÉ
2246   - $this->d("(TT) should be OK");
2247   - $this->_updateMatosWithStatusAs($id, $access_condition_on_status, true);
2248   - $this->_updateMatosBelongingToCurrentUserAndInSameGroup($id, true, $this->USER_IS_RESP());
2249   - $m = $this->Materiels->get($id);
2250   - $this->d("$m->status, $m->nom_responsable, $m->nom_createur");
2251   - $this->_testExecActionForId($action,$id,true);
2252   - }
2253   - else throw new \ErrorException("La conditions d'accès $access_condition est incorrecte (1)");
2254   - }
2255   - else throw new \ErrorException("La conditions d'accès $access_condition est incorrecte (2)");
2256   - } // testAuthorizationsForAllActionsOfController()
2257   -
2258   -
2259   - private function _MAT_updateMatosWithStatusAs($id, $status, $WITH_SAME_STATUS=true) {
2260   - $mc = new MaterielsController();
2261   - $u = $this->getCurrentUser();
2262   - $m = $this->Materiels->get($id);
2263   - $NOT = FALSE;
2264   - // Statut commence par 'NOT' ?
2265   - if (strpos($status,'NOT ') === 0) {
2266   - $NOT = TRUE;
2267   - // on prend le statut après le "NOT " :
2268   - $status = substr($status,4);
2269   - }
2270   - // Condition de statut complexe (avec un && ou un ||) ? => pour simplifiier, on ne tient compte que du statut
2271   - if ( (strpos($status,'&&')!==FALSE) || (strpos($status,'||')!==FALSE) ) {
2272   - //debug("statut complexe '$status'");
2273   - $status = explode(' ', $status)[0];
2274   - //$status = $status[0];
2275   - //debug("=> simplifié en '$status'");
2276   - }
2277   - if ($mc->isStatus($status)) {
2278   - /*
2279   - $m->status = $WITH_SAME_STATUS ? $status : $mc->getNextStatusFrom($status);
2280   - if ($NOT) $m->status = $mc->getNextStatusFrom($status);
2281   - */
2282   - // MEME statut (par défaut) ?
2283   - $m->status = $status;
2284   - //debug("bef: $m->status");
2285   - // ou STATUT différent ?
2286   - if ( ($NOT && $WITH_SAME_STATUS) || (!$NOT && !$WITH_SAME_STATUS) ) $m->status = $mc->getNextStatusFrom($status);
2287   - //debug("after: $m->status");
2288   -
2289   - // On sauvegarde le matos modifié
2290   - if (! $this->Materiels->save($m))
2291   - throw new \Exception("La sauvegarde du materiel modifié ne se fait pas !!!");
2292   - }
2293   - else throw new \Exception("Le statut du matériel est incorrect !!!");
2294   -
2295   - }
2296   -
2297   - private function _MAT_updateMatosBelongingToCurrentUserAndInSameGroup($id, $BELONGS=true, $SAMEGROUP=true) {
2298   - $u = $this->getCurrentUser();
2299   - $m = $this->Materiels->get($id);
2300   - // BELONGS ?
2301   - $user_name = $BELONGS ? $u->nom : 'inconnu'; // 'user5 USER'
2302   - $m->nom_responsable = $user_name;
2303   - $m->nom_createur = $user_name;
2304   -
2305   - // SAME GROUP ?
2306   - $WRONG_GROUP_ID = 2;
2307   - $groupe_thematique_id = $SAMEGROUP ? $u->groupes_thematique_id : $WRONG_GROUP_ID;
2308   - $groupe_metier_id = $SAMEGROUP ? $u->groupes_metier_id : $WRONG_GROUP_ID;
2309   - $m->groupes_thematique_id = $groupe_thematique_id;
2310   - $m->groupes_metier_id = $groupe_metier_id;
2311   - //debug($matos);
2312   -
2313   - // On sauvegarde le matos modifié
2314   - if (! $this->Materiels->save($m))
2315   - throw new \Exception("La sauvegarde du materiel modifié ne se fait pas !!!");
2316   - }
2317   -
2318   -
2319   - private function _MAT_testExecActionForId($action,$id,$SHOULD_BE_SUCCESS) {
2320   - //debug($this->_flashMessages);
2321   -
2322   - $entities = 'materiels';
2323   - //$getpost = in_array($action, ['add','add_by_copy','edit','delete', 'statusCreated']) ? 'post' : 'get';
2324   - $getpost = in_array($action, ['view', 'index', 'find', 'printLabelRuban']) ? 'get':'post';
2325   - //$getpost = in_array($action, ['view', 'index', 'find']) ? 'get':'post';
2326   - //$this->post("/materiels/$action/$matos_id");
2327   - // Si 'add' ou 'index' => pas d'id
2328   - //debug("0"); debug($_SESSION);
2329   -
2330   - $data = ($action=='add') ? $this->newMaterielWithAllMandatoryFields : [];
2331   - $exec_action = $action;
2332   - if ($action=='add_by_copy') $exec_action='add';
2333   - $full_action = "/$entities/$exec_action";
2334   - if (! in_array($action, ['add', 'index'])) $full_action .= "/$id";
2335   - $this->d("Execution action : \$this->$getpost($full_action, data); (avec data=)"); $this->d($data);
2336   - // GET
2337   - if ($getpost=='get')
2338   - $this->$getpost($full_action);
2339   - // POST
2340   - else
2341   - $this->$getpost($full_action, $data);
2342   - //debug("2"); debug($_SESSION);return;
2343   - //debug($_SESSION);return;
2344   - /*
2345   - if ($SUCCESS) $this->assertNoRedirect();
2346   - else $this->assertRedirect();
2347   - */
2348   - //$this->get('/materiels/view/2');
2349   - //$res = $this->_getBodyAsString();
2350   - //$res = $this->_getBodyAsString(); debug($res);
2351   - //debug($this->_flashMessages);
2352   - //debug($_SESSION);
2353   - //debug($flash_message);
2354   -
2355   - // Normalement, l'action devrait avoir été autorisée
2356   -
2357   - if ($SHOULD_BE_SUCCESS) {
2358   - $flash_message = null;
2359   - $this->assertResponseSuccess();
2360   - if ($action=='printLabelRuban') {
2361   - /*
2362   - $this->assertFileResponse('inventirap_label.label', 'pas de fichier généré');
2363   - $this->assertHeader('Content-type', 'application/xml');
2364   - $this->assertHeader('Content-Type', 'application/xml');
2365   - */
2366   - //var_dump($this->_getBodyAsString());
2367   - $filename = 'inventirap_label.label';
2368   - $this->assertHeader('Content-Disposition', 'attachment; filename="'.$filename.'"');
2369   - //$this->assertHeader('Content-Disposition', "attachment; filename='$filename'");
2370   - $msg_error = "L'action $action n'est pas autorisée (pour le role {$this->getUserRole()}) alors qu'elle devrait !!!";
2371   - $this->assertResponseContains("ContinuousLabel", $msg_error);
2372   - $this->assertResponseContains("<PaperOrientation>Landscape</PaperOrientation>", $msg_error);
2373   - }
2374   - if ($getpost == 'get') {
2375   - $this->assertResponseOk();
2376   - $this->assertResponseNotEmpty();
2377   - $this->assertNoRedirect();
2378   - if (isset($_SESSION['Flash'])) {
2379   - $flash_message = $_SESSION['Flash'];
2380   - //$this->assertEquals([], $flash_message);
2381   - }
2382   - }
2383   - else {
2384   - $expected_flash_message = 'Le matériel a bien été ';
2385   - switch($action) {
2386   - case 'add':
2387   - case 'add_by_copy': $expected_flash_message .= 'ajouté'; break;
2388   - case 'edit': $expected_flash_message .= 'modifié'; break;
2389   - case 'delete': $expected_flash_message .= 'supprimé'; break;
2390   -
2391   - case 'statusCreated': $expected_flash_message .= 'rétrogradé au statut CREATED'; break;
2392   - case 'statusValidated': $expected_flash_message .= 'validé'; break;
2393   - case 'statusTobearchived': $expected_flash_message = "La sortie d'inventaire a bien été demandée"; break;
2394   - case 'statusArchived': $expected_flash_message .= "archivé (sorti de l'inventaire)"; break;
2395   -
2396   - case 'setLabelIsPlaced':
2397   - case 'setLabelIsNotPlaced':
2398   - $verb = ($action=='setLabelIsPlaced') ? 'a' : "n'a pas";
2399   - $expected_flash_message = "Je prends note que l'étiquette $verb été collée sur le matériel"; break;
2400   - }
2401   - $flash_message = isset($_SESSION['Flash']) ? $_SESSION['Flash']['flash'][0]['message']:[];
2402   - //if ($flash_message==null) $flash_message = [];
2403   - }
2404   - debug("action $action, flash is:");debug($flash_message);
2405   - /*
2406   - * Test flash message
2407   - * (https://book.cakephp.org/3/en/development/testing.html#testing-flash-messages)
2408   - *
2409   - * If you want to assert the presence of flash messages in the session and not the rendered HTML,
2410   - * you can use enableRetainFlashMessages() in your tests
2411   - * to retain flash messages in the session so you can write assertions :
2412   - *
2413   - * $this->enableRetainFlashMessages();
2414   - */
2415   - if ($flash_message) {
2416   - // Assert a flash message in the 'flash' key.
2417   - // Test message partiel
2418   - $this->assertTrue(strpos($flash_message, $expected_flash_message) === 0, "Le message flash est incorrect : $flash_message");
2419   - // Test message complet
2420   - $this->assertFlashMessage($expected_flash_message, 'flash');
2421   - //$this->assertEquals($expected_flash_message, $flash_message);
2422   - }
2423   -
2424   - //$this->assertResponseContains("Matos Test 2 (C)", "L'action $action n'est pas autorisée (pour le role {$this->getUserRole()}) !!!");
2425   - // BUG !!!! pourquoi ça marche avec l'action 'view' ???
2426   - //$this->assertResponseContains("Désolé, vous n&#039;êtes pas autorisé à accéder à cette zone", "(2)L'action $action n'est pas autorisée (pour le role {$this->getUserRole()}) !!!");
2427   - //$this->assertResponseNotContains("Désolé, vous n", "L'action $action n'est pas autorisée (pour le role {$this->getUserRole()}) alors qu'elle le devrait !");
2428   - }
2429   -
2430   - // Normalement, l'action devrait avoir été refusée
2431   -
2432   - else {
2433   - // 1) Assert redirect
2434   - //$this->assertRedirect(['controller' => 'Users', 'action' => 'login']);
2435   - //$this->assertRedirect(['controller' => 'Pages', 'action' => 'home']);
2436   - //$this->assertResponseSuccess();
2437   - $this->assertResponseEmpty();
2438   - //if (!in_array($action,['add_by_copy'])) $this->assertResponseEmpty();
2439   - //if ($getpost == 'get') $this->assertRedirect('/');
2440   - if (!in_array($action,['edit','delete'])) $this->assertRedirect('/');
2441   -
2442   - // 2) Assert Flash error message (flash message in the 'flash' key)
2443   - // Assert a flash messages uses the error element
2444   - $this->assertFlashElement('Flash/error');
2445   - $expected_flash_message = "Désolé, vous n'êtes pas autorisé à accéder à cette zone.";
2446   - //var_dump($flash_message);
2447   - // Test message complet
2448   - $this->assertFlashMessage($expected_flash_message, 'flash');
2449   - $this->assertSession($expected_flash_message, 'Flash.flash.0.message');
2450   - $flash_message = $_SESSION['Flash']['flash'][0]['message'];
2451   - $this->assertEquals($expected_flash_message, $flash_message);
2452   - //$this->assertTrue(strpos($flash_message, "Désolé, vous n'êtes pas") !== false);
2453   - $this->assertTrue(strpos($flash_message, "Désolé, vous n'êtes pas") === 0);
2454   - // BUG !!! why ???
2455   - //$this->assertResponseContains("Désolé", "L'action $action est autorisée (pour le role {$this->getUserRole()}) alors qu'elle ne le devrait pas !");
2456   - }
2457   - } // _testExecActionForId()
  2114 +
2458 2115  
2459 2116 /**
2460 2117 * @dataProvider dataProviderRoles4
... ...
tests/TestCase/Controller/SurCategoriesControllerTest.php
... ... @@ -111,8 +111,12 @@ class SurCategoriesControllerTest extends General
111 111 * @return void
112 112 *
113 113 * @dataProvider dataProviderActionsAndRoles4
  114 + *
  115 + * @requires PHP 7
  116 + * (https://phpunit.readthedocs.io/fr/latest/incomplete-and-skipped-tests.html#sauter-des-tests-en-utilisant-requires)
114 117 */
115 118 public function testAuthorizationsForAllActionsOnSurCategories($action, $role_short, $role_long) {
  119 + //public function OFF_car_OK_only_with_php7_testAuthorizationsForAllActionsOnSurCategories($action, $role_short, $role_long) {
116 120 /*
117 121 $entities_name = $this->getEntitiesName();
118 122 debug($entities_name);
... ... @@ -122,6 +126,7 @@ class SurCategoriesControllerTest extends General
122 126 $nb = $this->getNbEntitiesInFixture();
123 127 debug("nb is $nb");
124 128 */
  129 + //debug("surcateg done");
125 130 // call parent General
126 131 $this->_testAuthorizationsForAllControllerActions($action, $role_short, $role_long);
127 132 }
... ...