'CREATED', 'date_acquisition' ]; private $newMaterielWithAllMandatoryFields = [ //'id' => 16, 'designation' => 'Test 15', 'sur_categorie_id' => 1, 'categorie_id' => 1, 'materiel_administratif' => 0, 'materiel_technique' => 1, //'status' => 'CREATED', 'date_acquisition' => '19-04-2016', //'date_acquisition' => '19-04-2019', /* 'nom_responsable' => 'Jacques Utilisateur', 'email_responsable' => 'Jacques.Utilisateur@irap.omp.eu' 'nom_createur' => 'Pallier Etienne', 'nom_modificateur' => 'Jean Administration', */ ]; /* FONCTIONS UTILITAIRES UTILISÉES PAR LES TESTS */ /** * setUp method * * @return void */ public function setUp() { parent::setUp(); $config = TableRegistry::exists('Materiels') ? [] : [ 'className' => 'App\Model\Table\MaterielsTable' ]; $this->Materiels = TableRegistry::get('Materiels', $config); $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(); } // 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; } 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($COPIED, $role, $nbmat, $designation=NULL, $num_inventaire=NULL) { $this->get('/materiels/index'); if (! $COPIED) $this->assertResponseNotContains("Liste des matériels (".$nbmat.")", $role); else { $this->assertResponseContains("Liste des matériels (".$nbmat.")", $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."); } } /* * 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 testEasyACL() { $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->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 dataProviderRoles6 */ public function testMat20ReadAllAs($role) { //$this->setUp(); // On doit pouvoir accéder à la page une fois authentifié $this->authAs($role); $this->get('/materiels/index'); $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 complete"=>"un bouton Exporter"]); $this->get('/materiels/index/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 dataProviderRoles6 */ 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("Emprunt(s) du matériel (1)", "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("CentreFinancier/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 dataProviderRoles6 */ 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 dataProviderRoles5 */ public function 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++) { for ($j=0; $j<=1 ; $j++) { $newMateriel["$fields[0]"] = $i; $newMateriel["$fields[1]"] = $j; $combination = [$i,$j]; // ni administratif ni technique => must FAIL if ($combination == [0,0]) $this->_testMatCreate1FailsAs($role, $newMateriel, implode(',',$combination)); // technique only if ($combination == [0,1]) { // cree un nouveau materiel //$this->_testMatCreateAs($role, $newMateriel, implode(',',$combination)); $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/11'); $this->get('/materiels/index'); $nbmat = $this->USER_IS_ADMIN_AT_LEAST() ? 7 : 6; $this->assertResponseContains("Liste des matériels (".$nbmat.")", $role.','.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; $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)); */ } } } } /** * @dataProvider dataProviderRoles6 */ //private function _testMatCreateAs($role, $materiel=null) { $this->testMat31CreateAs($role, $materiel); } public function testMat31CreateAs($role, $materiel=null) { //$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); //$this->post('/materiels/add', $this->newMaterielWithAllMandatoryFields); $this->post('/materiels/add', $materiel); // APRES add $this->get('/materiels/index'); $nbmat++; // 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-2016-0015", "La génération du n°de labo n'est pas bonne."); //$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 dataProviderRoles6 */ public function 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 dataProviderRoles5 */ public function testMatCopy($role) { /* $role="USER"; $role="SUPER"; $role="ADMIN"; */ // On doit pouvoir accéder à la page une fois authentifié $this->authAs($role); // 1) RULE MATERIEL.COPY.1 : // Copie d'un matos (CREATED) à l'IDENTIQUE (tel quel sans rien changer, // sauf ce qui changera automatiquement: id, numlab) $this->_testMatCopy(1, true, $role, 1, [], 'TEST-2014-0001'); // 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', //'nom_createur' => 'Pallier Etienne', //'nom_modificateur' => 'Jean Administration', //'nom_responsable' => 'Jacques Utilisateur', //'email_responsable' => 'Jacques.Utilisateur@irap.omp.eu', //'fournisseur_id' => 2 ]; $this->_testMatCopy(2, true, $role, 1, $modified_data, 'TEST-2016-0015'); // 3) RULE MATERIEL.COPY.3 : // Impossible de copier un matos de statut superieur à CREATED (sauf pour SUPERADMIN) $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); $this->_testMatCopy(4, !$this->USER_IS_USER(), $role, 2); } // Called by testMatCopy() just above private function _testMatCopy($testnum, $COPIED, $role, $id, array $materiel_new_data=[], $num_inventaire=NULL) { //debug("_testMatCopy numéro ".$testnum); if ($this->DEBUG) { echo("\n"); echo("_testMatCopy (with role ".$role.") 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; $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++; // 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 dataProviderRoles6 */ 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', '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é"); // 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:) (sauf SUPERADMIN) $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'); 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é"); // 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 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é."); } /* * 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-2016-0002'] ); $this->assertResponseContains("Résultats (1)", "Le nb de materiels pour la recherche général du menu latéral est incorrecte."); // Recherche en minuscules $this->post( '/materiels/find', ['s_all_2' => 'test-2016-0002'] ); $this->assertResponseContains("Résultats (1)", "Le nb de materiels pour la recherche général du menu latéral est incorrecte."); /* * 3. Test champ général "s_all" en haut du formulaire */ $this->post( '/materiels/find', ['s_all' => 'TEST-2016-0002'] ); $this->assertResponseContains("Résultats (1)", "Le nb de materiels pour la recherche générale du formulaire est incorrecte."); $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 incorrecte."); $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 incorrecte."); $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 incorrecte."); $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 incorrecte."); // 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 incorrecte."); /* * 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 incorrecte."); // --- 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 incorrecte."); // --- 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 incorrecte."); // -- 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 incorrecte."); $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 incorrecte."); $dataSearch['s_designation'] = ''; // - Test champ numero_laboratoire $dataSearch['s_numero_laboratoire'] = 'TEST-2016-0003'; $this->post('/materiels/find', $dataSearch); $this->assertResponseContains("Résultats (1)", "Le nb de materiels pour la recherche par numero de laboratoire est incorrecte."); $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 incorrecte."); $dataSearch['s_status'] = ''; // - Test champ date_acquisition $dataSearch['s_date_acquisition'] = '2016-05-11'; $this->post('/materiels/find', $dataSearch); $this->assertResponseContains("Résultats (4)", "Le nb de materiels pour la recherche par date d'acquisition est incorrecte."); $dataSearch['s_date_acquisition'] = ''; // - Test champ fournisseur_id $dataSearch['s_fournisseur_id'] = 1; $dataSearch['s_date_acquisition'] = '2016-05-11'; $this->post('/materiels/find', $dataSearch); $this->assertResponseContains("Résultats (3)", "Le nb de materiels pour la recherche par fournisseur_id est incorrecte."); $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 incorrecte."); $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 incorrecte."); */ // - Test champ periode_acquisition1 (debut) $dataSearch['s_periode_acquisition1'] = '2015-01-01'; $this->post('/materiels/find', $dataSearch); $this->assertResponseContains("Résultats (6)", "Le nb de materiels pour la recherche par debut de periode d'acquisition est incorrecte."); // - Test champ periode_acquisition1 (debut) && champ periode_acquisition2 (fin) $dataSearch['s_periode_acquisition2'] = '2016-01-01'; $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 incorrecte."); // - Test champ periode_acquisition2 (fin) $dataSearch['s_periode_acquisition1'] = ''; $this->post('/materiels/find', $dataSearch); $this->assertResponseContains("Résultats (2)", "Le nb de materiels pour la recherche par fin de periode d'acquisition est incorrecte."); $dataSearch['s_periode_acquisition2'] = ''; // - Test champ prix_ht $dataSearch['s_prix_ht'] = '50'; $this->post('/materiels/find', $dataSearch); $this->assertResponseContains("Résultats (1)", "Le nb de materiels pour la recherche par prix ht est incorrecte (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 incorrecte (v2)."); $dataSearch['s_prix_ht_inf'] = ''; $dataSearch['s_prix_ht_sup'] = ''; $dataSearch['s_prix_ht'] = '75'; $this->post('/materiels/find', $dataSearch); $this->assertResponseContains("Résultats (4)", "Le nb de materiels pour la recherche par prix ht est incorrecte (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 incorrecte."); $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 incorrecte."); $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 incorrecte."); $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 incorrecte."); $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 */ public function testAddReadSuivisMateriel() { $this->authSuperAdmin(); $dataSuivi1 = [ 'materiel_id' => 1, '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' ]; $dataSuivi2 = [ 'materiel_id' => 1, '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->post('/suivis/add/1', $dataSuivi1); $this->post('/suivis/add/1', $dataSuivi2); $this->get('/materiels/view/1'); $this->assertResponseContains("Suivi(s) du matériel (3)", "Le nb de suivi renvoyé pour ce matériel est incorrect."); } /** * Test addReadEmpruntsMateriel * * @return void */ public function testAddReadEmpruntsMateriel() { $this->authSuperAdmin(); $dataEmprunt1 = [ 'materiel_id' => 1, 'date_emprunt' => '2016-04-19', 'date_retour_emprunt' => '2016-04-19', 'emprunt_interne' => 1, 'laboratoire' => 'Lorem ipsum dolor sit amet', 'site_id' => 1, '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' ]; $dataEmprunt2 = [ 'materiel_id' => 1, 'date_emprunt' => '2016-04-19', 'date_retour_emprunt' => '2016-04-19', 'emprunt_interne' => 0, 'laboratoire' => 'Lorem ipsum dolor sit amet', 'site_id' => 1, '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->post('/emprunts/add/1', $dataEmprunt1); $this->post('/emprunts/add/1', $dataEmprunt2); $this->get('/materiels/view/1'); $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->assertResponseContains('VALIDATED', "La validation du materiel ne se fait pas correctement."); } /** * Test updateStatutValidated * * @return void */ public function testUpdateStatutValidated() { $this->authSuperAdmin(); $this->post('/materiels/status-to-be-archived/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(); $this->post('/materiels/set-label-is-placed/11/view'); $this->get('/materiels/view/11'); $this->assertResponseContains( '