Commit eb30262ce9febceef5e9f29f795e921ca4df9dfc
1 parent
8cd3a34f
Exists in
master
and in
1 other branch
Quelques bugfixes du test de la vue matériels/view...
Showing
9 changed files
with
327 additions
and
517 deletions
Show diff stats
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, [ | ... | ... |
... | ... | @@ -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'ê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 | } | ... | ... |