donc prochain créé doit être en -0003 const yyyy2 = yyyy0-2; // max : 'TEST-'.yyyy2.'-0010' => donc prochain créé doit être en -0010 const yyyy3 = yyyy0-3; // AVIRER //private $nb_matos_in_fixture = 7; const nb_matos_in_fixture = 7; /** * App\Controller\MaterielsController Test Case */ class MaterielsControllerTest extends General { //class MaterielsControllerTest extends IntegrationTestCase { // Si DEBUG, affiche plus d'infos //private $DEBUG=false; //private $DEBUG=true; /** * Fixtures * * @var array */ public $fixtures = [ 'app.Configurations', 'app.Materiels', //'app.sur_categories', 'app.SurCategories', 'app.Categories', //'app.sous_categories', 'app.SousCategories', //'app.groupes_thematiques', 'app.GroupesThematiques', 'app.GroupesMetiers', // - Marche pas avec majuscule sur inventirap ? 'app.Projets', //'app.fakeldapusers', 'app.Fakeldapusers', 'app.Users', 'app.Organismes', 'app.Sites', 'app.Documents', //'app.type_documents', 'app.TypeDocuments', 'app.Suivis', //'app.type_suivis', 'app.TypeSuivis', 'app.Emprunts', 'app.Fournisseurs', 'app.Unites' ]; /* private $statuses = [ 'CREATED', 'VALIDATED', 'TOBEARCHIVED', 'ARCHIVED' ]; */ private $STATUSES = MaterielsController::statuses; protected $MATOS_STATUSES = [ ['CREATED'], ['VALIDATED'], ['TOBEARCHIVED'], ['ARCHIVED'] /* */ ]; const mandatoryFieldsForCreation = [ //'id', 'designation', 'sur_categorie_id', 'categorie_id', //'materiel_administratif', 'materiel_technique', //'status' => 'CREATED', 'date_acquisition' ]; private $newMaterielWithAllMandatoryFields = [ //'id' => 16, //'designation' => 'Test 15', 'designation' => 'Test '.(nb_matos_in_fixture+1), 'sur_categorie_id' => 1, 'categorie_id' => 1, 'materiel_administratif' => 0, 'materiel_technique' => 1, //'date_acquisition' => '19-04-2020', //+4 //'date_acquisition' => '19-04-2019', // Ca marche pas dans le sens US yyyy-mm-dd alors que ça marche dans la fixture, WHY ??? //'date_acquisition' => yyyy1.'-04-19', //+4 // Donc format FR dd-mm-yyyy //'date_acquisition' => '19-04-'.yyyy1, 'date_acquisition' => '19/04/'.yyyy1, // pas obligatoire, mais plus cohérent car c'est le statut minimum ////'status' => 'CREATED', /* 'nom_responsable' => 'Jacques Utilisateur', 'email_responsable' => 'Jacques.Utilisateur@irap.omp.eu' 'nom_createur' => 'Pallier Etienne', 'nom_modificateur' => 'Jean Administration', */ // CHAMPS NECESSAIRES POUR MATERIEL VALIDATED : /* 'date_reception' => '2016-04-19', 'nom_responsable' => 'Lorem ipsum dolor sit amet', 'fournisseur_id' => 1 'organisme_id' => 1, 'prix_ht' => 75, 'numero_commande' => 'Lorem ipsum dolor sit amet', */ ]; /* //@override parent protected function getEntitiesName() { return 'Materiels'; } */ //@Override parent // PAS le 1 (ni le 3 ni le 12) car il a des suivis et donc on ne pourra pas le supprimer !!! static protected function _getEntityIdOkForTesting() { return 2; } private function _getNextNum4DigitsAfter($num4digits) { $num4digits_next = intval($num4digits)+1; //debug($num4digits, $num4digits_next); $num4digits_next = sprintf('%04d',$num4digits_next); //debug($num4digits, $num4digits_next); return $num4digits_next; } protected function getNewEntityWithAllMandatoryFields() { return $this->newMaterielWithAllMandatoryFields; } //private function _getNbMaterielsInIndexViewForRole($role) { protected function _getNbMaterielsInIndexViewForCurrentRole() { // ADMIN(+) : tous if ($this->USER_IS_ADMIN_AT_LEAST()) return $this->getNbEntitiesInFixture(); // Sinon : tous sauf le matos archived return $this->getNbEntitiesInFixture()-1; } protected function getNbEntitiesExpectedInIndexView() { return $this->_getNbMaterielsInIndexViewForCurrentRole(); } /* * * FONCTIONS UTILITAIRES UTILISÉES PAR LES TESTS * */ /** * setUp method * * @return void */ public function setUp() { //$this->toto = 'titi'; parent::setUp(); // Initialisation du tableau $this->is_authorized_action ///$this->_setAuthorizations(); $config = TableRegistry::exists('Materiels') ? [] : [ 'className' => 'App\Model\Table\MaterielsTable' ]; $this->Materiels = TableRegistry::getTableLocator()->get('Materiels', $config); /* moved to class General // Check qu'on lit bien la table configurations de la BD de test !! $confLabinvent = TableRegistry::getTableLocator()->get('Configurations')->find()->first(); //assert($confLabinvent->ldap_authenticationType == 'uid', 'On ne lit pas la bonne configuration'); //debug($confLabinvent->ldap_authenticationType); $this->assertTextEquals('uid', $confLabinvent->ldap_authenticationType, 'On ne lit pas la bonne configuration'); $this->assertTextNotEquals('samaccountname', $confLabinvent->ldap_authenticationType, 'On ne lit pas la bonne configuration'); $this->assertTextEquals('TEST', $confLabinvent->labNameShort, 'On ne lit pas la bonne configuration'); */ /* $config = TableRegistry::exists('Suivis') ? [] : [ 'className' => 'App\Model\Table\SuivisTable' ]; $this->Suivis = TableRegistry::get('Suivis', $config); */ //$this->ControllerMateriels = new MaterielsController(); } /** * tearDown method * * @return void */ public function tearDown() { unset($this->Materiels); //unset($this->Suivis); //unset($this->ControllerMateriels); parent::tearDown(); } /* (EP 20200515) moved to General.php // This are data providers used for a lot of tests // See https://jtreminio.com/2013/03/unit-testing-tutorial-part-2-assertions-writing-a-useful-test-and-dataprovider public function dataProviderRoles5() { return $this->ROLES5; } // Idem dataProviderRoles5 mais avec USER_from_ldap en plus: public function dataProviderRoles6() { return $this->ROLES6; } */ //public function dataProviderStatuses4() { return $this->MATOS_STATUSES; } /* public function dataProviderRoles4AndStatuses4() { $roles_and_statuses = []; foreach ($this->ROLES4 as $user_role) { //debug($user_role[0]); foreach ($this->MATOS_STATUSES as $matos_status) $roles_and_statuses[] = [$user_role[0], $matos_status[0]]; } $this->d($roles_and_statuses); return $roles_and_statuses; } */ /* protected function getController() { if (!$this->controller_instance) $this->controller_instance = new MaterielsController(); return $this->controller_instance; } */ // (EP) moved to parent /* public function dataProviderActionsAndRoles4() { $actions_and_roles = []; $actions = MaterielsController::getActions(); debug("Liste des Actions à tester:");debug($actions); //foreach ($actions as $a) echo("$a\n"); /S $actions = [ // CRUD 'add','add_by_copy', 'view','index','edit','delete', //'view', //'index', // Autres 'statusCreated', ]; S/ $roles4 = [ 'user', 'resp', 'admin', 'super', ]; foreach ($actions as $action) //foreach ([0] as $i) { //foreach ([0,1] as $i) { foreach ([0,1,2,3] as $i) { $item = [ $action, $roles4[$i], $this->ROLES4[$i][0] ]; //debug($item); $actions_and_roles[] = $item; } return $actions_and_roles; } */ /* private function _checkMaterielExistsInViewsIndexAndViewAndInDatabase($role, $id, $designation=NULL, $num_inventaire=NULL) {} private function _checkMaterielExistsInViewsIndexAndView($role, $id, $designation=NULL, $num_inventaire=NULL) {} private function _checkMaterielExistsInViewIndex($role, $id, $designation=NULL, $num_inventaire=NULL) {} private function _checkMaterielExistsInViewView($role, $id, $designation=NULL, $num_inventaire=NULL) {} private function _checkMaterielExistsInDatabase($role, $id, $designation=NULL, $num_inventaire=NULL) {} private function _checkMaterielViewIsOK($role, $id, $designation=NULL, $num_inventaire=NULL) {} */ private function _checkNbMaterielInIndexViewIs($SHOUD_BE_ADDED, $role, $nbmat, $designation=NULL, $num_inventaire=NULL) { $this->get('/materiels/index'); if (! $SHOUD_BE_ADDED) { //$this->assertResponseNotContains("Liste des matériels (".$nbmat.")", $role); $nbmat--; $this->assertResponseContains("Liste des matériels ($nbmat)", $role); } else { $this->assertResponseContains("Liste des matériels ($nbmat)", "Nb matériels incorrect ($role)"); if (isset($designation)) $this->assertResponseContains($designation, "Le matériel ne s'ajoute pas correctement."); if (isset($num_inventaire)) $this->assertResponseContains($num_inventaire, "La génération du n°de labo n'est pas bonne."); } } private function _checkNbMaterielInIndexViewAfterActionIsOK($authorized, $action, $nbmat_awaited, $role) { $this->get('/materiels/index'); $this->assertResponseContains("Liste des matériels ($nbmat_awaited)", "Nb matériels incorrect dans la vue 'index' : L'action $action ne s'est pas déroulée comme prévu (autorisée ? ".(int)$authorized.") ! (rôle = $role)"); } // (EP) moved to parent /* private function _MAT_checkNbEntitiesInIndexViewIsAsAwaited($entity_name,$nbmat_awaited) { $entity_name = strtolower($entity_name); //$this->get('/materiels/index'); $this->get("/$entity_name/index"); if ($entity_name=='materiels') $entity_name = 'matériels'; //debug($_SESSION);return; $this->assertResponseOk(); $this->assertResponseContains("Liste des $entity_name ($nbmat_awaited)", "Le nombre d'entités dans la vue 'index' est incorrect"); } */ private function _checkNbMaterielInIndexViewIsAsAwaited($nbmat_awaited) { $this->get('/materiels/index'); //debug($_SESSION);return; $this->assertResponseOk(); $this->assertResponseContains("Liste des matériels ($nbmat_awaited)", "Le nombre de matériels dans la vue 'index' est incorrect"); } /* * Tests organisés par (CONTROLEUR puis par) ACTION * * Ici, on teste les ACTIONS du controleur MaterielsController * Voir https://docs.google.com/document/d/1-OhEeoi96j6ueUl5NQCQ9ZsTfbJTFw3ZVaWU2iYly_o/edit#heading=h.bxuswhw2zzwt * * Chaque test d'une ACTION doit tester l'appel de cette action pour chaque ROLE * */ /* * ***************************************************************************** * Basic ACL testing ($easyACL array rules) * ***************************************************************************** */ public function testOLDEasyACL() { $matCont = new MaterielsController(); $appCont = new AppController(); /* $role = 'USER_from_ldap'; $this->authAs($role); $roleLong = $appCont->getUserRole(); */ /* * SCHOOL CASES */ $roleLong = 'Utilisateur'; // CAS1 $this->_testEasyACL($matCont, $roleLong, 'action_CAS1_Y', 'Y'); $this->_testEasyACL($matCont, $roleLong, 'action_CAS1_N', 'N'); // CAS2 $this->_testEasyACL($matCont, $roleLong, 'action_CAS2_Y', 'Y'); $this->_testEasyACL($matCont, $roleLong, 'action_CAS2_N', 'N'); // CAS3 $this->_testEasyACL($matCont, $roleLong, 'action_CAS3_Y', 'Y'); $this->_testEasyACL($matCont, $roleLong, 'action_CAS3_N', 'N'); // CAS4 $this->_testEasyACL($matCont, $roleLong, 'action_CAS4_Y', 'Y'); $this->_testEasyACL($matCont, $roleLong, 'action_CAS4_N', 'N'); // CAS5 $this->_testEasyACL($matCont, $roleLong, 'action_unknown_CAS5_Y', 'Y'); // CAS6 /* $role = 'RESP'; $this->authAs($role); $roleLong = $appCont->getUserRole(); */ $roleLong = 'Responsable'; $this->_testEasyACL($matCont, $roleLong, 'action_CAS6_resp_Y', 'Y'); $this->_testEasyACL($matCont, $roleLong, 'action_CAS6_resp_N', 'N'); /* $role = 'ADMIN'; $this->authAs($role); $roleLong = $appCont->getUserRole(); */ $roleLong = 'Administration'; $this->_testEasyACL($matCont, $roleLong, 'action_CAS6_admin_Y', 'Y'); $this->_testEasyACL($matCont, $roleLong, 'action_CAS6_admin_N', 'N'); /* * REAL CASES */ $roleLong = 'Utilisateur'; // add as USER $this->_testEasyACL($matCont, $roleLong, 'add', 'Y'); // edit $this->_testEasyACL($matCont, 'Utilisateur', 'edit', '(status == CREATED || status == VALIDATED) && (is_creator || is_user)'); $this->_testEasyACL($matCont, 'Responsable', 'edit', '(status == CREATED || status == VALIDATED) && is_resp'); $this->_testEasyACL($matCont, 'Administration', 'edit', '(status == CREATED || status == VALIDATED)'); $this->_testEasyACL($matCont, 'Administration Plus', 'edit', '(status == CREATED || status == VALIDATED)'); $this->_testEasyACL($matCont, 'Super Administrateur', 'edit', '(status == CREATED || status == VALIDATED)'); // delete $this->_testEasyACL($matCont, 'Utilisateur', 'delete', '(status == CREATED) && is_owner'); $this->_testEasyACL($matCont, 'Responsable', 'delete', '(status == CREATED)'); $this->_testEasyACL($matCont, 'Administration', 'delete', '(status == CREATED)'); $this->_testEasyACL($matCont, 'Administration Plus', 'delete', '(status == CREATED)'); $this->_testEasyACL($matCont, 'Super Administrateur', 'delete', '(status == CREATED)'); // statusCreated $this->_testEasyACL($matCont, 'Utilisateur', 'statusCreated', 'N'); $this->_testEasyACL($matCont, 'Responsable', 'statusCreated', 'N'); $this->_testEasyACL($matCont, 'Administration', 'statusCreated', 'Y'); $this->_testEasyACL($matCont, 'Administration Plus', 'statusCreated', 'Y'); $this->_testEasyACL($matCont, 'Super Administrateur', 'statusCreated', 'Y'); /* $action='autre4'; $rule = $matCont->isAuthorizedAction($matCont, $roleLong, $action); $this->assertEquals('N', $rule, $roleLong.' do '.$action); */ } private function _testEasyACL(AppController $controller, $roleLong, $action, $expectedRule) { $rule = $controller->OLD_isAuthorizedAction2($controller, $roleLong, $action); $this->assertEquals($expectedRule, $rule, $roleLong.' do '.$action); } /* * ***************************************************************************** * ACTION READ * (1) READ ALL (index) : Voir la liste des matériels * ***************************************************************************** */ /** * Test index method * * @return void */ // test INDEX action /* public function testMat20ReadAll() { foreach ($this->ROLES as $role) $this->_testMatReadAllAs($role); } */ /* public function testMat20ReadAllAsUserFromLdap() { $this->_testMatReadAllAs('USER_from_ldap'); } public function testMat20ReadAllAsUserFromTable() { $this->_testMatReadAllAs('USER'); } public function testMat20ReadAllAsResp() { $this->_testMatReadAllAs('RESP'); } public function testMat20ReadAllAsAdmin() { $this->_testMatReadAllAs('ADMIN'); } public function testMat20ReadAllAsAdminP() { $this->_testMatReadAllAs('ADMINP'); } public function testMat20ReadAllAsSuperAdmin() { $this->_testMatReadAllAs('SUPER'); } private function _testMatReadAllAs($role) */ /** * @dataProvider dataProviderRoles4 */ public function testMat20ReadAllAs($role) { //$this->setUp(); // On doit pouvoir accéder à la page une fois authentifié $this->authAs($role); // - 5 ans $this->get('/materiels/index'); // Tous //$this->get('/materiels/index?age=0'); $this->assertNoRedirect("Authentifié mais redirection vers /users/login."); // Seul admin+ peut voir les materiels archivés et a accès à des filtres par statut + bouton exporter + cases à cocher //if ( in_array($role, ['ADMIN','ADMINP','SUPER']) ) { if ($this->USER_IS_ADMIN_AT_LEAST()) { $this->assertResponseContains('Liste des matériels (7)', 'Le profil '.$role.' devrait voir les matériels archivés.'); $this->assertResponseContains("A valider", 'Le profil '.$role.' devrait avoir accès à des filtres par statut.'); $this->assertResponseContains("A sortir", 'Le profil '.$role.' devrait avoir accès à des filtres par statut.'); } else { $this->assertResponseContains("Liste des matériels (6)", 'Le profil '.$role.' ne devrait PAS voir les matériels archivés.'); $this->assertResponseNotContains("A valider", 'Le profil '.$role.' ne devrait PAS avoir accès à des filtres par statut.'); } $this->assertResponseContainsIf($role, ($this->getUserRole() != 'Utilisateur'), ["Exporter la liste complète"=>"un bouton Exporter"]); //$this->get('/materiels/index/CREATED'); $this->get('/materiels/index?status=CREATED'); //TODO: il faudrait remplacer "false" par "true" dans ce test $this->assertResponseContainsIf( $role, //in_array($role,['ADMIN','ADMINP','SUPER']), $this->USER_IS_ADMIN_AT_LEAST(), [ "checkbox" => "à des checkboxes", "Exporter la liste des matériels cochés" => "au bouton d'exportation de liste", "Valider les matériels cochés" => "au bouton de validation de liste" ], false ); /* if ( in_array($role, ['ADMIN','ADMINP','SUPER']) ) { $this->assertResponseContains('checkbox', 'Le profil '.$role.' devrait avoir accès à des checkboxes'); $this->assertResponseContains("Exporter la liste des matériels cochés", 'Le profil '.$role.' devrait avoir accès au bouton d\'exportation de liste'); $this->assertResponseContains("Valider les matériels cochés", 'Le profil '.$role.' devrait avoir accès au bouton de validation de liste'); } else { } */ //$this->tearDown(); } public function testMat21ReadAllAsAnonymous() { // test INDEX action // On ne doit pas avoir accès sans authentification $this->get('/materiels/index'); // $this->assertRedirect('/users/login', 'Problème : Accès à materiels/index SANS AUTHENTIFICATION'); // Le changement est dû au changement de version de cakephp 3.2 vers 3.4 $this->assertRedirect('/users/login?redirect=%2Fmateriels%2Findex', 'Problème : Accès à materiels/index SANS AUTHENTIFICATION'); } /* * ***************************************************************************** * ACTION READ * (2) READ ONE (view/id) : Voir le détail d'un matériel * ***************************************************************************** */ /** * Test view method * * @group failing * @return void */ /* public function testMat10ReadOne() { // test VIEW action foreach ($this->ROLES as $role) $this->_testMatReadOneAs($role); } */ // test VIEW action /* public function testMat10ReadOneAsUserFromLdap() { $this->_testMatReadOneAs('USER_from_ldap'); } public function testMat10ReadOneAsUserFromTable() { $this->_testMatReadOneAs('USER'); } public function testMat10ReadOneAsResp() { $this->_testMatReadOneAs('RESP'); } public function testMat10ReadOneAsAdmin() { $this->_testMatReadOneAs('ADMIN'); } public function testMat10ReadOneAsAdminPlus() { $this->_testMatReadOneAs('ADMINP'); } public function testMat10ReadOneAsSuperAdmin() { $this->_testMatReadOneAs('SUPER'); } private function _testMatReadOneAs($role) */ /** * @dataProvider dataProviderRoles4 */ public function testMat10ReadOneAs($role) { //$this->setUp(); //$this->authSuperAdmin(); $this->authAs($role); /* $myrole = $this->getUserRole(); $this->assertEquals('Super Administrateur', $myrole); */ $this->get('/materiels/view/3'); $this->assertResponseContains("Test 3", "Le matériel retourné n'est pas celui demandé."); $this->assertResponseContains('alt="QrCode', "Le QRCode n'est pas sur la vue matériel."); $this->assertResponseContains("Suivi(s) du matériel (1)", "Le nb de suivis liés au matériel est incorrect."); $this->assertResponseContains("Informations", "Le nb de suivis liés au matériel est incorrect."); $this->assertResponseContains("Suivi(s)", "Le nb de suivis liés au matériel est incorrect."); $this->assertResponseContains("Suivi(s) du matériel (", "Le nb de suivis liés au matériel est incorrect."); $this->assertResponseContains("Emprunt(s) du matériel (1)", "Le nb d'emprunts liés au matériel est incorrect."); $this->assertResponseContains("Emprunt", "Le nb d'emprunts liés au matériel est incorrect."); //$this->assertResponseContains("Fichier(s) lié(s) au matériel (1)", "Le nb de fichiers liés au matériel est incorrect."); // Only admin+ see admin section: //if ( in_array($role, ['ADMIN','ADMINP','SUPER']) ) { if ($this->USER_IS_ADMIN_AT_LEAST()) { $this->assertResponseContains("Informations administratives"); $this->assertResponseContains("Centre(s) Financier(s) / EOTP"); } else $this->assertResponseNotContains("Informations administratives"); //$this->tearDown(); } /* * ***************************************************************************** * ACTION CREATE (add) : Créer un matériel * ***************************************************************************** */ /** * Test testMat30AccessCreateForm * * @return void */ /* public function testMat30AccessCreateForm() { foreach ($this->ROLES as $role) $this->_testMatAccessCreateFormAs($role); } */ /* public function testMat30AccessCreateFormAsUserFromLdap() { $this->_testMatAccessCreateFormAs('USER_from_ldap'); } public function testMat30AccessCreateFormAsUser() { $this->_testMatAccessCreateFormAs('USER'); } public function testMat30AccessCreateFormAsResp() { $this->_testMatAccessCreateFormAs('RESP'); } public function testMat30AccessCreateFormAsAdmin() { $this->_testMatAccessCreateFormAs('ADMIN'); } public function testMat30AccessCreateFormAsAdminPlus() { $this->_testMatAccessCreateFormAs('ADMINP'); } public function testMat30AccessCreateFormAsSuperAdmin() { $this->_testMatAccessCreateFormAs('SUPER'); } private function _testMatAccessCreateFormAs($role) */ /** * @dataProvider dataProviderRoles4 */ public function testMat30AccessCreateFormAs($role) { //$this->setUp(); // On doit pouvoir accéder à la page une fois authentifié $this->authAs($role); $this->get('/materiels/add'); $this->assertResponseContains('Ajouter', 'La page n\'existe pas'); $this->assertResponseContainsIf( $role, //in_array($role,['ADMIN', 'ADMINP', 'SUPER']), $this->USER_IS_ADMIN_AT_LEAST(), ["EOTP" => "à la partie administrative sur le formulaire add"] ); /* $this->assertResponseNotContains('EOTP', 'Le profil utilisateur a accès à la partie administrative sur le formulaire add.'); $this->assertResponseContains('EOTP', 'Le profil admin+ n\'a pas accès à la partie administrative sur le formulaire add.'); */ //$this->tearDown(); } /** * Test testMat31Create * * @return void */ /* public function testMat31CreateAsSuper() { $this->_testMatCreateAs('SUPER'); } public function testMat31CreateAsAdminp() { $this->_testMatCreateAs('ADMINP'); } public function testMat31CreateAsAdmin() { $this->_testMatCreateAs('ADMIN'); } public function testMat31CreateAsResp() { $this->_testMatCreateAs('RESP'); } public function testMat31CreateAsUser() { $this->_testMatCreateAs('USER'); } public function testMat31CreateAsUserFromLdap() { $this->_testMatCreateAs('USER_from_ldap'); } */ /* public function testMat32CreateAdministratifOrTechnicalAsSuper() { $this->_testMatCreateAdministratifOrTechnicalAs('SUPER'); } private function _testMatCreateAdministratifOrTechnicalAs($role) { */ /** * @dataProvider dataProviderRoles4 */ public function DEACTIVATED_testMat32CreateAdministratifOrTechnicalAs($role) { $newMateriel = $this->newMaterielWithAllMandatoryFields; $fields = ['materiel_administratif','materiel_technique']; // test with materiel_administratif and materiel_technique, all combinations from (0,0) to (1,1) //for ($i=0,$j=0; $i<=1,$j<=1 ; $i++,$j++) { //for ($i=0; $i<=1 ; $i++) { $materiels = $this->Materiels; //foreach ([0] as $i) { foreach ([0,1] as $i) { //for ($j=0; $j<=1 ; $j++) { //foreach ([1] as $j) { foreach ([0,1] as $j) { $newMateriel["$fields[0]"] = $i; $newMateriel["$fields[1]"] = $j; $combination = [$i,$j]; $this->d($combination); // KO: ni administratif ni technique if ($combination == [0,0]) $this->_testMatCreate1FailsAs($role, $newMateriel, implode(',',$combination)); // OK : technique only if ($combination == [0,1]) { continue; // cree un nouveau materiel //$this->_testMatCreateAs($role, $newMateriel, implode(',',$combination)); //$this->testMat31CreateAs($role, $newMateriel, implode(',',$combination)); /* $this->authAs($role); $this->get('/materiels/index'); $this->assertResponseContains("Liste des matériels (6)", $role.','.implode($combination)); */ $this->testMat31CreateAs($role, $newMateriel); //$matos = $this->Materiels->get(11); // supprimer un materiel pour avoir toujours le meme nombre //TODO: impossible de supprimer le matos 1, why ??? //$this->post('/materiels/delete/1'); //$this->post('/materiels/delete/11'); // marche pas, pourquoi ??? //$matos = $this->Materiels->get(11); $matos = $materiels->get(11); //pr($matos); $materiels->delete($matos); $this->get('/materiels/index'); $nbmat = $this->USER_IS_ADMIN_AT_LEAST() ? 7 : 6; $this->assertResponseContains("Liste des matériels (".$nbmat.")", "Le matériel (11) n'a pas été supprimé comme attendu ! (".$role.', combinaison '.implode($combination).')'); } // Administratif : (1,0) et (1,1) : ok si prix > 800 // No need to test the case [1,1] because same as [1,0] if ($combination == [1,0]) { //if ($i == 1) { // prix null => fails $this->_testMatCreate1FailsAs($role, $newMateriel, implode(',',$combination)); // prix < 800 => fails $newMateriel['prix_ht'] = 799; $this->_testMatCreate1FailsAs($role, $newMateriel, implode(',',$combination)); // prix >= 800 => ok $newMateriel['prix_ht'] = 800; // 1000 //debug($newMateriel); $this->testMat31CreateAs($role, $newMateriel, implode(',',$combination)); /* // supprimer un materiel pour avoir toujours le meme nombre //TODO: impossible de supprimer le matos 1, why ??? //$this->post('/materiels/delete/1'); $this->post('/materiels/delete/2'); $this->get('/materiels/index'); $nbmat = $this->USER_IS_ADMIN_AT_LEAST($role) ? 7 : 6; $this->assertResponseContains("Liste des matériels (".$nbmat.")", $role.','.implode($combination)); */ } } // j } // i } // testMat32CreateAdministratifOrTechnicalAs(role) /** * @dataProvider dataProviderRoles4 */ //private function _testMatCreateAs($role, $materiel=null) { $this->testMat31CreateAs($role, $materiel); } public function testMat31CreateAs($role, $materiel=null) { //debug("************* in testMat31CreateAs(role, matos) avec role $role"); //$materiel = $materiel ? $this->newMaterielWithAllMandatoryFields : $materiel; if (is_null($materiel)) $materiel = $this->newMaterielWithAllMandatoryFields; //debug($materiel); //$this->setUp(); // On doit pouvoir accéder à la page une fois authentifié $this->authAs($role); // AVANT add $this->get('/materiels/index'); // USER ne voit pas les materiels ARCHIVED //debug($this->USER_IS_ADMIN_AT_LEAST()); $nbmat = $this->USER_IS_ADMIN_AT_LEAST() ? 7 : 6; $this->assertResponseContains("Liste des matériels (".$nbmat.")", $role); //debug("bef $nbmat"); // ADD //debug($materiel); //$this->post('/materiels/add', $this->newMaterielWithAllMandatoryFields); //debug("avant"); //debug($materiel); $this->post('/materiels/add', $materiel); //debug("après"); $nbmat++; //debug("after $nbmat"); // APRES add $this->get('/materiels/index'); // VOIR LE HTML DE LA PAGE WEB //var_dump($this->_getBodyAsString()); $this->assertResponseContains("Liste des matériels (".$nbmat.")", "(testMat31CreateAs): Le matériel ne s'ajoute pas correctement (avec le profil $role)"); //$this->assertResponseContains("Liste des matériels (", "(testMat31CreateAs): Le matériel ne s'ajoute pas correctement avec le profil $role"); //$this->assertResponseContains("Test 15", "Le matériel ne s'ajoute pas correctement."); $this->assertResponseContains('Test '.(nb_matos_in_fixture+1), "Le matériel ne s'ajoute pas correctement."); //$nummat = $this->USER_IS_ADMIN_AT_LEAST() ? '15' : '13'; //$this->assertResponseContains("TEST-2020-00$nummat", "La génération du n°de labo n'est pas bonne."); //+4 $new_yyyy_highest_num = $this->_getNextNum4DigitsAfter(yyyy1_highest_num); $this->assertResponseContains('TEST-'.yyyy1.'-'.$new_yyyy_highest_num, "La génération du n°de labo n'est pas bonne."); //+4 //$this->assertResponseContains("TEST-2020-0015", "La génération du n°de labo n'est pas bonne."); //+4 //$this->tearDown(); } /* public function testValueNeccessaryNotEmpty() { $this->authSuperAdmin(); $data = [ 'id' => 16, 'designation' => 'Test 16', 'sur_categorie_id' => '', 'categorie_id' => '', 'materiel_administratif' => 0, 'materiel_technique' => 1, 'status' => 'CREATED', 'date_acquisition' => '19-04-2016', 'nom_createur' => 'Pallier Etienne', 'nom_modificateur' => 'Jean Administration', 'nom_responsable' => 'Jacques Utilisateur', 'email_responsable' => 'Jacques.Utilisateur@irap.omp.eu' ]; $this->post('/materiels/add', $data); $this->get('/materiels/index'); $this->assertResponseContains("Liste des matériels (7)", "Le matériel s'ajoute alors que les champs obligatoires ne sont pas rempli."); } */ /** * Test testMat32CreateFails * * @return void */ /* public function testMat33CreateFailsAsSuper() { $this->_testMatCreateFailsAs('SUPER'); } public function testMat33CreateFailsAsUser() { $this->_testMatCreateFailsAs('USER'); } public function testMat33CreateFailsAsUserFromLdap() { $this->_testMatCreateFailsAs('USER_from_ldap'); } private function _testMatCreateFailsAs($role) { */ /** * @dataProvider dataProviderRoles4 */ public function DEACTIVATED_testMat33CreateFailsAs($role) { // test with each mandatory field except materiel_administratif and materiel_technique foreach (self::mandatoryFieldsForCreation as $mandatoryField) { $newMaterielWithMissingMandatoryFields = $this->newMaterielWithAllMandatoryFields; $newMaterielWithMissingMandatoryFields[$mandatoryField] = null; $this->_testMatCreate1FailsAs($role, $newMaterielWithMissingMandatoryFields, $mandatoryField); } // test with missing materiel_administratif AND materiel_technique null (equivalent to 0,0) $newMaterielWithMissingMandatoryFields = $this->newMaterielWithAllMandatoryFields; $fields = ['materiel_administratif','materiel_technique']; foreach ($fields as $f) $newMaterielWithMissingMandatoryFields["$f"] = null; $this->_testMatCreate1FailsAs($role, $newMaterielWithMissingMandatoryFields, implode(',',$fields)); } private function _testMatCreate1FailsAs($role, $newMaterielWithMissingMandatoryFields, $mandatoryField) { ////$this->setUp(); //$newMaterielWithMissingMandatoryFields = $this->newMaterielWithAllMandatoryFields; //$newMaterielWithMissingMandatoryFields['sur_categorie_id'] = null; /* Mandatory fields : 'id' => 15, 'designation' => 'Test 15', 'sur_categorie_id' => 1, 'categorie_id' => 1, 'materiel_administratif' => 0, 'materiel_technique' => 1, //'status' => 'CREATED', 'date_acquisition' => '19-04-2016', */ //$this->setUp(); // On doit pouvoir accéder à la page une fois authentifié $this->authAs($role); $this->get('/materiels/index'); $nbmat = $this->userHasRoleAtLeast('Administration') ? 7 : 6; $this->assertResponseContains("Liste des matériels (".$nbmat.")", $role.','.$mandatoryField); $this->post('/materiels/add', $newMaterielWithMissingMandatoryFields); $this->get('/materiels/index'); $this->assertResponseContains("Liste des matériels (".$nbmat.")", $role." Le matériel s'ajoute alors que le champ obligatoire ".$mandatoryField." n'est pas rempli"); ////$this->tearDown(); } // Test de l'action "Copier ce materiel" (= materiel/add/id) sur tous les roles /** * @dataProvider dataProviderRoles4 */ public function testMatCopy($role) { /* $role="USER"; $role="SUPER"; $role="ADMIN"; */ // On doit pouvoir accéder à la page une fois authentifié $this->authAs($role); $do1=1; $do2=1; $do3=1; $do4=1; // 1) RULE MATERIEL.COPY.1 : // Copie d'un matos (CREATED) à l'IDENTIQUE (tel quel sans rien changer, // sauf ce qui changera automatiquement: id, numlab) //if ($do1) $this->_testMatCopy(1, true, $role, 1, [], 'TEST-2018-0001'); //+4 //if ($do1) $this->_testMatCopy(1, true, $role, 1, [], 'TEST-'.yyyy1.'-0003'); //+4 if ($do1) $this->_testMatCopy(1, true, $role, 1, [], 'TEST-'.yyyy1.'-'.$this->_getNextNum4DigitsAfter(yyyy1_highest_num)); // 2) RULE MATERIEL.COPY.2 : // Copie d'un matos (CREATED) en changeant quelques données $new_designation = 'matos 1 USER (C) modified'; $modified_data = [ 'designation' => $new_designation, //'sur_categorie_id' => 1, //'categorie_id' => 1, //'materiel_administratif' => 0, //'materiel_technique' => 1, //'status' => 'CREATED', //'date_acquisition' => '19-04-2016', 'date_acquisition' => '19/04/'.yyyy0, 'date_reception' => '', // sinon, il FAUT qu'elle soit >= date achat //'nom_createur' => 'Pallier Etienne', //'nom_modificateur' => 'Jean Administration', //'nom_responsable' => 'Jacques Utilisateur', //'email_responsable' => 'Jacques.Utilisateur@irap.omp.eu', //'fournisseur_id' => 2 ]; //if ($do2) $this->_testMatCopy(2, true, $role, 1, $modified_data, 'TEST-2016-0015'); //if ($do2) $this->_testMatCopy(2, true, $role, 1, $modified_data, 'TEST-'.yyyy2.'-'.$this->_getNextNum4DigitsAfter(yyyy2_highest_num)); if ($do2) $this->_testMatCopy(2, true, $role, 1, $modified_data, 'TEST-'.yyyy0.'-'.'0001'); // 3) RULE MATERIEL.COPY.3 : // Impossible de copier un matos de statut superieur à CREATED (même pas pour SUPERADMIN) $do3 && $this->_testMatCopy(3, false, $role, 3); // Impossible de copier un matos de statut superieur à CREATED (sauf pour SUPERADMIN) //if ($do3) $this->_testMatCopy(3, $role=="SUPER", $role, 3); // 4) RULE MATERIEL.COPY.4 : // Pour un USER: Impossible de copier un matos CREATED dont je ne suis pas propriétaire // Pour les autres, c'est ok //$this->_testMatCopy(4, !in_array($role, ["USER", "USER_from_ldap"]), $role, 2); if ($do4) $this->_testMatCopy(4, !$this->USER_IS_USER(), $role, 2); } // Called by testMatCopy() just above //if ($do1) $this->_testMatCopy(1, true, $role, 1, [], 'TEST-2014-0001'); private function _testMatCopy($testnum, $COPIED, $role, $id, array $materiel_new_data=[], $num_inventaire=NULL) { //debug("_testMatCopy numéro ".$testnum); $designation = isset($materiel_new_data->designation) ? $materiel_new_data->designation : 'matos 1 USER (C)'; // AVANT add // USER ne voit pas les materiels ARCHIVED $nbmat = $this->USER_IS_ADMIN_AT_LEAST() ? 7 : 6; if ($this->DEBUG) { echo("\n _testMatCopy (avec role $role et test numéro $testnum) :"); echo("\n designation: $designation"); echo("\n nb matos: $nbmat"); } $this->_checkNbMaterielInIndexViewIs(true, $role, $nbmat); /* $this->get('/materiels/index'); // USER ne voit pas les materiels ARCHIVED $nbmat = $this->USER_IS_ADMIN_AT_LEAST() ? 7 : 6; $this->assertResponseContains("Liste des matériels (".$nbmat.")", $role); */ $this->post('/materiels/add/'.$id, $materiel_new_data); $nbmat++; //debug($nbmat); // APRES add $this->_checkNbMaterielInIndexViewIs($COPIED, $role, $nbmat, $designation, $num_inventaire); /* $this->get('/materiels/index'); // VOIR LE HTML DE LA PAGE WEB //var_dump($this->_getBodyAsString()); $this->assertResponseContains("Liste des matériels (".$nbmat.")", "(testMat31CreateAs): Le matériel ne s'ajoute pas correctement (avec le profil $role)"); $this->assertResponseContains($designation, "Le matériel ne s'ajoute pas correctement."); $this->assertResponseContains($num_inventaire, "La génération du n°de labo n'est pas bonne."); */ //$this->tearDown(); /* $this->get('/materiels/view/15'); $this->assertResponseContains($designation, "Le matériel ne s'ajoute pas correctement."); */ /* $matos1 = TableRegistry::getTableLocator()->get('Materiels')->find()->where([ 'id =' => 15 ])->first(); assert($matos1->id == 15, "not one"); */ if ($COPIED) { // On supprime le dernier materiel pour garder toujours la meme fixture de départ //debug(TableRegistry::getTableLocator()->get('Materiels')->find()->last()->id); //$matos_last = TableRegistry::getTableLocator()->get('Materiels')->find()->last(); $matos_last = $this->Materiels->find()->last(); $this->Materiels->delete($matos_last); // Ca marche aussi comme ça, mais c'est moins rapide: //$this->post('/materiels/delete/'.$matos_last->id); //$this->post('/materiels/delete/15'); //$this->get('/materiels/view/15'); } } /* * III - ACTION UPDATE * ACTION "materiels/edit/id" : Editer un matériel */ /** * Test edit method * * @return void */ // ACTION 'edit' /* public function testUpdate() { // ACTION 'edit' foreach ($this->ROLES as $role) { $this->authAs($role); if ($role=='USER') continue; $this->_testUpdates($role); } // foreach } */ /* //public function testUpdateAsUser() { $this->_testUpdatesAs('USER'); } public function testUpdateAsResp() { $this->_testUpdatesAs('RESP'); } public function testUpdateAsAdmin() { $this->_testUpdatesAs('ADMIN'); } public function testUpdateAsAdminPlus() { $this->_testUpdatesAs('ADMINP'); } public function testUpdateAsSuperAdmin() { $this->_testUpdatesAs('SUPER'); } private function _testUpdatesAs($role) { */ /** * @dataProvider dataProviderRoles4 */ public function testUpdatesAs($role) { //$role="RESP"; //@todo: test as USER if ($role == 'USER' || $role == 'USER_from_ldap') return; $this->authAs($role); // 1) Test qu'on peut modifier un materiel CREATED // Toutes les donnees passees sont modifiees $data = [ 'designation' => 'Matos Test 2 CREATED modified', //'sur_categorie_id' => 1, //'categorie_id' => 1, 'materiel_administratif' => 0, //'materiel_technique' => 1, //'status' => 'CREATED', //'date_acquisition' => '19-04-2016', //'date_acquisition' => '19/04/2016', 'date_acquisition' => '19/04/'.yyyy0, 'date_reception' => '', // sinon FAUT qu'elle soit >= date_acquisition 'nom_createur' => 'Pallier Etienne', 'nom_modificateur' => 'Jean Administration', 'nom_responsable' => 'Jacques Utilisateur', 'email_responsable' => 'Jacques.Utilisateur@irap.omp.eu', 'fournisseur_id' => 2 ]; $this->post('/materiels/edit/2', $data); $this->get('/materiels/index'); $this->assertResponseContains("Matos Test 2 CREATED modified", "Le matériel CREATED édité n'a pas pu etre enregistré"); // Le numero d'inventaire doit avoir été mis à jour avec la nouvelle année de la date d'achat $new_num_inventaire = 'TEST-'.yyyy0.'-0001'; $this->assertResponseContains($new_num_inventaire, "Le numéro d'inventaire n'a pas été régénéré"); $m = $this->Materiels->get(2); assert($m->numero_laboratoire == $new_num_inventaire, "Le numéro d'inventaire n'a pas été régénéré"); // 2) Passe le status à VALIDATED $data = [ 'designation' => 'Matos Test 2 VALIDATED', //'sur_categorie_id' => 1, //'categorie_id' => 1, //'materiel_administratif' => 0, //'materiel_technique' => 1, 'status' => 'VALIDATED', //'date_acquisition' => '19-04-2016', //'nom_createur' => 'Pallier Etienne', //'nom_modificateur' => 'Jean Administration', //'nom_responsable' => 'Jacques Utilisateur', //'email_responsable' => 'Jacques.Utilisateur@irap.omp.eu', //'fournisseur_id' => 2 ]; $this->post('/materiels/edit/2', $data); $this->get('/materiels/index'); $this->assertResponseContains("Matos Test 2 VALIDATED", "Le matériel CREATED édité n'a pas pu etre passé à VALIDATED"); // 3) Test qu'on NE PEUT PAS modifier un materiel VALIDATED (certains champs, a completer TODO:) $data = [ 'designation' => 'Matos Test 2 VALIDATED updated', //'sur_categorie_id' => 1, //'categorie_id' => 1, //'materiel_administratif' => 0, //'materiel_technique' => 1, //'status' => 'VALIDATED', //'date_acquisition' => '19-04-2016', //'nom_createur' => 'Pallier Etienne', //'nom_modificateur' => 'Jean Administration', //'nom_responsable' => 'Jacques Utilisateur', //'email_responsable' => 'Jacques.Utilisateur@irap.omp.eu', //'fournisseur_id' => 2 ]; $this->post('/materiels/edit/2', $data); $this->get('/materiels/index'); /* Exception pour Superadmin ? NON if ($role=="SUPER") $this->assertResponseContains("Matos Test 2 VALIDATED updated", "Le matériel VALIDATED édité n'a pas pu etre enregistré"); else $this->assertResponseNotContains("Matos Test 2 VALIDATED updated", "Un matériel VALIDATED ne devrait pas pouvoir être modifié"); */ $this->assertResponseNotContains("Matos Test 2 VALIDATED updated", "Un matériel VALIDATED ne devrait pas pouvoir être modifié"); // 4) Test que un edit anormal ne fonctionne pas (erreur sur champ status) $data = [ 'designation' => 'Matos Test 9', /* 'sur_categorie_id' => 1, 'categorie_id' => 1, 'materiel_administratif' => 0, 'materiel_technique' => 1, */ 'status' => 'xxx', /* 'date_acquisition' => '19-04-2016', 'nom_createur' => 'Pallier Etienne', 'nom_modificateur' => 'Jean Administration', 'nom_responsable' => 'Jacques Utilisateur', 'email_responsable' => 'Jacques.Utilisateur@irap.omp.eu', */ ]; $this->post('/materiels/edit/2', $data); $this->get('/materiels/index'); $this->assertResponseNotContains("Matos Test 9", "Le matériel édité a pu etre enregistré alors que le statut n'est pas valide"); } /* * ACTION "materiels/delete" : (D) Supprimer un materiel */ /* * IV - ACTION Delete */ /** * Test delete method * * @return void */ public function STRICTER_matos_mustbeownedby_superadmin___testDelete() { $this->authSuperAdmin(); //TODO: impossible de supprimer le matos 1, why ??? //$this->post('/materiels/delete/1'); $this->post('/materiels/delete/2'); $this->get('/materiels/index'); $this->assertResponseContains("Liste des matériels (6)", "Le matériel n'as pas été supprimé."); $this->assertResponseNotContains("Test 2", "Le matériel n'as pas été supprimé."); //$this->assertResponseNotContains("matos 1 USER", "Le matériel n'as pas été supprimé."); } /** * Test ACLEditAdmin * * @return void */ public function testACLEditAdmin() { $this->authAdmin(); $this->get('/materiels/edit/11'); $this->assertResponseContains('EOTP', 'Le profil admin+ n\'a pas accès à la partie administrative sur le formulaire edit.'); } /** * Test ACLDeleteUtilisateur * * @return void */ public function testACLDeleteAsUtilisateur() { $this->authUtilisateur(); $this->post('/materiels/delete/2'); $this->get('/materiels/index'); $this->assertResponseContains('Liste des matériels (6)', 'Le profil utilisateur a accès à la suppression, alors que le matériel ne lui appartient pas.'); $this->post('/materiels/delete/11'); $this->get('/materiels/index'); $this->assertResponseContains('Liste des matériels (5)', 'Le profil utilisateur n\'a pas accès à la suppression, alors que le matériel lui appartient.'); } /** * Test ACLDeleteAdmin * * @return void */ public function STRICTER_testACLDeleteAsAdmin() { $this->authAdmin(); //$nb = $this->nb_matos_in_fixture; $nb = nb_matos_in_fixture; // matos TBA => KO $this->post('/materiels/delete/13'); $this->get('/materiels/index'); $this->assertResponseContains("Liste des matériels ($nb)", 'Le profil admin(+) a accès à la suppression alors que le statut est TOBEARCHIVED.'); // matos CREATED => KO $this->post('/materiels/delete/2'); $this->get('/materiels/index'); $this->assertResponseContains("Liste des matériels ($nb)", 'Le profil admin(+) a accès à la suppression alors que le statut est TOBEARCHIVED.'); // matos ARCHIVED => OK $this->post('/materiels/delete/14'); $nb--; $this->get('/materiels/index'); $this->assertResponseContains("Liste des matériels ($nb)", "Le profil admin(+) n'a pas accès à la suppression d'un matériel ARCHIVED comme attendu !"); } /** * Test action 'delete' avec tous les profils (roles) * * @return void * * @dataProvider dataProviderRoles4AndStatuses4 */ /* public function testDeleteForRole($user_role, $matos_status) { // Force le rechargement des entités materiel en BD (car on les modifie en cours de route) //AppController::forceReload(); $this->d("*******************"); $this->d(" ROLE = ".$user_role); $this->d("*******************"); //$this->setUp(); //$this->authSuperAdmin(); $this->authAs($user_role); // POUR CHAQUE statut matériel : // CREATED, puis VALIDATED, puis TBA, puis ARCHIVED //foreach (['CREATED'] as $matos_status) { //foreach (['VALIDATED'] as $matos_status) { //foreach (['ARCHIVED'] as $matos_status) { ///////foreach (array_keys($this->STATUSES) as $matos_status) { $this->d("**** ".$matos_status." ****"); // On recupère le tout 1er matos de la BD (fixture), peu importe ce que c'est car on va le modifier $matos = $this->Materiels->get(1); $matos->status = $matos_status; //debug($matos); // POUR CHAQUE numéro de matériel (0 ou 1) : // matos_CREATED0 puis matos_CREATED1 puis matos_VALIDATED0 puis matos_VALIDATED1 puis matos_TOBEARCHIVED0... foreach ([0,1] as $i) { $matos_name = "matos_${matos_status}$i"; $this->d("* ".$matos_name." :"); // i=0 // Le materiel matos_XXXXXX0 doit appartenir à un utilisateur quelconque // et à un groupe (métier et thématique) quelconque if ($i==0) { $matos->nom_responsable = 'inconnu'; $matos->nom_createur = 'inconnu'; $matos->groupes_thematique_id = 2; $matos->groupes_metier_id = 2; //pr("modif matos pour i=0"); } // i=1 // Le materiel matos_XXXXXX1 doit appartenir à l'utilisateur qui a le role UTILISATEUR dans les tests // et au groupe (métier et thématique) de l'utilisateur utilisé pour le role RESPONSABLE dans les tests else { $matos->nom_responsable = 'user5 USER'; $matos->nom_createur = 'user5 USER'; $matos->groupes_thematique_id = 1; $matos->groupes_metier_id = 1; //pr("modif matos pour i=1"); } //pr($matos->getDirty()); //$fields_changed = ['nom_responsable', 'nom_createur']; //$matos->setDirty('*',true); //$matos->setDirty('nom_responsable',true); //$matos->setDirty('nom_createur',true); // On sauvegarde le matos modifié // pour pouvoir l'afficher avec /materiels/view/1 //pr("nom bef is ".$matos->nom_responsable); if (! $this->Materiels->save($matos)) throw new \Exception("La sauvegarde du materiel modifié ne se fait pas !!!"); /S $m = $this->Materiels->get(1); pr("new nom is ".$m->nom_responsable); S/ // Et maintenant, le test qui tue $this->post('/materiels/delete/1'); $authorized = $this->isAuthorizedAction('delete', $role, $matos_status, $i); $this->d("isAuthorizedAction $action pour $role sur materiel $matos_status,$i ? : " . (int)$authorized); $content = "Supprimer ce matériel"; //$content = " Editer ce matériel"; $elem = "Editer"; $this->assertResponseOk(); if ($authorized) $this->assertResponseContains($content, "La vue détaillée du matériel (/materiels/view/1) ne contient pas de bouton $elem comme attendu !"); else $this->assertResponseNotContains($content, "La vue du matériel (/materiels/view/1) contient le bouton $elem, alors qu'elle ne devrait PAS !"); $action = 'delete'; $authorized = $this->isAuthorizedAction($action, $role, $matos_status, $i); $this->d("isAuthorizedAction $action pour $role sur materiel $matos_status,$i ? : ". (int)$authorized); //$content = " Supprimer ce matériel"; $content = "Supprimer ce matériel"; $elem = "Supprimer"; $this->assertResponseOk(); if ($authorized) $this->assertResponseContains($content, "La vue du matériel (/materiels/view/1) ne contient pas de bouton $elem attendu !"); else $this->assertResponseNotContains($content, "La vue du matériel (/materiels/view/1) contient le bouton $elem, alors qu'elle ne devrait PAS !"); } // matos num : 0,1 //////} // matos status : CREATED, VALIDATED, ... } // _testViewForRole(role) */ /* * V - OTHER ACTIONS */ /** * Test find method * * @return void */ private function get_specific_fields() { return [ //'s_designation' => 'Test', 's_designation' => '', 's_matostype' => '', 's_sur_categorie_id' => '', 's_categorie_id' => '', 's_sous_categorie_id' => '', 's_status' => '', 's_groupes_metier_id' => '', 's_groupes_thematique_id' => '', 's_numero_commande' => '', 's_numero_laboratoire' => '', 's_organisme_id' => '', 's_nom_responsable' => '', 's_numero_inventaire_organisme' => '', 's_numero_inventaire_old' => '', 's_date_acquisition' => '', 's_periode_acquisition1' => '', 's_periode_acquisition2' => '', 's_prix_ht' => '', 's_prix_ht_sup' => '', 's_prix_ht_inf' => '', 's_fournisseur_id' => '', 's_salle' => '' ]; } public function testFind() { $this->authSuperAdmin(); $dataSearch = $this->get_specific_fields(); /* * 1. Test sans aucun champ */ $this->get('/materiels/find'); $this->assertResponseContains("Aucun résultats pour cette recherche.", "Le contenu de la recherche devrait être vide."); /* * 2. Test champ global "s_all_2" dans le menu latéral de gauche */ // Recherche en majuscules //$this->post( '/materiels/find', ['s_all_2' => 'TEST-2020-0002'] ); //+4 $this->post( '/materiels/find', ['s_all_2' => 'TEST-'.yyyy2.'-0002'] ); $this->assertResponseContains("Résultats (1)", "Le nb de materiels pour la recherche générale du menu latéral est incorrect."); // Recherche en minuscules //$this->post( '/materiels/find', ['s_all_2' => 'test-2020-0002'] ); //+4 $this->post( '/materiels/find', ['s_all_2' => 'test-'.yyyy2.'-0002'] ); //+4 $this->assertResponseContains("Résultats (1)", "Le nb de materiels pour la recherche générale du menu latéral est incorrect."); /* * 3. Test champ général "s_all" en haut du formulaire */ //$this->post( '/materiels/find', ['s_all' => 'TEST-2020-0002'] ); //+4 $this->post( '/materiels/find', ['s_all_2' => 'TEST-'.yyyy2.'-0002'] ); $this->assertResponseContains("Résultats (1)", "Le nb de materiels pour la recherche générale du formulaire est incorrect."); $this->post( '/materiels/find', ['s_all' => 'Fournisseur'] ); $this->assertResponseContains("Résultats (7)", "Le nb de materiels pour la recherche générale du formulaire est incorrect."); $this->post( '/materiels/find', ['s_all' => 'Fournisseur1'] ); $this->assertResponseContains("Résultats (4)", "Le nb de materiels pour la recherche générale du formulaire est incorrect."); $this->post( '/materiels/find', ['s_all' => 'Fournisseur2'] ); $this->assertResponseContains("Résultats (3)", "Le nb de materiels pour la recherche générale du formulaire est incorrect."); $this->post( '/materiels/find', ['s_all' => 'Fournisseur Test'] ); $this->assertResponseContains("Résultats (7)", "Le nb de materiels pour la recherche générale du formulaire est incorrect."); // les matériels trouvés doivent contenir "Fournisseur" ET "Test" ET "(C)" $this->post( '/materiels/find', ['s_all' => 'Fournisseur Test (C)'] ); $this->assertResponseContains("Résultats (3)", "Le nb de materiels pour la recherche générale du formulaire est incorrect."); /* * 4. Recherche dans les champs spécifiques du formulaire */ // 4.1 Test champs individuels (un seul champ) // - Test champ designation // -- un mot // --- tel quel $dataSearch['s_designation'] = 'Test'; $this->post('/materiels/find', $dataSearch); $this->assertResponseContains("Résultats (6)", "Le nb de materiels pour la recherche par désignation est incorrect."); // --- en minuscules $dataSearch['s_designation'] = 'test'; $this->post('/materiels/find', $dataSearch); $this->assertResponseContains("Résultats (6)", "Le nb de materiels pour la recherche par désignation est incorrect."); // --- en majuscules $dataSearch['s_designation'] = 'TEST'; $this->post('/materiels/find', $dataSearch); $this->assertResponseContains("Résultats (6)", "Le nb de materiels pour la recherche par désignation est incorrect."); // -- N mots $dataSearch['s_designation'] = 'Test TBA'; // = contient "Test" ET "TBA" => devrait trouver "Test 13 (TBA)" $this->post('/materiels/find', $dataSearch); $this->assertResponseContains("Résultats (1)", "Le nb de materiels pour la recherche par désignation est incorrect."); $dataSearch['s_designation'] = 'Test 13 TBA'; // = contient "Test" ET "TBA" => devrait trouver "Test 13 (TBA)" $this->post('/materiels/find', $dataSearch); $this->assertResponseContains("Résultats (1)", "Le nb de materiels pour la recherche par désignation est incorrect."); $dataSearch['s_designation'] = ''; // - Test champ numero_laboratoire //$dataSearch['s_numero_laboratoire'] = 'TEST-2020-0003'; //+4 $dataSearch['s_numero_laboratoire'] = 'TEST-'.yyyy1.'-0002'; $this->post('/materiels/find', $dataSearch); $this->assertResponseContains("Résultats (1)", "Le nb de materiels pour la recherche par numero de laboratoire est incorrect."); $dataSearch['s_numero_laboratoire'] = ''; // - Test champ status $dataSearch['s_status'] = 'CREATED'; $this->post('/materiels/find', $dataSearch); $this->assertResponseContains("Résultats (3)", "Le nb de materiels pour la recherche par statut est incorrect."); $dataSearch['s_status'] = ''; // - Test champ date_acquisition //$dataSearch['s_date_acquisition'] = '2016-05-11'; $dataSearch['s_date_acquisition'] = yyyy2mmdd1; $this->post('/materiels/find', $dataSearch); $this->assertResponseContains("Résultats (1)", "Le nb de materiels pour la recherche par date d'acquisition est incorrect."); $dataSearch['s_date_acquisition'] = yyyy2mmdd2; $this->post('/materiels/find', $dataSearch); $this->assertResponseContains("Résultats (4)", "Le nb de materiels pour la recherche par date d'acquisition est incorrect."); $dataSearch['s_date_acquisition'] = ''; // - Test champ fournisseur_id $dataSearch['s_fournisseur_id'] = 1; //$dataSearch['s_date_acquisition'] = '2016-05-11'; $dataSearch['s_date_acquisition'] = yyyy2mmdd2; $this->post('/materiels/find', $dataSearch); $this->assertResponseContains("Résultats (3)", "Le nb de materiels pour la recherche par fournisseur_id est incorrect."); $dataSearch['s_date_acquisition'] = ''; $this->post('/materiels/find', $dataSearch); $this->assertResponseContains("Résultats (4)", "Le nb de materiels pour la recherche par fournisseur_id est incorrect."); $dataSearch['s_fournisseur_id'] = ''; $dataSearch['s_date_acquisition'] = ''; //- Test champ salle /* * $dataSearch['s_salle'] = 'I203'; * $this->post('/materiels/find', $dataSearch); * $this->assertResponseContains("Résultats (2)", "Le nb de materiels pour la recherche par detaille lieu est incorrect."); */ // // Test sur Période de temps (intervalle) // // - Test [champ periode_acquisition1 - +infini] //$dataSearch['s_periode_acquisition1'] = '2015-01-01'; $dataSearch['s_periode_acquisition1'] = yyyy1mmdd1; // search [yyyy1mmdd1 - ] $this->post('/materiels/find', $dataSearch); //$this->assertResponseContains("Résultats (6)", "Le nb de materiels pour la recherche par debut de periode d'acquisition est incorrect."); $this->assertResponseContains("Résultats (1)", "Le nb de materiels pour la recherche par debut de periode d'acquisition est incorrect."); $dataSearch['s_periode_acquisition1'] = yyyy1mmdd2; // search [yyyy1mmdd2 - ] $this->post('/materiels/find', $dataSearch); //$this->assertResponseContains("Résultats (6)", "Le nb de materiels pour la recherche par debut de periode d'acquisition est incorrect."); $this->assertResponseContains("Résultats (2)", "Le nb de materiels pour la recherche par debut de periode d'acquisition est incorrect."); $dataSearch['s_periode_acquisition1'] = yyyy2mmdd2; // search [yyyy2mmdd2 - ] $this->post('/materiels/find', $dataSearch); $this->assertResponseContains('Résultats ('.nb_matos_in_fixture.')', "Le nb de materiels pour la recherche par debut de periode d'acquisition est incorrect."); $dataSearch['s_periode_acquisition1'] = yyyy2mmdd1; // search [yyyy2mmdd1 - ] $this->post('/materiels/find', $dataSearch); $this->assertResponseContains('Résultats (3)', "Le nb de materiels pour la recherche par debut de periode d'acquisition est incorrect."); $dataSearch['s_periode_acquisition1'] = yyyy0mmdd1; // search [yyyy0mmdd1 - ] $this->post('/materiels/find', $dataSearch); $this->assertResponseContains('Résultats (0)', "Le nb de materiels pour la recherche par debut de periode d'acquisition est incorrect."); // - Test [champ periode_acquisition1 - champ periode_acquisition2] //$dataSearch['s_periode_acquisition2'] = '2016-01-01'; $dataSearch['s_periode_acquisition1'] = yyyy2mmdd2; $dataSearch['s_periode_acquisition2'] = yyyy1mmdd1; // search [yyyy2mmdd2 - yyyy1mmdd1] (plus ancien au plus récent) $this->post('/materiels/find', $dataSearch); //$this->assertResponseContains("Résultats (1)", "Le nb de materiels pour la recherche par intervalle entre la periode d'acquisition (debut) et la periode d'acquisition (fin) est incorrect."); $this->assertResponseContains('Résultats ('.nb_matos_in_fixture.')', "Le nb de materiels pour la recherche par intervalle entre la periode d'acquisition (debut) et la periode d'acquisition (fin) est incorrect."); $dataSearch['s_periode_acquisition1'] = yyyy1mmdd1; $dataSearch['s_periode_acquisition2'] = yyyy2mmdd2; // search [yyyy1mmdd1 - yyyy2mmdd2] $this->post('/materiels/find', $dataSearch); $this->assertResponseContains('Résultats (0)', "Le nb de materiels pour la recherche par intervalle entre la periode d'acquisition (debut) et la periode d'acquisition (fin) est incorrect."); $dataSearch['s_periode_acquisition1'] = yyyy2mmdd2; $dataSearch['s_periode_acquisition2'] = yyyy2mmdd2; // search [yyyy2mmdd2 - yyyy2mmdd2] $this->post('/materiels/find', $dataSearch); $this->assertResponseContains('Résultats (4)', "Le nb de materiels pour la recherche par intervalle entre la periode d'acquisition (debut) et la periode d'acquisition (fin) est incorrect."); $dataSearch['s_periode_acquisition1'] = yyyy2mmdd1; $dataSearch['s_periode_acquisition2'] = yyyy1mmdd2; // search [yyyy2mmdd1 - yyyy1mmdd2] $this->post('/materiels/find', $dataSearch); $nb = nb_matos_in_fixture - 4 - 1; $this->assertResponseContains('Résultats ('.$nb.')', "Le nb de materiels pour la recherche par intervalle entre la periode d'acquisition (debut) et la periode d'acquisition (fin) est incorrect."); // - Test [-infini - champ periode_acquisition2] $dataSearch['s_periode_acquisition1'] = ''; $dataSearch['s_periode_acquisition2'] = yyyy0mmdd1; // search [ - yyyy0mmdd1] // jusqu'a l'infini $this->post('/materiels/find', $dataSearch); //$this->assertResponseContains("Résultats (2)", "Le nb de materiels pour la recherche par fin de periode d'acquisition est incorrect."); $this->assertResponseContains('Résultats ('.nb_matos_in_fixture.')', "Le nb de materiels pour la recherche par fin de periode d'acquisition est incorrect."); $dataSearch['s_periode_acquisition2'] = yyyy1mmdd1; // search [ - yyyy1mmdd1] // jqau plus récent $this->post('/materiels/find', $dataSearch); $this->assertResponseContains('Résultats ('.nb_matos_in_fixture.')', "Le nb de materiels pour la recherche par fin de periode d'acquisition est incorrect."); $dataSearch['s_periode_acquisition2'] = yyyy1mmdd2; // search [ - yyyy1mmdd2] $this->post('/materiels/find', $dataSearch); $nb = nb_matos_in_fixture - 1; $this->assertResponseContains('Résultats ('.$nb.')', "Le nb de materiels pour la recherche par fin de periode d'acquisition est incorrect."); $dataSearch['s_periode_acquisition2'] = yyyy2mmdd1; // search [ - yyyy2mmdd1] $this->post('/materiels/find', $dataSearch); $nb = 5; $this->assertResponseContains('Résultats ('.$nb.')', "Le nb de materiels pour la recherche par fin de periode d'acquisition est incorrect."); $dataSearch['s_periode_acquisition2'] = yyyy2mmdd2; // search [ - yyyy2mmdd2] // jqau plus ancien $this->post('/materiels/find', $dataSearch); $nb = 5 - 1; $this->assertResponseContains('Résultats ('.$nb.')', "Le nb de materiels pour la recherche par fin de periode d'acquisition est incorrect."); $dataSearch['s_periode_acquisition2'] = ''; // // Test sur prix // // - Test champ prix_ht $dataSearch['s_prix_ht'] = '50.00'; $this->post('/materiels/find', $dataSearch); $this->assertResponseContains("Résultats (1)", "Le nb de materiels pour la recherche par prix ht est incorrect (v1)."); $dataSearch['s_prix_ht'] = ''; // - Meme test mais avec autres champs $dataSearch['s_prix_ht_sup'] = '50'; // >= 50 $dataSearch['s_prix_ht_inf'] = '50'; // <= 50 $this->post('/materiels/find', $dataSearch); $this->assertResponseContains("Résultats (1)", "Le nb de materiels pour la recherche par prix ht est incorrect (v2)."); $dataSearch['s_prix_ht_inf'] = ''; $dataSearch['s_prix_ht_sup'] = ''; $dataSearch['s_prix_ht'] = '75.00'; $this->post('/materiels/find', $dataSearch); $this->assertResponseContains("Résultats (4)", "Le nb de materiels pour la recherche par prix ht est incorrect (v1)."); $dataSearch['s_prix_ht'] = ''; // - Test champ prix_ht_sup $dataSearch['s_prix_ht_sup'] = '30'; // >= 30 $this->post('/materiels/find', $dataSearch); $this->assertResponseContains("Résultats (6)", "Le nb de materiels pour la recherche par prix ht superieur est incorrect."); $dataSearch['s_prix_ht_sup'] = ''; // - Test champ prix_ht_inf $dataSearch['s_prix_ht_inf'] = '70'; // <=70 $this->post('/materiels/find', $dataSearch); $this->assertResponseContains("Résultats (2)", "Le nb de materiels pour la recherche par prix ht inferieur est incorrect."); $dataSearch['s_prix_ht_inf'] = ''; // - Test champ prix_ht_inf et sup $dataSearch['s_prix_ht_sup'] = '30'; // >= 30 $dataSearch['s_prix_ht_inf'] = '70'; // <=70 $this->post('/materiels/find', $dataSearch); $this->assertResponseContains("Résultats (1)", "Le nb de materiels pour la recherche par prix ht inf et sup est incorrect."); $dataSearch['s_prix_ht_sup'] = '25'; // >= 30 $dataSearch['s_prix_ht_inf'] = '75'; // <=75 $this->post('/materiels/find', $dataSearch); $this->assertResponseContains("Résultats (6)", "Le nb de materiels pour la recherche par prix ht inf et sup est incorrect."); $dataSearch['s_prix_ht_inf'] = ''; $dataSearch['s_prix_ht_sup'] = ''; // 4.2 Test champs multiples (plusieurs champs à la fois) //$dataSearch = $this->get_specific_fields(); } /** * Test addReadSuivisMateriel * * @return void */ private function _testAddReadEntitiesMateriel($entity_name, $nb_entities_in_fixture, $data) { $entities_name = $entity_name.'s'; $nb = $nb_entities_in_fixture; $this->authSuperAdmin(); //$this->get('/materiels/view/1'); $this->get('/materiels/view/3'); //$this->assertResponseContains("Suivi(s) du matériel (1)", "Le nb de suivis renvoyé pour ce matériel est incorrect."); $this->assertResponseContains(ucfirst($entity_name)."(s) du matériel ($nb)", "Le nb de $entities_name renvoyé pour ce matériel est incorrect (1)."); //$this->post('/suivis/add/1', $dataSuivi1); //$this->post('/suivis/add/1', $dataSuivi2); $this->post("/$entities_name/add/3", $data); $nb++; $this->post("/$entities_name/add/3", $data); $nb++; //$this->get('/materiels/view/1'); $this->get('/materiels/view/3'); $this->assertResponseContains(ucfirst($entity_name)."(s) du matériel ($nb)", "Le nb de $entities_name renvoyé pour ce matériel est incorrect (2)."); } /** * Test addReadSuivisMateriel * * @return void */ public function STRICTER_testAddReadSuivisMateriel() { $dataSuivi1 = [ //'materiel_id' => 1, // created 'materiel_id' => 3, // validated 'date_controle' => '2016-04-19', 'date_prochain_controle' => '2016-04-19', 'type_suivi_id' => 1, 'groupes_metier_id' => 1, 'groupes_thematique_id' => 1, 'organisme' => 'Lorem ipsum dolor sit amet', 'frequence' => 1, 'type_frequence' => '/ Jours', 'commentaire' => 'Lorem ipsum dolor sit amet', 'nom_createur' => 'Lorem ipsum dolor sit amet', 'nom_modificateur' => 'Lorem ipsum dolor sit amet', 'created' => '2016-04-19 09:09:28', 'modified' => '2016-04-19 09:09:28' ]; $this->_testAddReadEntitiesMateriel('suivi', 1, $dataSuivi1); /* $dataSuivi2 = [ 'materiel_id' => 3, 'date_controle' => '2016-04-19', 'date_prochain_controle' => '2016-04-19', 'type_suivi_id' => 1, 'groupes_metier_id' => 1, 'groupes_thematique_id' => 1, 'organisme' => 'Lorem ipsum dolor sit amet', 'frequence' => 1, 'type_frequence' => '/ Jours', 'commentaire' => 'Lorem ipsum dolor sit amet', 'nom_createur' => 'Lorem ipsum dolor sit amet', 'nom_modificateur' => 'Lorem ipsum dolor sit amet', 'created' => '2016-04-19 09:09:28', 'modified' => '2016-04-19 09:09:28' ]; $this->authSuperAdmin(); //$this->get('/materiels/view/1'); $this->get('/materiels/view/3'); $this->assertResponseContains("Suivi(s) du matériel (1)", "Le nb de suivis renvoyé pour ce matériel est incorrect."); //$this->post('/suivis/add/1', $dataSuivi1); //$this->post('/suivis/add/1', $dataSuivi2); $this->post('/suivis/add/3', $dataSuivi1); $this->post('/suivis/add/3', $dataSuivi1); //$this->get('/materiels/view/1'); $this->get('/materiels/view/3'); //$this->assertResponseContains("Suivi(s) du matériel (3)", "Le nb de suivis renvoyé pour ce matériel est incorrect."); */ } /** * Test addReadEmpruntsMateriel * * @return void */ public function STRICTER_testAddReadEmpruntsMateriel() { $dataEmprunt1 = [ //'materiel_id' => 1, // created 'materiel_id' => 3, // validated 'date_emprunt' => '2016-04-19', 'date_retour_emprunt' => '2016-04-19', 'emprunt_interne' => 1, 'laboratoire' => 'Lorem ipsum dolor sit amet', 'site_id' => 1, // Roche 'e_lieu_detail' => 'Lorem ipsum dolor sit amet', 'nom_emprunteur' => 'Lorem ipsum dolor sit amet', 'email_emprunteur' => 'Lorem ipsum dolor sit amet', 'tel' => 'Lorem ipsum dolor ', 'commentaire' => 'Lorem ipsum dolor sit amet', 'nom_createur' => 'Lorem ipsum dolor sit amet', 'nom_modificateur' => 'Lorem ipsum dolor sit amet', 'created' => '2016-04-19 09:09:26', 'modified' => '2016-04-19 09:09:26' ]; $this->_testAddReadEntitiesMateriel('emprunt', 1, $dataEmprunt1); /* $dataEmprunt2 = [ 'materiel_id' => 3, 'date_emprunt' => '2016-04-19', 'date_retour_emprunt' => '2016-04-19', 'emprunt_interne' => 0, 'laboratoire' => 'Lorem ipsum dolor sit amet', 'site_id' => 1, // Roche 'e_lieu_detail' => 'Lorem ipsum dolor sit amet', 'nom_emprunteur' => 'Lorem ipsum dolor sit amet', 'email_emprunteur' => 'Lorem ipsum dolor sit amet', 'tel' => 'Lorem ipsum dolor ', 'commentaire' => 'Lorem ipsum dolor sit amet', 'nom_createur' => 'Lorem ipsum dolor sit amet', 'nom_modificateur' => 'Lorem ipsum dolor sit amet', 'created' => '2016-04-19 09:09:26', 'modified' => '2016-04-19 09:09:26' ]; $this->authSuperAdmin(); $this->post('/emprunts/add/3', $dataEmprunt1); $this->post('/emprunts/add/3', $dataEmprunt2); $this->get('/materiels/view/3'); $this->assertResponseContains("Emprunt(s) du matériel (3)", "Le nb d'emprunt renvoyé pour ce matériel est incorrect."); */ } /** * NE FONCTIONNE PAS * Test addCopieMateriel * * @return void public function testAddCopieMateriel() { * $this->authUser(); * $data = [ * 'designation' => 'Test 14', * 'sur_categorie_id' => 1, * 'categorie_id' => 1, * 'materiel_administratif' => 0, * 'materiel_technique' => 1, * 'status' => 'CREATED', * 'date_acquisition' => '2016-04-16']; * $this->post('/materiels/add/13', $data); * $this->get('/materiels/view/14'); * $this->assertResponseContains("Jesus", "La copie du materiel ne se fait pas correctement."); * $this->assertResponseContains("TEST COPIE MATERIEL", "La copie du materiel ne se fait pas correctement."); * } */ /** * Test updateStatutCreated * * @return void */ public function testUpdateStatutCreated() { $this->authSuperAdmin(); $this->post('/materiels/status-validated/11'); $this->get('/materiels/view/11'); $this->assertResponseNotContains('CREATED', "La validation du materiel ne se fait pas correctement (1)"); $this->assertResponseContains('VALIDATED', "La validation du materiel ne se fait pas correctement (2)"); } /** * Test updateStatutValidated * * @return void */ public function testUpdateStatutValidated() { $this->authSuperAdmin(); //$this->post('/materiels/status-to-be-archived/12'); $this->post('/materiels/status-tobearchived/12'); $this->get('/materiels/view/12'); $this->assertResponseContains('TOBEARCHIVED', "La demande d'archivage du materiel ne se fait pas correctement."); } /** * Test updateStatutToBeArchived * * @return void */ public function testUpdateStatutToBeArchived() { $this->authAdmin(); $this->post('/materiels/status-archived/13'); $this->get('/materiels/view/13'); $this->assertResponseNotContains('TOBEARCHIVED', "L'archivage du materiel ne se fait pas correctement."); } /** * Test UpdatePlaceEtiquetteMateriel * * @return void */ public function testUpdatePlaceEtiquetteMateriel() { $this->authSuperAdmin(); // on prend un materiel VALIDATED //$id=11; $id=3; $this->post("/materiels/set-label-is-placed/$id/view"); // ou setLabelIsPlaced (marche pareil) $this->get("/materiels/view/$id"); $this->assertResponseContains( '